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

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.comSigned-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent e3bff525
...@@ -530,9 +530,6 @@ static int m_can_read_fifo(struct net_device *dev, u32 fgi) ...@@ -530,9 +530,6 @@ static int m_can_read_fifo(struct net_device *dev, u32 fgi)
} }
stats->rx_packets++; 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; timestamp = FIELD_GET(RX_BUF_RXTS_MASK, fifo_header.dlc) << 16;
m_can_receive_skb(cdev, skb, timestamp); m_can_receive_skb(cdev, skb, timestamp);
...@@ -553,8 +550,9 @@ static int m_can_do_rx_poll(struct net_device *dev, int quota) ...@@ -553,8 +550,9 @@ static int m_can_do_rx_poll(struct net_device *dev, int quota)
u32 rxfs; u32 rxfs;
u32 rx_count; u32 rx_count;
u32 fgi; u32 fgi;
int ack_fgi = -1;
int i; int i;
int err; int err = 0;
rxfs = m_can_read(cdev, M_CAN_RXF0S); rxfs = m_can_read(cdev, M_CAN_RXF0S);
if (!(rxfs & RXFS_FFL_MASK)) { if (!(rxfs & RXFS_FFL_MASK)) {
...@@ -568,13 +566,20 @@ static int m_can_do_rx_poll(struct net_device *dev, int quota) ...@@ -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) { for (i = 0; i < rx_count && quota > 0; ++i) {
err = m_can_read_fifo(dev, fgi); err = m_can_read_fifo(dev, fgi);
if (err) if (err)
return err; break;
quota--; quota--;
pkts++; pkts++;
ack_fgi = fgi;
fgi = (++fgi >= cdev->mcfg[MRAM_RXF0].num ? 0 : 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; return pkts;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment