Commit | Line | Data |
---|---|---|
bdd2e413 MKB |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* Copyright (C) 2020 Oliver Hartkopp <socketcan@hartkopp.net> | |
85d99c3e | 3 | * Copyright (C) 2020 Marc Kleine-Budde <kernel@pengutronix.de> |
bdd2e413 MKB |
4 | */ |
5 | ||
6 | #ifndef _CAN_LENGTH_H | |
7 | #define _CAN_LENGTH_H | |
8 | ||
85d99c3e VM |
9 | /* |
10 | * Size of a Classical CAN Standard Frame | |
11 | * | |
12 | * Name of Field Bits | |
13 | * --------------------------------------------------------- | |
14 | * Start-of-frame 1 | |
15 | * Identifier 11 | |
16 | * Remote transmission request (RTR) 1 | |
17 | * Identifier extension bit (IDE) 1 | |
18 | * Reserved bit (r0) 1 | |
19 | * Data length code (DLC) 4 | |
20 | * Data field 0...64 | |
21 | * CRC 15 | |
22 | * CRC delimiter 1 | |
23 | * ACK slot 1 | |
24 | * ACK delimiter 1 | |
25 | * End-of-frame (EOF) 7 | |
26 | * Inter frame spacing 3 | |
27 | * | |
28 | * rounded up and ignoring bitstuffing | |
29 | */ | |
30 | #define CAN_FRAME_OVERHEAD_SFF DIV_ROUND_UP(47, 8) | |
31 | ||
32 | /* | |
33 | * Size of a Classical CAN Extended Frame | |
34 | * | |
35 | * Name of Field Bits | |
36 | * --------------------------------------------------------- | |
37 | * Start-of-frame 1 | |
38 | * Identifier A 11 | |
39 | * Substitute remote request (SRR) 1 | |
40 | * Identifier extension bit (IDE) 1 | |
41 | * Identifier B 18 | |
42 | * Remote transmission request (RTR) 1 | |
43 | * Reserved bits (r1, r0) 2 | |
44 | * Data length code (DLC) 4 | |
45 | * Data field 0...64 | |
46 | * CRC 15 | |
47 | * CRC delimiter 1 | |
48 | * ACK slot 1 | |
49 | * ACK delimiter 1 | |
50 | * End-of-frame (EOF) 7 | |
51 | * Inter frame spacing 3 | |
52 | * | |
53 | * rounded up and ignoring bitstuffing | |
54 | */ | |
55 | #define CAN_FRAME_OVERHEAD_EFF DIV_ROUND_UP(67, 8) | |
56 | ||
57 | /* | |
58 | * Size of a CAN-FD Standard Frame | |
59 | * | |
60 | * Name of Field Bits | |
61 | * --------------------------------------------------------- | |
62 | * Start-of-frame 1 | |
63 | * Identifier 11 | |
64 | * Reserved bit (r1) 1 | |
65 | * Identifier extension bit (IDE) 1 | |
66 | * Flexible data rate format (FDF) 1 | |
67 | * Reserved bit (r0) 1 | |
68 | * Bit Rate Switch (BRS) 1 | |
69 | * Error Status Indicator (ESI) 1 | |
70 | * Data length code (DLC) 4 | |
71 | * Data field 0...512 | |
72 | * Stuff Bit Count (SBC) 0...16: 4 20...64:5 | |
73 | * CRC 0...16: 17 20...64:21 | |
74 | * CRC delimiter (CD) 1 | |
75 | * ACK slot (AS) 1 | |
76 | * ACK delimiter (AD) 1 | |
77 | * End-of-frame (EOF) 7 | |
78 | * Inter frame spacing 3 | |
79 | * | |
80 | * assuming CRC21, rounded up and ignoring bitstuffing | |
81 | */ | |
82 | #define CANFD_FRAME_OVERHEAD_SFF DIV_ROUND_UP(61, 8) | |
83 | ||
84 | /* | |
85 | * Size of a CAN-FD Extended Frame | |
86 | * | |
87 | * Name of Field Bits | |
88 | * --------------------------------------------------------- | |
89 | * Start-of-frame 1 | |
90 | * Identifier A 11 | |
91 | * Substitute remote request (SRR) 1 | |
92 | * Identifier extension bit (IDE) 1 | |
93 | * Identifier B 18 | |
94 | * Reserved bit (r1) 1 | |
95 | * Flexible data rate format (FDF) 1 | |
96 | * Reserved bit (r0) 1 | |
97 | * Bit Rate Switch (BRS) 1 | |
98 | * Error Status Indicator (ESI) 1 | |
99 | * Data length code (DLC) 4 | |
100 | * Data field 0...512 | |
101 | * Stuff Bit Count (SBC) 0...16: 4 20...64:5 | |
102 | * CRC 0...16: 17 20...64:21 | |
103 | * CRC delimiter (CD) 1 | |
104 | * ACK slot (AS) 1 | |
105 | * ACK delimiter (AD) 1 | |
106 | * End-of-frame (EOF) 7 | |
107 | * Inter frame spacing 3 | |
108 | * | |
109 | * assuming CRC21, rounded up and ignoring bitstuffing | |
110 | */ | |
111 | #define CANFD_FRAME_OVERHEAD_EFF DIV_ROUND_UP(80, 8) | |
112 | ||
113 | /* | |
114 | * Maximum size of a Classical CAN frame | |
115 | * (rounded up and ignoring bitstuffing) | |
116 | */ | |
117 | #define CAN_FRAME_LEN_MAX (CAN_FRAME_OVERHEAD_EFF + CAN_MAX_DLEN) | |
118 | ||
119 | /* | |
120 | * Maximum size of a CAN-FD frame | |
121 | * (rounded up and ignoring bitstuffing) | |
122 | */ | |
123 | #define CANFD_FRAME_LEN_MAX (CANFD_FRAME_OVERHEAD_EFF + CANFD_MAX_DLEN) | |
124 | ||
bdd2e413 MKB |
125 | /* |
126 | * can_cc_dlc2len(value) - convert a given data length code (dlc) of a | |
127 | * Classical CAN frame into a valid data length of max. 8 bytes. | |
128 | * | |
129 | * To be used in the CAN netdriver receive path to ensure conformance with | |
130 | * ISO 11898-1 Chapter 8.4.2.3 (DLC field) | |
131 | */ | |
132 | #define can_cc_dlc2len(dlc) (min_t(u8, (dlc), CAN_MAX_DLEN)) | |
133 | ||
134 | /* helper to get the data length code (DLC) for Classical CAN raw DLC access */ | |
135 | static inline u8 can_get_cc_dlc(const struct can_frame *cf, const u32 ctrlmode) | |
136 | { | |
137 | /* return len8_dlc as dlc value only if all conditions apply */ | |
138 | if ((ctrlmode & CAN_CTRLMODE_CC_LEN8_DLC) && | |
139 | (cf->len == CAN_MAX_DLEN) && | |
140 | (cf->len8_dlc > CAN_MAX_DLEN && cf->len8_dlc <= CAN_MAX_RAW_DLC)) | |
141 | return cf->len8_dlc; | |
142 | ||
143 | /* return the payload length as dlc value */ | |
144 | return cf->len; | |
145 | } | |
146 | ||
147 | /* helper to set len and len8_dlc value for Classical CAN raw DLC access */ | |
148 | static inline void can_frame_set_cc_len(struct can_frame *cf, const u8 dlc, | |
149 | const u32 ctrlmode) | |
150 | { | |
151 | /* the caller already ensured that dlc is a value from 0 .. 15 */ | |
152 | if (ctrlmode & CAN_CTRLMODE_CC_LEN8_DLC && dlc > CAN_MAX_DLEN) | |
153 | cf->len8_dlc = dlc; | |
154 | ||
155 | /* limit the payload length 'len' to CAN_MAX_DLEN */ | |
156 | cf->len = can_cc_dlc2len(dlc); | |
157 | } | |
158 | ||
159 | /* get data length from raw data length code (DLC) */ | |
160 | u8 can_fd_dlc2len(u8 dlc); | |
161 | ||
162 | /* map the sanitized data length to an appropriate data length code */ | |
163 | u8 can_fd_len2dlc(u8 len); | |
164 | ||
85d99c3e VM |
165 | /* calculate the CAN Frame length in bytes of a given skb */ |
166 | unsigned int can_skb_get_frame_len(const struct sk_buff *skb); | |
167 | ||
99b7beb0 MKB |
168 | /* map the data length to an appropriate data link layer length */ |
169 | static inline u8 canfd_sanitize_len(u8 len) | |
170 | { | |
171 | return can_fd_dlc2len(can_fd_len2dlc(len)); | |
172 | } | |
173 | ||
bdd2e413 | 174 | #endif /* !_CAN_LENGTH_H */ |