Skip to content
Snippets Groups Projects
Commit 2b344dab authored by Patrick Robbe's avatar Patrick Robbe
Browse files

Fix driver reload executable

parent 13b9dd88
No related branches found
No related tags found
No related merge requests found
......@@ -6,19 +6,15 @@ CACHE_PATH=/tmp/pcie40_reload.cache
# This command must be executed to reload the PCIe40 driver after an FPGA has been reprogrammed.
# _ The tool performs the following steps, in order:
RELOAD_MODULE=0
RELOAD_ALL=1
USE_CACHE=0
FLUSH_CACHE=0
QUIET=0
#ug`pcie40_reload.synopsis`
# *pcie40_reload* [-m] [-a] [-c] [-f] [-q]
# *pcie40_reload* [-c] [-f] [-q]
function usage {
echo "pcie40_reload [-m] [-a] [-c] [-f] [-q]" >&2
echo " -m reload kernel module" >&2
echo " -a reload all devices" >&2
echo "pcie40_reload [-c] [-f] [-q]" >&2
echo " -c always read cache" >&2
echo " -f always overwrite cache" >&2
echo " -q suppress dmesg output" >&2
......@@ -27,16 +23,6 @@ function usage {
while getopts "macfqh" opt; do
case $opt in
#ug`pcie40_reload.options`mod
# *-m*::
# Remove and then re-insert module into kernel (this is required after a driver update).
m) RELOAD_MODULE=1
;;
#ug`pcie40_reload.options`all
# *-a*::
# Reload all interface (by default only the interfaces where the FPGA has been reprogrammed are reloaded).
a) RELOAD_ALL=1
;;
#ug`pcie40_reload.options`cache
# *-c*::
# Take the device list from the local cache, if it exists. By default the cache is used only if no PCIe40 interface appears under sysfs. With this option the cache contents are used instead. This can be useful in case a reload was issued too early (while one FPGA was still being reprogrammed) and the corresponding sysfs nodes do not exist anymore.
......@@ -67,16 +53,6 @@ while getopts "macfqh" opt; do
esac
done
if [ "${RELOAD_MODULE}" -eq 0 ]; then
#INSTALLED_SRCVERSION=`modinfo -F srcversion pcie40`
LOADED_SRCVERSION=1
#if [ "${LOADED_SRCVERSION}" != "${INSTALLED_SRCVERSION}" ]; then
#echo "Warning: loaded module version does not match installed version, run \`pcie40_reload -m\` to use the installed module instead" >&2
#fi;
else
RELOAD_ALL=1
fi;
devs=($(find /sys/devices/pci0000\:* -name pcie40_interface -exec cat {} \; -exec echo -n ' ' \; -execdir pwd \; | sort -nr | cut -f 2 -d ' ' 2>/dev/null))
if [ -z "${devs}" ]; then
......@@ -109,7 +85,7 @@ fi
ok=1
pids_ctrl=
pids_dma=
pids_bar0=
pids_bar2=
......@@ -128,9 +104,6 @@ if_id=${#devs[@]}
for dev in ${devs[@]}; do
(( if_id -= 1 ))
if [ ${RELOAD_ALL} -eq 0 ] && [ -f "${dev}/pcie40_loaded" ] && [ $(< ${dev}/pcie40_loaded) -eq 1 ]; then
continue;
fi;
echo "PCIe40 interface ${if_id}:"
if [ $((if_id % 2)) -eq 0 ]; then
......@@ -146,21 +119,21 @@ for dev in ${devs[@]}; do
else
echo " BAR2 missing!"
fi
if [ -e /dev/pcie40_${if_id}_dma ]; then
echo " DMA used by:"
get_pids /dev/pcie40_${if_id}_dma pids_dma
else
echo " DMA missing!"
fi
fi
#if [ -e /dev/pcie40_${if_id}_ctrl ]; then
# echo " CTRL used by:"
# get_pids /dev/pcie40_${if_id}_ctrl pids_ctrl
#else
# echo " CTRL missing!"
#fi
done
#ug`pcie40_reload.steps`1
# . Terminates any process currently using the PCIe40 boards to be reloaded
if [ -n "$pids_bar0" ] || [ -n "$pids_bar2" ] || [ -n "$pids_ctrl" ]; then
if [ -n "$pids_bar0" ] || [ -n "$pids_bar2" ]; then
echo -n "Stopping processes... "
kill $pids_bar0 $pids_bar2 $pids_ctrl
kill $pids_bar0 $pids_bar2
echo OK
fi
......@@ -172,43 +145,37 @@ fi
devs_removed=
if [ ${RELOAD_MODULE} -eq 1 ]; then
sudo rmmod lhcb_pcie40 > /dev/null 2>&1
sudo rmmod pcie40
sudo insmod ${PCIE40_DRIVER_DIR}/pcie40.ko
else
for dev in ${devs[@]}; do
if [ ${RELOAD_ALL} -eq 0 ] && [ -f "${dev}/pcie40_loaded" ] && [ $(< ${dev}/pcie40_loaded) -eq 1 ]; then
continue;
fi;
sudo rmmod lhcb_pcie40 > /dev/null 2>&1
sudo rmmod pcie40
sudo insmod ${PCIE40_DRIVER_DIR}/pcie40.ko
for dev in ${devs[@]}; do
if [ ! -d "${dev}" ]; then
devs_removed="${dev} ${devs_removed}"
continue;
devs_removed="${dev} ${devs_removed}"
continue;
fi;
echo "Removing device ${dev}"
if [ -f "${dev}/device" ] && [ $(< ${dev}/device) = 0xce40 ]; then
if [ -e ${dev}/driver ]; then
echo " Driver: OK"
else
echo " Driver: NO"
fi;
echo 1 | sudo tee ${dev}/remove > /dev/null
devs_removed="${dev} ${devs_removed}"
if [ -e ${dev}/driver ]; then
echo " Driver: OK"
else
echo " Driver: NO"
fi;
echo 1 | sudo tee ${dev}/remove > /dev/null
devs_removed="${dev} ${devs_removed}"
fi;
done
done
for dev in ${devs_removed}; do
for dev in ${devs_removed}; do
echo "Reloading device ${dev}"
rp=`dirname ${dev}`
echo 1 | sudo tee ${rp}/rescan > /dev/null
if [ -e ${dev}/driver ]; then
echo " Driver: OK"
echo " Driver: OK"
else
echo " Driver: NO"
ok=0
echo " Driver: NO"
ok=0
fi;
done
fi;
done
if_id=${#devs[@]}
......@@ -239,13 +206,13 @@ for dev in ${devs[@]}; do
#ug`pcie40_reload.steps`4
# . Checks the presence of the DMA controllers
#echo -n " CTRL: "
#if [ -e /dev/pcie40_${if_id}_ctrl ]; then
# echo "OK"
#else
# echo "NO"
# ok=0
#fi
echo -n " DMA: "
if [ -e /dev/pcie40_${if_id}_dma ]; then
echo "OK"
else
echo "NO"
ok=0
fi
done
if [ "$ok" -eq 0 ] && [ ${QUIET} -eq 0 ]; then
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment