• Dario Binacchi's avatar
    can: slcan: use CAN network device driver API · c4e54b06
    Dario Binacchi authored
    As suggested by commit [1], now the driver uses the functions and the
    data structures provided by the CAN network device driver interface.
    
    Currently the driver doesn't implement a way to set bitrate for SLCAN
    based devices via ip tool, so you'll have to do this by slcand or
    slcan_attach invocation through the -sX parameter:
    
    - slcan_attach -f -s6 -o /dev/ttyACM0
    - slcand -f -s8 -o /dev/ttyUSB0
    
    where -s6 in will set adapter's bitrate to 500 Kbit/s and -s8 to
    1Mbit/s.
    See the table below for further CAN bitrates:
    - s0 ->   10 Kbit/s
    - s1 ->   20 Kbit/s
    - s2 ->   50 Kbit/s
    - s3 ->  100 Kbit/s
    - s4 ->  125 Kbit/s
    - s5 ->  250 Kbit/s
    - s6 ->  500 Kbit/s
    - s7 ->  800 Kbit/s
    - s8 -> 1000 Kbit/s
    
    In doing so, the struct can_priv::bittiming.bitrate of the driver is not
    set and since the open_candev() checks that the bitrate has been set, it
    must be a non-zero value, the bitrate is set to a fake value (-1U)
    before it is called.
    
    Using the rtnl_lock()/rtnl_unlock() functions has become a bit more
    tricky as the register_candev() function indirectly calls rtnl_lock()
    via register_netdev(). To avoid a deadlock it is therefore necessary to
    call rtnl_unlock() before calling register_candev(). The same goes for
    the unregister_candev() function.
    
    [1] commit 39549eef ("can: CAN Network device driver and Netlink interface")
    
    Link: https://lore.kernel.org/all/20220628163137.413025-6-dario.binacchi@amarulasolutions.comSigned-off-by: default avatarDario Binacchi <dario.binacchi@amarulasolutions.com>
    Tested-by: default avatarJeroen Hofstee <jhofstee@victronenergy.com>
    Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
    c4e54b06
slcan.c 19.4 KB