Skip to content

Commit 428479e

Browse files
0mhumarckleinebudde
authored andcommitted
can: m_can: Configuration for TX and TX event FIFOs
* TX/TX Event FIFO sizes are configured for version >= v3.1.x Signed-off-by: Mario Huettel <[email protected]> Tested-by: Quentin Schulz <[email protected]> Signed-off-by: Marc Kleine-Budde <[email protected]>
1 parent b03cfc5 commit 428479e

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

drivers/net/can/m_can/m_can.c

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,18 @@ static inline void m_can_fifo_write(const struct m_can_priv *priv,
382382
fpi * TXB_ELEMENT_SIZE + offset);
383383
}
384384

385+
static inline u32 m_can_txe_fifo_read(const struct m_can_priv *priv,
386+
u32 fgi,
387+
u32 offset) {
388+
return readl(priv->mram_base + priv->mcfg[MRAM_TXE].off +
389+
fgi * TXE_ELEMENT_SIZE + offset);
390+
}
391+
392+
static inline bool m_can_tx_fifo_full(const struct m_can_priv *priv)
393+
{
394+
return !!(m_can_read(priv, M_CAN_TXFQS) & TXFQS_TFQF);
395+
}
396+
385397
static inline void m_can_config_endisable(const struct m_can_priv *priv,
386398
bool enable)
387399
{
@@ -925,6 +937,7 @@ static int m_can_set_bittiming(struct net_device *dev)
925937
* - configure rx fifo
926938
* - accept non-matching frame into fifo 0
927939
* - configure tx buffer
940+
* - >= v3.1.x: TX FIFO is used
928941
* - configure mode
929942
* - setup bittiming
930943
*/
@@ -941,15 +954,31 @@ static void m_can_chip_config(struct net_device *dev)
941954
/* Accept Non-matching Frames Into FIFO 0 */
942955
m_can_write(priv, M_CAN_GFC, 0x0);
943956

944-
/* only support one Tx Buffer currently */
945-
m_can_write(priv, M_CAN_TXBC, (1 << TXBC_NDTB_SHIFT) |
946-
priv->mcfg[MRAM_TXB].off);
957+
if (priv->version == 30) {
958+
/* only support one Tx Buffer currently */
959+
m_can_write(priv, M_CAN_TXBC, (1 << TXBC_NDTB_SHIFT) |
960+
priv->mcfg[MRAM_TXB].off);
961+
} else {
962+
/* TX FIFO is used for newer IP Core versions */
963+
m_can_write(priv, M_CAN_TXBC,
964+
(priv->mcfg[MRAM_TXB].num << TXBC_TFQS_SHIFT) |
965+
(priv->mcfg[MRAM_TXB].off));
966+
}
947967

948968
/* support 64 bytes payload */
949969
m_can_write(priv, M_CAN_TXESC, TXESC_TBDS_64BYTES);
950970

951-
m_can_write(priv, M_CAN_TXEFC, (1 << TXEFC_EFS_SHIFT) |
952-
priv->mcfg[MRAM_TXE].off);
971+
/* TX Event FIFO */
972+
if (priv->version == 30) {
973+
m_can_write(priv, M_CAN_TXEFC, (1 << TXEFC_EFS_SHIFT) |
974+
priv->mcfg[MRAM_TXE].off);
975+
} else {
976+
/* Full TX Event FIFO is used */
977+
m_can_write(priv, M_CAN_TXEFC,
978+
((priv->mcfg[MRAM_TXE].num << TXEFC_EFS_SHIFT)
979+
& TXEFC_EFS_MASK) |
980+
priv->mcfg[MRAM_TXE].off);
981+
}
953982

954983
/* rx fifo configuration, blocking mode, fifo size 1 */
955984
m_can_write(priv, M_CAN_RXF0C,

0 commit comments

Comments
 (0)