web-dev-qa-db-fra.com

Réinitialiser un périphérique PCI sous Linux

Y a-t-il une façon générique de réinitialiser un périphérique PCI sous Linux à partir de la ligne de commande? C'est-à-dire que le bus PCI émet une commande de réinitialisation.

12
Jonathan

selon - http://www.kernel.org/doc/documentation/abi/testing/sysfs-bus-pci Vous pouvez réinitialiser les fonctions individuelles du périphérique 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.
6
Andre Holzner

La chose la plus proche du bus PCI doit à une réinitialisation du niveau de l'appareil modifie l'état d'alimentation à D3 et à D3. Après le déchargement du pilote (il serait mauvais de réinitialiser le matériel de sous le pilote), vous pouvez utiliser setpci pour écrire aux registres de contrôle pour modifier l'état d'alimentation, mais je pense que cela se produit automatiquement lorsque vous déchargez. le conducteur.

5
psusi

Le problème avec les solutions ci-dessus est qu'ils nécessitent la coopérativité de l'appareil; Cependant, dans la plupart des scénarios, la raison de la réinitialisation est exactement sa non-coopérativité.

Cependant, comme il est décrit ici , il existe un autre moyen "plus difficile" de le réinitialiser sur le niveau PCI: nous le supprimons du bus PCI, puis l'insérez-la par un médicament.

Les marches:

  1. echo 1 >/sys/bus/pci/<pci-id-of-device>/remove. Nous pouvons trouver son identifiant PCI avec une commande lspci.
  2. echo 1 >/sys/bus/pci/rescan

J'ai ici un périphérique PCI de buggy, parfois une réinitialisation du niveau PCI, parfois ce trick-Readd-Readd le fixe. Je suis sur le point d'écrire un script pour le faire automatiquement. :-)