]> TLD Linux GIT Repositories - rc-scripts.git/blob - firmware-loader.sh
- never try to create luks volumes, it may lead to data loss, leave it to user
[rc-scripts.git] / firmware-loader.sh
1 #!/bin/sh
2 # Firmware loader.
3 # See also:
4 # https://www.kernel.org/doc/Documentation/firmware_class/README
5 # https://www.kernel.org/doc/Documentation/firmware_class/hotplug-script
6 set -e
7
8 # handle only firmware add requests
9 if [ "$SUBSYSTEM" != "firmware" ]; then
10         exit 0
11 fi
12 if [ "$ACTION" != "add" ]; then
13         exit 0
14 fi
15
16 FIRMWARE_DIRS="/lib/firmware/updates/$(uname -r) /lib/firmware/updates \
17                /lib/firmware/$(uname -r) /lib/firmware"
18
19 # @param string message
20 # @param int loglevel. defaults to "6" (info)
21 # Log levels can be:
22 # Name      String  Meaning
23 # KERN_EMERG    "0" Emergency messages, system is about to crash or is unstable
24 # KERN_ALERT    "1" Something bad happened and action must be taken immediately
25 # KERN_CRIT "2" A critical condition occurred like a serious hardware/software failure
26 # KERN_ERR  "3" An error condition, often used by drivers to indicate difficulties with the hardware
27 # KERN_WARNING  "4" A warning, meaning nothing serious by itself but might indicate problems
28 # KERN_NOTICE   "5" Nothing serious, but notably nevertheless. Often used to report security events.
29 # KERN_INFO "6" Informational message e.g. startup information at driver initialization
30 # KERN_DEBUG    "7" Debug messages
31 # KERN_CONT "c" "continued" line of log printout (only done after a line that had no enclosing \n)
32 kmsg() {
33     local msg="$1" level=${2:-3}
34     echo "<$level>$msg" > /dev/kmsg
35 }
36
37 err() {
38         echo >&2 "$*"
39         kmsg "${0##*/}[$$] $*"
40 }
41
42 if [ ! -e /sys$DEVPATH/loading ]; then
43         err "firmware loader misses sysfs directory"
44         exit 1
45 fi
46
47 for DIR in $FIRMWARE_DIRS; do
48         [ -e "$DIR/$FIRMWARE" ] || continue
49         echo 1 > /sys$DEVPATH/loading
50         cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
51         echo 0 > /sys$DEVPATH/loading
52         exit 0
53 done
54
55 echo -1 > /sys$DEVPATH/loading
56 err "Cannot find firmware file '$FIRMWARE'"
57 exit 1