Réponses:
selon http://www.kernel.org/doc/Documentation/ABI/testing/sysfs-bus-pci, vous pouvez réinitialiser les fonctions individuelles de l'appareil si cela est pris en charge:
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.
La chose la plus proche du bus PCI pour une réinitialisation au niveau du périphérique est de changer l'état d'alimentation en D3 et de revenir en D0. Après avoir déchargé le pilote (il serait mauvais de réinitialiser le matériel sous le pilote), vous pouvez utiliser setpci
pour écrire dans les registres de contrôle pour changer l'état d'alimentation, mais je pense que cela se produit automatiquement lorsque vous déchargez le pilote.
Puisqu'un périphérique PCI générique n'est pas connectable à chaud, il n'y aura pas de moyen de le réinitialiser et de le faire réénumérer par le noyau.
Quel que soit le type de problèmes que vous essayez de résoudre, il existe certainement un meilleur moyen que de simplement le réinitialiser.
Le problème avec les solutions ci-dessus est qu'elles nécessitent la coopérativité de l'appareil; cependant, dans la plupart des scénarios, la raison pour la réinitialiser est exactement sa non-coopérativité.
Cependant, comme il est décrit ici , il existe un autre moyen, "plus difficile" de le réinitialiser au niveau PCI: nous le supprimons du bus PCI, puis le réinsérons par une nouvelle analyse.
Les marches:
echo 1 >/sys/bus/pci/<pci-id-of-device>/remove
. Nous pouvons trouver son ID PCI avec une lspci
commande.echo 1 >/sys/bus/pci/rescan
J'ai ici un périphérique PCI buggé, parfois une réinitialisation au niveau PCI, parfois cette astuce de suppression de lecture le corrige. Je suis sur le point d'écrire un script pour le faire automatiquement. :-)
00:14.0 USB controller: Intel Corporation 200 Series/Z370 Chipset Family USB 3.0 xHCI Controller
. Je le passe à VM via VFIO et après le redémarrage de la VM, je dois également redémarrer l'hôte pour le faire fonctionner à nouveau, sinon tout USB branché est détecté, mais la communication échoue.