]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
can: kvaser_usb: Add support for CAN_CTRLMODE_BERR_REPORTING
authorJimmy Assarsson <extja@kvaser.com>
Mon, 30 Dec 2024 14:26:43 +0000 (15:26 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 10 Jan 2025 10:32:38 +0000 (11:32 +0100)
Add support for CAN_CTRLMODE_BERR_REPORTING,
allowing Bus Error Reporting to be enabled or disabled.
Previously, Bus Error Reporting was always active.

Signed-off-by: Jimmy Assarsson <extja@kvaser.com>
Link: https://patch.msgid.link/20241230142645.128244-2-extja@kvaser.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c
drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c
drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c

index 7d12776ab63e6df67224ee4903f4819a7460be87..dcb0bcbe0565abda1c45903ffc68b6cc93a09f24 100644 (file)
@@ -818,7 +818,8 @@ static int kvaser_usb_init_one(struct kvaser_usb *dev, int channel)
        init_completion(&priv->stop_comp);
        init_completion(&priv->flush_comp);
        init_completion(&priv->get_busparams_comp);
-       priv->can.ctrlmode_supported = CAN_CTRLMODE_CC_LEN8_DLC;
+       priv->can.ctrlmode_supported = CAN_CTRLMODE_CC_LEN8_DLC |
+                                      CAN_CTRLMODE_BERR_REPORTING;
 
        priv->dev = dev;
        priv->netdev = netdev;
index 5ec8b300bebf87762c64ed47648d238a40af814d..8e88b5917796e7f38aa3b25eae411a305f071112 100644 (file)
@@ -1084,8 +1084,8 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv,
 {
        struct net_device *netdev = priv->netdev;
        struct net_device_stats *stats = &netdev->stats;
-       struct can_frame *cf;
-       struct sk_buff *skb;
+       struct can_frame *cf = NULL;
+       struct sk_buff *skb = NULL;
        struct can_berr_counter bec;
        enum can_state new_state, old_state;
        u8 bus_status;
@@ -1101,21 +1101,24 @@ kvaser_usb_hydra_error_frame(struct kvaser_usb_net_priv *priv,
        kvaser_usb_hydra_bus_status_to_can_state(priv, bus_status, &bec,
                                                 &new_state);
 
-       skb = alloc_can_err_skb(netdev, &cf);
+       if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
+               skb = alloc_can_err_skb(netdev, &cf);
        if (new_state != old_state)
                kvaser_usb_hydra_change_state(priv, &bec, cf, new_state);
 
-       if (skb) {
-               struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
+       if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) {
+               if (skb) {
+                       struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
 
-               shhwtstamps->hwtstamp = hwtstamp;
-               cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT;
-               cf->data[6] = bec.txerr;
-               cf->data[7] = bec.rxerr;
-               netif_rx(skb);
-       } else {
-               stats->rx_dropped++;
-               netdev_warn(netdev, "No memory left for err_skb\n");
+                       shhwtstamps->hwtstamp = hwtstamp;
+                       cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_CNT;
+                       cf->data[6] = bec.txerr;
+                       cf->data[7] = bec.rxerr;
+                       netif_rx(skb);
+               } else {
+                       stats->rx_dropped++;
+                       netdev_warn(netdev, "No memory left for err_skb\n");
+               }
        }
 
        priv->bec.txerr = bec.txerr;
index 0491b4a6d8e88e980085f9bf265ca9655238eabe..6a45adcc45bd971f9b186bfa422aeab4ab331d44 100644 (file)
@@ -1120,8 +1120,8 @@ kvaser_usb_leaf_rx_error_update_can_state(struct kvaser_usb_net_priv *priv,
 static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
                                     const struct kvaser_usb_err_summary *es)
 {
-       struct can_frame *cf;
-       struct sk_buff *skb;
+       struct can_frame *cf = NULL;
+       struct sk_buff *skb = NULL;
        struct net_device_stats *stats;
        struct kvaser_usb_net_priv *priv;
        struct kvaser_usb_net_leaf_priv *leaf;
@@ -1142,7 +1142,8 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
                return;
 
        old_state = priv->can.state;
-       skb = alloc_can_err_skb(priv->netdev, &cf);
+       if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING)
+               skb = alloc_can_err_skb(priv->netdev, &cf);
        kvaser_usb_leaf_rx_error_update_can_state(priv, es, cf);
        new_state = priv->can.state;
 
@@ -1176,8 +1177,10 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev,
        }
 
        if (!skb) {
-               stats->rx_dropped++;
-               netdev_warn(priv->netdev, "No memory left for err_skb\n");
+               if (priv->can.ctrlmode & CAN_CTRLMODE_BERR_REPORTING) {
+                       stats->rx_dropped++;
+                       netdev_warn(priv->netdev, "No memory left for err_skb\n");
+               }
                return;
        }