Message ID | ac8c49fffac582176ba1899a85db84e0f5d5c7a6.1726745009.git.matthias.schiffer@ew.tq-group.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [v2,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 Thu, Sep 19, 2024 at 01:27:27PM 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> > --- > > v2: no changes > > 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..47481afb9add3 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; > } > > + /* 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. > + */ Could you please update the comment to reflect your findings? Best Markus > + 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..47481afb9add3 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; } + /* 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. + */ + 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 drivers/net/can/m_can/m_can.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)