can: m_can: Keep interrupts enabled during peripheral read
authorMarkus Schneider-Pargmann <msp@baylibre.com>
Wed, 15 Mar 2023 11:05:35 +0000 (12:05 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 24 Mar 2023 18:13:54 +0000 (19:13 +0100)
Interrupts currently get disabled if the interrupt status shows new
received data. Non-peripheral chips handle receiving in a worker thread,
but peripheral chips are handling the receive process in the threaded
interrupt routine itself without scheduling it for a different worker.
So there is no need to disable interrupts for peripheral chips.

Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Link: https://lore.kernel.org/all/20230315110546.2518305-6-msp@baylibre.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/m_can/m_can.c

index e7aceeba3759a77959a028eb252207df844c1a39..a5003435802b18819cac46b49e5a35c13a280ae4 100644 (file)
@@ -972,8 +972,8 @@ static int m_can_rx_peripheral(struct net_device *dev, u32 irqstatus)
        /* Don't re-enable interrupts if the driver had a fatal error
         * (e.g., FIFO read failure).
         */
-       if (work_done >= 0)
-               m_can_enable_all_interrupts(cdev);
+       if (work_done < 0)
+               m_can_disable_all_interrupts(cdev);
 
        return work_done;
 }
@@ -1095,11 +1095,12 @@ static irqreturn_t m_can_isr(int irq, void *dev_id)
         */
        if ((ir & IR_RF0N) || (ir & IR_ERR_ALL_30X)) {
                cdev->irqstatus = ir;
-               m_can_disable_all_interrupts(cdev);
-               if (!cdev->is_peripheral)
+               if (!cdev->is_peripheral) {
+                       m_can_disable_all_interrupts(cdev);
                        napi_schedule(&cdev->napi);
-               else if (m_can_rx_peripheral(dev, ir) < 0)
+               } else if (m_can_rx_peripheral(dev, ir) < 0) {
                        goto out_fail;
+               }
        }
 
        if (cdev->version == 30) {