can: m_can: Count read getindex in the driver
authorMarkus Schneider-Pargmann <msp@baylibre.com>
Tue, 6 Dec 2022 11:57:22 +0000 (12:57 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 12 Dec 2022 10:58:32 +0000 (11:58 +0100)
The getindex gets increased by one every time. We can calculate the
correct getindex in the driver and avoid the additional reads of rxfs.

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

index 83d3a7f..9476d96 100644 (file)
@@ -477,19 +477,16 @@ static void m_can_receive_skb(struct m_can_classdev *cdev,
        }
 }
 
-static int m_can_read_fifo(struct net_device *dev, u32 rxfs)
+static int m_can_read_fifo(struct net_device *dev, u32 fgi)
 {
        struct net_device_stats *stats = &dev->stats;
        struct m_can_classdev *cdev = netdev_priv(dev);
        struct canfd_frame *cf;
        struct sk_buff *skb;
        struct id_and_dlc fifo_header;
-       u32 fgi;
        u32 timestamp = 0;
        int err;
 
-       /* calculate the fifo get index for where to read data */
-       fgi = FIELD_GET(RXFS_FGI_MASK, rxfs);
        err = m_can_fifo_read(cdev, fgi, M_CAN_FIFO_ID, &fifo_header, 2);
        if (err)
                goto out_fail;
@@ -554,6 +551,9 @@ static int m_can_do_rx_poll(struct net_device *dev, int quota)
        struct m_can_classdev *cdev = netdev_priv(dev);
        u32 pkts = 0;
        u32 rxfs;
+       u32 rx_count;
+       u32 fgi;
+       int i;
        int err;
 
        rxfs = m_can_read(cdev, M_CAN_RXF0S);
@@ -562,14 +562,17 @@ static int m_can_do_rx_poll(struct net_device *dev, int quota)
                return 0;
        }
 
-       while ((rxfs & RXFS_FFL_MASK) && (quota > 0)) {
-               err = m_can_read_fifo(dev, rxfs);
+       rx_count = FIELD_GET(RXFS_FFL_MASK, rxfs);
+       fgi = FIELD_GET(RXFS_FGI_MASK, rxfs);
+
+       for (i = 0; i < rx_count && quota > 0; ++i) {
+               err = m_can_read_fifo(dev, fgi);
                if (err)
                        return err;
 
                quota--;
                pkts++;
-               rxfs = m_can_read(cdev, M_CAN_RXF0S);
+               fgi = (++fgi >= cdev->mcfg[MRAM_RXF0].num ? 0 : fgi);
        }
 
        return pkts;