Skip to content

Instantly share code, notes, and snippets.

@hackman
Created November 14, 2021 23:56
Show Gist options
  • Save hackman/14312faee505dcd5639fbb0bb994ae81 to your computer and use it in GitHub Desktop.
Save hackman/14312faee505dcd5639fbb0bb994ae81 to your computer and use it in GitHub Desktop.
Script to reset a PCI device
#!/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