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;
 
 {
        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;
        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;
 
 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;
                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;
 
        }
 
        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;
        }