• Marc Kleine-Budde's avatar
    can: flexcan: flexcan_chip_start(): fix erroneous flexcan_transceiver_enable()... · cd9f13c5
    Marc Kleine-Budde authored
    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: e955cead ("CAN: Add Flexcan CAN controller driver")
    Link: https://lore.kernel.org/r/20201118150148.2664024-1-mkl@pengutronix.deSigned-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    cd9f13c5
flexcan.c 61.8 KB