can: kvaser_usb: Add len8_dlc support
authorCarsten Schmidt <carsten.schmidt-achim@t-online.de>
Tue, 16 May 2023 12:53:32 +0000 (14:53 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 22 May 2023 18:21:30 +0000 (20:21 +0200)
Add support for the Classical CAN raw DLC functionality to send and
receive DLC values from 9 .. 15.

v1: https://lore.kernel.org/all/20230506105529.4023-1-carsten.schmidt-achim@t-online.de

Signed-off-by: Carsten Schmidt <carsten.schmidt-achim@t-online.de>
Tested-by: Jimmy Assarsson <extja@kvaser.com>
Signed-off-by: Jimmy Assarsson <extja@kvaser.com>
Link: https://lore.kernel.org/r/20230516125332.82894-1-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 7135ec851341b088a09adafcbb684d9f3a1b53e9..71ef4db5c09f68897483df25f969db81c27e5159 100644 (file)
@@ -816,7 +816,7 @@ 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 = 0;
+       priv->can.ctrlmode_supported = CAN_CTRLMODE_CC_LEN8_DLC;
 
        priv->dev = dev;
        priv->netdev = netdev;
index ef341c4254fc8b14dd3f81b0d1909100b3cde393..c7ba768dfe173d42981d77c7a17ba83557b31cbb 100644 (file)
@@ -1263,7 +1263,7 @@ static void kvaser_usb_hydra_rx_msg_std(const struct kvaser_usb *dev,
        if (flags & KVASER_USB_HYDRA_CF_FLAG_OVERRUN)
                kvaser_usb_can_rx_over_error(priv->netdev);
 
-       cf->len = can_cc_dlc2len(cmd->rx_can.dlc);
+       can_frame_set_cc_len((struct can_frame *)cf, cmd->rx_can.dlc, priv->can.ctrlmode);
 
        if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME) {
                cf->can_id |= CAN_RTR_FLAG;
@@ -1342,7 +1342,7 @@ static void kvaser_usb_hydra_rx_msg_ext(const struct kvaser_usb *dev,
                if (flags & KVASER_USB_HYDRA_CF_FLAG_ESI)
                        cf->flags |= CANFD_ESI;
        } else {
-               cf->len = can_cc_dlc2len(dlc);
+               can_frame_set_cc_len((struct can_frame *)cf, dlc, priv->can.ctrlmode);
        }
 
        if (flags & KVASER_USB_HYDRA_CF_FLAG_REMOTE_FRAME) {
@@ -1442,7 +1442,7 @@ kvaser_usb_hydra_frame_to_cmd_ext(const struct kvaser_usb_net_priv *priv,
        struct kvaser_usb *dev = priv->dev;
        struct kvaser_cmd_ext *cmd;
        struct canfd_frame *cf = (struct canfd_frame *)skb->data;
-       u8 dlc = can_fd_len2dlc(cf->len);
+       u8 dlc;
        u8 nbr_of_bytes = cf->len;
        u32 flags;
        u32 id;
@@ -1467,6 +1467,11 @@ kvaser_usb_hydra_frame_to_cmd_ext(const struct kvaser_usb_net_priv *priv,
 
        cmd->len = cpu_to_le16(*cmd_len);
 
+       if (can_is_canfd_skb(skb))
+               dlc = can_fd_len2dlc(cf->len);
+       else
+               dlc = can_get_cc_dlc((struct can_frame *)cf, priv->can.ctrlmode);
+
        cmd->tx_can.databytes = nbr_of_bytes;
        cmd->tx_can.dlc = dlc;
 
@@ -1542,7 +1547,7 @@ kvaser_usb_hydra_frame_to_cmd_std(const struct kvaser_usb_net_priv *priv,
                id = cf->can_id & CAN_SFF_MASK;
        }
 
-       cmd->tx_can.dlc = cf->len;
+       cmd->tx_can.dlc = can_get_cc_dlc(cf, priv->can.ctrlmode);
 
        flags = (cf->can_id & CAN_EFF_FLAG ?
                 KVASER_USB_HYDRA_CF_FLAG_EXTENDED_ID : 0);
index 1c2f99ce4c6c72832ec5f60b60bb490c2adf7f78..23bd7574b1c7e1483a1bcf7b7a5fc14234e9c7de 100644 (file)
@@ -573,7 +573,7 @@ kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv,
                        cmd->u.tx_can.data[1] = cf->can_id & 0x3f;
                }
 
-               cmd->u.tx_can.data[5] = cf->len;
+               cmd->u.tx_can.data[5] = can_get_cc_dlc(cf, priv->can.ctrlmode);
                memcpy(&cmd->u.tx_can.data[6], cf->data, cf->len);
 
                if (cf->can_id & CAN_RTR_FLAG)
@@ -1349,7 +1349,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
                else
                        cf->can_id &= CAN_SFF_MASK;
 
-               cf->len = can_cc_dlc2len(cmd->u.leaf.log_message.dlc);
+               can_frame_set_cc_len(cf, cmd->u.leaf.log_message.dlc & 0xF, priv->can.ctrlmode);
 
                if (cmd->u.leaf.log_message.flags & MSG_FLAG_REMOTE_FRAME)
                        cf->can_id |= CAN_RTR_FLAG;
@@ -1367,7 +1367,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev,
                        cf->can_id |= CAN_EFF_FLAG;
                }
 
-               cf->len = can_cc_dlc2len(rx_data[5]);
+               can_frame_set_cc_len(cf, rx_data[5] & 0xF, priv->can.ctrlmode);
 
                if (cmd->u.rx_can_header.flag & MSG_FLAG_REMOTE_FRAME)
                        cf->can_id |= CAN_RTR_FLAG;