162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci. ./eeh-functions.sh
562306a36Sopenharmony_ci
662306a36Sopenharmony_cieeh_test_prep # NB: may exit
762306a36Sopenharmony_ci
862306a36Sopenharmony_cipre_lspci=`mktemp`
962306a36Sopenharmony_cilspci > $pre_lspci
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci# record the devices that we break in here. Assuming everything
1262306a36Sopenharmony_ci# goes to plan we should get them back once the recover process
1362306a36Sopenharmony_ci# is finished.
1462306a36Sopenharmony_cidevices=""
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci# Build up a list of candidate devices.
1762306a36Sopenharmony_cifor dev in `ls -1 /sys/bus/pci/devices/ | grep '\.0$'` ; do
1862306a36Sopenharmony_ci	if ! eeh_can_break $dev ; then
1962306a36Sopenharmony_ci		continue;
2062306a36Sopenharmony_ci	fi
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	# Skip VFs for now since we don't have a reliable way to break them.
2362306a36Sopenharmony_ci	if [ -e "/sys/bus/pci/devices/$dev/physfn" ] ; then
2462306a36Sopenharmony_ci		echo "$dev, Skipped: virtfn"
2562306a36Sopenharmony_ci		continue;
2662306a36Sopenharmony_ci	fi
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	echo "$dev, Added"
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci	# Add to this list of device to check
3162306a36Sopenharmony_ci	devices="$devices $dev"
3262306a36Sopenharmony_cidone
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cidev_count="$(echo $devices | wc -w)"
3562306a36Sopenharmony_ciecho "Found ${dev_count} breakable devices..."
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cifailed=0
3862306a36Sopenharmony_cifor dev in $devices ; do
3962306a36Sopenharmony_ci	echo "Breaking $dev..."
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	if ! pe_ok $dev ; then
4262306a36Sopenharmony_ci		echo "Skipping $dev, Initial PE state is not ok"
4362306a36Sopenharmony_ci		failed="$((failed + 1))"
4462306a36Sopenharmony_ci		continue;
4562306a36Sopenharmony_ci	fi
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	if ! eeh_one_dev $dev ; then
4862306a36Sopenharmony_ci		failed="$((failed + 1))"
4962306a36Sopenharmony_ci	fi
5062306a36Sopenharmony_cidone
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciecho "$failed devices failed to recover ($dev_count tested)"
5362306a36Sopenharmony_cilspci | diff -u $pre_lspci -
5462306a36Sopenharmony_cirm -f $pre_lspci
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_citest "$failed" -eq 0
5762306a36Sopenharmony_ciexit $?
58