• Joakim Zhang's avatar
    can: flexcan: fix timeout when set small bitrate · 1d4258f8
    Joakim Zhang authored
    commit 247e5356 upstream.
    
    Current we can meet timeout issue when setting a small bitrate like
    10000 as follows on i.MX6UL EVK board (ipg clock = 66MHZ, per clock =
    30MHZ):
    
    | root@imx6ul7d:~# ip link set can0 up type can bitrate 10000
    
    A link change request failed with some changes committed already.
    Interface can0 may have been left with an inconsistent configuration,
    please check.
    
    | RTNETLINK answers: Connection timed out
    
    It is caused by calling of flexcan_chip_unfreeze() timeout.
    
    Originally the code is using usleep_range(10, 20) for unfreeze
    operation, but the patch (8badd65e can: flexcan: avoid calling
    usleep_range from interrupt context) changed it into udelay(10) which is
    only a half delay of before, there're also some other delay changes.
    
    After double to FLEXCAN_TIMEOUT_US to 100 can fix the issue.
    
    Meanwhile, Rasmus Villemoes reported that even with a timeout of 100,
    flexcan_probe() fails on the MPC8309, which requires a value of at least
    140 to work reliably. 250 works for everyone.
    Signed-off-by: default avatarJoakim Zhang <qiangqing.zhang@nxp.com>
    Reviewed-by: default avatarDong Aisheng <aisheng.dong@nxp.com>
    Cc: linux-stable <stable@vger.kernel.org>
    Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    1d4258f8
flexcan.c 46.4 KB