Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

comedi: pcl812: Add sanity checks for I/O base address

The "pcl812" driver uses an admin-supplied configuration option
(`it->options[0]`) to configure the I/O port base address of various
analog/digital I/O ISA boards from Advantech, ADLINK, and ICP DAS. It
currently allows any base address to be configured but the hardware
devices only support base addresses (configured by on-board DIP
switches) from 0 or 0x200 (depending on the model) to 0x3F0 on 16-byte
boundaries.

Store the minimum supported I/O base addresses in the static board
information array elements and add a sanity check to ensure the device
is not configured at an unsupported base address.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Link: https://patch.msgid.link/20260130170416.49994-37-abbotti@mev.co.uk
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Ian Abbott and committed by
Greg Kroah-Hartman
c2454346 b5218a98

+21 -1
+21 -1
drivers/comedi/drivers/pcl812.c
··· 331 331 struct pcl812_board { 332 332 const char *name; 333 333 enum pcl812_boardtype board_type; 334 + unsigned short min_io_start; 334 335 int n_aichan; 335 336 int n_aochan; 336 337 unsigned int ai_ns_min; ··· 347 346 { 348 347 .name = "pcl812", 349 348 .board_type = BOARD_PCL812, 349 + .min_io_start = 0, 350 350 .n_aichan = 16, 351 351 .n_aochan = 2, 352 352 .ai_ns_min = 33000, ··· 357 355 .has_dio = 1, 358 356 }, { 359 357 .name = "pcl812pg", 358 + .min_io_start = 0, 360 359 .board_type = BOARD_PCL812PG, 361 360 .n_aichan = 16, 362 361 .n_aochan = 2, ··· 369 366 }, { 370 367 .name = "acl8112pg", 371 368 .board_type = BOARD_PCL812PG, 369 + .min_io_start = 0x200, 372 370 .n_aichan = 16, 373 371 .n_aochan = 2, 374 372 .ai_ns_min = 10000, ··· 380 376 }, { 381 377 .name = "acl8112dg", 382 378 .board_type = BOARD_ACL8112, 379 + .min_io_start = 0x200, 383 380 .n_aichan = 16, /* 8 differential */ 384 381 .n_aochan = 2, 385 382 .ai_ns_min = 10000, ··· 392 387 }, { 393 388 .name = "acl8112hg", 394 389 .board_type = BOARD_ACL8112, 390 + .min_io_start = 0x200, 395 391 .n_aichan = 16, /* 8 differential */ 396 392 .n_aochan = 2, 397 393 .ai_ns_min = 10000, ··· 404 398 }, { 405 399 .name = "a821pgl", 406 400 .board_type = BOARD_A821, 401 + .min_io_start = 0, 407 402 .n_aichan = 16, /* 8 differential */ 408 403 .n_aochan = 1, 409 404 .ai_ns_min = 10000, ··· 414 407 }, { 415 408 .name = "a821pglnda", 416 409 .board_type = BOARD_A821, 410 + .min_io_start = 0, 417 411 .n_aichan = 16, /* 8 differential */ 418 412 .ai_ns_min = 10000, 419 413 .rangelist_ai = &range_pcl813b_ai, ··· 422 414 }, { 423 415 .name = "a821pgh", 424 416 .board_type = BOARD_A821, 417 + .min_io_start = 0, 425 418 .n_aichan = 16, /* 8 differential */ 426 419 .n_aochan = 1, 427 420 .ai_ns_min = 10000, ··· 432 423 }, { 433 424 .name = "a822pgl", 434 425 .board_type = BOARD_ACL8112, 426 + .min_io_start = 0, 435 427 .n_aichan = 16, /* 8 differential */ 436 428 .n_aochan = 2, 437 429 .ai_ns_min = 10000, ··· 443 433 }, { 444 434 .name = "a822pgh", 445 435 .board_type = BOARD_ACL8112, 436 + .min_io_start = 0, 446 437 .n_aichan = 16, /* 8 differential */ 447 438 .n_aochan = 2, 448 439 .ai_ns_min = 10000, ··· 454 443 }, { 455 444 .name = "a823pgl", 456 445 .board_type = BOARD_ACL8112, 446 + .min_io_start = 0, 457 447 .n_aichan = 16, /* 8 differential */ 458 448 .n_aochan = 2, 459 449 .ai_ns_min = 8000, ··· 465 453 }, { 466 454 .name = "a823pgh", 467 455 .board_type = BOARD_ACL8112, 456 + .min_io_start = 0, 468 457 .n_aichan = 16, /* 8 differential */ 469 458 .n_aochan = 2, 470 459 .ai_ns_min = 8000, ··· 476 463 }, { 477 464 .name = "pcl813", 478 465 .board_type = BOARD_PCL813, 466 + .min_io_start = 0, 479 467 .n_aichan = 32, 480 468 .rangelist_ai = &range_pcl813b_ai, 481 469 }, { 482 470 .name = "pcl813b", 483 471 .board_type = BOARD_PCL813B, 472 + .min_io_start = 0, 484 473 .n_aichan = 32, 485 474 .rangelist_ai = &range_pcl813b_ai, 486 475 }, { 487 476 .name = "acl8113", 488 477 .board_type = BOARD_ACL8113, 478 + .min_io_start = 0x200, 489 479 .n_aichan = 32, 490 480 .rangelist_ai = &range_acl8113_1_ai, 491 481 }, { 492 482 .name = "iso813", 493 483 .board_type = BOARD_ISO813, 484 + .min_io_start = 0, 494 485 .n_aichan = 32, 495 486 .rangelist_ai = &range_iso813_1_ai, 496 487 }, { 497 488 .name = "acl8216", 498 489 .board_type = BOARD_ACL8216, 490 + .min_io_start = 0x200, 499 491 .n_aichan = 16, /* 8 differential */ 500 492 .n_aochan = 2, 501 493 .ai_ns_min = 10000, ··· 513 495 }, { 514 496 .name = "a826pg", 515 497 .board_type = BOARD_ACL8216, 498 + .min_io_start = 0, 516 499 .n_aichan = 16, /* 8 differential */ 517 500 .n_aochan = 2, 518 501 .ai_ns_min = 10000, ··· 1157 1138 if (!devpriv) 1158 1139 return -ENOMEM; 1159 1140 1160 - ret = comedi_request_region(dev, it->options[0], 0x10); 1141 + ret = comedi_check_request_region(dev, it->options[0], 0x10, 1142 + board->min_io_start, 0x3ff, 16); 1161 1143 if (ret) 1162 1144 return ret; 1163 1145