¿Hay una forma genérica de restablecer un dispositivo PCI en Linux desde la línea de comandos? Es decir, hacer que el bus PCI emita un comando de reinicio.
de acuerdo con http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci puede restablecer funciones individuales del dispositivo si eso es compatible:
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.
Lo más cercano que tiene el bus PCI a un restablecimiento de nivel de dispositivo es cambiar el estado de alimentación a D3 y volver a D0. Después de descargar el controlador (sería malo restablecer el hardware debajo del controlador), puede usar setpci
para escribir en los registros de control para cambiar el estado de alimentación, pero creo que esto sucede automáticamente cuando descarga el controlador.
Dado que un dispositivo PCI genérico no es conectable en caliente, no habrá forma de restablecerlo y hacer que el núcleo lo vuelva a enumerar.
Independientemente del tipo de problemas que intente resolver, seguramente hay una mejor manera que simplemente reiniciarlo.
El problema con las soluciones anteriores es que requieren la cooperatividad del dispositivo; sin embargo, en la mayoría de los escenarios, la razón para restablecerlo es exactamente su no cooperatividad.
Sin embargo, como se describe aquí , hay otra forma "más difícil" de restablecerlo en el nivel PCI: lo retiramos del bus PCI y luego lo volvemos a insertar mediante un nuevo escaneo.
Los pasos:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
. Podemos encontrar su ID PCI con unlspci
comando.echo 1 >/sys/bus/pci/rescan
Tengo aquí un dispositivo pci con errores, a veces restablecimiento de nivel PCI, a veces este truco de eliminación de lectura lo soluciona. Estoy a punto de escribir un guión para hacerlo automáticamente. :-)
fuente
00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
. Lo paso a VM a través de VFIO y después de reiniciar VM también tengo que reiniciar el host para que vuelva a funcionar, de lo contrario se detecta cualquier USB conectado, pero falla la comunicación.