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

fpga: altera-cvp: fix probing for multiple FPGAs on the bus

Currently registering CvP managers works only for first probed CvP
device, for all other devices it is refused due to duplicated chkcfg
sysfs entry:

fpga_manager fpga3: Altera CvP FPGA Manager @0000:0c:00.0 registered
sysfs: cannot create duplicate filename '/bus/pci/drivers/altera-cvp/chkcfg'
CPU: 0 PID: 3808 Comm: bash Tainted: G O 4.19.0-custom+ #5
Call Trace:
dump_stack+0x46/0x5b
sysfs_warn_dup+0x53/0x60
sysfs_add_file_mode_ns+0x16d/0x180
sysfs_create_file_ns+0x51/0x60
altera_cvp_probe+0x16f/0x2a0 [altera_cvp]
local_pci_probe+0x3f/0xa0
? pci_match_device+0xb1/0xf0
pci_device_probe+0x116/0x170
really_probe+0x21b/0x2c0
driver_probe_device+0x4b/0xe0
bind_store+0xcb/0x130
kernfs_fop_write+0xfd/0x180
__vfs_write+0x21/0x150
? selinux_file_permission+0xdc/0x130
vfs_write+0xa8/0x1a0
? find_vma+0xd/0x60
ksys_write+0x3d/0x90
do_syscall_64+0x44/0xf0
entry_SYSCALL_64_after_hwframe+0x44/0xa9
...
altera-cvp 0000:0c:00.0: Can't create sysfs chkcfg file
fpga_manager fpga3: fpga_mgr_unregister Altera CvP FPGA Manager @0000:0c:00.0

Move chkcfg creation to module init as suggested by Alan.

Signed-off-by: Anatolij Gustschin <agust@denx.de>
Acked-by: Alan Tull <atull@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Anatolij Gustschin and committed by
Greg Kroah-Hartman
30522a95 324fa64c

+24 -10
+24 -10
drivers/fpga/altera-cvp.c
··· 475 475 if (ret) 476 476 goto err_unmap; 477 477 478 - ret = driver_create_file(&altera_cvp_driver.driver, 479 - &driver_attr_chkcfg); 480 - if (ret) { 481 - dev_err(&pdev->dev, "Can't create sysfs chkcfg file\n"); 482 - fpga_mgr_unregister(mgr); 483 - goto err_unmap; 484 - } 485 - 486 478 return 0; 487 479 488 480 err_unmap: ··· 493 501 struct altera_cvp_conf *conf = mgr->priv; 494 502 u16 cmd; 495 503 496 - driver_remove_file(&altera_cvp_driver.driver, &driver_attr_chkcfg); 497 504 fpga_mgr_unregister(mgr); 498 505 if (conf->map) 499 506 pci_iounmap(pdev, conf->map); ··· 502 511 pci_write_config_word(pdev, PCI_COMMAND, cmd); 503 512 } 504 513 505 - module_pci_driver(altera_cvp_driver); 514 + static int __init altera_cvp_init(void) 515 + { 516 + int ret; 517 + 518 + ret = pci_register_driver(&altera_cvp_driver); 519 + if (ret) 520 + return ret; 521 + 522 + ret = driver_create_file(&altera_cvp_driver.driver, 523 + &driver_attr_chkcfg); 524 + if (ret) 525 + pr_warn("Can't create sysfs chkcfg file\n"); 526 + 527 + return 0; 528 + } 529 + 530 + static void __exit altera_cvp_exit(void) 531 + { 532 + driver_remove_file(&altera_cvp_driver.driver, &driver_attr_chkcfg); 533 + pci_unregister_driver(&altera_cvp_driver); 534 + } 535 + 536 + module_init(altera_cvp_init); 537 + module_exit(altera_cvp_exit); 506 538 507 539 MODULE_LICENSE("GPL v2"); 508 540 MODULE_AUTHOR("Anatolij Gustschin <agust@denx.de>");