Created
November 14, 2021 23:56
-
-
Save hackman/14312faee505dcd5639fbb0bb994ae81 to your computer and use it in GitHub Desktop.
Script to reset a PCI device
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
dev=$1 | |
if [[ -z $dev ]]; then | |
echo "Error: no device specified" | |
exit 1 | |
fi | |
if [[ ! -e /sys/bus/pci/devices/$dev ]]; then | |
dev="0000:$dev" | |
fi | |
if [[ ! -e /sys/bus/pci/devices/$dev ]]; then | |
echo "Error: device $dev not found" | |
exit 1 | |
fi | |
port=$(basename $(dirname $(readlink /sys/bus/pci/devices/$dev))) | |
if [ ! -e /sys/bus/pci/devices/$port ]; then | |
echo "Error: device $port not found" | |
exit 1 | |
fi | |
echo "Reseting $dev..." | |
echo 1 > /sys/bus/pci/devices/$dev/reset | |
sleep 1 | |
echo "Removing $dev..." | |
echo 1 > /sys/bus/pci/devices/$dev/remove | |
echo "Performing hot reset of port $port..." | |
bc=$(setpci -s $port BRIDGE_CONTROL) | |
echo "Bridge control:" $bc | |
setpci -s $port BRIDGE_CONTROL=$(printf "%04x" $(("0x$bc" | 0x40))) | |
sleep 0.01 | |
setpci -s $port BRIDGE_CONTROL=$bc | |
sleep 0.5 | |
echo "Rescanning bus..." | |
echo 1 > /sys/bus/pci/devices/$port/rescan |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment