Existe uma maneira genérica de redefinir um dispositivo PCI no Linux a partir da linha de comando? Ou seja, faça com que o barramento PCI emita um comando de redefinição.
de acordo com http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci, você pode redefinir funções individuais do dispositivo, se suportado:
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.
A coisa mais próxima que o barramento PCI tem de uma redefinição no nível do dispositivo é alterar o estado de energia para D3 e voltar para D0. Após descarregar o driver (seria ruim redefinir o hardware por baixo do driver), você pode setpci
escrever nos registros de controle para alterar o estado de energia, mas acredito que isso acontece automaticamente quando você descarrega o driver.
Como um dispositivo PCI genérico não é hotpluggable, não haverá uma maneira de redefini-lo e fazer com que o kernel o enumere novamente.
Qualquer que seja o tipo de problema que você esteja tentando resolver, certamente há uma maneira melhor do que simplesmente redefini-lo.
O problema com as soluções acima é que elas requerem a cooperatividade do dispositivo; no entanto, na maioria dos cenários, o motivo para redefini-lo é exatamente a sua não-cooperatividade.
No entanto, como é descrito aqui , existe outra maneira "mais difícil" de redefini-lo no nível PCI: nós o removemos do barramento PCI e, em seguida, reinserimos com uma nova varredura.
Os passos:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
. Podemos encontrar o seu ID PCI com umlspci
comando.echo 1 >/sys/bus/pci/rescan
Eu tenho aqui um dispositivo pci com bugs, às vezes redefinição no nível PCI, às vezes esse truque de remoção e leitura corrige. Estou prestes a escrever um script para fazê-lo automaticamente. :-)
fonte
00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
. Eu o passo para a VM através do VFIO e após a reinicialização da VM, também preciso reiniciar o host para fazê-lo funcionar novamente, caso contrário, qualquer USB conectado será detectado, mas a comunicação falhará.