]> git.baikalelectronics.ru Git - kernel.git/commitdiff
can: kvaser_usb: do not increase tx statistics when sending error message frames
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Tue, 7 Dec 2021 12:15:28 +0000 (21:15 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Jan 2023 10:40:59 +0000 (11:40 +0100)
[ Upstream commit 44a13b6033b2d9da43c64104f75131169e70f239 ]

The CAN error message frames (i.e. error skb) are an interface
specific to socket CAN. The payload of the CAN error message frames
does not correspond to any actual data sent on the wire. Only an error
flag and a delimiter are transmitted when an error occurs (c.f. ISO
11898-1 section 10.4.4.2 "Error flag").

For this reason, it makes no sense to increment the tx_packets and
tx_bytes fields of struct net_device_stats when sending an error
message frame because no actual payload will be transmitted on the
wire.

N.B. Sending error message frames is a very specific feature which, at
the moment, is only supported by the Kvaser Hydra hardware. Please
refer to [1] for more details on the topic.

[1] https://lore.kernel.org/linux-can/CAMZ6RqK0rTNg3u3mBpZOoY51jLZ-et-J01tY6-+mWsM4meVw-A@mail.gmail.com/t/#u

Link: https://lore.kernel.org/all/20211207121531.42941-3-mailhol.vincent@wanadoo.fr
Co-developed-by: Jimmy Assarsson <extja@kvaser.com>
Signed-off-by: Jimmy Assarsson <extja@kvaser.com>
Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Stable-dep-of: 35364f5b41a4 ("can: kvaser_usb: kvaser_usb_leaf: Get capabilities from device")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c

index 45d27872488395c09b78bae8e05a0227ce7957a9..9588efbfae71273a45123850f3113d6032b96eb0 100644 (file)
@@ -293,6 +293,7 @@ struct kvaser_cmd {
 #define KVASER_USB_HYDRA_CF_FLAG_OVERRUN       BIT(1)
 #define KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME  BIT(4)
 #define KVASER_USB_HYDRA_CF_FLAG_EXTENDED_ID   BIT(5)
+#define KVASER_USB_HYDRA_CF_FLAG_TX_ACK                BIT(6)
 /* CAN frame flags. Used in ext_rx_can and ext_tx_can */
 #define KVASER_USB_HYDRA_CF_FLAG_OSM_NACK      BIT(12)
 #define KVASER_USB_HYDRA_CF_FLAG_ABL           BIT(13)
@@ -1099,6 +1100,7 @@ static void kvaser_usb_hydra_tx_acknowledge(const struct kvaser_usb *dev,
        struct kvaser_usb_net_priv *priv;
        unsigned long irq_flags;
        bool one_shot_fail = false;
+       bool is_err_frame = false;
        u16 transid = kvaser_usb_hydra_get_cmd_transid(cmd);
 
        priv = kvaser_usb_hydra_net_priv_from_cmd(dev, cmd);
@@ -1117,10 +1119,13 @@ static void kvaser_usb_hydra_tx_acknowledge(const struct kvaser_usb *dev,
                        kvaser_usb_hydra_one_shot_fail(priv, cmd_ext);
                        one_shot_fail = true;
                }
+
+               is_err_frame = flags & KVASER_USB_HYDRA_CF_FLAG_TX_ACK &&
+                              flags & KVASER_USB_HYDRA_CF_FLAG_ERROR_FRAME;
        }
 
        context = &priv->tx_contexts[transid % dev->max_tx_urbs];
-       if (!one_shot_fail) {
+       if (!one_shot_fail && !is_err_frame) {
                struct net_device_stats *stats = &priv->netdev->stats;
 
                stats->tx_packets++;