Message ID | ed86ab0d7d2b295dc894fc3e929beb69bdc921f6.1727092909.git.matthias.schiffer@ew.tq-group.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [v3,1/2] can: m_can: set init flag earlier in probe | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Series ignored based on subject |
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@ew.tq-group.com> Reviewed-by: Markus Schneider-Pargmann <msp@baylibre.com> 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/
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)
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@ew.tq-group.com> --- 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(-)