drivers: can: mcan: acknowledge all received frames
The Bosch M_CAN IP does not support RX filtering of the RTR bit, so the driver handles this bit in software. If a recevied frame matches a filter with RTR enabled, the RTR bit of the frame must match that of the filter in order to be passed to the RX callback function. If the RTR bits do not match the frame must be dropped. Improve the readability of the the logic for determining if a frame should be dropped and add a missing FIFO acknowledge write for dropped frames. Fixes: #47204 Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
This commit is contained in:
parent
c17c7e4a79
commit
5e74f72220
1 changed files with 13 additions and 5 deletions
|
@ -624,6 +624,8 @@ static void can_mcan_get_message(const struct device *dev,
|
|||
int data_length;
|
||||
void *cb_arg;
|
||||
struct can_mcan_rx_fifo_hdr hdr;
|
||||
bool rtr_filter_mask;
|
||||
bool rtr_filter;
|
||||
|
||||
while ((*fifo_status_reg & CAN_MCAN_RXF0S_F0FL)) {
|
||||
get_idx = (*fifo_status_reg & CAN_MCAN_RXF0S_F0GI) >>
|
||||
|
@ -653,11 +655,17 @@ static void can_mcan_get_message(const struct device *dev,
|
|||
|
||||
filt_idx = hdr.fidx;
|
||||
|
||||
/* Check if RTR must match */
|
||||
if ((hdr.xtd && data->ext_filt_rtr_mask & (1U << filt_idx) &&
|
||||
((data->ext_filt_rtr >> filt_idx) & 1U) != frame.rtr) ||
|
||||
(data->std_filt_rtr_mask & (1U << filt_idx) &&
|
||||
((data->std_filt_rtr >> filt_idx) & 1U) != frame.rtr)) {
|
||||
if (hdr.xtd != 0) {
|
||||
rtr_filter_mask = (data->ext_filt_rtr_mask & BIT(filt_idx)) != 0;
|
||||
rtr_filter = (data->ext_filt_rtr & BIT(filt_idx)) != 0;
|
||||
} else {
|
||||
rtr_filter_mask = (data->std_filt_rtr_mask & BIT(filt_idx)) != 0;
|
||||
rtr_filter = (data->std_filt_rtr & BIT(filt_idx)) != 0;
|
||||
}
|
||||
|
||||
if (rtr_filter_mask && (rtr_filter != frame.rtr)) {
|
||||
/* RTR bit does not match filter RTR mask and bit, drop frame */
|
||||
*fifo_ack_reg = get_idx;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue