Restablecer un dispositivo PCI en Linux

12

¿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.

Jonathan
fuente

Respuestas:

6

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.
Andre Holzner
fuente
5

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 setpcipara escribir en los registros de control para cambiar el estado de alimentación, pero creo que esto sucede automáticamente cuando descarga el controlador.

psusi
fuente
1

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.


fuente
44
Estoy simulando un dispositivo PCI en QEMU y necesito restablecer su estado a medida que me desarrollo. Quería hacerlo desde dentro del huésped.
Jonathan
1
Tengo una tarjeta de circuito cerrado de televisión con errores, funciona, pero a veces muere con un defecto. Después de eso, todo el sistema debe reiniciarse, con un reinicio de PCI esto podría evitarse ... El sistema es estable, no daña, solo la entrada de video se queda en blanco, por lo que a veces es una mejor solución para reiniciar el PCI que reiniciar Toda la máquina todos los días. (especialmente si está a 8000 km de distancia de esa máquina durante 6 meses)
Gipsz Jakab
1

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:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. Podemos encontrar su ID PCI con un lspcicomando.
  2. 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. :-)

peterh - Restablece a Monica
fuente
Ugh Mi controlador USB todavía tiene errores, incluso después de este reinicio.
Chris
@ Chris ¿Estás seguro de que es el controlador y no un dispositivo?
Peter - Restablece a Mónica
Sí, estoy seguro de que es el controlador 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.
Chris