drivers: can: mcan: manually track available TX buffers
The MCAN driver operates in TX queue mode (TXBC.TFQM = 1). In this mode TXFQS.TFQPI returns the first available buffer (usually buffer zero). Hardware is free to re-use a buffer as soon as TX completes, it does not have to wait for the matching TX event to be processed. If a TX completes and that TX buffer is re-used before processing the TX event, two TX events for the same buffer occur. The first event calls the second events TX callback, and the second event results in a NULL pointer exception. In a "normal" configuration, the TX event ISR will always preempt the queuing of a TX frame to the same TX buffer. However, this issue could occur if: * Sending a message with ISRs temporarily disabled. * The ISR is processed on a different core to the TX call. The fix is to manually track which TX buffers are available, only freeing a buffer after the TX event has been processed. The MCAN user manual states that this is allowed: "The application may use register TXBRP instead of the Put Index and may place messages to any Tx Buffer without pending transmission request" Signed-off-by:Grant Ramsay <gramsay@enphaseenergy.com> (cherry picked from commit e9bc195b)
Loading
Please sign in to comment