Skip to content

Commit e3bff52

Browse files
scosumarckleinebudde
authored andcommitted
can: m_can: Batch acknowledge transmit events
Transmit events from the txe fifo can be batch acknowledged by acknowledging the last read txe fifo item. This will save txe_count writes which is important for peripheral chips. Signed-off-by: Markus Schneider-Pargmann <[email protected]> Link: https://lore.kernel.org/all/[email protected] Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent 6355a3c commit e3bff52

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

drivers/net/can/m_can/m_can.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,7 +1023,9 @@ static int m_can_echo_tx_event(struct net_device *dev)
10231023
u32 txe_count = 0;
10241024
u32 m_can_txefs;
10251025
u32 fgi = 0;
1026+
int ack_fgi = -1;
10261027
int i = 0;
1028+
int err = 0;
10271029
unsigned int msg_mark;
10281030

10291031
struct m_can_classdev *cdev = netdev_priv(dev);
@@ -1038,28 +1040,29 @@ static int m_can_echo_tx_event(struct net_device *dev)
10381040
/* Get and process all sent elements */
10391041
for (i = 0; i < txe_count; i++) {
10401042
u32 txe, timestamp = 0;
1041-
int err;
10421043

10431044
/* get message marker, timestamp */
10441045
err = m_can_txe_fifo_read(cdev, fgi, 4, &txe);
10451046
if (err) {
10461047
netdev_err(dev, "TXE FIFO read returned %d\n", err);
1047-
return err;
1048+
break;
10481049
}
10491050

10501051
msg_mark = FIELD_GET(TX_EVENT_MM_MASK, txe);
10511052
timestamp = FIELD_GET(TX_EVENT_TXTS_MASK, txe) << 16;
10521053

1053-
/* ack txe element */
1054-
m_can_write(cdev, M_CAN_TXEFA, FIELD_PREP(TXEFA_EFAI_MASK,
1055-
fgi));
1054+
ack_fgi = fgi;
10561055
fgi = (++fgi >= cdev->mcfg[MRAM_TXE].num ? 0 : fgi);
10571056

10581057
/* update stats */
10591058
m_can_tx_update_stats(cdev, msg_mark, timestamp);
10601059
}
10611060

1062-
return 0;
1061+
if (ack_fgi != -1)
1062+
m_can_write(cdev, M_CAN_TXEFA, FIELD_PREP(TXEFA_EFAI_MASK,
1063+
ack_fgi));
1064+
1065+
return err;
10631066
}
10641067

10651068
static irqreturn_t m_can_isr(int irq, void *dev_id)

0 commit comments

Comments
 (0)