According to https://wiki.gentoo.org/wiki/Linux_firmware,
Linux firmware is a package distributed alongside the Linux kernel that contains firmware binary blobs necessary for partial or full functionality of certain hardware devices. These binary blobs are usually proprietary because some hardware manufacturers do not release source code necessary to build the firmware itself.
For example, my bluetooth pcie device requires linux-firmware/qca/htbtfw20.tlv
. Is this a kernel driver? Why the format .tlv
, and why some are .bin
? Generally kernel drivers are ELF executables.
Many hardware vendors make a secret in how their hardware work. That's why they hide some functions of their devices into closed source blobs. They distribute the blobs with their drivers.
These blobs are not executed by the OS, but are loaded into the hardware. After the blob is loaded, OS can manage the device using some driver.
In case of Bluetooth a generic Linux module, e.g.
btusb
, orhci_qca
in your case, is used for most of devices. The module detects the device, loads firmware and then it can use the device as any other one.It doesn't really matter how the file is called. It is chosen by a vendor.
Firmware is not exactly a driver. It is some code executed by a device that allows it to communicate with a driver.
Linux maintainers get firmware from vendors, or their drivers and accumulate the blobs in linux-firmware git.
Distribution maintainers, like Сanonical, pack this firmware into packages. In case of Ubuntu it is surprisingly
linux-firmware
package. It is made of the kernel linux-frimware git and updated from time to time.