All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oliver Hartkopp <socketcan@hartkopp.net>
To: Marc Kleine-Budde <mkl@pengutronix.de>, linux-can@vger.kernel.org
Cc: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Subject: Re: [net-next 04/13] can: dev: move length related code into seperate file
Date: Mon, 11 Jan 2021 09:49:13 +0100	[thread overview]
Message-ID: <5ce2f307-3352-c3ea-50b7-97e07401a7b9@hartkopp.net> (raw)
In-Reply-To: <20210109174013.534145-5-mkl@pengutronix.de>

Hi Marc,

nice cleanup!

On 09.01.21 18:40, Marc Kleine-Budde wrote:
> This patch moves all CAN frame length related code of the CAN device
> infrastructure into a separate file.
> 


> diff --git a/drivers/net/can/dev/length.c b/drivers/net/can/dev/length.c
> new file mode 100644
> index 000000000000..540d40dc0bc2
> --- /dev/null
> +++ b/drivers/net/can/dev/length.c
> @@ -0,0 +1,40 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/* Copyright (C) 2005 Marc Kleine-Budde, Pengutronix
> + * Copyright (C) 2006 Andrey Volkov, Varma Electronics
> + * Copyright (C) 2008-2009 Wolfgang Grandegger <wg@grandegger.com>
> + */

See comment below ...

> +
> +#include <linux/can/dev.h>
> +
> +/* CAN DLC to real data length conversion helpers */
> +
> +static const u8 dlc2len[] = {0, 1, 2, 3, 4, 5, 6, 7,
> +			     8, 12, 16, 20, 24, 32, 48, 64};
> +
> +/* get data length from raw data length code (DLC) */
> +u8 can_fd_dlc2len(u8 dlc)
> +{
> +	return dlc2len[dlc & 0x0F];
> +}
> +EXPORT_SYMBOL_GPL(can_fd_dlc2len);
> +
> +static const u8 len2dlc[] = {0, 1, 2, 3, 4, 5, 6, 7, 8,		/* 0 - 8 */
> +			     9, 9, 9, 9,			/* 9 - 12 */
> +			     10, 10, 10, 10,			/* 13 - 16 */
> +			     11, 11, 11, 11,			/* 17 - 20 */
> +			     12, 12, 12, 12,			/* 21 - 24 */
> +			     13, 13, 13, 13, 13, 13, 13, 13,	/* 25 - 32 */
> +			     14, 14, 14, 14, 14, 14, 14, 14,	/* 33 - 40 */
> +			     14, 14, 14, 14, 14, 14, 14, 14,	/* 41 - 48 */
> +			     15, 15, 15, 15, 15, 15, 15, 15,	/* 49 - 56 */
> +			     15, 15, 15, 15, 15, 15, 15, 15};	/* 57 - 64 */
> +
> +/* map the sanitized data length to an appropriate data length code */
> +u8 can_fd_len2dlc(u8 len)
> +{
> +	if (unlikely(len > 64))
> +		return 0xF;
> +
> +	return len2dlc[len];
> +}
> +EXPORT_SYMBOL_GPL(can_fd_len2dlc);
> diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h
> index 054c3bed190b..d75fba1d030a 100644
> --- a/include/linux/can/dev.h
> +++ b/include/linux/can/dev.h
> @@ -18,6 +18,7 @@
>   #include <linux/can/bittiming.h>
>   #include <linux/can/error.h>
>   #include <linux/can/led.h>
> +#include <linux/can/length.h>
>   #include <linux/can/netlink.h>
>   #include <linux/can/skb.h>
>   #include <linux/netdevice.h>
> @@ -83,15 +84,6 @@ struct can_priv {


(..)

> diff --git a/include/linux/can/length.h b/include/linux/can/length.h
> new file mode 100644
> index 000000000000..fabd93bcde3e
> --- /dev/null
> +++ b/include/linux/can/length.h
> @@ -0,0 +1,51 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright (C) 2006 Andrey Volkov <avolkov@varma-el.com>
> + *               Varma Electronics Oy
> + * Copyright (C) 2008 Wolfgang Grandegger <wg@grandegger.com>

The CAN FD and len8_dlc length stuff was completely contributed by myself.

So if this code is now moved to a separate file the former Copyrights 
should be replaced with

Copyright (C) 2020 Oliver Hartkopp <socketcan@hartkopp.net>

;-)

Best,
Oliver


> + */
> +
> +#ifndef _CAN_LENGTH_H
> +#define _CAN_LENGTH_H
> +
> +/*
> + * can_cc_dlc2len(value) - convert a given data length code (dlc) of a
> + * Classical CAN frame into a valid data length of max. 8 bytes.
> + *
> + * To be used in the CAN netdriver receive path to ensure conformance with
> + * ISO 11898-1 Chapter 8.4.2.3 (DLC field)
> + */
> +#define can_cc_dlc2len(dlc)	(min_t(u8, (dlc), CAN_MAX_DLEN))
> +
> +/* helper to get the data length code (DLC) for Classical CAN raw DLC access */
> +static inline u8 can_get_cc_dlc(const struct can_frame *cf, const u32 ctrlmode)
> +{
> +	/* return len8_dlc as dlc value only if all conditions apply */
> +	if ((ctrlmode & CAN_CTRLMODE_CC_LEN8_DLC) &&
> +	    (cf->len == CAN_MAX_DLEN) &&
> +	    (cf->len8_dlc > CAN_MAX_DLEN && cf->len8_dlc <= CAN_MAX_RAW_DLC))
> +		return cf->len8_dlc;
> +
> +	/* return the payload length as dlc value */
> +	return cf->len;
> +}
> +
> +/* helper to set len and len8_dlc value for Classical CAN raw DLC access */
> +static inline void can_frame_set_cc_len(struct can_frame *cf, const u8 dlc,
> +					const u32 ctrlmode)
> +{
> +	/* the caller already ensured that dlc is a value from 0 .. 15 */
> +	if (ctrlmode & CAN_CTRLMODE_CC_LEN8_DLC && dlc > CAN_MAX_DLEN)
> +		cf->len8_dlc = dlc;
> +
> +	/* limit the payload length 'len' to CAN_MAX_DLEN */
> +	cf->len = can_cc_dlc2len(dlc);
> +}
> +
> +/* get data length from raw data length code (DLC) */
> +u8 can_fd_dlc2len(u8 dlc);
> +
> +/* map the sanitized data length to an appropriate data length code */
> +u8 can_fd_len2dlc(u8 len);
> +
> +#endif /* !_CAN_LENGTH_H */
> 

  reply	other threads:[~2021-01-11  8:53 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-09 17:40 [net-next 00/13] can: dev: cleanup and add CAN frame length handling support Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 01/13] MAINTAINERS: CAN network layer: add missing header file can-ml.h Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 02/13] can: dev: move driver related infrastructure into separate subdir Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 03/13] can: dev: move bittiming related code into seperate file Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 04/13] can: dev: move length " Marc Kleine-Budde
2021-01-11  8:49   ` Oliver Hartkopp [this message]
2021-01-11  9:58     ` Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 05/13] can: dev: move skb related " Marc Kleine-Budde
2021-01-10  4:26   ` Vincent MAILHOL
2021-01-11  8:14     ` Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 06/13] can: dev: move netlink related code " Marc Kleine-Budde
2021-01-10  4:27   ` Vincent MAILHOL
2021-01-11  8:17     ` Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 07/13] can: length: convert to kernel coding style Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 08/13] can: length: can_fd_len2dlc(): simplify length calculcation Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 09/13] can: length: canfd_sanitize_len(): add function to sanitize CAN-FD data length Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 10/13] can: length: can_skb_get_frame_len(): introduce function to get data length of frame in data link layer Marc Kleine-Budde
2021-01-10  3:32   ` Vincent MAILHOL
2021-01-11  8:12     ` Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 11/13] can: dev: extend struct can_skb_priv to hold CAN frame length Marc Kleine-Budde
2021-01-10  6:52   ` Vincent MAILHOL
2021-01-10  8:38     ` Vincent MAILHOL
2021-01-11  6:13       ` [PATCH] can: dev: extend can_put_echo_skb() to handle frame_len Vincent Mailhol
2021-01-11  9:38         ` Marc Kleine-Budde
2021-01-11 10:35           ` Vincent MAILHOL
2021-01-11 10:36             ` Marc Kleine-Budde
2021-01-11 10:41             ` [PATCH v2] can: dev: can_put_echo_skb(): extend to store can frame length Vincent Mailhol
2021-01-11 10:54               ` Marc Kleine-Budde
2021-01-11 12:43                 ` Vincent MAILHOL
2021-01-11 10:26         ` [PATCH] can: dev: extend can_put_echo_skb() to handle frame_len Marc Kleine-Budde
2021-01-11  8:22     ` [net-next 11/13] can: dev: extend struct can_skb_priv to hold CAN frame length Marc Kleine-Budde
2021-01-11  8:29       ` Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 12/13] can: dev: can_get_echo_skb(): extend to return can " Marc Kleine-Budde
2021-01-09 17:40 ` [net-next 13/13] can: dev: can_rx_offload_get_echo_skb(): " Marc Kleine-Budde
2021-01-10  8:55 ` [net-next 00/13] can: dev: cleanup and add CAN frame length handling support Vincent MAILHOL
2021-01-11  8:26   ` Marc Kleine-Budde
2021-01-11  9:42     ` Vincent MAILHOL
2021-01-11 10:00       ` Marc Kleine-Budde
2021-01-11 10:25         ` Vincent MAILHOL
2021-01-11 10:34           ` Marc Kleine-Budde

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5ce2f307-3352-c3ea-50b7-97e07401a7b9@hartkopp.net \
    --to=socketcan@hartkopp.net \
    --cc=linux-can@vger.kernel.org \
    --cc=mailhol.vincent@wanadoo.fr \
    --cc=mkl@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.