diff options
Diffstat (limited to 'drivers/net/can')
| -rw-r--r-- | drivers/net/can/at91_can.c | 4 | ||||
| -rw-r--r-- | drivers/net/can/dev/bittiming.c | 30 | ||||
| -rw-r--r-- | drivers/net/can/dev/netlink.c | 221 | ||||
| -rw-r--r-- | drivers/net/can/flexcan.c | 68 | ||||
| -rw-r--r-- | drivers/net/can/janz-ican3.c | 2 | ||||
| -rw-r--r-- | drivers/net/can/mscan/mpc5xxx_can.c | 6 | ||||
| -rw-r--r-- | drivers/net/can/rcar/Kconfig | 4 | ||||
| -rw-r--r-- | drivers/net/can/slcan.c | 5 | ||||
| -rw-r--r-- | drivers/net/can/usb/etas_es58x/es581_4.h | 2 | ||||
| -rw-r--r-- | drivers/net/can/usb/etas_es58x/es58x_fd.c | 7 | ||||
| -rw-r--r-- | drivers/net/can/usb/etas_es58x/es58x_fd.h | 2 | ||||
| -rw-r--r-- | drivers/net/can/usb/gs_usb.c | 12 | ||||
| -rw-r--r-- | drivers/net/can/usb/peak_usb/pcan_usb_core.c | 13 | ||||
| -rw-r--r-- | drivers/net/can/usb/peak_usb/pcan_usb_core.h | 1 | ||||
| -rw-r--r-- | drivers/net/can/usb/peak_usb/pcan_usb_fd.c | 9 | ||||
| -rw-r--r-- | drivers/net/can/xilinx_can.c | 7 | 
16 files changed, 311 insertions, 82 deletions
| diff --git a/drivers/net/can/at91_can.c b/drivers/net/can/at91_can.c index b06af90a9964..3aea32c9b108 100644 --- a/drivers/net/can/at91_can.c +++ b/drivers/net/can/at91_can.c @@ -1170,9 +1170,9 @@ static ssize_t mb0_id_show(struct device *dev,  	struct at91_priv *priv = netdev_priv(to_net_dev(dev));  	if (priv->mb0_id & CAN_EFF_FLAG) -		return snprintf(buf, PAGE_SIZE, "0x%08x\n", priv->mb0_id); +		return sysfs_emit(buf, "0x%08x\n", priv->mb0_id);  	else -		return snprintf(buf, PAGE_SIZE, "0x%03x\n", priv->mb0_id); +		return sysfs_emit(buf, "0x%03x\n", priv->mb0_id);  }  static ssize_t mb0_id_store(struct device *dev, diff --git a/drivers/net/can/dev/bittiming.c b/drivers/net/can/dev/bittiming.c index f49170eadd54..0509625c3082 100644 --- a/drivers/net/can/dev/bittiming.c +++ b/drivers/net/can/dev/bittiming.c @@ -175,27 +175,29 @@ int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt,  	return 0;  } -void can_calc_tdco(struct net_device *dev) -{ -	struct can_priv *priv = netdev_priv(dev); -	const struct can_bittiming *dbt = &priv->data_bittiming; -	struct can_tdc *tdc = &priv->tdc; -	const struct can_tdc_const *tdc_const = priv->tdc_const; +void can_calc_tdco(struct can_tdc *tdc, const struct can_tdc_const *tdc_const, +		   const struct can_bittiming *dbt, +		   u32 *ctrlmode, u32 ctrlmode_supported) -	if (!tdc_const) +{ +	if (!tdc_const || !(ctrlmode_supported & CAN_CTRLMODE_TDC_AUTO))  		return; +	*ctrlmode &= ~CAN_CTRLMODE_TDC_MASK; +  	/* As specified in ISO 11898-1 section 11.3.3 "Transmitter  	 * delay compensation" (TDC) is only applicable if data BRP is  	 * one or two.  	 */  	if (dbt->brp == 1 || dbt->brp == 2) { -		/* Reuse "normal" sample point and convert it to time quanta */ -		u32 sample_point_in_tq = can_bit_time(dbt) * dbt->sample_point / 1000; - -		tdc->tdco = min(sample_point_in_tq, tdc_const->tdco_max); -	} else { -		tdc->tdco = 0; +		/* Sample point in clock periods */ +		u32 sample_point_in_tc = (CAN_SYNC_SEG + dbt->prop_seg + +					  dbt->phase_seg1) * dbt->brp; + +		if (sample_point_in_tc < tdc_const->tdco_min) +			return; +		tdc->tdco = min(sample_point_in_tc, tdc_const->tdco_max); +		*ctrlmode |= CAN_CTRLMODE_TDC_AUTO;  	}  }  #endif /* CONFIG_CAN_CALC_BITTIMING */ @@ -209,7 +211,7 @@ static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt,  			       const struct can_bittiming_const *btc)  {  	struct can_priv *priv = netdev_priv(dev); -	int tseg1, alltseg; +	unsigned int tseg1, alltseg;  	u64 brp64;  	tseg1 = bt->prop_seg + bt->phase_seg1; diff --git a/drivers/net/can/dev/netlink.c b/drivers/net/can/dev/netlink.c index 80425636049d..95cca4e5251f 100644 --- a/drivers/net/can/dev/netlink.c +++ b/drivers/net/can/dev/netlink.c @@ -2,6 +2,7 @@  /* Copyright (C) 2005 Marc Kleine-Budde, Pengutronix   * Copyright (C) 2006 Andrey Volkov, Varma Electronics   * Copyright (C) 2008-2009 Wolfgang Grandegger <wg@grandegger.com> + * Copyright (C) 2021 Vincent Mailhol <mailhol.vincent@wanadoo.fr>   */  #include <linux/can/dev.h> @@ -19,6 +20,19 @@ static const struct nla_policy can_policy[IFLA_CAN_MAX + 1] = {  	[IFLA_CAN_DATA_BITTIMING] = { .len = sizeof(struct can_bittiming) },  	[IFLA_CAN_DATA_BITTIMING_CONST]	= { .len = sizeof(struct can_bittiming_const) },  	[IFLA_CAN_TERMINATION] = { .type = NLA_U16 }, +	[IFLA_CAN_TDC] = { .type = NLA_NESTED }, +}; + +static const struct nla_policy can_tdc_policy[IFLA_CAN_TDC_MAX + 1] = { +	[IFLA_CAN_TDC_TDCV_MIN] = { .type = NLA_U32 }, +	[IFLA_CAN_TDC_TDCV_MAX] = { .type = NLA_U32 }, +	[IFLA_CAN_TDC_TDCO_MIN] = { .type = NLA_U32 }, +	[IFLA_CAN_TDC_TDCO_MAX] = { .type = NLA_U32 }, +	[IFLA_CAN_TDC_TDCF_MIN] = { .type = NLA_U32 }, +	[IFLA_CAN_TDC_TDCF_MAX] = { .type = NLA_U32 }, +	[IFLA_CAN_TDC_TDCV] = { .type = NLA_U32 }, +	[IFLA_CAN_TDC_TDCO] = { .type = NLA_U32 }, +	[IFLA_CAN_TDC_TDCF] = { .type = NLA_U32 },  };  static int can_validate(struct nlattr *tb[], struct nlattr *data[], @@ -30,6 +44,7 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],  	 * - nominal/arbitration bittiming  	 * - data bittiming  	 * - control mode with CAN_CTRLMODE_FD set +	 * - TDC parameters are coherent (details below)  	 */  	if (!data) @@ -37,8 +52,43 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],  	if (data[IFLA_CAN_CTRLMODE]) {  		struct can_ctrlmode *cm = nla_data(data[IFLA_CAN_CTRLMODE]); +		u32 tdc_flags = cm->flags & CAN_CTRLMODE_TDC_MASK;  		is_can_fd = cm->flags & cm->mask & CAN_CTRLMODE_FD; + +		/* CAN_CTRLMODE_TDC_{AUTO,MANUAL} are mutually exclusive */ +		if (tdc_flags == CAN_CTRLMODE_TDC_MASK) +			return -EOPNOTSUPP; +		/* If one of the CAN_CTRLMODE_TDC_* flag is set then +		 * TDC must be set and vice-versa +		 */ +		if (!!tdc_flags != !!data[IFLA_CAN_TDC]) +			return -EOPNOTSUPP; +		/* If providing TDC parameters, at least TDCO is +		 * needed. TDCV is needed if and only if +		 * CAN_CTRLMODE_TDC_MANUAL is set +		 */ +		if (data[IFLA_CAN_TDC]) { +			struct nlattr *tb_tdc[IFLA_CAN_TDC_MAX + 1]; +			int err; + +			err = nla_parse_nested(tb_tdc, IFLA_CAN_TDC_MAX, +					       data[IFLA_CAN_TDC], +					       can_tdc_policy, extack); +			if (err) +				return err; + +			if (tb_tdc[IFLA_CAN_TDC_TDCV]) { +				if (tdc_flags & CAN_CTRLMODE_TDC_AUTO) +					return -EOPNOTSUPP; +			} else { +				if (tdc_flags & CAN_CTRLMODE_TDC_MANUAL) +					return -EOPNOTSUPP; +			} + +			if (!tb_tdc[IFLA_CAN_TDC_TDCO]) +				return -EOPNOTSUPP; +		}  	}  	if (is_can_fd) { @@ -46,7 +96,7 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],  			return -EOPNOTSUPP;  	} -	if (data[IFLA_CAN_DATA_BITTIMING]) { +	if (data[IFLA_CAN_DATA_BITTIMING] || data[IFLA_CAN_TDC]) {  		if (!is_can_fd)  			return -EOPNOTSUPP;  	} @@ -54,11 +104,60 @@ static int can_validate(struct nlattr *tb[], struct nlattr *data[],  	return 0;  } +static int can_tdc_changelink(struct can_priv *priv, const struct nlattr *nla, +			      struct netlink_ext_ack *extack) +{ +	struct nlattr *tb_tdc[IFLA_CAN_TDC_MAX + 1]; +	struct can_tdc tdc = { 0 }; +	const struct can_tdc_const *tdc_const = priv->tdc_const; +	int err; + +	if (!tdc_const || !can_tdc_is_enabled(priv)) +		return -EOPNOTSUPP; + +	err = nla_parse_nested(tb_tdc, IFLA_CAN_TDC_MAX, nla, +			       can_tdc_policy, extack); +	if (err) +		return err; + +	if (tb_tdc[IFLA_CAN_TDC_TDCV]) { +		u32 tdcv = nla_get_u32(tb_tdc[IFLA_CAN_TDC_TDCV]); + +		if (tdcv < tdc_const->tdcv_min || tdcv > tdc_const->tdcv_max) +			return -EINVAL; + +		tdc.tdcv = tdcv; +	} + +	if (tb_tdc[IFLA_CAN_TDC_TDCO]) { +		u32 tdco = nla_get_u32(tb_tdc[IFLA_CAN_TDC_TDCO]); + +		if (tdco < tdc_const->tdco_min || tdco > tdc_const->tdco_max) +			return -EINVAL; + +		tdc.tdco = tdco; +	} + +	if (tb_tdc[IFLA_CAN_TDC_TDCF]) { +		u32 tdcf = nla_get_u32(tb_tdc[IFLA_CAN_TDC_TDCF]); + +		if (tdcf < tdc_const->tdcf_min || tdcf > tdc_const->tdcf_max) +			return -EINVAL; + +		tdc.tdcf = tdcf; +	} + +	priv->tdc = tdc; + +	return 0; +} +  static int can_changelink(struct net_device *dev, struct nlattr *tb[],  			  struct nlattr *data[],  			  struct netlink_ext_ack *extack)  {  	struct can_priv *priv = netdev_priv(dev); +	u32 tdc_mask = 0;  	int err;  	/* We need synchronization with dev->stop() */ @@ -138,7 +237,16 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],  			dev->mtu = CAN_MTU;  			memset(&priv->data_bittiming, 0,  			       sizeof(priv->data_bittiming)); +			priv->ctrlmode &= ~CAN_CTRLMODE_TDC_MASK; +			memset(&priv->tdc, 0, sizeof(priv->tdc));  		} + +		tdc_mask = cm->mask & CAN_CTRLMODE_TDC_MASK; +		/* CAN_CTRLMODE_TDC_{AUTO,MANUAL} are mutually +		 * exclusive: make sure to turn the other one off +		 */ +		if (tdc_mask) +			priv->ctrlmode &= cm->flags | ~CAN_CTRLMODE_TDC_MASK;  	}  	if (data[IFLA_CAN_RESTART_MS]) { @@ -187,9 +295,26 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],  			return -EINVAL;  		} -		memcpy(&priv->data_bittiming, &dbt, sizeof(dbt)); +		memset(&priv->tdc, 0, sizeof(priv->tdc)); +		if (data[IFLA_CAN_TDC]) { +			/* TDC parameters are provided: use them */ +			err = can_tdc_changelink(priv, data[IFLA_CAN_TDC], +						 extack); +			if (err) { +				priv->ctrlmode &= ~CAN_CTRLMODE_TDC_MASK; +				return err; +			} +		} else if (!tdc_mask) { +			/* Neither of TDC parameters nor TDC flags are +			 * provided: do calculation +			 */ +			can_calc_tdco(&priv->tdc, priv->tdc_const, &priv->data_bittiming, +				      &priv->ctrlmode, priv->ctrlmode_supported); +		} /* else: both CAN_CTRLMODE_TDC_{AUTO,MANUAL} are explicitly +		   * turned off. TDC is disabled: do nothing +		   */ -		can_calc_tdco(dev); +		memcpy(&priv->data_bittiming, &dbt, sizeof(dbt));  		if (priv->do_set_data_bittiming) {  			/* Finally, set the bit-timing registers */ @@ -226,6 +351,38 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],  	return 0;  } +static size_t can_tdc_get_size(const struct net_device *dev) +{ +	struct can_priv *priv = netdev_priv(dev); +	size_t size; + +	if (!priv->tdc_const) +		return 0; + +	size = nla_total_size(0);			/* nest IFLA_CAN_TDC */ +	if (priv->ctrlmode_supported & CAN_CTRLMODE_TDC_MANUAL) { +		size += nla_total_size(sizeof(u32));	/* IFLA_CAN_TDCV_MIN */ +		size += nla_total_size(sizeof(u32));	/* IFLA_CAN_TDCV_MAX */ +	} +	size += nla_total_size(sizeof(u32));		/* IFLA_CAN_TDCO_MIN */ +	size += nla_total_size(sizeof(u32));		/* IFLA_CAN_TDCO_MAX */ +	if (priv->tdc_const->tdcf_max) { +		size += nla_total_size(sizeof(u32));	/* IFLA_CAN_TDCF_MIN */ +		size += nla_total_size(sizeof(u32));	/* IFLA_CAN_TDCF_MAX */ +	} + +	if (can_tdc_is_enabled(priv)) { +		if (priv->ctrlmode & CAN_CTRLMODE_TDC_MANUAL || +		    priv->do_get_auto_tdcv) +			size += nla_total_size(sizeof(u32));	/* IFLA_CAN_TDCV */ +		size += nla_total_size(sizeof(u32));		/* IFLA_CAN_TDCO */ +		if (priv->tdc_const->tdcf_max) +			size += nla_total_size(sizeof(u32));	/* IFLA_CAN_TDCF */ +	} + +	return size; +} +  static size_t can_get_size(const struct net_device *dev)  {  	struct can_priv *priv = netdev_priv(dev); @@ -257,10 +414,64 @@ static size_t can_get_size(const struct net_device *dev)  		size += nla_total_size(sizeof(*priv->data_bitrate_const) *  				       priv->data_bitrate_const_cnt);  	size += sizeof(priv->bitrate_max);			/* IFLA_CAN_BITRATE_MAX */ +	size += can_tdc_get_size(dev);				/* IFLA_CAN_TDC */  	return size;  } +static int can_tdc_fill_info(struct sk_buff *skb, const struct net_device *dev) +{ +	struct nlattr *nest; +	struct can_priv *priv = netdev_priv(dev); +	struct can_tdc *tdc = &priv->tdc; +	const struct can_tdc_const *tdc_const = priv->tdc_const; + +	if (!tdc_const) +		return 0; + +	nest = nla_nest_start(skb, IFLA_CAN_TDC); +	if (!nest) +		return -EMSGSIZE; + +	if (priv->ctrlmode_supported & CAN_CTRLMODE_TDC_MANUAL && +	    (nla_put_u32(skb, IFLA_CAN_TDC_TDCV_MIN, tdc_const->tdcv_min) || +	     nla_put_u32(skb, IFLA_CAN_TDC_TDCV_MAX, tdc_const->tdcv_max))) +		goto err_cancel; +	if (nla_put_u32(skb, IFLA_CAN_TDC_TDCO_MIN, tdc_const->tdco_min) || +	    nla_put_u32(skb, IFLA_CAN_TDC_TDCO_MAX, tdc_const->tdco_max)) +		goto err_cancel; +	if (tdc_const->tdcf_max && +	    (nla_put_u32(skb, IFLA_CAN_TDC_TDCF_MIN, tdc_const->tdcf_min) || +	     nla_put_u32(skb, IFLA_CAN_TDC_TDCF_MAX, tdc_const->tdcf_max))) +		goto err_cancel; + +	if (can_tdc_is_enabled(priv)) { +		u32 tdcv; +		int err = -EINVAL; + +		if (priv->ctrlmode & CAN_CTRLMODE_TDC_MANUAL) { +			tdcv = tdc->tdcv; +			err = 0; +		} else if (priv->do_get_auto_tdcv) { +			err = priv->do_get_auto_tdcv(dev, &tdcv); +		} +		if (!err && nla_put_u32(skb, IFLA_CAN_TDC_TDCV, tdcv)) +			goto err_cancel; +		if (nla_put_u32(skb, IFLA_CAN_TDC_TDCO, tdc->tdco)) +			goto err_cancel; +		if (tdc_const->tdcf_max && +		    nla_put_u32(skb, IFLA_CAN_TDC_TDCF, tdc->tdcf)) +			goto err_cancel; +	} + +	nla_nest_end(skb, nest); +	return 0; + +err_cancel: +	nla_nest_cancel(skb, nest); +	return -EMSGSIZE; +} +  static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)  {  	struct can_priv *priv = netdev_priv(dev); @@ -318,7 +529,9 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)  	    (nla_put(skb, IFLA_CAN_BITRATE_MAX,  		     sizeof(priv->bitrate_max), -		     &priv->bitrate_max)) +		     &priv->bitrate_max)) || + +	    (can_tdc_fill_info(skb, dev))  	    )  		return -EMSGSIZE; diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 7734229aa078..12b60ad95b02 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -290,31 +290,33 @@ struct flexcan_regs {  	u32 dbg1;		/* 0x58 */  	u32 dbg2;		/* 0x5c */  	u32 _reserved3[8];	/* 0x60 */ -	u8 mb[2][512];		/* 0x80 - Not affected by Soft Reset */ -	/* FIFO-mode: -	 *			MB -	 * 0x080...0x08f	0	RX message buffer -	 * 0x090...0x0df	1-5	reserved -	 * 0x0e0...0x0ff	6-7	8 entry ID table -	 *				(mx25, mx28, mx35, mx53) -	 * 0x0e0...0x2df	6-7..37	8..128 entry ID table -	 *				size conf'ed via ctrl2::RFFN -	 *				(mx6, vf610) -	 */ -	u32 _reserved4[256];	/* 0x480 */ -	u32 rximr[64];		/* 0x880 - Not affected by Soft Reset */ -	u32 _reserved5[24];	/* 0x980 */ -	u32 gfwr_mx6;		/* 0x9e0 - MX6 */ -	u32 _reserved6[39];	/* 0x9e4 */ -	u32 _rxfir[6];		/* 0xa80 */ -	u32 _reserved8[2];	/* 0xa98 */ -	u32 _rxmgmask;		/* 0xaa0 */ -	u32 _rxfgmask;		/* 0xaa4 */ -	u32 _rx14mask;		/* 0xaa8 */ -	u32 _rx15mask;		/* 0xaac */ -	u32 tx_smb[4];		/* 0xab0 */ -	u32 rx_smb0[4];		/* 0xac0 */ -	u32 rx_smb1[4];		/* 0xad0 */ +	struct_group(init, +		u8 mb[2][512];		/* 0x80 - Not affected by Soft Reset */ +		/* FIFO-mode: +		 *			MB +		 * 0x080...0x08f	0	RX message buffer +		 * 0x090...0x0df	1-5	reserved +		 * 0x0e0...0x0ff	6-7	8 entry ID table +		 *				(mx25, mx28, mx35, mx53) +		 * 0x0e0...0x2df	6-7..37	8..128 entry ID table +		 *				size conf'ed via ctrl2::RFFN +		 *				(mx6, vf610) +		 */ +		u32 _reserved4[256];	/* 0x480 */ +		u32 rximr[64];		/* 0x880 - Not affected by Soft Reset */ +		u32 _reserved5[24];	/* 0x980 */ +		u32 gfwr_mx6;		/* 0x9e0 - MX6 */ +		u32 _reserved6[39];	/* 0x9e4 */ +		u32 _rxfir[6];		/* 0xa80 */ +		u32 _reserved8[2];	/* 0xa98 */ +		u32 _rxmgmask;		/* 0xaa0 */ +		u32 _rxfgmask;		/* 0xaa4 */ +		u32 _rx14mask;		/* 0xaa8 */ +		u32 _rx15mask;		/* 0xaac */ +		u32 tx_smb[4];		/* 0xab0 */ +		u32 rx_smb0[4];		/* 0xac0 */ +		u32 rx_smb1[4];		/* 0xad0 */ +	);  	u32 mecr;		/* 0xae0 */  	u32 erriar;		/* 0xae4 */  	u32 erridpr;		/* 0xae8 */ @@ -328,9 +330,11 @@ struct flexcan_regs {  	u32 fdcbt;		/* 0xc04 - Not affected by Soft Reset */  	u32 fdcrc;		/* 0xc08 */  	u32 _reserved9[199];	/* 0xc0c */ -	u32 tx_smb_fd[18];	/* 0xf28 */ -	u32 rx_smb0_fd[18];	/* 0xf70 */ -	u32 rx_smb1_fd[18];	/* 0xfb8 */ +	struct_group(init_fd, +		u32 tx_smb_fd[18];	/* 0xf28 */ +		u32 rx_smb0_fd[18];	/* 0xf70 */ +		u32 rx_smb1_fd[18];	/* 0xfb8 */ +	);  };  static_assert(sizeof(struct flexcan_regs) ==  0x4 * 18 + 0xfb8); @@ -1400,14 +1404,10 @@ static void flexcan_ram_init(struct net_device *dev)  	reg_ctrl2 |= FLEXCAN_CTRL2_WRMFRZ;  	priv->write(reg_ctrl2, ®s->ctrl2); -	memset_io(®s->mb[0][0], 0, -		  offsetof(struct flexcan_regs, rx_smb1[3]) - -		  offsetof(struct flexcan_regs, mb[0][0]) + 0x4); +	memset_io(®s->init, 0, sizeof(regs->init));  	if (priv->can.ctrlmode & CAN_CTRLMODE_FD) -		memset_io(®s->tx_smb_fd[0], 0, -			  offsetof(struct flexcan_regs, rx_smb1_fd[17]) - -			  offsetof(struct flexcan_regs, tx_smb_fd[0]) + 0x4); +		memset_io(®s->init_fd, 0, sizeof(regs->init_fd));  	reg_ctrl2 &= ~FLEXCAN_CTRL2_WRMFRZ;  	priv->write(reg_ctrl2, ®s->ctrl2); diff --git a/drivers/net/can/janz-ican3.c b/drivers/net/can/janz-ican3.c index c68ad56628bd..32006dbf5abd 100644 --- a/drivers/net/can/janz-ican3.c +++ b/drivers/net/can/janz-ican3.c @@ -1831,7 +1831,7 @@ static ssize_t termination_show(struct device *dev,  		return -ETIMEDOUT;  	} -	return snprintf(buf, PAGE_SIZE, "%u\n", mod->termination_enabled); +	return sysfs_emit(buf, "%u\n", mod->termination_enabled);  }  static ssize_t termination_store(struct device *dev, diff --git a/drivers/net/can/mscan/mpc5xxx_can.c b/drivers/net/can/mscan/mpc5xxx_can.c index 35892c1efef0..de4ddf79ba9b 100644 --- a/drivers/net/can/mscan/mpc5xxx_can.c +++ b/drivers/net/can/mscan/mpc5xxx_can.c @@ -293,10 +293,8 @@ static int mpc5xxx_can_probe(struct platform_device *ofdev)  		return -EINVAL;  	base = of_iomap(np, 0); -	if (!base) { -		dev_err(&ofdev->dev, "couldn't ioremap\n"); -		return err; -	} +	if (!base) +		return dev_err_probe(&ofdev->dev, err, "couldn't ioremap\n");  	irq = irq_of_parse_and_map(np, 0);  	if (!irq) { diff --git a/drivers/net/can/rcar/Kconfig b/drivers/net/can/rcar/Kconfig index 56320a7f828b..c66762ef631b 100644 --- a/drivers/net/can/rcar/Kconfig +++ b/drivers/net/can/rcar/Kconfig @@ -1,7 +1,7 @@  # SPDX-License-Identifier: GPL-2.0  config CAN_RCAR  	tristate "Renesas R-Car and RZ/G CAN controller" -	depends on ARCH_RENESAS || ARM || COMPILE_TEST +	depends on ARCH_RENESAS || COMPILE_TEST  	help  	  Say Y here if you want to use CAN controller found on Renesas R-Car  	  or RZ/G SoCs. @@ -11,7 +11,7 @@ config CAN_RCAR  config CAN_RCAR_CANFD  	tristate "Renesas R-Car CAN FD controller" -	depends on ARCH_RENESAS || ARM || COMPILE_TEST +	depends on ARCH_RENESAS || COMPILE_TEST  	help  	  Say Y here if you want to use CAN FD controller found on  	  Renesas R-Car SoCs. The driver puts the controller in CAN FD only diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c index d42ec7d1bc14..9a4ebda30510 100644 --- a/drivers/net/can/slcan.c +++ b/drivers/net/can/slcan.c @@ -664,10 +664,9 @@ static void slcan_close(struct tty_struct *tty)  	/* This will complete via sl_free_netdev */  } -static int slcan_hangup(struct tty_struct *tty) +static void slcan_hangup(struct tty_struct *tty)  {  	slcan_close(tty); -	return 0;  }  /* Perform I/O control on an active SLCAN channel. */ @@ -692,7 +691,7 @@ static int slcan_ioctl(struct tty_struct *tty, struct file *file,  		return -EINVAL;  	default: -		return tty_mode_ioctl(tty, file, cmd, arg); +		return tty_mode_ioctl(tty, cmd, arg);  	}  } diff --git a/drivers/net/can/usb/etas_es58x/es581_4.h b/drivers/net/can/usb/etas_es58x/es581_4.h index 4bc60a6df697..667ecb77168c 100644 --- a/drivers/net/can/usb/etas_es58x/es581_4.h +++ b/drivers/net/can/usb/etas_es58x/es581_4.h @@ -192,7 +192,7 @@ struct es581_4_urb_cmd {  		struct es581_4_rx_cmd_ret rx_cmd_ret;  		__le64 timestamp;  		u8 rx_cmd_ret_u8; -		u8 raw_msg[0]; +		DECLARE_FLEX_ARRAY(u8, raw_msg);  	} __packed;  	__le16 reserved_for_crc16_do_not_use; diff --git a/drivers/net/can/usb/etas_es58x/es58x_fd.c b/drivers/net/can/usb/etas_es58x/es58x_fd.c index af042aa55f59..4f0cae29f4d8 100644 --- a/drivers/net/can/usb/etas_es58x/es58x_fd.c +++ b/drivers/net/can/usb/etas_es58x/es58x_fd.c @@ -428,7 +428,7 @@ static int es58x_fd_enable_channel(struct es58x_priv *priv)  		es58x_fd_convert_bittiming(&tx_conf_msg.data_bittiming,  					   &priv->can.data_bittiming); -		if (priv->can.tdc.tdco) { +		if (can_tdc_is_enabled(&priv->can)) {  			tx_conf_msg.tdc_enabled = 1;  			tx_conf_msg.tdco = cpu_to_le16(priv->can.tdc.tdco);  			tx_conf_msg.tdcf = cpu_to_le16(priv->can.tdc.tdcf); @@ -505,8 +505,11 @@ static const struct can_bittiming_const es58x_fd_data_bittiming_const = {   * Register" from Microchip.   */  static const struct can_tdc_const es58x_tdc_const = { +	.tdcv_min = 0,  	.tdcv_max = 0, /* Manual mode not supported. */ +	.tdco_min = 0,  	.tdco_max = 127, +	.tdcf_min = 0,  	.tdcf_max = 127  }; @@ -523,7 +526,7 @@ const struct es58x_parameters es58x_fd_param = {  	.clock = {.freq = 80 * CAN_MHZ},  	.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | CAN_CTRLMODE_LISTENONLY |  	    CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_FD | CAN_CTRLMODE_FD_NON_ISO | -	    CAN_CTRLMODE_CC_LEN8_DLC, +	    CAN_CTRLMODE_CC_LEN8_DLC | CAN_CTRLMODE_TDC_AUTO,  	.tx_start_of_frame = 0xCEFA,	/* FACE in little endian */  	.rx_start_of_frame = 0xFECA,	/* CAFE in little endian */  	.tx_urb_cmd_max_len = ES58X_FD_TX_URB_CMD_MAX_LEN, diff --git a/drivers/net/can/usb/etas_es58x/es58x_fd.h b/drivers/net/can/usb/etas_es58x/es58x_fd.h index a191891b8777..c4b19a6a33ae 100644 --- a/drivers/net/can/usb/etas_es58x/es58x_fd.h +++ b/drivers/net/can/usb/etas_es58x/es58x_fd.h @@ -219,7 +219,7 @@ struct es58x_fd_urb_cmd {  		struct es58x_fd_tx_ack_msg tx_ack_msg;  		__le64 timestamp;  		__le32 rx_cmd_ret_le32; -		u8 raw_msg[0]; +		DECLARE_FLEX_ARRAY(u8, raw_msg);  	} __packed;  	__le16 reserved_for_crc16_do_not_use; diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c index 5e892bef46b0..1b400de00f51 100644 --- a/drivers/net/can/usb/gs_usb.c +++ b/drivers/net/can/usb/gs_usb.c @@ -352,7 +352,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)  	} else { /* echo_id == hf->echo_id */  		if (hf->echo_id >= GS_MAX_TX_URBS) {  			netdev_err(netdev, -				   "Unexpected out of range echo id %d\n", +				   "Unexpected out of range echo id %u\n",  				   hf->echo_id);  			goto resubmit_urb;  		} @@ -365,7 +365,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)  		/* bad devices send bad echo_ids. */  		if (!txc) {  			netdev_err(netdev, -				   "Unexpected unused echo id %d\n", +				   "Unexpected unused echo id %u\n",  				   hf->echo_id);  			goto resubmit_urb;  		} @@ -458,7 +458,7 @@ static void gs_usb_xmit_callback(struct urb *urb)  	struct net_device *netdev = dev->netdev;  	if (urb->status) -		netdev_info(netdev, "usb xmit fail %d\n", txc->echo_id); +		netdev_info(netdev, "usb xmit fail %u\n", txc->echo_id);  	usb_free_coherent(urb->dev,  			  urb->transfer_buffer_length, @@ -501,7 +501,7 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,  	idx = txc->echo_id;  	if (idx >= GS_MAX_TX_URBS) { -		netdev_err(netdev, "Invalid tx context %d\n", idx); +		netdev_err(netdev, "Invalid tx context %u\n", idx);  		goto badidx;  	} @@ -964,11 +964,11 @@ static int gs_usb_probe(struct usb_interface *intf,  	}  	icount = dconf->icount + 1; -	dev_info(&intf->dev, "Configuring for %d interfaces\n", icount); +	dev_info(&intf->dev, "Configuring for %u interfaces\n", icount);  	if (icount > GS_MAX_INTF) {  		dev_err(&intf->dev, -			"Driver cannot handle more that %d CAN interfaces\n", +			"Driver cannot handle more that %u CAN interfaces\n",  			GS_MAX_INTF);  		kfree(dconf);  		return -EINVAL; diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/drivers/net/can/usb/peak_usb/pcan_usb_core.c index e8f43ed90b72..6107fef9f4a0 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_core.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.c @@ -205,6 +205,19 @@ int peak_usb_netif_rx(struct sk_buff *skb,  	return netif_rx(skb);  } +/* post received skb with native 64-bit hw timestamp */ +int peak_usb_netif_rx_64(struct sk_buff *skb, u32 ts_low, u32 ts_high) +{ +	struct skb_shared_hwtstamps *hwts = skb_hwtstamps(skb); +	u64 ns_ts; + +	ns_ts = (u64)ts_high << 32 | ts_low; +	ns_ts *= NSEC_PER_USEC; +	hwts->hwtstamp = ns_to_ktime(ns_ts); + +	return netif_rx(skb); +} +  /*   * callback for bulk Rx urb   */ diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.h b/drivers/net/can/usb/peak_usb/pcan_usb_core.h index b00a4811bf61..daa19f57e742 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_core.h +++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.h @@ -143,6 +143,7 @@ void peak_usb_set_ts_now(struct peak_time_ref *time_ref, u32 ts_now);  void peak_usb_get_ts_time(struct peak_time_ref *time_ref, u32 ts, ktime_t *tv);  int peak_usb_netif_rx(struct sk_buff *skb,  		      struct peak_time_ref *time_ref, u32 ts_low); +int peak_usb_netif_rx_64(struct sk_buff *skb, u32 ts_low, u32 ts_high);  void peak_usb_async_complete(struct urb *urb);  void peak_usb_restart_complete(struct peak_usb_device *dev); diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c index 09029a3bad1a..6bd12549f101 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c @@ -515,7 +515,8 @@ static int pcan_usb_fd_decode_canmsg(struct pcan_usb_fd_if *usb_if,  	netdev->stats.rx_packets++;  	netdev->stats.rx_bytes += cfd->len; -	peak_usb_netif_rx(skb, &usb_if->time_ref, le32_to_cpu(rm->ts_low)); +	peak_usb_netif_rx_64(skb, le32_to_cpu(rm->ts_low), +			     le32_to_cpu(rm->ts_high));  	return 0;  } @@ -579,7 +580,8 @@ static int pcan_usb_fd_decode_status(struct pcan_usb_fd_if *usb_if,  	netdev->stats.rx_packets++;  	netdev->stats.rx_bytes += cf->len; -	peak_usb_netif_rx(skb, &usb_if->time_ref, le32_to_cpu(sm->ts_low)); +	peak_usb_netif_rx_64(skb, le32_to_cpu(sm->ts_low), +			     le32_to_cpu(sm->ts_high));  	return 0;  } @@ -629,7 +631,8 @@ static int pcan_usb_fd_decode_overrun(struct pcan_usb_fd_if *usb_if,  	cf->can_id |= CAN_ERR_CRTL;  	cf->data[1] |= CAN_ERR_CRTL_RX_OVERFLOW; -	peak_usb_netif_rx(skb, &usb_if->time_ref, le32_to_cpu(ov->ts_low)); +	peak_usb_netif_rx_64(skb, le32_to_cpu(ov->ts_low), +			     le32_to_cpu(ov->ts_high));  	netdev->stats.rx_over_errors++;  	netdev->stats.rx_errors++; diff --git a/drivers/net/can/xilinx_can.c b/drivers/net/can/xilinx_can.c index 3b883e607d8b..e2b15d29d15e 100644 --- a/drivers/net/can/xilinx_can.c +++ b/drivers/net/can/xilinx_can.c @@ -516,8 +516,7 @@ static int xcan_chip_start(struct net_device *ndev)   * @ndev:	Pointer to net_device structure   * @mode:	Tells the mode of the driver   * - * This check the drivers state and calls the - * the corresponding modes to set. + * This check the drivers state and calls the corresponding modes to set.   *   * Return: 0 on success and failure value on error   */ @@ -982,7 +981,7 @@ static void xcan_update_error_state_after_rxtx(struct net_device *ndev)   * @isr:	interrupt status register value   *   * This is the CAN error interrupt and it will - * check the the type of error and forward the error + * check the type of error and forward the error   * frame to upper layers.   */  static void xcan_err_interrupt(struct net_device *ndev, u32 isr) @@ -1844,11 +1843,9 @@ err:  static int xcan_remove(struct platform_device *pdev)  {  	struct net_device *ndev = platform_get_drvdata(pdev); -	struct xcan_priv *priv = netdev_priv(ndev);  	unregister_candev(ndev);  	pm_runtime_disable(&pdev->dev); -	netif_napi_del(&priv->napi);  	free_candev(ndev);  	return 0; | 
