]> git.baikalelectronics.ru Git - kernel.git/commit
can: flexcan: flexcan_chip_start(): fix erroneous flexcan_transceiver_enable() during...
authorMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 18 Nov 2020 15:01:48 +0000 (16:01 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 18 Nov 2020 15:02:34 +0000 (16:02 +0100)
commit5cb38601907fcc5c4ef3f5ce8c457507a87f4b5e
tree23383f4ee21765eeaf6ea1f1d9a3494d13025684
parentf5f2643ef9bb9784ecbc2a29239b9440927f314b
can: flexcan: flexcan_chip_start(): fix erroneous flexcan_transceiver_enable() during bus-off recovery

If the CAN controller goes into bus off, the do_set_mode() callback with
CAN_MODE_START can be used to recover the controller, which then calls
flexcan_chip_start(). If configured, this is done automatically by the
framework or manually by the user.

In flexcan_chip_start() there is an explicit call to
flexcan_transceiver_enable(), which does a regulator_enable() on the
transceiver regulator. This results in a net usage counter increase, as there
is no corresponding flexcan_transceiver_disable() in the bus off code path.
This further leads to the transceiver stuck enabled, even if the CAN interface
is shut down.

To fix this problem the
flexcan_transceiver_enable()/flexcan_transceiver_disable() are moved out of
flexcan_chip_start()/flexcan_chip_stop() into flexcan_open()/flexcan_close().

Fixes: e576af048406 ("CAN: Add Flexcan CAN controller driver")
Link: https://lore.kernel.org/r/20201118150148.2664024-1-mkl@pengutronix.de
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/flexcan.c