diff options
author | Ben Hutchings <benh@debian.org> | 2012-12-10 04:06:21 +0000 |
---|---|---|
committer | Ben Hutchings <benh@debian.org> | 2012-12-10 04:06:21 +0000 |
commit | ef781eb6eec9b61b82a8bafc92718bd49d95ba0f (patch) | |
tree | b3ced713d830b8d33ba3810b2ce975b93341aa6a | |
parent | d67e2904144f76e8df48d33e34d46916e5ac0111 (diff) | |
parent | 2f16347aaed704848b45ca9a079a180706be81ae (diff) | |
download | kernel_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
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(¤t->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 µcode_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@. |