]> git.pld-linux.org Git - projects/geninitrd.git/commitdiff
Initial firmware loading capabilities.
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Mon, 14 Aug 2006 09:30:08 +0000 (09:30 +0000)
committerArkadiusz Miśkiewicz <arekm@maven.pl>
Mon, 14 Aug 2006 09:30:08 +0000 (09:30 +0000)
svn-id: @7669

geninitrd

index 56cdf9ae3dc114532363f9c3d448bb350fa1d474..9730c6e0a60ddcc7290cfc7809b3d95c6603b33c 100755 (executable)
--- a/geninitrd
+++ b/geninitrd
@@ -656,6 +656,57 @@ find_modules_for() {
        fi
 }
 
+firmware_install_module_pre() {
+       module="$1"
+       linuxrc="$2"
+       firmware_files="$3"
+
+       [ -n "$verbose" ] && echo "Adding Firmwares ($firmware_files) to initrd for module $module"
+       # firmware not yet installed
+       if [ ! -f "$MNTIMAGE/lib/firmware/firmware.sh" ]; then
+               mkdir -p $MNTIMAGE/lib/firmware
+cat << 'EOF' >> "$MNTIMAGE/lib/firmware/firmware.sh"
+#!/bin/sh -e
+
+FIRMWARE_DIRS="/lib/firmware"
+
+if [ ! -e /sys$DEVPATH/loading ]; then
+    echo "firmware loader misses sysfs directory" >&2
+    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
+echo "Cannot find  firmware file '$FIRMWARE'" >&2
+exit 1
+EOF
+       chmod 755 "$MNTIMAGE/lib/firmware/firmware.sh"
+       fi
+
+       for firmware in $firmware_files; do
+               inst "/lib/firmware/$firmware" "$MNTIMAGE/lib/firmware/$firmware"
+       done
+
+       echo "mount -t proc none /proc" >> "$linuxrc"
+       echo "mount -t sysfs none /sys" >> "$linuxrc"
+       echo -n "/lib/firmware/firmware.sh" > /proc/sys/kernel/hotplug
+}
+
+firmware_install_module_post() {
+       module="$1"
+       linuxrc="$2"
+       firmware_files="$3"
+       echo "umount /sys" >> "$linuxrc"
+       echo "umount /proc" >> "$linuxrc"
+}
+
 modules_install() {
        modules="$1"
 
@@ -678,8 +729,9 @@ modules_add_linuxrc() {
                module="`echo $mod | awk -F/ '{ $0=$NF } /'$modext'.*$/ { gsub(/'$modext'.*/, NIL, $0); } { print $0; }'`"
                options="`awk '{ if($1 == "options" && $2 == "'${module}'") { for(i=3;i<=NF;i++) printf("%s ",$i); }}' "$modulefile"`"
 
-               sleep_module=$(echo "${module}" | awk ' { gsub("-", "_", $0) } { print $0; } ')
-               sleep_var="$(eval echo \$MODULE_${sleep_module}_USLEEP)"
+               generic_module=$(echo "${module}" | awk ' { gsub("-", "_", $0) } { print $0; } ')
+               sleep_var="$(eval echo \$MODULE_${generic_module}_USLEEP)"
+           firmware_var="$(eval echo \$MODULE_${generic_module}_FIRMWARE)"
 
                if [ -n "$verbose" ]; then
                        echo -n "Loading module [$module] "
@@ -695,10 +747,16 @@ modules_add_linuxrc() {
                        fi
                fi
 
+               if [ -n "$firmware_var" ]; then
+                       firmware_install_module_pre "$module" "$linuxrc" "$firmware_var"
+               fi
                echo "$insmod /lib/modules/$kernel/$MODULE2 $options" >> "$linuxrc"
                if [ -n "${sleep_var}" ]; then
                        echo "usleep $sleep_var" >> "$linuxrc"
                fi
+               if [ -n "$firmware_var" ]; then
+                       firmware_install_module_post "$module" "$linuxrc" "$firmware_var"
+               fi
        done
 }
 
This page took 0.316071 seconds and 4 git commands to generate.