aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Hutchings <benh@debian.org>2012-12-10 04:06:21 +0000
committerBen Hutchings <benh@debian.org>2012-12-10 04:06:21 +0000
commitef781eb6eec9b61b82a8bafc92718bd49d95ba0f (patch)
treeb3ced713d830b8d33ba3810b2ce975b93341aa6a
parentd67e2904144f76e8df48d33e34d46916e5ac0111 (diff)
parent2f16347aaed704848b45ca9a079a180706be81ae (diff)
downloadkernel_replicant_linux-ef781eb6eec9b61b82a8bafc92718bd49d95ba0f.tar.gz
kernel_replicant_linux-ef781eb6eec9b61b82a8bafc92718bd49d95ba0f.tar.bz2
kernel_replicant_linux-ef781eb6eec9b61b82a8bafc92718bd49d95ba0f.zip
Merge changes from sid up to 3.2.35-1
Exclude RT changes and ABI fudges. Refresh firmware-remove-redundant-log-messages-from-drivers.patch against 3.6, but don't attempt to cover anything new yet. svn path=/dists/trunk/linux/; revision=19603
-rwxr-xr-xdebian/bin/stable-update.sh78
-rw-r--r--debian/changelog134
-rw-r--r--debian/config/amd64/defines2
-rw-r--r--debian/config/config3
-rw-r--r--debian/config/i386/defines2
-rw-r--r--debian/config/kernelarch-x86/config5
-rw-r--r--debian/installer/modules/nic-extra-modules21
-rw-r--r--debian/installer/modules/nic-modules5
-rw-r--r--debian/installer/modules/nic-usb-modules4
-rw-r--r--debian/installer/modules/nic-wireless-modules20
-rw-r--r--debian/installer/modules/pata-modules1
-rw-r--r--debian/installer/modules/scsi-common-modules1
-rw-r--r--debian/installer/modules/scsi-extra-modules4
-rw-r--r--debian/installer/powerpc/modules/powerpc-powerpc-miboot/nic-extra-modules1
-rw-r--r--debian/patches/bugfix/all/exec-do-not-leave-bprm-interp-on-stack.patch115
-rw-r--r--debian/patches/bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch133
-rw-r--r--debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch2897
-rw-r--r--debian/patches/bugfix/all/firmware_class-log-every-success-and-failure.patch138
-rw-r--r--debian/patches/bugfix/all/megaraid_sas-fix-memory-leak-if-SGL-has-zero-length-entries.patch39
-rw-r--r--debian/patches/bugfix/x86/ACPI-video-ignore-BIOS-initial-backlight-value-for-H.patch49
-rw-r--r--debian/patches/bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch63
-rw-r--r--debian/patches/debian/radeon-no-modeset-without-firmware.patch83
-rw-r--r--debian/patches/features/all/xen/microcode-amd-fam15plus.patch39
-rw-r--r--debian/patches/features/all/xen/microcode-typo.patch15
-rw-r--r--debian/patches/features/all/xen/microcode.patch284
-rw-r--r--debian/patches/series14
-rw-r--r--debian/templates/control.image-dbg.in6
27 files changed, 4141 insertions, 15 deletions
diff --git a/debian/bin/stable-update.sh b/debian/bin/stable-update.sh
new file mode 100755
index 000000000000..c3eafb7f05b4
--- /dev/null
+++ b/debian/bin/stable-update.sh
@@ -0,0 +1,78 @@
+#!/bin/bash -eu
+
+if [ $# -ne 2 ]; then
+ echo >&2 "Usage: $0 REPO VERSION"
+ echo >&2 "REPO is the git repository to generate a changelog from"
+ echo >&2 "VERSION is the stable version (without leading v)"
+ exit 2
+fi
+
+# Get base version, i.e. the Linus stable release that a version is based on
+base_version() {
+ local ver
+ ver="${1%-rc*}"
+ case "$ver" in
+ 2.6.*.* | [3-9].*.* | ??.*.*)
+ ver="${ver%.*}"
+ ;;
+ esac
+ echo "$ver"
+}
+
+add_update() {
+ local base update
+ base="$(base_version "$1")"
+ update="${1#$base.}"
+ if [ "$update" = "$1" ]; then
+ update=0
+ fi
+ update="$((update + $2))"
+ if [ $update = 0 ]; then
+ echo "$base"
+ else
+ echo "$base.$update"
+ fi
+}
+
+# Get next stable update version
+next_update() {
+ add_update "$1" 1
+}
+
+export GIT_DIR="$1/.git"
+
+new_ver="$2"
+cur_pkg_ver="$(dpkg-parsechangelog | sed -n 's/^Version: //p')"
+cur_ver="${cur_pkg_ver%-*}"
+
+if [ "$(base_version "$new_ver")" != "$(base_version "$cur_ver")" ]; then
+ echo >&2 "$new_ver is not on the same stable series as $cur_ver"
+ exit 2
+fi
+
+case "$cur_pkg_ver" in
+ *~experimental*)
+ new_pkg_ver="$new_ver-1~experimental.1"
+ ;;
+ *)
+ new_pkg_ver="$new_ver-1"
+ ;;
+esac
+
+# dch insists on word-wrapping everything, so just add the URLs initially
+dch -v "$new_pkg_ver" --preserve --multimaint-merge -D UNRELEASED \
+ --release-heuristic=changelog "$(
+ echo "New upstream stable update: "
+ while [ "v$cur_ver" != "v$new_ver" ]; do
+ cur_ver="$(next_update "$cur_ver")"
+ echo "http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-$cur_ver"
+ done)"
+
+# Then insert the shortlogs with sed
+while [ "v$cur_ver" != "v$new_ver" ]; do
+ next_ver="$(next_update "$cur_ver")"
+ sed -i '/ChangeLog-'"${next_ver//./\\.}"'/a\
+'"$(git log --reverse --pretty=' - %s\' "v$cur_ver..v$next_ver^")"'
+' debian/changelog
+ cur_ver="$next_ver"
+done
diff --git a/debian/changelog b/debian/changelog
index 851df99aebb1..757acd4810b9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -261,6 +261,140 @@ linux-2.6 (3.3~rc6-1~experimental.1) experimental; urgency=low
-- Ben Hutchings <ben@decadent.org.uk> Sun, 04 Mar 2012 20:27:42 +0000
+linux (3.2.35-1) unstable; urgency=low
+
+ * New upstream stable update:
+ http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.2.33
+ - samsung-laptop: don't handle backlight if handled by acpi/video
+ (Closes: #693190)
+ - e1000: fix vlan processing regression (Closes: #690956)
+ - [x86] drm/i915: no lvds quirk for Zotac ZDBOX SD ID12/ID13
+ (Closes: #691122)
+ - au0828: fix case where STREAMOFF being called on stopped stream
+ causes BUG()
+ - net: Fix skb_under_panic oops in neigh_resolve_output
+ - vlan: don't deliver frames for unknown vlans to protocols
+ - RDS: fix rds-ping spinlock recursion
+ - tcp: resets are misrouted
+ - nfsd4: fix nfs4 stateid leak
+ - [arm] vfp: fix saving d16-d31 vfp registers on v6+ kernels
+ - scsi_debug: Fix off-by-one bug when unmapping region
+ - storvsc: Account for in-transit packets in the RESET path
+ - tmpfs,ceph,gfs2,isofs,reiserfs,xfs: fix fh_len checking
+ - ext4: race-condition protection for ext4_convert_unwritten_extents_endio
+ (CVE-2012-4508)
+ - md/raid10: use correct limit variable
+ - net/wireless: ipw2200: Fix panic occurring in ipw_handle_promiscuous_tx()
+ - USB: cdc-acm: fix pipe type of write endpoint
+ - [x86] xen: don't corrupt %eip when returning from a signal handler
+ - sysfs: sysfs_pathname/sysfs_add_one: Use strlcat() instead of strcat()
+ - fs/compat_ioctl.c: VIDEO_SET_SPU_PALETTE missing error check
+ - netfilter: nf_conntrack: fix racy timer handling with reliable events
+ http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.2.34
+ - x86: Remove the ancient and deprecated disable_hlt() and enable_hlt()
+ facility (Closes: #667501)
+ - ALSA: PCM: Fix some races at disconnection
+ - ALSA: usb-audio: Fix races at disconnection
+ - crypto: cryptd - disable softirqs in cryptd_queue_worker to prevent
+ data corruption
+ - mac80211: Only process mesh config header on frames that RA_MATCH
+ - mac80211: fix SSID copy on IBSS JOIN
+ - mac80211: check management frame header length
+ - mac80211: verify that skb data is present
+ - mac80211: make sure data is accessible in EAPOL check
+ - ath9k: Test for TID only in BlockAcks while checking tx status
+ - nfs: Show original device name verbatim in /proc/*/mount{s,info}
+ (Closes: #669314)
+ - target: Avoid integer overflow in se_dev_align_max_sectors()
+ - hwmon: (w83627ehf) Force initial bank selection
+ - xfs: fix reading of wrapped log data
+ - fanotify: fix missing break
+ - drm/vmwgfx: Fix a case where the code would BUG when trying to pin
+ GMR memory
+ - sctp: fix call to SCTP_CMD_PROCESS_SACK in sctp_cmd_interpreter()
+ - netlink: use kfree_rcu() in netlink_release()
+ - tcp: fix FIONREAD/SIOCINQ
+ - net: fix divide by zero in tcp algorithm illinois (CVE-2012-4565)
+ - af-packet: fix oops when socket is not present
+ - r8169: Fix WoL on RTL8168d/8111d. (Closes: #674154)
+ - sky2: Fix for interrupt handler (Closes: #681280)
+ http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.2.35
+ - UBIFS: fix mounting problems after power cuts
+ - [s390] gup: add missing TASK_SIZE check to get_user_pages_fast()
+ - [x86] Exclude E820_RESERVED regions and memory holes above 4 GB from
+ direct mapping.
+ - netfilter: Mark SYN/ACK packets as invalid from original direction
+ - netfilter: Validate the sequence number of dataless ACK packets as well
+ - ipv4: avoid undefined behavior in do_ip_setsockopt()
+ - Input: i8042 - also perform controller reset when suspending
+ (Closes: #693934)
+ - brcm80211: smac: only print block-ack timeout message at trace level
+ (Closes: #674430)
+ - GFS2: Test bufdata with buffer locked and gfs2_log_lock held
+ - [x86] mce, therm_throt: Don't report power limit and package level
+ thermal throttle events in mcelog (Closes: #695209)
+ - [hppa] fix virtual aliasing issue in get_shared_area()
+ - xfs: drop buffer io reference when a bad bio is built
+ - reiserfs: Protect reiserfs_quota_{on,write}() with write lock
+ - md: Reassigned the parameters if read_seqretry returned true in func
+ md_is_badblock.
+ - md: Avoid write invalid address if read_seqretry returned true.
+ - [i386] Fix invalid stack address while in softirq
+ - selinux: fix sel_netnode_insert() suspicious rcu dereference
+ - [hppa] fix user-triggerable panic on parisc
+ - block: Don't access request after it might be freed
+ - futex: avoid wake_futex() for a PI futex_q
+
+ [ Ben Hutchings ]
+ * [x86] udeb: Re-add isci to scsi-extra-modules (Closes: #690886;
+ regression of #652897 in version 3.2~rc7-1~experimental.1 due to
+ mis-merge)
+ * udeb: Add missing net drivers:
+ - Add 8021q (Closes: #689159), cxgb4, cxgb4vf, igbvf, ixgbevf, micrel,
+ mlx4_en, pch_gbe, qlge, smsc9420, tehuti, vxge to nic-extra-modules
+ - Add int51x1, smsc75xx, smsc95xx to nic-usb-modules
+ - Add adm8211, at76c50x-usb, b43legacy, iwl4965, libertas_tf_usb,
+ mwifiex_pcie, mwl8k, orinoco_usb, prism2_usb, r8187se, r8192e_pci,
+ r8712u, rtl8192ce (Closes: #686605), rtl8192cu, rtl8192de, rtl8192se
+ vt6656_stage to nic-wireless-modules
+ - Move broadcom to nic-modules, as it may be needed by tg3
+ * udeb: Add bnx2fc, fnic, pmcraid to scsi-extra-modules
+ * udeb: Move rtl8180 to nic-wireless-modules
+ * [x86] asus-laptop: Do not call HWRS on init (Closes: #692436)
+ * [x86] drm/i915: Only kick out vesafb if we takeover the fbcon with KMS
+ (Closes: #686284)
+ * [!x86] radeon: Disable DRM_RADEON_KMS, as this is still not expected to
+ work (Closes: #628972)
+ * radeon: Disable KMS earlier if firmware is not installed (Closes: #607194)
+ * [amd64] linux-image: Include VIA Nano in package description
+ * linux-image-dbg: Change package description to use the phrase
+ 'debugging symbols' and correct grammar
+ * usb: Disable UAS; it is known to be broken, and the supported devices
+ can also work with usb-storage
+ * ipv6: Treat ND option 31 as userland (DNSSL support) (Closes: #694522)
+ * rt2x00: Add device IDs 5362, 5392, 539b (Closes: #694312)
+ * udeb: Add pata_piccolo to pata-modules (Closes: #695437)
+ * firmware_class: Log every success and failure against given device
+ * firmware: Remove redundant log messages from drivers
+ * [x86] ACPI / video: ignore BIOS initial backlight value for
+ HP Folio 13-2000 (Closes: #692361)
+ * [x86] KVM: x86: invalid opcode oops on SET_SREGS with OSXSAVE bit set
+ (CVE-2012-4461)
+ * kmod: make __request_module() killable (CVE-2012-4398)
+ * exec: do not leave bprm->interp on stack (CVE-2012-4530)
+ * exec: use -ELOOP for max recursion depth
+ * [rt] Update to 3.2.34-rt51:
+ - hrtimer: Raise softirq if hrtimer irq stalled
+ - rcu: Disable RCU_FAST_NO_HZ on RT
+ - net: netfilter: Serialize xt_write_recseq sections on RT
+ * megaraid_sas: fix memory leak if SGL has zero length entries
+ (Closes: #688198)
+
+ [ Ian Campbell ]
+ * [xen] add support for microcode updating. (Closes: #693053)
+
+ -- Ben Hutchings <ben@decadent.org.uk> Mon, 10 Dec 2012 00:14:55 +0000
+
linux (3.2.32-1) unstable; urgency=low
* New upstream stable update:
diff --git a/debian/config/amd64/defines b/debian/config/amd64/defines
index 3e9c18a099f4..dd4b89bcad52 100644
--- a/debian/config/amd64/defines
+++ b/debian/config/amd64/defines
@@ -14,7 +14,7 @@ configs:
[amd64_description]
hardware: 64-bit PCs
-hardware-long: PCs with AMD64 or Intel 64 processors
+hardware-long: PCs with AMD64, Intel 64 or VIA Nano processors
parts: xen
[amd64_image]
diff --git a/debian/config/config b/debian/config/config
index 7180c2b8901c..7b3465820aae 100644
--- a/debian/config/config
+++ b/debian/config/config
@@ -391,7 +391,7 @@ CONFIG_DRM_NOUVEAU_BACKLIGHT=y
##
## file: drivers/gpu/drm/radeon/Kconfig
##
-CONFIG_DRM_RADEON_KMS=y
+# CONFIG_DRM_RADEON_KMS is not set
##
## file: drivers/gpu/drm/vmwgfx/Kconfig
@@ -3172,7 +3172,6 @@ CONFIG_USB_STORAGE_ONETOUCH=m
CONFIG_USB_STORAGE_KARMA=m
CONFIG_USB_STORAGE_CYPRESS_ATACB=m
CONFIG_USB_STORAGE_ENE_UB6250=m
-CONFIG_USB_UAS=m
# CONFIG_USB_LIBUSUAL is not set
##
diff --git a/debian/config/i386/defines b/debian/config/i386/defines
index e978f0e970eb..7a2335b43071 100644
--- a/debian/config/i386/defines
+++ b/debian/config/i386/defines
@@ -48,7 +48,7 @@ flavours:
[amd64_description]
hardware: 64-bit PCs
-hardware-long: PCs with AMD64 or Intel 64 processors
+hardware-long: PCs with AMD64, Intel 64 or VIA Nano processors
parts: xen
[amd64_image]
diff --git a/debian/config/kernelarch-x86/config b/debian/config/kernelarch-x86/config
index 537831775f27..dd94a2abe287 100644
--- a/debian/config/kernelarch-x86/config
+++ b/debian/config/kernelarch-x86/config
@@ -453,6 +453,11 @@ CONFIG_DRM_I2C_CH7006=m
CONFIG_DRM_I2C_SIL164=m
##
+## file: drivers/gpu/drm/radeon/Kconfig
+##
+CONFIG_DRM_RADEON_KMS=y
+
+##
## file: drivers/gpu/stub/Kconfig
##
# CONFIG_STUB_POULSBO is not set
diff --git a/debian/installer/modules/nic-extra-modules b/debian/installer/modules/nic-extra-modules
index b9d9c9faf329..5addccc61660 100644
--- a/debian/installer/modules/nic-extra-modules
+++ b/debian/installer/modules/nic-extra-modules
@@ -1,5 +1,3 @@
-# Note that this is an incomplete list that tries to be a common subset
-# that is right for most kernels. Suppliment with any others.
82596 ?
ac3200 ?
amd8111e ?
@@ -97,13 +95,24 @@ jme ?
enic ?
be2net ?
myri10ge ?
-sc92031 ?
+# inet_lro is shared but now only used by myri10ge (and the iw_nes IB driver)
inet_lro ?
+sc92031 ?
qlcnic ?
bna ?
+cxgb4 ?
+cxgb4vf ?
+igbvf ?
+ixgbevf ?
+mlx4_en ?
+vxge ?
+pch_gbe ?
+qlge ?
+smsc9420 ?
+tehuti ?
# phy drivers
-broadcom ?
+# broadcom is in nic-modules
cicada ?
davicom ?
et1011c ?
@@ -111,6 +120,7 @@ icplus ?
lxt ?
marvell ?
mdio-bitbang ?
+micrel ?
national ?
qsemi ?
realtek ?
@@ -120,3 +130,6 @@ vitesse ?
# VMWare
vmxnet3 ?
+
+# VLAN
+8021q
diff --git a/debian/installer/modules/nic-modules b/debian/installer/modules/nic-modules
index 16f0d8c2f9e9..6fc0863ab87e 100644
--- a/debian/installer/modules/nic-modules
+++ b/debian/installer/modules/nic-modules
@@ -1,4 +1,4 @@
-# Some very common nic modules.
+# Some historically common net drivers
3c59x
8139too
e100
@@ -9,3 +9,6 @@ tulip
winbond-840
eth1394 ?
xen-netfront ?
+
+# PHY driver, may be needed by tg3
+broadcom ?
diff --git a/debian/installer/modules/nic-usb-modules b/debian/installer/modules/nic-usb-modules
index 064b926ff8cf..11d29a60506c 100644
--- a/debian/installer/modules/nic-usb-modules
+++ b/debian/installer/modules/nic-usb-modules
@@ -11,6 +11,8 @@ mcs7830 ?
dm9601 ?
zd1211rw ?
rndis_wlan ?
-rtl8180 ?
rtl8187 ?
g_ether ?
+int51x1 ?
+smsc75xx ?
+smsc95xx ?
diff --git a/debian/installer/modules/nic-wireless-modules b/debian/installer/modules/nic-wireless-modules
index 2a981dc2416e..740ec492529c 100644
--- a/debian/installer/modules/nic-wireless-modules
+++ b/debian/installer/modules/nic-wireless-modules
@@ -19,10 +19,9 @@ ath9k_htc ?
carl9170 ?
iwlwifi ?
iwl3945 ?
+iwl4965 ?
b43 ?
brcmsmac ?
-
-# rt2x00 drivers
rt2400pci ?
rt2500pci ?
rt2500usb ?
@@ -30,6 +29,23 @@ rt2800pci ?
rt2800usb ?
rt61pci ?
rt73usb ?
+adm8211 ?
+at76c50x-usb ?
+b43legacy ?
+libertas_tf_usb ?
+mwifiex_pcie ?
+mwl8k ?
+orinoco_usb ?
+rtl8180 ?
+rtl8192ce ?
+rtl8192cu ?
+rtl8192de ?
+rtl8192se ?
+r8187se ?
+r8192e_pci ?
+r8712u ?
+vt6656_stage ?
+prism2_usb ?
# lib80211 encryption algorithms
lib80211_crypt_wep ?
diff --git a/debian/installer/modules/pata-modules b/debian/installer/modules/pata-modules
index 4df22e0de4a8..2bce2508ea12 100644
--- a/debian/installer/modules/pata-modules
+++ b/debian/installer/modules/pata-modules
@@ -25,6 +25,7 @@ pata_opti ?
pata_optidma ?
pata_pdc2027x ?
pata_pdc202xx_old ?
+pata_piccolo ?
pata_qdi ?
pata_radisys ?
pata_rz1000 ?
diff --git a/debian/installer/modules/scsi-common-modules b/debian/installer/modules/scsi-common-modules
index 9baefe5e5b5e..736afe116324 100644
--- a/debian/installer/modules/scsi-common-modules
+++ b/debian/installer/modules/scsi-common-modules
@@ -1,3 +1,4 @@
+# Some historically common SCSI drivers
aic79xx
aic7xxx
BusLogic ?
diff --git a/debian/installer/modules/scsi-extra-modules b/debian/installer/modules/scsi-extra-modules
index 5fa68cbd70e3..6ab42bc9ae37 100644
--- a/debian/installer/modules/scsi-extra-modules
+++ b/debian/installer/modules/scsi-extra-modules
@@ -35,6 +35,10 @@ hptiop ?
qla4xxx ?
qla2xxx ?
pm8001 ?
+isci ?
+bnx2fc ?
+fnic ?
+pmcraid ?
# VMWare
vmw_pvscsi ?
diff --git a/debian/installer/powerpc/modules/powerpc-powerpc-miboot/nic-extra-modules b/debian/installer/powerpc/modules/powerpc-powerpc-miboot/nic-extra-modules
index 9a58d1c7d032..b75e14a8b206 100644
--- a/debian/installer/powerpc/modules/powerpc-powerpc-miboot/nic-extra-modules
+++ b/debian/installer/powerpc/modules/powerpc-powerpc-miboot/nic-extra-modules
@@ -14,3 +14,4 @@ prism54 ?
p54pci
p54usb
yellowfin
+8021q
diff --git a/debian/patches/bugfix/all/exec-do-not-leave-bprm-interp-on-stack.patch b/debian/patches/bugfix/all/exec-do-not-leave-bprm-interp-on-stack.patch
new file mode 100644
index 000000000000..45a4ac26b85f
--- /dev/null
+++ b/debian/patches/bugfix/all/exec-do-not-leave-bprm-interp-on-stack.patch
@@ -0,0 +1,115 @@
+From: Kees Cook <keescook@chromium.org>
+Date: Thu, 6 Dec 2012 17:00:21 +1100
+Subject: [1/2] exec: do not leave bprm->interp on stack
+
+commit 1e1b8374592f5fb347625e84d8a5f2f40d858a24 upstream.
+
+If a series of scripts are executed, each triggering module loading via
+unprintable bytes in the script header, kernel stack contents can leak
+into the command line.
+
+Normally execution of binfmt_script and binfmt_misc happens recursively.
+However, when modules are enabled, and unprintable bytes exist in the
+bprm->buf, execution will restart after attempting to load matching binfmt
+modules. Unfortunately, the logic in binfmt_script and binfmt_misc does
+not expect to get restarted. They leave bprm->interp pointing to their
+local stack. This means on restart bprm->interp is left pointing into
+unused stack memory which can then be copied into the userspace argv
+areas.
+
+After additional study, it seems that both recursion and restart remains
+the desirable way to handle exec with scripts, misc, and modules. As
+such, we need to protect the changes to interp.
+
+This changes the logic to require allocation for any changes to the
+bprm->interp. To avoid adding a new kmalloc to every exec, the default
+value is left as-is. Only when passing through binfmt_script or
+binfmt_misc does an allocation take place.
+
+For a proof of concept, see DoTest.sh from:
+http://www.halfdog.net/Security/2012/LinuxKernelBinfmtScriptStackDataDisclosure/
+
+Signed-off-by: Kees Cook <keescook@chromium.org>
+Cc: halfdog <me@halfdog.net>
+Cc: P J P <ppandit@redhat.com>
+Cc: Alexander Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+---
+ fs/binfmt_misc.c | 5 ++++-
+ fs/binfmt_script.c | 4 +++-
+ fs/exec.c | 15 +++++++++++++++
+ include/linux/binfmts.h | 1 +
+ 4 files changed, 23 insertions(+), 2 deletions(-)
+
+diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
+index b0b70fb..b0c1755 100644
+--- a/fs/binfmt_misc.c
++++ b/fs/binfmt_misc.c
+@@ -176,7 +176,10 @@ static int load_misc_binary(struct linux_binprm *bprm)
+ goto _error;
+ bprm->argc ++;
+
+- bprm->interp = iname; /* for binfmt_script */
++ /* Update interp in case binfmt_script needs it. */
++ retval = bprm_change_interp(iname, bprm);
++ if (retval < 0)
++ goto _error;
+
+ interp_file = open_exec (iname);
+ retval = PTR_ERR (interp_file);
+diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c
+index 8c95499..4834f2c 100644
+--- a/fs/binfmt_script.c
++++ b/fs/binfmt_script.c
+@@ -82,7 +82,9 @@ static int load_script(struct linux_binprm *bprm)
+ retval = copy_strings_kernel(1, &i_name, bprm);
+ if (retval) return retval;
+ bprm->argc++;
+- bprm->interp = interp;
++ retval = bprm_change_interp(interp, bprm);
++ if (retval < 0)
++ return retval;
+
+ /*
+ * OK, now restart the process with the interpreter's dentry.
+diff --git a/fs/exec.c b/fs/exec.c
+index b71b08c..bf50973 100644
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -1175,9 +1175,24 @@ void free_bprm(struct linux_binprm *bprm)
+ mutex_unlock(&current->signal->cred_guard_mutex);
+ abort_creds(bprm->cred);
+ }
++ /* If a binfmt changed the interp, free it. */
++ if (bprm->interp != bprm->filename)
++ kfree(bprm->interp);
+ kfree(bprm);
+ }
+
++int bprm_change_interp(char *interp, struct linux_binprm *bprm)
++{
++ /* If a binfmt changed the interp, free it first. */
++ if (bprm->interp != bprm->filename)
++ kfree(bprm->interp);
++ bprm->interp = kstrdup(interp, GFP_KERNEL);
++ if (!bprm->interp)
++ return -ENOMEM;
++ return 0;
++}
++EXPORT_SYMBOL(bprm_change_interp);
++
+ /*
+ * install the new credentials for this executable
+ */
+diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
+index 2630c9b..7f0e297 100644
+--- a/include/linux/binfmts.h
++++ b/include/linux/binfmts.h
+@@ -114,6 +114,7 @@ extern int setup_arg_pages(struct linux_binprm * bprm,
+ unsigned long stack_top,
+ int executable_stack);
+ extern int bprm_mm_init(struct linux_binprm *bprm);
++extern int bprm_change_interp(char *interp, struct linux_binprm *bprm);
+ extern int copy_strings_kernel(int argc, const char *const *argv,
+ struct linux_binprm *bprm);
+ extern int prepare_bprm_creds(struct linux_binprm *bprm);
diff --git a/debian/patches/bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch b/debian/patches/bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch
new file mode 100644
index 000000000000..8cd490b3936d
--- /dev/null
+++ b/debian/patches/bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch
@@ -0,0 +1,133 @@
+From: Kees Cook <keescook@chromium.org>
+Date: Thu, 6 Dec 2012 17:00:21 +1100
+Subject: [2/2] exec: use -ELOOP for max recursion depth
+
+commit a4706fd3dc5d23f58da814d03f3ef92fd9a4fc16 upstream.
+
+To avoid an explosion of request_module calls on a chain of abusive
+scripts, fail maximum recursion with -ELOOP instead of -ENOEXEC. As soon
+as maximum recursion depth is hit, the error will fail all the way back
+up the chain, aborting immediately.
+
+This also has the side-effect of stopping the user's shell from attempting
+to reexecute the top-level file as a shell script. As seen in the
+dash source:
+
+ if (cmd != path_bshell && errno == ENOEXEC) {
+ *argv-- = cmd;
+ *argv = cmd = path_bshell;
+ goto repeat;
+ }
+
+The above logic was designed for running scripts automatically that lacked
+the "#!" header, not to re-try failed recursion. On a legitimate -ENOEXEC,
+things continue to behave as the shell expects.
+
+Additionally, when tracking recursion, the binfmt handlers should not be
+involved. The recursion being tracked is the depth of calls through
+search_binary_handler(), so that function should be exclusively responsible
+for tracking the depth.
+
+Signed-off-by: Kees Cook <keescook@chromium.org>
+Cc: halfdog <me@halfdog.net>
+Cc: P J P <ppandit@redhat.com>
+Cc: Alexander Viro <viro@zeniv.linux.org.uk>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+[bwh: Backported to 3.6: adjust context]
+---
+ fs/binfmt_em86.c | 1 -
+ fs/binfmt_misc.c | 6 ------
+ fs/binfmt_script.c | 4 +---
+ fs/exec.c | 10 +++++-----
+ include/linux/binfmts.h | 2 --
+ 5 files changed, 6 insertions(+), 17 deletions(-)
+
+--- a/fs/binfmt_em86.c
++++ b/fs/binfmt_em86.c
+@@ -42,7 +42,6 @@ static int load_em86(struct linux_binprm
+ return -ENOEXEC;
+ }
+
+- bprm->recursion_depth++; /* Well, the bang-shell is implicit... */
+ allow_write_access(bprm->file);
+ fput(bprm->file);
+ bprm->file = NULL;
+--- a/fs/binfmt_misc.c
++++ b/fs/binfmt_misc.c
+@@ -117,10 +117,6 @@ static int load_misc_binary(struct linux
+ if (!enabled)
+ goto _ret;
+
+- retval = -ENOEXEC;
+- if (bprm->recursion_depth > BINPRM_MAX_RECURSION)
+- goto _ret;
+-
+ /* to keep locking time low, we copy the interpreter string */
+ read_lock(&entries_lock);
+ fmt = check_file(bprm);
+@@ -200,8 +196,6 @@ static int load_misc_binary(struct linux
+ if (retval < 0)
+ goto _error;
+
+- bprm->recursion_depth++;
+-
+ retval = search_binary_handler (bprm, regs);
+ if (retval < 0)
+ goto _error;
+--- a/fs/binfmt_script.c
++++ b/fs/binfmt_script.c
+@@ -22,15 +22,13 @@ static int load_script(struct linux_binp
+ char interp[BINPRM_BUF_SIZE];
+ int retval;
+
+- if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') ||
+- (bprm->recursion_depth > BINPRM_MAX_RECURSION))
++ if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))
+ return -ENOEXEC;
+ /*
+ * This section does the #! interpretation.
+ * Sorta complicated, but hopefully it will work. -TYT
+ */
+
+- bprm->recursion_depth++;
+ allow_write_access(bprm->file);
+ fput(bprm->file);
+ bprm->file = NULL;
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -1398,6 +1398,10 @@ int search_binary_handler(struct linux_b
+ struct linux_binfmt *fmt;
+ pid_t old_pid, old_vpid;
+
++ /* This allows 4 levels of binfmt rewrites before failing hard. */
++ if (depth > 5)
++ return -ELOOP;
++
+ retval = security_bprm_check(bprm);
+ if (retval)
+ return retval;
+@@ -1422,12 +1426,8 @@ int search_binary_handler(struct linux_b
+ if (!try_module_get(fmt->module))
+ continue;
+ read_unlock(&binfmt_lock);
++ bprm->recursion_depth = depth + 1;
+ retval = fn(bprm, regs);
+- /*
+- * Restore the depth counter to its starting value
+- * in this call, so we don't have to rely on every
+- * load_binary function to restore it on return.
+- */
+ bprm->recursion_depth = depth;
+ if (retval >= 0) {
+ if (depth == 0) {
+--- a/include/linux/binfmts.h
++++ b/include/linux/binfmts.h
+@@ -68,8 +68,6 @@ struct linux_binprm {
+ #define BINPRM_FLAGS_EXECFD_BIT 1
+ #define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT)
+
+-#define BINPRM_MAX_RECURSION 4
+-
+ /* Function parameter for binfmt->coredump */
+ struct coredump_params {
+ long signr;
diff --git a/debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch b/debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch
new file mode 100644
index 000000000000..4c1313d67f2a
--- /dev/null
+++ b/debian/patches/bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch
@@ -0,0 +1,2897 @@
+From: Ben Hutchings <ben@decadent.org.uk>
+Subject: firmware: Remove redundant log messages from drivers
+Date: Sun, 09 Dec 2012 16:40:31 +0000
+
+Now that firmware_class logs every success and failure consistently,
+many other log messages can be removed from drivers.
+
+This will probably need to be split up into multiple patches prior to
+upstream submission.
+
+--- a/arch/arm/mach-netx/xc.c
++++ b/arch/arm/mach-netx/xc.c
+@@ -127,10 +127,8 @@ int xc_request_firmware(struct xc *x)
+
+ ret = request_firmware(&fw, name, x->dev);
+
+- if (ret < 0) {
+- dev_err(x->dev, "request_firmware failed\n");
++ if (ret)
+ return ret;
+- }
+
+ head = (struct fw_header *)fw->data;
+ if (head->magic != 0x4e657458) {
+--- a/arch/cris/arch-v32/drivers/iop_fw_load.c
++++ b/arch/cris/arch-v32/drivers/iop_fw_load.c
+@@ -74,12 +74,7 @@ int iop_fw_load_spu(const unsigned char
+ fw_name,
+ &iop_spu_device[spu_inst]);
+ if (retval != 0)
+- {
+- printk(KERN_ERR
+- "iop_load_spu: Failed to load firmware \"%s\"\n",
+- fw_name);
+ return retval;
+- }
+ data = (u32 *) fw_entry->data;
+
+ /* acquire ownership of memory controller */
+@@ -137,12 +132,7 @@ int iop_fw_load_mpu(unsigned char *fw_na
+ /* get firmware */
+ retval = request_firmware(&fw_entry, fw_name, &iop_mpu_device);
+ if (retval != 0)
+- {
+- printk(KERN_ERR
+- "iop_load_spu: Failed to load firmware \"%s\"\n",
+- fw_name);
+ return retval;
+- }
+ data = (u32 *) fw_entry->data;
+
+ /* disable MPU */
+--- a/arch/x86/kernel/microcode_amd.c
++++ b/arch/x86/kernel/microcode_amd.c
+@@ -337,10 +337,8 @@ static enum ucode_state request_microcod
+ if (c->x86 >= 0x15)
+ snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86);
+
+- if (request_firmware(&fw, (const char *)fw_name, device)) {
+- pr_err("failed to load file %s\n", fw_name);
++ if (request_firmware(&fw, (const char *)fw_name, device))
+ goto out;
+- }
+
+ ret = UCODE_ERROR;
+ if (*(u32 *)fw->data != UCODE_MAGIC) {
+--- a/drivers/atm/ambassador.c
++++ b/drivers/atm/ambassador.c
+@@ -1926,10 +1926,8 @@ static int __devinit ucode_init (loader_
+ int res;
+
+ res = request_ihex_firmware(&fw, "atmsar11.fw", &dev->pci_dev->dev);
+- if (res) {
+- PRINTK (KERN_ERR, "Cannot load microcode data");
++ if (res)
+ return res;
+- }
+
+ /* First record contains just the start address */
+ rec = (const struct ihex_binrec *)fw->data;
+--- a/drivers/atm/fore200e.c
++++ b/drivers/atm/fore200e.c
+@@ -2519,10 +2519,9 @@ fore200e_load_and_start_fw(struct fore20
+ return err;
+
+ sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT);
+- if ((err = request_firmware(&firmware, buf, device)) < 0) {
+- printk(FORE200E "problem loading firmware image %s\n", fore200e->bus->model_name);
++ err = request_firmware(&firmware, buf, device);
++ if (err)
+ return err;
+- }
+
+ fw_data = (__le32 *) firmware->data;
+ fw_size = firmware->size / sizeof(u32);
+--- a/drivers/bluetooth/ath3k.c
++++ b/drivers/bluetooth/ath3k.c
+@@ -306,10 +306,8 @@ static int ath3k_load_patch(struct usb_d
+ fw_version.rom_version);
+
+ ret = request_firmware(&firmware, filename, &udev->dev);
+- if (ret < 0) {
+- BT_ERR("Patch file not found %s", filename);
++ if (ret)
+ return ret;
+- }
+
+ pt_version.rom_version = *(int *)(firmware->data + firmware->size - 8);
+ pt_version.build_version = *(int *)
+@@ -368,10 +366,8 @@ static int ath3k_load_syscfg(struct usb_
+ fw_version.rom_version, clk_value, ".dfu");
+
+ ret = request_firmware(&firmware, filename, &udev->dev);
+- if (ret < 0) {
+- BT_ERR("Configuration file not found %s", filename);
++ if (ret)
+ return ret;
+- }
+
+ ret = ath3k_load_fwfile(udev, firmware);
+ release_firmware(firmware);
+--- a/drivers/bluetooth/bcm203x.c
++++ b/drivers/bluetooth/bcm203x.c
+@@ -194,7 +194,6 @@ static int bcm203x_probe(struct usb_inte
+ }
+
+ if (request_firmware(&firmware, "BCM2033-MD.hex", &udev->dev) < 0) {
+- BT_ERR("Mini driver request failed");
+ usb_free_urb(data->urb);
+ kfree(data);
+ return -EIO;
+@@ -221,7 +220,6 @@ static int bcm203x_probe(struct usb_inte
+ release_firmware(firmware);
+
+ if (request_firmware(&firmware, "BCM2033-FW.bin", &udev->dev) < 0) {
+- BT_ERR("Firmware request failed");
+ usb_free_urb(data->urb);
+ kfree(data->buffer);
+ kfree(data);
+--- a/drivers/bluetooth/bfusb.c
++++ b/drivers/bluetooth/bfusb.c
+@@ -672,10 +672,8 @@ static int bfusb_probe(struct usb_interf
+ skb_queue_head_init(&data->pending_q);
+ skb_queue_head_init(&data->completed_q);
+
+- if (request_firmware(&firmware, "bfubase.frm", &udev->dev) < 0) {
+- BT_ERR("Firmware request failed");
++ if (request_firmware(&firmware, "bfubase.frm", &udev->dev))
+ goto error;
+- }
+
+ BT_DBG("firmware data %p size %zu", firmware->data, firmware->size);
+
+--- a/drivers/bluetooth/bt3c_cs.c
++++ b/drivers/bluetooth/bt3c_cs.c
+@@ -585,10 +585,8 @@ static int bt3c_open(bt3c_info_t *info)
+
+ /* Load firmware */
+ err = request_firmware(&firmware, "BT3CPCC.bin", &info->p_dev->dev);
+- if (err < 0) {
+- BT_ERR("Firmware request failed");
++ if (err)
+ goto error;
+- }
+
+ err = bt3c_load_firmware(info, firmware->data, firmware->size);
+
+--- a/drivers/bluetooth/btmrvl_sdio.c
++++ b/drivers/bluetooth/btmrvl_sdio.c
+@@ -261,8 +261,6 @@ static int btmrvl_sdio_download_helper(s
+ ret = request_firmware(&fw_helper, card->helper,
+ &card->func->dev);
+ if ((ret < 0) || !fw_helper) {
+- BT_ERR("request_firmware(helper) failed, error code = %d",
+- ret);
+ ret = -ENOENT;
+ goto done;
+ }
+@@ -361,8 +359,6 @@ static int btmrvl_sdio_download_fw_w_hel
+ ret = request_firmware(&fw_firmware, card->firmware,
+ &card->func->dev);
+ if ((ret < 0) || !fw_firmware) {
+- BT_ERR("request_firmware(firmware) failed, error code = %d",
+- ret);
+ ret = -ENOENT;
+ goto done;
+ }
+--- a/drivers/char/dsp56k.c
++++ b/drivers/char/dsp56k.c
+@@ -140,11 +140,8 @@ static int dsp56k_upload(u_char __user *
+ }
+ err = request_firmware(&fw, fw_name, &pdev->dev);
+ platform_device_unregister(pdev);
+- if (err) {
+- printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+- fw_name, err);
++ if (err)
+ return err;
+- }
+ if (fw->size % 3) {
+ printk(KERN_ERR "Bogus length %d in image \"%s\"\n",
+ fw->size, fw_name);
+--- a/drivers/dma/imx-sdma.c
++++ b/drivers/dma/imx-sdma.c
+@@ -1164,10 +1164,8 @@ static void sdma_load_firmware(const str
+ const struct sdma_script_start_addrs *addr;
+ unsigned short *ram_code;
+
+- if (!fw) {
+- dev_err(sdma->dev, "firmware not found\n");
++ if (!fw)
+ return;
+- }
+
+ if (fw->size < sizeof(*header))
+ goto err_firmware;
+--- a/drivers/gpu/drm/mga/mga_warp.c
++++ b/drivers/gpu/drm/mga/mga_warp.c
+@@ -80,11 +80,8 @@ int mga_warp_install_microcode(drm_mga_p
+ }
+ rc = request_ihex_firmware(&fw, firmware_name, &pdev->dev);
+ platform_device_unregister(pdev);
+- if (rc) {
+- DRM_ERROR("mga: Failed to load microcode \"%s\"\n",
+- firmware_name);
++ if (rc)
+ return rc;
+- }
+
+ size = 0;
+ where = 0;
+--- a/drivers/gpu/drm/nouveau/nvc0_graph.c
++++ b/drivers/gpu/drm/nouveau/nvc0_graph.c
+@@ -734,10 +734,8 @@ nvc0_graph_create_fw(struct drm_device *
+ if (ret) {
+ snprintf(f, sizeof(f), "nouveau/%s", fwname);
+ ret = request_firmware(&fw, f, &dev->pdev->dev);
+- if (ret) {
+- NV_ERROR(dev, "failed to load %s\n", fwname);
++ if (ret)
+ return ret;
+- }
+ }
+
+ fuc->size = fw->size;
+--- a/drivers/gpu/drm/r128/r128_cce.c
++++ b/drivers/gpu/drm/r128/r128_cce.c
+@@ -155,11 +155,8 @@ static int r128_cce_load_microcode(drm_r
+ }
+ rc = request_firmware(&fw, FIRMWARE_NAME, &pdev->dev);
+ platform_device_unregister(pdev);
+- if (rc) {
+- printk(KERN_ERR "r128_cce: Failed to load firmware \"%s\"\n",
+- FIRMWARE_NAME);
++ if (rc)
+ return rc;
+- }
+
+ if (fw->size != 256 * 8) {
+ printk(KERN_ERR
+--- a/drivers/gpu/drm/radeon/ni.c
++++ b/drivers/gpu/drm/radeon/ni.c
+@@ -398,10 +398,6 @@ out:
+ platform_device_unregister(pdev);
+
+ if (err) {
+- if (err != -EINVAL)
+- printk(KERN_ERR
+- "ni_cp: Failed to load firmware \"%s\"\n",
+- fw_name);
+ release_firmware(rdev->pfp_fw);
+ rdev->pfp_fw = NULL;
+ release_firmware(rdev->me_fw);
+--- a/drivers/gpu/drm/radeon/r100.c
++++ b/drivers/gpu/drm/radeon/r100.c
+@@ -1033,10 +1033,7 @@ static int r100_cp_init_microcode(struct
+
+ err = request_firmware(&rdev->me_fw, fw_name, &pdev->dev);
+ platform_device_unregister(pdev);
+- if (err) {
+- printk(KERN_ERR "radeon_cp: Failed to load firmware \"%s\"\n",
+- fw_name);
+- } else if (rdev->me_fw->size % 8) {
++ if (err == 0 && rdev->me_fw->size % 8) {
+ printk(KERN_ERR
+ "radeon_cp: Bogus length %zu in firmware \"%s\"\n",
+ rdev->me_fw->size, fw_name);
+--- a/drivers/gpu/drm/radeon/r600.c
++++ b/drivers/gpu/drm/radeon/r600.c
+@@ -2020,10 +2020,6 @@ out:
+ platform_device_unregister(pdev);
+
+ if (err) {
+- if (err != -EINVAL)
+- printk(KERN_ERR
+- "r600_cp: Failed to load firmware \"%s\"\n",
+- fw_name);
+ release_firmware(rdev->pfp_fw);
+ rdev->pfp_fw = NULL;
+ release_firmware(rdev->me_fw);
+--- a/drivers/gpu/drm/radeon/r600_cp.c
++++ b/drivers/gpu/drm/radeon/r600_cp.c
+@@ -375,10 +375,6 @@ out:
+ platform_device_unregister(pdev);
+
+ if (err) {
+- if (err != -EINVAL)
+- printk(KERN_ERR
+- "r600_cp: Failed to load firmware \"%s\"\n",
+- fw_name);
+ release_firmware(dev_priv->pfp_fw);
+ dev_priv->pfp_fw = NULL;
+ release_firmware(dev_priv->me_fw);
+--- a/drivers/gpu/drm/radeon/radeon_cp.c
++++ b/drivers/gpu/drm/radeon/radeon_cp.c
+@@ -544,10 +544,7 @@ static int radeon_cp_init_microcode(drm_
+
+ err = request_firmware(&dev_priv->me_fw, fw_name, &pdev->dev);
+ platform_device_unregister(pdev);
+- if (err) {
+- printk(KERN_ERR "radeon_cp: Failed to load firmware \"%s\"\n",
+- fw_name);
+- } else if (dev_priv->me_fw->size % 8) {
++ if (err == 0 && dev_priv->me_fw->size % 8) {
+ printk(KERN_ERR
+ "radeon_cp: Bogus length %zu in firmware \"%s\"\n",
+ dev_priv->me_fw->size, fw_name);
+--- a/drivers/infiniband/hw/qib/qib_sd7220.c
++++ b/drivers/infiniband/hw/qib/qib_sd7220.c
+@@ -405,10 +405,8 @@ int qib_sd7220_init(struct qib_devdata *
+ }
+
+ ret = request_firmware(&fw, SD7220_FW_NAME, &dd->pcidev->dev);
+- if (ret) {
+- qib_dev_err(dd, "Failed to load IB SERDES image\n");
++ if (ret)
+ goto done;
+- }
+
+ /* Substitute our deduced value for was_reset */
+ ret = qib_ibsd_ucode_loaded(dd->pport, fw);
+--- a/drivers/input/touchscreen/atmel_mxt_ts.c
++++ b/drivers/input/touchscreen/atmel_mxt_ts.c
+@@ -956,10 +956,8 @@ static int mxt_load_fw(struct device *de
+ int ret;
+
+ ret = request_firmware(&fw, fn, dev);
+- if (ret) {
+- dev_err(dev, "Unable to open firmware %s\n", fn);
++ if (ret)
+ return ret;
+- }
+
+ /* Change to the bootloader mode */
+ mxt_write_object(data, MXT_GEN_COMMAND_T6,
+--- a/drivers/isdn/hardware/mISDN/speedfax.c
++++ b/drivers/isdn/hardware/mISDN/speedfax.c
+@@ -392,11 +392,8 @@ setup_instance(struct sfax_hw *card)
+ card->isar.owner = THIS_MODULE;
+
+ err = request_firmware(&firmware, "isdn/ISAR.BIN", &card->pdev->dev);
+- if (err < 0) {
+- pr_info("%s: firmware request failed %d\n",
+- card->name, err);
++ if (err)
+ goto error_fw;
+- }
+ if (debug & DEBUG_HW)
+ pr_notice("%s: got firmware %zu bytes\n",
+ card->name, firmware->size);
+--- a/drivers/media/common/tuners/tuner-xc2028.c
++++ b/drivers/media/common/tuners/tuner-xc2028.c
+@@ -1350,7 +1350,6 @@ static void load_firmware_cb(const struc
+
+ tuner_dbg("request_firmware_nowait(): %s\n", fw ? "OK" : "error");
+ if (!fw) {
+- tuner_err("Could not load firmware %s.\n", priv->fname);
+ priv->state = XC2028_NODEV;
+ return;
+ }
+--- a/drivers/media/dvb/dvb-usb/dib0700_devices.c
++++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c
+@@ -2108,12 +2108,9 @@ static int stk9090m_frontend_attach(stru
+
+ dib9000_i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, 0x80);
+
+- if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) {
+- deb_info("%s: Upload failed. (file not found?)\n", __func__);
++ if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev))
+ return -ENODEV;
+- } else {
+- deb_info("%s: firmware read %Zu bytes.\n", __func__, state->frontend_firmware->size);
+- }
++ deb_info("%s: firmware read %Zu bytes.\n", __func__, state->frontend_firmware->size);
+ stk9090m_config.microcode_B_fe_size = state->frontend_firmware->size;
+ stk9090m_config.microcode_B_fe_buffer = state->frontend_firmware->data;
+
+@@ -2174,12 +2171,9 @@ static int nim9090md_frontend_attach(str
+ msleep(20);
+ dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1);
+
+- if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev)) {
+- deb_info("%s: Upload failed. (file not found?)\n", __func__);
++ if (request_firmware(&state->frontend_firmware, "dib9090.fw", &adap->dev->udev->dev))
+ return -EIO;
+- } else {
+- deb_info("%s: firmware read %Zu bytes.\n", __func__, state->frontend_firmware->size);
+- }
++ deb_info("%s: firmware read %Zu bytes.\n", __func__, state->frontend_firmware->size);
+ nim9090md_config[0].microcode_B_fe_size = state->frontend_firmware->size;
+ nim9090md_config[0].microcode_B_fe_buffer = state->frontend_firmware->data;
+ nim9090md_config[1].microcode_B_fe_size = state->frontend_firmware->size;
+--- a/drivers/media/dvb/dvb-usb/dvb-usb-firmware.c
++++ b/drivers/media/dvb/dvb-usb/dvb-usb-firmware.c
+@@ -80,14 +80,9 @@ int dvb_usb_download_firmware(struct usb
+ int ret;
+ const struct firmware *fw = NULL;
+
+- if ((ret = request_firmware(&fw, props->firmware, &udev->dev)) != 0) {
+- err("did not find the firmware file. (%s) "
+- "Please see linux/Documentation/dvb/ for more details on firmware-problems. (%d)",
+- props->firmware,ret);
++ ret = request_firmware(&fw, props->firmware, &udev->dev);
++ if (ret)
+ return ret;
+- }
+-
+- info("downloading firmware from file '%s'",props->firmware);
+
+ switch (props->usb_ctrl) {
+ case CYPRESS_AN2135:
+--- a/drivers/media/dvb/dvb-usb/gp8psk.c
++++ b/drivers/media/dvb/dvb-usb/gp8psk.c
+@@ -116,20 +116,14 @@ static int gp8psk_load_bcm4500fw(struct
+ const u8 *ptr;
+ u8 *buf;
+ if ((ret = request_firmware(&fw, bcm4500_firmware,
+- &d->udev->dev)) != 0) {
+- err("did not find the bcm4500 firmware file. (%s) "
+- "Please see linux/Documentation/dvb/ for more details on firmware-problems. (%d)",
+- bcm4500_firmware,ret);
++ &d->udev->dev)) != 0)
+ return ret;
+- }
+
+ ret = -EINVAL;
+
+ if (gp8psk_usb_out_op(d, LOAD_BCM4500,1,0,NULL, 0))
+ goto out_rel_fw;
+
+- info("downloading bcm4500 firmware from file '%s'",bcm4500_firmware);
+-
+ ptr = fw->data;
+ buf = kmalloc(64, GFP_KERNEL | GFP_DMA);
+ if (!buf) {
+--- a/drivers/media/dvb/dvb-usb/opera1.c
++++ b/drivers/media/dvb/dvb-usb/opera1.c
+@@ -452,9 +452,6 @@ static int opera1_xilinx_load_firmware(s
+ info("start downloading fpga firmware %s",filename);
+
+ if ((ret = request_firmware(&fw, filename, &dev->dev)) != 0) {
+- err("did not find the firmware file. (%s) "
+- "Please see linux/Documentation/dvb/ for more details on firmware-problems.",
+- filename);
+ return ret;
+ } else {
+ p = kmalloc(fw->size, GFP_KERNEL);
+--- a/drivers/media/dvb/frontends/af9013.c
++++ b/drivers/media/dvb/frontends/af9013.c
+@@ -1348,15 +1348,8 @@ static int af9013_download_firmware(stru
+
+ /* request the firmware, this will block and timeout */
+ ret = request_firmware(&fw, fw_file, state->i2c->dev.parent);
+- if (ret) {
+- err("did not find the firmware file. (%s) "
+- "Please see linux/Documentation/dvb/ for more details" \
+- " on firmware-problems. (%d)",
+- fw_file, ret);
++ if (ret)
+ goto err;
+- }
+-
+- info("downloading firmware from file '%s'", fw_file);
+
+ /* calc checksum */
+ for (i = 0; i < fw->size; i++)
+--- a/drivers/media/dvb/frontends/bcm3510.c
++++ b/drivers/media/dvb/frontends/bcm3510.c
+@@ -622,10 +622,9 @@ static int bcm3510_download_firmware(str
+ int ret,i;
+
+ deb_info("requesting firmware\n");
+- if ((ret = st->config->request_firmware(fe, &fw, BCM3510_DEFAULT_FIRMWARE)) < 0) {
+- err("could not load firmware (%s): %d",BCM3510_DEFAULT_FIRMWARE,ret);
++ ret = st->config->request_firmware(fe, &fw, BCM3510_DEFAULT_FIRMWARE);
++ if (ret)
+ return ret;
+- }
+ deb_info("got firmware: %zd\n",fw->size);
+
+ b = fw->data;
+--- a/drivers/media/dvb/frontends/cx24116.c
++++ b/drivers/media/dvb/frontends/cx24116.c
+@@ -493,13 +493,8 @@ static int cx24116_firmware_ondemand(str
+ __func__, CX24116_DEFAULT_FIRMWARE);
+ ret = request_firmware(&fw, CX24116_DEFAULT_FIRMWARE,
+ state->i2c->dev.parent);
+- printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n",
+- __func__);
+- if (ret) {
+- printk(KERN_ERR "%s: No firmware uploaded "
+- "(timeout or file not found?)\n", __func__);
++ if (ret)
+ return ret;
+- }
+
+ /* Make sure we don't recurse back through here
+ * during loading */
+--- a/drivers/media/dvb/frontends/drxd_hard.c
++++ b/drivers/media/dvb/frontends/drxd_hard.c
+@@ -909,10 +909,8 @@ static int load_firmware(struct drxd_sta
+ {
+ const struct firmware *fw;
+
+- if (request_firmware(&fw, fw_name, state->dev) < 0) {
+- printk(KERN_ERR "drxd: firmware load failure [%s]\n", fw_name);
++ if (request_firmware(&fw, fw_name, state->dev))
+ return -EIO;
+- }
+
+ state->microcode = kmemdup(fw->data, fw->size, GFP_KERNEL);
+ if (state->microcode == NULL) {
+--- a/drivers/media/dvb/frontends/drxk_hard.c
++++ b/drivers/media/dvb/frontends/drxk_hard.c
+@@ -6275,12 +6275,6 @@ static void load_firmware_cb(const struc
+
+ dprintk(1, ": %s\n", fw ? "firmware loaded" : "firmware not loaded");
+ if (!fw) {
+- printk(KERN_ERR
+- "drxk: Could not load firmware file %s.\n",
+- state->microcode_name);
+- printk(KERN_INFO
+- "drxk: Copy %s to your hotplug directory!\n",
+- state->microcode_name);
+ state->microcode_name = NULL;
+
+ /*
+--- a/drivers/media/dvb/frontends/ds3000.c
++++ b/drivers/media/dvb/frontends/ds3000.c
+@@ -403,12 +403,8 @@ static int ds3000_firmware_ondemand(stru
+ DS3000_DEFAULT_FIRMWARE);
+ ret = request_firmware(&fw, DS3000_DEFAULT_FIRMWARE,
+ state->i2c->dev.parent);
+- printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", __func__);
+- if (ret) {
+- printk(KERN_ERR "%s: No firmware uploaded (timeout or file not "
+- "found?)\n", __func__);
++ if (ret)
+ return ret;
+- }
+
+ /* Make sure we don't recurse back through here during loading */
+ state->skip_fw_load = 1;
+--- a/drivers/media/dvb/frontends/nxt200x.c
++++ b/drivers/media/dvb/frontends/nxt200x.c
+@@ -881,11 +881,8 @@ static int nxt2002_init(struct dvb_front
+ printk("nxt2002: Waiting for firmware upload (%s)...\n", NXT2002_DEFAULT_FIRMWARE);
+ ret = request_firmware(&fw, NXT2002_DEFAULT_FIRMWARE,
+ state->i2c->dev.parent);
+- printk("nxt2002: Waiting for firmware upload(2)...\n");
+- if (ret) {
+- printk("nxt2002: No firmware uploaded (timeout or file not found?)\n");
++ if (ret)
+ return ret;
+- }
+
+ ret = nxt2002_load_firmware(fe, fw);
+ release_firmware(fw);
+@@ -946,11 +943,8 @@ static int nxt2004_init(struct dvb_front
+ printk("nxt2004: Waiting for firmware upload (%s)...\n", NXT2004_DEFAULT_FIRMWARE);
+ ret = request_firmware(&fw, NXT2004_DEFAULT_FIRMWARE,
+ state->i2c->dev.parent);
+- printk("nxt2004: Waiting for firmware upload(2)...\n");
+- if (ret) {
+- printk("nxt2004: No firmware uploaded (timeout or file not found?)\n");
++ if (ret)
+ return ret;
+- }
+
+ ret = nxt2004_load_firmware(fe, fw);
+ release_firmware(fw);
+--- a/drivers/media/dvb/frontends/or51132.c
++++ b/drivers/media/dvb/frontends/or51132.c
+@@ -341,11 +341,8 @@ static int or51132_set_parameters(struct
+ printk("or51132: Waiting for firmware upload(%s)...\n",
+ fwname);
+ ret = request_firmware(&fw, fwname, state->i2c->dev.parent);
+- if (ret) {
+- printk(KERN_WARNING "or51132: No firmware up"
+- "loaded(timeout or file not found?)\n");
++ if (ret)
+ return ret;
+- }
+ ret = or51132_load_firmware(fe, fw);
+ release_firmware(fw);
+ if (ret) {
+--- a/drivers/media/dvb/frontends/or51211.c
++++ b/drivers/media/dvb/frontends/or51211.c
+@@ -379,12 +379,8 @@ static int or51211_init(struct dvb_front
+ "(%s)...\n", OR51211_DEFAULT_FIRMWARE);
+ ret = config->request_firmware(fe, &fw,
+ OR51211_DEFAULT_FIRMWARE);
+- printk(KERN_INFO "or51211:Got Hotplug firmware\n");
+- if (ret) {
+- printk(KERN_WARNING "or51211: No firmware uploaded "
+- "(timeout or file not found?)\n");
++ if (ret)
+ return ret;
+- }
+
+ ret = or51211_load_firmware(fe, fw);
+ release_firmware(fw);
+--- a/drivers/media/dvb/frontends/sp8870.c
++++ b/drivers/media/dvb/frontends/sp8870.c
+@@ -315,10 +315,8 @@ static int sp8870_init (struct dvb_front
+
+ /* request the firmware, this will block until someone uploads it */
+ printk("sp8870: waiting for firmware upload (%s)...\n", SP8870_DEFAULT_FIRMWARE);
+- if (state->config->request_firmware(fe, &fw, SP8870_DEFAULT_FIRMWARE)) {
+- printk("sp8870: no firmware upload (timeout or file not found?)\n");
++ if (state->config->request_firmware(fe, &fw, SP8870_DEFAULT_FIRMWARE))
+ return -EIO;
+- }
+
+ if (sp8870_firmware_upload(state, fw)) {
+ printk("sp8870: writing firmware to device failed\n");
+--- a/drivers/media/dvb/frontends/sp887x.c
++++ b/drivers/media/dvb/frontends/sp887x.c
+@@ -527,10 +527,8 @@ static int sp887x_init(struct dvb_fronte
+ /* request the firmware, this will block until someone uploads it */
+ printk("sp887x: waiting for firmware upload (%s)...\n", SP887X_DEFAULT_FIRMWARE);
+ ret = state->config->request_firmware(fe, &fw, SP887X_DEFAULT_FIRMWARE);
+- if (ret) {
+- printk("sp887x: no firmware upload (timeout or file not found?)\n");
++ if (ret)
+ return ret;
+- }
+
+ ret = sp887x_initial_setup(fe, fw);
+ release_firmware(fw);
+--- a/drivers/media/dvb/frontends/tda10048.c
++++ b/drivers/media/dvb/frontends/tda10048.c
+@@ -495,8 +495,6 @@ static int tda10048_firmware_upload(stru
+ ret = request_firmware(&fw, TDA10048_DEFAULT_FIRMWARE,
+ state->i2c->dev.parent);
+ if (ret) {
+- printk(KERN_ERR "%s: Upload failed. (file not found?)\n",
+- __func__);
+ return -EIO;
+ } else {
+ printk(KERN_INFO "%s: firmware read %Zu bytes.\n",
+--- a/drivers/media/dvb/frontends/tda1004x.c
++++ b/drivers/media/dvb/frontends/tda1004x.c
+@@ -397,10 +397,8 @@ static int tda10045_fwupload(struct dvb_
+ /* request the firmware, this will block until someone uploads it */
+ printk(KERN_INFO "tda1004x: waiting for firmware upload (%s)...\n", TDA10045_DEFAULT_FIRMWARE);
+ ret = state->config->request_firmware(fe, &fw, TDA10045_DEFAULT_FIRMWARE);
+- if (ret) {
+- printk(KERN_ERR "tda1004x: no firmware upload (timeout or file not found?)\n");
++ if (ret)
+ return ret;
+- }
+
+ /* reset chip */
+ tda1004x_write_mask(state, TDA1004X_CONFC4, 0x10, 0);
+@@ -541,7 +539,6 @@ static int tda10046_fwupload(struct dvb_
+ /* remain compatible to old bug: try to load with tda10045 image name */
+ ret = state->config->request_firmware(fe, &fw, TDA10045_DEFAULT_FIRMWARE);
+ if (ret) {
+- printk(KERN_ERR "tda1004x: no firmware upload (timeout or file not found?)\n");
+ return ret;
+ } else {
+ printk(KERN_INFO "tda1004x: please rename the firmware file to %s\n",
+--- a/drivers/media/dvb/frontends/tda10071.c
++++ b/drivers/media/dvb/frontends/tda10071.c
+@@ -939,14 +939,8 @@ static int tda10071_init(struct dvb_fron
+
+ /* request the firmware, this will block and timeout */
+ ret = request_firmware(&fw, fw_file, priv->i2c->dev.parent);
+- if (ret) {
+- dev_err(&priv->i2c->dev, "%s: did not find the " \
+- "firmware file. (%s) Please see " \
+- "linux/Documentation/dvb/ for more " \
+- "details on firmware-problems. (%d)\n",
+- KBUILD_MODNAME, fw_file, ret);
++ if (ret)
+ goto error;
+- }
+
+ /* init */
+ for (i = 0; i < ARRAY_SIZE(tab2); i++) {
+--- a/drivers/media/dvb/ngene/ngene-core.c
++++ b/drivers/media/dvb/ngene/ngene-core.c
+@@ -1272,13 +1272,8 @@ static int ngene_load_firm(struct ngene
+ break;
+ }
+
+- if (request_firmware(&fw, fw_name, &dev->pci_dev->dev) < 0) {
+- printk(KERN_ERR DEVICE_NAME
+- ": Could not load firmware file %s.\n", fw_name);
+- printk(KERN_INFO DEVICE_NAME
+- ": Copy %s to your hotplug directory!\n", fw_name);
++ if (request_firmware(&fw, fw_name, &dev->pci_dev->dev))
+ return -1;
+- }
+ if (size == 0)
+ size = fw->size;
+ if (size != fw->size) {
+@@ -1286,8 +1281,6 @@ static int ngene_load_firm(struct ngene
+ ": Firmware %s has invalid size!", fw_name);
+ err = -1;
+ } else {
+- printk(KERN_INFO DEVICE_NAME
+- ": Loading firmware file %s.\n", fw_name);
+ ngene_fw = (u8 *) fw->data;
+ err = ngene_command_load_firmware(dev, ngene_fw, size);
+ }
+--- a/drivers/media/dvb/siano/smscoreapi.c
++++ b/drivers/media/dvb/siano/smscoreapi.c
+@@ -639,10 +639,8 @@ static int smscore_load_firmware_from_fi
+ return -EINVAL;
+
+ rc = request_firmware(&fw, filename, coredev->device);
+- if (rc < 0) {
+- sms_info("failed to open \"%s\"", filename);
++ if (rc)
+ return rc;
+- }
+ sms_info("read FW %s, size=%zd", filename, fw->size);
+ fw_buffer = kmalloc(ALIGN(fw->size, SMS_ALLOC_ALIGNMENT),
+ GFP_KERNEL | GFP_DMA);
+--- a/drivers/media/dvb/ttpci/av7110.c
++++ b/drivers/media/dvb/ttpci/av7110.c
+@@ -1531,16 +1531,9 @@ static int get_firmware(struct av7110* a
+ /* request the av7110 firmware, this will block until someone uploads it */
+ ret = request_firmware(&fw, "dvb-ttpci-01.fw", &av7110->dev->pci->dev);
+ if (ret) {
+- if (ret == -ENOENT) {
+- printk(KERN_ERR "dvb-ttpci: could not load firmware,"
+- " file not found: dvb-ttpci-01.fw\n");
+- printk(KERN_ERR "dvb-ttpci: usually this should be in "
+- "/usr/lib/hotplug/firmware or /lib/firmware\n");
+- printk(KERN_ERR "dvb-ttpci: and can be downloaded from"
++ if (ret == -ENOENT)
++ printk(KERN_ERR "dvb-ttpci: firmware can be downloaded from"
+ " http://www.linuxtv.org/download/dvb/firmware/\n");
+- } else
+- printk(KERN_ERR "dvb-ttpci: cannot request firmware"
+- " (error %i)\n", ret);
+ return -EINVAL;
+ }
+
+--- a/drivers/media/dvb/ttpci/av7110_hw.c
++++ b/drivers/media/dvb/ttpci/av7110_hw.c
+@@ -243,11 +243,8 @@ int av7110_bootarm(struct av7110 *av7110
+ //saa7146_setgpio(dev, 3, SAA7146_GPIO_INPUT);
+
+ ret = request_firmware(&fw, fw_name, &dev->pci->dev);
+- if (ret) {
+- printk(KERN_ERR "dvb-ttpci: Failed to load firmware \"%s\"\n",
+- fw_name);
++ if (ret)
+ return ret;
+- }
+
+ mwdebi(av7110, DEBISWAB, DPRAM_BASE, fw->data, fw->size);
+ release_firmware(fw);
+--- a/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
++++ b/drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c
+@@ -296,10 +296,8 @@ static int ttusb_boot_dsp(struct ttusb *
+
+ err = request_firmware(&fw, "ttusb-budget/dspbootcode.bin",
+ &ttusb->dev->dev);
+- if (err) {
+- printk(KERN_ERR "ttusb-budget: failed to request firmware\n");
++ if (err)
+ return err;
+- }
+
+ /* BootBlock */
+ b[0] = 0xaa;
+--- a/drivers/media/dvb/ttusb-dec/ttusb_dec.c
++++ b/drivers/media/dvb/ttusb-dec/ttusb_dec.c
+@@ -1293,11 +1293,8 @@ static int ttusb_dec_boot_dsp(struct ttu
+
+ dprintk("%s\n", __func__);
+
+- if (request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev)) {
+- printk(KERN_ERR "%s: Firmware (%s) unavailable.\n",
+- __func__, dec->firmware_name);
++ if (request_firmware(&fw_entry, dec->firmware_name, &dec->udev->dev))
+ return 1;
+- }
+
+ firmware = fw_entry->data;
+ firmware_size = fw_entry->size;
+--- a/drivers/media/radio/radio-wl1273.c
++++ b/drivers/media/radio/radio-wl1273.c
+@@ -512,11 +512,8 @@ static int wl1273_fm_upload_firmware_pat
+ * Uploading the firmware patch is not always necessary,
+ * so we only print an info message.
+ */
+- if (request_firmware(&fw_p, fw_name, dev)) {
+- dev_info(dev, "%s - %s not found\n", __func__, fw_name);
+-
++ if (request_firmware(&fw_p, fw_name, dev))
+ return 0;
+- }
+
+ ptr = (__u8 *) fw_p->data;
+ packet_num = ptr[0];
+--- a/drivers/media/radio/wl128x/fmdrv_common.c
++++ b/drivers/media/radio/wl128x/fmdrv_common.c
+@@ -1248,10 +1248,8 @@ static int fm_download_firmware(struct f
+
+ ret = request_firmware(&fw_entry, fw_name,
+ &fmdev->radio_dev->dev);
+- if (ret < 0) {
+- fmerr("Unable to read firmware(%s) content\n", fw_name);
++ if (ret)
+ return ret;
+- }
+ fmdbg("Firmware(%s) length : %d bytes\n", fw_name, fw_entry->size);
+
+ fw_data = (void *)fw_entry->data;
+--- a/drivers/media/video/bt8xx/bttv-cards.c
++++ b/drivers/media/video/bt8xx/bttv-cards.c
+@@ -3753,10 +3753,8 @@ static int __devinit pvr_boot(struct btt
+ int rc;
+
+ rc = request_firmware(&fw_entry, "hcwamc.rbf", &btv->c.pci->dev);
+- if (rc != 0) {
+- pr_warn("%d: no altera firmware [via hotplug]\n", btv->c.nr);
++ if (rc != 0)
+ return rc;
+- }
+ rc = pvr_altera_load(btv, fw_entry->data, fw_entry->size);
+ pr_info("%d: altera firmware upload %s\n",
+ btv->c.nr, (rc < 0) ? "failed" : "ok");
+--- a/drivers/media/video/cpia2/cpia2_core.c
++++ b/drivers/media/video/cpia2/cpia2_core.c
+@@ -903,11 +903,8 @@ static int apply_vp_patch(struct camera_
+ struct cpia2_command cmd;
+
+ ret = request_firmware(&fw, fw_name, &cam->dev->dev);
+- if (ret) {
+- printk(KERN_ERR "cpia2: failed to load VP patch \"%s\"\n",
+- fw_name);
++ if (ret)
+ return ret;
+- }
+
+ cmd.req_mode = CAMERAACCESS_TYPE_REPEAT | CAMERAACCESS_VP;
+ cmd.direction = TRANSFER_WRITE;
+--- a/drivers/media/video/cx18/cx18-av-firmware.c
++++ b/drivers/media/video/cx18/cx18-av-firmware.c
+@@ -85,10 +85,8 @@ int cx18_av_loadfw(struct cx18 *cx)
+ int i;
+ int retries1 = 0;
+
+- if (request_firmware(&fw, FWFILE, &cx->pci_dev->dev) != 0) {
+- CX18_ERR_DEV(sd, "unable to open firmware %s\n", FWFILE);
++ if (request_firmware(&fw, FWFILE, &cx->pci_dev->dev) != 0)
+ return -EINVAL;
+- }
+
+ /* The firmware load often has byte errors, so allow for several
+ retries, both at byte level and at the firmware load level. */
+--- a/drivers/media/video/cx18/cx18-dvb.c
++++ b/drivers/media/video/cx18/cx18-dvb.c
+@@ -139,9 +139,7 @@ static int yuan_mpc718_mt352_reqfw(struc
+ int ret;
+
+ ret = request_firmware(fw, fn, &cx->pci_dev->dev);
+- if (ret)
+- CX18_ERR("Unable to open firmware file %s\n", fn);
+- else {
++ if (!ret) {
+ size_t sz = (*fw)->size;
+ if (sz < 2 || sz > 64 || (sz % 2) != 0) {
+ CX18_ERR("Firmware %s has a bad size: %lu bytes\n",
+@@ -154,7 +152,7 @@ static int yuan_mpc718_mt352_reqfw(struc
+
+ if (ret) {
+ CX18_ERR("The MPC718 board variant with the MT352 DVB-T"
+- "demodualtor will not work without it\n");
++ "demodulator will not work without firmware\n");
+ CX18_ERR("Run 'linux/Documentation/dvb/get_dvb_firmware "
+ "mpc718' if you need the firmware\n");
+ }
+--- a/drivers/media/video/cx18/cx18-firmware.c
++++ b/drivers/media/video/cx18/cx18-firmware.c
+@@ -106,11 +106,8 @@ static int load_cpu_fw_direct(const char
+ u32 __iomem *dst = (u32 __iomem *)mem;
+ const u32 *src;
+
+- if (request_firmware(&fw, fn, &cx->pci_dev->dev)) {
+- CX18_ERR("Unable to open firmware %s\n", fn);
+- CX18_ERR("Did you put the firmware in the hotplug firmware directory?\n");
++ if (request_firmware(&fw, fn, &cx->pci_dev->dev))
+ return -ENOMEM;
+- }
+
+ src = (const u32 *)fw->data;
+
+@@ -151,8 +148,6 @@ static int load_apu_fw_direct(const char
+ int sz;
+
+ if (request_firmware(&fw, fn, &cx->pci_dev->dev)) {
+- CX18_ERR("unable to open firmware %s\n", fn);
+- CX18_ERR("did you put the firmware in the hotplug firmware directory?\n");
+ cx18_setup_page(cx, 0);
+ return -ENOMEM;
+ }
+--- a/drivers/media/video/cx231xx/cx231xx-417.c
++++ b/drivers/media/video/cx231xx/cx231xx-417.c
+@@ -979,14 +979,8 @@ static int cx231xx_load_firmware(struct
+ retval = request_firmware(&firmware, CX231xx_FIRM_IMAGE_NAME,
+ &dev->udev->dev);
+
+- if (retval != 0) {
+- printk(KERN_ERR
+- "ERROR: Hotplug firmware request failed (%s).\n",
+- CX231xx_FIRM_IMAGE_NAME);
+- printk(KERN_ERR "Please fix your hotplug setup, the board will "
+- "not work without firmware loaded!\n");
++ if (retval != 0)
+ return -1;
+- }
+
+ if (firmware->size != CX231xx_FIRM_IMAGE_SIZE) {
+ printk(KERN_ERR "ERROR: Firmware size mismatch "
+--- a/drivers/media/video/cx23885/cx23885-417.c
++++ b/drivers/media/video/cx23885/cx23885-417.c
+@@ -930,14 +930,8 @@ static int cx23885_load_firmware(struct
+ retval = request_firmware(&firmware, CX23885_FIRM_IMAGE_NAME,
+ &dev->pci->dev);
+
+- if (retval != 0) {
+- printk(KERN_ERR
+- "ERROR: Hotplug firmware request failed (%s).\n",
+- CX23885_FIRM_IMAGE_NAME);
+- printk(KERN_ERR "Please fix your hotplug setup, the board will "
+- "not work without firmware loaded!\n");
++ if (retval != 0)
+ return -1;
+- }
+
+ if (firmware->size != CX23885_FIRM_IMAGE_SIZE) {
+ printk(KERN_ERR "ERROR: Firmware size mismatch "
+--- a/drivers/media/video/cx23885/cx23885-cards.c
++++ b/drivers/media/video/cx23885/cx23885-cards.c
+@@ -1664,11 +1664,7 @@ void cx23885_card_setup(struct cx23885_d
+ cinfo.rev, filename);
+
+ ret = request_firmware(&fw, filename, &dev->pci->dev);
+- if (ret != 0)
+- printk(KERN_ERR "did not find the firmware file. (%s) "
+- "Please see linux/Documentation/dvb/ for more details "
+- "on firmware-problems.", filename);
+- else
++ if (ret == 0)
+ altera_init(&netup_config, fw);
+
+ release_firmware(fw);
+--- a/drivers/media/video/cx25840/cx25840-firmware.c
++++ b/drivers/media/video/cx25840/cx25840-firmware.c
+@@ -123,10 +123,8 @@ int cx25840_loadfw(struct i2c_client *cl
+ MAX_BUF_SIZE = 16; /* cx231xx cannot accept more than 16 bytes at a time */
+ }
+
+- if (request_firmware(&fw, fwname, FWDEV(client)) != 0) {
+- v4l_err(client, "unable to open firmware %s\n", fwname);
++ if (request_firmware(&fw, fwname, FWDEV(client)) != 0)
+ return -EINVAL;
+- }
+
+ start_fw_load(client);
+
+--- a/drivers/media/video/cx88/cx88-blackbird.c
++++ b/drivers/media/video/cx88/cx88-blackbird.c
+@@ -447,13 +447,8 @@ static int blackbird_load_firmware(struc
+ &dev->pci->dev);
+
+
+- if (retval != 0) {
+- dprintk(0, "ERROR: Hotplug firmware request failed (%s).\n",
+- CX2341X_FIRM_ENC_FILENAME);
+- dprintk(0, "Please fix your hotplug setup, the board will "
+- "not work without firmware loaded!\n");
++ if (retval != 0)
+ return -1;
+- }
+
+ if (firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) {
+ dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d)\n",
+--- a/drivers/media/video/gspca/vicam.c
++++ b/drivers/media/video/gspca/vicam.c
+@@ -245,10 +245,8 @@ static int sd_init(struct gspca_dev *gsp
+
+ ret = request_ihex_firmware(&fw, VICAM_FIRMWARE,
+ &gspca_dev->dev->dev);
+- if (ret) {
+- pr_err("Failed to load \"vicam/firmware.fw\": %d\n", ret);
++ if (ret)
+ return ret;
+- }
+
+ firmware_buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
+ if (!firmware_buf) {
+--- a/drivers/media/video/ivtv/ivtv-firmware.c
++++ b/drivers/media/video/ivtv/ivtv-firmware.c
+@@ -80,8 +80,6 @@ retry:
+ release_firmware(fw);
+ return size;
+ }
+- IVTV_ERR("Unable to open firmware %s (must be %ld bytes)\n", fn, size);
+- IVTV_ERR("Did you put the firmware in the hotplug firmware directory?\n");
+ return -ENOMEM;
+ }
+
+--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
++++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+@@ -1382,29 +1382,6 @@ static int pvr2_locate_firmware(struct p
+ "request_firmware fatal error with code=%d",ret);
+ return ret;
+ }
+- pvr2_trace(PVR2_TRACE_ERROR_LEGS,
+- "***WARNING***"
+- " Device %s firmware"
+- " seems to be missing.",
+- fwtypename);
+- pvr2_trace(PVR2_TRACE_ERROR_LEGS,
+- "Did you install the pvrusb2 firmware files"
+- " in their proper location?");
+- if (fwcount == 1) {
+- pvr2_trace(PVR2_TRACE_ERROR_LEGS,
+- "request_firmware unable to locate %s file %s",
+- fwtypename,fwnames[0]);
+- } else {
+- pvr2_trace(PVR2_TRACE_ERROR_LEGS,
+- "request_firmware unable to locate"
+- " one of the following %s files:",
+- fwtypename);
+- for (idx = 0; idx < fwcount; idx++) {
+- pvr2_trace(PVR2_TRACE_ERROR_LEGS,
+- "request_firmware: Failed to find %s",
+- fwnames[idx]);
+- }
+- }
+ return ret;
+ }
+
+--- a/drivers/media/video/s2255drv.c
++++ b/drivers/media/video/s2255drv.c
+@@ -2585,10 +2585,8 @@ static int s2255_probe(struct usb_interf
+ }
+ /* load the first chunk */
+ if (request_firmware(&dev->fw_data->fw,
+- FIRMWARE_FILE_NAME, &dev->udev->dev)) {
+- printk(KERN_ERR "sensoray 2255 failed to get firmware\n");
++ FIRMWARE_FILE_NAME, &dev->udev->dev))
+ goto errorREQFW;
+- }
+ /* check the firmware is valid */
+ fw_size = dev->fw_data->fw->size;
+ pdata = (__le32 *) &dev->fw_data->fw->data[fw_size - 8];
+--- a/drivers/media/video/s5p-mfc/s5p_mfc_ctrl.c
++++ b/drivers/media/video/s5p-mfc/s5p_mfc_ctrl.c
+@@ -39,10 +39,8 @@ int s5p_mfc_alloc_and_load_firmware(stru
+ mfc_debug_enter();
+ err = request_firmware((const struct firmware **)&fw_blob,
+ "s5p-mfc.fw", dev->v4l2_dev.dev);
+- if (err != 0) {
+- mfc_err("Firmware is not present in the /lib/firmware directory nor compiled in kernel\n");
++ if (err != 0)
+ return -EINVAL;
+- }
+ dev->fw_size = ALIGN(fw_blob->size, FIRMWARE_ALIGN);
+ if (s5p_mfc_bitproc_buf) {
+ mfc_err("Attempting to allocate firmware when it seems that it is already loaded\n");
+@@ -117,10 +115,8 @@ int s5p_mfc_reload_firmware(struct s5p_m
+ mfc_debug_enter();
+ err = request_firmware((const struct firmware **)&fw_blob,
+ "s5p-mfc.fw", dev->v4l2_dev.dev);
+- if (err != 0) {
+- mfc_err("Firmware is not present in the /lib/firmware directory nor compiled in kernel\n");
++ if (err != 0)
+ return -EINVAL;
+- }
+ if (fw_blob->size > dev->fw_size) {
+ mfc_err("MFC firmware is too big to be loaded\n");
+ release_firmware(fw_blob);
+--- a/drivers/media/video/saa7164/saa7164-fw.c
++++ b/drivers/media/video/saa7164/saa7164-fw.c
+@@ -420,11 +420,8 @@ int saa7164_downloadfirmware(struct saa7
+ __func__, fwname);
+
+ ret = request_firmware(&fw, fwname, &dev->pci->dev);
+- if (ret) {
+- printk(KERN_ERR "%s() Upload failed. "
+- "(file not found?)\n", __func__);
++ if (ret)
+ return -ENOMEM;
+- }
+
+ printk(KERN_INFO "%s() firmware read %Zu bytes.\n",
+ __func__, fw->size);
+--- a/drivers/media/video/tlg2300/pd-main.c
++++ b/drivers/media/video/tlg2300/pd-main.c
+@@ -220,10 +220,8 @@ static int firmware_download(struct usb_
+ size_t max_packet_size;
+
+ ret = request_firmware(&fw, firmware_name, &udev->dev);
+- if (ret) {
+- log("download err : %d", ret);
++ if (ret)
+ return ret;
+- }
+
+ fwlength = fw->size;
+
+--- a/drivers/misc/ti-st/st_kim.c
++++ b/drivers/misc/ti-st/st_kim.c
+@@ -281,11 +281,8 @@ static long download_firmware(struct kim
+ request_firmware(&kim_gdata->fw_entry, bts_scr_name,
+ &kim_gdata->kim_pdev->dev);
+ if (unlikely((err != 0) || (kim_gdata->fw_entry->data == NULL) ||
+- (kim_gdata->fw_entry->size == 0))) {
+- pr_err(" request_firmware failed(errno %ld) for %s", err,
+- bts_scr_name);
++ (kim_gdata->fw_entry->size == 0)))
+ return -EINVAL;
+- }
+ ptr = (void *)kim_gdata->fw_entry->data;
+ len = kim_gdata->fw_entry->size;
+ /* bts_header to remove out magic number and
+--- a/drivers/net/can/softing/softing_fw.c
++++ b/drivers/net/can/softing/softing_fw.c
+@@ -238,11 +238,8 @@ int softing_load_app_fw(const char *file
+ int8_t type_end = 0, type_entrypoint = 0;
+
+ ret = request_firmware(&fw, file, &card->pdev->dev);
+- if (ret) {
+- dev_alert(&card->pdev->dev, "request_firmware(%s) got %i\n",
+- file, ret);
++ if (ret)
+ return ret;
+- }
+ dev_dbg(&card->pdev->dev, "firmware(%s) got %lu bytes\n",
+ file, (unsigned long)fw->size);
+ /* parse the firmware */
+--- a/drivers/net/ethernet/3com/typhoon.c
++++ b/drivers/net/ethernet/3com/typhoon.c
+@@ -1279,11 +1279,8 @@ typhoon_request_firmware(struct typhoon
+ return 0;
+
+ err = request_firmware(&typhoon_fw, FIRMWARE_NAME, &tp->pdev->dev);
+- if (err) {
+- netdev_err(tp->dev, "Failed to load firmware \"%s\"\n",
+- FIRMWARE_NAME);
++ if (err)
+ return err;
+- }
+
+ image_data = (u8 *) typhoon_fw->data;
+ remaining = typhoon_fw->size;
+--- a/drivers/net/ethernet/adaptec/starfire.c
++++ b/drivers/net/ethernet/adaptec/starfire.c
+@@ -1015,11 +1015,8 @@ static int netdev_open(struct net_device
+ #endif /* VLAN_SUPPORT */
+
+ retval = request_firmware(&fw_rx, FIRMWARE_RX, &np->pci_dev->dev);
+- if (retval) {
+- printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n",
+- FIRMWARE_RX);
++ if (retval)
+ goto out_init;
+- }
+ if (fw_rx->size % 4) {
+ printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n",
+ fw_rx->size, FIRMWARE_RX);
+@@ -1027,11 +1024,8 @@ static int netdev_open(struct net_device
+ goto out_rx;
+ }
+ retval = request_firmware(&fw_tx, FIRMWARE_TX, &np->pci_dev->dev);
+- if (retval) {
+- printk(KERN_ERR "starfire: Failed to load firmware \"%s\"\n",
+- FIRMWARE_TX);
++ if (retval)
+ goto out_rx;
+- }
+ if (fw_tx->size % 4) {
+ printk(KERN_ERR "starfire: bogus length %zu in \"%s\"\n",
+ fw_tx->size, FIRMWARE_TX);
+--- a/drivers/net/ethernet/alteon/acenic.c
++++ b/drivers/net/ethernet/alteon/acenic.c
+@@ -2902,11 +2902,8 @@ static int __devinit ace_load_firmware(s
+ fw_name = "acenic/tg1.bin";
+
+ ret = request_firmware(&fw, fw_name, &ap->pdev->dev);
+- if (ret) {
+- printk(KERN_ERR "%s: Failed to load firmware \"%s\"\n",
+- ap->name, fw_name);
++ if (ret)
+ return ret;
+- }
+
+ fw_data = (void *)fw->data;
+
+--- a/drivers/net/ethernet/broadcom/bnx2.c
++++ b/drivers/net/ethernet/broadcom/bnx2.c
+@@ -3676,16 +3676,13 @@ static int bnx2_request_uncached_firmwar
+ }
+
+ rc = request_firmware(&bp->mips_firmware, mips_fw_file, &bp->pdev->dev);
+- if (rc) {
+- pr_err("Can't load firmware file \"%s\"\n", mips_fw_file);
++ if (rc)
+ goto out;
+- }
+
+ rc = request_firmware(&bp->rv2p_firmware, rv2p_fw_file, &bp->pdev->dev);
+- if (rc) {
+- pr_err("Can't load firmware file \"%s\"\n", rv2p_fw_file);
++ if (rc)
+ goto err_release_mips_firmware;
+- }
++
+ mips_fw = (const struct bnx2_mips_fw_file *) bp->mips_firmware->data;
+ rv2p_fw = (const struct bnx2_rv2p_fw_file *) bp->rv2p_firmware->data;
+ if (bp->mips_firmware->size < sizeof(*mips_fw) ||
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+@@ -11642,11 +11642,8 @@ static int bnx2x_init_firmware(struct bn
+ BNX2X_DEV_INFO("Loading %s\n", fw_file_name);
+
+ rc = request_firmware(&bp->firmware, fw_file_name, &bp->pdev->dev);
+- if (rc) {
+- BNX2X_ERR("Can't load firmware file %s\n",
+- fw_file_name);
++ if (rc)
+ goto request_firmware_exit;
+- }
+
+ rc = bnx2x_check_firmware(bp);
+ if (rc) {
+--- a/drivers/net/ethernet/broadcom/tg3.c
++++ b/drivers/net/ethernet/broadcom/tg3.c
+@@ -10105,11 +10105,8 @@ static int tg3_request_firmware(struct t
+ {
+ const __be32 *fw_data;
+
+- if (request_firmware(&tp->fw, tp->fw_needed, &tp->pdev->dev)) {
+- netdev_err(tp->dev, "Failed to load firmware \"%s\"\n",
+- tp->fw_needed);
++ if (request_firmware(&tp->fw, tp->fw_needed, &tp->pdev->dev))
+ return -ENOENT;
+- }
+
+ fw_data = (void *)tp->fw->data;
+
+--- a/drivers/net/ethernet/brocade/bna/cna_fwimg.c
++++ b/drivers/net/ethernet/brocade/bna/cna_fwimg.c
+@@ -30,10 +30,8 @@ cna_read_firmware(struct pci_dev *pdev,
+ {
+ const struct firmware *fw;
+
+- if (request_firmware(&fw, fw_name, &pdev->dev)) {
+- pr_alert("Can't locate firmware %s\n", fw_name);
++ if (request_firmware(&fw, fw_name, &pdev->dev))
+ goto error;
+- }
+
+ *bfi_image = (u32 *)fw->data;
+ *bfi_image_size = fw->size/sizeof(u32);
+--- a/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
++++ b/drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
+@@ -1030,12 +1030,8 @@ int t3_get_edc_fw(struct cphy *phy, int
+ snprintf(buf, sizeof(buf), get_edc_fw_name(edc_idx));
+
+ ret = request_firmware(&fw, buf, &adapter->pdev->dev);
+- if (ret < 0) {
+- dev_err(&adapter->pdev->dev,
+- "could not upgrade firmware: unable to load %s\n",
+- buf);
++ if (ret)
+ return ret;
+- }
+
+ /* check size, take checksum in account */
+ if (fw->size > size + 4) {
+@@ -1072,11 +1068,8 @@ static int upgrade_fw(struct adapter *ad
+ struct device *dev = &adap->pdev->dev;
+
+ ret = request_firmware(&fw, FW_FNAME, dev);
+- if (ret < 0) {
+- dev_err(dev, "could not upgrade firmware: unable to load %s\n",
+- FW_FNAME);
++ if (ret)
+ return ret;
+- }
+ ret = t3_load_fw(adap, fw->data, fw->size);
+ release_firmware(fw);
+
+@@ -1121,11 +1114,8 @@ static int update_tpsram(struct adapter
+ snprintf(buf, sizeof(buf), TPSRAM_NAME, rev);
+
+ ret = request_firmware(&tpsram, buf, dev);
+- if (ret < 0) {
+- dev_err(dev, "could not load TP SRAM: unable to load %s\n",
+- buf);
++ if (ret)
+ return ret;
+- }
+
+ ret = t3_check_tpsram(adap, tpsram->data, tpsram->size);
+ if (ret)
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+@@ -834,11 +834,8 @@ static int upgrade_fw(struct adapter *ad
+ struct device *dev = adap->pdev_dev;
+
+ ret = request_firmware(&fw, FW_FNAME, dev);
+- if (ret < 0) {
+- dev_err(dev, "unable to load firmware image " FW_FNAME
+- ", error %d\n", ret);
++ if (ret)
+ return ret;
+- }
+
+ hdr = (const struct fw_hdr *)fw->data;
+ vers = ntohl(hdr->fw_ver);
+--- a/drivers/net/ethernet/intel/e100.c
++++ b/drivers/net/ethernet/intel/e100.c
+@@ -1289,9 +1289,6 @@ static const struct firmware *e100_reque
+
+ if (err) {
+ if (required) {
+- netif_err(nic, probe, nic->netdev,
+- "Failed to load firmware \"%s\": %d\n",
+- fw_name, err);
+ return ERR_PTR(err);
+ } else {
+ netif_info(nic, probe, nic->netdev,
+--- a/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
++++ b/drivers/net/ethernet/myricom/myri10ge/myri10ge.c
+@@ -594,8 +594,6 @@ static int myri10ge_load_hotplug_firmwar
+ unsigned i;
+
+ if ((status = request_firmware(&fw, mgp->fw_name, dev)) < 0) {
+- dev_err(dev, "Unable to load %s firmware image via hotplug\n",
+- mgp->fw_name);
+ status = -EINVAL;
+ goto abort_with_nothing;
+ }
+--- a/drivers/net/ethernet/smsc/smc91c92_cs.c
++++ b/drivers/net/ethernet/smsc/smc91c92_cs.c
+@@ -648,10 +648,8 @@ static int osi_load_firmware(struct pcmc
+ int i, err;
+
+ err = request_firmware(&fw, FIRMWARE_NAME, &link->dev);
+- if (err) {
+- pr_err("Failed to load firmware \"%s\"\n", FIRMWARE_NAME);
++ if (err)
+ return err;
+- }
+
+ /* Download the Seven of Diamonds firmware */
+ for (i = 0; i < fw->size; i++) {
+--- a/drivers/net/ethernet/sun/cassini.c
++++ b/drivers/net/ethernet/sun/cassini.c
+@@ -818,11 +818,8 @@ static int cas_saturn_firmware_init(stru
+ return 0;
+
+ err = request_firmware(&fw, fw_name, &cp->pdev->dev);
+- if (err) {
+- pr_err("Failed to load firmware \"%s\"\n",
+- fw_name);
++ if (err)
+ return err;
+- }
+ if (fw->size < 2) {
+ pr_err("bogus length %zu in \"%s\"\n",
+ fw->size, fw_name);
+--- a/drivers/net/hamradio/yam.c
++++ b/drivers/net/hamradio/yam.c
+@@ -372,11 +372,8 @@ static unsigned char *add_mcs(unsigned c
+ }
+ err = request_firmware(&fw, fw_name[predef], &pdev->dev);
+ platform_device_unregister(pdev);
+- if (err) {
+- printk(KERN_ERR "Failed to load firmware \"%s\"\n",
+- fw_name[predef]);
++ if (err)
+ return NULL;
+- }
+ if (fw->size != YAM_FPGA_SIZE) {
+ printk(KERN_ERR "Bogus length %zu in firmware \"%s\"\n",
+ fw->size, fw_name[predef]);
+--- a/drivers/net/usb/kaweth.c
++++ b/drivers/net/usb/kaweth.c
+@@ -400,10 +400,8 @@ static int kaweth_download_firmware(stru
+ int ret;
+
+ ret = request_firmware(&fw, fwname, &kaweth->dev->dev);
+- if (ret) {
+- dev_err(&kaweth->intf->dev, "Firmware request failed\n");
++ if (ret)
+ return ret;
+- }
+
+ if (fw->size > KAWETH_FIRMWARE_BUF_SIZE) {
+ dev_err(&kaweth->intf->dev, "Firmware too big: %zu\n",
+--- a/drivers/net/wimax/i2400m/fw.c
++++ b/drivers/net/wimax/i2400m/fw.c
+@@ -1583,11 +1583,8 @@ int i2400m_dev_bootstrap(struct i2400m *
+ }
+ d_printf(1, dev, "trying firmware %s (%d)\n", fw_name, itr);
+ ret = request_firmware(&fw, fw_name, dev);
+- if (ret < 0) {
+- dev_err(dev, "fw %s: cannot load file: %d\n",
+- fw_name, ret);
++ if (ret)
+ continue;
+- }
+ i2400m->fw_name = fw_name;
+ ret = i2400m_fw_bootstrap(i2400m, fw, flags);
+ release_firmware(fw);
+@@ -1630,8 +1627,6 @@ void i2400m_fw_cache(struct i2400m *i240
+ kref_init(&i2400m_fw->kref);
+ result = request_firmware(&i2400m_fw->fw, i2400m->fw_name, dev);
+ if (result < 0) {
+- dev_err(dev, "firmware %s: failed to cache: %d\n",
+- i2400m->fw_name, result);
+ kfree(i2400m_fw);
+ i2400m_fw = (void *) ~0;
+ } else
+--- a/drivers/net/wireless/at76c50x-usb.c
++++ b/drivers/net/wireless/at76c50x-usb.c
+@@ -1584,14 +1584,8 @@ static struct fwentry *at76_load_firmwar
+
+ at76_dbg(DBG_FW, "downloading firmware %s", fwe->fwname);
+ ret = request_firmware(&fwe->fw, fwe->fwname, &udev->dev);
+- if (ret < 0) {
+- dev_printk(KERN_ERR, &udev->dev, "firmware %s not found!\n",
+- fwe->fwname);
+- dev_printk(KERN_ERR, &udev->dev,
+- "you may need to download the firmware from "
+- "http://developer.berlios.de/projects/at76c503a/\n");
++ if (ret)
+ goto exit;
+- }
+
+ at76_dbg(DBG_FW, "got it.");
+ fwh = (struct at76_fw_header *)(fwe->fw->data);
+--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
++++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
+@@ -1090,12 +1090,8 @@ static void ath9k_hif_usb_firmware_cb(co
+ struct hif_device_usb *hif_dev = context;
+ int ret;
+
+- if (!fw) {
+- dev_err(&hif_dev->udev->dev,
+- "ath9k_htc: Failed to get firmware %s\n",
+- hif_dev->fw_name);
++ if (!fw)
+ goto err_fw;
+- }
+
+ hif_dev->htc_handle = ath9k_htc_hw_alloc(hif_dev, &hif_usb,
+ &hif_dev->udev->dev);
+--- a/drivers/net/wireless/ath/carl9170/usb.c
++++ b/drivers/net/wireless/ath/carl9170/usb.c
+@@ -1018,7 +1018,6 @@ static void carl9170_usb_firmware_step2(
+ return;
+ }
+
+- dev_err(&ar->udev->dev, "firmware not found.\n");
+ carl9170_usb_firmware_failed(ar);
+ }
+
+--- a/drivers/net/wireless/atmel.c
++++ b/drivers/net/wireless/atmel.c
+@@ -3935,12 +3935,8 @@ static int reset_atmel_card(struct net_d
+ strcpy(priv->firmware_id, "atmel_at76c502.bin");
+ }
+ err = request_firmware(&fw_entry, priv->firmware_id, priv->sys_dev);
+- if (err != 0) {
+- printk(KERN_ALERT
+- "%s: firmware %s is missing, cannot continue.\n",
+- dev->name, priv->firmware_id);
++ if (err != 0)
+ return err;
+- }
+ } else {
+ int fw_index = 0;
+ int success = 0;
+--- a/drivers/net/wireless/b43/main.c
++++ b/drivers/net/wireless/b43/main.c
+@@ -2132,18 +2132,8 @@ int b43_do_request_fw(struct b43_request
+ return -ENOSYS;
+ }
+ err = request_firmware(&blob, ctx->fwname, ctx->dev->dev->dev);
+- if (err == -ENOENT) {
+- snprintf(ctx->errors[ctx->req_type],
+- sizeof(ctx->errors[ctx->req_type]),
+- "Firmware file \"%s\" not found\n", ctx->fwname);
++ if (err)
+ return err;
+- } else if (err) {
+- snprintf(ctx->errors[ctx->req_type],
+- sizeof(ctx->errors[ctx->req_type]),
+- "Firmware file \"%s\" request failed (err=%d)\n",
+- ctx->fwname, err);
+- return err;
+- }
+ if (blob->size < sizeof(struct b43_fw_header))
+ goto err_format;
+ hdr = (struct b43_fw_header *)(blob->data);
+--- a/drivers/net/wireless/b43legacy/main.c
++++ b/drivers/net/wireless/b43legacy/main.c
+@@ -1529,11 +1529,8 @@ static int do_request_fw(struct b43legac
+ "b43legacy%s/%s.fw",
+ modparam_fwpostfix, name);
+ err = request_firmware(fw, path, dev->dev->dev);
+- if (err) {
+- b43legacyerr(dev->wl, "Firmware file \"%s\" not found "
+- "or load failed.\n", path);
++ if (err)
+ return err;
+- }
+ if ((*fw)->size < sizeof(struct b43legacy_fw_header))
+ goto err_format;
+ hdr = (struct b43legacy_fw_header *)((*fw)->data);
+--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
++++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+@@ -3480,10 +3480,8 @@ static int brcmf_sdbrcm_download_code_fi
+
+ ret = request_firmware(&bus->firmware, BRCMF_SDIO_FW_NAME,
+ &bus->sdiodev->func[2]->dev);
+- if (ret) {
+- brcmf_dbg(ERROR, "Fail to request firmware %d\n", ret);
++ if (ret)
+ return ret;
+- }
+ bus->fw_ptr = 0;
+
+ memptr = memblock = kmalloc(MEMBLOCK + BRCMF_SDALIGN, GFP_ATOMIC);
+@@ -3599,10 +3597,8 @@ static int brcmf_sdbrcm_download_nvram(s
+
+ ret = request_firmware(&bus->firmware, BRCMF_SDIO_NV_NAME,
+ &bus->sdiodev->func[2]->dev);
+- if (ret) {
+- brcmf_dbg(ERROR, "Fail to request nvram %d\n", ret);
++ if (ret)
+ return ret;
+- }
+
+ ret = brcmf_process_nvram_vars(bus);
+
+--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
++++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+@@ -777,19 +777,13 @@ static int brcms_request_fw(struct brcms
+ sprintf(fw_name, "%s-%d.fw", brcms_firmwares[i],
+ UCODE_LOADER_API_VER);
+ status = request_firmware(&wl->fw.fw_bin[i], fw_name, device);
+- if (status) {
+- wiphy_err(wl->wiphy, "%s: fail to load firmware %s\n",
+- KBUILD_MODNAME, fw_name);
++ if (status)
+ return status;
+- }
+ sprintf(fw_name, "%s_hdr-%d.fw", brcms_firmwares[i],
+ UCODE_LOADER_API_VER);
+ status = request_firmware(&wl->fw.fw_hdr[i], fw_name, device);
+- if (status) {
+- wiphy_err(wl->wiphy, "%s: fail to load firmware %s\n",
+- KBUILD_MODNAME, fw_name);
++ if (status)
+ return status;
+- }
+ wl->fw.hdr_num_entries[i] =
+ wl->fw.fw_hdr[i]->size / (sizeof(struct firmware_hdr));
+ }
+--- a/drivers/net/wireless/ipw2x00/ipw2100.c
++++ b/drivers/net/wireless/ipw2x00/ipw2100.c
+@@ -8476,12 +8476,8 @@ static int ipw2100_get_firmware(struct i
+
+ rc = request_firmware(&fw->fw_entry, fw_name, &priv->pci_dev->dev);
+
+- if (rc < 0) {
+- printk(KERN_ERR DRV_NAME ": "
+- "%s: Firmware '%s' not available or load failed.\n",
+- priv->net_dev->name, fw_name);
++ if (rc)
+ return rc;
+- }
+ IPW_DEBUG_INFO("firmware data %p size %zd\n", fw->fw_entry->data,
+ fw->fw_entry->size);
+
+--- a/drivers/net/wireless/ipw2x00/ipw2200.c
++++ b/drivers/net/wireless/ipw2x00/ipw2200.c
+@@ -3418,10 +3418,8 @@ static int ipw_get_fw(struct ipw_priv *p
+
+ /* ask firmware_class module to get the boot firmware off disk */
+ rc = request_firmware(raw, name, &priv->pci_dev->dev);
+- if (rc < 0) {
+- IPW_ERROR("%s request_firmware failed: Reason %d\n", name, rc);
++ if (rc)
+ return rc;
+- }
+
+ if ((*raw)->size < sizeof(*fw)) {
+ IPW_ERROR("%s is too small (%zd)\n", name, (*raw)->size);
+--- a/drivers/net/wireless/iwlegacy/3945-mac.c
++++ b/drivers/net/wireless/iwlegacy/3945-mac.c
+@@ -1844,7 +1844,6 @@ il3945_read_ucode(struct il_priv *il)
+ sprintf(buf, "%s%u%s", name_pre, idx, ".ucode");
+ ret = request_firmware(&ucode_raw, buf, &il->pci_dev->dev);
+ if (ret < 0) {
+- IL_ERR("%s firmware file req failed: %d\n", buf, ret);
+ if (ret == -ENOENT)
+ continue;
+ else
+--- a/drivers/net/wireless/iwlwifi/iwl-drv.c
++++ b/drivers/net/wireless/iwlwifi/iwl-drv.c
+@@ -789,13 +789,8 @@ static void iwl_ucode_callback(const str
+
+ memset(&pieces, 0, sizeof(pieces));
+
+- if (!ucode_raw) {
+- if (drv->fw_index <= api_ok)
+- IWL_ERR(drv,
+- "request for firmware file '%s' failed.\n",
+- drv->firmware_name);
++ if (!ucode_raw)
+ goto try_again;
+- }
+
+ IWL_DEBUG_INFO(drv, "Loaded firmware file '%s' (%zd bytes).\n",
+ drv->firmware_name, ucode_raw->size);
+--- a/drivers/net/wireless/libertas_tf/if_usb.c
++++ b/drivers/net/wireless/libertas_tf/if_usb.c
+@@ -825,8 +825,6 @@ static int if_usb_prog_firmware(struct i
+ kparam_block_sysfs_write(fw_name);
+ ret = request_firmware(&cardp->fw, lbtf_fw_name, &cardp->udev->dev);
+ if (ret < 0) {
+- pr_err("request_firmware() failed with %#x\n", ret);
+- pr_err("firmware %s not found\n", lbtf_fw_name);
+ kparam_unblock_sysfs_write(fw_name);
+ goto done;
+ }
+--- a/drivers/net/wireless/mwifiex/main.c
++++ b/drivers/net/wireless/mwifiex/main.c
+@@ -316,11 +316,8 @@ static void mwifiex_fw_dpc(const struct
+ struct mwifiex_adapter *adapter = context;
+ struct mwifiex_fw_image fw;
+
+- if (!firmware) {
+- dev_err(adapter->dev,
+- "Failed to get firmware %s\n", adapter->fw_name);
++ if (!firmware)
+ goto done;
+- }
+
+ memset(&fw, 0, sizeof(struct mwifiex_fw_image));
+ adapter->firmware = firmware;
+--- a/drivers/net/wireless/mwl8k.c
++++ b/drivers/net/wireless/mwl8k.c
+@@ -5297,16 +5297,12 @@ static int mwl8k_firmware_load_success(s
+ static void mwl8k_fw_state_machine(const struct firmware *fw, void *context)
+ {
+ struct mwl8k_priv *priv = context;
+- struct mwl8k_device_info *di = priv->device_info;
+ int rc;
+
+ switch (priv->fw_state) {
+ case FW_STATE_INIT:
+- if (!fw) {
+- printk(KERN_ERR "%s: Error requesting helper fw %s\n",
+- pci_name(priv->pdev), di->helper_image);
++ if (!fw)
+ goto fail;
+- }
+ priv->fw_helper = fw;
+ rc = mwl8k_request_fw(priv, priv->fw_pref, &priv->fw_ucode,
+ true);
+@@ -5341,11 +5337,8 @@ static void mwl8k_fw_state_machine(const
+ break;
+
+ case FW_STATE_LOADING_ALT:
+- if (!fw) {
+- printk(KERN_ERR "%s: Error requesting alt fw %s\n",
+- pci_name(priv->pdev), di->helper_image);
++ if (!fw)
+ goto fail;
+- }
+ priv->fw_ucode = fw;
+ rc = mwl8k_firmware_load_success(priv);
+ if (rc)
+@@ -5383,10 +5376,8 @@ retry:
+
+ /* Ask userland hotplug daemon for the device firmware */
+ rc = mwl8k_request_firmware(priv, fw_image, nowait);
+- if (rc) {
+- wiphy_err(hw->wiphy, "Firmware files not found\n");
++ if (rc)
+ return rc;
+- }
+
+ if (nowait)
+ return rc;
+--- a/drivers/net/wireless/orinoco/fw.c
++++ b/drivers/net/wireless/orinoco/fw.c
+@@ -132,7 +132,6 @@ orinoco_dl_firmware(struct orinoco_priva
+ err = request_firmware(&fw_entry, firmware, priv->dev);
+
+ if (err) {
+- dev_err(dev, "Cannot find firmware %s\n", firmware);
+ err = -ENOENT;
+ goto free;
+ }
+@@ -292,10 +291,8 @@ symbol_dl_firmware(struct orinoco_privat
+ const struct firmware *fw_entry;
+
+ if (!orinoco_cached_fw_get(priv, true)) {
+- if (request_firmware(&fw_entry, fw->pri_fw, priv->dev) != 0) {
+- dev_err(dev, "Cannot find firmware: %s\n", fw->pri_fw);
++ if (request_firmware(&fw_entry, fw->pri_fw, priv->dev) != 0)
+ return -ENOENT;
+- }
+ } else
+ fw_entry = orinoco_cached_fw_get(priv, true);
+
+@@ -311,10 +308,8 @@ symbol_dl_firmware(struct orinoco_privat
+ }
+
+ if (!orinoco_cached_fw_get(priv, false)) {
+- if (request_firmware(&fw_entry, fw->sta_fw, priv->dev) != 0) {
+- dev_err(dev, "Cannot find firmware: %s\n", fw->sta_fw);
++ if (request_firmware(&fw_entry, fw->sta_fw, priv->dev) != 0)
+ return -ENOENT;
+- }
+ } else
+ fw_entry = orinoco_cached_fw_get(priv, false);
+
+--- a/drivers/net/wireless/orinoco/orinoco_usb.c
++++ b/drivers/net/wireless/orinoco/orinoco_usb.c
+@@ -1684,7 +1684,6 @@ static int ezusb_probe(struct usb_interf
+ if (firmware.size && firmware.code) {
+ ezusb_firmware_download(upriv, &firmware);
+ } else {
+- err("No firmware to download");
+ goto error;
+ }
+
+--- a/drivers/net/wireless/p54/p54pci.c
++++ b/drivers/net/wireless/p54/p54pci.c
+@@ -564,7 +564,6 @@ static int __devinit p54p_probe(struct p
+ err = request_firmware(&priv->firmware, "isl3886pci",
+ &priv->pdev->dev);
+ if (err) {
+- dev_err(&pdev->dev, "Cannot find firmware (isl3886pci)\n");
+ err = request_firmware(&priv->firmware, "isl3886",
+ &priv->pdev->dev);
+ if (err)
+--- a/drivers/net/wireless/p54/p54spi.c
++++ b/drivers/net/wireless/p54/p54spi.c
+@@ -171,10 +171,8 @@ static int p54spi_request_firmware(struc
+ /* FIXME: should driver use it's own struct device? */
+ ret = request_firmware(&priv->firmware, "3826.arm", &priv->spi->dev);
+
+- if (ret < 0) {
+- dev_err(&priv->spi->dev, "request_firmware() failed: %d", ret);
++ if (ret)
+ return ret;
+- }
+
+ ret = p54_parse_firmware(dev, priv->firmware);
+ if (ret) {
+--- a/drivers/net/wireless/p54/p54usb.c
++++ b/drivers/net/wireless/p54/p54usb.c
+@@ -931,7 +931,6 @@ static void p54u_load_firmware_cb(const
+ err = p54u_start_ops(priv);
+ } else {
+ err = -ENOENT;
+- dev_err(&udev->dev, "Firmware not found.\n");
+ }
+
+ if (err) {
+--- a/drivers/net/wireless/prism54/islpci_dev.c
++++ b/drivers/net/wireless/prism54/islpci_dev.c
+@@ -93,12 +93,9 @@ isl_upload_firmware(islpci_private *priv
+ const u32 *fw_ptr;
+
+ rc = request_firmware(&fw_entry, priv->firmware, PRISM_FW_PDEV);
+- if (rc) {
+- printk(KERN_ERR
+- "%s: request_firmware() failed for '%s'\n",
+- "prism54", priv->firmware);
++ if (rc)
+ return rc;
+- }
++
+ /* prepare the Direct Memory Base register */
+ reg = ISL38XX_DEV_FIRMWARE_ADDRES;
+
+--- a/drivers/net/wireless/rt2x00/rt2x00firmware.c
++++ b/drivers/net/wireless/rt2x00/rt2x00firmware.c
+@@ -51,10 +51,8 @@ static int rt2x00lib_request_firmware(st
+ INFO(rt2x00dev, "Loading firmware file '%s'.\n", fw_name);
+
+ retval = request_firmware(&fw, fw_name, device);
+- if (retval) {
+- ERROR(rt2x00dev, "Failed to request Firmware.\n");
++ if (retval)
+ return retval;
+- }
+
+ if (!fw || !fw->size || !fw->data) {
+ ERROR(rt2x00dev, "Failed to read Firmware.\n");
+--- a/drivers/net/wireless/rtlwifi/core.c
++++ b/drivers/net/wireless/rtlwifi/core.c
+@@ -46,7 +46,6 @@ void rtl_fw_cb(const struct firmware *fi
+ "Firmware callback routine entered!\n");
+ complete(&rtlpriv->firmware_loading_complete);
+ if (!firmware) {
+- pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name);
+ rtlpriv->max_fw_size = 0;
+ return;
+ }
+--- a/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
++++ b/drivers/net/wireless/rtlwifi/rtl8192se/sw.c
+@@ -100,7 +100,6 @@ static void rtl92se_fw_cb(const struct f
+ "Firmware callback routine entered!\n");
+ complete(&rtlpriv->firmware_loading_complete);
+ if (!firmware) {
+- pr_err("Firmware %s not available\n", rtlpriv->cfg->fw_name);
+ rtlpriv->max_fw_size = 0;
+ return;
+ }
+--- a/drivers/net/wireless/ti/wl1251/main.c
++++ b/drivers/net/wireless/ti/wl1251/main.c
+@@ -70,10 +70,8 @@ static int wl1251_fetch_firmware(struct
+
+ ret = request_firmware(&fw, WL1251_FW_NAME, dev);
+
+- if (ret < 0) {
+- wl1251_error("could not get firmware: %d", ret);
++ if (ret)
+ return ret;
+- }
+
+ if (fw->size % 4) {
+ wl1251_error("firmware size is not multiple of 32 bits: %zu",
+@@ -109,10 +107,8 @@ static int wl1251_fetch_nvs(struct wl125
+
+ ret = request_firmware(&fw, WL1251_NVS_NAME, dev);
+
+- if (ret < 0) {
+- wl1251_error("could not get nvs file: %d", ret);
++ if (ret)
+ return ret;
+- }
+
+ if (fw->size % 4) {
+ wl1251_error("nvs size is not multiple of 32 bits: %zu",
+--- a/drivers/net/wireless/ti/wlcore/main.c
++++ b/drivers/net/wireless/ti/wlcore/main.c
+@@ -712,10 +712,8 @@ static int wl12xx_fetch_firmware(struct
+
+ ret = request_firmware(&fw, fw_name, wl->dev);
+
+- if (ret < 0) {
+- wl1271_error("could not get firmware %s: %d", fw_name, ret);
++ if (ret)
+ return ret;
+- }
+
+ if (fw->size % 4) {
+ wl1271_error("firmware size is not multiple of 32 bits: %zu",
+--- a/drivers/net/wireless/zd1201.c
++++ b/drivers/net/wireless/zd1201.c
+@@ -65,8 +65,6 @@ static int zd1201_fw_upload(struct usb_d
+
+ err = request_firmware(&fw_entry, fwfile, &dev->dev);
+ if (err) {
+- dev_err(&dev->dev, "Failed to load %s firmware file!\n", fwfile);
+- dev_err(&dev->dev, "Make sure the hotplug firmware loader is installed.\n");
+ dev_err(&dev->dev, "Goto http://linux-lc100020.sourceforge.net for more info.\n");
+ return err;
+ }
+--- a/drivers/net/wireless/zd1211rw/zd_usb.c
++++ b/drivers/net/wireless/zd1211rw/zd_usb.c
+@@ -121,16 +121,9 @@ static void int_urb_complete(struct urb
+ static int request_fw_file(
+ const struct firmware **fw, const char *name, struct device *device)
+ {
+- int r;
+-
+ dev_dbg_f(device, "fw name %s\n", name);
+
+- r = request_firmware(fw, name, device);
+- if (r)
+- dev_err(device,
+- "Could not load firmware file %s. Error number %d\n",
+- name, r);
+- return r;
++ return request_firmware(fw, name, device);
+ }
+
+ static inline u16 get_bcdDevice(const struct usb_device *udev)
+--- a/drivers/scsi/advansys.c
++++ b/drivers/scsi/advansys.c
+@@ -4791,8 +4791,6 @@ static ushort AscInitAsc1000Driver(ASC_D
+
+ err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev);
+ if (err) {
+- printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+- fwname, err);
+ asc_dvc->err_code |= ASC_IERR_MCODE_CHKSUM;
+ return err;
+ }
+@@ -5124,8 +5122,6 @@ static int AdvInitAsc3550Driver(ADV_DVC_
+
+ err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev);
+ if (err) {
+- printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+- fwname, err);
+ asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
+ return err;
+ }
+@@ -5640,8 +5636,6 @@ static int AdvInitAsc38C0800Driver(ADV_D
+
+ err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev);
+ if (err) {
+- printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+- fwname, err);
+ asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
+ return err;
+ }
+@@ -6142,8 +6136,6 @@ static int AdvInitAsc38C1600Driver(ADV_D
+
+ err = request_firmware(&fw, fwname, asc_dvc->drv_ptr->dev);
+ if (err) {
+- printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+- fwname, err);
+ asc_dvc->err_code = ASC_IERR_MCODE_CHKSUM;
+ return err;
+ }
+--- a/drivers/scsi/aic94xx/aic94xx_init.c
++++ b/drivers/scsi/aic94xx/aic94xx_init.c
+@@ -397,8 +397,6 @@ static ssize_t asd_store_update_bios(str
+ filename_ptr,
+ &asd_ha->pcidev->dev);
+ if (err) {
+- asd_printk("Failed to load bios image file %s, error %d\n",
+- filename_ptr, err);
+ err = FAIL_OPEN_BIOS_FILE;
+ goto out1;
+ }
+--- a/drivers/scsi/aic94xx/aic94xx_seq.c
++++ b/drivers/scsi/aic94xx/aic94xx_seq.c
+@@ -1317,11 +1317,8 @@ int asd_init_seqs(struct asd_ha_struct *
+
+ err = asd_request_firmware(asd_ha);
+
+- if (err) {
+- asd_printk("Failed to load sequencer firmware file %s, error %d\n",
+- SAS_RAZOR_SEQUENCER_FW_FILE, err);
++ if (err)
+ return err;
+- }
+
+ err = asd_seq_download_seqs(asd_ha);
+ if (err) {
+--- a/drivers/scsi/bfa/bfad.c
++++ b/drivers/scsi/bfa/bfad.c
+@@ -1579,7 +1579,6 @@ bfad_read_firmware(struct pci_dev *pdev,
+ const struct firmware *fw;
+
+ if (request_firmware(&fw, fw_name, &pdev->dev)) {
+- printk(KERN_ALERT "Can't locate firmware %s\n", fw_name);
+ *bfi_image = NULL;
+ goto out;
+ }
+--- a/drivers/scsi/ipr.c
++++ b/drivers/scsi/ipr.c
+@@ -3746,10 +3746,8 @@ static ssize_t ipr_store_update_fw(struc
+ len = snprintf(fname, 99, "%s", buf);
+ fname[len-1] = '\0';
+
+- if(request_firmware(&fw_entry, fname, &ioa_cfg->pdev->dev)) {
+- dev_err(&ioa_cfg->pdev->dev, "Firmware file %s not found\n", fname);
++ if (request_firmware(&fw_entry, fname, &ioa_cfg->pdev->dev))
+ return -EIO;
+- }
+
+ image_hdr = (struct ipr_ucode_image_header *)fw_entry->data;
+
+--- a/drivers/scsi/pm8001/pm8001_ctl.c
++++ b/drivers/scsi/pm8001/pm8001_ctl.c
+@@ -502,9 +502,6 @@ static ssize_t pm8001_store_update_fw(st
+ pm8001_ha->dev);
+
+ if (err) {
+- PM8001_FAIL_DBG(pm8001_ha,
+- pm8001_printk("Failed to load firmware image file %s,"
+- " error %d\n", filename_ptr, err));
+ err = FAIL_OPEN_BIOS_FILE;
+ goto out1;
+ }
+--- a/drivers/scsi/qla1280.c
++++ b/drivers/scsi/qla1280.c
+@@ -1560,8 +1560,6 @@ qla1280_request_firmware(struct scsi_qla
+ err = request_firmware(&fw, fwname, &ha->pdev->dev);
+
+ if (err) {
+- printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+- fwname, err);
+ fw = ERR_PTR(err);
+ goto unlock;
+ }
+--- a/drivers/scsi/qla2xxx/qla_init.c
++++ b/drivers/scsi/qla2xxx/qla_init.c
+@@ -4582,8 +4582,6 @@ qla2x00_load_risc(scsi_qla_host_t *vha,
+ /* Load firmware blob. */
+ blob = qla2x00_request_firmware(vha);
+ if (!blob) {
+- ql_log(ql_log_info, vha, 0x0083,
+- "Fimware image unavailable.\n");
+ ql_log(ql_log_info, vha, 0x0084,
+ "Firmware images can be retrieved from: "QLA_FW_URL ".\n");
+ return QLA_FUNCTION_FAILED;
+@@ -4684,8 +4682,6 @@ qla24xx_load_risc_blob(scsi_qla_host_t *
+ /* Load firmware blob. */
+ blob = qla2x00_request_firmware(vha);
+ if (!blob) {
+- ql_log(ql_log_warn, vha, 0x0090,
+- "Fimware image unavailable.\n");
+ ql_log(ql_log_warn, vha, 0x0091,
+ "Firmware images can be retrieved from: "
+ QLA_FW_URL ".\n");
+--- a/drivers/scsi/qla2xxx/qla_nx.c
++++ b/drivers/scsi/qla2xxx/qla_nx.c
+@@ -2459,11 +2459,8 @@ try_blob_fw:
+
+ /* Load firmware blob. */
+ blob = ha->hablob = qla2x00_request_firmware(vha);
+- if (!blob) {
+- ql_log(ql_log_fatal, vha, 0x00a3,
+- "Firmware image not present.\n");
++ if (!blob)
+ goto fw_load_failed;
+- }
+
+ /* Validating firmware blob */
+ if (qla82xx_validate_firmware_blob(vha,
+--- a/drivers/scsi/qla2xxx/qla_os.c
++++ b/drivers/scsi/qla2xxx/qla_os.c
+@@ -4179,8 +4179,6 @@ qla2x00_request_firmware(scsi_qla_host_t
+ goto out;
+
+ if (request_firmware(&blob->fw, blob->name, &ha->pdev->dev)) {
+- ql_log(ql_log_warn, vha, 0x0063,
+- "Failed to load firmware image (%s).\n", blob->name);
+ blob->fw = NULL;
+ blob = NULL;
+ goto out;
+--- a/drivers/scsi/qlogicpti.c
++++ b/drivers/scsi/qlogicpti.c
+@@ -475,11 +475,8 @@ static int __devinit qlogicpti_load_firm
+ int i, timeout;
+
+ err = request_firmware(&fw, fwname, &qpti->op->dev);
+- if (err) {
+- printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+- fwname, err);
++ if (err)
+ return err;
+- }
+ if (fw->size % 2) {
+ printk(KERN_ERR "Bogus length %zu in image \"%s\"\n",
+ fw->size, fwname);
+--- a/drivers/staging/comedi/drivers/usbdux.c
++++ b/drivers/staging/comedi/drivers/usbdux.c
+@@ -2525,11 +2525,8 @@ static void usbdux_firmware_request_comp
+ struct usb_interface *uinterf = usbduxsub_tmp->interface;
+ int ret;
+
+- if (fw == NULL) {
+- dev_err(&uinterf->dev,
+- "Firmware complete handler without firmware!\n");
++ if (fw == NULL)
+ return;
+- }
+
+ /*
+ * we need to upload the firmware here because fw will be
+--- a/drivers/staging/comedi/drivers/usbduxsigma.c
++++ b/drivers/staging/comedi/drivers/usbduxsigma.c
+@@ -2511,11 +2511,8 @@ static void usbdux_firmware_request_comp
+ struct usb_interface *uinterf = usbduxsub_tmp->interface;
+ int ret;
+
+- if (fw == NULL) {
+- dev_err(&uinterf->dev,
+- "Firmware complete handler without firmware!\n");
++ if (fw == NULL)
+ return;
+- }
+
+ /*
+ * we need to upload the firmware here because fw will be
+--- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
++++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
+@@ -2193,16 +2193,12 @@ struct net_device *init_ft1000_card(stru
+ info->AsicID = ft1000_read_reg(dev, FT1000_REG_ASIC_ID);
+ if (info->AsicID == ELECTRABUZZ_ID) {
+ DEBUG(0, "ft1000_hw: ELECTRABUZZ ASIC\n");
+- if (request_firmware(&fw_entry, "ft1000.img", &link->dev) != 0) {
+- printk(KERN_INFO "ft1000: Could not open ft1000.img\n");
++ if (request_firmware(&fw_entry, "ft1000.img", &link->dev) != 0)
+ goto err_unreg;
+- }
+ } else {
+ DEBUG(0, "ft1000_hw: MAGNEMITE ASIC\n");
+- if (request_firmware(&fw_entry, "ft2000.img", &link->dev) != 0) {
+- printk(KERN_INFO "ft1000: Could not open ft2000.img\n");
++ if (request_firmware(&fw_entry, "ft2000.img", &link->dev) != 0)
+ goto err_unreg;
+- }
+ }
+
+ ft1000_enable_interrupts(dev);
+--- a/drivers/staging/ft1000/ft1000-usb/ft1000_usb.c
++++ b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.c
+@@ -137,10 +137,8 @@ static int ft1000_probe(struct usb_inter
+ ft1000dev->bulk_out_endpointAddr);
+
+ ret = request_firmware(&dsp_fw, "ft3000.img", &dev->dev);
+- if (ret < 0) {
+- pr_err("Error request_firmware().\n");
++ if (ret)
+ goto err_fw;
+- }
+
+ size = max_t(uint, dsp_fw->size, 4096);
+ pFileStart = kmalloc(size, GFP_KERNEL);
+--- a/drivers/staging/media/as102/as102_fw.c
++++ b/drivers/staging/media/as102/as102_fw.c
+@@ -190,11 +190,8 @@ int as102_fw_upload(struct as10x_bus_ada
+
+ /* request kernel to locate firmware file: part1 */
+ errno = request_firmware(&firmware, fw1, &dev->dev);
+- if (errno < 0) {
+- pr_err("%s: unable to locate firmware file: %s\n",
+- DRIVER_NAME, fw1);
++ if (errno)
+ goto error;
+- }
+
+ /* initiate firmware upload */
+ errno = as102_firmware_upload(bus_adap, cmd_buf, firmware);
+@@ -213,11 +210,8 @@ int as102_fw_upload(struct as10x_bus_ada
+
+ /* request kernel to locate firmware file: part2 */
+ errno = request_firmware(&firmware, fw2, &dev->dev);
+- if (errno < 0) {
+- pr_err("%s: unable to locate firmware file: %s\n",
+- DRIVER_NAME, fw2);
++ if (errno)
+ goto error;
+- }
+
+ /* initiate firmware upload */
+ errno = as102_firmware_upload(bus_adap, cmd_buf, firmware);
+--- a/drivers/staging/media/go7007/go7007-driver.c
++++ b/drivers/staging/media/go7007/go7007-driver.c
+@@ -96,11 +96,8 @@ static int go7007_load_encoder(struct go
+ int fw_len, rv = 0;
+ u16 intr_val, intr_data;
+
+- if (request_firmware(&fw_entry, fw_name, go->dev)) {
+- v4l2_err(go, "unable to load firmware from file "
+- "\"%s\"\n", fw_name);
++ if (request_firmware(&fw_entry, fw_name, go->dev))
+ return -1;
+- }
+ if (fw_entry->size < 16 || memcmp(fw_entry->data, "WISGO7007FW", 11)) {
+ v4l2_err(go, "file \"%s\" does not appear to be "
+ "go7007 firmware\n", fw_name);
+--- a/drivers/staging/media/go7007/go7007-fw.c
++++ b/drivers/staging/media/go7007/go7007-fw.c
+@@ -1576,12 +1576,8 @@ int go7007_construct_fw_image(struct go7
+ default:
+ return -1;
+ }
+- if (request_firmware(&fw_entry, go->board_info->firmware, go->dev)) {
+- printk(KERN_ERR
+- "go7007: unable to load firmware from file \"%s\"\n",
+- go->board_info->firmware);
++ if (request_firmware(&fw_entry, go->board_info->firmware, go->dev))
+ return -1;
+- }
+ code = kzalloc(codespace * 2, GFP_KERNEL);
+ if (code == NULL) {
+ printk(KERN_ERR "go7007: unable to allocate %d bytes for "
+--- a/drivers/staging/media/go7007/s2250-loader.c
++++ b/drivers/staging/media/go7007/s2250-loader.c
+@@ -98,12 +98,8 @@ static int s2250loader_probe(struct usb_
+
+ mutex_unlock(&s2250_dev_table_mutex);
+
+- if (request_firmware(&fw, S2250_LOADER_FIRMWARE, &usbdev->dev)) {
+- printk(KERN_ERR
+- "s2250: unable to load firmware from file \"%s\"\n",
+- S2250_LOADER_FIRMWARE);
++ if (request_firmware(&fw, S2250_LOADER_FIRMWARE, &usbdev->dev))
+ goto failed2;
+- }
+ ret = usb_cypress_load_firmware(usbdev, fw, CYPRESS_FX2);
+ release_firmware(fw);
+ if (0 != ret) {
+@@ -111,12 +107,8 @@ static int s2250loader_probe(struct usb_
+ goto failed2;
+ }
+
+- if (request_firmware(&fw, S2250_FIRMWARE, &usbdev->dev)) {
+- printk(KERN_ERR
+- "s2250: unable to load firmware from file \"%s\"\n",
+- S2250_FIRMWARE);
++ if (request_firmware(&fw, S2250_FIRMWARE, &usbdev->dev))
+ goto failed2;
+- }
+ ret = usb_cypress_load_firmware(usbdev, fw, CYPRESS_FX2);
+ release_firmware(fw);
+ if (0 != ret) {
+--- a/drivers/staging/media/lirc/lirc_zilog.c
++++ b/drivers/staging/media/lirc/lirc_zilog.c
+@@ -765,8 +765,6 @@ static int fw_load(struct IR_tx *tx)
+ /* Request codeset data file */
+ ret = request_firmware(&fw_entry, "haup-ir-blaster.bin", tx->ir->l.dev);
+ if (ret != 0) {
+- zilog_error("firmware haup-ir-blaster.bin not available "
+- "(%d)\n", ret);
+ ret = ret < 0 ? ret : -EFAULT;
+ goto out;
+ }
+--- a/drivers/staging/rtl8192u/r819xU_firmware.c
++++ b/drivers/staging/rtl8192u/r819xU_firmware.c
+@@ -284,10 +284,8 @@ bool init_firmware(struct net_device *de
+ */
+ if(rst_opt == OPT_SYSTEM_RESET) {
+ rc = request_firmware(&fw_entry, fw_name[init_step],&priv->udev->dev);
+- if(rc < 0 ) {
+- RT_TRACE(COMP_ERR, "request firmware fail!\n");
++ if (rc)
+ goto download_firmware_fail;
+- }
+
+ if(fw_entry->size > sizeof(pfirmware->firmware_buf)) {
+ RT_TRACE(COMP_ERR, "img file size exceed the container buffer fail!\n");
+--- a/drivers/staging/rtl8712/hal_init.c
++++ b/drivers/staging/rtl8712/hal_init.c
+@@ -49,7 +49,6 @@ static void rtl871x_load_fw_cb(const str
+ if (!firmware) {
+ struct usb_device *udev = padapter->dvobjpriv.pusbdev;
+ struct usb_interface *pusb_intf = padapter->pusb_intf;
+- printk(KERN_ERR "r8712u: Firmware request failed\n");
+ padapter->fw_found = false;
+ usb_put_dev(udev);
+ usb_set_intfdata(pusb_intf, NULL);
+--- a/drivers/staging/slicoss/slicoss.c
++++ b/drivers/staging/slicoss/slicoss.c
+@@ -519,11 +519,8 @@ static int slic_card_download_gbrcv(stru
+ }
+
+ ret = request_firmware(&fw, file, &adapter->pcidev->dev);
+- if (ret) {
+- dev_err(&adapter->pcidev->dev,
+- "SLICOSS: Failed to load firmware %s\n", file);
++ if (ret)
+ return ret;
+- }
+
+ rcvucodelen = *(u32 *)(fw->data + index);
+ index += 4;
+@@ -597,11 +594,8 @@ static int slic_card_download(struct ada
+ break;
+ }
+ ret = request_firmware(&fw, file, &adapter->pcidev->dev);
+- if (ret) {
+- dev_err(&adapter->pcidev->dev,
+- "SLICOSS: Failed to load firmware %s\n", file);
++ if (ret)
+ return ret;
+- }
+ numsects = *(u32 *)(fw->data + index);
+ index += 4;
+ ASSERT(numsects <= 3);
+--- a/drivers/staging/vt6656/firmware.c
++++ b/drivers/staging/vt6656/firmware.c
+@@ -76,11 +76,8 @@ FIRMWAREbDownload(
+ int rc;
+
+ rc = request_firmware(&pDevice->firmware, FIRMWARE_NAME, dev);
+- if (rc) {
+- dev_err(dev, "firmware file %s request failed (%d)\n",
+- FIRMWARE_NAME, rc);
++ if (rc)
+ goto out;
+- }
+ }
+ fw = pDevice->firmware;
+
+--- a/drivers/tty/cyclades.c
++++ b/drivers/tty/cyclades.c
+@@ -3539,10 +3539,8 @@ static int __devinit cyz_load_fw(struct
+ int retval;
+
+ retval = request_firmware(&fw, "cyzfirm.bin", &pdev->dev);
+- if (retval) {
+- dev_err(&pdev->dev, "can't get firmware\n");
++ if (retval)
+ goto err;
+- }
+
+ /* Check whether the firmware is already loaded and running. If
+ positive, skip this board */
+--- a/drivers/tty/moxa.c
++++ b/drivers/tty/moxa.c
+@@ -866,13 +866,8 @@ static int moxa_init_board(struct moxa_b
+ }
+
+ ret = request_firmware(&fw, file, dev);
+- if (ret) {
+- printk(KERN_ERR "MOXA: request_firmware failed. Make sure "
+- "you've placed '%s' file into your firmware "
+- "loader directory (e.g. /lib/firmware)\n",
+- file);
++ if (ret)
+ goto err_free;
+- }
+
+ ret = moxa_load_fw(brd, fw);
+
+--- a/drivers/tty/serial/icom.c
++++ b/drivers/tty/serial/icom.c
+@@ -373,7 +373,6 @@ static void load_code(struct icom_port *
+
+ /* Load Call Setup into Adapter */
+ if (request_firmware(&fw, "icom_call_setup.bin", &dev->dev) < 0) {
+- dev_err(&dev->dev,"Unable to load icom_call_setup.bin firmware image\n");
+ status = -1;
+ goto load_code_exit;
+ }
+@@ -393,7 +392,6 @@ static void load_code(struct icom_port *
+
+ /* Load Resident DCE portion of Adapter */
+ if (request_firmware(&fw, "icom_res_dce.bin", &dev->dev) < 0) {
+- dev_err(&dev->dev,"Unable to load icom_res_dce.bin firmware image\n");
+ status = -1;
+ goto load_code_exit;
+ }
+@@ -438,7 +436,6 @@ static void load_code(struct icom_port *
+ }
+
+ if (request_firmware(&fw, "icom_asc.bin", &dev->dev) < 0) {
+- dev_err(&dev->dev,"Unable to load icom_asc.bin firmware image\n");
+ status = -1;
+ goto load_code_exit;
+ }
+--- a/drivers/tty/serial/ucc_uart.c
++++ b/drivers/tty/serial/ucc_uart.c
+@@ -1176,10 +1176,8 @@ static void uart_firmware_cont(const str
+ struct device *dev = context;
+ int ret;
+
+- if (!fw) {
+- dev_err(dev, "firmware not found\n");
++ if (!fw)
+ return;
+- }
+
+ firmware = (struct qe_firmware *) fw->data;
+
+--- a/drivers/usb/atm/cxacru.c
++++ b/drivers/usb/atm/cxacru.c
+@@ -1081,8 +1081,6 @@ static int cxacru_find_firmware(struct c
+ return -ENOENT;
+ }
+
+- usb_info(usbatm, "found firmware %s\n", buf);
+-
+ return 0;
+ }
+
+--- a/drivers/usb/atm/ueagle-atm.c
++++ b/drivers/usb/atm/ueagle-atm.c
+@@ -622,10 +622,8 @@ static void uea_upload_pre_firmware(cons
+ int ret, size;
+
+ uea_enters(usb);
+- if (!fw_entry) {
+- uea_err(usb, "firmware is not available\n");
++ if (!fw_entry)
+ goto err;
+- }
+
+ pfw = fw_entry->data;
+ size = fw_entry->size;
+@@ -720,10 +718,6 @@ static int uea_load_firmware(struct usb_
+ ret = request_firmware_nowait(THIS_MODULE, 1, fw_name, &usb->dev,
+ GFP_KERNEL, usb,
+ uea_upload_pre_firmware);
+- if (ret)
+- uea_err(usb, "firmware %s is not available\n", fw_name);
+- else
+- uea_info(usb, "loading firmware %s\n", fw_name);
+
+ uea_leaves(usb);
+ return ret;
+@@ -885,12 +879,8 @@ static int request_dsp(struct uea_softc
+ }
+
+ ret = request_firmware(&sc->dsp_firm, dsp_name, &sc->usb_dev->dev);
+- if (ret < 0) {
+- uea_err(INS_TO_USBDEV(sc),
+- "requesting firmware %s failed with error %d\n",
+- dsp_name, ret);
++ if (ret)
+ return ret;
+- }
+
+ if (UEA_CHIP_VERSION(sc) == EAGLE_IV)
+ ret = check_dsp_e4(sc->dsp_firm->data, sc->dsp_firm->size);
+@@ -1603,12 +1593,8 @@ static int request_cmvs_old(struct uea_s
+
+ cmvs_file_name(sc, cmv_name, 1);
+ ret = request_firmware(fw, cmv_name, &sc->usb_dev->dev);
+- if (ret < 0) {
+- uea_err(INS_TO_USBDEV(sc),
+- "requesting firmware %s failed with error %d\n",
+- cmv_name, ret);
++ if (ret)
+ return ret;
+- }
+
+ data = (u8 *) (*fw)->data;
+ size = (*fw)->size;
+@@ -1645,9 +1631,6 @@ static int request_cmvs(struct uea_softc
+ "try to get older cmvs\n", cmv_name);
+ return request_cmvs_old(sc, cmvs, fw);
+ }
+- uea_err(INS_TO_USBDEV(sc),
+- "requesting firmware %s failed with error %d\n",
+- cmv_name, ret);
+ return ret;
+ }
+
+@@ -1930,11 +1913,8 @@ static int load_XILINX_firmware(struct u
+ uea_enters(INS_TO_USBDEV(sc));
+
+ ret = request_firmware(&fw_entry, fw_name, &sc->usb_dev->dev);
+- if (ret) {
+- uea_err(INS_TO_USBDEV(sc), "firmware %s is not available\n",
+- fw_name);
++ if (ret)
+ goto err0;
+- }
+
+ pfw = fw_entry->data;
+ size = fw_entry->size;
+--- a/drivers/usb/misc/emi26.c
++++ b/drivers/usb/misc/emi26.c
+@@ -89,21 +89,17 @@ static int emi26_load_firmware (struct u
+
+ err = request_ihex_firmware(&loader_fw, "emi26/loader.fw", &dev->dev);
+ if (err)
+- goto nofw;
++ goto wraperr;
+
+ err = request_ihex_firmware(&bitstream_fw, "emi26/bitstream.fw",
+ &dev->dev);
+ if (err)
+- goto nofw;
++ goto wraperr;
+
+ err = request_ihex_firmware(&firmware_fw, "emi26/firmware.fw",
+ &dev->dev);
+- if (err) {
+- nofw:
+- dev_err(&dev->dev, "%s - request_firmware() failed\n",
+- __func__);
++ if (err)
+ goto wraperr;
+- }
+
+ /* Assert reset (stop the CPU in the EMI) */
+ err = emi26_set_reset(dev,1);
+--- a/drivers/usb/misc/isight_firmware.c
++++ b/drivers/usb/misc/isight_firmware.c
+@@ -48,7 +48,6 @@ static int isight_firmware_load(struct u
+ return -ENOMEM;
+
+ if (request_firmware(&firmware, "isight.fw", &dev->dev) != 0) {
+- printk(KERN_ERR "Unable to load isight firmware\n");
+ ret = -ENODEV;
+ goto out;
+ }
+--- a/drivers/usb/serial/io_edgeport.c
++++ b/drivers/usb/serial/io_edgeport.c
+@@ -312,11 +312,8 @@ static void update_edgeport_E2PROM(struc
+
+ response = request_ihex_firmware(&fw, fw_name,
+ &edge_serial->serial->dev->dev);
+- if (response) {
+- printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+- fw_name, response);
++ if (response)
+ return;
+- }
+
+ rec = (const struct ihex_binrec *)fw->data;
+ BootMajorVersion = rec->data[0];
+--- a/drivers/usb/serial/io_ti.c
++++ b/drivers/usb/serial/io_ti.c
+@@ -855,8 +855,6 @@ static int build_i2c_fw_hdr(__u8 *header
+
+ err = request_firmware(&fw, fw_name, dev);
+ if (err) {
+- printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+- fw_name, err);
+ kfree(buffer);
+ return err;
+ }
+@@ -1421,8 +1419,6 @@ static int download_fw(struct edgeport_s
+
+ err = request_firmware(&fw, fw_name, dev);
+ if (err) {
+- printk(KERN_ERR "Failed to load image \"%s\" err %d\n",
+- fw_name, err);
+ kfree(buffer);
+ return err;
+ }
+--- a/drivers/usb/serial/keyspan.c
++++ b/drivers/usb/serial/keyspan.c
+@@ -1233,10 +1233,8 @@ static int keyspan_fake_startup(struct u
+ return 1;
+ }
+
+- if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev)) {
+- dev_err(&serial->dev->dev, "Required keyspan firmware image (%s) unavailable.\n", fw_name);
++ if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev))
+ return 1;
+- }
+
+ dbg("Uploading Keyspan %s firmware.", fw_name);
+
+--- a/drivers/usb/serial/keyspan_pda.c
++++ b/drivers/usb/serial/keyspan_pda.c
+@@ -699,11 +699,8 @@ static int keyspan_pda_fake_startup(stru
+ __func__);
+ return -ENODEV;
+ }
+- if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev)) {
+- dev_err(&serial->dev->dev, "failed to load firmware \"%s\"\n",
+- fw_name);
++ if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev))
+ return -ENOENT;
+- }
+ record = (const struct ihex_binrec *)fw->data;
+
+ while (record) {
+--- a/drivers/usb/serial/ti_usb_3410_5052.c
++++ b/drivers/usb/serial/ti_usb_3410_5052.c
+@@ -1671,10 +1671,8 @@ static int ti_download_firmware(struct t
+ }
+ status = request_firmware(&fw_p, buf, &dev->dev);
+ }
+- if (status) {
+- dev_err(&dev->dev, "%s - firmware not found\n", __func__);
++ if (status)
+ return -ENOENT;
+- }
+ if (fw_p->size > TI_FIRMWARE_BUF_SIZE) {
+ dev_err(&dev->dev, "%s - firmware too large %zu\n", __func__, fw_p->size);
+ release_firmware(fw_p);
+--- a/drivers/usb/serial/whiteheat.c
++++ b/drivers/usb/serial/whiteheat.c
+@@ -204,18 +204,11 @@ static int whiteheat_firmware_download(s
+ const struct ihex_binrec *record;
+
+ if (request_ihex_firmware(&firmware_fw, "whiteheat.fw",
+- &serial->dev->dev)) {
+- dev_err(&serial->dev->dev,
+- "%s - request \"whiteheat.fw\" failed\n", __func__);
++ &serial->dev->dev))
+ goto out;
+- }
+ if (request_ihex_firmware(&loader_fw, "whiteheat_loader.fw",
+- &serial->dev->dev)) {
+- dev_err(&serial->dev->dev,
+- "%s - request \"whiteheat_loader.fw\" failed\n",
+- __func__);
++ &serial->dev->dev))
+ goto out;
+- }
+ ret = 0;
+ response = ezusb_set_reset (serial, 1);
+
+--- a/drivers/video/broadsheetfb.c
++++ b/drivers/video/broadsheetfb.c
+@@ -741,10 +741,8 @@ static ssize_t broadsheet_loadstore_wave
+ return -EINVAL;
+
+ err = request_firmware(&fw_entry, "broadsheet.wbf", dev);
+- if (err < 0) {
+- dev_err(dev, "Failed to get broadsheet waveform\n");
++ if (err)
+ goto err_failed;
+- }
+
+ /* try to enforce reasonable min max on waveform */
+ if ((fw_entry->size < 8*1024) || (fw_entry->size > 64*1024)) {
+--- a/drivers/video/metronomefb.c
++++ b/drivers/video/metronomefb.c
+@@ -677,10 +677,8 @@ static int __devinit metronomefb_probe(s
+ a) request the waveform file from userspace
+ b) process waveform and decode into metromem */
+ retval = request_firmware(&fw_entry, "metronome.wbf", &dev->dev);
+- if (retval < 0) {
+- dev_err(&dev->dev, "Failed to get waveform\n");
++ if (retval)
+ goto err_csum_table;
+- }
+
+ retval = load_waveform((u8 *) fw_entry->data, fw_entry->size, 3, 31,
+ par);
+--- a/sound/drivers/vx/vx_hwdep.c
++++ b/sound/drivers/vx/vx_hwdep.c
+@@ -73,10 +73,8 @@ int snd_vx_setup_firmware(struct vx_core
+ if (! fw_files[chip->type][i])
+ continue;
+ sprintf(path, "vx/%s", fw_files[chip->type][i]);
+- if (request_firmware(&fw, path, chip->dev)) {
+- snd_printk(KERN_ERR "vx: can't load firmware %s\n", path);
++ if (request_firmware(&fw, path, chip->dev))
+ return -ENOENT;
+- }
+ err = chip->ops->load_dsp(chip, i, fw);
+ if (err < 0) {
+ release_firmware(fw);
+--- a/sound/isa/msnd/msnd_pinnacle.c
++++ b/sound/isa/msnd/msnd_pinnacle.c
+@@ -387,15 +387,11 @@ static int upload_dsp_code(struct snd_ca
+ outb(HPBLKSEL_0, chip->io + HP_BLKS);
+
+ err = request_firmware(&init_fw, INITCODEFILE, card->dev);
+- if (err < 0) {
+- printk(KERN_ERR LOGNAME ": Error loading " INITCODEFILE);
++ if (err)
+ goto cleanup1;
+- }
+ err = request_firmware(&perm_fw, PERMCODEFILE, card->dev);
+- if (err < 0) {
+- printk(KERN_ERR LOGNAME ": Error loading " PERMCODEFILE);
++ if (err)
+ goto cleanup;
+- }
+
+ memcpy_toio(chip->mappedbase, perm_fw->data, perm_fw->size);
+ if (snd_msnd_upload_host(chip, init_fw->data, init_fw->size) < 0) {
+--- a/sound/isa/sscape.c
++++ b/sound/isa/sscape.c
+@@ -543,10 +543,8 @@ static int sscape_upload_bootblock(struc
+ int ret;
+
+ ret = request_firmware(&init_fw, "scope.cod", card->dev);
+- if (ret < 0) {
+- snd_printk(KERN_ERR "sscape: Error loading scope.cod");
++ if (ret)
+ return ret;
+- }
+ ret = upload_dma_data(sscape, init_fw->data, init_fw->size);
+
+ release_firmware(init_fw);
+@@ -583,11 +581,8 @@ static int sscape_upload_microcode(struc
+ snprintf(name, sizeof(name), "sndscape.co%d", version);
+
+ err = request_firmware(&init_fw, name, card->dev);
+- if (err < 0) {
+- snd_printk(KERN_ERR "sscape: Error loading sndscape.co%d",
+- version);
++ if (err)
+ return err;
+- }
+ err = upload_dma_data(sscape, init_fw->data, init_fw->size);
+ if (err == 0)
+ snd_printk(KERN_INFO "sscape: MIDI firmware loaded %d KBs\n",
+--- a/sound/isa/wavefront/wavefront_synth.c
++++ b/sound/isa/wavefront/wavefront_synth.c
+@@ -1947,10 +1947,8 @@ wavefront_download_firmware (snd_wavefro
+ const struct firmware *firmware;
+
+ err = request_firmware(&firmware, path, dev->card->dev);
+- if (err < 0) {
+- snd_printk(KERN_ERR "firmware (%s) download failed!!!\n", path);
++ if (err)
+ return 1;
+- }
+
+ len = 0;
+ buf = firmware->data;
+--- a/sound/pci/asihpi/hpidspcd.c
++++ b/sound/pci/asihpi/hpidspcd.c
+@@ -49,9 +49,6 @@ short hpi_dsp_code_open(u32 adapter, voi
+ err = request_firmware(&firmware, fw_name, &dev->dev);
+
+ if (err || !firmware) {
+- dev_printk(KERN_ERR, &dev->dev,
+- "%d, request_firmware failed for %s\n", err,
+- fw_name);
+ goto error1;
+ }
+ if (firmware->size < sizeof(header)) {
+--- a/sound/pci/cs46xx/cs46xx_lib.c
++++ b/sound/pci/cs46xx/cs46xx_lib.c
+@@ -411,10 +411,8 @@ static int snd_cs46xx_download_image(str
+
+ err = request_firmware(&firmware, "cs46xx/cs46xx-old.fw",
+ &chip->pci->dev);
+- if (err < 0) {
+- snd_printk(KERN_ERR "cs46xx: no firmware\n");
++ if (err)
+ return err;
+- }
+
+ err = snd_cs46xx_check_image_size(firmware);
+ if (err < 0)
+--- a/sound/pci/echoaudio/echoaudio.c
++++ b/sound/pci/echoaudio/echoaudio.c
+@@ -57,10 +57,8 @@ static int get_firmware(const struct fir
+ DE_ACT(("firmware requested: %s\n", card_fw[fw_index].data));
+ snprintf(name, sizeof(name), "ea/%s", card_fw[fw_index].data);
+ err = request_firmware(fw_entry, name, pci_device(chip));
+- if (err < 0)
+- snd_printk(KERN_ERR "get_firmware(): Firmware not available (%d)\n", err);
+ #ifdef CONFIG_PM
+- else
++ if (!err)
+ chip->fw_cache[fw_index] = *fw_entry;
+ #endif
+ return err;
+--- a/sound/pci/emu10k1/emu10k1_main.c
++++ b/sound/pci/emu10k1/emu10k1_main.c
+@@ -668,10 +668,8 @@ static int snd_emu1010_load_firmware(str
+ const struct firmware *fw_entry;
+
+ err = request_firmware(&fw_entry, filename, &emu->pci->dev);
+- if (err != 0) {
+- snd_printk(KERN_ERR "firmware: %s not found. Err = %d\n", filename, err);
++ if (err != 0)
+ return err;
+- }
+ snd_printk(KERN_INFO "firmware size = 0x%zx\n", fw_entry->size);
+
+ /* The FPGA is a Xilinx Spartan IIE XC2S50E */
+--- a/sound/pci/hda/hda_hwdep.c
++++ b/sound/pci/hda/hda_hwdep.c
+@@ -792,11 +792,8 @@ int snd_hda_load_patch(struct hda_bus *b
+ if (snd_BUG_ON(!dev))
+ return -ENODEV;
+ err = request_firmware(&fw, patch, dev);
+- if (err < 0) {
+- printk(KERN_ERR "hda-codec: Cannot load the patch '%s'\n",
+- patch);
++ if (!err)
+ return err;
+- }
+
+ tmp = *fw;
+ line_mode = LINE_MODE_NONE;
+--- a/sound/pci/korg1212/korg1212.c
++++ b/sound/pci/korg1212/korg1212.c
+@@ -2346,7 +2346,6 @@ static int __devinit snd_korg1212_create
+ err = request_firmware(&dsp_code, "korg/k1212.dsp", &pci->dev);
+ if (err < 0) {
+ release_firmware(dsp_code);
+- snd_printk(KERN_ERR "firmware not available\n");
+ snd_korg1212_free(korg1212);
+ return err;
+ }
+--- a/sound/pci/mixart/mixart_hwdep.c
++++ b/sound/pci/mixart/mixart_hwdep.c
+@@ -566,10 +566,8 @@ int snd_mixart_setup_firmware(struct mix
+
+ for (i = 0; i < 3; i++) {
+ sprintf(path, "mixart/%s", fw_files[i]);
+- if (request_firmware(&fw_entry, path, &mgr->pci->dev)) {
+- snd_printk(KERN_ERR "miXart: can't load firmware %s\n", path);
++ if (request_firmware(&fw_entry, path, &mgr->pci->dev))
+ return -ENOENT;
+- }
+ /* fake hwdep dsp record */
+ err = mixart_dsp_load(mgr, i, fw_entry);
+ release_firmware(fw_entry);
+--- a/sound/pci/pcxhr/pcxhr_hwdep.c
++++ b/sound/pci/pcxhr/pcxhr_hwdep.c
+@@ -390,11 +390,8 @@ int pcxhr_setup_firmware(struct pcxhr_mg
+ if (!fw_files[fw_set][i])
+ continue;
+ sprintf(path, "pcxhr/%s", fw_files[fw_set][i]);
+- if (request_firmware(&fw_entry, path, &mgr->pci->dev)) {
+- snd_printk(KERN_ERR "pcxhr: can't load firmware %s\n",
+- path);
++ if (request_firmware(&fw_entry, path, &mgr->pci->dev))
+ return -ENOENT;
+- }
+ /* fake hwdep dsp record */
+ err = pcxhr_dsp_load(mgr, i, fw_entry);
+ release_firmware(fw_entry);
+--- a/sound/pci/riptide/riptide.c
++++ b/sound/pci/riptide/riptide.c
+@@ -1245,11 +1245,8 @@ static int try_to_load_firmware(struct c
+ if (!chip->fw_entry) {
+ err = request_firmware(&chip->fw_entry, "riptide.hex",
+ &chip->pci->dev);
+- if (err) {
+- snd_printk(KERN_ERR
+- "Riptide: Firmware not available %d\n", err);
++ if (err)
+ return -EIO;
+- }
+ }
+ err = loadfirmware(cif, chip->fw_entry->data, chip->fw_entry->size);
+ if (err) {
+--- a/sound/pci/rme9652/hdsp.c
++++ b/sound/pci/rme9652/hdsp.c
+@@ -5369,10 +5369,8 @@ static int hdsp_request_fw_loader(struct
+ return -EINVAL;
+ }
+
+- if (request_firmware(&fw, fwfile, &hdsp->pci->dev)) {
+- snd_printk(KERN_ERR "Hammerfall-DSP: cannot load firmware %s\n", fwfile);
++ if (request_firmware(&fw, fwfile, &hdsp->pci->dev))
+ return -ENOENT;
+- }
+ if (fw->size < sizeof(hdsp->firmware_cache)) {
+ snd_printk(KERN_ERR "Hammerfall-DSP: too short firmware size %d (expected %d)\n",
+ (int)fw->size, (int)sizeof(hdsp->firmware_cache));
+--- a/sound/soc/codecs/wm2000.c
++++ b/sound/soc/codecs/wm2000.c
+@@ -794,10 +794,8 @@ static int __devinit wm2000_i2c_probe(st
+ }
+
+ ret = request_firmware(&fw, filename, &i2c->dev);
+- if (ret != 0) {
+- dev_err(&i2c->dev, "Failed to acquire ANC data: %d\n", ret);
++ if (ret != 0)
+ goto out_regmap_exit;
+- }
+
+ /* Pre-cook the concatenation of the register address onto the image */
+ wm2000->anc_download_size = fw->size + 2;
+--- a/sound/usb/6fire/firmware.c
++++ b/sound/usb/6fire/firmware.c
+@@ -219,8 +219,6 @@ static int usb6fire_fw_ezusb_upload(
+ ret = request_firmware(&fw, fwname, &device->dev);
+ if (ret < 0) {
+ kfree(rec);
+- snd_printk(KERN_ERR PREFIX "error requesting ezusb "
+- "firmware %s.\n", fwname);
+ return ret;
+ }
+ ret = usb6fire_fw_ihex_init(fw, rec);
+@@ -292,8 +290,6 @@ static int usb6fire_fw_fpga_upload(
+
+ ret = request_firmware(&fw, fwname, &device->dev);
+ if (ret < 0) {
+- snd_printk(KERN_ERR PREFIX "unable to get fpga firmware %s.\n",
+- fwname);
+ kfree(buffer);
+ return -EIO;
+ }
diff --git a/debian/patches/bugfix/all/firmware_class-log-every-success-and-failure.patch b/debian/patches/bugfix/all/firmware_class-log-every-success-and-failure.patch
new file mode 100644
index 000000000000..6b4e515f219f
--- /dev/null
+++ b/debian/patches/bugfix/all/firmware_class-log-every-success-and-failure.patch
@@ -0,0 +1,138 @@
+From: Ben Hutchings <ben@decadent.org.uk>
+Subject: firmware_class: Log every success and failure against given device
+Date: Sun, 09 Dec 2012 16:02:00 +0000
+
+The hundreds of users of request_firmware() have nearly as many
+different log formats for reporting failures. They also have only the
+vaguest hint as to what went wrong; only firmware_class really knows
+that. Therefore, add specific log messages for the failure modes that
+aren't currently logged.
+
+In case of a driver that tries multiple names, this may result in the
+impression that it failed to initialise. Therefore, also log successes.
+
+Change existing log messages to consistently use the given device, not
+the temporary child device we create.
+
+This makes many error messages in drivers redundant, which will be
+removed in later patches.
+
+--- a/drivers/base/firmware_class.c
++++ b/drivers/base/firmware_class.c
+@@ -255,7 +255,8 @@ static ssize_t firmware_loading_store(st
+ fw_priv->nr_pages,
+ 0, PAGE_KERNEL_RO);
+ if (!fw_priv->fw->data) {
+- dev_err(dev, "%s: vmap() failed\n", __func__);
++ dev_err(dev->parent, "%s: vmap() failed\n",
++ __func__);
+ goto err;
+ }
+ /* Pages are now owned by 'struct firmware' */
+@@ -270,9 +271,14 @@ static ssize_t firmware_loading_store(st
+ }
+ /* fallthrough */
+ default:
+- dev_err(dev, "%s: unexpected value (%d)\n", __func__, loading);
+- /* fallthrough */
++ dev_err(dev->parent, "%s: unexpected value (%d)\n",
++ __func__, loading);
++ goto err;
+ case -1:
++ dev_err(dev->parent,
++ "firmware: agent aborted loading %s (not found?)\n",
++ fw_priv->fw_id);
++ /* fallthrough */
+ err:
+ fw_load_abort(fw_priv);
+ break;
+@@ -435,6 +441,9 @@ static void firmware_class_timeout(u_lon
+ {
+ struct firmware_priv *fw_priv = (struct firmware_priv *) data;
+
++ dev_err(fw_priv->dev.parent,
++ "firmware: agent did not handle request for %s\n",
++ fw_priv->fw_id);
+ fw_load_abort(fw_priv);
+ }
+
+@@ -486,7 +495,8 @@ _request_firmware_prepare(const struct f
+ }
+
+ if (fw_get_builtin_firmware(firmware, name)) {
+- dev_dbg(device, "firmware: using built-in firmware %s\n", name);
++ dev_info(device, "firmware: using built-in firmware %s\n",
++ name);
+ return NULL;
+ }
+
+@@ -517,25 +527,29 @@ static int _request_firmware_load(struct
+
+ retval = device_add(f_dev);
+ if (retval) {
+- dev_err(f_dev, "%s: device_register failed\n", __func__);
++ dev_err(f_dev->parent, "%s: device_register failed\n",
++ __func__);
+ goto err_put_dev;
+ }
+
+ retval = device_create_bin_file(f_dev, &firmware_attr_data);
+ if (retval) {
+- dev_err(f_dev, "%s: sysfs_create_bin_file failed\n", __func__);
++ dev_err(f_dev->parent, "%s: sysfs_create_bin_file failed\n",
++ __func__);
+ goto err_del_dev;
+ }
+
+ retval = device_create_file(f_dev, &dev_attr_loading);
+ if (retval) {
+- dev_err(f_dev, "%s: device_create_file failed\n", __func__);
++ dev_err(f_dev->parent, "%s: device_create_file failed\n",
++ __func__);
+ goto err_del_bin_attr;
+ }
+
+ if (uevent) {
+ dev_set_uevent_suppress(f_dev, false);
+- dev_dbg(f_dev, "firmware: requesting %s\n", fw_priv->fw_id);
++ dev_dbg(f_dev->parent, "firmware: requesting %s\n",
++ fw_priv->fw_id);
+ if (timeout != MAX_SCHEDULE_TIMEOUT)
+ mod_timer(&fw_priv->timeout,
+ round_jiffies_up(jiffies + timeout));
+@@ -549,8 +563,15 @@ static int _request_firmware_load(struct
+ del_timer_sync(&fw_priv->timeout);
+
+ mutex_lock(&fw_lock);
+- if (!fw_priv->fw->size || test_bit(FW_STATUS_ABORT, &fw_priv->status))
++ if (test_bit(FW_STATUS_ABORT, &fw_priv->status)) {
++ /* failure has already been logged */
++ retval = -ENOENT;
++ } else if (!fw_priv->fw->size) {
++ dev_err(f_dev->parent,
++ "firmware: agent loaded no data for %s (not found?)\n",
++ name);
+ retval = -ENOENT;
++ }
+ fw_priv->fw = NULL;
+ mutex_unlock(&fw_lock);
+
+@@ -601,6 +622,9 @@ request_firmware(const struct firmware *
+ }
+ if (ret)
+ _request_firmware_cleanup(firmware_p);
++ else
++ dev_info(device, "firmware: agent loaded %s into memory\n",
++ name);
+
+ return ret;
+ }
+@@ -650,7 +674,7 @@ static void request_firmware_work_func(s
+ ret = _request_firmware_load(fw_priv, fw_work->uevent, timeout);
+ usermodehelper_read_unlock();
+ } else {
+- dev_dbg(fw_work->device, "firmware: %s loading timed out\n",
++ dev_err(fw_work->device, "firmware: %s loading timed out\n",
+ fw_work->name);
+ ret = -EAGAIN;
+ }
diff --git a/debian/patches/bugfix/all/megaraid_sas-fix-memory-leak-if-SGL-has-zero-length-entries.patch b/debian/patches/bugfix/all/megaraid_sas-fix-memory-leak-if-SGL-has-zero-length-entries.patch
new file mode 100644
index 000000000000..5e6772a8f46d
--- /dev/null
+++ b/debian/patches/bugfix/all/megaraid_sas-fix-memory-leak-if-SGL-has-zero-length-entries.patch
@@ -0,0 +1,39 @@
+From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <bjorn@mork.no>
+Date: Wed, 21 Nov 2012 09:54:48 +0100
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Subject: [PATCH] megaraid_sas: fix memory leak if SGL has zero length entries
+Content-Transfer-Encoding: 8bit
+
+commit 98cb7e44 ([SCSI] megaraid_sas: Sanity check user
+supplied length before passing it to dma_alloc_coherent())
+introduced a memory leak. Memory allocated for entries
+following zero length SGL entries will not be freed.
+
+Reference: http://bugs.debian.org/688198
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Bjørn Mork <bjorn@mork.no>
+Acked-by: Adam Radford <aradford@gmail.com>
+---
+ drivers/scsi/megaraid/megaraid_sas_base.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+--- a/drivers/scsi/megaraid/megaraid_sas_base.c
++++ b/drivers/scsi/megaraid/megaraid_sas_base.c
+@@ -4886,10 +4886,12 @@ megasas_mgmt_fw_ioctl(struct megasas_ins
+ sense, sense_handle);
+ }
+
+- for (i = 0; i < ioc->sge_count && kbuff_arr[i]; i++) {
+- dma_free_coherent(&instance->pdev->dev,
+- kern_sge32[i].length,
+- kbuff_arr[i], kern_sge32[i].phys_addr);
++ for (i = 0; i < ioc->sge_count; i++) {
++ if (kbuff_arr[i])
++ dma_free_coherent(&instance->pdev->dev,
++ kern_sge32[i].length,
++ kbuff_arr[i],
++ kern_sge32[i].phys_addr);
+ }
+
+ megasas_return_cmd(instance, cmd);
diff --git a/debian/patches/bugfix/x86/ACPI-video-ignore-BIOS-initial-backlight-value-for-H.patch b/debian/patches/bugfix/x86/ACPI-video-ignore-BIOS-initial-backlight-value-for-H.patch
new file mode 100644
index 000000000000..37eb140c3208
--- /dev/null
+++ b/debian/patches/bugfix/x86/ACPI-video-ignore-BIOS-initial-backlight-value-for-H.patch
@@ -0,0 +1,49 @@
+From: Zhang Rui <rui.zhang@intel.com>
+Date: Tue, 4 Dec 2012 23:30:19 +0100
+Subject: ACPI / video: ignore BIOS initial backlight value for HP Folio
+ 13-2000
+
+commit 129ff8f8d58297b04f47b5d6fad81aa2d08404e1 upstream.
+
+Or else the laptop will boot with a dimmed screen.
+
+References: https://bugzilla.kernel.org/show_bug.cgi?id=51141
+Tested-by: Stefan Nagy <public@stefan-nagy.at>
+Signed-off-by: Zhang Rui <rui.zhang@intel.com>
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+---
+ drivers/acpi/video.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
+index 0230cb6..ac9a69c 100644
+--- a/drivers/acpi/video.c
++++ b/drivers/acpi/video.c
+@@ -389,6 +389,12 @@ static int __init video_set_bqc_offset(const struct dmi_system_id *d)
+ return 0;
+ }
+
++static int video_ignore_initial_backlight(const struct dmi_system_id *d)
++{
++ use_bios_initial_backlight = 0;
++ return 0;
++}
++
+ static struct dmi_system_id video_dmi_table[] __initdata = {
+ /*
+ * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
+@@ -433,6 +439,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
+ DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720"),
+ },
+ },
++ {
++ .callback = video_ignore_initial_backlight,
++ .ident = "HP Folio 13-2000",
++ .matches = {
++ DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
++ DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13 - 2000 Notebook PC"),
++ },
++ },
+ {}
+ };
+
diff --git a/debian/patches/bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch b/debian/patches/bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch
new file mode 100644
index 000000000000..5748cfa352b5
--- /dev/null
+++ b/debian/patches/bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch
@@ -0,0 +1,63 @@
+From: Ben Hutchings <ben@decadent.org.uk>
+Date: Fri, 9 Nov 2012 02:43:00 +0000
+Subject: asus-laptop: Do not call HWRS on init
+
+Since commit 8871e99f89b7 ('asus-laptop: HRWS/HWRS typo'), module
+initialisation is very slow on the Asus UL30A. The HWRS method takes
+about 12 seconds to run, and subsequent initialisation also seems to
+be delayed. Since we don't really need the result, don't bother
+calling it on init. Those who are curious can still get the result
+through the 'infos' device attribute.
+
+Update the comment about HWRS in show_infos().
+
+Reported-by: ryan <draziw+deb@gmail.com>
+References: http://bugs.debian.org/692436
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+---
+ drivers/platform/x86/asus-laptop.c | 17 ++++-------------
+ 1 file changed, 4 insertions(+), 13 deletions(-)
+
+diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c
+index 4b568df..a961156 100644
+--- a/drivers/platform/x86/asus-laptop.c
++++ b/drivers/platform/x86/asus-laptop.c
+@@ -860,8 +860,10 @@ static ssize_t show_infos(struct device *dev,
+ /*
+ * The HWRS method return informations about the hardware.
+ * 0x80 bit is for WLAN, 0x100 for Bluetooth.
++ * 0x40 for WWAN, 0x10 for WIMAX.
+ * The significance of others is yet to be found.
+- * If we don't find the method, we assume the device are present.
++ * We don't currently use this for device detection, and it
++ * takes several seconds to run on some systems.
+ */
+ rv = acpi_evaluate_integer(asus->handle, "HWRS", NULL, &temp);
+ if (!ACPI_FAILURE(rv))
+@@ -1682,7 +1684,7 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
+ {
+ struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+ union acpi_object *model = NULL;
+- unsigned long long bsts_result, hwrs_result;
++ unsigned long long bsts_result;
+ char *string = NULL;
+ acpi_status status;
+
+@@ -1744,17 +1746,6 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
+ if (*string)
+ pr_notice(" %s model detected\n", string);
+
+- /*
+- * The HWRS method return informations about the hardware.
+- * 0x80 bit is for WLAN, 0x100 for Bluetooth,
+- * 0x40 for WWAN, 0x10 for WIMAX.
+- * The significance of others is yet to be found.
+- */
+- status =
+- acpi_evaluate_integer(asus->handle, "HWRS", NULL, &hwrs_result);
+- if (!ACPI_FAILURE(status))
+- pr_notice(" HWRS returned %x", (int)hwrs_result);
+-
+ if (!acpi_check_handle(asus->handle, METHOD_WL_STATUS, NULL))
+ asus->have_rsts = true;
+
diff --git a/debian/patches/debian/radeon-no-modeset-without-firmware.patch b/debian/patches/debian/radeon-no-modeset-without-firmware.patch
new file mode 100644
index 000000000000..fde0a05b861b
--- /dev/null
+++ b/debian/patches/debian/radeon-no-modeset-without-firmware.patch
@@ -0,0 +1,83 @@
+From: Ben Hutchings <ben@decadent.org.uk>
+Subject: radeon: No MODESET without firmware
+Date: Sat, 17 Nov 2012 05:28:53 +0000
+Bug-Debian: http://bugs.debian.org/607194
+Bug-Debian: http://bugs.debian.org/607471
+Bug-Debian: http://bugs.debian.org/610851
+Bug-Debian: http://bugs.debian.org/627497
+Bug-Debian: http://bugs.debian.org/632212
+Bug-Debian: http://bugs.debian.org/637943
+Bug-Debian: http://bugs.debian.org/649448
+
+radeon requires firmware/microcode for the GPU all chips, but for
+newer chips (apparently R600 'Evergreen' onward) it also expects
+firmware for the memory controller and other sub-blocks.
+
+radeon attempts to gracefully fall back and disable some features if
+the firmware is not available, but becomes unstable - the framebuffer
+and/or system memory may be corrupted, or the display may stay black.
+This does not seem to happen if KMS is disabled.
+
+Unfortunately, it is not possible to properly disable KMS once the
+missing firmware is discovered. Each driver registers with the DRM
+core as having certain capabilities such as DRIVER_MODESET (KMS) and
+the DRM does not allow for individual devices to have different
+capabilities!
+
+Therefore, perform a basic check for the existence of
+/lib/firmware/radeon when the driver is loaded, and disable KMS
+if it is missing. I apologise for this gross hack, but I cannot
+see any more reliable solution that doesn't involve major changes
+to both DRM and radeon.
+
+---
+--- a/drivers/gpu/drm/radeon/radeon_drv.c
++++ b/drivers/gpu/drm/radeon/radeon_drv.c
+@@ -37,6 +37,8 @@
+ #include "drm_pciids.h"
+ #include <linux/console.h>
+ #include <linux/module.h>
++#include <linux/namei.h>
++#include <linux/path.h>
+
+
+ /*
+@@ -378,6 +380,24 @@ static struct pci_driver radeon_kms_pci_
+ .resume = radeon_pci_resume,
+ };
+
++/* Test that /lib/firmware/radeon is a directory (or symlink to a
++ * directory). We could try to match the udev search path, but let's
++ * assume people take the easy route and install
++ * firmware-linux-nonfree.
++ */
++static bool __init radeon_firmware_installed(void)
++{
++ struct path path;
++
++ if (kern_path("/lib/firmware/radeon", LOOKUP_DIRECTORY | LOOKUP_FOLLOW,
++ &path) == 0) {
++ path_put(&path);
++ return true;
++ }
++
++ return false;
++}
++
+ static int __init radeon_init(void)
+ {
+ driver = &driver_old;
+@@ -402,6 +422,13 @@ static int __init radeon_init(void)
+ radeon_modeset = 0;
+ #endif
+ }
++ /* We have to commit to KMS before we've seen any devices, so
++ * make a basic check to reduce the risk of failure later.
++ */
++ if (radeon_modeset == 1 && !radeon_firmware_installed()) {
++ DRM_INFO("radeon kernel modesetting disabled; it requires firmware-linux-nonfree.\n");
++ radeon_modeset = 0;
++ }
+ if (radeon_modeset == 1) {
+ DRM_INFO("radeon kernel modesetting enabled.\n");
+ driver = &kms_driver;
diff --git a/debian/patches/features/all/xen/microcode-amd-fam15plus.patch b/debian/patches/features/all/xen/microcode-amd-fam15plus.patch
new file mode 100644
index 000000000000..8ba3acfba55e
--- /dev/null
+++ b/debian/patches/features/all/xen/microcode-amd-fam15plus.patch
@@ -0,0 +1,39 @@
+From a47f7cb2f0dbe097b7c848aea05c3224bde07e3c Mon Sep 17 00:00:00 2001
+From: Ian Campbell <ijc@hellion.org.uk>
+Date: Mon, 26 Nov 2012 09:41:02 +0000
+Subject: [PATCH] microcode_xen: Add support for AMD family >= 15h
+
+Signed-off-by: Ian Campbell <ijc@hellion.org.uk>
+---
+ arch/x86/kernel/microcode_xen.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/arch/x86/kernel/microcode_xen.c b/arch/x86/kernel/microcode_xen.c
+index 9d2a06b..5fe87a6 100644
+--- a/arch/x86/kernel/microcode_xen.c
++++ b/arch/x86/kernel/microcode_xen.c
+@@ -58,7 +58,7 @@ static int xen_microcode_update(int cpu)
+
+ static enum ucode_state xen_request_microcode_fw(int cpu, struct device *device)
+ {
+- char name[30];
++ char name[36];
+ struct cpuinfo_x86 *c = &cpu_data(cpu);
+ const struct firmware *firmware;
+ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+@@ -74,7 +74,11 @@ static enum ucode_state xen_request_microcode_fw(int cpu, struct device *device)
+ break;
+
+ case X86_VENDOR_AMD:
+- snprintf(name, sizeof(name), "amd-ucode/microcode_amd.bin");
++ /* Beginning with family 15h AMD uses family-specific firmware files. */
++ if (c->x86 >= 0x15)
++ snprintf(name, sizeof(name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86);
++ else
++ snprintf(name, sizeof(name), "amd-ucode/microcode_amd.bin");
+ break;
+
+ default:
+--
+1.7.10.4
+
diff --git a/debian/patches/features/all/xen/microcode-typo.patch b/debian/patches/features/all/xen/microcode-typo.patch
new file mode 100644
index 000000000000..7f091060cc17
--- /dev/null
+++ b/debian/patches/features/all/xen/microcode-typo.patch
@@ -0,0 +1,15 @@
+http://git.kernel.org/?p=linux/kernel/git/konrad/xen.git;a=commitdiff;h=f6c958ff0d00ffbf1cdc8fcf2f2a82f06fbbb5f4
+
+Index: linux/arch/x86/kernel/microcode_xen.c
+===================================================================
+--- linux.orig/arch/x86/kernel/microcode_xen.c 2012-12-05 13:31:49.000000000 +0000
++++ linux/arch/x86/kernel/microcode_xen.c 2012-12-05 13:32:10.000000000 +0000
+@@ -161,7 +161,7 @@
+ ret = UCODE_OK;
+
+ out:
+- if (ret == 0)
++ if (ret == UCODE_OK)
+ uci->mc = uc;
+ else
+ vfree(uc);
diff --git a/debian/patches/features/all/xen/microcode.patch b/debian/patches/features/all/xen/microcode.patch
new file mode 100644
index 000000000000..be5976ac3085
--- /dev/null
+++ b/debian/patches/features/all/xen/microcode.patch
@@ -0,0 +1,284 @@
+From 23757fb5d6781bf945d21d1f5373aa71122cbea9 Mon Sep 17 00:00:00 2001
+From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
+Date: Fri, 27 Mar 2009 17:39:15 -0700
+Subject: [PATCH] xen: add CPU microcode update driver
+
+Xen does all the hard work for us, including choosing the right update
+method for this cpu type and actually doing it for all cpus. We just
+need to supply it with the firmware blob.
+
+Because Xen updates all CPUs (and the kernel's virtual cpu numbers have
+no fixed relationship with the underlying physical cpus), we only bother
+doing anything for cpu "0".
+
+[ Impact: allow CPU microcode update in Xen dom0 ]
+Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
+---
+
+Takes from git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git#upstream/microcode
+
+ arch/x86/include/asm/microcode.h | 9 ++
+ arch/x86/kernel/Makefile | 1 +
+ arch/x86/kernel/microcode_core.c | 5 +-
+ arch/x86/kernel/microcode_xen.c | 198 ++++++++++++++++++++++++++++++++++++++
+ arch/x86/xen/Kconfig | 4 +
+ 5 files changed, 216 insertions(+), 1 deletion(-)
+ create mode 100644 arch/x86/kernel/microcode_xen.c
+
+--- a/arch/x86/include/asm/microcode.h
++++ b/arch/x86/include/asm/microcode.h
+@@ -63,4 +63,13 @@ static inline struct microcode_ops * __i
+ static inline void __exit exit_amd_microcode(void) {}
+ #endif
+
++#ifdef CONFIG_MICROCODE_XEN
++extern struct microcode_ops * __init init_xen_microcode(void);
++#else
++static inline struct microcode_ops * __init init_xen_microcode(void)
++{
++ return NULL;
++}
++#endif
++
+ #endif /* _ASM_X86_MICROCODE_H */
+--- a/arch/x86/kernel/Makefile
++++ b/arch/x86/kernel/Makefile
+@@ -92,6 +92,7 @@ obj-$(CONFIG_PCSPKR_PLATFORM) += pcspeak
+ microcode-y := microcode_core.o
+ microcode-$(CONFIG_MICROCODE_INTEL) += microcode_intel.o
+ microcode-$(CONFIG_MICROCODE_AMD) += microcode_amd.o
++microcode-$(CONFIG_MICROCODE_XEN) += microcode_xen.o
+ obj-$(CONFIG_MICROCODE) += microcode.o
+
+ obj-$(CONFIG_X86_CHECK_BIOS_CORRUPTION) += check.o
+--- a/arch/x86/kernel/microcode_core.c
++++ b/arch/x86/kernel/microcode_core.c
+@@ -84,6 +84,7 @@
+ #include <linux/mm.h>
+ #include <linux/syscore_ops.h>
+
++#include <xen/xen.h>
+ #include <asm/microcode.h>
+ #include <asm/processor.h>
+ #include <asm/cpu_device_id.h>
+@@ -544,7 +545,9 @@ static int __init microcode_init(void)
+ struct cpuinfo_x86 *c = &cpu_data(0);
+ int error;
+
+- if (c->x86_vendor == X86_VENDOR_INTEL)
++ if (xen_pv_domain())
++ microcode_ops = init_xen_microcode();
++ else if (c->x86_vendor == X86_VENDOR_INTEL)
+ microcode_ops = init_intel_microcode();
+ else if (c->x86_vendor == X86_VENDOR_AMD)
+ microcode_ops = init_amd_microcode();
+--- /dev/null
++++ b/arch/x86/kernel/microcode_xen.c
+@@ -0,0 +1,198 @@
++/*
++ * Xen microcode update driver
++ *
++ * Xen does most of the work here. We just pass the whole blob into
++ * Xen, and it will apply it to all CPUs as appropriate. Xen will
++ * worry about how different CPU models are actually updated.
++ */
++#include <linux/sched.h>
++#include <linux/module.h>
++#include <linux/firmware.h>
++#include <linux/vmalloc.h>
++#include <linux/uaccess.h>
++
++#include <asm/microcode.h>
++
++#include <xen/xen.h>
++#include <xen/interface/platform.h>
++#include <xen/interface/xen.h>
++
++#include <asm/xen/hypercall.h>
++#include <asm/xen/hypervisor.h>
++
++MODULE_DESCRIPTION("Xen microcode update driver");
++MODULE_LICENSE("GPL");
++
++struct xen_microcode {
++ size_t len;
++ char data[0];
++};
++
++static int xen_microcode_update(int cpu)
++{
++ int err;
++ struct xen_platform_op op;
++ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
++ struct xen_microcode *uc = uci->mc;
++
++ if (uc == NULL || uc->len == 0) {
++ /*
++ * We do all cpus at once, so we don't need to do
++ * other cpus explicitly (besides, these vcpu numbers
++ * have no relationship to underlying physical cpus).
++ */
++ return 0;
++ }
++
++ op.cmd = XENPF_microcode_update;
++ set_xen_guest_handle(op.u.microcode.data, uc->data);
++ op.u.microcode.length = uc->len;
++
++ err = HYPERVISOR_dom0_op(&op);
++
++ if (err != 0)
++ printk(KERN_WARNING "microcode_xen: microcode update failed: %d\n", err);
++
++ return err;
++}
++
++static enum ucode_state xen_request_microcode_fw(int cpu, struct device *device)
++{
++ char name[30];
++ struct cpuinfo_x86 *c = &cpu_data(cpu);
++ const struct firmware *firmware;
++ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
++ enum ucode_state ret;
++ struct xen_microcode *uc;
++ size_t size;
++ int err;
++
++ switch (c->x86_vendor) {
++ case X86_VENDOR_INTEL:
++ snprintf(name, sizeof(name), "intel-ucode/%02x-%02x-%02x",
++ c->x86, c->x86_model, c->x86_mask);
++ break;
++
++ case X86_VENDOR_AMD:
++ snprintf(name, sizeof(name), "amd-ucode/microcode_amd.bin");
++ break;
++
++ default:
++ return UCODE_NFOUND;
++ }
++
++ err = request_firmware(&firmware, name, device);
++ if (err) {
++ pr_debug("microcode: data file %s load failed\n", name);
++ return UCODE_NFOUND;
++ }
++
++ /*
++ * Only bother getting real firmware for cpu 0; the others get
++ * dummy placeholders.
++ */
++ if (cpu == 0)
++ size = firmware->size;
++ else
++ size = 0;
++
++ if (uci->mc != NULL) {
++ vfree(uci->mc);
++ uci->mc = NULL;
++ }
++
++ ret = UCODE_ERROR;
++ uc = vmalloc(sizeof(*uc) + size);
++ if (uc == NULL)
++ goto out;
++
++ ret = UCODE_OK;
++ uc->len = size;
++ memcpy(uc->data, firmware->data, uc->len);
++
++ uci->mc = uc;
++
++out:
++ release_firmware(firmware);
++
++ return ret;
++}
++
++static enum ucode_state xen_request_microcode_user(int cpu,
++ const void __user *buf, size_t size)
++{
++ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
++ struct xen_microcode *uc;
++ enum ucode_state ret;
++ size_t unread;
++
++ if (cpu != 0) {
++ /* No real firmware for non-zero cpus; just store a
++ placeholder */
++ size = 0;
++ }
++
++ if (uci->mc != NULL) {
++ vfree(uci->mc);
++ uci->mc = NULL;
++ }
++
++ ret = UCODE_ERROR;
++ uc = vmalloc(sizeof(*uc) + size);
++ if (uc == NULL)
++ goto out;
++
++ uc->len = size;
++
++ ret = UCODE_NFOUND;
++
++ unread = copy_from_user(uc->data, buf, size);
++
++ if (unread != 0) {
++ printk(KERN_WARNING "failed to read %zd of %zd bytes at %p -> %p\n",
++ unread, size, buf, uc->data);
++ goto out;
++ }
++
++ ret = UCODE_OK;
++
++out:
++ if (ret == 0)
++ uci->mc = uc;
++ else
++ vfree(uc);
++
++ return ret;
++}
++
++static void xen_microcode_fini_cpu(int cpu)
++{
++ struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
++
++ vfree(uci->mc);
++ uci->mc = NULL;
++}
++
++static int xen_collect_cpu_info(int cpu, struct cpu_signature *sig)
++{
++ sig->sig = 0;
++ sig->pf = 0;
++ sig->rev = 0;
++
++ return 0;
++}
++
++static struct microcode_ops microcode_xen_ops = {
++ .request_microcode_user = xen_request_microcode_user,
++ .request_microcode_fw = xen_request_microcode_fw,
++ .collect_cpu_info = xen_collect_cpu_info,
++ .apply_microcode = xen_microcode_update,
++ .microcode_fini_cpu = xen_microcode_fini_cpu,
++};
++
++struct microcode_ops * __init init_xen_microcode(void)
++{
++ if (!xen_initial_domain())
++ return NULL;
++ return &microcode_xen_ops;
++}
+--- a/arch/x86/xen/Kconfig
++++ b/arch/x86/xen/Kconfig
+@@ -50,3 +50,6 @@ config XEN_DEBUG_FS
+ Enable statistics output and various tuning options in debugfs.
+ Enabling this option may incur a significant performance overhead.
+
++config MICROCODE_XEN
++ def_bool y
++ depends on XEN_DOM0 && MICROCODE
diff --git a/debian/patches/series b/debian/patches/series
index 8f5b3910abeb..1a0825d77616 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -55,3 +55,17 @@ bugfix/arm/0001-usb-phy-add-a-new-driver-for-omap-usb2-phy.patch
bugfix/arm/0001-usb-otg-make-twl6030_usb-as-a-comparator-driver-to-o.patch
bugfix/arm/0001-usb-otg-Fix-build-errors-if-USB_MUSB_OMAP2PLUS-is-se.patch
bugfix/arm/omap-musb-choice.patch
+bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch
+
+features/all/xen/microcode.patch
+debian/radeon-no-modeset-without-firmware.patch
+features/all/xen/microcode-amd-fam15plus.patch
+features/all/xen/microcode-typo.patch
+
+bugfix/all/firmware_class-log-every-success-and-failure.patch
+bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch
+
+bugfix/x86/ACPI-video-ignore-BIOS-initial-backlight-value-for-H.patch
+bugfix/all/exec-do-not-leave-bprm-interp-on-stack.patch
+bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch
+bugfix/all/megaraid_sas-fix-memory-leak-if-SGL-has-zero-length-entries.patch
diff --git a/debian/templates/control.image-dbg.in b/debian/templates/control.image-dbg.in
index 664ce7ca70b1..1c067f6f47f6 100644
--- a/debian/templates/control.image-dbg.in
+++ b/debian/templates/control.image-dbg.in
@@ -2,6 +2,6 @@ Package: linux-image-@abiname@@localversion@-dbg
Depends: ${misc:Depends}
Section: debug
Priority: extra
-Description: Debugging infos for Linux @abiname@@localversion@
- This package provides the binary debug image and pre-built debug loadable
- modules for Linux kernel @upstreamversion@ on @longclass@ machines.
+Description: Debugging symbols for Linux @abiname@@localversion@
+ This package provides the detached debugging symbols for the Linux kernel
+ and modules in linux-image-@abiname@@localversion@.