Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

can: drivers: add len8_dlc support for various CAN adapters

Support the Classical CAN raw DLC functionality to send and receive DLC values
from 9 .. 15 on various Classical CAN capable CAN network drivers:

- sja1000
- gs_usb
- pcan_usb
- pcan_usb_fd
- usb_8dev

Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Tested-by: Oliver Hartkopp <socketcan@hartkopp.net>
Link: https://lore.kernel.org/r/20201111095923.2535-1-socketcan@hartkopp.net
[mkl: usb_8dev: changed indention]
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>

authored by

Oliver Hartkopp and committed by
Marc Kleine-Budde
4c01fc87 e8e73562

+34 -23
+5 -5
drivers/net/can/sja1000/sja1000.c
··· 284 284 struct sja1000_priv *priv = netdev_priv(dev); 285 285 struct can_frame *cf = (struct can_frame *)skb->data; 286 286 uint8_t fi; 287 - uint8_t dlc; 288 287 canid_t id; 289 288 uint8_t dreg; 290 289 u8 cmd_reg_val = 0x00; ··· 294 295 295 296 netif_stop_queue(dev); 296 297 297 - fi = dlc = cf->len; 298 + fi = can_get_cc_dlc(cf, priv->can.ctrlmode); 298 299 id = cf->can_id; 299 300 300 301 if (id & CAN_RTR_FLAG) ··· 315 316 priv->write_reg(priv, SJA1000_ID2, (id & 0x00000007) << 5); 316 317 } 317 318 318 - for (i = 0; i < dlc; i++) 319 + for (i = 0; i < cf->len; i++) 319 320 priv->write_reg(priv, dreg++, cf->data[i]); 320 321 321 322 can_put_echo_skb(skb, dev, 0); ··· 366 367 | (priv->read_reg(priv, SJA1000_ID2) >> 5); 367 368 } 368 369 369 - cf->len = can_cc_dlc2len(fi & 0x0F); 370 + can_frame_set_cc_len(cf, fi & 0x0F, priv->can.ctrlmode); 370 371 if (fi & SJA1000_FI_RTR) { 371 372 id |= CAN_RTR_FLAG; 372 373 } else { ··· 637 638 CAN_CTRLMODE_3_SAMPLES | 638 639 CAN_CTRLMODE_ONE_SHOT | 639 640 CAN_CTRLMODE_BERR_REPORTING | 640 - CAN_CTRLMODE_PRESUME_ACK; 641 + CAN_CTRLMODE_PRESUME_ACK | 642 + CAN_CTRLMODE_CC_LEN8_DLC; 641 643 642 644 spin_lock_init(&priv->cmdreg_lock); 643 645
+4 -3
drivers/net/can/usb/gs_usb.c
··· 331 331 332 332 cf->can_id = hf->can_id; 333 333 334 - cf->len = can_cc_dlc2len(hf->can_dlc); 334 + can_frame_set_cc_len(cf, hf->can_dlc, dev->can.ctrlmode); 335 335 memcpy(cf->data, hf->data, 8); 336 336 337 337 /* ERROR frames tell us information about the controller */ ··· 504 504 cf = (struct can_frame *)skb->data; 505 505 506 506 hf->can_id = cf->can_id; 507 - hf->can_dlc = cf->len; 507 + hf->can_dlc = can_get_cc_dlc(cf, dev->can.ctrlmode); 508 + 508 509 memcpy(hf->data, cf->data, cf->len); 509 510 510 511 usb_fill_bulk_urb(urb, dev->udev, ··· 859 858 dev->can.bittiming_const = &dev->bt_const; 860 859 dev->can.do_set_bittiming = gs_usb_set_bittiming; 861 860 862 - dev->can.ctrlmode_supported = 0; 861 + dev->can.ctrlmode_supported = CAN_CTRLMODE_CC_LEN8_DLC; 863 862 864 863 if (bt_const->feature & GS_CAN_FEATURE_LISTEN_ONLY) 865 864 dev->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY;
+5 -3
drivers/net/can/usb/peak_usb/pcan_usb.c
··· 734 734 cf->can_id = le16_to_cpu(tmp16) >> 5; 735 735 } 736 736 737 - cf->len = can_cc_dlc2len(rec_len); 737 + can_frame_set_cc_len(cf, rec_len, mc->pdev->dev.can.ctrlmode); 738 738 739 739 /* Only first packet timestamp is a word */ 740 740 if (pcan_usb_decode_ts(mc, !mc->rec_ts_idx)) ··· 838 838 pc = obuf + PCAN_USB_MSG_HEADER_LEN; 839 839 840 840 /* status/len byte */ 841 - *pc = cf->len; 841 + *pc = can_get_cc_dlc(cf, dev->can.ctrlmode); 842 + 842 843 if (cf->can_id & CAN_RTR_FLAG) 843 844 *pc |= PCAN_USB_STATUSLEN_RTR; 844 845 ··· 993 992 .device_id = PCAN_USB_PRODUCT_ID, 994 993 .ctrl_count = 1, 995 994 .ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY | 996 - CAN_CTRLMODE_BERR_REPORTING, 995 + CAN_CTRLMODE_BERR_REPORTING | 996 + CAN_CTRLMODE_CC_LEN8_DLC, 997 997 .clock = { 998 998 .freq = PCAN_USB_CRYSTAL_HZ / 2 , 999 999 },
+16 -9
drivers/net/can/usb/peak_usb/pcan_usb_fd.c
··· 499 499 if (!skb) 500 500 return -ENOMEM; 501 501 502 - cfd->len = can_cc_dlc2len(pucan_msg_get_dlc(rm)); 502 + can_frame_set_cc_len((struct can_frame *)cfd, 503 + pucan_msg_get_dlc(rm), 504 + dev->can.ctrlmode); 503 505 } 504 506 505 507 cfd->can_id = le32_to_cpu(rm->can_id); ··· 739 737 struct pucan_tx_msg *tx_msg = (struct pucan_tx_msg *)obuf; 740 738 struct canfd_frame *cfd = (struct canfd_frame *)skb->data; 741 739 u16 tx_msg_size, tx_msg_flags; 742 - u8 len; 740 + u8 dlc; 743 741 744 742 if (cfd->len > CANFD_MAX_DLEN) 745 743 return -EINVAL; ··· 758 756 759 757 if (can_is_canfd_skb(skb)) { 760 758 /* considering a CANFD frame */ 761 - len = can_fd_len2dlc(cfd->len); 759 + dlc = can_fd_len2dlc(cfd->len); 762 760 763 761 tx_msg_flags |= PUCAN_MSG_EXT_DATA_LEN; 764 762 ··· 769 767 tx_msg_flags |= PUCAN_MSG_ERROR_STATE_IND; 770 768 } else { 771 769 /* CAND 2.0 frames */ 772 - len = cfd->len; 770 + dlc = can_get_cc_dlc((struct can_frame *)cfd, 771 + dev->can.ctrlmode); 773 772 774 773 if (cfd->can_id & CAN_RTR_FLAG) 775 774 tx_msg_flags |= PUCAN_MSG_RTR; 776 775 } 777 776 778 777 tx_msg->flags = cpu_to_le16(tx_msg_flags); 779 - tx_msg->channel_dlc = PUCAN_MSG_CHANNEL_DLC(dev->ctrl_idx, len); 778 + tx_msg->channel_dlc = PUCAN_MSG_CHANNEL_DLC(dev->ctrl_idx, dlc); 780 779 memcpy(tx_msg->d, cfd->data, cfd->len); 781 780 782 781 /* add null size message to tag the end (messages are 32-bits aligned) ··· 1039 1036 .device_id = PCAN_USBFD_PRODUCT_ID, 1040 1037 .ctrl_count = PCAN_USBFD_CHANNEL_COUNT, 1041 1038 .ctrlmode_supported = CAN_CTRLMODE_FD | 1042 - CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY, 1039 + CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY | 1040 + CAN_CTRLMODE_CC_LEN8_DLC, 1043 1041 .clock = { 1044 1042 .freq = PCAN_UFD_CRYSTAL_HZ, 1045 1043 }, ··· 1112 1108 .device_id = PCAN_USBCHIP_PRODUCT_ID, 1113 1109 .ctrl_count = PCAN_USBFD_CHANNEL_COUNT, 1114 1110 .ctrlmode_supported = CAN_CTRLMODE_FD | 1115 - CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY, 1111 + CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY | 1112 + CAN_CTRLMODE_CC_LEN8_DLC, 1116 1113 .clock = { 1117 1114 .freq = PCAN_UFD_CRYSTAL_HZ, 1118 1115 }, ··· 1185 1180 .device_id = PCAN_USBPROFD_PRODUCT_ID, 1186 1181 .ctrl_count = PCAN_USBPROFD_CHANNEL_COUNT, 1187 1182 .ctrlmode_supported = CAN_CTRLMODE_FD | 1188 - CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY, 1183 + CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY | 1184 + CAN_CTRLMODE_CC_LEN8_DLC, 1189 1185 .clock = { 1190 1186 .freq = PCAN_UFD_CRYSTAL_HZ, 1191 1187 }, ··· 1258 1252 .device_id = PCAN_USBX6_PRODUCT_ID, 1259 1253 .ctrl_count = PCAN_USBPROFD_CHANNEL_COUNT, 1260 1254 .ctrlmode_supported = CAN_CTRLMODE_FD | 1261 - CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY, 1255 + CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY | 1256 + CAN_CTRLMODE_CC_LEN8_DLC, 1262 1257 .clock = { 1263 1258 .freq = PCAN_UFD_CRYSTAL_HZ, 1264 1259 },
+4 -3
drivers/net/can/usb/usb_8dev.c
··· 470 470 return; 471 471 472 472 cf->can_id = be32_to_cpu(msg->id); 473 - cf->len = can_cc_dlc2len(msg->dlc & 0xF); 473 + can_frame_set_cc_len(cf, msg->dlc & 0xF, priv->can.ctrlmode); 474 474 475 475 if (msg->flags & USB_8DEV_EXTID) 476 476 cf->can_id |= CAN_EFF_FLAG; ··· 637 637 msg->flags |= USB_8DEV_EXTID; 638 638 639 639 msg->id = cpu_to_be32(cf->can_id & CAN_ERR_MASK); 640 - msg->dlc = cf->len; 640 + msg->dlc = can_get_cc_dlc(cf, priv->can.ctrlmode); 641 641 memcpy(msg->data, cf->data, cf->len); 642 642 msg->end = USB_8DEV_DATA_END; 643 643 ··· 928 928 priv->can.do_get_berr_counter = usb_8dev_get_berr_counter; 929 929 priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | 930 930 CAN_CTRLMODE_LISTENONLY | 931 - CAN_CTRLMODE_ONE_SHOT; 931 + CAN_CTRLMODE_ONE_SHOT | 932 + CAN_CTRLMODE_CC_LEN8_DLC; 932 933 933 934 netdev->netdev_ops = &usb_8dev_netdev_ops; 934 935