On Wed, May 01, 2024 at 02:42:03PM +0200, Martin Hundebøll wrote: > The m_can driver sets and clears the CCCR.INIT bit during probe (both > when testing the NON-ISO bit, and when configuring the chip). After > clearing the CCCR.INIT bit, the transceiver enters normal mode, where it > affects the CAN bus (i.e. it ACKs frames). This can cause troubles when > the m_can node is only used for monitoring the bus, as one cannot setup > listen-only mode before the device is probed. > > Rework the probe flow, so that the CCCR.INIT bit is only cleared when > upping the device. First, the tcan4x5x driver is changed to stay in > standby mode during/after probe. This in turn requires changes when > setting bits in the CCCR register, as its CSR and CSA bits are always > high in standby mode. > > Signed-off-by: Martin Hundebøll <martin@xxxxxxxxxx> > --- > > Changes since v1: > * Implement Markus review comments: > - Rename m_can_cccr_wait_bits() to m_can_cccr_update_bits() > - Explicitly set CCCR_INIT bit in m_can_dev_setup() > - Revert to 5 timeouts/tries to 10 > - Use m_can_config_{en|dis}able() in m_can_niso_supported() > - Revert move of call to m_can_enable_all_interrupts() > - Return -EBUSY on failure to enter normal mode > - Use tcan4x5x_clear_interrupts() in tcan4x5x_can_probe() > > drivers/net/can/m_can/m_can.c | 131 +++++++++++++++----------- > drivers/net/can/m_can/tcan4x5x-core.c | 13 ++- > 2 files changed, 85 insertions(+), 59 deletions(-) > > diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c ... > @@ -1694,8 +1708,12 @@ static int m_can_dev_setup(struct m_can_classdev *cdev) > return -EINVAL; > } > > - if (cdev->ops->init) > - cdev->ops->init(cdev); > + /* Forcing standby mode should be redunant, as the chip should be in Hi Martin, A minor nit, to consider fixing if you send a v3 for some other reason: redunant -> redundant. > + * standby after a reset. Write the INIT bit anyways, should the chip > + * be configured by previous stage. > + */ > + if (!m_can_cccr_update_bits(cdev, CCCR_INIT, CCCR_INIT)) > + return -EBUSY; > > return 0; > } ...