Binary Firmware Inventory for the Debian Linux 2.6.17 kernel

I count 58 more files with firmware that need to be removed if the Linux kernel is to legally stay in Debian main. This report is the basis of bug #383403 against linux-2.6. As each piece of firmware is removed from linux-2.6, it should (license permitting) pop up in firmware-nonfree.

Credits/thanks to:

I list a file as "apparently nondistributable" if a binary firmware blob is part of GPL'd driver code, and source for that blob is not available.

I list a file as "apparently ok for non-free" if a binary firmware blob is part of BSD-ish licensed driver code, and source for that blob is not available. Code also falls in this category if it has a license that grants nondiscrimintaing permission for redistribution, but not for modification ("redistr." in the table below). IMHLO, Debian gets into hazy legal territory if such a driver is built into a GPL'd (in aggregate) kernel. Distributing modules built from such code is probably OK for non-free.

In cases where the file itself has no copyright or license notice, I assume it follows the driver file that includes it or links to it. Note that this makes very generous assumptions that the people who put the firmware into the kernel had the rights to do so. There are many cases that look suspiciously like the firmware image was grabbed without permission, but I won't try to categorize and second-guess such cases here. Ownership and permission for these blobs should be researched and documented as they are submitted for firmware-nonfree. The firmware-nonfree maintainers look like they are on the right track so far.

This is not a new problem. Debian bug #242866 (April, 2004) was tagged "sarge-ignore" on the basis of a Debian GR. Unless another GR is passed, Debian must deal with this problem. Goswin summarized the situation nicely, although there is apparently room for disagreement. See also this LWN article (April, 2005) and its discussion.

Possible solutions to each of the 58 bugs, in order of desirability:

  1. Get the author to release source code to the firmware under a DFSG-free license
  2. Reverse engineer the needed firmware, and create a completely free driver
  3. Move the firmware to non-free, patching the driver to use request_firmware() (requires relicensing of erroneously GPL'd firmware to BSD-ish terms)
  4. Move the whole driver to non-free, without major patching (does not apply to GPL'd drivers, unless they are relicensed)
  5. Delete the driver and firmware entirely
Where (3) looks like the best realistic scenario, but will take longer than (4) or (5). Finally, etch could release without having this problem solved if Debian's Release Manager (RM) decides that this class of bugs is not Release Critical (RC), or if another General Resolution (GR) is passed mandating release despite the bugs. Steve L. has proposed just such a resolution, although I consider his spin on the situation indefensible. Here is how I would do it, without giving people a blank check to put sourceless software in Debian main, just because it happens to run on a different CPU from the one on which the rest of Debian runs.

Totals:

Relative to sarge, 13 new sourceless-firmware-contaminated files have found their way into Debian's Linux source tree. They are:

This is actually a managable list for study, modification, or (as a last resort) removal. For six of these files, the request_firmware() code is already written.

Apologies in advance if there are mistakes in this list. It's very easy to believe I missed or misinterpreted a few files. Send me mail if you find any mistakes, and I will correct them. If a Debian linux-2.6.18 package comes out that still has illegal and/or Debian-SC-violating firmware in it, expect me to post an update. (Note: the first cut at 2.6.18 has come out, apparently with major regressions on this topic, causing major flamage on Debian mailing lists. I hope to procrastinate the analysis long enough that an improved linux-2.6.18 source package will be created first.)

file with firmware use license source apparent status in Sargenotes
drivers/atm/atmsar11.data ambassador.c GPL nondistributable yes
drivers/atm/pca200e.data fore200e.c GPL nondistributable yes
drivers/atm/pca200e_ecd.data fore200e.c GPL nondistributable yes
drivers/atm/sba200e_ecd.data fore200e.c GPL nondistributable yes
drivers/char/drm/mga_ucode.h mga_warp.c BSD-ish ok for non-free yes
drivers/char/drm/r128_cce.c BSD-ish ok for non-free yes 6
drivers/char/drm/radeon_cp.c BSD-ish ok for non-free yes 6
drivers/char/dsp56k.c GPL nondistributable yes
drivers/char/ip2/fip_firm.h ip2base.c GPL nondistributable yes
drivers/char/ser_a2232fw.h ser_a2232.c BSD-ish ser_a2232fw.axfree yes
drivers/media/dvb/ttpci/av7110_hw.c GPLv2 see note free yes 8
drivers/media/dvb/ttusb-budget/dvb-ttusb-dspbootcode.hdvb-ttusb-budget.c GPL? nondistributable yes
drivers/media/video/dabfirmware.h dabusb.c GPLv2 already removed no
drivers/media/video/usbvideo/vicam.c GPLv2 nondistributable yes
drivers/net/acenic_firmware.h acenic.c GPLv2 already removed no
drivers/net/appletalk/cops_ffdrv.h cops.c use-only nondistributable yes
drivers/net/appletalk/cops_ltdrv.h cops.c use-only nondistributable yes
drivers/net/bnx2_fw.h bnx2.c GPL nondistributable no 9
drivers/net/cassini.h cassini.c GPLv2 nondistributable no
drivers/net/dgrs_firmware.c dgrs.c GPL already removed no
drivers/net/e100.c GPLv2 nondistributable no 10
drivers/net/hamradio/yam1200.h yam.c GPLv2 nondistributable yes
drivers/net/hamradio/yam9600.h yam.c GPLv2 nondistributable yes
drivers/net/ixp2000/ixp2400_rx.ucode ixpdev.c GPLv2 ixp2400_rx.uc free no 1
drivers/net/ixp2000/ixp2400_tx.ucode ixpdev.c GPLv2 ixp2400_tx.uc free no 1
drivers/net/myri_code.h myri_sbus.c GPL nondistributable yes
drivers/net/pcmcia/ositech.h smc91c92_cs.c GPL nondistributable yes
drivers/net/starfire_firmware.h starfire.c GPLv2 nondistributable no
drivers/net/tg3.c redistr. ok for non-free no 6
drivers/net/tokenring/3c359_microcode.h 3c359.c use-only nondistributable yes
drivers/net/tokenring/smctr_firmware.h smctr.c use-only already removed no
drivers/net/typhoon-firmware.h typhoon.c redistr. ok for non-free yes
drivers/net/wan/wanxlfw.inc_shipped wanxl.c GPLv2 wanxlfw.S free yes
drivers/net/wireless/atmel.c GPLv2 atmel.c free yes
drivers/scsi/53c700_d.h_shipped 53c700.c GPLv2 53c700.scr free yes
drivers/scsi/53c7xx_d.h_shipped 53c7xx.c GPLv2 53c7xx.scr free yes
drivers/scsi/advansys.c BSD-ish ok for non-free yes
drivers/scsi/aic7xxx/aic79xx_seq.h_shipped aic79xx_core.c BSD-ish aic79xx.seq free yes
drivers/scsi/aic7xxx/aic7xxx_seq.h_shipped aic7xxx_core.c BSD-ish aic7xxx.seq free yes
drivers/scsi/aic7xxx_old/aic7xxx_seq.c aic7xxx_old.c BSD-ish aic7xxx.seq free yes 1
drivers/scsi/ql1040_fw.h qla1280.c GPLv2 nondistributable no
drivers/scsi/ql12160_fw.h qla1280.c GPLv2 nondistributable yes
drivers/scsi/ql1280_fw.h qla1280.c GPLv2 nondistributable yes
drivers/scsi/qla2xxx/ql2100_fw.c ql2100.c redistr. ok for non-free no 3
drivers/scsi/qla2xxx/ql2200_fw.c ql2200.c redistr. ok for non-free no 3
drivers/scsi/qla2xxx/ql2300_fw.c ql2300.c redistr. ok for non-free no 3
drivers/scsi/qla2xxx/ql2322_fw.c ql2322.c redistr. ok for non-free no 3
drivers/scsi/qla2xxx/ql2400_fw.c ql2400.c redistr. ok for non-free no 3
drivers/scsi/qlogicpti_asm.c qlogicpti.c GPL nondistributable yes
drivers/scsi/sym53c8xx_2/sym_fw1.h sym_fw.c GPLv2 sym_fw1.h free yes 2
drivers/scsi/sym53c8xx_2/sym_fw2.h sym_fw.c GPLv2 sym_fw2.h free yes 2
drivers/usb/misc/emi26_fw.h emi26.h special ok for non-free yes 4
drivers/usb/misc/emi62_fw_m.h emi62.c GPLv2 already removed no
drivers/usb/misc/emi62_fw_s.h emi62.c GPLv2 already removed no
drivers/usb/net/kawethfw.h kaweth.c GPLv2 nondistributable yes
drivers/usb/serial/io_fw_boot2.h io_edgeport.c GPLv2 nondistributable yes
drivers/usb/serial/io_fw_boot.h io_edgeport.c GPLv2 nondistributable yes
drivers/usb/serial/io_fw_down2.h io_edgeport.c GPLv2 nondistributable yes
drivers/usb/serial/io_fw_down3.h io_ti.c GPLv2 nondistributable yes
drivers/usb/serial/io_fw_down.h io_edgeport.c GPLv2 nondistributable yes
drivers/usb/serial/keyspan_mpr_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_pda_fw.h keyspan_pda.c GPLv2 keyspan_pda.S free yes
drivers/usb/serial/keyspan_usa18x_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_usa19_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_usa19qi_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_usa19qw_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_usa19w_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_usa28_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_usa28xa_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_usa28xb_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_usa28x_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_usa49w_fw.h keyspan.h special already removed no 4
drivers/usb/serial/keyspan_usa49wlc_fw.h keyspan.h special already removed no 4
drivers/usb/serial/ti_fw_3410.h ti_usb_3410_5052.c GPLv2 nondistributable no
drivers/usb/serial/ti_fw_5052.h ti_usb_3410_5052.c GPLv2 nondistributable no
drivers/usb/serial/whiteheat_fw.h whiteheat.c GPLv2 nondistributable yes
drivers/usb/serial/xircom_pgs_fw.h keyspan_pda.c GPLv2 xircom_pgs.S free yes
sound/isa/sb/sb16/sb16_csp_codecs.h sb16_csp.c GPLv2 nondistributable yes
sound/isa/wavefront/wavefront_fx.c GPLv2 nondistributable yes
sound/oss/maestro3.h maestro3.c GPLv2 nondistributable yes 7
sound/oss/ymfpci_image.h ymfpci.c GPLv2 nondistributable yes 5
sound/oss/yss225.c wavfront.c GPLv2 nondistributable yes
sound/pci/cs46xx/cs46xx_image.h cs46xx_lib.c GPLv2 nondistributable yes
sound/pci/cs46xx/imgs/cwc4630.h cs46xx_lib.c GPLv2 nondistributable yes
sound/pci/cs46xx/imgs/cwcasync.h cs46xx_lib.c GPLv2 nondistributable yes
sound/pci/cs46xx/imgs/cwcdma.h cs46xx_lib.c GPLv2 nondistributable yes
sound/pci/cs46xx/imgs/cwcemb80.h cs46xx_lib.c GPLv2 nondistributable yes
sound/pci/cs46xx/imgs/cwcsnoop.h cs46xx_lib.c GPLv2 nondistributable yes
sound/pci/korg1212/korg1212-firmware.h korg1212.c GPLv2 nondistributable yes
sound/pci/maestro3.c GPLv2 nondistributable yes 7
sound/pci/ymfpci/ymfpci_image.h ymfpci_main.c GPLv2 nondistributable yes 5

Notes:

  1. I have been unable to regenerate this file from the claimed source
  2. firmware provided as CPP macros implementing an assembler
  3. request_firmware() code already in qla_os.c, but blobs take precedence; required file LICENSE.qla2xxx missing from source and binary
  4. redistributable as part of a Linux or other Open Source operating system kernel
  5. two copies of this file, in sound/oss/ and sound/pci/ymfpci/
  6. patch converting this to request_firmware() posted in Debian bug #242866
  7. two copies of this blob, in sound/oss/maestro3.h and sound/pci/maestro3.c
  8. source temporarily resides at http://castet.matthieu.free.fr/ttpci/Boot.S
  9. firmware is dual-licensed, GPL and BSD-ish; inherits GPL from bnx2.c, so in its current form the driver as a whole is nondistributable
  10. while e100.c appears in sarge, that version does not have any sourceless firmware; see also #390994

Drivers already using request_firmware:

Drivers that use the obsolete mod_firmware_load:
Larry Doolittle
October 1, 2006