backports: add udev rules if required for backported firmware_class
authorLuis R. Rodriguez <mcgrof@do-not-panic.com>
Wed, 10 Apr 2013 11:35:26 +0000 (04:35 -0700)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 10 Apr 2013 20:26:50 +0000 (22:26 +0200)
Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
backport/Makefile.real
backport/scripts/backport_firmware_install.sh [new file with mode: 0755]
backport/udev/50-compat_firmware.rules [new file with mode: 0644]
backport/udev/compat_firmware.sh [new file with mode: 0755]
backport/udev/ubuntu/compat_firmware.sh [new file with mode: 0755]
gentree.py

index 35a1fb34c8778191c30561612f574ba6a039a651..8842778927faad225890b906c50ca060fadd4b43 100644 (file)
@@ -90,6 +90,7 @@ install: modules
        @./scripts/blacklist.sh $(KLIB)/ $(KLIB)/$(KMODDIR)
        @./scripts/compress_modules.sh $(KLIB)/$(KMODDIR)
        @./scripts/check_depmod.sh
+       @./scripts/backport_firmware_install.sh
        @/sbin/depmod -ae
        @echo
        @echo Your backported driver modules should be installed now.
@@ -97,4 +98,3 @@ install: modules
        @echo
 # FIXME:
 #      install/load/unload/... scripts?
-#      compat firmware class udev stuff
diff --git a/backport/scripts/backport_firmware_install.sh b/backport/scripts/backport_firmware_install.sh
new file mode 100755 (executable)
index 0000000..e4b9fb0
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+if [ -f /usr/bin/lsb_release ]; then
+       LSB_RED_ID=$(/usr/bin/lsb_release -i -s)
+else
+       LSB_RED_ID="Unknown"
+fi
+
+case $LSB_RED_ID in
+"Ubuntu")
+       mkdir -p /lib/udev/ /lib/udev/rules.d/
+       cp udev/ubuntu/compat_firmware.sh /lib/udev/
+       cp udev/50-compat_firmware.rules /lib/udev/rules.d/
+        ;;
+*)
+       mkdir -p /lib/udev/ /lib/udev/rules.d/
+       cp udev/compat_firmware.sh /lib/udev/
+       cp udev/50-compat_firmware.rules /lib/udev/rules.d/
+        ;;
+esac
+
diff --git a/backport/udev/50-compat_firmware.rules b/backport/udev/50-compat_firmware.rules
new file mode 100644 (file)
index 0000000..6473788
--- /dev/null
@@ -0,0 +1,4 @@
+# do not edit this file, it will be overwritten on update
+
+# compat_firmware-class requests, copies files into the kernel
+SUBSYSTEM=="compat_firmware", ACTION=="add", RUN+="compat_firmware.sh"
diff --git a/backport/udev/compat_firmware.sh b/backport/udev/compat_firmware.sh
new file mode 100755 (executable)
index 0000000..ef609e7
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/sh -e
+
+# This is ported from Ubuntu but ubuntu uses these directories which
+# other distributions don't care about:
+# FIRMWARE_DIRS="/lib/firmware/updates/$(uname -r) /lib/firmware/updates \
+#               /lib/firmware/$(uname -r) /lib/firmware"
+# If your distribution looks for firmware in other directories
+# feel free to extend this and add your own directory here.
+#
+FIRMWARE_DIRS="/lib/firmware"
+
+err() {
+       echo "$@" >&2
+       logger -t "${0##*/}[$$]" "$@" 2>/dev/null || true
+}
+
+if [ ! -e /sys$DEVPATH/loading ]; then
+       err "udev firmware loader misses sysfs directory"
+       exit 1
+fi
+
+for DIR in $FIRMWARE_DIRS; do
+       [ -e "$DIR/$FIRMWARE" ] || continue
+       echo 1 > /sys$DEVPATH/loading
+       cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
+       echo 0 > /sys$DEVPATH/loading
+       exit 0
+done
+
+echo -1 > /sys$DEVPATH/loading
+err "Cannot find  firmware file '$FIRMWARE'"
+mkdir -p /dev/.udev/firmware-missing
+file=$(echo "$FIRMWARE" | sed 's:/:\\x2f:g')
+ln -s -f "$DEVPATH" /dev/.udev/firmware-missing/$file
+exit 1
diff --git a/backport/udev/ubuntu/compat_firmware.sh b/backport/udev/ubuntu/compat_firmware.sh
new file mode 100755 (executable)
index 0000000..9d4659a
--- /dev/null
@@ -0,0 +1,29 @@
+#!/bin/sh -e
+
+FIRMWARE_DIRS="/lib/firmware/updates/$(uname -r) /lib/firmware/updates \
+               /lib/firmware/$(uname -r) /lib/firmware"
+
+err() {
+       echo "$@" >&2
+       logger -t "${0##*/}[$$]" "$@" 2>/dev/null || true
+}
+
+if [ ! -e /sys$DEVPATH/loading ]; then
+       err "udev firmware loader misses sysfs directory"
+       exit 1
+fi
+
+for DIR in $FIRMWARE_DIRS; do
+       [ -e "$DIR/$FIRMWARE" ] || continue
+       echo 1 > /sys$DEVPATH/loading
+       cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
+       echo 0 > /sys$DEVPATH/loading
+       exit 0
+done
+
+echo -1 > /sys$DEVPATH/loading
+err "Cannot find  firmware file '$FIRMWARE'"
+mkdir -p /dev/.udev/firmware-missing
+file=$(echo "$FIRMWARE" | sed 's:/:\\x2f:g')
+ln -s -f "$DEVPATH" /dev/.udev/firmware-missing/$file
+exit 1
index 199a2c97410f07d03370f83bc644f95a8b846ad7..476a3fc8267216b5d34c4161468e2b5d9e37595b 100755 (executable)
@@ -324,7 +324,7 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None,
     backport_files = [(x, x) for x in [
         'Kconfig', 'Makefile', 'Makefile.build', 'Makefile.kernel', '.gitignore',
         'Makefile.real', 'compat/', 'include/', 'kconfig/', 'defconfigs/',
-        'scripts/', '.blacklist.map',
+        'scripts/', '.blacklist.map', 'udev/',
     ]]
     if not args.git_revision:
         logwrite('Copy original source files ...')