• Ian Abbott's avatar
    staging: comedi: ni_routes: allow partial routing information · 9fea3a40
    Ian Abbott authored
    This patch fixes a regression on setting up asynchronous commands to use
    external trigger sources when board-specific routing information is
    missing.
    
    `ni_find_device_routes()` (called via `ni_assign_device_routes()`) finds
    the table of register values for the device family and the set of valid
    routes for the specific board.  If both are found,
    `tables->route_values` is set to point to the table of register values
    for the device family and `tables->valid_routes` is set to point to the
    list of valid routes for the specific board.  If either is not found,
    both `tables->route_values` and `tables->valid_routes` are left set at
    their initial null values (initialized by `ni_assign_device_routes()`)
    and the function returns `-ENODATA`.
    
    Returning an error results in some routing functionality being disabled.
    Unfortunately, leaving `table->route_values` set to `NULL` also breaks
    the setting up of asynchronous commands that are configured to use
    external trigger sources.  Calls to `ni_check_trigger_arg()` or
    `ni_check_trigger_arg_roffs()` while checking the asynchronous command
    set-up would result in a null pointer dereference if
    `table->route_values` is `NULL`.  The null pointer dereference is fixed
    in another patch, but it now results in failure to set up the
    asynchronous command.  That is a regression from the behavior prior to
    commit 347e2448 ("staging: comedi: tio: implement global tio/ctr
    routing") and commit 56d0b826 ("staging: comedi: ni_mio_common:
    implement new routing for TRIG_EXT").
    
    Change `ni_find_device_routes()` to set `tables->route_values` and/or
    `tables->valid_routes` to valid information even if the other one can
    only be set to `NULL` due to missing information.  The function will
    still return an error in that case.  This should result in
    `tables->valid_routes` being valid for all currently supported device
    families even if the board-specific routing information is missing.
    That should be enough to fix the regression on setting up asynchronous
    commands to use external triggers for boards with missing routing
    information.
    
    Fixes: 347e2448 ("staging: comedi: tio: implement global tio/ctr routing")
    Fixes: 56d0b826 ("staging: comedi: ni_mio_common: implement new routing for TRIG_EXT").
    Cc: <stable@vger.kernel.org> # 4.20+
    Cc: Spencer E. Olson <olsonse@umich.edu>
    Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
    Link: https://lore.kernel.org/r/20200114182532.132058-3-abbotti@mev.co.ukSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    9fea3a40
ni_routes.c 14.6 KB