@@ -2256,7 +2256,7 @@ static int ni_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
22562256 if (err )
22572257 return 2 ;
22582258
2259- /* step 3: make sure arguments are trivially compatible */
2259+ /* Step 3: check if arguments are trivially valid */
22602260
22612261 if (cmd -> start_src == TRIG_EXT ) {
22622262 /* external trigger */
@@ -2265,63 +2265,38 @@ static int ni_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
22652265 if (tmp > 16 )
22662266 tmp = 16 ;
22672267 tmp |= (cmd -> start_arg & (CR_INVERT | CR_EDGE ));
2268- if (cmd -> start_arg != tmp ) {
2269- cmd -> start_arg = tmp ;
2270- err ++ ;
2271- }
2268+ err |= cfc_check_trigger_arg_is (& cmd -> start_arg , tmp );
22722269 } else {
2273- if (cmd -> start_arg != 0 ) {
2274- /* true for both TRIG_NOW and TRIG_INT */
2275- cmd -> start_arg = 0 ;
2276- err ++ ;
2277- }
2270+ /* true for both TRIG_NOW and TRIG_INT */
2271+ err |= cfc_check_trigger_arg_is (& cmd -> start_arg , 0 );
22782272 }
2273+
22792274 if (cmd -> scan_begin_src == TRIG_TIMER ) {
2280- if (cmd -> scan_begin_arg < ni_min_ai_scan_period_ns (dev ,
2281- cmd ->
2282- chanlist_len ))
2283- {
2284- cmd -> scan_begin_arg =
2285- ni_min_ai_scan_period_ns (dev , cmd -> chanlist_len );
2286- err ++ ;
2287- }
2288- if (cmd -> scan_begin_arg > devpriv -> clock_ns * 0xffffff ) {
2289- cmd -> scan_begin_arg = devpriv -> clock_ns * 0xffffff ;
2290- err ++ ;
2291- }
2275+ err |= cfc_check_trigger_arg_min (& cmd -> scan_begin_arg ,
2276+ ni_min_ai_scan_period_ns (dev , cmd -> chanlist_len ));
2277+ err |= cfc_check_trigger_arg_max (& cmd -> scan_begin_arg ,
2278+ devpriv -> clock_ns * 0xffffff );
22922279 } else if (cmd -> scan_begin_src == TRIG_EXT ) {
22932280 /* external trigger */
22942281 unsigned int tmp = CR_CHAN (cmd -> scan_begin_arg );
22952282
22962283 if (tmp > 16 )
22972284 tmp = 16 ;
22982285 tmp |= (cmd -> scan_begin_arg & (CR_INVERT | CR_EDGE ));
2299- if (cmd -> scan_begin_arg != tmp ) {
2300- cmd -> scan_begin_arg = tmp ;
2301- err ++ ;
2302- }
2286+ err |= cfc_check_trigger_arg_is (& cmd -> scan_begin_arg , tmp );
23032287 } else { /* TRIG_OTHER */
2304- if (cmd -> scan_begin_arg ) {
2305- cmd -> scan_begin_arg = 0 ;
2306- err ++ ;
2307- }
2288+ err |= cfc_check_trigger_arg_is (& cmd -> scan_begin_arg , 0 );
23082289 }
2290+
23092291 if (cmd -> convert_src == TRIG_TIMER ) {
23102292 if ((boardtype .reg_type == ni_reg_611x )
23112293 || (boardtype .reg_type == ni_reg_6143 )) {
2312- if (cmd -> convert_arg != 0 ) {
2313- cmd -> convert_arg = 0 ;
2314- err ++ ;
2315- }
2294+ err |= cfc_check_trigger_arg_is (& cmd -> convert_arg , 0 );
23162295 } else {
2317- if (cmd -> convert_arg < boardtype .ai_speed ) {
2318- cmd -> convert_arg = boardtype .ai_speed ;
2319- err ++ ;
2320- }
2321- if (cmd -> convert_arg > devpriv -> clock_ns * 0xffff ) {
2322- cmd -> convert_arg = devpriv -> clock_ns * 0xffff ;
2323- err ++ ;
2324- }
2296+ err |= cfc_check_trigger_arg_min (& cmd -> convert_arg ,
2297+ boardtype .ai_speed );
2298+ err |= cfc_check_trigger_arg_max (& cmd -> convert_arg ,
2299+ devpriv -> clock_ns * 0xffff );
23252300 }
23262301 } else if (cmd -> convert_src == TRIG_EXT ) {
23272302 /* external trigger */
@@ -2330,40 +2305,23 @@ static int ni_ai_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
23302305 if (tmp > 16 )
23312306 tmp = 16 ;
23322307 tmp |= (cmd -> convert_arg & (CR_ALT_FILTER | CR_INVERT ));
2333- if (cmd -> convert_arg != tmp ) {
2334- cmd -> convert_arg = tmp ;
2335- err ++ ;
2336- }
2308+ err |= cfc_check_trigger_arg_is (& cmd -> convert_arg , tmp );
23372309 } else if (cmd -> convert_src == TRIG_NOW ) {
2338- if (cmd -> convert_arg != 0 ) {
2339- cmd -> convert_arg = 0 ;
2340- err ++ ;
2341- }
2310+ err |= cfc_check_trigger_arg_is (& cmd -> convert_arg , 0 );
23422311 }
23432312
2344- if (cmd -> scan_end_arg != cmd -> chanlist_len ) {
2345- cmd -> scan_end_arg = cmd -> chanlist_len ;
2346- err ++ ;
2347- }
2313+ err |= cfc_check_trigger_arg_is (& cmd -> scan_end_arg , cmd -> chanlist_len );
2314+
23482315 if (cmd -> stop_src == TRIG_COUNT ) {
23492316 unsigned int max_count = 0x01000000 ;
23502317
23512318 if (boardtype .reg_type == ni_reg_611x )
23522319 max_count -= num_adc_stages_611x ;
2353- if (cmd -> stop_arg > max_count ) {
2354- cmd -> stop_arg = max_count ;
2355- err ++ ;
2356- }
2357- if (cmd -> stop_arg < 1 ) {
2358- cmd -> stop_arg = 1 ;
2359- err ++ ;
2360- }
2320+ err |= cfc_check_trigger_arg_max (& cmd -> stop_arg , max_count );
2321+ err |= cfc_check_trigger_arg_min (& cmd -> stop_arg , 1 );
23612322 } else {
23622323 /* TRIG_NONE */
2363- if (cmd -> stop_arg != 0 ) {
2364- cmd -> stop_arg = 0 ;
2365- err ++ ;
2366- }
2324+ err |= cfc_check_trigger_arg_is (& cmd -> stop_arg , 0 );
23672325 }
23682326
23692327 if (err )
@@ -3432,7 +3390,7 @@ static int ni_ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
34323390 if (err )
34333391 return 2 ;
34343392
3435- /* step 3: make sure arguments are trivially compatible */
3393+ /* Step 3: check if arguments are trivially valid */
34363394
34373395 if (cmd -> start_src == TRIG_EXT ) {
34383396 /* external trigger */
@@ -3441,48 +3399,27 @@ static int ni_ao_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s,
34413399 if (tmp > 18 )
34423400 tmp = 18 ;
34433401 tmp |= (cmd -> start_arg & (CR_INVERT | CR_EDGE ));
3444- if (cmd -> start_arg != tmp ) {
3445- cmd -> start_arg = tmp ;
3446- err ++ ;
3447- }
3402+ err |= cfc_check_trigger_arg_is (& cmd -> start_arg , tmp );
34483403 } else {
3449- if (cmd -> start_arg != 0 ) {
3450- /* true for both TRIG_NOW and TRIG_INT */
3451- cmd -> start_arg = 0 ;
3452- err ++ ;
3453- }
3404+ /* true for both TRIG_NOW and TRIG_INT */
3405+ err |= cfc_check_trigger_arg_is (& cmd -> start_arg , 0 );
34543406 }
3407+
34553408 if (cmd -> scan_begin_src == TRIG_TIMER ) {
3456- if (cmd -> scan_begin_arg < boardtype .ao_speed ) {
3457- cmd -> scan_begin_arg = boardtype .ao_speed ;
3458- err ++ ;
3459- }
3460- if (cmd -> scan_begin_arg > devpriv -> clock_ns * 0xffffff ) { /* XXX check */
3461- cmd -> scan_begin_arg = devpriv -> clock_ns * 0xffffff ;
3462- err ++ ;
3463- }
3464- }
3465- if (cmd -> convert_arg != 0 ) {
3466- cmd -> convert_arg = 0 ;
3467- err ++ ;
3468- }
3469- if (cmd -> scan_end_arg != cmd -> chanlist_len ) {
3470- cmd -> scan_end_arg = cmd -> chanlist_len ;
3471- err ++ ;
3472- }
3473- if (cmd -> stop_src == TRIG_COUNT ) { /* XXX check */
3474- if (cmd -> stop_arg > 0x00ffffff ) {
3475- cmd -> stop_arg = 0x00ffffff ;
3476- err ++ ;
3477- }
3478- } else {
3479- /* TRIG_NONE */
3480- if (cmd -> stop_arg != 0 ) {
3481- cmd -> stop_arg = 0 ;
3482- err ++ ;
3483- }
3409+ err |= cfc_check_trigger_arg_min (& cmd -> scan_begin_arg ,
3410+ boardtype .ao_speed );
3411+ err |= cfc_check_trigger_arg_max (& cmd -> scan_begin_arg ,
3412+ devpriv -> clock_ns * 0xffffff );
34843413 }
34853414
3415+ err |= cfc_check_trigger_arg_is (& cmd -> convert_arg , 0 );
3416+ err |= cfc_check_trigger_arg_is (& cmd -> scan_end_arg , cmd -> chanlist_len );
3417+
3418+ if (cmd -> stop_src == TRIG_COUNT )
3419+ err |= cfc_check_trigger_arg_max (& cmd -> stop_arg , 0x00ffffff );
3420+ else /* TRIG_NONE */
3421+ err |= cfc_check_trigger_arg_is (& cmd -> stop_arg , 0 );
3422+
34863423 if (err )
34873424 return 3 ;
34883425
@@ -3706,39 +3643,18 @@ static int ni_cdio_cmdtest(struct comedi_device *dev,
37063643 if (err )
37073644 return 2 ;
37083645
3709- /* step 3: make sure arguments are trivially compatible */
3710- if (cmd -> start_src == TRIG_INT ) {
3711- if (cmd -> start_arg != 0 ) {
3712- cmd -> start_arg = 0 ;
3713- err ++ ;
3714- }
3715- }
3716- if (cmd -> scan_begin_src == TRIG_EXT ) {
3717- tmp = cmd -> scan_begin_arg ;
3718- tmp &= CR_PACK_FLAGS (CDO_Sample_Source_Select_Mask , 0 , 0 ,
3719- CR_INVERT );
3720- if (tmp != cmd -> scan_begin_arg ) {
3721- err ++ ;
3722- }
3723- }
3724- if (cmd -> convert_src == TRIG_NOW ) {
3725- if (cmd -> convert_arg ) {
3726- cmd -> convert_arg = 0 ;
3727- err ++ ;
3728- }
3729- }
3646+ /* Step 3: check if arguments are trivially valid */
37303647
3731- if (cmd -> scan_end_arg != cmd -> chanlist_len ) {
3732- cmd -> scan_end_arg = cmd -> chanlist_len ;
3733- err ++ ;
3734- }
3648+ err |= cfc_check_trigger_arg_is (& cmd -> start_arg , 0 );
37353649
3736- if (cmd -> stop_src == TRIG_NONE ) {
3737- if (cmd -> stop_arg != 0 ) {
3738- cmd -> stop_arg = 0 ;
3739- err ++ ;
3740- }
3741- }
3650+ tmp = cmd -> scan_begin_arg ;
3651+ tmp &= CR_PACK_FLAGS (CDO_Sample_Source_Select_Mask , 0 , 0 , CR_INVERT );
3652+ if (tmp != cmd -> scan_begin_arg )
3653+ err |= - EINVAL ;
3654+
3655+ err |= cfc_check_trigger_arg_is (& cmd -> convert_arg , 0 );
3656+ err |= cfc_check_trigger_arg_is (& cmd -> scan_end_arg , cmd -> chanlist_len );
3657+ err |= cfc_check_trigger_arg_is (& cmd -> stop_arg , 0 );
37423658
37433659 if (err )
37443660 return 3 ;
0 commit comments