I am compiling a custom kernel under Ubuntu, and I ran into a problem that the kernel does not seem to where to look for the firmware. In Ubuntu 8.04, the firmware is tied to the kernel version in the same way as the driver modules. For example, the 2.6.24-24-generic kernel stores its kernel modules in:
/lib/modules/2.6.24-24-generic
and its firmware in:
/lib/firmware/2.6.24-24-generic
When I compile the Ubuntu 2.6.24-24 kernel according to " Alternative build method: Debian's old-fashioned path " I get the appropriate module directory and all my devices except those that require firmware, such as my Intel wireless card (ipw2200 module )
The kernel log shows, for example, that when ipw2200 tries to download firmware, the kernel subsystem that controls the firmware download cannot find it:
ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
errno-base.h defines this as:
#define ENOENT 2
(The function returning ENOENT places a minus sign in front of it.)
I tried to create a symbolic link in / lib / firmware where my kernel name was pointing to a shared directory 2.6.24-24, however this led to the same error. This firmware is not a GPL provided by Intel and is packaged by Ubuntu. I do not believe that it has a real binding to a specific version of the kernel. cmp shows that versions in different directories are identical.
So how does the kernel know where to look for firmware?
Update
I found this solution for the specific problem that I encountered, however, it no longer works, since Ubuntu deleted /etc/hotplug.d and no longer saves its firmware in /usr/lib/hotplug/firmware .
Update2
Several studies have received several more answers. Prior to version 92 udev , firmware_helper was a way to download firmware. Starting with udev 93, this program has been replaced by a script called firmware.sh, which provides identical functionality, as far as I can tell. Both of these files indicate the firmware path to /lib/firmware . Ubuntu still uses the binary /lib/udev/firmware_helper binary.
The name of the firmware file is passed by firmware_helper to the $FIRMWARE environment variable, which is combined with the /lib/firmware loop and used to download the firmware.
The actual request to download the firmware was made by the driver (ipw2200 in my case) using a system call:
request_firmware(..., "ipw2200-bss.fw", ...);
Now, somewhere between the driver calling request_firmware and firmware_helper looking at the $FIRMWARE environment variable, the kernel package name is added to the firmware name.
So who does this?