Commit e2f1c8cb authored by Markus Schneider-Pargmann's avatar Markus Schneider-Pargmann Committed by Marc Kleine-Budde
Browse files

can: m_can: Batch acknowledge rx fifo



Instead of acknowledging every item of the fifo, only acknowledge the
last item read. This behavior is documented in the datasheet. The new
getindex will be the acknowledged item + 1.

Signed-off-by: default avatarMarkus Schneider-Pargmann <msp@baylibre.com>
Link: https://lore.kernel.org/all/20221206115728.1056014-8-msp@baylibre.com


Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent e3bff525
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -530,9 +530,6 @@ static int m_can_read_fifo(struct net_device *dev, u32 fgi)
	}
	stats->rx_packets++;

	/* acknowledge rx fifo 0 */
	m_can_write(cdev, M_CAN_RXF0A, fgi);

	timestamp = FIELD_GET(RX_BUF_RXTS_MASK, fifo_header.dlc) << 16;

	m_can_receive_skb(cdev, skb, timestamp);
@@ -553,8 +550,9 @@ static int m_can_do_rx_poll(struct net_device *dev, int quota)
	u32 rxfs;
	u32 rx_count;
	u32 fgi;
	int ack_fgi = -1;
	int i;
	int err;
	int err = 0;

	rxfs = m_can_read(cdev, M_CAN_RXF0S);
	if (!(rxfs & RXFS_FFL_MASK)) {
@@ -568,13 +566,20 @@ static int m_can_do_rx_poll(struct net_device *dev, int quota)
	for (i = 0; i < rx_count && quota > 0; ++i) {
		err = m_can_read_fifo(dev, fgi);
		if (err)
			return err;
			break;

		quota--;
		pkts++;
		ack_fgi = fgi;
		fgi = (++fgi >= cdev->mcfg[MRAM_RXF0].num ? 0 : fgi);
	}

	if (ack_fgi != -1)
		m_can_write(cdev, M_CAN_RXF0A, ack_fgi);

	if (err)
		return err;

	return pkts;
}