Skip to content

Commit

Permalink
can: mcp251xfd: mcp251xfd_get_tef_len(): fix length calculation
Browse files Browse the repository at this point in the history
commit 3c1c185 upstream.

Commit b8e0ddd ("can: mcp251xfd: tef: prepare to workaround
broken TEF FIFO tail index erratum") introduced
mcp251xfd_get_tef_len() to get the number of unhandled transmit events
from the Transmit Event FIFO (TEF).

As the TEF has no head pointer, the driver uses the TX FIFO's tail
pointer instead, assuming that send frames are completed. However the
check for the TEF being full was not correct. This leads to the driver
stop working if the TEF is full.

Fix the TEF full check by assuming that if, from the driver's point of
view, there are no free TX buffers in the chip and the TX FIFO is
empty, all messages must have been sent and the TEF must therefore be
full.

Reported-by: Sven Schuchmann <[email protected]>
Closes: https://patch.msgid.link/FR3P281MB155216711EFF900AD9791B7ED9692@FR3P281MB1552.DEUP281.PROD.OUTLOOK.COM
Fixes: b8e0ddd ("can: mcp251xfd: tef: prepare to workaround broken TEF FIFO tail index erratum")
Tested-by: Sven Schuchmann <[email protected]>
Cc: [email protected]
Link: https://patch.msgid.link/20241104-mcp251xfd-fix-length-calculation-v3-1-608b6e7e2197@pengutronix.de
Signed-off-by: Marc Kleine-Budde <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
marckleinebudde authored and Sasha Levin committed Nov 12, 2024
1 parent 7378c4c commit ee02302
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions drivers/net/can/spi/mcp251xfd/mcp251xfd-tef.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

#include "mcp251xfd.h"

static inline bool mcp251xfd_tx_fifo_sta_full(u32 fifo_sta)
static inline bool mcp251xfd_tx_fifo_sta_empty(u32 fifo_sta)
{
return !(fifo_sta & MCP251XFD_REG_FIFOSTA_TFNRFNIF);
return fifo_sta & MCP251XFD_REG_FIFOSTA_TFERFFIF;
}

static inline int
Expand Down Expand Up @@ -122,7 +122,11 @@ mcp251xfd_get_tef_len(struct mcp251xfd_priv *priv, u8 *len_p)
if (err)
return err;

if (mcp251xfd_tx_fifo_sta_full(fifo_sta)) {
/* If the chip says the TX-FIFO is empty, but there are no TX
* buffers free in the ring, we assume all have been sent.
*/
if (mcp251xfd_tx_fifo_sta_empty(fifo_sta) &&
mcp251xfd_get_tx_free(tx_ring) == 0) {
*len_p = tx_ring->obj_num;
return 0;
}
Expand Down

0 comments on commit ee02302

Please sign in to comment.