[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[PATCH] firmware loading support



Here's an initial attempt at support for loading missing firmware from
removable media. Completly untested.

It supports media with the firmware provided in any of three ways:

1. in udebs
2. In debs, which are then installed into d-i as udebs, and are also stored 
   and installed into /target later to provide the firmware to the
   running system too. Also, if debs are used, apt-setup is changed to
   default to using non-free, so that apt can upgrade these debs later.
3. Plain firmware files without any packaging. A list of the files is
   provided so that users can go find the firmware and provide it this
   way as a fallback.

I anticipate we'll create and distribute images containing debs of 
all the relevant firmware from non-free. TBD

-- 
see shy jo
From d4e4660e415a02944d98395e8547ebcca1b141b7 Mon Sep 17 00:00:00 2001
From: Joey Hess <joey@kodama.kitenet.net>
Date: Sun, 22 Jun 2008 14:12:03 -0400
Subject: [PATCH] Add a modified copy of udev's firmware.agent, that records to /tmp/missing-firmware.

---
 packages/hw-detect/Makefile         |    3 +++
 packages/hw-detect/debian/changelog |    2 ++
 packages/hw-detect/firmware.agent   |   30 ++++++++++++++++++++++++++++++
 3 files changed, 35 insertions(+), 0 deletions(-)
 create mode 100755 packages/hw-detect/firmware.agent

diff --git a/packages/hw-detect/Makefile b/packages/hw-detect/Makefile
index 1b0ce1a..c5071e8 100644
--- a/packages/hw-detect/Makefile
+++ b/packages/hw-detect/Makefile
@@ -16,6 +16,7 @@ CFLAGS_ARCH = -DCPU_TEXT='"$(DEB_HOST_ARCH)"'
 bindir=$(DESTDIR)/bin/
 hpdir=$(DESTDIR)/etc/hotplug.d
 udevdir=$(DESTDIR)/etc/udev/rules.d
+udevlibdir=$(DESTDIR)/lib/udev
 didir=$(DESTDIR)/lib/debian-installer.d
 fidir=$(DESTDIR)/usr/lib/finish-install.d
 sharedir=$(DESTDIR)/usr/share/hw-detect/
@@ -40,6 +41,8 @@ ifeq ($(DEB_HOST_ARCH_OS),linux)
 	$(INSTALL) sysfs-update-devnames.sh $(bindir)/sysfs-update-devnames
 	$(INSTALL) -d $(udevdir)
 	$(INSTALL_DATA) net-hotplug.rules $(udevdir)/010_net-hotplug.rules
+	$(INSTALL) -d $(udevlibdir)
+	$(INSTALL) firmware.agent $(udevlibdir)
 	$(INSTALL) -d $(hpdir)/net
 	$(INSTALL) net-hotplug.sh $(hpdir)/net/hw-detect.hotplug
 	$(INSTALL) -d $(fidir)
diff --git a/packages/hw-detect/debian/changelog b/packages/hw-detect/debian/changelog
index 96b71a6..eb0dbd9 100644
--- a/packages/hw-detect/debian/changelog
+++ b/packages/hw-detect/debian/changelog
@@ -3,6 +3,8 @@ hw-detect (1.64) UNRELEASED; urgency=low
   * floppy-retriever renamed to media-retriever.
   * Change wording of question since drivers can now be loaded from other
     media than floppies.
+  * Add a modified copy of udev's firmware.agent, that records to
+    /tmp/missing-firmware.
 
  -- Joey Hess <joeyh@debian.org>  Fri, 20 Jun 2008 16:42:06 -0400
 
diff --git a/packages/hw-detect/firmware.agent b/packages/hw-detect/firmware.agent
new file mode 100755
index 0000000..53a2ea2
--- /dev/null
+++ b/packages/hw-detect/firmware.agent
@@ -0,0 +1,30 @@
+#!/bin/sh -e
+#
+# firmware loader agent
+#
+
+cd /lib/udev/
+. ./hotplug.functions
+
+if [ ! -e /sys/$DEVPATH/loading ]; then
+    mesg "/sys/$DEVPATH/ does not exist"
+    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
+
+# modification for d-i
+echo "$PHYSDEVDRIVER $FIRMWARE" >>/tmp/missing-firmware
+
+# the firmware was not found
+echo -1 > /sys/$DEVPATH/loading
+
+debug_mesg "Cannot find the $FIRMWARE firmware"
+exit 1
+
-- 
1.5.5.4

From 129b651ec9587db5290241d4b062e4d88ba51dc1 Mon Sep 17 00:00:00 2001
From: Joey Hess <joey@kodama.kitenet.net>
Date: Sun, 22 Jun 2008 15:06:05 -0400
Subject: [PATCH] Add check-missing-firmware.

---
 packages/hw-detect/Makefile                   |    1 +
 packages/hw-detect/debian/changelog           |    1 +
 packages/hw-detect/debian/hw-detect.templates |   13 ++++++++++++-
 packages/hw-detect/hw-detect.sh               |    2 ++
 4 files changed, 16 insertions(+), 1 deletions(-)

diff --git a/packages/hw-detect/Makefile b/packages/hw-detect/Makefile
index c5071e8..b30d227 100644
--- a/packages/hw-detect/Makefile
+++ b/packages/hw-detect/Makefile
@@ -43,6 +43,7 @@ ifeq ($(DEB_HOST_ARCH_OS),linux)
 	$(INSTALL_DATA) net-hotplug.rules $(udevdir)/010_net-hotplug.rules
 	$(INSTALL) -d $(udevlibdir)
 	$(INSTALL) firmware.agent $(udevlibdir)
+	$(INSTALL) check-missing-firmware.sh $(bindir)/check-missing-firmware
 	$(INSTALL) -d $(hpdir)/net
 	$(INSTALL) net-hotplug.sh $(hpdir)/net/hw-detect.hotplug
 	$(INSTALL) -d $(fidir)
diff --git a/packages/hw-detect/debian/changelog b/packages/hw-detect/debian/changelog
index eb0dbd9..bb29613 100644
--- a/packages/hw-detect/debian/changelog
+++ b/packages/hw-detect/debian/changelog
@@ -5,6 +5,7 @@ hw-detect (1.64) UNRELEASED; urgency=low
     media than floppies.
   * Add a modified copy of udev's firmware.agent, that records to
     /tmp/missing-firmware.
+  * Add check-missing-firmware.
 
  -- Joey Hess <joeyh@debian.org>  Fri, 20 Jun 2008 16:42:06 -0400
 
diff --git a/packages/hw-detect/debian/hw-detect.templates b/packages/hw-detect/debian/hw-detect.templates
index 5301467..cf31ef3 100644
--- a/packages/hw-detect/debian/hw-detect.templates
+++ b/packages/hw-detect/debian/hw-detect.templates
@@ -67,9 +67,20 @@ Default: false
 # :sl2:
 _Description: Load missing drivers from removable media?
  A driver for your hardware is not available. You may need
- to load drivers from removable media, such as a driver floppy.
+ to load drivers from removable media, such as a USB stick, or driver floppy.
  If you have such media available now, insert it, and continue.
 
+Template: hw-detect/load_firmware
+Type: boolean
+Default: false
+# :sl2:
+_Description: Load missing firmware from removable media?
+ Some of your hardware needs firmware files to operate. The firmware
+ can be loaded from removable media, such as a USB stick or floppy.
+ If you have such media available now, insert it, and continue.
+ .
+ The missing firmware files are: ${FILES}
+
 # Temporary template to force old behavior of loading IDE modules by default
 Template: hw-detect/load-ide
 Type: boolean
diff --git a/packages/hw-detect/hw-detect.sh b/packages/hw-detect/hw-detect.sh
index e46a9eb..0450024 100755
--- a/packages/hw-detect/hw-detect.sh
+++ b/packages/hw-detect/hw-detect.sh
@@ -497,6 +497,8 @@ if [ -n "$MISSING_MODULES_LIST" ]; then
 	log "Missing modules '$MISSING_MODULES_LIST"
 fi
 
+check-missing-firmware
+
 sysfs-update-devnames
 
 # Let userspace /dev tools rescan the devices
-- 
1.5.5.4

From 17fe38faff61460e0cd98a06a5fa8ca67f441255 Mon Sep 17 00:00:00 2001
From: Joey Hess <joey@kodama.kitenet.net>
Date: Sun, 22 Jun 2008 15:50:51 -0400
Subject: [PATCH] Add a post-base-installer hook to install firmware into /target.

---
 packages/hw-detect/Makefile                   |    3 +++
 packages/hw-detect/debian/changelog           |    1 +
 packages/hw-detect/debian/hw-detect.templates |    5 +++++
 packages/hw-detect/post-base-installer        |   23 +++++++++++++++++++++++
 4 files changed, 32 insertions(+), 0 deletions(-)
 create mode 100755 packages/hw-detect/post-base-installer

diff --git a/packages/hw-detect/Makefile b/packages/hw-detect/Makefile
index b30d227..1e45842 100644
--- a/packages/hw-detect/Makefile
+++ b/packages/hw-detect/Makefile
@@ -20,6 +20,7 @@ udevlibdir=$(DESTDIR)/lib/udev
 didir=$(DESTDIR)/lib/debian-installer.d
 fidir=$(DESTDIR)/usr/lib/finish-install.d
 sharedir=$(DESTDIR)/usr/share/hw-detect/
+postbaseinstallerdir=$(DESTDIR)/usr/lib/post-base-installer.d/
 
 INSTALL=install
 INSTALL_DATA = ${INSTALL} -m 644
@@ -44,6 +45,8 @@ ifeq ($(DEB_HOST_ARCH_OS),linux)
 	$(INSTALL) -d $(udevlibdir)
 	$(INSTALL) firmware.agent $(udevlibdir)
 	$(INSTALL) check-missing-firmware.sh $(bindir)/check-missing-firmware
+	$(INSTALL) -d $(postbaseinstallerdir)
+	$(INSTALL) post-base-installer $(postbaseinstallerdir)/50hw-detect
 	$(INSTALL) -d $(hpdir)/net
 	$(INSTALL) net-hotplug.sh $(hpdir)/net/hw-detect.hotplug
 	$(INSTALL) -d $(fidir)
diff --git a/packages/hw-detect/debian/changelog b/packages/hw-detect/debian/changelog
index bb29613..07dd412 100644
--- a/packages/hw-detect/debian/changelog
+++ b/packages/hw-detect/debian/changelog
@@ -6,6 +6,7 @@ hw-detect (1.64) UNRELEASED; urgency=low
   * Add a modified copy of udev's firmware.agent, that records to
     /tmp/missing-firmware.
   * Add check-missing-firmware.
+  * Add a post-base-installer hook to install firmware into /target.
 
  -- Joey Hess <joeyh@debian.org>  Fri, 20 Jun 2008 16:42:06 -0400
 
diff --git a/packages/hw-detect/debian/hw-detect.templates b/packages/hw-detect/debian/hw-detect.templates
index cf31ef3..a06b928 100644
--- a/packages/hw-detect/debian/hw-detect.templates
+++ b/packages/hw-detect/debian/hw-detect.templates
@@ -81,6 +81,11 @@ _Description: Load missing firmware from removable media?
  .
  The missing firmware files are: ${FILES}
 
+Template: base-installer/progress/hw-detect
+Type: text
+# :sl1:
+_Description: Installing firmware...
+
 # Temporary template to force old behavior of loading IDE modules by default
 Template: hw-detect/load-ide
 Type: boolean
diff --git a/packages/hw-detect/post-base-installer b/packages/hw-detect/post-base-installer
new file mode 100755
index 0000000..e214a61
--- /dev/null
+++ b/packages/hw-detect/post-base-installer
@@ -0,0 +1,23 @@
+#!/bin/sh
+set -e
+
+# install cached firmware debs
+if [ -d /var/cache/firmware ]; then
+	for deb in /var/cache/firmware/*.deb; do
+		if [ -f "$deb" ]; then
+			cp -a "$deb" /target/tmp
+			# TODO debconf passthrough
+			in-target dpkg -i "/tmp/$deb" || true
+			rm -f "/target/tmp/$deb"
+		fi
+	done
+fi
+
+# copy any loose firmware files to /target too
+if [ -d /lib/firmware ]; then
+	for f in /lib/firmware/*; do
+		if [ -e "$f" ]; then
+			cp -a "$f" /target/lib/firmware/
+		fi
+	done
+fi
-- 
1.5.5.4

From 0a1db82a5451f47dc203ae159459c26eca393dc9 Mon Sep 17 00:00:00 2001
From: Joey Hess <joey@kodama.kitenet.net>
Date: Sun, 22 Jun 2008 15:56:31 -0400
Subject: [PATCH] really add check-missing-firmware

---
 packages/hw-detect/check-missing-firmware.sh |   75 ++++++++++++++++++++++++++
 1 files changed, 75 insertions(+), 0 deletions(-)
 create mode 100755 packages/hw-detect/check-missing-firmware.sh

diff --git a/packages/hw-detect/check-missing-firmware.sh b/packages/hw-detect/check-missing-firmware.sh
new file mode 100755
index 0000000..121d1f1
--- /dev/null
+++ b/packages/hw-detect/check-missing-firmware.sh
@@ -0,0 +1,75 @@
+#!/bin/sh
+set -e
+. /usr/share/debconf/confmodule
+
+LOG=/tmp/missing-firmware
+NL="
+"
+
+read_log () {
+	modules=""
+	files=""
+	if [ -s "$LOG" ]; then
+		OLDIFS="$IFS"
+		IFS="$NL"
+		for line in $(cat $LOG); do
+			module="${line%% *}"
+			if [ -n "$module" ]; then
+				modules="$module $modules"
+			fi
+			file="${line#* }"
+			files="$file $files"
+		done
+		IFS="$OLDIFS"
+		rm -f $LOG
+	fi
+
+	if [ -n "$modules" ]; then
+		return 0
+	else
+		return 1
+	fi
+}
+
+ask_load_firmware () {
+	db_subst hw-detect/load_firmware FILES "$files"
+	db_input high hw-detect/load_firmware || true
+	db_go || true
+	db_get hw-detect/load_firmware
+	if [ "$RET" = true ]; then
+		return 0
+	else
+		return 1
+	fi
+}
+
+while read_log && ask_load_firmware; do
+	# try to load udebs (or debs)
+	if anna media-retriever; then
+		# copy any debs to a holding cache,
+		# for installation into /target later
+		if mountmedia drivers; then
+			mkdir -p /var/cache/firmware/
+			cp -a /media/*.deb /var/cache/firmware/ || true
+			umount /media || true
+		fi
+	fi
+
+	# also look for loose firmware files on the media
+	if mountmedia; then
+		for file in $(files); do
+			if [ -e "/media/$file" ]; then
+				mkdir -p /lib/firmware
+				rm -f "/lib/firmware/$file"
+				cp -a "/media/$file" /lib/firmware/ || true
+			fi
+		done
+		umount /media || true
+	fi
+
+	# remove and reload modules so they see the new firmware
+	for module in $(modules); do
+		modprobe -r $module || true
+		modprobe $module || true
+	done
+done
-- 
1.5.5.4

From 4b9856c6355f2f8bb07fa035c8eefb840b15836c Mon Sep 17 00:00:00 2001
From: Joey Hess <joey@kodama.kitenet.net>
Date: Sun, 22 Jun 2008 16:01:09 -0400
Subject: [PATCH] If firmware debs are installed, default apt-setup to using non-free.

This is so that apt can upgrade those debs.
---
 packages/hw-detect/debian/changelog    |    2 ++
 packages/hw-detect/post-base-installer |    6 ++++++
 2 files changed, 8 insertions(+), 0 deletions(-)

diff --git a/packages/hw-detect/debian/changelog b/packages/hw-detect/debian/changelog
index 07dd412..89b9bc0 100644
--- a/packages/hw-detect/debian/changelog
+++ b/packages/hw-detect/debian/changelog
@@ -7,6 +7,8 @@ hw-detect (1.64) UNRELEASED; urgency=low
     /tmp/missing-firmware.
   * Add check-missing-firmware.
   * Add a post-base-installer hook to install firmware into /target.
+  * If firmware debs are installed, default apt-setup to using non-free.
+    This is so that apt can upgrade those debs.
 
  -- Joey Hess <joeyh@debian.org>  Fri, 20 Jun 2008 16:42:06 -0400
 
diff --git a/packages/hw-detect/post-base-installer b/packages/hw-detect/post-base-installer
index e214a61..e5172e2 100755
--- a/packages/hw-detect/post-base-installer
+++ b/packages/hw-detect/post-base-installer
@@ -1,5 +1,6 @@
 #!/bin/sh
 set -e
+. /usr/share/debconf/confmodule
 
 # install cached firmware debs
 if [ -d /var/cache/firmware ]; then
@@ -9,10 +10,15 @@ if [ -d /var/cache/firmware ]; then
 			# TODO debconf passthrough
 			in-target dpkg -i "/tmp/$deb" || true
 			rm -f "/target/tmp/$deb"
+			need_nonfree=1
 		fi
 	done
 fi
 
+if [ "$need_nonfree" ]; then
+	db_set apt-setup/non-free true
+fi
+
 # copy any loose firmware files to /target too
 if [ -d /lib/firmware ]; then
 	for f in /lib/firmware/*; do
-- 
1.5.5.4

From 553a572f7beaac005b7b86b374e249bf48cb556b Mon Sep 17 00:00:00 2001
From: Joey Hess <joey@kodama.kitenet.net>
Date: Sun, 22 Jun 2008 17:55:35 -0400
Subject: [PATCH] mountmedia before running anna

This avoids a double-scan and mount of removable media, by getting it
mounted before calling anna. (Some ugliness resulted since anna will
generally unmount it.)
---
 packages/hw-detect/check-missing-firmware.sh |   12 +++++++-----
 1 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/packages/hw-detect/check-missing-firmware.sh b/packages/hw-detect/check-missing-firmware.sh
index 121d1f1..5e079ba 100755
--- a/packages/hw-detect/check-missing-firmware.sh
+++ b/packages/hw-detect/check-missing-firmware.sh
@@ -45,14 +45,16 @@ ask_load_firmware () {
 
 while read_log && ask_load_firmware; do
 	# try to load udebs (or debs)
-	if anna media-retriever; then
+	if mountmedia drivers; then
 		# copy any debs to a holding cache,
 		# for installation into /target later
-		if mountmedia drivers; then
-			mkdir -p /var/cache/firmware/
-			cp -a /media/*.deb /var/cache/firmware/ || true
-			umount /media || true
+		mkdir -p /var/cache/firmware/new/
+		cp -a /media/*.deb /var/cache/firmware/new/ || true
+		if anna media-retriever; then
+			mv /var/cache/firmware/new/* /var/cache/firmware
+			rmdir /var/cache/firmware/new
 		fi
+		umount /media || true
 	fi
 
 	# also look for loose firmware files on the media
-- 
1.5.5.4

Attachment: signature.asc
Description: Digital signature


Reply to: