summary refs log tree commit diff
diff options
context:
space:
mode:
authorRobert Günzler <r@gnzler.io>2022-11-18 17:53:33 +0100
committerRobert Günzler <r@gnzler.io>2022-11-18 18:38:21 +0100
commit251a730a0766851306bcff98560ef23568401822 (patch)
tree4f4e8406ee29fdf5057ec2c0af3321ee53542a6d
parent273f57260449a8247eb1e7ca640dba6af8a90ad2 (diff)
add bin/usbreset
-rwxr-xr-xbin/usbreset35
1 files changed, 35 insertions, 0 deletions
diff --git a/bin/usbreset b/bin/usbreset
new file mode 100755
index 0000000..093a502
--- /dev/null
+++ b/bin/usbreset
@@ -0,0 +1,35 @@
+#!/bin/sh
+
+set -e
+[ -n "$DEBUG" ] && set -x
+
+# check requirements
+for tool in awk fd; do
+	if ! command -v "$tool" >/dev/null; then
+		printf "%s: %s not installed but required\n" "$(basename "$0")" "$tool" >&2
+		exit 1
+	fi
+done
+
+if [ "$1" = "-h" ]; then
+	printf "usage: %s DEV_NODE\n\n" "$0"
+	exit 2
+fi
+
+dev_node=$1
+dev_node=$(basename "${dev_node}")
+
+serial=$(fd "${dev_node}" /sys/devices |
+	awk 'BEGIN{RS="/"} /usb/{print}' |
+	xargs -I{} cat /sys/bus/usb/devices/{}/serial)
+[ -z "${serial}" ] && exit 1
+
+bus=$(fd "${serial}" /sys/bus/pci/drivers/)
+[ -z "${bus}" ] && exit 1
+
+driver=$(dirname "${bus}")
+[ -z "${driver}" ] && exit 1
+
+printf "%s" "${serial}" | doas tee "${driver}/unbind" >/dev/null
+sleep 2
+printf "%s" "${serial}" | doas tee "${driver}/bind" >/dev/null