Commit fca29776 authored by Matthias Schiffer's avatar Matthias Schiffer Committed by Marc Kleine-Budde
Browse files

can: m_can: set init flag earlier in probe



While an m_can controller usually already has the init flag from a
hardware reset, no such reset happens on the integrated m_can_pci of the
Intel Elkhart Lake. If the CAN controller is found in an active state,
m_can_dev_setup() would fail because m_can_niso_supported() calls
m_can_cccr_update_bits(), which refuses to modify any other configuration
bits when CCCR_INIT is not set.

To avoid this issue, set CCCR_INIT before attempting to modify any other
configuration flags.

Fixes: cd5a46ce ("can: m_can: don't enable transceiver when probing")
Signed-off-by: default avatarMatthias Schiffer <matthias.schiffer@ew.tq-group.com>
Reviewed-by: default avatarMarkus Schneider-Pargmann <msp@baylibre.com>
Link: https://patch.msgid.link/e247f331cb72829fcbdfda74f31a59cbad1a6006.1728288535.git.matthias.schiffer@ew.tq-group.com


Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent 954a2b40
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -1695,6 +1695,14 @@ static int m_can_dev_setup(struct m_can_classdev *cdev)
		return -EINVAL;
	}

	/* Write the INIT bit, in case no hardware reset has happened before
	 * the probe (for example, it was observed that the Intel Elkhart Lake
	 * SoCs do not properly reset the CAN controllers on reboot)
	 */
	err = m_can_cccr_update_bits(cdev, CCCR_INIT, CCCR_INIT);
	if (err)
		return err;

	if (!cdev->is_peripheral)
		netif_napi_add(dev, &cdev->napi, m_can_poll);

@@ -1746,11 +1754,7 @@ static int m_can_dev_setup(struct m_can_classdev *cdev)
		return -EINVAL;
	}

	/* Forcing standby mode should be redundant, as the chip should be in
	 * standby after a reset. Write the INIT bit anyways, should the chip
	 * be configured by previous stage.
	 */
	return m_can_cccr_update_bits(cdev, CCCR_INIT, CCCR_INIT);
	return 0;
}

static void m_can_stop(struct net_device *dev)