geninitrd/trunk/geninitrd

arekm cvs at pld-linux.org
Mon Aug 14 11:30:15 CEST 2006


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
 }
 


More information about the pld-cvs-commit mailing list