Message ID | 20201110101852.1973-8-socketcan@hartkopp.net |
---|---|
State | New |
Headers | show |
Series | [v6,1/8] can: add optional DLC element to Classical CAN frame structure | expand |
On 11/10/20 11:18 AM, Oliver Hartkopp wrote: > can_get_cc_dlc: get the data length code for Classical CAN raw DLC access > can_get_cc_len: get len and len8_dlc value for Classical CAN raw DLC access The final patch needs a bit more prose, like: This patch adds the following helper to functions to access Classical CAN DLC values. > Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> > --- > include/linux/can/dev.h | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > > diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h > index e767a96ae075..9a787f73399e 100644 > --- a/include/linux/can/dev.h > +++ b/include/linux/can/dev.h > @@ -168,10 +168,38 @@ static inline bool can_is_canfd_skb(const struct sk_buff *skb) > { > /* the CAN specific type of skb is identified by its data length */ > return skb->len == CANFD_MTU; > } > > +/* helper to get the data length code (DLC) for Classical CAN raw DLC access */ > +static inline u8 can_get_cc_dlc(const u32 ctrlmode, const struct can_frame *cf) Please make the cf the first argument. > +{ > + /* 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 get len and len8_dlc value for Classical CAN raw DLC access */ > +static inline u8 can_get_cc_len(const u32 ctrlmode, struct can_frame *cf, > + u8 dlc) Please make the cf the first argument. > +{ > + /* 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 */ > + if (dlc > CAN_MAX_DLEN) > + return CAN_MAX_DLEN; can_cc_dlc2len() I still think, that can_frame_set_cc_len() makes more sense. See my just posted patches for illustration. > + > + return dlc; > +} > + > /* helper to define static CAN controller features at device creation time */ > static inline void can_set_static_ctrlmode(struct net_device *dev, > u32 static_mode) > { > struct can_priv *priv = netdev_priv(dev); > Marc -- Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung West/Dortmund | Phone: +49-231-2826-924 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
On 10.11.20 16:50, Marc Kleine-Budde wrote: > On 11/10/20 11:18 AM, Oliver Hartkopp wrote: > I still think, that can_frame_set_cc_len() makes more sense. See my just posted > patches for illustration. > Yep. Your patches look fine! Just remove my patches 7 & 8 and apply your suggestions instead. Many thanks, Oliver
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index e767a96ae075..9a787f73399e 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h @@ -168,10 +168,38 @@ static inline bool can_is_canfd_skb(const struct sk_buff *skb) { /* the CAN specific type of skb is identified by its data length */ return skb->len == CANFD_MTU; } +/* helper to get the data length code (DLC) for Classical CAN raw DLC access */ +static inline u8 can_get_cc_dlc(const u32 ctrlmode, const struct can_frame *cf) +{ + /* 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 get len and len8_dlc value for Classical CAN raw DLC access */ +static inline u8 can_get_cc_len(const u32 ctrlmode, struct can_frame *cf, + u8 dlc) +{ + /* 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 */ + if (dlc > CAN_MAX_DLEN) + return CAN_MAX_DLEN; + + return dlc; +} + /* helper to define static CAN controller features at device creation time */ static inline void can_set_static_ctrlmode(struct net_device *dev, u32 static_mode) { struct can_priv *priv = netdev_priv(dev);
can_get_cc_dlc: get the data length code for Classical CAN raw DLC access can_get_cc_len: get len and len8_dlc value for Classical CAN raw DLC access Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> --- include/linux/can/dev.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+)