#!/bin/sh
-# Copyright (C) 2008, 2009 Alexandre Oliva <lxoliva@fsfla.org>
+# Copyright (C) 2008, 2009, 2010, 2011, 2012
+# Alexandre Oliva <lxoliva@fsfla.org>
# Copyright (C) 2008 Jeff Moe
+# Copyright (C) 2009 Rubén Rodríguez <ruben@gnu.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# See also:
# http://wiki.debian.org/KernelFirmwareLicensing
# svn://svn.debian.org/kernel/dists/trunk/linux-2.6/debian/patches/debian/dfsg/files-1
-# http://svn.gnewsense.svnhopper.net/gnewsense/builder/trunk/firmware/firmware-removed
-# http://svn.gnewsense.svnhopper.net/gnewsense/builder/trunk/gen-kernel
+# http://wiki.gnewsense.org/Builder gen-kernel
# Thanks to Brian Brazil @ gnewsense
# For each kver release, start extra with an empty string, then count
# from 1 if changes are needed that require rebuilding the tarball.
-kver=2.6.28 extra=3
-
-fatal () {
- echo "$@"
- exit 1
-}
+kver=2.6.28 extra=5++
case $1 in
---force) die () { echo ERROR: "$@": ignored >&2; }; forced=:; shift;;
-*) die () { fatal "$@"; }; forced=false;;
+--force)
+ echo "WARNING: Using the force, ignored errors will be" >&2
+ die () {
+ echo ERROR: "$@" >&2
+ errors=:
+ }
+ forced=: errors=false
+ shift
+ ;;
+*)
+ die () {
+ echo ERROR: "$@" >&2
+ echo Use --force to ignore
+ exit 1
+ }
+ forced=false errors=false
+ ;;
esac
check=`echo "$0" | sed 's,[^/]*$,,;s,^$,.,;s,/*$,,'`/deblob-check
have_check=:
fi
+filetest () {
+ if [ ! -f $1 ]; then
+ die $1 does not exist, something is wrong && return 1
+ fi
+}
+
announce () {
- echo
- echo "$@"
+ echo
+ echo "$@"
}
clean_file () {
- #$1 = filename
- if test ! -f $1; then
- die $1 does not exist, something is wrong
- fi
- rm $1
- echo $1: removed
+ #$1 = filename
+ filetest $1 || return
+ rm $1
+ echo $1: removed
}
check_changed () {
- if test ! -f $1; then
- die $1 does not exist, something is wrong
- elif cmp $1.deblob $1 > /dev/null; then
- die $1 did not change, something is wrong
- fi
- mv $1.deblob $1
+ #$1 = filename
+ if cmp $1.deblob $1 > /dev/null; then
+ rm $1.deblob
+ die $1 did not change, something is wrong && return 1
+ fi
+ mv $1.deblob $1
}
clean_blob () {
- #$1 = filename
- if $have_check; then
- if test ! -f $1; then
- die $1 does not exist, something is wrong
- fi
- name=$1
- set fnord "$@" -d
- shift 2
- $check "$@" -i linux-$kver $name > $name.deblob
- echo $name: removed blobs
- check_changed $name
- else
- clean_file $1
- fi
+ #$1 = filename
+ filetest $1 || return
+ if $have_check; then
+ name=$1
+ set fnord "$@" -d
+ shift 2
+ $check "$@" -i linux-$kver $name > $name.deblob
+ check_changed $name && echo $name: removed blobs
+ else
+ clean_file $1
+ fi
}
dummy_blob () {
- #$1 = filename
- if test -f $1; then
- die $1 exists, something is wrong
- elif test ! -f firmware/Makefile; then
- die firmware/Makefile does not exist, something is wrong
- fi
-
- clean_sed "s,`echo $1 | sed s,^firmware/,,`,\$(DEBLOBBED),g" \
- firmware/Makefile "dropped $1"
+ #$1 = filename
+ if test -f $1; then
+ die $1 exists, something is wrong && return
+ elif test ! -f firmware/Makefile; then
+ die firmware/Makefile does not exist, something is wrong && return
+ fi
+
+ clean_sed "s,`echo $1 | sed s,^firmware/,,`,\$(DEBLOBBED),g" \
+ firmware/Makefile "dropped $1"
}
clean_fw () {
- #$1 = firmware text input, $2 = firmware output
- if test ! -f $1; then
- die $1 does not exist, something is wrong
- elif test -f $2; then
- die $2 exists, something is wrong
- fi
- clean_blob $1 -s 4
- dummy_blob $2
+ #$1 = firmware text input, $2 = firmware output
+ filetest $1 || return
+ if test -f $2; then
+ die $2 exists, something is wrong && return
+ fi
+ clean_blob $1 -s 4
+ dummy_blob $2
}
drop_fw_file () {
- #$1 = firmware text input, $2 = firmware output
- if test ! -f $1; then
- die $1 does not exist, something is wrong
- elif test -f $2; then
- die $2 exists, something is wrong
- fi
- clean_file $1
- dummy_blob $2
+ #$1 = firmware text input, $2 = firmware output
+ filetest $1 || return
+ if test -f $2; then
+ die $2 exists, something is wrong && return
+ fi
+ clean_file $1
+ dummy_blob $2
}
clean_kconfig () {
- #$1 = filename $2 = things to remove
- case $1 in
- -f)
- shift
- ;;
- *)
- if $have_check; then
- return
- fi
- ;;
- esac
- sed "/^config \\($2\\)\$/{p;i\
+ #$1 = filename $2 = things to remove
+ case $1 in
+ -f)
+ shift
+ ;;
+ *)
+ if $have_check; then
+ return
+ fi
+ ;;
+ esac
+ filetest $1 || return
+ sed "/^config \\($2\\)\$/{p;i\
depends on NONFREE
d;}" $1 > $1.deblob
- echo $1: marked config $2 as depending on NONFREE
- check_changed $1
+ check_changed $1 && echo $1: marked config $2 as depending on NONFREE
}
clean_mk () {
- #$1 = config $2 = Makefile name
- # We don't clean up Makefiles any more --lxoliva
- # sed -i "/\\($1\\)/d" $2
- # echo $2: removed $1 support
- # check_changed $2
- if sed -n "/\\($1\\)/p" $2 | grep . > /dev/null; then
- :
- else
- die $2 does not contain matches for $1
- fi
+ #$1 = config $2 = Makefile name
+ # We don't clean up Makefiles any more --lxoliva
+ # sed -i "/\\($1\\)/d" $2
+ # echo $2: removed $1 support
+ # check_changed $2
+ filetest $2 || return
+ if sed -n "/\\($1\\)/p" $2 | grep . > /dev/null; then
+ :
+ else
+ die $2 does not contain matches for $1
+ fi
}
clean_sed () {
- #$1 = sed-script $2 = file $3 = comment
- sed -e "$1" "$2" > "$2".deblob
- echo $2: ${3-applied sed script $1}
- check_changed "$2"
+ #$1 = sed-script $2 = file $3 = comment
+ filetest $2 || return
+ sed -e "$1" "$2" > "$2".deblob || {
+ die $2: failed: ${3-applied sed script $1} && return 1; }
+ check_changed $2 && echo $2: ${3-applied sed script $1}
}
reject_firmware () {
- #$1 = file
- clean_sed '
+ #$1 = file $2 = pre sed pattern
+ filetest $1 || return
+ clean_sed "$2"'
s,request\(_ihex\)\?_firmware\(_nowait\)\?,reject_firmware\2,g
' "$1" 'disabled non-Free firmware-loading machinery'
}
+maybe_reject_firmware () {
+ #$1 = file $2 = pre sed pattern
+ filetest $1 || return
+ clean_sed "$2"'
+s,request_firmware\(_nowait\)\?,maybe_reject_firmware\1,g
+' "$1" 'retain Free firmware-loading machinery, disabling non-Free one'
+}
+
undefine_macro () {
#$1 - macro name
#$2 - substitution
macro=$1 repl=$2 msg=$3; shift 3
for f in "$@"; do
clean_sed "
- s,^#define $macro .*\$,/*(DEBLOBBED)*/,;
- s,$macro,$repl,g;
+s,^#define $macro .*\$,/*(DEBLOBBED)*/,;
+s,$macro,$repl,g;
" "$f" "$msg"
done
}
sound/pci/cs46xx/imgs/cwcdma.asp \
; do
if test ! $f; then
- die $f is not present, something is amiss
+ die $f is not present, something is amiss && return
fi
done
# Identify the tarball.
-clean_sed "
-s,^EXTRAVERSION.*,&-libre$extra,
+grep -q 'EXTRAVERSION.*-libre' Makefile ||
+clean_sed "s,^EXTRAVERSION.*,&-libre$extra,
" Makefile 'added -libre to EXTRAVERSION'
-# Add reject_firmware and maybe_reject_firmware
+grep -q Linux-libre README ||
clean_sed '
-$i\
+1,3 s,Linux kernel release.*kernel\.org.*,Linux-libre <http://linux-libre.fsfla.org>,
+2,5 s,Linux version 2.6,Linux-libre,
+1,20 s,\(operating system \)\?Unix,Unix kernel,
+/WHAT IS LINUX/i\
+WHAT IS Linux-libre?\
+\
+ Linux-libre is a Free version of the kernel Linux (see below),\
+ suitable for use with the GNU Operating System in 100% Free\
+ GNU/Linux-libre System Distributions.\
+ http://www.gnu.org/distros/\
+\
+ It removes non-Free components from Linux, that are disguised as\
+ source code or distributed in separate files. It also disables\
+ run-time requests for non-Free components, shipped separately or as\
+ part of Linux, and documentation pointing to them, so as to avoid\
+ (Free-)baiting users into the trap of non-Free Software.\
+ http://www.fsfla.org/anuncio/2010-11-Linux-2.6.36-libre-debait\
+\
+ Linux-libre started within the gNewSense GNU/Linux distribution.\
+ It was later adopted by Jeff Moe, who coined its name, and in 2008\
+ it became a project maintained by FSF Latin America.\
+\
+ The Linux-libre project takes a minimal-changes approach to cleaning\
+ up Linux, making no effort to substitute components that need to be\
+ removed with functionally equivalent Free ones. Nevertheless, we\
+ encourage and support efforts towards doing so.\
+ http://libreplanet.org/wiki/LinuxLibre:Devices_that_require_non-free_firmware\
+\
+ Our mascot is Freedo, a light-blue penguin that has just come out\
+ of the shower. Although we like penguins, GNU is a much greater\
+ contribution to the entire system, so its mascot deserves more\
+ promotion. See our web page for their images.\
+ http://linux-libre.fsfla.org/\
+
+' README 'added blurb about Linux-libre'
+
+# Add reject_firmware and maybe_reject_firmware
+grep -q _LINUX_LIBRE_FIRMWARE_H include/linux/firmware.h ||
+clean_sed '$i\
#ifndef _LINUX_LIBRE_FIRMWARE_H\
#define _LINUX_LIBRE_FIRMWARE_H\
\
announce DRM_R128 - "ATI Rage 128"
clean_sed '
-/^static int r128_do_init_cce([^;]*$/,/^}$/{
- /^ r128_cce_load_microcode(dev_priv);$/{
- i\
- DRM_ERROR("Missing Free microcode!\\n");\
- dev->dev_private = (void *)dev_priv;\
- r128_do_cleanup_cce(dev);\
- return -EINVAL;
- }
-}' drivers/gpu/drm/r128/r128_cce.c 'report missing Free microcode'
+/^static void r128_cce_load_microcode(drm_r128_private_t \* dev_priv)/i\
+#define r128_cce_load_microcode(dev_priv) \\\
+ do { \\\
+ DRM_ERROR("Missing Free microcode!\\n"); \\\
+ dev->dev_private = (void *)dev_priv; \\\
+ r128_do_cleanup_cce(dev); \\\
+ return -EINVAL; \\\
+ } while (0)
+' drivers/gpu/drm/r128/r128_cce.c 'report missing Free microcode'
clean_blob drivers/gpu/drm/r128/r128_cce.c
clean_kconfig -f drivers/gpu/drm/Kconfig 'DRM_R128'
clean_mk CONFIG_DRM_R128 drivers/gpu/drm/Makefile
announce DRM_RADEON - "ATI Radeon"
clean_sed '
-/^static int radeon_do_init_cp([^;]*$/,/^}$/{
- /^ radeon_cp_load_microcode(dev_priv);$/{
- i\
- DRM_ERROR("Missing Free microcode!\\n");\
- radeon_do_cleanup_cp(dev);\
- return -EINVAL;
- }
-}' drivers/gpu/drm/radeon/radeon_cp.c 'report missing Free microcode on init'
-clean_sed '
-/^static int radeon_do_resume_cp([^;]*$/,/^}$/{
- /^ radeon_cp_load_microcode(dev_priv);$/{
- i\
- DRM_ERROR("Missing Free microcode!\\n");\
- return -EINVAL;
- }
-}' drivers/gpu/drm/radeon/radeon_cp.c 'report missing Free microcode on resume'
+/^static void radeon_cp_load_microcode(drm_radeon_private_t \* dev_priv)/i\
+#define radeon_cp_load_microcode(dev_priv) \\\
+ do { \\\
+ DRM_ERROR("Missing Free microcode!\\n"); \\\
+ radeon_do_cleanup_cp(dev); \\\
+ return -EINVAL; \\\
+ } while (0)
+' drivers/gpu/drm/radeon/radeon_cp.c 'report missing Free microcode'
clean_blob drivers/gpu/drm/radeon/radeon_cp.c
clean_blob drivers/gpu/drm/radeon/radeon_microcode.h
clean_kconfig -f drivers/gpu/drm/Kconfig 'DRM_RADEON'
announce DVB_TTUSB_DEC - "Technotrend/Hauppauge USB DEC devices"
reject_firmware drivers/media/dvb/ttusb-dec/ttusb_dec.c
clean_blob drivers/media/dvb/ttusb-dec/ttusb_dec.c
+clean_blob Documentation/dvb/ttusb-dec.txt
clean_kconfig drivers/media/dvb/ttusb-dec/Kconfig 'DVB_TTUSB_DEC'
clean_mk CONFIG_DVB_TTUSB_DEC drivers/media/dvb/ttusb-dec/Makefile
announce VIDEO_BT848 - "BT848 Video For Linux"
reject_firmware drivers/media/video/bt8xx/bttv-cards.c
+clean_blob drivers/media/video/bt8xx/bttv-cards.c
+clean_blob Documentation/video4linux/bttv/README
clean_kconfig drivers/media/video/bt8xx/Kconfig 'VIDEO_BT848'
clean_mk CONFIG_VIDEO_BT848 drivers/media/video/bt8xx/Makefile
return (printk(KERN_ERR PFX "%s: Missing Free firmware\\n", bp->dev->name),\\\
-EINVAL)
}' drivers/net/bnx2x_main.c 'report missing Free firmware'
+clean_blob drivers/net/bnx2x_hsi.h
clean_kconfig drivers/net/Kconfig 'BNX2X'
clean_mk CONFIG_BNX2X drivers/net/Makefile
clean_blob drivers/staging/slicoss/oasisdbgdownload.h
clean_blob drivers/staging/slicoss/gbrcvucode.h
clean_blob drivers/staging/slicoss/oasisrcvucode.h
+clean_sed '
+s,^\([ ]*\)\(instruction[ ]=[ ][^;]*\(Oasis\|GB\|Mojave\)\(Rcv\)\?UCode[^:}]*;\),\1printk(KERN_ERR "slicoss: missing Free firmware\\n");\n\1return STATUS_NOT_SUPPORTED;\n\1\2,' drivers/staging/slicoss/slicoss.c 'report missing Free firmware'
+clean_blob drivers/staging/slicoss/slicoss.c
clean_kconfig drivers/staging/slicoss/Kconfig 'SLICOSS'
clean_mk CONFIG_SLICOSS drivers/staging/slicoss/Makefile
clean_mk CONFIG_SPIDER_NET drivers/net/Makefile
announce SXG - "Alacritech SLIC Technology Non-Accelerated 10Gbe cards"
-clean_blob drivers/staging/sxg/saharadbgdownload.h
-clean_blob drivers/staging/sxg/sxgphycode.h
+clean_file drivers/staging/sxg/saharadbgdownload.h
+clean_file drivers/staging/sxg/sxgphycode.h
+clean_sed '
+/^static bool sxg_download_microcode(/,/^}$/{
+ /^{$/{
+ p
+ i\
+#if 1\
+ printk(KERN_ERR KBUILD_MODNAME ": missing Free firmware\\n");\
+ return (FALSE);\
+#else
+ d
+ }
+ /^}/{
+ i\
+#endif
+ }
+}
+/^static int sxg_phy_init(/,/^}$/{
+ /for (p = PhyUcode/i\
+ printk(KERN_ERR KBUILD_MODNAME ": missing Free firmware\\n");\
+ return (STATUS_FAILURE);\
+#define PhyUcode NULL
+}' drivers/staging/sxg/sxg.c 'report missing Free firmware'
+clean_blob drivers/staging/sxg/sxg.c
clean_kconfig drivers/staging/sxg/Kconfig 'SXG'
clean_mk CONFIG_SXG drivers/staging/sxg/Makefile
clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_SMC91C92'
clean_mk CONFIG_PCMCIA_SMC91C92 drivers/net/pcmcia/Makefile
-announce PCCARD - "PCCard (PCMCIA/CardBus) support"
-reject_firmware drivers/pcmcia/ds.c
-clean_kconfig drivers/pcmcia/Kconfig 'PCCARD'
-clean_mk CONFIG_PCCARD drivers/pcmcia/Makefile
+# CIS files are not software.
+# announce PCCARD - "PCCard (PCMCIA/CardBus) support"
+# reject_firmware drivers/pcmcia/ds.c
+# clean_kconfig drivers/pcmcia/Kconfig 'PCCARD'
+# clean_mk CONFIG_PCCARD drivers/pcmcia/Makefile
-announce PCMCIA_3C574 - "3Com 3c574 PCMCIA support"
-clean_blob drivers/net/pcmcia/3c574_cs.c
-clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_3C574'
-clean_mk CONFIG_PCMCIA_3C574 drivers/net/pcmcia/Makefile
+# announce PCMCIA_3C574 - "3Com 3c574 PCMCIA support"
+# clean_blob drivers/net/pcmcia/3c574_cs.c
+# clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_3C574'
+# clean_mk CONFIG_PCMCIA_3C574 drivers/net/pcmcia/Makefile
-announce PCMCIA_3C589 - "3Com 3c589 PCMCIA support"
-clean_blob drivers/net/pcmcia/3c589_cs.c
-clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_3C589'
-clean_mk CONFIG_PCMCIA_3C589 drivers/net/pcmcia/Makefile
+# announce PCMCIA_3C589 - "3Com 3c589 PCMCIA support"
+# clean_blob drivers/net/pcmcia/3c589_cs.c
+# clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_3C589'
+# clean_mk CONFIG_PCMCIA_3C589 drivers/net/pcmcia/Makefile
-announce PCMCIA_PCNET - "NE2000 compatible PCMCIA support"
-clean_blob drivers/net/pcmcia/pcnet_cs.c
-clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_PCNET'
-clean_mk CONFIG_PCMCIA_PCNET drivers/net/pcmcia/Makefile
+# announce PCMCIA_PCNET - "NE2000 compatible PCMCIA support"
+# clean_blob drivers/net/pcmcia/pcnet_cs.c
+# clean_kconfig drivers/net/pcmcia/Kconfig 'PCMCIA_PCNET'
+# clean_mk CONFIG_PCMCIA_PCNET drivers/net/pcmcia/Makefile
# tokenring
clean_kconfig drivers/net/wireless/p54/Kconfig 'P54_USB'
clean_mk CONFIG_P54_USB drivers/net/wireless/p54/Makefile
-announce PRISM54 - 'Intersil Prism GT/Duette/Indigo PCI/Cardbus'
+announce PRISM54 - "Intersil Prism GT/Duette/Indigo PCI/Cardbus"
reject_firmware drivers/net/wireless/prism54/islpci_dev.c
clean_blob drivers/net/wireless/prism54/islpci_dev.c
clean_sed '
# Serial #
##########
-announce SERIAL_8250_CS - "8250/16550 PCMCIA device support"
-clean_blob drivers/serial/serial_cs.c
-clean_kconfig drivers/serial/Kconfig 'SERIAL_8250_CS'
-clean_mk CONFIG_SERIAL_8250_CS drivers/serial/Makefile
+# CIS files are not software.
+# announce SERIAL_8250_CS - "8250/16550 PCMCIA device support"
+# clean_blob drivers/serial/serial_cs.c
+# clean_kconfig drivers/serial/Kconfig 'SERIAL_8250_CS'
+# clean_mk CONFIG_SERIAL_8250_CS drivers/serial/Makefile
announce SERIAL_ICOM - "IBM Multiport Serial Adapter"
reject_firmware drivers/serial/icom.c
announce ME4000 - "Meilhaus ME-4000 I/O board"
clean_file drivers/staging/me4000/me4000_firmware.h
clean_file drivers/staging/me4000/me4610_firmware.h
+clean_sed '
+/^static int me4000_xilinx_download([^;]*$/,/^}$/{
+ /firm = .*xilinx_firm.*/i\
+ printk(KERN_ERR "me4000: Missing Free firmware\\n");\
+ return -EIO;
+}
+' drivers/staging/me4000/me4000.c 'report missing Free firmware'
+clean_blob drivers/staging/me4000/me4000.c
clean_kconfig drivers/staging/me4000/Kconfig 'ME4000'
clean_mk CONFIG_ME4000 drivers/staging/me4000/Makefile
announce Documentation - "non-Free firmware scripts and documentation"
clean_blob Documentation/dvb/avermedia.txt
clean_blob Documentation/dvb/opera-firmware.txt
-clean_blob Documentation/dvb/ttusb-dec.txt
clean_blob Documentation/sound/alsa/ALSA-Configuration.txt
clean_blob Documentation/sound/oss/MultiSound
clean_blob Documentation/sound/oss/PSS
clean_blob Documentation/sound/oss/PSS-updates
+clean_blob Documentation/sound/oss/README.OSS
clean_file Documentation/dvb/get_dvb_firmware
clean_file Documentation/video4linux/extract_xc3028.pl
clean_sed s,usb8388,whatever,g drivers/base/Kconfig 'removed blob name'
clean_blob firmware/WHENCE
+if $errors; then
+ echo errors above were ignored because of --force >&2
+fi
+
exit 0