staging: comedi: ni_routes: allow partial routing information
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 commit347e244884
("staging: comedi: tio: implement global tio/ctr routing") and commit56d0b826d3
("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:347e244884
("staging: comedi: tio: implement global tio/ctr routing") Fixes:56d0b826d3
("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: Ian Abbott <abbotti@mev.co.uk> Link: https://lore.kernel.org/r/20200114182532.132058-3-abbotti@mev.co.uk Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
01e20b664f
commit
9fea3a40f6
|
@ -72,9 +72,6 @@ static int ni_find_device_routes(const char *device_family,
|
|||
}
|
||||
}
|
||||
|
||||
if (!rv)
|
||||
return -ENODATA;
|
||||
|
||||
/* Second, find the set of routes valid for this device. */
|
||||
for (i = 0; ni_device_routes_list[i]; ++i) {
|
||||
if (memcmp(ni_device_routes_list[i]->device, board_name,
|
||||
|
@ -84,12 +81,12 @@ static int ni_find_device_routes(const char *device_family,
|
|||
}
|
||||
}
|
||||
|
||||
if (!dr)
|
||||
return -ENODATA;
|
||||
|
||||
tables->route_values = rv;
|
||||
tables->valid_routes = dr;
|
||||
|
||||
if (!rv || !dr)
|
||||
return -ENODATA;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue