มีวิธีทั่วไปในการรีเซ็ตอุปกรณ์ PCI ใน Linux จากบรรทัดคำสั่งหรือไม่ นั่นคือทำให้บัส PCI ออกคำสั่งรีเซ็ต
มีวิธีทั่วไปในการรีเซ็ตอุปกรณ์ PCI ใน Linux จากบรรทัดคำสั่งหรือไม่ นั่นคือทำให้บัส PCI ออกคำสั่งรีเซ็ต
คำตอบ:
ตามhttp://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pciคุณสามารถรีเซ็ตฟังก์ชั่นแต่ละอย่างของอุปกรณ์หากรองรับ:
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.
สิ่งที่ใกล้เคียงที่สุดที่บัส PCI มีสำหรับการรีเซ็ตระดับอุปกรณ์กำลังเปลี่ยนสถานะพลังงานเป็น D3 และกลับไปเป็น D0 หลังจากการยกเลิกการโหลดไดรเวอร์ (จะเป็นการดีที่จะรีเซ็ตฮาร์ดแวร์ออกจากใต้ไดรเวอร์) คุณสามารถใช้setpci
เพื่อเขียนลงทะเบียนควบคุมเพื่อเปลี่ยนสถานะพลังงาน แต่ฉันเชื่อว่าสิ่งนี้จะเกิดขึ้นโดยอัตโนมัติเมื่อคุณยกเลิกการโหลดไดรเวอร์
เนื่องจากอุปกรณ์ PCI ทั่วไปไม่สามารถเสียบได้จึงไม่มีวิธีการรีเซ็ตและให้เคอร์เนลระบุอีกครั้ง
ไม่ว่าคุณจะพยายามแก้ไขปัญหาประเภทใดย่อมมีวิธีที่ดีกว่าการรีเซ็ต
ปัญหาเกี่ยวกับวิธีแก้ไขปัญหาข้างต้นคือต้องการความร่วมมือของอุปกรณ์ อย่างไรก็ตามในสถานการณ์ส่วนใหญ่เหตุผลในการรีเซ็ตมันเป็นสิ่งที่ไม่ใช่ความร่วมมือ
อย่างไรก็ตามตามที่อธิบายไว้ที่นี่มีอีกวิธี "ยากขึ้น" ในการรีเซ็ตในระดับ PCI: เราลบมันออกจากบัส PCI แล้วใส่กลับเข้าไปใหม่โดย rescan
ขั้นตอน:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
. เราสามารถค้นหา PCI ID ด้วยlspci
คำสั่งecho 1 >/sys/bus/pci/rescan
ฉันมีอุปกรณ์ pc buggy ที่นี่บางครั้งรีเซ็ตระดับ PCI บางครั้งเคล็ดลับการกำจัด readd นี้แก้ไขได้ ฉันกำลังจะเขียนสคริปต์เพื่อทำแบบอัตโนมัติ :-)
00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
ใช่ฉันแน่ใจว่ามันเป็นตัวควบคุม ฉันส่งต่อไปยัง VM ผ่าน VFIO และหลังจาก VM รีบูตฉันต้องรีบูตโฮสต์เพื่อให้ทำงานได้อีกครั้งมิฉะนั้นจะตรวจพบการเสียบ USB ใด ๆ แต่การสื่อสารล้มเหลว