Add some useful scripts 01/3301/1
authorDamjan Marion <damarion@cisco.com>
Thu, 6 Oct 2016 14:53:32 +0000 (16:53 +0200)
committerDamjan Marion <damarion@cisco.com>
Thu, 6 Oct 2016 14:53:32 +0000 (16:53 +0200)
Change-Id: Ic7ae9b43020ab4d26214bfab71b19ee259771c52
Signed-off-by: Damjan Marion <damarion@cisco.com>
build-root/scripts/lsnet [new file with mode: 0755]
build-root/scripts/pci-nic-bind [new file with mode: 0755]
build-root/scripts/pci-nic-bind-to-kernel [new file with mode: 0755]

diff --git a/build-root/scripts/lsnet b/build-root/scripts/lsnet
new file mode 100755 (executable)
index 0000000..ed590e5
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+echo "PCI Address  MAC address       Device Name    Driver     State    Speed      Port Type"
+echo "============ ================= ============== ========== ======== ========== ===================="
+
+for f in /sys/class/net/*; do
+       dev=$(basename ${f})
+       if [ -e $f/device ] ; then
+               dev=$(basename ${f})
+               pci_addr=$(basename $(readlink $f/device))
+               mac=$(cat $f/address)
+               driver=$(basename $(readlink $f/device/driver))
+               oper=$(cat $f/operstate)
+               speed=$(sudo ethtool $dev | grep Speed | cut -d" " -f2)
+               port=$(ethtool $dev 2> /dev/null | sed -ne 's/.*Port: \(.*\)/\1/p')
+               printf "%-12s %-14s %-14s %-10s %-8s %-10s %-20s\n" $pci_addr $mac $dev $driver $oper $speed "$port"
+               # ethtool $dev | grep Port:
+       fi
+done
+
diff --git a/build-root/scripts/pci-nic-bind b/build-root/scripts/pci-nic-bind
new file mode 100755 (executable)
index 0000000..f3a0c26
--- /dev/null
@@ -0,0 +1,94 @@
+#!/bin/bash
+
+uio_drivers="igb_uio uio_pci_generic vfio-pci"
+tmpfile=$(mktemp)
+
+
+function bind_drv() {
+       addr=$1
+       modalias=$(cat $selection/modalias)
+       native_drv=$(modprobe -R $modalias)
+       array=()
+
+       for drv in $native_drv $uio_drivers; do
+               if [ -e /sys/bus/pci/drivers/$drv ]; then
+                       echo driver $drv
+                       drv_desc=$(modinfo $drv | grep description: | sed -e 's/.*:[[:space:]]\+//' )
+                       array+=("${drv}")
+                       array+=("${drv_desc}")
+               fi
+       done
+       dialog --backtitle "PCI NIC Bind Utility" \
+               --clear \
+               --menu "Select kernel driver" 18 100 12 \
+               "${array[@]}" 2> $tmpfile
+        retval=$?
+       selection=$(cat $tmpfile)
+       rm $tmpfile
+       if [ $retval -ne 0 ]; then
+               return
+       fi
+       vd=$(cat /sys/bus/pci/devices/${addr}/vendor /sys/bus/pci/devices/${addr}/device)
+       echo $addr | tee /sys/bus/pci/devices/${addr}/driver/unbind > /dev/null 2> /dev/null
+       echo $vd | tee /sys/bus/pci/drivers/${selection}/new_id > /dev/null 2> /dev/null
+       echo $addr | tee /sys/bus/pci/drivers/${selection}/bind > /dev/null 2> /dev/null
+}
+
+function find_pci_slot() {
+       addr=$1
+        [ ! "$(ls -A /sys/bus/pci/slots )" ] && echo "No PCI slot data" && return
+       for slot in $(find /sys/bus/pci/slots/* -maxdepth 0 -exec basename {} \;); do
+               slot_addr=$(cat /sys/bus/pci/slots/$slot/address)
+               if [[ "${addr}" == *"${slot_addr}"* ]]; then
+                       echo "PCI slot: ${slot}"
+                       return
+               fi
+       done
+       echo "Unknown PCI slot"
+}
+
+! type -ap dialog > /dev/null && echo "Please install dialog (apt-get install dialog)" && exit
+if [ $USER != "root" ] ; then
+echo "Restarting script with sudo..."
+       sudo $0 ${*}
+       exit
+fi
+
+cd /sys/bus/pci/devices
+
+while true; do
+       array=()
+       for addr in *; do
+               class=$(cat ${addr}/class)
+               if [ "$class" = "0x020000" ]; then
+                       name=$(lspci -s $addr | sed -e 's/.*: //')
+                       if [ -e "/sys/bus/pci/devices/$addr/driver" ]; then
+                               drv=$(basename $(readlink -f /sys/bus/pci/devices/$addr/driver))
+                       else
+                               drv=" "
+                       fi
+                       slot=$(find_pci_slot ${addr})
+                       array+=("${addr}")
+                       array+=("${drv}|${name}")
+                       array+=("${slot}")
+               fi
+       done
+
+       dialog --backtitle "PCI NIC Bind Utility" \
+               --item-help \
+               --clear \
+               --column-separator '|' \
+               --menu "Select NIC" 18 100 12 \
+               "${array[@]}" 2> $tmpfile
+
+       retval=$?
+       selection=$(cat $tmpfile)
+       rm $tmpfile
+       if [ $retval -ne 0 ]; then
+               exit
+       fi
+       bind_drv $selection
+done
+
+
+
diff --git a/build-root/scripts/pci-nic-bind-to-kernel b/build-root/scripts/pci-nic-bind-to-kernel
new file mode 100755 (executable)
index 0000000..3d8559e
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+# Bind all unused PCI devices bound to uio drivers
+# back to default kernel driver
+
+if [ $USER != "root" ] ; then
+       echo "Restarting script with sudo..."
+       sudo $0 ${*}
+       exit
+fi
+
+for f in /sys/bus/pci/drivers/{igb_uio,uio_pci_generic,vfio-pci}/*; do
+       [ -e ${f}/config ] || continue
+       fuser -s ${f}/config  && continue
+       echo 1 > ${f}/remove
+       removed=y
+done
+
+[ -n ${removed} ] && echo 1 > /sys/bus/pci/rescan