OSDN Git Service

can: peak_usb: add support of ONE_SHOT mode
authorStephane Grosjean <s.grosjean@peak-system.com>
Tue, 9 Mar 2021 08:21:28 +0000 (09:21 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Tue, 30 Mar 2021 09:14:47 +0000 (11:14 +0200)
This patch adds "ONE-SHOT" mode support to the following CAN-USB
PEAK-System GmbH interfaces:
- PCAN-USB X6
- PCAN-USB FD
- PCAN-USB Pro FD
- PCAN-Chip USB
- PCAN-USB Pro

Signed-off-by: Stephane Grosjean <s.grosjean@peak-system.com>
[mkl: split into two patches]
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/usb/peak_usb/pcan_usb_fd.c
drivers/net/can/usb/peak_usb/pcan_usb_pro.c

index b3e56ee..6f62b6f 100644 (file)
@@ -774,6 +774,10 @@ static int pcan_usb_fd_encode_msg(struct peak_usb_device *dev,
                        tx_msg_flags |= PUCAN_MSG_RTR;
        }
 
+       /* Single-Shot frame */
+       if (dev->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
+               tx_msg_flags |= PUCAN_MSG_SINGLE_SHOT;
+
        tx_msg->flags = cpu_to_le16(tx_msg_flags);
        tx_msg->channel_dlc = PUCAN_MSG_CHANNEL_DLC(dev->ctrl_idx, dlc);
        memcpy(tx_msg->d, cfd->data, cfd->len);
@@ -1063,7 +1067,7 @@ const struct peak_usb_adapter pcan_usb_fd = {
        .ctrl_count = PCAN_USBFD_CHANNEL_COUNT,
        .ctrlmode_supported = CAN_CTRLMODE_FD |
                        CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY |
-                       CAN_CTRLMODE_CC_LEN8_DLC,
+                       CAN_CTRLMODE_ONE_SHOT | CAN_CTRLMODE_CC_LEN8_DLC,
        .clock = {
                .freq = PCAN_UFD_CRYSTAL_HZ,
        },
@@ -1138,7 +1142,7 @@ const struct peak_usb_adapter pcan_usb_chip = {
        .ctrl_count = PCAN_USBFD_CHANNEL_COUNT,
        .ctrlmode_supported = CAN_CTRLMODE_FD |
                CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY |
-               CAN_CTRLMODE_CC_LEN8_DLC,
+               CAN_CTRLMODE_ONE_SHOT | CAN_CTRLMODE_CC_LEN8_DLC,
        .clock = {
                .freq = PCAN_UFD_CRYSTAL_HZ,
        },
@@ -1213,7 +1217,7 @@ const struct peak_usb_adapter pcan_usb_pro_fd = {
        .ctrl_count = PCAN_USBPROFD_CHANNEL_COUNT,
        .ctrlmode_supported = CAN_CTRLMODE_FD |
                        CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY |
-                       CAN_CTRLMODE_CC_LEN8_DLC,
+                       CAN_CTRLMODE_ONE_SHOT | CAN_CTRLMODE_CC_LEN8_DLC,
        .clock = {
                .freq = PCAN_UFD_CRYSTAL_HZ,
        },
@@ -1288,7 +1292,7 @@ const struct peak_usb_adapter pcan_usb_x6 = {
        .ctrl_count = PCAN_USBPROFD_CHANNEL_COUNT,
        .ctrlmode_supported = CAN_CTRLMODE_FD |
                        CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY |
-                       CAN_CTRLMODE_CC_LEN8_DLC,
+                       CAN_CTRLMODE_ONE_SHOT | CAN_CTRLMODE_CC_LEN8_DLC,
        .clock = {
                .freq = PCAN_UFD_CRYSTAL_HZ,
        },
index b314d2e..2d1b645 100644 (file)
@@ -37,6 +37,7 @@
 
 #define PCAN_USBPRO_RTR                        0x01
 #define PCAN_USBPRO_EXT                        0x02
+#define PCAN_USBPRO_SS                 0x08
 
 #define PCAN_USBPRO_CMD_BUFFER_SIZE    512
 
@@ -781,6 +782,10 @@ static int pcan_usb_pro_encode_msg(struct peak_usb_device *dev,
        if (cf->can_id & CAN_RTR_FLAG)
                flags |= PCAN_USBPRO_RTR;
 
+       /* Single-Shot frame */
+       if (dev->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
+               flags |= PCAN_USBPRO_SS;
+
        pcan_msg_add_rec(&usb_msg, data_type, 0, flags, len, cf->can_id,
                         cf->data);
 
@@ -1039,7 +1044,8 @@ const struct peak_usb_adapter pcan_usb_pro = {
        .name = "PCAN-USB Pro",
        .device_id = PCAN_USBPRO_PRODUCT_ID,
        .ctrl_count = PCAN_USBPRO_CHANNEL_COUNT,
-       .ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY,
+       .ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY |
+                             CAN_CTRLMODE_ONE_SHOT,
        .clock = {
                .freq = PCAN_USBPRO_CRYSTAL_HZ,
        },