On Mon, Sep 23, 2024 at 05:32:15PM GMT, Matthias Schiffer wrote: > 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: cd5a46ce6fa6 ("can: m_can: don't enable transceiver when probing") > Signed-off-by: Matthias Schiffer <matthias.schiffer@xxxxxxxxxxxxxxx> Reviewed-by: Markus Schneider-Pargmann <msp@xxxxxxxxxxxx> Best Markus > --- > > v2: no changes > v3: updated comment to mention Elkhart Lake > > drivers/net/can/m_can/m_can.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c > index 012c3d22b01dd..c85ac1b15f723 100644 > --- a/drivers/net/can/m_can/m_can.c > +++ b/drivers/net/can/m_can/m_can.c > @@ -1681,6 +1681,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); > > @@ -1732,11 +1740,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) > -- > TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany > Amtsgericht München, HRB 105018 > Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider > https://www.tq-group.com/