![]() |
|
|||
0001 /* SPDX-License-Identifier: GPL-2.0 */ 0002 /* Copyright (C) 2020 Oliver Hartkopp <socketcan@hartkopp.net> 0003 * Copyright (C) 2020 Marc Kleine-Budde <kernel@pengutronix.de> 0004 */ 0005 0006 #ifndef _CAN_LENGTH_H 0007 #define _CAN_LENGTH_H 0008 0009 /* 0010 * Size of a Classical CAN Standard Frame 0011 * 0012 * Name of Field Bits 0013 * --------------------------------------------------------- 0014 * Start-of-frame 1 0015 * Identifier 11 0016 * Remote transmission request (RTR) 1 0017 * Identifier extension bit (IDE) 1 0018 * Reserved bit (r0) 1 0019 * Data length code (DLC) 4 0020 * Data field 0...64 0021 * CRC 15 0022 * CRC delimiter 1 0023 * ACK slot 1 0024 * ACK delimiter 1 0025 * End-of-frame (EOF) 7 0026 * Inter frame spacing 3 0027 * 0028 * rounded up and ignoring bitstuffing 0029 */ 0030 #define CAN_FRAME_OVERHEAD_SFF DIV_ROUND_UP(47, 8) 0031 0032 /* 0033 * Size of a Classical CAN Extended Frame 0034 * 0035 * Name of Field Bits 0036 * --------------------------------------------------------- 0037 * Start-of-frame 1 0038 * Identifier A 11 0039 * Substitute remote request (SRR) 1 0040 * Identifier extension bit (IDE) 1 0041 * Identifier B 18 0042 * Remote transmission request (RTR) 1 0043 * Reserved bits (r1, r0) 2 0044 * Data length code (DLC) 4 0045 * Data field 0...64 0046 * CRC 15 0047 * CRC delimiter 1 0048 * ACK slot 1 0049 * ACK delimiter 1 0050 * End-of-frame (EOF) 7 0051 * Inter frame spacing 3 0052 * 0053 * rounded up and ignoring bitstuffing 0054 */ 0055 #define CAN_FRAME_OVERHEAD_EFF DIV_ROUND_UP(67, 8) 0056 0057 /* 0058 * Size of a CAN-FD Standard Frame 0059 * 0060 * Name of Field Bits 0061 * --------------------------------------------------------- 0062 * Start-of-frame 1 0063 * Identifier 11 0064 * Reserved bit (r1) 1 0065 * Identifier extension bit (IDE) 1 0066 * Flexible data rate format (FDF) 1 0067 * Reserved bit (r0) 1 0068 * Bit Rate Switch (BRS) 1 0069 * Error Status Indicator (ESI) 1 0070 * Data length code (DLC) 4 0071 * Data field 0...512 0072 * Stuff Bit Count (SBC) 0...16: 4 20...64:5 0073 * CRC 0...16: 17 20...64:21 0074 * CRC delimiter (CD) 1 0075 * ACK slot (AS) 1 0076 * ACK delimiter (AD) 1 0077 * End-of-frame (EOF) 7 0078 * Inter frame spacing 3 0079 * 0080 * assuming CRC21, rounded up and ignoring bitstuffing 0081 */ 0082 #define CANFD_FRAME_OVERHEAD_SFF DIV_ROUND_UP(61, 8) 0083 0084 /* 0085 * Size of a CAN-FD Extended Frame 0086 * 0087 * Name of Field Bits 0088 * --------------------------------------------------------- 0089 * Start-of-frame 1 0090 * Identifier A 11 0091 * Substitute remote request (SRR) 1 0092 * Identifier extension bit (IDE) 1 0093 * Identifier B 18 0094 * Reserved bit (r1) 1 0095 * Flexible data rate format (FDF) 1 0096 * Reserved bit (r0) 1 0097 * Bit Rate Switch (BRS) 1 0098 * Error Status Indicator (ESI) 1 0099 * Data length code (DLC) 4 0100 * Data field 0...512 0101 * Stuff Bit Count (SBC) 0...16: 4 20...64:5 0102 * CRC 0...16: 17 20...64:21 0103 * CRC delimiter (CD) 1 0104 * ACK slot (AS) 1 0105 * ACK delimiter (AD) 1 0106 * End-of-frame (EOF) 7 0107 * Inter frame spacing 3 0108 * 0109 * assuming CRC21, rounded up and ignoring bitstuffing 0110 */ 0111 #define CANFD_FRAME_OVERHEAD_EFF DIV_ROUND_UP(80, 8) 0112 0113 /* 0114 * Maximum size of a Classical CAN frame 0115 * (rounded up and ignoring bitstuffing) 0116 */ 0117 #define CAN_FRAME_LEN_MAX (CAN_FRAME_OVERHEAD_EFF + CAN_MAX_DLEN) 0118 0119 /* 0120 * Maximum size of a CAN-FD frame 0121 * (rounded up and ignoring bitstuffing) 0122 */ 0123 #define CANFD_FRAME_LEN_MAX (CANFD_FRAME_OVERHEAD_EFF + CANFD_MAX_DLEN) 0124 0125 /* 0126 * can_cc_dlc2len(value) - convert a given data length code (dlc) of a 0127 * Classical CAN frame into a valid data length of max. 8 bytes. 0128 * 0129 * To be used in the CAN netdriver receive path to ensure conformance with 0130 * ISO 11898-1 Chapter 8.4.2.3 (DLC field) 0131 */ 0132 #define can_cc_dlc2len(dlc) (min_t(u8, (dlc), CAN_MAX_DLEN)) 0133 0134 /* helper to get the data length code (DLC) for Classical CAN raw DLC access */ 0135 static inline u8 can_get_cc_dlc(const struct can_frame *cf, const u32 ctrlmode) 0136 { 0137 /* return len8_dlc as dlc value only if all conditions apply */ 0138 if ((ctrlmode & CAN_CTRLMODE_CC_LEN8_DLC) && 0139 (cf->len == CAN_MAX_DLEN) && 0140 (cf->len8_dlc > CAN_MAX_DLEN && cf->len8_dlc <= CAN_MAX_RAW_DLC)) 0141 return cf->len8_dlc; 0142 0143 /* return the payload length as dlc value */ 0144 return cf->len; 0145 } 0146 0147 /* helper to set len and len8_dlc value for Classical CAN raw DLC access */ 0148 static inline void can_frame_set_cc_len(struct can_frame *cf, const u8 dlc, 0149 const u32 ctrlmode) 0150 { 0151 /* the caller already ensured that dlc is a value from 0 .. 15 */ 0152 if (ctrlmode & CAN_CTRLMODE_CC_LEN8_DLC && dlc > CAN_MAX_DLEN) 0153 cf->len8_dlc = dlc; 0154 0155 /* limit the payload length 'len' to CAN_MAX_DLEN */ 0156 cf->len = can_cc_dlc2len(dlc); 0157 } 0158 0159 /* get data length from raw data length code (DLC) */ 0160 u8 can_fd_dlc2len(u8 dlc); 0161 0162 /* map the sanitized data length to an appropriate data length code */ 0163 u8 can_fd_len2dlc(u8 len); 0164 0165 /* calculate the CAN Frame length in bytes of a given skb */ 0166 unsigned int can_skb_get_frame_len(const struct sk_buff *skb); 0167 0168 /* map the data length to an appropriate data link layer length */ 0169 static inline u8 canfd_sanitize_len(u8 len) 0170 { 0171 return can_fd_dlc2len(can_fd_len2dlc(len)); 0172 } 0173 0174 #endif /* !_CAN_LENGTH_H */
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.1.0 LXR engine. The LXR team |
![]() ![]() |