@@ -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+
385397static 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