Author: arekm
Date: Mon Aug 14 11:30:08 2006
New Revision: 7669

Modified:
   geninitrd/trunk/geninitrd
Log:
Initial firmware loading capabilities.

Modified: geninitrd/trunk/geninitrd
==============================================================================
--- geninitrd/trunk/geninitrd   (original)
+++ geninitrd/trunk/geninitrd   Mon Aug 14 11:30:08 2006
@@ -656,6 +656,57 @@
        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 @@
                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 @@
                        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
 }
 
_______________________________________________
pld-cvs-commit mailing list
pld-cvs-commit@lists.pld-linux.org
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to