Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp570389rwd; Thu, 1 Jun 2023 04:08:41 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7t4ElT5lach3TKsF+YFe/9PUIPoO40355Or2F2PlhJRRvYG4R2Y5QMdjnsZK3cw5Y3PJ6/ X-Received: by 2002:a17:902:e543:b0:1ab:723:1acc with SMTP id n3-20020a170902e54300b001ab07231accmr8897233plf.35.1685617721435; Thu, 01 Jun 2023 04:08:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685617721; cv=none; d=google.com; s=arc-20160816; b=blIvsjX7h5dPipXfC5owUatCy3+O1f0KmpJeHFx2Eqsr5sqaS/zrtILx8fTow54kVI WgcSPrHvI7lEBV/inVrXUSk5TBIbdK7ubgtV1NKadA+Oxf9RfHxvU5IpitpYHx8iwYga zXvJrLXdHTflq9cSBCOBdfx3iOMUKXP8CDfBRlY0snJGrg3FeAVo2qXhmecE1wVh6mkC agGEjyp4F1fsA6VXAhbQGXHq4v6T7PT39hbpTSwsJsihpEFn454ez19nrq0QzmP5LZQv EJMwEc+cwGKJV7fjAWdpFHyeOgzfidBi3h/hCPdAroTcVoDTLX3xOD7qOLInFlT8ZbRm OvUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version; bh=4UnuQNDZvnh+J1SuMyNP5XpfaIRn2gEe8444efObkrA=; b=EdT2kW/Vfhsb8K3dRRoZULd9qSiY4j4yjjovntV6xgMwCjKRTP1GaK1eGWE78XKFHD WytZXIGpsw/iZsgxPy6d80/haTDLW/4W+3F9WhmqAW+mQhJESJ10Suy44flThYTkdfJy 0LRlCTqysbO9PjqAtdAPd54Z5B6T8JNqPcJUeAb9ogAxxizUDlEIMp6itXOWA5pEu4AW WJq4pllgr+mzYw0nR+VZPNnaJGO6wYAhtzX7dhuqWr7tH+XM8fpPKK9fw9a/nUqRdn7U 7oPREaJpy4H2zl/1UUegRBYX7QxNUmAceKHAcA5siOxWnmSTmKv4hOU4NR1XptfFjIzg IP8g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l13-20020a170903120d00b001b041591a5fsi2612433plh.459.2023.06.01.04.08.26; Thu, 01 Jun 2023 04:08:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232873AbjFALAj convert rfc822-to-8bit (ORCPT + 99 others); Thu, 1 Jun 2023 07:00:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53658 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232594AbjFALAb (ORCPT ); Thu, 1 Jun 2023 07:00:31 -0400 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EAB52F2; Thu, 1 Jun 2023 04:00:27 -0700 (PDT) Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-1b075e13a5eso5848255ad.3; Thu, 01 Jun 2023 04:00:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685617227; x=1688209227; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FTsv4PYBizV6sLpd+w0VSA9HwuBz7E/owV6KuyoF9Rk=; b=jhcr/bn0yTT8h6YBB/Z0N38G6W3bsF3+va1TT0V7WIgj09C8GHYZA6lemLvlLLvNDs MrJRpELaeLFhovVmdqgthrBY/l7tO11D4u0pv5BL8hkrT9F7dN3iyVrkggbGXqotLx5G EQes3mTpTfTP2jnaH3oQWYECQqZQO/qtdPfRDKnHrQk29iR9YZmeOn1t86E8zxYzQBy9 j7wIJxmumwxZclan9I3HO5r/zN81QWN/a2IxPP9CSp9REonY3CVVa/Z9PcfUAgsU/h2b 9ERzw2+eCaRruYupUpDBQP0iDbMw2NDI31VxRBsZbys+HcvKgbkU9IZEvmNl0CSfEzRr 8V2g== X-Gm-Message-State: AC+VfDwkwVUjBR1YNDU4gtFfs97ZKvnQVBkuupvhoABZaVQ9+c5a9fn6 H3unEl1mEsZYjr3YF/SX6g5KKDCDUSRRcnXBLhI= X-Received: by 2002:a17:903:230d:b0:1af:f660:1689 with SMTP id d13-20020a170903230d00b001aff6601689mr9262221plh.31.1685617227065; Thu, 01 Jun 2023 04:00:27 -0700 (PDT) MIME-Version: 1.0 References: <20230507155506.3179711-1-mailhol.vincent@wanadoo.fr> <20230530144637.4746-1-mailhol.vincent@wanadoo.fr> <20230530144637.4746-4-mailhol.vincent@wanadoo.fr> In-Reply-To: From: Vincent MAILHOL Date: Thu, 1 Jun 2023 20:00:15 +0900 Message-ID: Subject: Re: [PATCH v3 3/3] can: length: refactor frame lengths definition to add size in bits To: Thomas.Kopp@microchip.com Cc: mkl@pengutronix.de, linux-can@vger.kernel.org, socketcan@hartkopp.net, netdev@vger.kernel.org, marex@denx.de, simon.horman@corigine.com, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu. 1 juin 2023 at19:42, wrote: > > Introduce a method to calculate the exact size in bits of a CAN(-FD) > > frame with or without dynamic bitsuffing. > > > > These are all the possible combinations taken into account: > > > > - Classical CAN or CAN-FD > > - Standard or Extended frame format > > - CAN-FD CRC17 or CRC21 > > - Include or not intermission > > > > Instead of doing several individual macro definitions, declare the > > can_frame_bits() function-like macro. To this extent, do a full > > refactoring of the length definitions. > > > > In addition add the can_frame_bytes(). This function-like macro > > replaces the existing macro: > > > > - CAN_FRAME_OVERHEAD_SFF: can_frame_bytes(false, false, 0) > > - CAN_FRAME_OVERHEAD_EFF: can_frame_bytes(false, true, 0) > > - CANFD_FRAME_OVERHEAD_SFF: can_frame_bytes(true, false, 0) > > - CANFD_FRAME_OVERHEAD_EFF: can_frame_bytes(true, true, 0) > > > > The different maximum frame lengths (maximum data length, including > > intermission) are as follow: > > > > Frame type bits bytes > > ------------------------------------------------------- > > Classic CAN SFF no-bitstuffing 111 14 > > Classic CAN EFF no-bitstuffing 131 17 > > Classic CAN SFF bitstuffing 135 17 > > Classic CAN EFF bitstuffing 160 20 > > CAN-FD SFF no-bitstuffing 579 73 > > CAN-FD EFF no-bitstuffing 598 75 > > CAN-FD SFF bitstuffing 712 89 > > CAN-FD EFF bitstuffing 736 92 > > > > The macro CAN_FRAME_LEN_MAX and CANFD_FRAME_LEN_MAX are kept as > > an > > alias to, respectively, can_frame_bytes(false, true, CAN_MAX_DLEN) and > > can_frame_bytes(true, true, CANFD_MAX_DLEN). > > > > In addition to the above: > > > > - Use ISO 11898-1:2015 definitions for the name of the CAN frame > > fields. > > - Include linux/bits.h for use of BITS_PER_BYTE. > > - Include linux/math.h for use of mult_frac() and > > DIV_ROUND_UP(). N.B: the use of DIV_ROUND_UP() is not new to this > > patch, but the include was previously omitted. > > - Add copyright 2023 for myself. > > > > Signed-off-by: Vincent Mailhol > > --- > > drivers/net/can/dev/length.c | 15 +- > > include/linux/can/length.h | 298 +++++++++++++++++++++++++---------- > > 2 files changed, 213 insertions(+), 100 deletions(-) > > > > diff --git a/drivers/net/can/dev/length.c b/drivers/net/can/dev/length.c > > index b48140b1102e..b7f4d76dd444 100644 > > --- a/drivers/net/can/dev/length.c > > +++ b/drivers/net/can/dev/length.c > > @@ -78,18 +78,7 @@ unsigned int can_skb_get_frame_len(const struct > > sk_buff *skb) > > else > > len = cf->len; > > > > - if (can_is_canfd_skb(skb)) { > > - if (cf->can_id & CAN_EFF_FLAG) > > - len += CANFD_FRAME_OVERHEAD_EFF; > > - else > > - len += CANFD_FRAME_OVERHEAD_SFF; > > - } else { > > - if (cf->can_id & CAN_EFF_FLAG) > > - len += CAN_FRAME_OVERHEAD_EFF; > > - else > > - len += CAN_FRAME_OVERHEAD_SFF; > > - } > > - > > - return len; > > + return can_frame_bytes(can_is_canfd_skb(skb), cf->can_id & > > CAN_EFF_FLAG, > > + false, len); > > } > > EXPORT_SYMBOL_GPL(can_skb_get_frame_len); > > diff --git a/include/linux/can/length.h b/include/linux/can/length.h > > index 521fdbce2d69..ef6e78fa95b9 100644 > > --- a/include/linux/can/length.h > > +++ b/include/linux/can/length.h > > @@ -1,132 +1,256 @@ > > /* SPDX-License-Identifier: GPL-2.0 */ > > /* Copyright (C) 2020 Oliver Hartkopp > > * Copyright (C) 2020 Marc Kleine-Budde > > - * Copyright (C) 2020 Vincent Mailhol > > + * Copyright (C) 2020, 2023 Vincent Mailhol > > */ > > > > #ifndef _CAN_LENGTH_H > > #define _CAN_LENGTH_H > > > > +#include > > #include > > #include > > +#include > > > > /* > > - * Size of a Classical CAN Standard Frame > > + * Size of a Classical CAN Standard Frame header in bits > > * > > - * Name of Field Bits > > + * Name of Field Bits > > * --------------------------------------------------------- > > - * Start-of-frame 1 > > - * Identifier 11 > > - * Remote transmission request (RTR) 1 > > - * Identifier extension bit (IDE) 1 > > - * Reserved bit (r0) 1 > > - * Data length code (DLC) 4 > > - * Data field 0...64 > > - * CRC 15 > > - * CRC delimiter 1 > > - * ACK slot 1 > > - * ACK delimiter 1 > > - * End-of-frame (EOF) 7 > > - * Inter frame spacing 3 > > + * Start Of Frame (SOF) 1 > > + * Arbitration field: > > + * base ID 11 > > + * Remote Transmission Request (RTR) 1 > > + * Control field: > > + * IDentifier Extension bit (IDE) 1 > > + * FD Format indicatior (FDF) 1 > > + * Data Length Code (DLC) 4 > > + * > > + * including all fields preceding the data field, ignoring bitstuffing > > + */ > > +#define CAN_FRAME_HEADER_SFF_BITS 19 > > + > > +/* > > + * Size of a Classical CAN Extended Frame header in bits > > + * > > + * Name of Field Bits > > + * --------------------------------------------------------- > > + * Start Of Frame (SOF) 1 > > + * Arbitration field: > > + * base ID 11 > > + * Substitute Remote Request (SRR) 1 > > + * IDentifier Extension bit (IDE) 1 > > + * ID extension 18 > > + * Remote Transmission Request (RTR) 1 > > + * Control field: > > + * FD Format indicatior (FDF) 1 > Nit: indicator, same above ACK. > > + * Reserved bit (r0) 1 > > + * Data length code (DLC) 4 > > + * > > + * including all fields preceding the data field, ignoring bitstuffing > > + */ > > +#define CAN_FRAME_HEADER_EFF_BITS 39 > > + > > +/* > > + * Size of a CAN-FD Standard Frame in bits > > + * > > + * Name of Field Bits > > + * --------------------------------------------------------- > > + * Start Of Frame (SOF) 1 > > + * Arbitration field: > > + * base ID 11 > > + * Remote Request Substitution (RRS) 1 > > + * Control field: > > + * IDentifier Extension bit (IDE) 1 > > + * FD Format indicator (FDF) 1 > > + * Reserved bit (res) 1 > > + * Bit Rate Switch (BRS) 1 > > + * Error Status Indicator (ESI) 1 > > + * Data length code (DLC) 4 > > + * > > + * including all fields preceding the data field, ignoring bitstuffing > > + */ > > +#define CANFD_FRAME_HEADER_SFF_BITS 22 > > + > > +/* > > + * Size of a CAN-FD Extended Frame in bits > > + * > > + * Name of Field Bits > > + * --------------------------------------------------------- > > + * Start Of Frame (SOF) 1 > > + * Arbitration field: > > + * base ID 11 > > + * Substitute Remote Request (SRR) 1 > > + * IDentifier Extension bit (IDE) 1 > > + * ID extension 18 > > + * Remote Request Substitution (RRS) 1 > > + * Control field: > > + * FD Format indicator (FDF) 1 > > + * Reserved bit (res) 1 > > + * Bit Rate Switch (BRS) 1 > > + * Error Status Indicator (ESI) 1 > > + * Data length code (DLC) 4 > > * > > - * rounded up and ignoring bitstuffing > > + * including all fields preceding the data field, ignoring bitstuffing > > */ > > -#define CAN_FRAME_OVERHEAD_SFF DIV_ROUND_UP(47, 8) > > +#define CANFD_FRAME_HEADER_EFF_BITS 41 > > > > /* > > - * Size of a Classical CAN Extended Frame > > + * Size of a CAN CRC Field in bits > > * > > * Name of Field Bits > > * --------------------------------------------------------- > > - * Start-of-frame 1 > > - * Identifier A 11 > > - * Substitute remote request (SRR) 1 > > - * Identifier extension bit (IDE) 1 > > - * Identifier B 18 > > - * Remote transmission request (RTR) 1 > > - * Reserved bits (r1, r0) 2 > > - * Data length code (DLC) 4 > > - * Data field 0...64 > > - * CRC 15 > > - * CRC delimiter 1 > > - * ACK slot 1 > > - * ACK delimiter 1 > > - * End-of-frame (EOF) 7 > > - * Inter frame spacing 3 > > + * CRC sequence (CRC15) 15 > > + * CRC Delimiter 1 > > * > > - * rounded up and ignoring bitstuffing > > + * ignoring bitstuffing > > */ > > -#define CAN_FRAME_OVERHEAD_EFF DIV_ROUND_UP(67, 8) > > +#define CAN_FRAME_CRC_FIELD_BITS 16 > > > > /* > > - * Size of a CAN-FD Standard Frame > > + * Size of a CAN-FD CRC17 Field in bits (length: 0..16) > > * > > * Name of Field Bits > > * --------------------------------------------------------- > > - * Start-of-frame 1 > > - * Identifier 11 > > - * Remote Request Substitution (RRS) 1 > > - * Identifier extension bit (IDE) 1 > > - * Flexible data rate format (FDF) 1 > > - * Reserved bit (r0) 1 > > - * Bit Rate Switch (BRS) 1 > > - * Error Status Indicator (ESI) 1 > > - * Data length code (DLC) 4 > > - * Data field 0...512 > > - * Stuff Bit Count (SBC) 4 > > - * CRC 0...16: 17 20...64:21 > > - * CRC delimiter (CD) 1 > > - * Fixed Stuff bits (FSB) 0...16: 6 20...64:7 > > - * ACK slot (AS) 1 > > - * ACK delimiter (AD) 1 > > - * End-of-frame (EOF) 7 > > - * Inter frame spacing 3 > > - * > > - * assuming CRC21, rounded up and ignoring dynamic bitstuffing > > - */ > > -#define CANFD_FRAME_OVERHEAD_SFF DIV_ROUND_UP(67, 8) > > + * Stuff Count 4 > > + * CRC Sequence (CRC17) 17 > > + * CRC Delimiter 1 > > + * Fixed stuff bits 6 > > + */ > > +#define CANFD_FRAME_CRC17_FIELD_BITS 28 > > > > /* > > - * Size of a CAN-FD Extended Frame > > + * Size of a CAN-FD CRC21 Field in bits (length: 20..64) > > * > > * Name of Field Bits > > * --------------------------------------------------------- > > - * Start-of-frame 1 > > - * Identifier A 11 > > - * Substitute remote request (SRR) 1 > > - * Identifier extension bit (IDE) 1 > > - * Identifier B 18 > > - * Remote Request Substitution (RRS) 1 > > - * Flexible data rate format (FDF) 1 > > - * Reserved bit (r0) 1 > > - * Bit Rate Switch (BRS) 1 > > - * Error Status Indicator (ESI) 1 > > - * Data length code (DLC) 4 > > - * Data field 0...512 > > - * Stuff Bit Count (SBC) 4 > > - * CRC 0...16: 17 20...64:21 > > - * CRC delimiter (CD) 1 > > - * Fixed Stuff bits (FSB) 0...16: 6 20...64:7 > > - * ACK slot (AS) 1 > > - * ACK delimiter (AD) 1 > > - * End-of-frame (EOF) 7 > > - * Inter frame spacing 3 > > - * > > - * assuming CRC21, rounded up and ignoring dynamic bitstuffing > > - */ > > -#define CANFD_FRAME_OVERHEAD_EFF DIV_ROUND_UP(86, 8) > > + * Stuff Count 4 > > + * CRC sequence (CRC21) 21 > > + * CRC Delimiter 1 > > + * Fixed stuff bits 7 > > + */ > > +#define CANFD_FRAME_CRC21_FIELD_BITS 33 > > + > > +/* > > + * Size of a CAN(-FD) Frame footer in bits > > + * > > + * Name of Field Bits > > + * --------------------------------------------------------- > > + * ACK slot 1 > > + * ACK delimiter 1 > > + * End Of Frame (EOF) 7 > > + * > > + * including all fields following the CRC field > > + */ > > +#define CAN_FRAME_FOOTER_BITS 9 > > + > > +/* > > + * First part of the Inter Frame Space > > + * (a.k.a. IMF - intermission field) > > + */ > > +#define CAN_INTERMISSION_BITS 3 > > + > > +/** > > + * can_bitstuffing_len() - Calculate the maximum length with bitsuffing > Nit: bitstuffing, same further down ACK. > > + * @bitstream_len: length of a destuffed bit stream > > + * > > + * The worst bit stuffing case is a sequence in which dominant and > > + * recessive bits alternate every four bits: > > + * > > + * Destuffed: 1 1111 0000 1111 0000 1111 > > + * Stuffed: 1 1111o 0000i 1111o 0000i 1111o > > + * > > + * Nomenclature > > + * > > + * - "0": dominant bit > > + * - "o": dominant stuff bit > > + * - "1": recessive bit > > + * - "i": recessive stuff bit > > + * > > + * Aside of the first bit, one stuff bit is added every four bits. > > + * > > + * Return: length of the stuffed bit stream in the worst case scenario. > > + */ > > +#define can_bitstuffing_len(destuffed_len) \ > > + (destuffed_len + (destuffed_len - 1) / 4) > > + > > +#define __can_bitstuffing_len(bitstuffing, destuffed_len) \ > > + (bitstuffing ? can_bitstuffing_len(destuffed_len) : \ > > + destuffed_len) > > + > > +#define __can_cc_frame_bits(is_eff, bitstuffing, \ > > + intermission, data_len) \ > > +( \ > > + __can_bitstuffing_len(bitstuffing, \ > > + (is_eff ? CAN_FRAME_HEADER_EFF_BITS : \ > > + CAN_FRAME_HEADER_SFF_BITS) + \ > > + data_len * BITS_PER_BYTE + \ > > + CAN_FRAME_CRC_FIELD_BITS) + \ > > + CAN_FRAME_FOOTER_BITS + \ > > + (intermission ? CAN_INTERMISSION_BITS : 0) \ > > +) > I think Footer and Intermission need to be pulled out of the parameter for __can_bitstuffing_length as these fields are never stuffed. Look again at the opening and closing bracket of __can_bitstuffing_len(). These are already out :) I indented the parameters of __can_bitstuffing_length() to highlight what is in and out. Maybe adding some newlines would help readability? Something like that: #define __can_cc_frame_bits(is_eff, bitstuffing, \ intermission, data_len) \ ( \ __can_bitstuffing_len( \ bitstuffing, \ (is_eff ? CAN_FRAME_HEADER_EFF_BITS : \ CAN_FRAME_HEADER_SFF_BITS) + \ data_len * BITS_PER_BYTE + \ CAN_FRAME_CRC_FIELD_BITS) \ + \ CAN_FRAME_FOOTER_BITS + \ (intermission ? CAN_INTERMISSION_BITS : 0) \ ) > > + > > +#define __can_fd_frame_bits(is_eff, bitstuffing, \ > > + intermission, data_len) \ > > +( \ > > + __can_bitstuffing_len(bitstuffing, \ > > + (is_eff ? CANFD_FRAME_HEADER_EFF_BITS : \ > > + CANFD_FRAME_HEADER_SFF_BITS) + \ > > + data_len * BITS_PER_BYTE) + \ > > + (data_len <= 16 ? \ > > + CANFD_FRAME_CRC17_FIELD_BITS : \ > > + CANFD_FRAME_CRC21_FIELD_BITS) + \ > > + CAN_FRAME_FOOTER_BITS + \ > > + (intermission ? CAN_INTERMISSION_BITS : 0) \ > > +) > I think Footer and Intermission need to be pulled out of the parameter for __can_bitstuffing_length as these fields are never stuffed. > The CAN_FRAME_CRC_FIELD_BITS bits need to be pulled out of the can_bitstuffing_len. That portion of the Frame is not dynamically stuffed in FD frames. Same as above, these are already out. > > + > > +/** > > + * can_frame_bits() - Calculate the number of bits in on the wire in a > Nit: "in on the wire" -in > > + * CAN frame > > + * @is_fd: true: CAN-FD frame; false: Classical CAN frame. > > + * @is_eff: true: Extended frame; false: Standard frame. > > + * @bitstuffing: true: calculate the bitsuffing worst case; false: > > + * calculate the bitsuffing best case (no dynamic > > + * bitsuffing). Fixed stuff bits are always included. > > + * @intermission: if and only if true, include the inter frame space > > + * assuming no bus idle (i.e. only the intermission gets added). > > + * @data_len: length of the data field in bytes. Correspond to > > + * can(fd)_frame->len. Should be zero for remote frames. No > > + * sanitization is done on @data_len. > > + * > > + * Return: the numbers of bits on the wire of a CAN frame. > > + */ > > +#define can_frame_bits(is_fd, is_eff, bitstuffing, \ > > + intermission, data_len) \ > > +( \ > > + is_fd ? __can_fd_frame_bits(is_eff, bitstuffing, \ > > + intermission, data_len) : \ > > + __can_cc_frame_bits(is_eff, bitstuffing, \ > > + intermission, data_len) \ > > +) > > + > > +/* > > + * Number of bytes in a CAN frame > > + * (rounded up, including intermission) > > + */ > > +#define can_frame_bytes(is_fd, is_eff, bitstuffing, data_len) \ > > + DIV_ROUND_UP(can_frame_bits(is_fd, is_eff, bitstuffing, \ > > + true, data_len), \ > > + BITS_PER_BYTE) > > > > /* > > * Maximum size of a Classical CAN frame > > - * (rounded up and ignoring bitstuffing) > > + * (rounded up, ignoring bitstuffing but including intermission) > > */ > > -#define CAN_FRAME_LEN_MAX (CAN_FRAME_OVERHEAD_EFF + > > CAN_MAX_DLEN) > > +#define CAN_FRAME_LEN_MAX \ > > + can_frame_bytes(false, true, false, CAN_MAX_DLEN) > > > > /* > > * Maximum size of a CAN-FD frame > > * (rounded up and ignoring bitstuffing) > Ignoring dynamic bitstuffing > > */ > > -#define CANFD_FRAME_LEN_MAX (CANFD_FRAME_OVERHEAD_EFF + > > CANFD_MAX_DLEN) > > +#define CANFD_FRAME_LEN_MAX \ > > + can_frame_bytes(true, true, false, CANFD_MAX_DLEN) > > > > /* > > * can_cc_dlc2len(value) - convert a given data length code (dlc) of a > > -- > > 2.39.3 > > I think your attribution of suggested-by for myself is mixed up for the patches 2/3 and 3/3 ???? ACK. I will remove it from 2/3 and add it to 3/3. > For the entire series you can add my reviewed-by. I will do so. Thanks for picking my typos!