Commit 34d26315 authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge tag 'linux-can-next-for-6.16-20250522' of...

Merge tag 'linux-can-next-for-6.16-20250522' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next

Marc Kleine-Budde says:

====================
pull-request: can-next 2025-05-22

this is a pull request of 22 patches for net-next/main.

The series by Biju Das contains 19 patches and adds RZ/G3E CANFD
support to the rcar_canfd driver.

The patch by Vincent Mailhol adds a struct data_bittiming_params to
group FD parameters as a preparation patch for CAN-XL support.

Felix Maurer's patch imports tst-filter from can-tests into the kernel
self tests and Vincent Mailhol adds support for physical CAN
interfaces.

linux-can-next-for-6.16-20250522

* tag 'linux-can-next-for-6.16-20250522' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next: (22 commits)
  selftests: can: test_raw_filter.sh: add support of physical interfaces
  selftests: can: Import tst-filter from can-tests
  can: dev: add struct data_bittiming_params to group FD parameters
  can: rcar_canfd: Add RZ/G3E support
  can: rcar_canfd: Enhance multi_channel_irqs handling
  can: rcar_canfd: Add external_clk variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Add sh variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Add struct rcanfd_regs variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Add shared_can_regs variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Add ch_interface_mode variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Add {nom,data}_bittiming variables to struct rcar_canfd_hw_info
  can: rcar_canfd: Add max_cftml variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Add max_aflpn variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Add rnc_field_width variable to struct rcar_canfd_hw_info
  can: rcar_canfd: Update RCANFD_GAFLCFG macro
  can: rcar_canfd: Add rcar_canfd_setrnc()
  can: rcar_canfd: Drop the mask operation in RCANFD_GAFLCFG_SETRNC macro
  can: rcar_canfd: Update RCANFD_GERFL_ERR macro
  can: rcar_canfd: Drop RCANFD_GAFLCFG_GETRNC macro
  can: rcar_canfd: Use of_get_available_child_by_name()
  ...
====================

Link: https://patch.msgid.link/20250522084128.501049-1-mkl@pengutronix.de


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 0a9b2c9f 3e20585a
Loading
Loading
Loading
Loading
+128 −43
Original line number Diff line number Diff line
@@ -42,19 +42,80 @@ properties:
              - renesas,r9a07g054-canfd    # RZ/V2L
          - const: renesas,rzg2l-canfd     # RZ/G2L family

      - const: renesas,r9a09g047-canfd     # RZ/G3E

  reg:
    maxItems: 1

  interrupts: true
  interrupts:
    oneOf:
      - items:
          - description: Channel interrupt
          - description: Global interrupt
      - items:
          - description: CAN global error interrupt
          - description: CAN receive FIFO interrupt
          - description: CAN0 error interrupt
          - description: CAN0 transmit interrupt
          - description: CAN0 transmit/receive FIFO receive completion interrupt
          - description: CAN1 error interrupt
          - description: CAN1 transmit interrupt
          - description: CAN1 transmit/receive FIFO receive completion interrupt
          - description: CAN2 error interrupt
          - description: CAN2 transmit interrupt
          - description: CAN2 transmit/receive FIFO receive completion interrupt
          - description: CAN3 error interrupt
          - description: CAN3 transmit interrupt
          - description: CAN3 transmit/receive FIFO receive completion interrupt
          - description: CAN4 error interrupt
          - description: CAN4 transmit interrupt
          - description: CAN4 transmit/receive FIFO receive completion interrupt
          - description: CAN5 error interrupt
          - description: CAN5 transmit interrupt
          - description: CAN5 transmit/receive FIFO receive completion interrupt
        minItems: 8

  interrupt-names:
    oneOf:
      - items:
          - const: ch_int
          - const: g_int
      - items:
          - const: g_err
          - const: g_recc
          - const: ch0_err
          - const: ch0_rec
          - const: ch0_trx
          - const: ch1_err
          - const: ch1_rec
          - const: ch1_trx
          - const: ch2_err
          - const: ch2_rec
          - const: ch2_trx
          - const: ch3_err
          - const: ch3_rec
          - const: ch3_trx
          - const: ch4_err
          - const: ch4_rec
          - const: ch4_trx
          - const: ch5_err
          - const: ch5_rec
          - const: ch5_trx
        minItems: 8

  clocks:
    maxItems: 3

  clock-names:
    items:
    oneOf:
      - items:
          - const: fck
          - const: canfd
          - const: can_clk
      - items:
          - const: fck
          - const: ram_clk
          - const: can_clk

  power-domains:
    maxItems: 1
@@ -117,52 +178,77 @@ allOf:
    then:
      properties:
        interrupts:
          items:
            - description: CAN global error interrupt
            - description: CAN receive FIFO interrupt
            - description: CAN0 error interrupt
            - description: CAN0 transmit interrupt
            - description: CAN0 transmit/receive FIFO receive completion interrupt
            - description: CAN1 error interrupt
            - description: CAN1 transmit interrupt
            - description: CAN1 transmit/receive FIFO receive completion interrupt
          maxItems: 8

        interrupt-names:
          items:
            - const: g_err
            - const: g_recc
            - const: ch0_err
            - const: ch0_rec
            - const: ch0_trx
            - const: ch1_err
            - const: ch1_rec
            - const: ch1_trx
          maxItems: 8

        resets:
          minItems: 2
          maxItems: 2

        reset-names:
          items:
            - const: rstp_n
            - const: rstc_n
          minItems: 2
          maxItems: 2

      required:
        - reset-names
    else:

  - if:
      properties:
        compatible:
          contains:
            enum:
              - renesas,rcar-gen3-canfd
              - renesas,rcar-gen4-canfd
    then:
      properties:
        interrupts:
          items:
            - description: Channel interrupt
            - description: Global interrupt
          minItems: 2
          maxItems: 2

        interrupt-names:
          items:
            - const: ch_int
            - const: g_int
          minItems: 2
          maxItems: 2

        resets:
          maxItems: 1

  - if:
      properties:
        compatible:
          contains:
            const: renesas,r9a09g047-canfd
    then:
      properties:
        interrupts:
          minItems: 20

        interrupt-names:
          minItems: 20

        resets:
          minItems: 2
          maxItems: 2

        reset-names:
          minItems: 2
          maxItems: 2

      required:
        - reset-names

  - if:
      properties:
        compatible:
          contains:
            enum:
              - renesas,rcar-gen3-canfd
              - renesas,rzg2l-canfd
    then:
      patternProperties:
        "^channel[2-7]$": false

  - if:
      properties:
        compatible:
@@ -171,16 +257,15 @@ allOf:
    then:
      patternProperties:
        "^channel[4-7]$": false
    else:
      if:
        not:

  - if:
      properties:
        compatible:
          contains:
                const: renesas,rcar-gen4-canfd
            const: renesas,r9a09g047-canfd
    then:
      patternProperties:
          "^channel[2-7]$": false
        "^channel[6-7]$": false

unevaluatedProperties: false

+2 −0
Original line number Diff line number Diff line
@@ -5274,6 +5274,7 @@ F: include/uapi/linux/can/isotp.h
F:	include/uapi/linux/can/raw.h
F:	net/can/
F:	net/sched/em_canid.c
F:	tools/testing/selftests/net/can/
CAN-J1939 NETWORK LAYER
M:	Robin van der Gracht <robin@protonic.nl>
@@ -17076,6 +17077,7 @@ X: net/ceph/
X:	net/mac80211/
X:	net/rfkill/
X:	net/wireless/
X:	tools/testing/selftests/net/can/
NETWORKING [IPSEC]
M:	Steffen Klassert <steffen.klassert@secunet.com>
+4 −4
Original line number Diff line number Diff line
@@ -275,7 +275,7 @@ static int ctucan_set_bittiming(struct net_device *ndev)
static int ctucan_set_data_bittiming(struct net_device *ndev)
{
	struct ctucan_priv *priv = netdev_priv(ndev);
	struct can_bittiming *dbt = &priv->can.data_bittiming;
	struct can_bittiming *dbt = &priv->can.fd.data_bittiming;

	/* Note that dbt may be modified here */
	return ctucan_set_btr(ndev, dbt, false);
@@ -290,7 +290,7 @@ static int ctucan_set_data_bittiming(struct net_device *ndev)
static int ctucan_set_secondary_sample_point(struct net_device *ndev)
{
	struct ctucan_priv *priv = netdev_priv(ndev);
	struct can_bittiming *dbt = &priv->can.data_bittiming;
	struct can_bittiming *dbt = &priv->can.fd.data_bittiming;
	int ssp_offset = 0;
	u32 ssp_cfg = 0; /* No SSP by default */

@@ -1358,12 +1358,12 @@ int ctucan_probe_common(struct device *dev, void __iomem *addr, int irq, unsigne
	priv->ntxbufs = ntxbufs;
	priv->dev = dev;
	priv->can.bittiming_const = &ctu_can_fd_bit_timing_max;
	priv->can.data_bittiming_const = &ctu_can_fd_bit_timing_data_max;
	priv->can.fd.data_bittiming_const = &ctu_can_fd_bit_timing_data_max;
	priv->can.do_set_mode = ctucan_do_set_mode;

	/* Needed for timing adjustment to be performed as soon as possible */
	priv->can.do_set_bittiming = ctucan_set_bittiming;
	priv->can.do_set_data_bittiming = ctucan_set_data_bittiming;
	priv->can.fd.do_set_data_bittiming = ctucan_set_data_bittiming;

	priv->can.do_get_berr_counter = ctucan_get_berr_counter;
	priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK
+6 −6
Original line number Diff line number Diff line
@@ -404,8 +404,8 @@ int open_candev(struct net_device *dev)

	/* For CAN FD the data bitrate has to be >= the arbitration bitrate */
	if ((priv->ctrlmode & CAN_CTRLMODE_FD) &&
	    (!priv->data_bittiming.bitrate ||
	     priv->data_bittiming.bitrate < priv->bittiming.bitrate)) {
	    (!priv->fd.data_bittiming.bitrate ||
	     priv->fd.data_bittiming.bitrate < priv->bittiming.bitrate)) {
		netdev_err(dev, "incorrect/missing data bit-timing\n");
		return -EINVAL;
	}
@@ -543,16 +543,16 @@ int register_candev(struct net_device *dev)
	if (!priv->bitrate_const != !priv->bitrate_const_cnt)
		return -EINVAL;

	if (!priv->data_bitrate_const != !priv->data_bitrate_const_cnt)
	if (!priv->fd.data_bitrate_const != !priv->fd.data_bitrate_const_cnt)
		return -EINVAL;

	/* We only support either fixed bit rates or bit timing const. */
	if ((priv->bitrate_const || priv->data_bitrate_const) &&
	    (priv->bittiming_const || priv->data_bittiming_const))
	if ((priv->bitrate_const || priv->fd.data_bitrate_const) &&
	    (priv->bittiming_const || priv->fd.data_bittiming_const))
		return -EINVAL;

	if (!can_bittiming_const_valid(priv->bittiming_const) ||
	    !can_bittiming_const_valid(priv->data_bittiming_const))
	    !can_bittiming_const_valid(priv->fd.data_bittiming_const))
		return -EINVAL;

	if (!priv->termination_const) {
+37 −37
Original line number Diff line number Diff line
@@ -141,7 +141,7 @@ static int can_tdc_changelink(struct can_priv *priv, const struct nlattr *nla,
{
	struct nlattr *tb_tdc[IFLA_CAN_TDC_MAX + 1];
	struct can_tdc tdc = { 0 };
	const struct can_tdc_const *tdc_const = priv->tdc_const;
	const struct can_tdc_const *tdc_const = priv->fd.tdc_const;
	int err;

	if (!tdc_const || !can_tdc_is_enabled(priv))
@@ -179,7 +179,7 @@ static int can_tdc_changelink(struct can_priv *priv, const struct nlattr *nla,
		tdc.tdcf = tdcf;
	}

	priv->tdc = tdc;
	priv->fd.tdc = tdc;

	return 0;
}
@@ -228,10 +228,10 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
			dev->mtu = CANFD_MTU;
		} else {
			dev->mtu = CAN_MTU;
			memset(&priv->data_bittiming, 0,
			       sizeof(priv->data_bittiming));
			memset(&priv->fd.data_bittiming, 0,
			       sizeof(priv->fd.data_bittiming));
			priv->ctrlmode &= ~CAN_CTRLMODE_TDC_MASK;
			memset(&priv->tdc, 0, sizeof(priv->tdc));
			memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc));
		}

		tdc_mask = cm->mask & CAN_CTRLMODE_TDC_MASK;
@@ -312,16 +312,16 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
		 * directly via do_set_bitrate(). Bail out if neither
		 * is given.
		 */
		if (!priv->data_bittiming_const && !priv->do_set_data_bittiming &&
		    !priv->data_bitrate_const)
		if (!priv->fd.data_bittiming_const && !priv->fd.do_set_data_bittiming &&
		    !priv->fd.data_bitrate_const)
			return -EOPNOTSUPP;

		memcpy(&dbt, nla_data(data[IFLA_CAN_DATA_BITTIMING]),
		       sizeof(dbt));
		err = can_get_bittiming(dev, &dbt,
					priv->data_bittiming_const,
					priv->data_bitrate_const,
					priv->data_bitrate_const_cnt,
					priv->fd.data_bittiming_const,
					priv->fd.data_bitrate_const,
					priv->fd.data_bitrate_const_cnt,
					extack);
		if (err)
			return err;
@@ -333,7 +333,7 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
			return -EINVAL;
		}

		memset(&priv->tdc, 0, sizeof(priv->tdc));
		memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc));
		if (data[IFLA_CAN_TDC]) {
			/* TDC parameters are provided: use them */
			err = can_tdc_changelink(priv, data[IFLA_CAN_TDC],
@@ -346,17 +346,17 @@ static int can_changelink(struct net_device *dev, struct nlattr *tb[],
			/* Neither of TDC parameters nor TDC flags are
			 * provided: do calculation
			 */
			can_calc_tdco(&priv->tdc, priv->tdc_const, &dbt,
			can_calc_tdco(&priv->fd.tdc, priv->fd.tdc_const, &dbt,
				      &priv->ctrlmode, priv->ctrlmode_supported);
		} /* else: both CAN_CTRLMODE_TDC_{AUTO,MANUAL} are explicitly
		   * turned off. TDC is disabled: do nothing
		   */

		memcpy(&priv->data_bittiming, &dbt, sizeof(dbt));
		memcpy(&priv->fd.data_bittiming, &dbt, sizeof(dbt));

		if (priv->do_set_data_bittiming) {
		if (priv->fd.do_set_data_bittiming) {
			/* Finally, set the bit-timing registers */
			err = priv->do_set_data_bittiming(dev);
			err = priv->fd.do_set_data_bittiming(dev);
			if (err)
				return err;
		}
@@ -394,7 +394,7 @@ 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)
	if (!priv->fd.tdc_const)
		return 0;

	size = nla_total_size(0);			/* nest IFLA_CAN_TDC */
@@ -404,17 +404,17 @@ static size_t can_tdc_get_size(const struct net_device *dev)
	}
	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) {
	if (priv->fd.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)
		    priv->fd.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)
		if (priv->fd.tdc_const->tdcf_max)
			size += nla_total_size(sizeof(u32));	/* IFLA_CAN_TDCF */
	}

@@ -442,9 +442,9 @@ static size_t can_get_size(const struct net_device *dev)
	size += nla_total_size(sizeof(u32));			/* IFLA_CAN_RESTART_MS */
	if (priv->do_get_berr_counter)				/* IFLA_CAN_BERR_COUNTER */
		size += nla_total_size(sizeof(struct can_berr_counter));
	if (priv->data_bittiming.bitrate)			/* IFLA_CAN_DATA_BITTIMING */
	if (priv->fd.data_bittiming.bitrate)			/* IFLA_CAN_DATA_BITTIMING */
		size += nla_total_size(sizeof(struct can_bittiming));
	if (priv->data_bittiming_const)				/* IFLA_CAN_DATA_BITTIMING_CONST */
	if (priv->fd.data_bittiming_const)			/* IFLA_CAN_DATA_BITTIMING_CONST */
		size += nla_total_size(sizeof(struct can_bittiming_const));
	if (priv->termination_const) {
		size += nla_total_size(sizeof(priv->termination));		/* IFLA_CAN_TERMINATION */
@@ -454,9 +454,9 @@ static size_t can_get_size(const struct net_device *dev)
	if (priv->bitrate_const)				/* IFLA_CAN_BITRATE_CONST */
		size += nla_total_size(sizeof(*priv->bitrate_const) *
				       priv->bitrate_const_cnt);
	if (priv->data_bitrate_const)				/* IFLA_CAN_DATA_BITRATE_CONST */
		size += nla_total_size(sizeof(*priv->data_bitrate_const) *
				       priv->data_bitrate_const_cnt);
	if (priv->fd.data_bitrate_const)			/* IFLA_CAN_DATA_BITRATE_CONST */
		size += nla_total_size(sizeof(*priv->fd.data_bitrate_const) *
				       priv->fd.data_bitrate_const_cnt);
	size += sizeof(priv->bitrate_max);			/* IFLA_CAN_BITRATE_MAX */
	size += can_tdc_get_size(dev);				/* IFLA_CAN_TDC */
	size += can_ctrlmode_ext_get_size();			/* IFLA_CAN_CTRLMODE_EXT */
@@ -468,8 +468,8 @@ 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;
	struct can_tdc *tdc = &priv->fd.tdc;
	const struct can_tdc_const *tdc_const = priv->fd.tdc_const;

	if (!tdc_const)
		return 0;
@@ -497,8 +497,8 @@ static int can_tdc_fill_info(struct sk_buff *skb, const struct net_device *dev)
		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);
		} else if (priv->fd.do_get_auto_tdcv) {
			err = priv->fd.do_get_auto_tdcv(dev, &tdcv);
		}
		if (!err && nla_put_u32(skb, IFLA_CAN_TDC_TDCV, tdcv))
			goto err_cancel;
@@ -564,14 +564,14 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
	     !priv->do_get_berr_counter(dev, &bec) &&
	     nla_put(skb, IFLA_CAN_BERR_COUNTER, sizeof(bec), &bec)) ||

	    (priv->data_bittiming.bitrate &&
	    (priv->fd.data_bittiming.bitrate &&
	     nla_put(skb, IFLA_CAN_DATA_BITTIMING,
		     sizeof(priv->data_bittiming), &priv->data_bittiming)) ||
		     sizeof(priv->fd.data_bittiming), &priv->fd.data_bittiming)) ||

	    (priv->data_bittiming_const &&
	    (priv->fd.data_bittiming_const &&
	     nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST,
		     sizeof(*priv->data_bittiming_const),
		     priv->data_bittiming_const)) ||
		     sizeof(*priv->fd.data_bittiming_const),
		     priv->fd.data_bittiming_const)) ||

	    (priv->termination_const &&
	     (nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination) ||
@@ -586,11 +586,11 @@ static int can_fill_info(struct sk_buff *skb, const struct net_device *dev)
		     priv->bitrate_const_cnt,
		     priv->bitrate_const)) ||

	    (priv->data_bitrate_const &&
	    (priv->fd.data_bitrate_const &&
	     nla_put(skb, IFLA_CAN_DATA_BITRATE_CONST,
		     sizeof(*priv->data_bitrate_const) *
		     priv->data_bitrate_const_cnt,
		     priv->data_bitrate_const)) ||
		     sizeof(*priv->fd.data_bitrate_const) *
		     priv->fd.data_bitrate_const_cnt,
		     priv->fd.data_bitrate_const)) ||

	    (nla_put(skb, IFLA_CAN_BITRATE_MAX,
		     sizeof(priv->bitrate_max),
Loading