Câu trả lời:
theo http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci bạn có thể đặt lại các chức năng riêng lẻ của thiết bị nếu được hỗ trợ:
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.
Điều gần nhất mà bus PCI có để thiết lập lại mức thiết bị là thay đổi trạng thái nguồn thành D3 và trở lại D0. Sau khi dỡ trình điều khiển (sẽ rất tệ khi đặt lại phần cứng từ bên dưới trình điều khiển), bạn có thể sử dụng setpci
để ghi vào các thanh ghi điều khiển để thay đổi trạng thái nguồn, nhưng tôi tin rằng điều này sẽ tự động xảy ra khi bạn dỡ trình điều khiển.
Vì một thiết bị PCI chung không thể cắm được, nên sẽ không có cách nào để thiết lập lại và yêu cầu nhân lại.
Bất kể loại vấn đề nào bạn đang cố gắng giải quyết, chắc chắn có một cách tốt hơn là chỉ đặt lại nó.
Vấn đề với các giải pháp trên là chúng đòi hỏi sự hợp tác của thiết bị; tuy nhiên trong hầu hết các kịch bản, lý do để thiết lập lại chính xác là sự không hợp tác của nó.
Tuy nhiên, như được mô tả ở đây , có một cách khác, "khó hơn" để đặt lại nó ở cấp độ PCI: chúng tôi xóa nó khỏi bus PCI và sau đó chèn lại bằng cách quét lại.
Các bước:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
. Chúng ta có thể tìm thấy ID PCI của nó bằng một lspci
lệnh.echo 1 >/sys/bus/pci/rescan
Tôi có ở đây một thiết bị pci bị lỗi, đôi khi thiết lập lại mức PCI, đôi khi thủ thuật gỡ bỏ này sửa chữa nó. Tôi sắp viết một kịch bản để thực hiện nó một cách tự động. :-)
00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
. Tôi chuyển nó cho VM thông qua VFIO và sau khi VM khởi động lại, tôi cũng phải khởi động lại máy chủ để làm cho nó hoạt động trở lại, nếu không, bất kỳ USB nào được cắm vào đều bị phát hiện, nhưng giao tiếp không thành công.