Apakah ada cara umum untuk mereset perangkat PCI di Linux dari baris perintah? Artinya, menyebabkan bus PCI mengeluarkan perintah reset.
menurut http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci Anda dapat mengatur ulang fungsi masing-masing perangkat jika itu didukung:
What: /sys/bus/pci/devices/.../reset
Description:
Some devices allow an individual function to be reset
without affecting other functions in the same device.
For devices that have this support, a file named reset
will be present in sysfs. Writing 1 to this file
will perform reset.
Hal terdekat yang dimiliki bus PCI ke reset level perangkat adalah mengubah status daya ke D3 dan kembali ke D0. Setelah membongkar driver (akan menjadi buruk untuk mengatur ulang perangkat keras dari bawah driver), Anda dapat menggunakan setpci
untuk menulis ke register kontrol untuk mengubah status daya, tetapi saya percaya ini terjadi secara otomatis ketika Anda membongkar driver.
Karena perangkat PCI generik tidak hotpluggable, tidak akan ada cara untuk mengatur ulang dan meminta kernel untuk menghitung ulang.
Apa pun jenis masalah yang Anda coba selesaikan, pasti ada cara yang lebih baik daripada hanya meresetnya.
Masalah dengan solusi di atas adalah mereka membutuhkan kooperatifitas perangkat; Namun dalam sebagian besar skenario alasan untuk mengatur ulang itu justru karena tidak kooperatif.
Namun, seperti yang dijelaskan di sini , ada cara lain yang "lebih sulit" untuk meresetnya pada tingkat PCI: kami menghapusnya dari bus PCI dan kemudian memasukkannya kembali dengan pemindaian ulang.
Langkah langkah:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
. Kita dapat menemukan PCI ID-nya dengan sebuahlspci
perintah.echo 1 >/sys/bus/pci/rescan
Di sini saya punya perangkat pci buggy, kadang-kadang reset level PCI, kadang-kadang trik penghapusan-readd memperbaikinya. Saya akan menulis naskah untuk melakukannya secara otomatis. :-)
sumber
00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
. Saya meneruskannya ke VM melalui VFIO dan setelah VM reboot saya juga harus me-reboot host untuk membuatnya berfungsi lagi, jika tidak USB yang terhubung terdeteksi, tetapi komunikasi gagal.