mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
can: fix handling of unmodifiable configuration options
As described in 'can: m_can: tag current CAN FD controllers as non-ISO'
(6cfda7fbeb
) it is possible to define fixed configuration options by
setting the according bit in 'ctrlmode' and clear it in 'ctrlmode_supported'.
This leads to the incovenience that the fixed configuration bits can not be
passed by netlink even when they have the correct values (e.g. non-ISO, FD).
This patch fixes that issue and not only allows fixed set bit values to be set
again but now requires(!) to provide these fixed values at configuration time.
A valid CAN FD configuration consists of a nominal/arbitration bittiming, a
data bittiming and a control mode with CAN_CTRLMODE_FD set - which is now
enforced by a new can_validate() function. This fix additionally removed the
inconsistency that was prohibiting the support of 'CANFD-only' controller
drivers, like the RCar CAN FD.
For this reason a new helper can_set_static_ctrlmode() has been introduced to
provide a proper interface to handle static enabled CAN controller options.
Reported-by: Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Reviewed-by: Ramesh Shanmugasundaram <ramesh.shanmugasundaram@bp.renesas.com>
Cc: <stable@vger.kernel.org> # >= 3.18
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
parent
b6fd3aba60
commit
bb208f144c
3 changed files with 73 additions and 7 deletions
|
@ -40,8 +40,11 @@ struct can_priv {
|
|||
struct can_clock clock;
|
||||
|
||||
enum can_state state;
|
||||
u32 ctrlmode;
|
||||
u32 ctrlmode_supported;
|
||||
|
||||
/* CAN controller features - see include/uapi/linux/can/netlink.h */
|
||||
u32 ctrlmode; /* current options setting */
|
||||
u32 ctrlmode_supported; /* options that can be modified by netlink */
|
||||
u32 ctrlmode_static; /* static enabled options for driver/hardware */
|
||||
|
||||
int restart_ms;
|
||||
struct timer_list restart_timer;
|
||||
|
@ -108,6 +111,21 @@ static inline bool can_is_canfd_skb(const struct sk_buff *skb)
|
|||
return skb->len == CANFD_MTU;
|
||||
}
|
||||
|
||||
/* 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);
|
||||
|
||||
/* alloc_candev() succeeded => netdev_priv() is valid at this point */
|
||||
priv->ctrlmode = static_mode;
|
||||
priv->ctrlmode_static = static_mode;
|
||||
|
||||
/* override MTU which was set by default in can_setup()? */
|
||||
if (static_mode & CAN_CTRLMODE_FD)
|
||||
dev->mtu = CANFD_MTU;
|
||||
}
|
||||
|
||||
/* get data length from can_dlc with sanitized can_dlc */
|
||||
u8 can_dlc2len(u8 can_dlc);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue