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