For an external USB device, why does Linux require a firmware in addition to the driver?

From the Ubuntu Wiki:

Many devices have two essential software pieces that make them function in your operating system. The first is a working driver, which is the software that lets your system talk to the hardware. The second is firmware, which is usually a small piece of code that is uploaded directly to the device for it to function correctly. You can think of the firmware as a way of programming the hardware inside the device. In fact, in almost all cases firmware is treated like hardware in that it's a black box; there's no accompanying source code that is freely distributed with it.

and

The firmware is usually maintained by the company that develops the hardware device. In Windows land, firmware is usually a part of the driver you install. It's often not seen by the user. In Linux, firmware may be distributed from a number of sources. Some firmware comes from the Linux kernel sources. Others that have redistribution licenses come from upstream. Some firmware unfortunately do not have licenses allowing free redistribution.

Firmware has an important feature in common with BIOS software: it cannot update itself. It is completely closed source (as opposed to open source), can be re-installed via some procedure, but it can neither be inspected nor corrected by downstream users.


The main reason is that vendors want to be able to change the firmware of their USB devices after they launched the product, because...

  • ...the firmware might have been buggy
  • ...jurisdiction may change
  • ...the vendor wants to be able to support more features later
  • ...compatibility problems may arise in the field

Therefore, more and more USB devices are only equipped with a bootloader and require a firmware upload.