Message ID | 20241218121722.2311963-2-mkl@pengutronix.de (mailing list archive) |
---|---|
State | Accepted |
Commit | fca2977629f49dee437e217c3fc423b6e0cad98c |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,1/2] can: m_can: set init flag earlier in probe | expand |
Hello: This series was applied to netdev/net.git (main) by Marc Kleine-Budde <mkl@pengutronix.de>: On Wed, 18 Dec 2024 13:10:27 +0100 you wrote: > From: Matthias Schiffer <matthias.schiffer@ew.tq-group.com> > > 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. > > [...] Here is the summary with links: - [net,1/2] can: m_can: set init flag earlier in probe https://git.kernel.org/netdev/net/c/fca2977629f4 - [net,2/2] can: m_can: fix missed interrupts with m_can_pci https://git.kernel.org/netdev/net/c/743375f8deee You are awesome, thank you!
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index 533bcb77c9f9..67c404fbe166 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c @@ -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)