]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
can: kvaser_pciefd: Continue parsing DMA buf after dropped RX
authorAxel Forsman <axfo@kvaser.com>
Tue, 20 May 2025 11:43:32 +0000 (13:43 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 May 2025 09:14:02 +0000 (11:14 +0200)
commit 6d820b81c4dc4a4023e45c3cd6707a07dd838649 upstream.

Going bus-off on a channel doing RX could result in dropped packets.

As netif_running() gets cleared before the channel abort procedure,
the handling of any last RDATA packets would see netif_rx() return
non-zero to signal a dropped packet. kvaser_pciefd_read_buffer() dealt
with this "error" by breaking out of processing the remaining DMA RX
buffer.

Only return an error from kvaser_pciefd_read_buffer() due to packet
corruption, otherwise handle it internally.

Cc: stable@vger.kernel.org
Signed-off-by: Axel Forsman <axfo@kvaser.com>
Tested-by: Jimmy Assarsson <extja@kvaser.com>
Reviewed-by: Jimmy Assarsson <extja@kvaser.com>
Link: https://patch.msgid.link/20250520114332.8961-4-axfo@kvaser.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/can/kvaser_pciefd.c

index fa04a7ced02b8ba2fe3e0bc556a9e7caf7fea16c..da6e08323a2c8b97d5e0127a764cddf2fa3f13a7 100644 (file)
@@ -1201,7 +1201,7 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
                skb = alloc_canfd_skb(priv->dev, &cf);
                if (!skb) {
                        priv->dev->stats.rx_dropped++;
-                       return -ENOMEM;
+                       return 0;
                }
 
                cf->len = can_fd_dlc2len(dlc);
@@ -1213,7 +1213,7 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
                skb = alloc_can_skb(priv->dev, (struct can_frame **)&cf);
                if (!skb) {
                        priv->dev->stats.rx_dropped++;
-                       return -ENOMEM;
+                       return 0;
                }
                can_frame_set_cc_len((struct can_frame *)cf, dlc, priv->ctrlmode);
        }
@@ -1231,7 +1231,9 @@ static int kvaser_pciefd_handle_data_packet(struct kvaser_pciefd *pcie,
        priv->dev->stats.rx_packets++;
        kvaser_pciefd_set_skb_timestamp(pcie, skb, p->timestamp);
 
-       return netif_rx(skb);
+       netif_rx(skb);
+
+       return 0;
 }
 
 static void kvaser_pciefd_change_state(struct kvaser_pciefd_can *can,