mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-05 00:04:34 -04:00
can: dev: can_dev_dropped_skb: drop CC/FD frames in CANXL-only mode
The error-signalling (ES) is a mandatory functionality for CAN CC and CAN FD to report CAN frame format violations by sending an error-frame signal on the bus. A so-called 'mixed-mode' is intended to have (XL-tolerant) CAN FD nodes and CAN XL nodes on one CAN segment, where the FD-controllers can talk CC/FD and the XL-controllers can talk CC/FD/XL. This mixed-mode utilizes the error-signalling for sending CC/FD/XL frames. The CANXL-only mode disables the error-signalling in the CAN XL controller. This mode does not allow CC/FD frames to be sent but additionally offers a CAN XL transceiver mode switching (TMS). Configured with CAN_CTRLMODE_FD and CAN_CTRLMODE_XL this leads to: FD=0 XL=0 CC-only mode (ES=1) FD=1 XL=0 FD/CC mixed-mode (ES=1) FD=1 XL=1 XL/FD/CC mixed-mode (ES=1) FD=0 XL=1 XL-only mode (ES=0, TMS optional) The helper function can_dev_in_xl_only_mode() determines the required value to disable error signalling in the CAN XL controller. Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net> Link: https://patch.msgid.link/20251126-canxl-v8-7-e7e3eb74f889@pengutronix.de Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
committed by
Marc Kleine-Budde
parent
233134af20
commit
6df01533e5
@@ -135,6 +135,19 @@ void can_bus_off(struct net_device *dev);
|
||||
const char *can_get_state_str(const enum can_state state);
|
||||
const char *can_get_ctrlmode_str(u32 ctrlmode);
|
||||
|
||||
static inline bool can_dev_in_xl_only_mode(struct can_priv *priv)
|
||||
{
|
||||
const u32 mixed_mode = CAN_CTRLMODE_FD | CAN_CTRLMODE_XL;
|
||||
|
||||
/* When CAN XL is enabled but FD is disabled we are running in
|
||||
* the so-called 'CANXL-only mode' where the error signalling is
|
||||
* disabled. This helper function determines the required value
|
||||
* to disable error signalling in the CAN XL controller.
|
||||
* The so-called CC/FD/XL 'mixed mode' requires error signalling.
|
||||
*/
|
||||
return ((priv->ctrlmode & mixed_mode) == CAN_CTRLMODE_XL);
|
||||
}
|
||||
|
||||
/* drop skb if it does not contain a valid CAN frame for sending */
|
||||
static inline bool can_dev_dropped_skb(struct net_device *dev, struct sk_buff *skb)
|
||||
{
|
||||
@@ -153,6 +166,12 @@ static inline bool can_dev_dropped_skb(struct net_device *dev, struct sk_buff *s
|
||||
goto invalid_skb;
|
||||
}
|
||||
|
||||
if (can_dev_in_xl_only_mode(priv) && !can_is_canxl_skb(skb)) {
|
||||
netdev_info_once(dev,
|
||||
"Error signaling is disabled, dropping skb\n");
|
||||
goto invalid_skb;
|
||||
}
|
||||
|
||||
return can_dropped_invalid_skb(dev, skb);
|
||||
|
||||
invalid_skb:
|
||||
|
||||
Reference in New Issue
Block a user