diff options
author | Anthony G. Basile <blueness@gentoo.org> | 2012-10-09 08:31:03 -0400 |
---|---|---|
committer | Anthony G. Basile <blueness@gentoo.org> | 2012-10-09 08:31:03 -0400 |
commit | 4e05d5d8c2d5278d61dcfbc7f9a832817af4591f (patch) | |
tree | 6163140c4a78b02c9d5e0a1ed7940c75418be8d8 | |
parent | Grsec/PaX: 2.9.1-{2.6.32.59,3.2.30,3.5.5}-201210070828 (diff) | |
download | hardened-patchset-20121007.tar.gz hardened-patchset-20121007.tar.bz2 hardened-patchset-20121007.zip |
Grsec/PaX: 2.9.1-{2.6.32.59,3.2.30,3.5.6}-20121007171620121007
-rw-r--r-- | 2.6.32/0000_README | 2 | ||||
-rw-r--r-- | 2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201210071703.patch (renamed from 2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201210070827.patch) | 12 | ||||
-rw-r--r-- | 3.2.30/0000_README | 2 | ||||
-rw-r--r-- | 3.2.30/4420_grsecurity-2.9.1-3.2.30-201210071704.patch (renamed from 3.2.30/4420_grsecurity-2.9.1-3.2.30-201210070828.patch) | 12 | ||||
-rw-r--r-- | 3.5.5/1004_linux-3.5.5.patch | 10564 | ||||
-rw-r--r-- | 3.5.6/0000_README (renamed from 3.5.5/0000_README) | 2 | ||||
-rw-r--r-- | 3.5.6/4420_grsecurity-2.9.1-3.5.6-201210071716.patch (renamed from 3.5.5/4420_grsecurity-2.9.1-3.5.5-201210070828.patch) | 124 | ||||
-rw-r--r-- | 3.5.6/4430_grsec-remove-localversion-grsec.patch (renamed from 3.5.5/4430_grsec-remove-localversion-grsec.patch) | 0 | ||||
-rw-r--r-- | 3.5.6/4435_grsec-mute-warnings.patch (renamed from 3.5.5/4435_grsec-mute-warnings.patch) | 0 | ||||
-rw-r--r-- | 3.5.6/4440_grsec-remove-protected-paths.patch (renamed from 3.5.5/4440_grsec-remove-protected-paths.patch) | 0 | ||||
-rw-r--r-- | 3.5.6/4450_grsec-kconfig-default-gids.patch (renamed from 3.5.5/4450_grsec-kconfig-default-gids.patch) | 0 | ||||
-rw-r--r-- | 3.5.6/4465_selinux-avc_audit-log-curr_ip.patch (renamed from 3.5.5/4465_selinux-avc_audit-log-curr_ip.patch) | 0 | ||||
-rw-r--r-- | 3.5.6/4470_disable-compat_vdso.patch (renamed from 3.5.5/4470_disable-compat_vdso.patch) | 0 |
13 files changed, 67 insertions, 10651 deletions
diff --git a/2.6.32/0000_README b/2.6.32/0000_README index 42845f1..05a4857 100644 --- a/2.6.32/0000_README +++ b/2.6.32/0000_README @@ -30,7 +30,7 @@ Patch: 1058_linux-2.6.32.59.patch From: http://www.kernel.org Desc: Linux 2.6.32.59 -Patch: 4420_grsecurity-2.9.1-2.6.32.59-201210070827.patch +Patch: 4420_grsecurity-2.9.1-2.6.32.59-201210071703.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201210070827.patch b/2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201210071703.patch index d90002f..3166836 100644 --- a/2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201210070827.patch +++ b/2.6.32/4420_grsecurity-2.9.1-2.6.32.59-201210071703.patch @@ -75693,10 +75693,18 @@ index 9fe7d7e..cdb62c9 100644 seq_putc(m, '\n'); diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c -index 04d1270..ca49aa3 100644 +index 04d1270..9dbd384 100644 --- a/fs/proc/proc_net.c +++ b/fs/proc/proc_net.c -@@ -104,6 +104,17 @@ static struct net *get_proc_task_net(struct inode *dir) +@@ -22,6 +22,7 @@ + #include <linux/nsproxy.h> + #include <net/net_namespace.h> + #include <linux/seq_file.h> ++#include <linux/grsecurity.h> + + #include "internal.h" + +@@ -104,6 +105,17 @@ static struct net *get_proc_task_net(struct inode *dir) struct task_struct *task; struct nsproxy *ns; struct net *net = NULL; diff --git a/3.2.30/0000_README b/3.2.30/0000_README index 69b9c98..ed17ee7 100644 --- a/3.2.30/0000_README +++ b/3.2.30/0000_README @@ -38,7 +38,7 @@ Patch: 1029_linux-3.2.30.patch From: http://www.kernel.org Desc: Linux 3.2.30 -Patch: 4420_grsecurity-2.9.1-3.2.30-201210070828.patch +Patch: 4420_grsecurity-2.9.1-3.2.30-201210071704.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/3.2.30/4420_grsecurity-2.9.1-3.2.30-201210070828.patch b/3.2.30/4420_grsecurity-2.9.1-3.2.30-201210071704.patch index 431e878..b87e134 100644 --- a/3.2.30/4420_grsecurity-2.9.1-3.2.30-201210070828.patch +++ b/3.2.30/4420_grsecurity-2.9.1-3.2.30-201210071704.patch @@ -50207,10 +50207,18 @@ index b1822dd..df622cb 100644 seq_putc(m, '\n'); diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c -index f738024..8e3f141 100644 +index f738024..682f400 100644 --- a/fs/proc/proc_net.c +++ b/fs/proc/proc_net.c -@@ -105,6 +105,17 @@ static struct net *get_proc_task_net(struct inode *dir) +@@ -23,6 +23,7 @@ + #include <linux/nsproxy.h> + #include <net/net_namespace.h> + #include <linux/seq_file.h> ++#include <linux/grsecurity.h> + + #include "internal.h" + +@@ -105,6 +106,17 @@ static struct net *get_proc_task_net(struct inode *dir) struct task_struct *task; struct nsproxy *ns; struct net *net = NULL; diff --git a/3.5.5/1004_linux-3.5.5.patch b/3.5.5/1004_linux-3.5.5.patch deleted file mode 100644 index d3f2056..0000000 --- a/3.5.5/1004_linux-3.5.5.patch +++ /dev/null @@ -1,10564 +0,0 @@ -diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt -index 286ec04..82dd174 100644 ---- a/Documentation/sound/alsa/HD-Audio-Models.txt -+++ b/Documentation/sound/alsa/HD-Audio-Models.txt -@@ -47,6 +47,7 @@ ALC882/883/885/888/889 - acer-aspire-4930g Acer Aspire 4930G/5930G/6530G/6930G/7730G - acer-aspire-8930g Acer Aspire 8330G/6935G - acer-aspire Acer Aspire others -+ no-primary-hp VAIO Z workaround (for fixed speaker DAC) - - ALC861/660 - ========== -diff --git a/Makefile b/Makefile -index 6453ead..b3dfc85 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,6 +1,6 @@ - VERSION = 3 - PATCHLEVEL = 5 --SUBLEVEL = 4 -+SUBLEVEL = 5 - EXTRAVERSION = - NAME = Saber-toothed Squirrel - -diff --git a/arch/alpha/include/asm/atomic.h b/arch/alpha/include/asm/atomic.h -index 3bb7ffe..c2cbe4f 100644 ---- a/arch/alpha/include/asm/atomic.h -+++ b/arch/alpha/include/asm/atomic.h -@@ -14,8 +14,8 @@ - */ - - --#define ATOMIC_INIT(i) ( (atomic_t) { (i) } ) --#define ATOMIC64_INIT(i) ( (atomic64_t) { (i) } ) -+#define ATOMIC_INIT(i) { (i) } -+#define ATOMIC64_INIT(i) { (i) } - - #define atomic_read(v) (*(volatile int *)&(v)->counter) - #define atomic64_read(v) (*(volatile long *)&(v)->counter) -diff --git a/arch/arm/Makefile b/arch/arm/Makefile -index 0298b00..926d840 100644 ---- a/arch/arm/Makefile -+++ b/arch/arm/Makefile -@@ -279,10 +279,10 @@ zImage Image xipImage bootpImage uImage: vmlinux - zinstall uinstall install: vmlinux - $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@ - --%.dtb: -+%.dtb: scripts - $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ - --dtbs: -+dtbs: scripts - $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ - - # We use MRPROPER_FILES and CLEAN_FILES now -diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S -index b8c64b8..bc67cbf 100644 ---- a/arch/arm/boot/compressed/head.S -+++ b/arch/arm/boot/compressed/head.S -@@ -653,16 +653,21 @@ __armv7_mmu_cache_on: - mcrne p15, 0, r0, c8, c7, 0 @ flush I,D TLBs - #endif - mrc p15, 0, r0, c1, c0, 0 @ read control reg -+ bic r0, r0, #1 << 28 @ clear SCTLR.TRE - orr r0, r0, #0x5000 @ I-cache enable, RR cache replacement - orr r0, r0, #0x003c @ write buffer - #ifdef CONFIG_MMU - #ifdef CONFIG_CPU_ENDIAN_BE8 - orr r0, r0, #1 << 25 @ big-endian page tables - #endif -+ mrcne p15, 0, r6, c2, c0, 2 @ read ttb control reg - orrne r0, r0, #1 @ MMU enabled - movne r1, #0xfffffffd @ domain 0 = client -+ bic r6, r6, #1 << 31 @ 32-bit translation system -+ bic r6, r6, #3 << 0 @ use only ttbr0 - mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer - mcrne p15, 0, r1, c3, c0, 0 @ load domain access control -+ mcrne p15, 0, r6, c2, c0, 2 @ load ttb control - #endif - mcr p15, 0, r0, c7, c5, 4 @ ISB - mcr p15, 0, r0, c1, c0, 0 @ load control register -diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h -index 03fb936..5c8b3bf4 100644 ---- a/arch/arm/include/asm/assembler.h -+++ b/arch/arm/include/asm/assembler.h -@@ -320,4 +320,12 @@ - .size \name , . - \name - .endm - -+ .macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req -+#ifndef CONFIG_CPU_USE_DOMAINS -+ adds \tmp, \addr, #\size - 1 -+ sbcccs \tmp, \tmp, \limit -+ bcs \bad -+#endif -+ .endm -+ - #endif /* __ASM_ASSEMBLER_H__ */ -diff --git a/arch/arm/include/asm/mutex.h b/arch/arm/include/asm/mutex.h -index 93226cf..b1479fd 100644 ---- a/arch/arm/include/asm/mutex.h -+++ b/arch/arm/include/asm/mutex.h -@@ -7,121 +7,10 @@ - */ - #ifndef _ASM_MUTEX_H - #define _ASM_MUTEX_H -- --#if __LINUX_ARM_ARCH__ < 6 --/* On pre-ARMv6 hardware the swp based implementation is the most efficient. */ --# include <asm-generic/mutex-xchg.h> --#else -- - /* -- * Attempting to lock a mutex on ARMv6+ can be done with a bastardized -- * atomic decrement (it is not a reliable atomic decrement but it satisfies -- * the defined semantics for our purpose, while being smaller and faster -- * than a real atomic decrement or atomic swap. The idea is to attempt -- * decrementing the lock value only once. If once decremented it isn't zero, -- * or if its store-back fails due to a dispute on the exclusive store, we -- * simply bail out immediately through the slow path where the lock will be -- * reattempted until it succeeds. -+ * On pre-ARMv6 hardware this results in a swp-based implementation, -+ * which is the most efficient. For ARMv6+, we emit a pair of exclusive -+ * accesses instead. - */ --static inline void --__mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *)) --{ -- int __ex_flag, __res; -- -- __asm__ ( -- -- "ldrex %0, [%2] \n\t" -- "sub %0, %0, #1 \n\t" -- "strex %1, %0, [%2] " -- -- : "=&r" (__res), "=&r" (__ex_flag) -- : "r" (&(count)->counter) -- : "cc","memory" ); -- -- __res |= __ex_flag; -- if (unlikely(__res != 0)) -- fail_fn(count); --} -- --static inline int --__mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *)) --{ -- int __ex_flag, __res; -- -- __asm__ ( -- -- "ldrex %0, [%2] \n\t" -- "sub %0, %0, #1 \n\t" -- "strex %1, %0, [%2] " -- -- : "=&r" (__res), "=&r" (__ex_flag) -- : "r" (&(count)->counter) -- : "cc","memory" ); -- -- __res |= __ex_flag; -- if (unlikely(__res != 0)) -- __res = fail_fn(count); -- return __res; --} -- --/* -- * Same trick is used for the unlock fast path. However the original value, -- * rather than the result, is used to test for success in order to have -- * better generated assembly. -- */ --static inline void --__mutex_fastpath_unlock(atomic_t *count, void (*fail_fn)(atomic_t *)) --{ -- int __ex_flag, __res, __orig; -- -- __asm__ ( -- -- "ldrex %0, [%3] \n\t" -- "add %1, %0, #1 \n\t" -- "strex %2, %1, [%3] " -- -- : "=&r" (__orig), "=&r" (__res), "=&r" (__ex_flag) -- : "r" (&(count)->counter) -- : "cc","memory" ); -- -- __orig |= __ex_flag; -- if (unlikely(__orig != 0)) -- fail_fn(count); --} -- --/* -- * If the unlock was done on a contended lock, or if the unlock simply fails -- * then the mutex remains locked. -- */ --#define __mutex_slowpath_needs_to_unlock() 1 -- --/* -- * For __mutex_fastpath_trylock we use another construct which could be -- * described as a "single value cmpxchg". -- * -- * This provides the needed trylock semantics like cmpxchg would, but it is -- * lighter and less generic than a true cmpxchg implementation. -- */ --static inline int --__mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *)) --{ -- int __ex_flag, __res, __orig; -- -- __asm__ ( -- -- "1: ldrex %0, [%3] \n\t" -- "subs %1, %0, #1 \n\t" -- "strexeq %2, %1, [%3] \n\t" -- "movlt %0, #0 \n\t" -- "cmpeq %2, #0 \n\t" -- "bgt 1b " -- -- : "=&r" (__orig), "=&r" (__res), "=&r" (__ex_flag) -- : "r" (&count->counter) -- : "cc", "memory" ); -- -- return __orig; --} -- --#endif -+#include <asm-generic/mutex-xchg.h> - #endif -diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h -index 71f6536..0a070e9 100644 ---- a/arch/arm/include/asm/uaccess.h -+++ b/arch/arm/include/asm/uaccess.h -@@ -101,28 +101,39 @@ extern int __get_user_1(void *); - extern int __get_user_2(void *); - extern int __get_user_4(void *); - --#define __get_user_x(__r2,__p,__e,__s,__i...) \ -+#define __GUP_CLOBBER_1 "lr", "cc" -+#ifdef CONFIG_CPU_USE_DOMAINS -+#define __GUP_CLOBBER_2 "ip", "lr", "cc" -+#else -+#define __GUP_CLOBBER_2 "lr", "cc" -+#endif -+#define __GUP_CLOBBER_4 "lr", "cc" -+ -+#define __get_user_x(__r2,__p,__e,__l,__s) \ - __asm__ __volatile__ ( \ - __asmeq("%0", "r0") __asmeq("%1", "r2") \ -+ __asmeq("%3", "r1") \ - "bl __get_user_" #__s \ - : "=&r" (__e), "=r" (__r2) \ -- : "0" (__p) \ -- : __i, "cc") -+ : "0" (__p), "r" (__l) \ -+ : __GUP_CLOBBER_##__s) - - #define get_user(x,p) \ - ({ \ -+ unsigned long __limit = current_thread_info()->addr_limit - 1; \ - register const typeof(*(p)) __user *__p asm("r0") = (p);\ - register unsigned long __r2 asm("r2"); \ -+ register unsigned long __l asm("r1") = __limit; \ - register int __e asm("r0"); \ - switch (sizeof(*(__p))) { \ - case 1: \ -- __get_user_x(__r2, __p, __e, 1, "lr"); \ -- break; \ -+ __get_user_x(__r2, __p, __e, __l, 1); \ -+ break; \ - case 2: \ -- __get_user_x(__r2, __p, __e, 2, "r3", "lr"); \ -+ __get_user_x(__r2, __p, __e, __l, 2); \ - break; \ - case 4: \ -- __get_user_x(__r2, __p, __e, 4, "lr"); \ -+ __get_user_x(__r2, __p, __e, __l, 4); \ - break; \ - default: __e = __get_user_bad(); break; \ - } \ -@@ -135,31 +146,34 @@ extern int __put_user_2(void *, unsigned int); - extern int __put_user_4(void *, unsigned int); - extern int __put_user_8(void *, unsigned long long); - --#define __put_user_x(__r2,__p,__e,__s) \ -+#define __put_user_x(__r2,__p,__e,__l,__s) \ - __asm__ __volatile__ ( \ - __asmeq("%0", "r0") __asmeq("%2", "r2") \ -+ __asmeq("%3", "r1") \ - "bl __put_user_" #__s \ - : "=&r" (__e) \ -- : "0" (__p), "r" (__r2) \ -+ : "0" (__p), "r" (__r2), "r" (__l) \ - : "ip", "lr", "cc") - - #define put_user(x,p) \ - ({ \ -+ unsigned long __limit = current_thread_info()->addr_limit - 1; \ - register const typeof(*(p)) __r2 asm("r2") = (x); \ - register const typeof(*(p)) __user *__p asm("r0") = (p);\ -+ register unsigned long __l asm("r1") = __limit; \ - register int __e asm("r0"); \ - switch (sizeof(*(__p))) { \ - case 1: \ -- __put_user_x(__r2, __p, __e, 1); \ -+ __put_user_x(__r2, __p, __e, __l, 1); \ - break; \ - case 2: \ -- __put_user_x(__r2, __p, __e, 2); \ -+ __put_user_x(__r2, __p, __e, __l, 2); \ - break; \ - case 4: \ -- __put_user_x(__r2, __p, __e, 4); \ -+ __put_user_x(__r2, __p, __e, __l, 4); \ - break; \ - case 8: \ -- __put_user_x(__r2, __p, __e, 8); \ -+ __put_user_x(__r2, __p, __e, __l, 8); \ - break; \ - default: __e = __put_user_bad(); break; \ - } \ -diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c -index ba386bd..18d39ea 100644 ---- a/arch/arm/kernel/hw_breakpoint.c -+++ b/arch/arm/kernel/hw_breakpoint.c -@@ -159,6 +159,12 @@ static int debug_arch_supported(void) - arch >= ARM_DEBUG_ARCH_V7_1; - } - -+/* Can we determine the watchpoint access type from the fsr? */ -+static int debug_exception_updates_fsr(void) -+{ -+ return 0; -+} -+ - /* Determine number of WRP registers available. */ - static int get_num_wrp_resources(void) - { -@@ -619,18 +625,35 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) - info->address &= ~alignment_mask; - info->ctrl.len <<= offset; - -- /* -- * Currently we rely on an overflow handler to take -- * care of single-stepping the breakpoint when it fires. -- * In the case of userspace breakpoints on a core with V7 debug, -- * we can use the mismatch feature as a poor-man's hardware -- * single-step, but this only works for per-task breakpoints. -- */ -- if (!bp->overflow_handler && (arch_check_bp_in_kernelspace(bp) || -- !core_has_mismatch_brps() || !bp->hw.bp_target)) { -- pr_warning("overflow handler required but none found\n"); -- ret = -EINVAL; -+ if (!bp->overflow_handler) { -+ /* -+ * Mismatch breakpoints are required for single-stepping -+ * breakpoints. -+ */ -+ if (!core_has_mismatch_brps()) -+ return -EINVAL; -+ -+ /* We don't allow mismatch breakpoints in kernel space. */ -+ if (arch_check_bp_in_kernelspace(bp)) -+ return -EPERM; -+ -+ /* -+ * Per-cpu breakpoints are not supported by our stepping -+ * mechanism. -+ */ -+ if (!bp->hw.bp_target) -+ return -EINVAL; -+ -+ /* -+ * We only support specific access types if the fsr -+ * reports them. -+ */ -+ if (!debug_exception_updates_fsr() && -+ (info->ctrl.type == ARM_BREAKPOINT_LOAD || -+ info->ctrl.type == ARM_BREAKPOINT_STORE)) -+ return -EINVAL; - } -+ - out: - return ret; - } -@@ -706,10 +729,12 @@ static void watchpoint_handler(unsigned long addr, unsigned int fsr, - goto unlock; - - /* Check that the access type matches. */ -- access = (fsr & ARM_FSR_ACCESS_MASK) ? HW_BREAKPOINT_W : -- HW_BREAKPOINT_R; -- if (!(access & hw_breakpoint_type(wp))) -- goto unlock; -+ if (debug_exception_updates_fsr()) { -+ access = (fsr & ARM_FSR_ACCESS_MASK) ? -+ HW_BREAKPOINT_W : HW_BREAKPOINT_R; -+ if (!(access & hw_breakpoint_type(wp))) -+ goto unlock; -+ } - - /* We have a winner. */ - info->trigger = addr; -diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c -index c7cae6b..eeb7520 100644 ---- a/arch/arm/kernel/traps.c -+++ b/arch/arm/kernel/traps.c -@@ -388,20 +388,23 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) - #endif - instr = *(u32 *) pc; - } else if (thumb_mode(regs)) { -- get_user(instr, (u16 __user *)pc); -+ if (get_user(instr, (u16 __user *)pc)) -+ goto die_sig; - if (is_wide_instruction(instr)) { - unsigned int instr2; -- get_user(instr2, (u16 __user *)pc+1); -+ if (get_user(instr2, (u16 __user *)pc+1)) -+ goto die_sig; - instr <<= 16; - instr |= instr2; - } -- } else { -- get_user(instr, (u32 __user *)pc); -+ } else if (get_user(instr, (u32 __user *)pc)) { -+ goto die_sig; - } - - if (call_undef_hook(regs, instr) == 0) - return; - -+die_sig: - #ifdef CONFIG_DEBUG_USER - if (user_debug & UDBG_UNDEFINED) { - printk(KERN_INFO "%s (%d): undefined instruction: pc=%p\n", -diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S -index 11093a7..9b06bb4 100644 ---- a/arch/arm/lib/getuser.S -+++ b/arch/arm/lib/getuser.S -@@ -16,8 +16,9 @@ - * __get_user_X - * - * Inputs: r0 contains the address -+ * r1 contains the address limit, which must be preserved - * Outputs: r0 is the error code -- * r2, r3 contains the zero-extended value -+ * r2 contains the zero-extended value - * lr corrupted - * - * No other registers must be altered. (see <asm/uaccess.h> -@@ -27,33 +28,39 @@ - * Note also that it is intended that __get_user_bad is not global. - */ - #include <linux/linkage.h> -+#include <asm/assembler.h> - #include <asm/errno.h> - #include <asm/domain.h> - - ENTRY(__get_user_1) -+ check_uaccess r0, 1, r1, r2, __get_user_bad - 1: TUSER(ldrb) r2, [r0] - mov r0, #0 - mov pc, lr - ENDPROC(__get_user_1) - - ENTRY(__get_user_2) --#ifdef CONFIG_THUMB2_KERNEL --2: TUSER(ldrb) r2, [r0] --3: TUSER(ldrb) r3, [r0, #1] -+ check_uaccess r0, 2, r1, r2, __get_user_bad -+#ifdef CONFIG_CPU_USE_DOMAINS -+rb .req ip -+2: ldrbt r2, [r0], #1 -+3: ldrbt rb, [r0], #0 - #else --2: TUSER(ldrb) r2, [r0], #1 --3: TUSER(ldrb) r3, [r0] -+rb .req r0 -+2: ldrb r2, [r0] -+3: ldrb rb, [r0, #1] - #endif - #ifndef __ARMEB__ -- orr r2, r2, r3, lsl #8 -+ orr r2, r2, rb, lsl #8 - #else -- orr r2, r3, r2, lsl #8 -+ orr r2, rb, r2, lsl #8 - #endif - mov r0, #0 - mov pc, lr - ENDPROC(__get_user_2) - - ENTRY(__get_user_4) -+ check_uaccess r0, 4, r1, r2, __get_user_bad - 4: TUSER(ldr) r2, [r0] - mov r0, #0 - mov pc, lr -diff --git a/arch/arm/lib/putuser.S b/arch/arm/lib/putuser.S -index 7db2599..3d73dcb 100644 ---- a/arch/arm/lib/putuser.S -+++ b/arch/arm/lib/putuser.S -@@ -16,6 +16,7 @@ - * __put_user_X - * - * Inputs: r0 contains the address -+ * r1 contains the address limit, which must be preserved - * r2, r3 contains the value - * Outputs: r0 is the error code - * lr corrupted -@@ -27,16 +28,19 @@ - * Note also that it is intended that __put_user_bad is not global. - */ - #include <linux/linkage.h> -+#include <asm/assembler.h> - #include <asm/errno.h> - #include <asm/domain.h> - - ENTRY(__put_user_1) -+ check_uaccess r0, 1, r1, ip, __put_user_bad - 1: TUSER(strb) r2, [r0] - mov r0, #0 - mov pc, lr - ENDPROC(__put_user_1) - - ENTRY(__put_user_2) -+ check_uaccess r0, 2, r1, ip, __put_user_bad - mov ip, r2, lsr #8 - #ifdef CONFIG_THUMB2_KERNEL - #ifndef __ARMEB__ -@@ -60,12 +64,14 @@ ENTRY(__put_user_2) - ENDPROC(__put_user_2) - - ENTRY(__put_user_4) -+ check_uaccess r0, 4, r1, ip, __put_user_bad - 4: TUSER(str) r2, [r0] - mov r0, #0 - mov pc, lr - ENDPROC(__put_user_4) - - ENTRY(__put_user_8) -+ check_uaccess r0, 8, r1, ip, __put_user_bad - #ifdef CONFIG_THUMB2_KERNEL - 5: TUSER(str) r2, [r0] - 6: TUSER(str) r3, [r0, #4] -diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c -index fdd8cc8..4431a62 100644 ---- a/arch/arm/mach-imx/clk-imx25.c -+++ b/arch/arm/mach-imx/clk-imx25.c -@@ -222,10 +222,8 @@ int __init mx25_clocks_init(void) - clk_register_clkdev(clk[lcdc_ipg], "ipg", "imx-fb.0"); - clk_register_clkdev(clk[lcdc_ahb], "ahb", "imx-fb.0"); - clk_register_clkdev(clk[wdt_ipg], NULL, "imx2-wdt.0"); -- clk_register_clkdev(clk[ssi1_ipg_per], "per", "imx-ssi.0"); -- clk_register_clkdev(clk[ssi1_ipg], "ipg", "imx-ssi.0"); -- clk_register_clkdev(clk[ssi2_ipg_per], "per", "imx-ssi.1"); -- clk_register_clkdev(clk[ssi2_ipg], "ipg", "imx-ssi.1"); -+ clk_register_clkdev(clk[ssi1_ipg], NULL, "imx-ssi.0"); -+ clk_register_clkdev(clk[ssi2_ipg], NULL, "imx-ssi.1"); - clk_register_clkdev(clk[esdhc1_ipg_per], "per", "sdhci-esdhc-imx25.0"); - clk_register_clkdev(clk[esdhc1_ipg], "ipg", "sdhci-esdhc-imx25.0"); - clk_register_clkdev(clk[esdhc1_ahb], "ahb", "sdhci-esdhc-imx25.0"); -diff --git a/arch/arm/mach-imx/clk-imx35.c b/arch/arm/mach-imx/clk-imx35.c -index c6422fb..65fb8bc 100644 ---- a/arch/arm/mach-imx/clk-imx35.c -+++ b/arch/arm/mach-imx/clk-imx35.c -@@ -230,10 +230,8 @@ int __init mx35_clocks_init() - clk_register_clkdev(clk[ipu_gate], NULL, "mx3_sdc_fb"); - clk_register_clkdev(clk[owire_gate], NULL, "mxc_w1"); - clk_register_clkdev(clk[sdma_gate], NULL, "imx35-sdma"); -- clk_register_clkdev(clk[ipg], "ipg", "imx-ssi.0"); -- clk_register_clkdev(clk[ssi1_div_post], "per", "imx-ssi.0"); -- clk_register_clkdev(clk[ipg], "ipg", "imx-ssi.1"); -- clk_register_clkdev(clk[ssi2_div_post], "per", "imx-ssi.1"); -+ clk_register_clkdev(clk[ssi1_gate], NULL, "imx-ssi.0"); -+ clk_register_clkdev(clk[ssi2_gate], NULL, "imx-ssi.1"); - /* i.mx35 has the i.mx21 type uart */ - clk_register_clkdev(clk[uart1_gate], "per", "imx21-uart.0"); - clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.0"); -diff --git a/arch/arm/mach-imx/mach-armadillo5x0.c b/arch/arm/mach-imx/mach-armadillo5x0.c -index c650145..db1f244 100644 ---- a/arch/arm/mach-imx/mach-armadillo5x0.c -+++ b/arch/arm/mach-imx/mach-armadillo5x0.c -@@ -526,7 +526,8 @@ static void __init armadillo5x0_init(void) - imx31_add_mxc_nand(&armadillo5x0_nand_board_info); - - /* set NAND page size to 2k if not configured via boot mode pins */ -- __raw_writel(__raw_readl(MXC_CCM_RCSR) | (1 << 30), MXC_CCM_RCSR); -+ __raw_writel(__raw_readl(mx3_ccm_base + MXC_CCM_RCSR) | -+ (1 << 30), mx3_ccm_base + MXC_CCM_RCSR); - - /* RTC */ - /* Get RTC IRQ and register the chip */ -diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c -index 840929b..2cdbcc7 100644 ---- a/arch/arm/mach-omap2/timer.c -+++ b/arch/arm/mach-omap2/timer.c -@@ -263,6 +263,7 @@ static u32 notrace dmtimer_read_sched_clock(void) - return 0; - } - -+#ifdef CONFIG_OMAP_32K_TIMER - /* Setup free-running counter for clocksource */ - static int __init omap2_sync32k_clocksource_init(void) - { -@@ -302,6 +303,12 @@ static int __init omap2_sync32k_clocksource_init(void) - - return ret; - } -+#else -+static inline int omap2_sync32k_clocksource_init(void) -+{ -+ return -ENODEV; -+} -+#endif - - static void __init omap2_gptimer_clocksource_init(int gptimer_id, - const char *fck_source) -diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h -index 2e8a1ef..87fa3f2 100644 ---- a/arch/arm/mm/mm.h -+++ b/arch/arm/mm/mm.h -@@ -55,6 +55,9 @@ extern void __flush_dcache_page(struct address_space *mapping, struct page *page - /* permanent static mappings from iotable_init() */ - #define VM_ARM_STATIC_MAPPING 0x40000000 - -+/* empty mapping */ -+#define VM_ARM_EMPTY_MAPPING 0x20000000 -+ - /* mapping type (attributes) for permanent static mappings */ - #define VM_ARM_MTYPE(mt) ((mt) << 20) - #define VM_ARM_MTYPE_MASK (0x1f << 20) -diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c -index cf4528d..15c6abe 100644 ---- a/arch/arm/mm/mmu.c -+++ b/arch/arm/mm/mmu.c -@@ -813,7 +813,7 @@ static void __init pmd_empty_section_gap(unsigned long addr) - vm = early_alloc_aligned(sizeof(*vm), __alignof__(*vm)); - vm->addr = (void *)addr; - vm->size = SECTION_SIZE; -- vm->flags = VM_IOREMAP | VM_ARM_STATIC_MAPPING; -+ vm->flags = VM_IOREMAP | VM_ARM_EMPTY_MAPPING; - vm->caller = pmd_empty_section_gap; - vm_area_add_early(vm); - } -@@ -826,7 +826,7 @@ static void __init fill_pmd_gaps(void) - - /* we're still single threaded hence no lock needed here */ - for (vm = vmlist; vm; vm = vm->next) { -- if (!(vm->flags & VM_ARM_STATIC_MAPPING)) -+ if (!(vm->flags & (VM_ARM_STATIC_MAPPING | VM_ARM_EMPTY_MAPPING))) - continue; - addr = (unsigned long)vm->addr; - if (addr < next) -diff --git a/arch/mips/mm/gup.c b/arch/mips/mm/gup.c -index 33aadbc..dcfd573 100644 ---- a/arch/mips/mm/gup.c -+++ b/arch/mips/mm/gup.c -@@ -152,6 +152,8 @@ static int gup_huge_pud(pud_t pud, unsigned long addr, unsigned long end, - do { - VM_BUG_ON(compound_head(page) != head); - pages[*nr] = page; -+ if (PageTail(page)) -+ get_huge_page_tail(page); - (*nr)++; - page++; - refs++; -diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c -index 978330c..f80887f 100644 ---- a/arch/powerpc/platforms/85xx/p1022_ds.c -+++ b/arch/powerpc/platforms/85xx/p1022_ds.c -@@ -208,6 +208,7 @@ static void p1022ds_set_monitor_port(enum fsl_diu_monitor_port port) - u8 __iomem *lbc_lcs0_ba = NULL; - u8 __iomem *lbc_lcs1_ba = NULL; - phys_addr_t cs0_addr, cs1_addr; -+ u32 br0, or0, br1, or1; - const __be32 *iprop; - unsigned int num_laws; - u8 b; -@@ -256,11 +257,70 @@ static void p1022ds_set_monitor_port(enum fsl_diu_monitor_port port) - } - num_laws = be32_to_cpup(iprop); - -- cs0_addr = lbc_br_to_phys(ecm, num_laws, in_be32(&lbc->bank[0].br)); -- cs1_addr = lbc_br_to_phys(ecm, num_laws, in_be32(&lbc->bank[1].br)); -+ /* -+ * Indirect mode requires both BR0 and BR1 to be set to "GPCM", -+ * otherwise writes to these addresses won't actually appear on the -+ * local bus, and so the PIXIS won't see them. -+ * -+ * In FCM mode, writes go to the NAND controller, which does not pass -+ * them to the localbus directly. So we force BR0 and BR1 into GPCM -+ * mode, since we don't care about what's behind the localbus any -+ * more. -+ */ -+ br0 = in_be32(&lbc->bank[0].br); -+ br1 = in_be32(&lbc->bank[1].br); -+ or0 = in_be32(&lbc->bank[0].or); -+ or1 = in_be32(&lbc->bank[1].or); -+ -+ /* Make sure CS0 and CS1 are programmed */ -+ if (!(br0 & BR_V) || !(br1 & BR_V)) { -+ pr_err("p1022ds: CS0 and/or CS1 is not programmed\n"); -+ goto exit; -+ } -+ -+ /* -+ * Use the existing BRx/ORx values if it's already GPCM. Otherwise, -+ * force the values to simple 32KB GPCM windows with the most -+ * conservative timing. -+ */ -+ if ((br0 & BR_MSEL) != BR_MS_GPCM) { -+ br0 = (br0 & BR_BA) | BR_V; -+ or0 = 0xFFFF8000 | 0xFF7; -+ out_be32(&lbc->bank[0].br, br0); -+ out_be32(&lbc->bank[0].or, or0); -+ } -+ if ((br1 & BR_MSEL) != BR_MS_GPCM) { -+ br1 = (br1 & BR_BA) | BR_V; -+ or1 = 0xFFFF8000 | 0xFF7; -+ out_be32(&lbc->bank[1].br, br1); -+ out_be32(&lbc->bank[1].or, or1); -+ } -+ -+ cs0_addr = lbc_br_to_phys(ecm, num_laws, br0); -+ if (!cs0_addr) { -+ pr_err("p1022ds: could not determine physical address for CS0" -+ " (BR0=%08x)\n", br0); -+ goto exit; -+ } -+ cs1_addr = lbc_br_to_phys(ecm, num_laws, br1); -+ if (!cs0_addr) { -+ pr_err("p1022ds: could not determine physical address for CS1" -+ " (BR1=%08x)\n", br1); -+ goto exit; -+ } - - lbc_lcs0_ba = ioremap(cs0_addr, 1); -+ if (!lbc_lcs0_ba) { -+ pr_err("p1022ds: could not ioremap CS0 address %llx\n", -+ (unsigned long long)cs0_addr); -+ goto exit; -+ } - lbc_lcs1_ba = ioremap(cs1_addr, 1); -+ if (!lbc_lcs1_ba) { -+ pr_err("p1022ds: could not ioremap CS1 address %llx\n", -+ (unsigned long long)cs1_addr); -+ goto exit; -+ } - - /* Make sure we're in indirect mode first. */ - if ((in_be32(&guts->pmuxcr) & PMUXCR_ELBCDIU_MASK) != -@@ -435,6 +495,8 @@ static void __init disable_one_node(struct device_node *np, struct property *new - prom_update_property(np, new, old); - else - prom_add_property(np, new); -+ -+ pr_info("p1022ds: disabling %s node\n", np->full_name); - } - - /* TRUE if there is a "video=fslfb" command-line parameter. */ -@@ -499,28 +561,46 @@ static void __init p1022_ds_setup_arch(void) - diu_ops.valid_monitor_port = p1022ds_valid_monitor_port; - - /* -- * Disable the NOR flash node if there is video=fslfb... command-line -- * parameter. When the DIU is active, NOR flash is unavailable, so we -- * have to disable the node before the MTD driver loads. -+ * Disable the NOR and NAND flash nodes if there is video=fslfb... -+ * command-line parameter. When the DIU is active, the localbus is -+ * unavailable, so we have to disable these nodes before the MTD -+ * driver loads. - */ - if (fslfb) { - struct device_node *np = - of_find_compatible_node(NULL, NULL, "fsl,p1022-elbc"); - - if (np) { -- np = of_find_compatible_node(np, NULL, "cfi-flash"); -- if (np) { -+ struct device_node *np2; -+ -+ of_node_get(np); -+ np2 = of_find_compatible_node(np, NULL, "cfi-flash"); -+ if (np2) { - static struct property nor_status = { - .name = "status", - .value = "disabled", - .length = sizeof("disabled"), - }; - -- pr_info("p1022ds: disabling %s node", -- np->full_name); -- disable_one_node(np, &nor_status); -- of_node_put(np); -+ disable_one_node(np2, &nor_status); -+ of_node_put(np2); -+ } -+ -+ of_node_get(np); -+ np2 = of_find_compatible_node(np, NULL, -+ "fsl,elbc-fcm-nand"); -+ if (np2) { -+ static struct property nand_status = { -+ .name = "status", -+ .value = "disabled", -+ .length = sizeof("disabled"), -+ }; -+ -+ disable_one_node(np2, &nand_status); -+ of_node_put(np2); - } -+ -+ of_node_put(np); - } - - } -diff --git a/arch/s390/oprofile/init.c b/arch/s390/oprofile/init.c -index 2297be4..abe8722 100644 ---- a/arch/s390/oprofile/init.c -+++ b/arch/s390/oprofile/init.c -@@ -171,7 +171,7 @@ static ssize_t hw_interval_write(struct file *file, char const __user *buf, - if (*offset) - return -EINVAL; - retval = oprofilefs_ulong_from_user(&val, buf, count); -- if (retval) -+ if (retval <= 0) - return retval; - if (val < oprofile_min_interval) - oprofile_hw_interval = oprofile_min_interval; -@@ -214,7 +214,7 @@ static ssize_t hwsampler_zero_write(struct file *file, char const __user *buf, - return -EINVAL; - - retval = oprofilefs_ulong_from_user(&val, buf, count); -- if (retval) -+ if (retval <= 0) - return retval; - if (val != 0) - return -EINVAL; -@@ -245,7 +245,7 @@ static ssize_t hwsampler_kernel_write(struct file *file, char const __user *buf, - return -EINVAL; - - retval = oprofilefs_ulong_from_user(&val, buf, count); -- if (retval) -+ if (retval <= 0) - return retval; - - if (val != 0 && val != 1) -@@ -280,7 +280,7 @@ static ssize_t hwsampler_user_write(struct file *file, char const __user *buf, - return -EINVAL; - - retval = oprofilefs_ulong_from_user(&val, buf, count); -- if (retval) -+ if (retval <= 0) - return retval; - - if (val != 0 && val != 1) -@@ -319,7 +319,7 @@ static ssize_t timer_enabled_write(struct file *file, char const __user *buf, - return -EINVAL; - - retval = oprofilefs_ulong_from_user(&val, buf, count); -- if (retval) -+ if (retval <= 0) - return retval; - - if (val != 0 && val != 1) -diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h -index 93971e8..472b9b7 100644 ---- a/arch/x86/include/asm/xen/page.h -+++ b/arch/x86/include/asm/xen/page.h -@@ -51,7 +51,8 @@ extern unsigned long set_phys_range_identity(unsigned long pfn_s, - - extern int m2p_add_override(unsigned long mfn, struct page *page, - struct gnttab_map_grant_ref *kmap_op); --extern int m2p_remove_override(struct page *page, bool clear_pte); -+extern int m2p_remove_override(struct page *page, -+ struct gnttab_map_grant_ref *kmap_op); - extern struct page *m2p_find_override(unsigned long mfn); - extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn); - -diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c -index 6b9333b..cc9c146 100644 ---- a/arch/x86/kernel/cpu/common.c -+++ b/arch/x86/kernel/cpu/common.c -@@ -144,6 +144,8 @@ static int __init x86_xsave_setup(char *s) - { - setup_clear_cpu_cap(X86_FEATURE_XSAVE); - setup_clear_cpu_cap(X86_FEATURE_XSAVEOPT); -+ setup_clear_cpu_cap(X86_FEATURE_AVX); -+ setup_clear_cpu_cap(X86_FEATURE_AVX2); - return 1; - } - __setup("noxsave", x86_xsave_setup); -diff --git a/arch/x86/kernel/cpu/perf_event_amd_ibs.c b/arch/x86/kernel/cpu/perf_event_amd_ibs.c -index da9bcdc..4018f6e 100644 ---- a/arch/x86/kernel/cpu/perf_event_amd_ibs.c -+++ b/arch/x86/kernel/cpu/perf_event_amd_ibs.c -@@ -207,6 +207,15 @@ static int perf_ibs_precise_event(struct perf_event *event, u64 *config) - return -EOPNOTSUPP; - } - -+static const struct perf_event_attr ibs_notsupp = { -+ .exclude_user = 1, -+ .exclude_kernel = 1, -+ .exclude_hv = 1, -+ .exclude_idle = 1, -+ .exclude_host = 1, -+ .exclude_guest = 1, -+}; -+ - static int perf_ibs_init(struct perf_event *event) - { - struct hw_perf_event *hwc = &event->hw; -@@ -227,6 +236,9 @@ static int perf_ibs_init(struct perf_event *event) - if (event->pmu != &perf_ibs->pmu) - return -ENOENT; - -+ if (perf_flags(&event->attr) & perf_flags(&ibs_notsupp)) -+ return -EINVAL; -+ - if (config & ~perf_ibs->config_mask) - return -EINVAL; - -diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c -index ff962d4..405307f 100644 ---- a/arch/x86/xen/enlighten.c -+++ b/arch/x86/xen/enlighten.c -@@ -1422,6 +1422,10 @@ asmlinkage void __init xen_start_kernel(void) - pci_request_acs(); - - xen_acpi_sleep_register(); -+ -+ /* Avoid searching for BIOS MP tables */ -+ x86_init.mpparse.find_smp_config = x86_init_noop; -+ x86_init.mpparse.get_smp_config = x86_init_uint_noop; - } - #ifdef CONFIG_PCI - /* PCI BIOS service won't work from a PV guest. */ -diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c -index 76ba0e9..72213da 100644 ---- a/arch/x86/xen/p2m.c -+++ b/arch/x86/xen/p2m.c -@@ -828,9 +828,6 @@ int m2p_add_override(unsigned long mfn, struct page *page, - - xen_mc_issue(PARAVIRT_LAZY_MMU); - } -- /* let's use dev_bus_addr to record the old mfn instead */ -- kmap_op->dev_bus_addr = page->index; -- page->index = (unsigned long) kmap_op; - } - spin_lock_irqsave(&m2p_override_lock, flags); - list_add(&page->lru, &m2p_overrides[mfn_hash(mfn)]); -@@ -857,7 +854,8 @@ int m2p_add_override(unsigned long mfn, struct page *page, - return 0; - } - EXPORT_SYMBOL_GPL(m2p_add_override); --int m2p_remove_override(struct page *page, bool clear_pte) -+int m2p_remove_override(struct page *page, -+ struct gnttab_map_grant_ref *kmap_op) - { - unsigned long flags; - unsigned long mfn; -@@ -887,10 +885,8 @@ int m2p_remove_override(struct page *page, bool clear_pte) - WARN_ON(!PagePrivate(page)); - ClearPagePrivate(page); - -- if (clear_pte) { -- struct gnttab_map_grant_ref *map_op = -- (struct gnttab_map_grant_ref *) page->index; -- set_phys_to_machine(pfn, map_op->dev_bus_addr); -+ set_phys_to_machine(pfn, page->index); -+ if (kmap_op != NULL) { - if (!PageHighMem(page)) { - struct multicall_space mcs; - struct gnttab_unmap_grant_ref *unmap_op; -@@ -902,13 +898,13 @@ int m2p_remove_override(struct page *page, bool clear_pte) - * issued. In this case handle is going to -1 because - * it hasn't been modified yet. - */ -- if (map_op->handle == -1) -+ if (kmap_op->handle == -1) - xen_mc_flush(); - /* -- * Now if map_op->handle is negative it means that the -+ * Now if kmap_op->handle is negative it means that the - * hypercall actually returned an error. - */ -- if (map_op->handle == GNTST_general_error) { -+ if (kmap_op->handle == GNTST_general_error) { - printk(KERN_WARNING "m2p_remove_override: " - "pfn %lx mfn %lx, failed to modify kernel mappings", - pfn, mfn); -@@ -918,8 +914,8 @@ int m2p_remove_override(struct page *page, bool clear_pte) - mcs = xen_mc_entry( - sizeof(struct gnttab_unmap_grant_ref)); - unmap_op = mcs.args; -- unmap_op->host_addr = map_op->host_addr; -- unmap_op->handle = map_op->handle; -+ unmap_op->host_addr = kmap_op->host_addr; -+ unmap_op->handle = kmap_op->handle; - unmap_op->dev_bus_addr = 0; - - MULTI_grant_table_op(mcs.mc, -@@ -930,10 +926,9 @@ int m2p_remove_override(struct page *page, bool clear_pte) - set_pte_at(&init_mm, address, ptep, - pfn_pte(pfn, PAGE_KERNEL)); - __flush_tlb_single(address); -- map_op->host_addr = 0; -+ kmap_op->host_addr = 0; - } -- } else -- set_phys_to_machine(pfn, page->index); -+ } - - /* p2m(m2p(mfn)) == FOREIGN_FRAME(mfn): the mfn is already present - * somewhere in this domain, even before being added to the -diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c -index f2583ed..c207fdb 100644 ---- a/arch/x86/xen/setup.c -+++ b/arch/x86/xen/setup.c -@@ -17,6 +17,7 @@ - #include <asm/e820.h> - #include <asm/setup.h> - #include <asm/acpi.h> -+#include <asm/numa.h> - #include <asm/xen/hypervisor.h> - #include <asm/xen/hypercall.h> - -@@ -549,4 +550,7 @@ void __init xen_arch_setup(void) - disable_cpufreq(); - WARN_ON(set_pm_idle_to_default()); - fiddle_vdso(); -+#ifdef CONFIG_NUMA -+ numa_off = 1; -+#endif - } -diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c -index adceafd..92107ee 100644 ---- a/drivers/acpi/bus.c -+++ b/drivers/acpi/bus.c -@@ -237,6 +237,16 @@ static int __acpi_bus_get_power(struct acpi_device *device, int *state) - } else if (result == ACPI_STATE_D3_HOT) { - result = ACPI_STATE_D3; - } -+ -+ /* -+ * If we were unsure about the device parent's power state up to this -+ * point, the fact that the device is in D0 implies that the parent has -+ * to be in D0 too. -+ */ -+ if (device->parent && device->parent->power.state == ACPI_STATE_UNKNOWN -+ && result == ACPI_STATE_D0) -+ device->parent->power.state = ACPI_STATE_D0; -+ - *state = result; - - out: -diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c -index dd6d6a3..fe71911 100644 ---- a/drivers/acpi/power.c -+++ b/drivers/acpi/power.c -@@ -103,6 +103,7 @@ struct acpi_power_resource { - - /* List of devices relying on this power resource */ - struct acpi_power_resource_device *devices; -+ struct mutex devices_lock; - }; - - static struct list_head acpi_power_resource_list; -@@ -221,7 +222,6 @@ static void acpi_power_on_device(struct acpi_power_managed_device *device) - - static int __acpi_power_on(struct acpi_power_resource *resource) - { -- struct acpi_power_resource_device *device_list = resource->devices; - acpi_status status = AE_OK; - - status = acpi_evaluate_object(resource->device->handle, "_ON", NULL, NULL); -@@ -234,19 +234,15 @@ static int __acpi_power_on(struct acpi_power_resource *resource) - ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned on\n", - resource->name)); - -- while (device_list) { -- acpi_power_on_device(device_list->device); -- -- device_list = device_list->next; -- } -- - return 0; - } - - static int acpi_power_on(acpi_handle handle) - { - int result = 0; -+ bool resume_device = false; - struct acpi_power_resource *resource = NULL; -+ struct acpi_power_resource_device *device_list; - - result = acpi_power_get_context(handle, &resource); - if (result) -@@ -262,10 +258,25 @@ static int acpi_power_on(acpi_handle handle) - result = __acpi_power_on(resource); - if (result) - resource->ref_count--; -+ else -+ resume_device = true; - } - - mutex_unlock(&resource->resource_lock); - -+ if (!resume_device) -+ return result; -+ -+ mutex_lock(&resource->devices_lock); -+ -+ device_list = resource->devices; -+ while (device_list) { -+ acpi_power_on_device(device_list->device); -+ device_list = device_list->next; -+ } -+ -+ mutex_unlock(&resource->devices_lock); -+ - return result; - } - -@@ -351,7 +362,7 @@ static void __acpi_power_resource_unregister_device(struct device *dev, - if (acpi_power_get_context(res_handle, &resource)) - return; - -- mutex_lock(&resource->resource_lock); -+ mutex_lock(&resource->devices_lock); - prev = NULL; - curr = resource->devices; - while (curr) { -@@ -368,7 +379,7 @@ static void __acpi_power_resource_unregister_device(struct device *dev, - prev = curr; - curr = curr->next; - } -- mutex_unlock(&resource->resource_lock); -+ mutex_unlock(&resource->devices_lock); - } - - /* Unlink dev from all power resources in _PR0 */ -@@ -409,10 +420,10 @@ static int __acpi_power_resource_register_device( - - power_resource_device->device = powered_device; - -- mutex_lock(&resource->resource_lock); -+ mutex_lock(&resource->devices_lock); - power_resource_device->next = resource->devices; - resource->devices = power_resource_device; -- mutex_unlock(&resource->resource_lock); -+ mutex_unlock(&resource->devices_lock); - - return 0; - } -@@ -457,7 +468,7 @@ int acpi_power_resource_register_device(struct device *dev, acpi_handle handle) - return ret; - - no_power_resource: -- printk(KERN_WARNING PREFIX "Invalid Power Resource to register!"); -+ printk(KERN_DEBUG PREFIX "Invalid Power Resource to register!"); - return -ENODEV; - } - -@@ -715,6 +726,7 @@ static int acpi_power_add(struct acpi_device *device) - - resource->device = device; - mutex_init(&resource->resource_lock); -+ mutex_init(&resource->devices_lock); - strcpy(resource->name, device->pnp.bus_id); - strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); - strcpy(acpi_device_class(device), ACPI_POWER_CLASS); -diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c -index ebaf67e..93cbc44 100644 ---- a/drivers/ata/ahci.c -+++ b/drivers/ata/ahci.c -@@ -396,6 +396,8 @@ static const struct pci_device_id ahci_pci_tbl[] = { - .driver_data = board_ahci_yes_fbs }, /* 88se9125 */ - { PCI_DEVICE(0x1b4b, 0x917a), - .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ -+ { PCI_DEVICE(0x1b4b, 0x9192), -+ .driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */ - { PCI_DEVICE(0x1b4b, 0x91a3), - .driver_data = board_ahci_yes_fbs }, - -diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c -index cece3a4..71e8385 100644 ---- a/drivers/ata/libata-core.c -+++ b/drivers/ata/libata-core.c -@@ -4126,6 +4126,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { - - /* Devices which aren't very happy with higher link speeds */ - { "WD My Book", NULL, ATA_HORKAGE_1_5_GBPS, }, -+ { "Seagate FreeAgent GoFlex", NULL, ATA_HORKAGE_1_5_GBPS, }, - - /* - * Devices which choke on SETXFER. Applies only if both the -diff --git a/drivers/base/core.c b/drivers/base/core.c -index b18138a..c598122 100644 ---- a/drivers/base/core.c -+++ b/drivers/base/core.c -@@ -1895,8 +1895,8 @@ int __dev_printk(const char *level, const struct device *dev, - "DEVICE=+%s:%s", subsys, dev_name(dev)); - } - skip: -- if (level[3]) -- level_extra = &level[3]; /* skip past "<L>" */ -+ if (level[2]) -+ level_extra = &level[2]; /* skip past KERN_SOH "L" */ - - return printk_emit(0, level[1] - '0', - dictlen ? dict : NULL, dictlen, -diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c -index 5989487..7d9c1cb 100644 ---- a/drivers/base/power/runtime.c -+++ b/drivers/base/power/runtime.c -@@ -147,6 +147,8 @@ static int rpm_check_suspend_allowed(struct device *dev) - || (dev->power.request_pending - && dev->power.request == RPM_REQ_RESUME)) - retval = -EAGAIN; -+ else if (__dev_pm_qos_read_value(dev) < 0) -+ retval = -EPERM; - else if (dev->power.runtime_status == RPM_SUSPENDED) - retval = 1; - -@@ -388,7 +390,6 @@ static int rpm_suspend(struct device *dev, int rpmflags) - goto repeat; - } - -- dev->power.deferred_resume = false; - if (dev->power.no_callbacks) - goto no_callback; /* Assume success. */ - -@@ -403,12 +404,6 @@ static int rpm_suspend(struct device *dev, int rpmflags) - goto out; - } - -- if (__dev_pm_qos_read_value(dev) < 0) { -- /* Negative PM QoS constraint means "never suspend". */ -- retval = -EPERM; -- goto out; -- } -- - __update_runtime_status(dev, RPM_SUSPENDING); - - if (dev->pm_domain) -@@ -440,6 +435,7 @@ static int rpm_suspend(struct device *dev, int rpmflags) - wake_up_all(&dev->power.wait_queue); - - if (dev->power.deferred_resume) { -+ dev->power.deferred_resume = false; - rpm_resume(dev, 0); - retval = -EAGAIN; - goto out; -@@ -584,6 +580,7 @@ static int rpm_resume(struct device *dev, int rpmflags) - || dev->parent->power.runtime_status == RPM_ACTIVE) { - atomic_inc(&dev->parent->power.child_count); - spin_unlock(&dev->parent->power.lock); -+ retval = 1; - goto no_callback; /* Assume success. */ - } - spin_unlock(&dev->parent->power.lock); -@@ -664,7 +661,7 @@ static int rpm_resume(struct device *dev, int rpmflags) - } - wake_up_all(&dev->power.wait_queue); - -- if (!retval) -+ if (retval >= 0) - rpm_idle(dev, RPM_ASYNC); - - out: -diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c -index 38aa6dd..da33111 100644 ---- a/drivers/block/cciss_scsi.c -+++ b/drivers/block/cciss_scsi.c -@@ -795,6 +795,7 @@ static void complete_scsi_command(CommandList_struct *c, int timeout, - } - break; - case CMD_PROTOCOL_ERR: -+ cmd->result = DID_ERROR << 16; - dev_warn(&h->pdev->dev, - "%p has protocol error\n", c); - break; -diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c -index 061427a..3c4c225 100644 ---- a/drivers/block/nbd.c -+++ b/drivers/block/nbd.c -@@ -445,6 +445,14 @@ static void nbd_clear_que(struct nbd_device *nbd) - req->errors++; - nbd_end_request(req); - } -+ -+ while (!list_empty(&nbd->waiting_queue)) { -+ req = list_entry(nbd->waiting_queue.next, struct request, -+ queuelist); -+ list_del_init(&req->queuelist); -+ req->errors++; -+ nbd_end_request(req); -+ } - } - - -@@ -594,6 +602,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, - nbd->file = NULL; - nbd_clear_que(nbd); - BUG_ON(!list_empty(&nbd->queue_head)); -+ BUG_ON(!list_empty(&nbd->waiting_queue)); - if (file) - fput(file); - return 0; -diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c -index 73f196c..c6decb9 100644 ---- a/drivers/block/xen-blkback/blkback.c -+++ b/drivers/block/xen-blkback/blkback.c -@@ -337,7 +337,7 @@ static void xen_blkbk_unmap(struct pending_req *req) - invcount++; - } - -- ret = gnttab_unmap_refs(unmap, pages, invcount, false); -+ ret = gnttab_unmap_refs(unmap, NULL, pages, invcount); - BUG_ON(ret); - } - -diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c -index 10308cd..fc2de55 100644 ---- a/drivers/bluetooth/ath3k.c -+++ b/drivers/bluetooth/ath3k.c -@@ -79,12 +79,14 @@ static struct usb_device_id ath3k_table[] = { - { USB_DEVICE(0x13d3, 0x3362) }, - { USB_DEVICE(0x0CF3, 0xE004) }, - { USB_DEVICE(0x0930, 0x0219) }, -+ { USB_DEVICE(0x0489, 0xe057) }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE02C) }, - - /* Atheros AR5BBU22 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE03C) }, -+ { USB_DEVICE(0x0489, 0xE036) }, - - { } /* Terminating entry */ - }; -@@ -104,9 +106,11 @@ static struct usb_device_id ath3k_blist_tbl[] = { - { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 }, - - /* Atheros AR5BBU22 with sflash firmware */ - { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 }, - - { } /* Terminating entry */ - }; -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index 83ebb24..b5f008c 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -60,6 +60,9 @@ static struct usb_device_id btusb_table[] = { - /* Generic Bluetooth USB device */ - { USB_DEVICE_INFO(0xe0, 0x01, 0x01) }, - -+ /* Apple-specific (Broadcom) devices */ -+ { USB_VENDOR_AND_INTERFACE_INFO(0x05ac, 0xff, 0x01, 0x01) }, -+ - /* Broadcom SoftSailing reporting vendor specific */ - { USB_DEVICE(0x0a5c, 0x21e1) }, - -@@ -102,15 +105,14 @@ static struct usb_device_id btusb_table[] = { - - /* Broadcom BCM20702A0 */ - { USB_DEVICE(0x0489, 0xe042) }, -- { USB_DEVICE(0x0a5c, 0x21e3) }, -- { USB_DEVICE(0x0a5c, 0x21e6) }, -- { USB_DEVICE(0x0a5c, 0x21e8) }, -- { USB_DEVICE(0x0a5c, 0x21f3) }, - { USB_DEVICE(0x413c, 0x8197) }, - - /* Foxconn - Hon Hai */ - { USB_DEVICE(0x0489, 0xe033) }, - -+ /*Broadcom devices with vendor specific id */ -+ { USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01) }, -+ - { } /* Terminating entry */ - }; - -@@ -141,12 +143,14 @@ static struct usb_device_id blacklist_table[] = { - { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 }, - { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, - - /* Atheros AR5BBU12 with sflash firmware */ - { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 }, -+ { USB_DEVICE(0x0489, 0xe036), .driver_info = BTUSB_ATH3012 }, - - /* Broadcom BCM2035 */ - { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, -diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c -index c0e8164..1a40935 100644 ---- a/drivers/cpufreq/powernow-k8.c -+++ b/drivers/cpufreq/powernow-k8.c -@@ -35,7 +35,6 @@ - #include <linux/slab.h> - #include <linux/string.h> - #include <linux/cpumask.h> --#include <linux/sched.h> /* for current / set_cpus_allowed() */ - #include <linux/io.h> - #include <linux/delay.h> - -@@ -1139,16 +1138,23 @@ static int transition_frequency_pstate(struct powernow_k8_data *data, - return res; - } - --/* Driver entry point to switch to the target frequency */ --static int powernowk8_target(struct cpufreq_policy *pol, -- unsigned targfreq, unsigned relation) -+struct powernowk8_target_arg { -+ struct cpufreq_policy *pol; -+ unsigned targfreq; -+ unsigned relation; -+}; -+ -+static long powernowk8_target_fn(void *arg) - { -- cpumask_var_t oldmask; -+ struct powernowk8_target_arg *pta = arg; -+ struct cpufreq_policy *pol = pta->pol; -+ unsigned targfreq = pta->targfreq; -+ unsigned relation = pta->relation; - struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); - u32 checkfid; - u32 checkvid; - unsigned int newstate; -- int ret = -EIO; -+ int ret; - - if (!data) - return -EINVAL; -@@ -1156,29 +1162,16 @@ static int powernowk8_target(struct cpufreq_policy *pol, - checkfid = data->currfid; - checkvid = data->currvid; - -- /* only run on specific CPU from here on. */ -- /* This is poor form: use a workqueue or smp_call_function_single */ -- if (!alloc_cpumask_var(&oldmask, GFP_KERNEL)) -- return -ENOMEM; -- -- cpumask_copy(oldmask, tsk_cpus_allowed(current)); -- set_cpus_allowed_ptr(current, cpumask_of(pol->cpu)); -- -- if (smp_processor_id() != pol->cpu) { -- printk(KERN_ERR PFX "limiting to cpu %u failed\n", pol->cpu); -- goto err_out; -- } -- - if (pending_bit_stuck()) { - printk(KERN_ERR PFX "failing targ, change pending bit set\n"); -- goto err_out; -+ return -EIO; - } - - pr_debug("targ: cpu %d, %d kHz, min %d, max %d, relation %d\n", - pol->cpu, targfreq, pol->min, pol->max, relation); - - if (query_current_values_with_pending_wait(data)) -- goto err_out; -+ return -EIO; - - if (cpu_family != CPU_HW_PSTATE) { - pr_debug("targ: curr fid 0x%x, vid 0x%x\n", -@@ -1196,7 +1189,7 @@ static int powernowk8_target(struct cpufreq_policy *pol, - - if (cpufreq_frequency_table_target(pol, data->powernow_table, - targfreq, relation, &newstate)) -- goto err_out; -+ return -EIO; - - mutex_lock(&fidvid_mutex); - -@@ -1209,9 +1202,8 @@ static int powernowk8_target(struct cpufreq_policy *pol, - ret = transition_frequency_fidvid(data, newstate); - if (ret) { - printk(KERN_ERR PFX "transition frequency failed\n"); -- ret = 1; - mutex_unlock(&fidvid_mutex); -- goto err_out; -+ return 1; - } - mutex_unlock(&fidvid_mutex); - -@@ -1220,12 +1212,25 @@ static int powernowk8_target(struct cpufreq_policy *pol, - data->powernow_table[newstate].index); - else - pol->cur = find_khz_freq_from_fid(data->currfid); -- ret = 0; - --err_out: -- set_cpus_allowed_ptr(current, oldmask); -- free_cpumask_var(oldmask); -- return ret; -+ return 0; -+} -+ -+/* Driver entry point to switch to the target frequency */ -+static int powernowk8_target(struct cpufreq_policy *pol, -+ unsigned targfreq, unsigned relation) -+{ -+ struct powernowk8_target_arg pta = { .pol = pol, .targfreq = targfreq, -+ .relation = relation }; -+ -+ /* -+ * Must run on @pol->cpu. cpufreq core is responsible for ensuring -+ * that we're bound to the current CPU and pol->cpu stays online. -+ */ -+ if (smp_processor_id() == pol->cpu) -+ return powernowk8_target_fn(&pta); -+ else -+ return work_on_cpu(pol->cpu, powernowk8_target_fn, &pta); - } - - /* Driver entry point to verify the policy and range of frequencies */ -diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c -index 7292aa8..4058430 100644 ---- a/drivers/dma/at_hdmac.c -+++ b/drivers/dma/at_hdmac.c -@@ -662,7 +662,7 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, - flags); - - if (unlikely(!atslave || !sg_len)) { -- dev_dbg(chan2dev(chan), "prep_dma_memcpy: length is zero!\n"); -+ dev_dbg(chan2dev(chan), "prep_slave_sg: sg length is zero!\n"); - return NULL; - } - -@@ -690,6 +690,11 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, - - mem = sg_dma_address(sg); - len = sg_dma_len(sg); -+ if (unlikely(!len)) { -+ dev_dbg(chan2dev(chan), -+ "prep_slave_sg: sg(%d) data length is zero\n", i); -+ goto err; -+ } - mem_width = 2; - if (unlikely(mem & 3 || len & 3)) - mem_width = 0; -@@ -725,6 +730,11 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, - - mem = sg_dma_address(sg); - len = sg_dma_len(sg); -+ if (unlikely(!len)) { -+ dev_dbg(chan2dev(chan), -+ "prep_slave_sg: sg(%d) data length is zero\n", i); -+ goto err; -+ } - mem_width = 2; - if (unlikely(mem & 3 || len & 3)) - mem_width = 0; -@@ -758,6 +768,7 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, - - err_desc_get: - dev_err(chan2dev(chan), "not enough descriptors available\n"); -+err: - atc_desc_put(atchan, first); - return NULL; - } -diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c -index e4feba6..f5843bc 100644 ---- a/drivers/dma/pl330.c -+++ b/drivers/dma/pl330.c -@@ -1567,17 +1567,19 @@ static int pl330_submit_req(void *ch_id, struct pl330_req *r) - goto xfer_exit; - } - -- /* Prefer Secure Channel */ -- if (!_manager_ns(thrd)) -- r->cfg->nonsecure = 0; -- else -- r->cfg->nonsecure = 1; - - /* Use last settings, if not provided */ -- if (r->cfg) -+ if (r->cfg) { -+ /* Prefer Secure Channel */ -+ if (!_manager_ns(thrd)) -+ r->cfg->nonsecure = 0; -+ else -+ r->cfg->nonsecure = 1; -+ - ccr = _prepare_ccr(r->cfg); -- else -+ } else { - ccr = readl(regs + CC(thrd->id)); -+ } - - /* If this req doesn't have valid xfer settings */ - if (!_is_valid(ccr)) { -@@ -2928,6 +2930,11 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) - num_chan = max_t(int, pi->pcfg.num_peri, pi->pcfg.num_chan); - - pdmac->peripherals = kzalloc(num_chan * sizeof(*pch), GFP_KERNEL); -+ if (!pdmac->peripherals) { -+ ret = -ENOMEM; -+ dev_err(&adev->dev, "unable to allocate pdmac->peripherals\n"); -+ goto probe_err5; -+ } - - for (i = 0; i < num_chan; i++) { - pch = &pdmac->peripherals[i]; -diff --git a/drivers/gpio/gpio-lpc32xx.c b/drivers/gpio/gpio-lpc32xx.c -index c2199be..6cee3a6 100644 ---- a/drivers/gpio/gpio-lpc32xx.c -+++ b/drivers/gpio/gpio-lpc32xx.c -@@ -307,6 +307,7 @@ static int lpc32xx_gpio_dir_output_p012(struct gpio_chip *chip, unsigned pin, - { - struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); - -+ __set_gpio_level_p012(group, pin, value); - __set_gpio_dir_p012(group, pin, 0); - - return 0; -@@ -317,6 +318,7 @@ static int lpc32xx_gpio_dir_output_p3(struct gpio_chip *chip, unsigned pin, - { - struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); - -+ __set_gpio_level_p3(group, pin, value); - __set_gpio_dir_p3(group, pin, 0); - - return 0; -@@ -325,6 +327,9 @@ static int lpc32xx_gpio_dir_output_p3(struct gpio_chip *chip, unsigned pin, - static int lpc32xx_gpio_dir_out_always(struct gpio_chip *chip, unsigned pin, - int value) - { -+ struct lpc32xx_gpio_chip *group = to_lpc32xx_gpio(chip); -+ -+ __set_gpo_level_p3(group, pin, value); - return 0; - } - -diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c -index 08a7aa7..6fbfc24 100644 ---- a/drivers/gpu/drm/drm_crtc.c -+++ b/drivers/gpu/drm/drm_crtc.c -@@ -1981,7 +1981,7 @@ int drm_mode_cursor_ioctl(struct drm_device *dev, - if (!drm_core_check_feature(dev, DRIVER_MODESET)) - return -EINVAL; - -- if (!req->flags) -+ if (!req->flags || (~DRM_MODE_CURSOR_FLAGS & req->flags)) - return -EINVAL; - - mutex_lock(&dev->mode_config.mutex); -diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c -index a8743c3..b7ee230 100644 ---- a/drivers/gpu/drm/drm_edid.c -+++ b/drivers/gpu/drm/drm_edid.c -@@ -87,6 +87,9 @@ static struct edid_quirk { - int product_id; - u32 quirks; - } edid_quirk_list[] = { -+ /* ASUS VW222S */ -+ { "ACI", 0x22a2, EDID_QUIRK_FORCE_REDUCED_BLANKING }, -+ - /* Acer AL1706 */ - { "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 }, - /* Acer F51 */ -diff --git a/drivers/gpu/drm/gma500/oaktrail_device.c b/drivers/gpu/drm/gma500/oaktrail_device.c -index 0f9b7db..cf49ba5 100644 ---- a/drivers/gpu/drm/gma500/oaktrail_device.c -+++ b/drivers/gpu/drm/gma500/oaktrail_device.c -@@ -476,6 +476,7 @@ static const struct psb_offset oaktrail_regmap[2] = { - .pos = DSPAPOS, - .surf = DSPASURF, - .addr = MRST_DSPABASE, -+ .base = MRST_DSPABASE, - .status = PIPEASTAT, - .linoff = DSPALINOFF, - .tileoff = DSPATILEOFF, -@@ -499,6 +500,7 @@ static const struct psb_offset oaktrail_regmap[2] = { - .pos = DSPBPOS, - .surf = DSPBSURF, - .addr = DSPBBASE, -+ .base = DSPBBASE, - .status = PIPEBSTAT, - .linoff = DSPBLINOFF, - .tileoff = DSPBTILEOFF, -diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c -index 288d7b8..35926ad 100644 ---- a/drivers/gpu/drm/i915/i915_gem.c -+++ b/drivers/gpu/drm/i915/i915_gem.c -@@ -3044,7 +3044,8 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj, - { - int ret; - -- BUG_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT); -+ if (WARN_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT)) -+ return -EBUSY; - - if (obj->gtt_space != NULL) { - if ((alignment && obj->gtt_offset & (alignment - 1)) || -diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c -index ed3224c..acc91b1 100644 ---- a/drivers/gpu/drm/i915/i915_irq.c -+++ b/drivers/gpu/drm/i915/i915_irq.c -@@ -2626,9 +2626,6 @@ void intel_irq_init(struct drm_device *dev) - dev->driver->irq_handler = i8xx_irq_handler; - dev->driver->irq_uninstall = i8xx_irq_uninstall; - } else if (INTEL_INFO(dev)->gen == 3) { -- /* IIR "flip pending" means done if this bit is set */ -- I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE)); -- - dev->driver->irq_preinstall = i915_irq_preinstall; - dev->driver->irq_postinstall = i915_irq_postinstall; - dev->driver->irq_uninstall = i915_irq_uninstall; -diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c -index 75a70c4..1f0741f 100644 ---- a/drivers/gpu/drm/i915/intel_crt.c -+++ b/drivers/gpu/drm/i915/intel_crt.c -@@ -284,6 +284,36 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector) - return ret; - } - -+static struct edid *intel_crt_get_edid(struct drm_connector *connector, -+ struct i2c_adapter *i2c) -+{ -+ struct edid *edid; -+ -+ edid = drm_get_edid(connector, i2c); -+ -+ if (!edid && !intel_gmbus_is_forced_bit(i2c)) { -+ DRM_DEBUG_KMS("CRT GMBUS EDID read failed, retry using GPIO bit-banging\n"); -+ intel_gmbus_force_bit(i2c, true); -+ edid = drm_get_edid(connector, i2c); -+ intel_gmbus_force_bit(i2c, false); -+ } -+ -+ return edid; -+} -+ -+/* local version of intel_ddc_get_modes() to use intel_crt_get_edid() */ -+static int intel_crt_ddc_get_modes(struct drm_connector *connector, -+ struct i2c_adapter *adapter) -+{ -+ struct edid *edid; -+ -+ edid = intel_crt_get_edid(connector, adapter); -+ if (!edid) -+ return 0; -+ -+ return intel_connector_update_modes(connector, edid); -+} -+ - static bool intel_crt_detect_ddc(struct drm_connector *connector) - { - struct intel_crt *crt = intel_attached_crt(connector); -@@ -299,7 +329,7 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector) - struct i2c_adapter *i2c; - - i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin); -- edid = drm_get_edid(connector, i2c); -+ edid = intel_crt_get_edid(connector, i2c); - /* - * This may be a DVI-I connector with a shared DDC - * link between analog and digital outputs, so we -@@ -498,13 +528,13 @@ static int intel_crt_get_modes(struct drm_connector *connector) - struct i2c_adapter *i2c; - - i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->crt_ddc_pin); -- ret = intel_ddc_get_modes(connector, i2c); -+ ret = intel_crt_ddc_get_modes(connector, i2c); - if (ret || !IS_G4X(dev)) - return ret; - - /* Try to probe digital port for output in DVI-I -> VGA mode. */ - i2c = intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPB); -- return intel_ddc_get_modes(connector, i2c); -+ return intel_crt_ddc_get_modes(connector, i2c); - } - - static int intel_crt_set_property(struct drm_connector *connector, -diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c -index 8a11131..2f22bea 100644 ---- a/drivers/gpu/drm/i915/intel_display.c -+++ b/drivers/gpu/drm/i915/intel_display.c -@@ -1238,7 +1238,7 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv, - enum pipe pipe, int reg) - { - u32 val = I915_READ(reg); -- WARN(hdmi_pipe_enabled(dev_priv, val, pipe), -+ WARN(hdmi_pipe_enabled(dev_priv, pipe, val), - "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n", - reg, pipe_name(pipe)); - } -@@ -1255,13 +1255,13 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv, - - reg = PCH_ADPA; - val = I915_READ(reg); -- WARN(adpa_pipe_enabled(dev_priv, val, pipe), -+ WARN(adpa_pipe_enabled(dev_priv, pipe, val), - "PCH VGA enabled on transcoder %c, should be disabled\n", - pipe_name(pipe)); - - reg = PCH_LVDS; - val = I915_READ(reg); -- WARN(lvds_pipe_enabled(dev_priv, val, pipe), -+ WARN(lvds_pipe_enabled(dev_priv, pipe, val), - "PCH LVDS enabled on transcoder %c, should be disabled\n", - pipe_name(pipe)); - -@@ -1723,7 +1723,7 @@ static void disable_pch_hdmi(struct drm_i915_private *dev_priv, - enum pipe pipe, int reg) - { - u32 val = I915_READ(reg); -- if (hdmi_pipe_enabled(dev_priv, val, pipe)) { -+ if (hdmi_pipe_enabled(dev_priv, pipe, val)) { - DRM_DEBUG_KMS("Disabling pch HDMI %x on pipe %d\n", - reg, pipe); - I915_WRITE(reg, val & ~PORT_ENABLE); -@@ -1745,12 +1745,12 @@ static void intel_disable_pch_ports(struct drm_i915_private *dev_priv, - - reg = PCH_ADPA; - val = I915_READ(reg); -- if (adpa_pipe_enabled(dev_priv, val, pipe)) -+ if (adpa_pipe_enabled(dev_priv, pipe, val)) - I915_WRITE(reg, val & ~ADPA_DAC_ENABLE); - - reg = PCH_LVDS; - val = I915_READ(reg); -- if (lvds_pipe_enabled(dev_priv, val, pipe)) { -+ if (lvds_pipe_enabled(dev_priv, pipe, val)) { - DRM_DEBUG_KMS("disable lvds on pipe %d val 0x%08x\n", pipe, val); - I915_WRITE(reg, val & ~LVDS_PORT_EN); - POSTING_READ(reg); -@@ -3926,12 +3926,6 @@ static void i8xx_update_pll(struct drm_crtc *crtc, - POSTING_READ(DPLL(pipe)); - udelay(150); - -- I915_WRITE(DPLL(pipe), dpll); -- -- /* Wait for the clocks to stabilize. */ -- POSTING_READ(DPLL(pipe)); -- udelay(150); -- - /* The LVDS pin pair needs to be on before the DPLLs are enabled. - * This is an exception to the general rule that mode_set doesn't turn - * things on. -@@ -3939,6 +3933,12 @@ static void i8xx_update_pll(struct drm_crtc *crtc, - if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) - intel_update_lvds(crtc, clock, adjusted_mode); - -+ I915_WRITE(DPLL(pipe), dpll); -+ -+ /* Wait for the clocks to stabilize. */ -+ POSTING_READ(DPLL(pipe)); -+ udelay(150); -+ - /* The pixel multiplier can only be updated once the - * DPLL is enabled and the clocks are stable. - * -diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h -index 3e09188..9040191 100644 ---- a/drivers/gpu/drm/i915/intel_drv.h -+++ b/drivers/gpu/drm/i915/intel_drv.h -@@ -334,6 +334,8 @@ struct intel_fbc_work { - int interval; - }; - -+int intel_connector_update_modes(struct drm_connector *connector, -+ struct edid *edid); - int intel_ddc_get_modes(struct drm_connector *c, struct i2c_adapter *adapter); - extern bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus); - -diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c -index 2ead3bf..bc1f0f2 100644 ---- a/drivers/gpu/drm/i915/intel_hdmi.c -+++ b/drivers/gpu/drm/i915/intel_hdmi.c -@@ -400,7 +400,7 @@ static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) - u32 temp; - u32 enable_bits = SDVO_ENABLE; - -- if (intel_hdmi->has_audio) -+ if (intel_hdmi->has_audio || mode != DRM_MODE_DPMS_ON) - enable_bits |= SDVO_AUDIO_ENABLE; - - temp = I915_READ(intel_hdmi->sdvox_reg); -diff --git a/drivers/gpu/drm/i915/intel_modes.c b/drivers/gpu/drm/i915/intel_modes.c -index d67ec3a..e019146 100644 ---- a/drivers/gpu/drm/i915/intel_modes.c -+++ b/drivers/gpu/drm/i915/intel_modes.c -@@ -61,6 +61,25 @@ bool intel_ddc_probe(struct intel_encoder *intel_encoder, int ddc_bus) - } - - /** -+ * intel_connector_update_modes - update connector from edid -+ * @connector: DRM connector device to use -+ * @edid: previously read EDID information -+ */ -+int intel_connector_update_modes(struct drm_connector *connector, -+ struct edid *edid) -+{ -+ int ret; -+ -+ drm_mode_connector_update_edid_property(connector, edid); -+ ret = drm_add_edid_modes(connector, edid); -+ drm_edid_to_eld(connector, edid); -+ connector->display_info.raw_edid = NULL; -+ kfree(edid); -+ -+ return ret; -+} -+ -+/** - * intel_ddc_get_modes - get modelist from monitor - * @connector: DRM connector device to use - * @adapter: i2c adapter -@@ -71,18 +90,12 @@ int intel_ddc_get_modes(struct drm_connector *connector, - struct i2c_adapter *adapter) - { - struct edid *edid; -- int ret = 0; - - edid = drm_get_edid(connector, adapter); -- if (edid) { -- drm_mode_connector_update_edid_property(connector, edid); -- ret = drm_add_edid_modes(connector, edid); -- drm_edid_to_eld(connector, edid); -- connector->display_info.raw_edid = NULL; -- kfree(edid); -- } -+ if (!edid) -+ return 0; - -- return ret; -+ return intel_connector_update_modes(connector, edid); - } - - static const struct drm_prop_enum_list force_audio_names[] = { -diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c -index d0ce2a5..a48c391 100644 ---- a/drivers/gpu/drm/i915/intel_pm.c -+++ b/drivers/gpu/drm/i915/intel_pm.c -@@ -2431,10 +2431,10 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) - I915_WRITE(GEN6_RP_INTERRUPT_LIMITS, - dev_priv->max_delay << 24 | - dev_priv->min_delay << 16); -- I915_WRITE(GEN6_RP_UP_THRESHOLD, 10000); -- I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 1000000); -- I915_WRITE(GEN6_RP_UP_EI, 100000); -- I915_WRITE(GEN6_RP_DOWN_EI, 5000000); -+ I915_WRITE(GEN6_RP_UP_THRESHOLD, 59400); -+ I915_WRITE(GEN6_RP_DOWN_THRESHOLD, 245000); -+ I915_WRITE(GEN6_RP_UP_EI, 66000); -+ I915_WRITE(GEN6_RP_DOWN_EI, 350000); - I915_WRITE(GEN6_RP_IDLE_HYSTERSIS, 10); - I915_WRITE(GEN6_RP_CONTROL, - GEN6_RP_MEDIA_TURBO | -@@ -3528,6 +3528,9 @@ static void gen3_init_clock_gating(struct drm_device *dev) - - if (IS_PINEVIEW(dev)) - I915_WRITE(ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY)); -+ -+ /* IIR "flip pending" means done if this bit is set */ -+ I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE)); - } - - static void i85x_init_clock_gating(struct drm_device *dev) -diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c -index b6a9d45..74d47a3 100644 ---- a/drivers/gpu/drm/i915/intel_sdvo.c -+++ b/drivers/gpu/drm/i915/intel_sdvo.c -@@ -2552,25 +2552,12 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) - } - } - -- if (intel_sdvo->is_sdvob) -- dev_priv->hotplug_supported_mask |= SDVOB_HOTPLUG_INT_STATUS; -- else -- dev_priv->hotplug_supported_mask |= SDVOC_HOTPLUG_INT_STATUS; -- - drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs); - - /* In default case sdvo lvds is false */ - if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps)) - goto err; - -- /* Set up hotplug command - note paranoia about contents of reply. -- * We assume that the hardware is in a sane state, and only touch -- * the bits we think we understand. -- */ -- intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_ACTIVE_HOT_PLUG, -- &intel_sdvo->hotplug_active, 2); -- intel_sdvo->hotplug_active[0] &= ~0x3; -- - if (intel_sdvo_output_setup(intel_sdvo, - intel_sdvo->caps.output_flags) != true) { - DRM_DEBUG_KMS("SDVO output failed to setup on %s\n", -@@ -2578,6 +2565,16 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) - goto err; - } - -+ /* Only enable the hotplug irq if we need it, to work around noisy -+ * hotplug lines. -+ */ -+ if (intel_sdvo->hotplug_active[0]) { -+ if (intel_sdvo->is_sdvob) -+ dev_priv->hotplug_supported_mask |= SDVOB_HOTPLUG_INT_STATUS; -+ else -+ dev_priv->hotplug_supported_mask |= SDVOC_HOTPLUG_INT_STATUS; -+ } -+ - intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg); - - /* Set the input timing to the screen. Assume always input 0. */ -diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c -index 69688ef..7e16dc5 100644 ---- a/drivers/gpu/drm/nouveau/nouveau_display.c -+++ b/drivers/gpu/drm/nouveau/nouveau_display.c -@@ -598,7 +598,7 @@ nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev, - args->size = args->pitch * args->height; - args->size = roundup(args->size, PAGE_SIZE); - -- ret = nouveau_gem_new(dev, args->size, 0, TTM_PL_FLAG_VRAM, 0, 0, &bo); -+ ret = nouveau_gem_new(dev, args->size, 0, NOUVEAU_GEM_DOMAIN_VRAM, 0, 0, &bo); - if (ret) - return ret; - -diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c -index 19706f0..22a90a0 100644 ---- a/drivers/gpu/drm/nouveau/nouveau_state.c -+++ b/drivers/gpu/drm/nouveau/nouveau_state.c -@@ -737,9 +737,11 @@ nouveau_card_init(struct drm_device *dev) - } - break; - case NV_C0: -- nvc0_copy_create(dev, 1); -+ if (!(nv_rd32(dev, 0x022500) & 0x00000200)) -+ nvc0_copy_create(dev, 1); - case NV_D0: -- nvc0_copy_create(dev, 0); -+ if (!(nv_rd32(dev, 0x022500) & 0x00000100)) -+ nvc0_copy_create(dev, 0); - break; - default: - break; -diff --git a/drivers/gpu/drm/nouveau/nv84_fifo.c b/drivers/gpu/drm/nouveau/nv84_fifo.c -index cc82d79..c564c5e 100644 ---- a/drivers/gpu/drm/nouveau/nv84_fifo.c -+++ b/drivers/gpu/drm/nouveau/nv84_fifo.c -@@ -117,17 +117,22 @@ nv84_fifo_context_del(struct nouveau_channel *chan, int engine) - struct drm_device *dev = chan->dev; - struct drm_nouveau_private *dev_priv = dev->dev_private; - unsigned long flags; -+ u32 save; - - /* remove channel from playlist, will context switch if active */ - spin_lock_irqsave(&dev_priv->context_switch_lock, flags); - nv_mask(dev, 0x002600 + (chan->id * 4), 0x80000000, 0x00000000); - nv50_fifo_playlist_update(dev); - -+ save = nv_mask(dev, 0x002520, 0x0000003f, 0x15); -+ - /* tell any engines on this channel to unload their contexts */ - nv_wr32(dev, 0x0032fc, chan->ramin->vinst >> 12); - if (!nv_wait_ne(dev, 0x0032fc, 0xffffffff, 0xffffffff)) - NV_INFO(dev, "PFIFO: channel %d unload timeout\n", chan->id); - -+ nv_wr32(dev, 0x002520, save); -+ - nv_wr32(dev, 0x002600 + (chan->id * 4), 0x00000000); - spin_unlock_irqrestore(&dev_priv->context_switch_lock, flags); - -@@ -184,10 +189,13 @@ nv84_fifo_fini(struct drm_device *dev, int engine, bool suspend) - struct drm_nouveau_private *dev_priv = dev->dev_private; - struct nv84_fifo_priv *priv = nv_engine(dev, engine); - int i; -+ u32 save; - - /* set playlist length to zero, fifo will unload context */ - nv_wr32(dev, 0x0032ec, 0); - -+ save = nv_mask(dev, 0x002520, 0x0000003f, 0x15); -+ - /* tell all connected engines to unload their contexts */ - for (i = 0; i < priv->base.channels; i++) { - struct nouveau_channel *chan = dev_priv->channels.ptr[i]; -@@ -199,6 +207,7 @@ nv84_fifo_fini(struct drm_device *dev, int engine, bool suspend) - } - } - -+ nv_wr32(dev, 0x002520, save); - nv_wr32(dev, 0x002140, 0); - return 0; - } -diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c -index 7915944..25b8014 100644 ---- a/drivers/gpu/drm/radeon/atombios_crtc.c -+++ b/drivers/gpu/drm/radeon/atombios_crtc.c -@@ -258,7 +258,6 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) - radeon_crtc->enabled = true; - /* adjust pm to dpms changes BEFORE enabling crtcs */ - radeon_pm_compute_clocks(rdev); -- /* disable crtc pair power gating before programming */ - if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) - atombios_powergate_crtc(crtc, ATOM_DISABLE); - atombios_enable_crtc(crtc, ATOM_ENABLE); -@@ -278,25 +277,8 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) - atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); - atombios_enable_crtc(crtc, ATOM_DISABLE); - radeon_crtc->enabled = false; -- /* power gating is per-pair */ -- if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) { -- struct drm_crtc *other_crtc; -- struct radeon_crtc *other_radeon_crtc; -- list_for_each_entry(other_crtc, &rdev->ddev->mode_config.crtc_list, head) { -- other_radeon_crtc = to_radeon_crtc(other_crtc); -- if (((radeon_crtc->crtc_id == 0) && (other_radeon_crtc->crtc_id == 1)) || -- ((radeon_crtc->crtc_id == 1) && (other_radeon_crtc->crtc_id == 0)) || -- ((radeon_crtc->crtc_id == 2) && (other_radeon_crtc->crtc_id == 3)) || -- ((radeon_crtc->crtc_id == 3) && (other_radeon_crtc->crtc_id == 2)) || -- ((radeon_crtc->crtc_id == 4) && (other_radeon_crtc->crtc_id == 5)) || -- ((radeon_crtc->crtc_id == 5) && (other_radeon_crtc->crtc_id == 4))) { -- /* if both crtcs in the pair are off, enable power gating */ -- if (other_radeon_crtc->enabled == false) -- atombios_powergate_crtc(crtc, ATOM_ENABLE); -- break; -- } -- } -- } -+ if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) -+ atombios_powergate_crtc(crtc, ATOM_ENABLE); - /* adjust pm to dpms changes AFTER disabling crtcs */ - radeon_pm_compute_clocks(rdev); - break; -@@ -444,11 +426,28 @@ union atom_enable_ss { - static void atombios_crtc_program_ss(struct radeon_device *rdev, - int enable, - int pll_id, -+ int crtc_id, - struct radeon_atom_ss *ss) - { -+ unsigned i; - int index = GetIndexIntoMasterTable(COMMAND, EnableSpreadSpectrumOnPPLL); - union atom_enable_ss args; - -+ if (!enable) { -+ for (i = 0; i < rdev->num_crtc; i++) { -+ if (rdev->mode_info.crtcs[i] && -+ rdev->mode_info.crtcs[i]->enabled && -+ i != crtc_id && -+ pll_id == rdev->mode_info.crtcs[i]->pll_id) { -+ /* one other crtc is using this pll don't turn -+ * off spread spectrum as it might turn off -+ * display on active crtc -+ */ -+ return; -+ } -+ } -+ } -+ - memset(&args, 0, sizeof(args)); - - if (ASIC_IS_DCE5(rdev)) { -@@ -1036,7 +1035,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode - radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, - &ref_div, &post_div); - -- atombios_crtc_program_ss(rdev, ATOM_DISABLE, radeon_crtc->pll_id, &ss); -+ atombios_crtc_program_ss(rdev, ATOM_DISABLE, radeon_crtc->pll_id, radeon_crtc->crtc_id, &ss); - - atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, - encoder_mode, radeon_encoder->encoder_id, mode->clock, -@@ -1059,7 +1058,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode - ss.step = step_size; - } - -- atombios_crtc_program_ss(rdev, ATOM_ENABLE, radeon_crtc->pll_id, &ss); -+ atombios_crtc_program_ss(rdev, ATOM_ENABLE, radeon_crtc->pll_id, radeon_crtc->crtc_id, &ss); - } - } - -@@ -1576,11 +1575,11 @@ void radeon_atom_disp_eng_pll_init(struct radeon_device *rdev) - ASIC_INTERNAL_SS_ON_DCPLL, - rdev->clock.default_dispclk); - if (ss_enabled) -- atombios_crtc_program_ss(rdev, ATOM_DISABLE, ATOM_DCPLL, &ss); -+ atombios_crtc_program_ss(rdev, ATOM_DISABLE, ATOM_DCPLL, -1, &ss); - /* XXX: DCE5, make sure voltage, dispclk is high enough */ - atombios_crtc_set_disp_eng_pll(rdev, rdev->clock.default_dispclk); - if (ss_enabled) -- atombios_crtc_program_ss(rdev, ATOM_ENABLE, ATOM_DCPLL, &ss); -+ atombios_crtc_program_ss(rdev, ATOM_ENABLE, ATOM_DCPLL, -1, &ss); - } - - } -@@ -1669,9 +1668,22 @@ static void atombios_crtc_disable(struct drm_crtc *crtc) - struct drm_device *dev = crtc->dev; - struct radeon_device *rdev = dev->dev_private; - struct radeon_atom_ss ss; -+ int i; - - atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); - -+ for (i = 0; i < rdev->num_crtc; i++) { -+ if (rdev->mode_info.crtcs[i] && -+ rdev->mode_info.crtcs[i]->enabled && -+ i != radeon_crtc->crtc_id && -+ radeon_crtc->pll_id == rdev->mode_info.crtcs[i]->pll_id) { -+ /* one other crtc is using this pll don't turn -+ * off the pll -+ */ -+ goto done; -+ } -+ } -+ - switch (radeon_crtc->pll_id) { - case ATOM_PPLL1: - case ATOM_PPLL2: -@@ -1688,6 +1700,7 @@ static void atombios_crtc_disable(struct drm_crtc *crtc) - default: - break; - } -+done: - radeon_crtc->pll_id = -1; - } - -diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c -index 8676b1b..700dfab 100644 ---- a/drivers/gpu/drm/radeon/atombios_encoders.c -+++ b/drivers/gpu/drm/radeon/atombios_encoders.c -@@ -1379,6 +1379,8 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) - struct drm_device *dev = encoder->dev; - struct radeon_device *rdev = dev->dev_private; - struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); -+ struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder); -+ struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; - struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); - struct radeon_connector *radeon_connector = NULL; - struct radeon_connector_atom_dig *radeon_dig_connector = NULL; -@@ -1390,19 +1392,37 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) - - switch (mode) { - case DRM_MODE_DPMS_ON: -- /* some early dce3.2 boards have a bug in their transmitter control table */ -- if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730) || -- ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { -- if (ASIC_IS_DCE6(rdev)) { -- /* It seems we need to call ATOM_ENCODER_CMD_SETUP again -- * before reenabling encoder on DPMS ON, otherwise we never -- * get picture -- */ -- atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); -+ if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { -+ if (!connector) -+ dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; -+ else -+ dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); -+ -+ /* setup and enable the encoder */ -+ atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); -+ atombios_dig_encoder_setup(encoder, -+ ATOM_ENCODER_CMD_SETUP_PANEL_MODE, -+ dig->panel_mode); -+ if (ext_encoder) { -+ if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)) -+ atombios_external_encoder_setup(encoder, ext_encoder, -+ EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP); - } - atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); -- } else { -+ } else if (ASIC_IS_DCE4(rdev)) { -+ /* setup and enable the encoder */ -+ atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); -+ /* enable the transmitter */ -+ atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); - atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); -+ } else { -+ /* setup and enable the encoder and transmitter */ -+ atombios_dig_encoder_setup(encoder, ATOM_ENABLE, 0); -+ atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0); -+ atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); -+ /* some early dce3.2 boards have a bug in their transmitter control table */ -+ if ((rdev->family != CHIP_RV710) || (rdev->family != CHIP_RV730)) -+ atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); - } - if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { - if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { -@@ -1420,10 +1440,19 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) - case DRM_MODE_DPMS_STANDBY: - case DRM_MODE_DPMS_SUSPEND: - case DRM_MODE_DPMS_OFF: -- if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) -+ if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { -+ /* disable the transmitter */ - atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); -- else -+ } else if (ASIC_IS_DCE4(rdev)) { -+ /* disable the transmitter */ -+ atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); -+ atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); -+ } else { -+ /* disable the encoder and transmitter */ - atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); -+ atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); -+ atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0); -+ } - if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { - if (ASIC_IS_DCE4(rdev)) - atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); -@@ -1740,13 +1769,34 @@ static int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder) - struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); - struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); - struct drm_encoder *test_encoder; -- struct radeon_encoder_atom_dig *dig; -+ struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; - uint32_t dig_enc_in_use = 0; - -- /* DCE4/5 */ -- if (ASIC_IS_DCE4(rdev)) { -- dig = radeon_encoder->enc_priv; -- if (ASIC_IS_DCE41(rdev)) { -+ if (ASIC_IS_DCE6(rdev)) { -+ /* DCE6 */ -+ switch (radeon_encoder->encoder_id) { -+ case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: -+ if (dig->linkb) -+ return 1; -+ else -+ return 0; -+ break; -+ case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: -+ if (dig->linkb) -+ return 3; -+ else -+ return 2; -+ break; -+ case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: -+ if (dig->linkb) -+ return 5; -+ else -+ return 4; -+ break; -+ } -+ } else if (ASIC_IS_DCE4(rdev)) { -+ /* DCE4/5 */ -+ if (ASIC_IS_DCE41(rdev) && !ASIC_IS_DCE61(rdev)) { - /* ontario follows DCE4 */ - if (rdev->family == CHIP_PALM) { - if (dig->linkb) -@@ -1848,10 +1898,12 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, - struct drm_device *dev = encoder->dev; - struct radeon_device *rdev = dev->dev_private; - struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); -- struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder); - - radeon_encoder->pixel_clock = adjusted_mode->clock; - -+ /* need to call this here rather than in prepare() since we need some crtc info */ -+ radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); -+ - if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE4(rdev)) { - if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT)) - atombios_yuv_setup(encoder, true); -@@ -1870,38 +1922,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: -- if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { -- struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); -- struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; -- -- if (!connector) -- dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; -- else -- dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); -- -- /* setup and enable the encoder */ -- atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); -- atombios_dig_encoder_setup(encoder, -- ATOM_ENCODER_CMD_SETUP_PANEL_MODE, -- dig->panel_mode); -- } else if (ASIC_IS_DCE4(rdev)) { -- /* disable the transmitter */ -- atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); -- /* setup and enable the encoder */ -- atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); -- -- /* enable the transmitter */ -- atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); -- } else { -- /* disable the encoder and transmitter */ -- atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); -- atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0); -- -- /* setup and enable the encoder and transmitter */ -- atombios_dig_encoder_setup(encoder, ATOM_ENABLE, 0); -- atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0); -- atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); -- } -+ /* handled in dpms */ - break; - case ENCODER_OBJECT_ID_INTERNAL_DDI: - case ENCODER_OBJECT_ID_INTERNAL_DVO1: -@@ -1922,14 +1943,6 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, - break; - } - -- if (ext_encoder) { -- if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)) -- atombios_external_encoder_setup(encoder, ext_encoder, -- EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP); -- else -- atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE); -- } -- - atombios_apply_encoder_quirks(encoder, adjusted_mode); - - if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) { -@@ -2116,7 +2129,6 @@ static void radeon_atom_encoder_prepare(struct drm_encoder *encoder) - } - - radeon_atom_output_lock(encoder, true); -- radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); - - if (connector) { - struct radeon_connector *radeon_connector = to_radeon_connector(connector); -@@ -2137,6 +2149,7 @@ static void radeon_atom_encoder_prepare(struct drm_encoder *encoder) - - static void radeon_atom_encoder_commit(struct drm_encoder *encoder) - { -+ /* need to call this here as we need the crtc set up */ - radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_ON); - radeon_atom_output_lock(encoder, false); - } -@@ -2177,14 +2190,7 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder) - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: -- if (ASIC_IS_DCE4(rdev)) -- /* disable the transmitter */ -- atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); -- else { -- /* disable the encoder and transmitter */ -- atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); -- atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0); -- } -+ /* handled in dpms */ - break; - case ENCODER_OBJECT_ID_INTERNAL_DDI: - case ENCODER_OBJECT_ID_INTERNAL_DVO1: -diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h -index fefcca5..5c8a0bf 100644 ---- a/drivers/gpu/drm/radeon/radeon.h -+++ b/drivers/gpu/drm/radeon/radeon.h -@@ -143,21 +143,6 @@ struct radeon_device; - /* - * BIOS. - */ --#define ATRM_BIOS_PAGE 4096 -- --#if defined(CONFIG_VGA_SWITCHEROO) --bool radeon_atrm_supported(struct pci_dev *pdev); --int radeon_atrm_get_bios_chunk(uint8_t *bios, int offset, int len); --#else --static inline bool radeon_atrm_supported(struct pci_dev *pdev) --{ -- return false; --} -- --static inline int radeon_atrm_get_bios_chunk(uint8_t *bios, int offset, int len){ -- return -EINVAL; --} --#endif - bool radeon_get_bios(struct radeon_device *rdev); - - -@@ -323,6 +308,7 @@ struct radeon_bo_va { - uint64_t soffset; - uint64_t eoffset; - uint32_t flags; -+ struct radeon_fence *fence; - bool valid; - }; - -diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c -index b1e3820..5e30e12 100644 ---- a/drivers/gpu/drm/radeon/radeon_atombios.c -+++ b/drivers/gpu/drm/radeon/radeon_atombios.c -@@ -452,7 +452,7 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, - } - - /* Fujitsu D3003-S2 board lists DVI-I as DVI-D and VGA */ -- if ((dev->pdev->device == 0x9802) && -+ if (((dev->pdev->device == 0x9802) || (dev->pdev->device == 0x9806)) && - (dev->pdev->subsystem_vendor == 0x1734) && - (dev->pdev->subsystem_device == 0x11bd)) { - if (*connector_type == DRM_MODE_CONNECTOR_VGA) { -diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c -index 98724fc..2a2cf0b 100644 ---- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c -+++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c -@@ -30,57 +30,8 @@ static struct radeon_atpx_priv { - /* handle for device - and atpx */ - acpi_handle dhandle; - acpi_handle atpx_handle; -- acpi_handle atrm_handle; - } radeon_atpx_priv; - --/* retrieve the ROM in 4k blocks */ --static int radeon_atrm_call(acpi_handle atrm_handle, uint8_t *bios, -- int offset, int len) --{ -- acpi_status status; -- union acpi_object atrm_arg_elements[2], *obj; -- struct acpi_object_list atrm_arg; -- struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL}; -- -- atrm_arg.count = 2; -- atrm_arg.pointer = &atrm_arg_elements[0]; -- -- atrm_arg_elements[0].type = ACPI_TYPE_INTEGER; -- atrm_arg_elements[0].integer.value = offset; -- -- atrm_arg_elements[1].type = ACPI_TYPE_INTEGER; -- atrm_arg_elements[1].integer.value = len; -- -- status = acpi_evaluate_object(atrm_handle, NULL, &atrm_arg, &buffer); -- if (ACPI_FAILURE(status)) { -- printk("failed to evaluate ATRM got %s\n", acpi_format_exception(status)); -- return -ENODEV; -- } -- -- obj = (union acpi_object *)buffer.pointer; -- memcpy(bios+offset, obj->buffer.pointer, obj->buffer.length); -- len = obj->buffer.length; -- kfree(buffer.pointer); -- return len; --} -- --bool radeon_atrm_supported(struct pci_dev *pdev) --{ -- /* get the discrete ROM only via ATRM */ -- if (!radeon_atpx_priv.atpx_detected) -- return false; -- -- if (radeon_atpx_priv.dhandle == DEVICE_ACPI_HANDLE(&pdev->dev)) -- return false; -- return true; --} -- -- --int radeon_atrm_get_bios_chunk(uint8_t *bios, int offset, int len) --{ -- return radeon_atrm_call(radeon_atpx_priv.atrm_handle, bios, offset, len); --} -- - static int radeon_atpx_get_version(acpi_handle handle) - { - acpi_status status; -@@ -198,7 +149,7 @@ static int radeon_atpx_power_state(enum vga_switcheroo_client_id id, - - static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev) - { -- acpi_handle dhandle, atpx_handle, atrm_handle; -+ acpi_handle dhandle, atpx_handle; - acpi_status status; - - dhandle = DEVICE_ACPI_HANDLE(&pdev->dev); -@@ -209,13 +160,8 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev) - if (ACPI_FAILURE(status)) - return false; - -- status = acpi_get_handle(dhandle, "ATRM", &atrm_handle); -- if (ACPI_FAILURE(status)) -- return false; -- - radeon_atpx_priv.dhandle = dhandle; - radeon_atpx_priv.atpx_handle = atpx_handle; -- radeon_atpx_priv.atrm_handle = atrm_handle; - return true; - } - -diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c -index 501f488..d306cc8 100644 ---- a/drivers/gpu/drm/radeon/radeon_bios.c -+++ b/drivers/gpu/drm/radeon/radeon_bios.c -@@ -32,6 +32,7 @@ - - #include <linux/vga_switcheroo.h> - #include <linux/slab.h> -+#include <linux/acpi.h> - /* - * BIOS. - */ -@@ -98,16 +99,81 @@ static bool radeon_read_bios(struct radeon_device *rdev) - return true; - } - -+#ifdef CONFIG_ACPI - /* ATRM is used to get the BIOS on the discrete cards in - * dual-gpu systems. - */ -+/* retrieve the ROM in 4k blocks */ -+#define ATRM_BIOS_PAGE 4096 -+/** -+ * radeon_atrm_call - fetch a chunk of the vbios -+ * -+ * @atrm_handle: acpi ATRM handle -+ * @bios: vbios image pointer -+ * @offset: offset of vbios image data to fetch -+ * @len: length of vbios image data to fetch -+ * -+ * Executes ATRM to fetch a chunk of the discrete -+ * vbios image on PX systems (all asics). -+ * Returns the length of the buffer fetched. -+ */ -+static int radeon_atrm_call(acpi_handle atrm_handle, uint8_t *bios, -+ int offset, int len) -+{ -+ acpi_status status; -+ union acpi_object atrm_arg_elements[2], *obj; -+ struct acpi_object_list atrm_arg; -+ struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL}; -+ -+ atrm_arg.count = 2; -+ atrm_arg.pointer = &atrm_arg_elements[0]; -+ -+ atrm_arg_elements[0].type = ACPI_TYPE_INTEGER; -+ atrm_arg_elements[0].integer.value = offset; -+ -+ atrm_arg_elements[1].type = ACPI_TYPE_INTEGER; -+ atrm_arg_elements[1].integer.value = len; -+ -+ status = acpi_evaluate_object(atrm_handle, NULL, &atrm_arg, &buffer); -+ if (ACPI_FAILURE(status)) { -+ printk("failed to evaluate ATRM got %s\n", acpi_format_exception(status)); -+ return -ENODEV; -+ } -+ -+ obj = (union acpi_object *)buffer.pointer; -+ memcpy(bios+offset, obj->buffer.pointer, obj->buffer.length); -+ len = obj->buffer.length; -+ kfree(buffer.pointer); -+ return len; -+} -+ - static bool radeon_atrm_get_bios(struct radeon_device *rdev) - { - int ret; - int size = 256 * 1024; - int i; -+ struct pci_dev *pdev = NULL; -+ acpi_handle dhandle, atrm_handle; -+ acpi_status status; -+ bool found = false; -+ -+ /* ATRM is for the discrete card only */ -+ if (rdev->flags & RADEON_IS_IGP) -+ return false; -+ -+ while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { -+ dhandle = DEVICE_ACPI_HANDLE(&pdev->dev); -+ if (!dhandle) -+ continue; -+ -+ status = acpi_get_handle(dhandle, "ATRM", &atrm_handle); -+ if (!ACPI_FAILURE(status)) { -+ found = true; -+ break; -+ } -+ } - -- if (!radeon_atrm_supported(rdev->pdev)) -+ if (!found) - return false; - - rdev->bios = kmalloc(size, GFP_KERNEL); -@@ -117,9 +183,10 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev) - } - - for (i = 0; i < size / ATRM_BIOS_PAGE; i++) { -- ret = radeon_atrm_get_bios_chunk(rdev->bios, -- (i * ATRM_BIOS_PAGE), -- ATRM_BIOS_PAGE); -+ ret = radeon_atrm_call(atrm_handle, -+ rdev->bios, -+ (i * ATRM_BIOS_PAGE), -+ ATRM_BIOS_PAGE); - if (ret < ATRM_BIOS_PAGE) - break; - } -@@ -130,6 +197,12 @@ static bool radeon_atrm_get_bios(struct radeon_device *rdev) - } - return true; - } -+#else -+static inline bool radeon_atrm_get_bios(struct radeon_device *rdev) -+{ -+ return false; -+} -+#endif - - static bool ni_read_disabled_bios(struct radeon_device *rdev) - { -@@ -476,6 +549,61 @@ static bool radeon_read_disabled_bios(struct radeon_device *rdev) - return legacy_read_disabled_bios(rdev); - } - -+#ifdef CONFIG_ACPI -+static bool radeon_acpi_vfct_bios(struct radeon_device *rdev) -+{ -+ bool ret = false; -+ struct acpi_table_header *hdr; -+ acpi_size tbl_size; -+ UEFI_ACPI_VFCT *vfct; -+ GOP_VBIOS_CONTENT *vbios; -+ VFCT_IMAGE_HEADER *vhdr; -+ -+ if (!ACPI_SUCCESS(acpi_get_table_with_size("VFCT", 1, &hdr, &tbl_size))) -+ return false; -+ if (tbl_size < sizeof(UEFI_ACPI_VFCT)) { -+ DRM_ERROR("ACPI VFCT table present but broken (too short #1)\n"); -+ goto out_unmap; -+ } -+ -+ vfct = (UEFI_ACPI_VFCT *)hdr; -+ if (vfct->VBIOSImageOffset + sizeof(VFCT_IMAGE_HEADER) > tbl_size) { -+ DRM_ERROR("ACPI VFCT table present but broken (too short #2)\n"); -+ goto out_unmap; -+ } -+ -+ vbios = (GOP_VBIOS_CONTENT *)((char *)hdr + vfct->VBIOSImageOffset); -+ vhdr = &vbios->VbiosHeader; -+ DRM_INFO("ACPI VFCT contains a BIOS for %02x:%02x.%d %04x:%04x, size %d\n", -+ vhdr->PCIBus, vhdr->PCIDevice, vhdr->PCIFunction, -+ vhdr->VendorID, vhdr->DeviceID, vhdr->ImageLength); -+ -+ if (vhdr->PCIBus != rdev->pdev->bus->number || -+ vhdr->PCIDevice != PCI_SLOT(rdev->pdev->devfn) || -+ vhdr->PCIFunction != PCI_FUNC(rdev->pdev->devfn) || -+ vhdr->VendorID != rdev->pdev->vendor || -+ vhdr->DeviceID != rdev->pdev->device) { -+ DRM_INFO("ACPI VFCT table is not for this card\n"); -+ goto out_unmap; -+ }; -+ -+ if (vfct->VBIOSImageOffset + sizeof(VFCT_IMAGE_HEADER) + vhdr->ImageLength > tbl_size) { -+ DRM_ERROR("ACPI VFCT image truncated\n"); -+ goto out_unmap; -+ } -+ -+ rdev->bios = kmemdup(&vbios->VbiosContent, vhdr->ImageLength, GFP_KERNEL); -+ ret = !!rdev->bios; -+ -+out_unmap: -+ return ret; -+} -+#else -+static inline bool radeon_acpi_vfct_bios(struct radeon_device *rdev) -+{ -+ return false; -+} -+#endif - - bool radeon_get_bios(struct radeon_device *rdev) - { -@@ -484,6 +612,8 @@ bool radeon_get_bios(struct radeon_device *rdev) - - r = radeon_atrm_get_bios(rdev); - if (r == false) -+ r = radeon_acpi_vfct_bios(rdev); -+ if (r == false) - r = igp_read_bios_from_vram(rdev); - if (r == false) - r = radeon_read_bios(rdev); -diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c -index 17238f4..c84eb1a 100644 ---- a/drivers/gpu/drm/radeon/radeon_cs.c -+++ b/drivers/gpu/drm/radeon/radeon_cs.c -@@ -294,6 +294,28 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) - return 0; - } - -+static void radeon_bo_vm_fence_va(struct radeon_cs_parser *parser, -+ struct radeon_fence *fence) -+{ -+ struct radeon_fpriv *fpriv = parser->filp->driver_priv; -+ struct radeon_vm *vm = &fpriv->vm; -+ struct radeon_bo_list *lobj; -+ -+ if (parser->chunk_ib_idx == -1) -+ return; -+ if ((parser->cs_flags & RADEON_CS_USE_VM) == 0) -+ return; -+ -+ list_for_each_entry(lobj, &parser->validated, tv.head) { -+ struct radeon_bo_va *bo_va; -+ struct radeon_bo *rbo = lobj->bo; -+ -+ bo_va = radeon_bo_va(rbo, vm); -+ radeon_fence_unref(&bo_va->fence); -+ bo_va->fence = radeon_fence_ref(fence); -+ } -+} -+ - /** - * cs_parser_fini() - clean parser states - * @parser: parser structure holding parsing context. -@@ -306,11 +328,14 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error) - { - unsigned i; - -- if (!error) -+ if (!error) { -+ /* fence all bo va before ttm_eu_fence_buffer_objects so bo are still reserved */ -+ radeon_bo_vm_fence_va(parser, parser->ib.fence); - ttm_eu_fence_buffer_objects(&parser->validated, - parser->ib.fence); -- else -+ } else { - ttm_eu_backoff_reservation(&parser->validated); -+ } - - if (parser->relocs != NULL) { - for (i = 0; i < parser->nrelocs; i++) { -@@ -407,7 +432,6 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev, - - if (parser->chunk_ib_idx == -1) - return 0; -- - if ((parser->cs_flags & RADEON_CS_USE_VM) == 0) - return 0; - -diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c -index 066c98b..8867400 100644 ---- a/drivers/gpu/drm/radeon/radeon_device.c -+++ b/drivers/gpu/drm/radeon/radeon_device.c -@@ -774,7 +774,7 @@ int radeon_device_init(struct radeon_device *rdev, - if (rdev->flags & RADEON_IS_AGP) - rdev->need_dma32 = true; - if ((rdev->flags & RADEON_IS_PCI) && -- (rdev->family < CHIP_RS400)) -+ (rdev->family <= CHIP_RS740)) - rdev->need_dma32 = true; - - dma_bits = rdev->need_dma32 ? 32 : 40; -diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c -index 11f5f40..71298ce 100644 ---- a/drivers/gpu/drm/radeon/radeon_fence.c -+++ b/drivers/gpu/drm/radeon/radeon_fence.c -@@ -75,7 +75,7 @@ int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence *fence) - - void radeon_fence_process(struct radeon_device *rdev, int ring) - { -- uint64_t seq, last_seq; -+ uint64_t seq, last_seq, last_emitted; - unsigned count_loop = 0; - bool wake = false; - -@@ -102,13 +102,15 @@ void radeon_fence_process(struct radeon_device *rdev, int ring) - */ - last_seq = atomic64_read(&rdev->fence_drv[ring].last_seq); - do { -+ last_emitted = rdev->fence_drv[ring].seq; - seq = radeon_fence_read(rdev, ring); - seq |= last_seq & 0xffffffff00000000LL; - if (seq < last_seq) { -- seq += 0x100000000LL; -+ seq &= 0xffffffff; -+ seq |= last_emitted & 0xffffffff00000000LL; - } - -- if (seq == last_seq) { -+ if (seq <= last_seq || seq > last_emitted) { - break; - } - /* If we loop over we don't want to return without -diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c -index 84b648a..f651f22 100644 ---- a/drivers/gpu/drm/radeon/radeon_gart.c -+++ b/drivers/gpu/drm/radeon/radeon_gart.c -@@ -564,7 +564,7 @@ int radeon_vm_bo_update_pte(struct radeon_device *rdev, - return -EINVAL; - } - -- if (bo_va->valid) -+ if (bo_va->valid && mem) - return 0; - - ngpu_pages = radeon_bo_ngpu_pages(bo); -@@ -597,11 +597,27 @@ int radeon_vm_bo_rmv(struct radeon_device *rdev, - struct radeon_bo *bo) - { - struct radeon_bo_va *bo_va; -+ int r; - - bo_va = radeon_bo_va(bo, vm); - if (bo_va == NULL) - return 0; - -+ /* wait for va use to end */ -+ while (bo_va->fence) { -+ r = radeon_fence_wait(bo_va->fence, false); -+ if (r) { -+ DRM_ERROR("error while waiting for fence: %d\n", r); -+ } -+ if (r == -EDEADLK) { -+ r = radeon_gpu_reset(rdev); -+ if (!r) -+ continue; -+ } -+ break; -+ } -+ radeon_fence_unref(&bo_va->fence); -+ - radeon_mutex_lock(&rdev->cs_mutex); - mutex_lock(&vm->mutex); - radeon_vm_bo_update_pte(rdev, vm, bo, NULL); -@@ -661,12 +677,15 @@ void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm) - radeon_vm_unbind_locked(rdev, vm); - radeon_mutex_unlock(&rdev->cs_mutex); - -- /* remove all bo */ -+ /* remove all bo at this point non are busy any more because unbind -+ * waited for the last vm fence to signal -+ */ - r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); - if (!r) { - bo_va = radeon_bo_va(rdev->ring_tmp_bo.bo, vm); - list_del_init(&bo_va->bo_list); - list_del_init(&bo_va->vm_list); -+ radeon_fence_unref(&bo_va->fence); - radeon_bo_unreserve(rdev->ring_tmp_bo.bo); - kfree(bo_va); - } -@@ -678,6 +697,7 @@ void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm) - r = radeon_bo_reserve(bo_va->bo, false); - if (!r) { - list_del_init(&bo_va->bo_list); -+ radeon_fence_unref(&bo_va->fence); - radeon_bo_unreserve(bo_va->bo); - kfree(bo_va); - } -diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c -index 21ec9f5..12207d9 100644 ---- a/drivers/gpu/drm/radeon/radeon_gem.c -+++ b/drivers/gpu/drm/radeon/radeon_gem.c -@@ -134,25 +134,16 @@ void radeon_gem_object_close(struct drm_gem_object *obj, - struct radeon_device *rdev = rbo->rdev; - struct radeon_fpriv *fpriv = file_priv->driver_priv; - struct radeon_vm *vm = &fpriv->vm; -- struct radeon_bo_va *bo_va, *tmp; - - if (rdev->family < CHIP_CAYMAN) { - return; - } - - if (radeon_bo_reserve(rbo, false)) { -+ dev_err(rdev->dev, "leaking bo va because we fail to reserve bo\n"); - return; - } -- list_for_each_entry_safe(bo_va, tmp, &rbo->va, bo_list) { -- if (bo_va->vm == vm) { -- /* remove from this vm address space */ -- mutex_lock(&vm->mutex); -- list_del(&bo_va->vm_list); -- mutex_unlock(&vm->mutex); -- list_del(&bo_va->bo_list); -- kfree(bo_va); -- } -- } -+ radeon_vm_bo_rmv(rdev, vm, rbo); - radeon_bo_unreserve(rbo); - } - -diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c -index 830f1a7..1b2289f 100644 ---- a/drivers/gpu/drm/radeon/radeon_object.c -+++ b/drivers/gpu/drm/radeon/radeon_object.c -@@ -52,11 +52,7 @@ void radeon_bo_clear_va(struct radeon_bo *bo) - - list_for_each_entry_safe(bo_va, tmp, &bo->va, bo_list) { - /* remove from all vm address space */ -- mutex_lock(&bo_va->vm->mutex); -- list_del(&bo_va->vm_list); -- mutex_unlock(&bo_va->vm->mutex); -- list_del(&bo_va->bo_list); -- kfree(bo_va); -+ radeon_vm_bo_rmv(bo->rdev, bo_va->vm, bo); - } - } - -diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c -index 983658c..7843b36 100644 ---- a/drivers/gpu/drm/radeon/radeon_ring.c -+++ b/drivers/gpu/drm/radeon/radeon_ring.c -@@ -394,6 +394,7 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig - if (radeon_debugfs_ring_init(rdev, ring)) { - DRM_ERROR("Failed to register debugfs file for rings !\n"); - } -+ radeon_ring_lockup_update(ring); - return 0; - } - -diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c -index ba055e9..8d9dc44 100644 ---- a/drivers/gpu/drm/udl/udl_connector.c -+++ b/drivers/gpu/drm/udl/udl_connector.c -@@ -69,6 +69,13 @@ static int udl_get_modes(struct drm_connector *connector) - static int udl_mode_valid(struct drm_connector *connector, - struct drm_display_mode *mode) - { -+ struct udl_device *udl = connector->dev->dev_private; -+ if (!udl->sku_pixel_limit) -+ return 0; -+ -+ if (mode->vdisplay * mode->hdisplay > udl->sku_pixel_limit) -+ return MODE_VIRTUAL_Y; -+ - return 0; - } - -diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c -index 7279b3e..3a4b15a 100644 ---- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c -+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c -@@ -1159,6 +1159,11 @@ static struct drm_driver driver = { - .open = vmw_driver_open, - .preclose = vmw_preclose, - .postclose = vmw_postclose, -+ -+ .dumb_create = vmw_dumb_create, -+ .dumb_map_offset = vmw_dumb_map_offset, -+ .dumb_destroy = vmw_dumb_destroy, -+ - .fops = &vmwgfx_driver_fops, - .name = VMWGFX_DRIVER_NAME, - .desc = VMWGFX_DRIVER_DESC, -diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h -index d0f2c07..29c984f 100644 ---- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h -+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h -@@ -645,6 +645,16 @@ int vmw_kms_readback(struct vmw_private *dev_priv, - int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, - struct drm_file *file_priv); - -+int vmw_dumb_create(struct drm_file *file_priv, -+ struct drm_device *dev, -+ struct drm_mode_create_dumb *args); -+ -+int vmw_dumb_map_offset(struct drm_file *file_priv, -+ struct drm_device *dev, uint32_t handle, -+ uint64_t *offset); -+int vmw_dumb_destroy(struct drm_file *file_priv, -+ struct drm_device *dev, -+ uint32_t handle); - /** - * Overlay control - vmwgfx_overlay.c - */ -diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c -index f2fb8f1..7e07433 100644 ---- a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c -+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c -@@ -1018,7 +1018,7 @@ int vmw_event_fence_action_create(struct drm_file *file_priv, - } - - -- event = kzalloc(sizeof(event->event), GFP_KERNEL); -+ event = kzalloc(sizeof(*event), GFP_KERNEL); - if (unlikely(event == NULL)) { - DRM_ERROR("Failed to allocate an event.\n"); - ret = -ENOMEM; -diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c -index 22bf9a2..2c6ffe0 100644 ---- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c -+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c -@@ -1917,3 +1917,76 @@ err_ref: - vmw_resource_unreference(&res); - return ret; - } -+ -+ -+int vmw_dumb_create(struct drm_file *file_priv, -+ struct drm_device *dev, -+ struct drm_mode_create_dumb *args) -+{ -+ struct vmw_private *dev_priv = vmw_priv(dev); -+ struct vmw_master *vmaster = vmw_master(file_priv->master); -+ struct vmw_user_dma_buffer *vmw_user_bo; -+ struct ttm_buffer_object *tmp; -+ int ret; -+ -+ args->pitch = args->width * ((args->bpp + 7) / 8); -+ args->size = args->pitch * args->height; -+ -+ vmw_user_bo = kzalloc(sizeof(*vmw_user_bo), GFP_KERNEL); -+ if (vmw_user_bo == NULL) -+ return -ENOMEM; -+ -+ ret = ttm_read_lock(&vmaster->lock, true); -+ if (ret != 0) { -+ kfree(vmw_user_bo); -+ return ret; -+ } -+ -+ ret = vmw_dmabuf_init(dev_priv, &vmw_user_bo->dma, args->size, -+ &vmw_vram_sys_placement, true, -+ &vmw_user_dmabuf_destroy); -+ if (ret != 0) -+ goto out_no_dmabuf; -+ -+ tmp = ttm_bo_reference(&vmw_user_bo->dma.base); -+ ret = ttm_base_object_init(vmw_fpriv(file_priv)->tfile, -+ &vmw_user_bo->base, -+ false, -+ ttm_buffer_type, -+ &vmw_user_dmabuf_release, NULL); -+ if (unlikely(ret != 0)) -+ goto out_no_base_object; -+ -+ args->handle = vmw_user_bo->base.hash.key; -+ -+out_no_base_object: -+ ttm_bo_unref(&tmp); -+out_no_dmabuf: -+ ttm_read_unlock(&vmaster->lock); -+ return ret; -+} -+ -+int vmw_dumb_map_offset(struct drm_file *file_priv, -+ struct drm_device *dev, uint32_t handle, -+ uint64_t *offset) -+{ -+ struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile; -+ struct vmw_dma_buffer *out_buf; -+ int ret; -+ -+ ret = vmw_user_dmabuf_lookup(tfile, handle, &out_buf); -+ if (ret != 0) -+ return -EINVAL; -+ -+ *offset = out_buf->base.addr_space_offset; -+ vmw_dmabuf_unreference(&out_buf); -+ return 0; -+} -+ -+int vmw_dumb_destroy(struct drm_file *file_priv, -+ struct drm_device *dev, -+ uint32_t handle) -+{ -+ return ttm_ref_object_base_unref(vmw_fpriv(file_priv)->tfile, -+ handle, TTM_REF_USAGE); -+} -diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c -index 0f9c146..9500f2f 100644 ---- a/drivers/hid/hid-logitech-dj.c -+++ b/drivers/hid/hid-logitech-dj.c -@@ -193,6 +193,7 @@ static struct hid_ll_driver logi_dj_ll_driver; - static int logi_dj_output_hidraw_report(struct hid_device *hid, u8 * buf, - size_t count, - unsigned char report_type); -+static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev); - - static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev, - struct dj_report *dj_report) -@@ -233,6 +234,7 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev, - if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] & - SPFUNCTION_DEVICE_LIST_EMPTY) { - dbg_hid("%s: device list is empty\n", __func__); -+ djrcv_dev->querying_devices = false; - return; - } - -@@ -243,6 +245,12 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev, - return; - } - -+ if (djrcv_dev->paired_dj_devices[dj_report->device_index]) { -+ /* The device is already known. No need to reallocate it. */ -+ dbg_hid("%s: device is already known\n", __func__); -+ return; -+ } -+ - dj_hiddev = hid_allocate_device(); - if (IS_ERR(dj_hiddev)) { - dev_err(&djrcv_hdev->dev, "%s: hid_allocate_device failed\n", -@@ -306,6 +314,7 @@ static void delayedwork_callback(struct work_struct *work) - struct dj_report dj_report; - unsigned long flags; - int count; -+ int retval; - - dbg_hid("%s\n", __func__); - -@@ -338,6 +347,25 @@ static void delayedwork_callback(struct work_struct *work) - logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report); - break; - default: -+ /* A normal report (i. e. not belonging to a pair/unpair notification) -+ * arriving here, means that the report arrived but we did not have a -+ * paired dj_device associated to the report's device_index, this -+ * means that the original "device paired" notification corresponding -+ * to this dj_device never arrived to this driver. The reason is that -+ * hid-core discards all packets coming from a device while probe() is -+ * executing. */ -+ if (!djrcv_dev->paired_dj_devices[dj_report.device_index]) { -+ /* ok, we don't know the device, just re-ask the -+ * receiver for the list of connected devices. */ -+ retval = logi_dj_recv_query_paired_devices(djrcv_dev); -+ if (!retval) { -+ /* everything went fine, so just leave */ -+ break; -+ } -+ dev_err(&djrcv_dev->hdev->dev, -+ "%s:logi_dj_recv_query_paired_devices " -+ "error:%d\n", __func__, retval); -+ } - dbg_hid("%s: unexpected report type\n", __func__); - } - } -@@ -368,6 +396,12 @@ static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev, - if (!djdev) { - dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]" - " is NULL, index %d\n", dj_report->device_index); -+ kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report)); -+ -+ if (schedule_work(&djrcv_dev->work) == 0) { -+ dbg_hid("%s: did not schedule the work item, was already " -+ "queued\n", __func__); -+ } - return; - } - -@@ -398,6 +432,12 @@ static void logi_dj_recv_forward_report(struct dj_receiver_dev *djrcv_dev, - if (dj_device == NULL) { - dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]" - " is NULL, index %d\n", dj_report->device_index); -+ kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report)); -+ -+ if (schedule_work(&djrcv_dev->work) == 0) { -+ dbg_hid("%s: did not schedule the work item, was already " -+ "queued\n", __func__); -+ } - return; - } - -@@ -439,7 +479,11 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) - struct dj_report *dj_report; - int retval; - -- dj_report = kzalloc(sizeof(dj_report), GFP_KERNEL); -+ /* no need to protect djrcv_dev->querying_devices */ -+ if (djrcv_dev->querying_devices) -+ return 0; -+ -+ dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL); - if (!dj_report) - return -ENOMEM; - dj_report->report_id = REPORT_ID_DJ_SHORT; -@@ -450,13 +494,14 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) - return retval; - } - -+ - static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, - unsigned timeout) - { - struct dj_report *dj_report; - int retval; - -- dj_report = kzalloc(sizeof(dj_report), GFP_KERNEL); -+ dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL); - if (!dj_report) - return -ENOMEM; - dj_report->report_id = REPORT_ID_DJ_SHORT; -diff --git a/drivers/hid/hid-logitech-dj.h b/drivers/hid/hid-logitech-dj.h -index fd28a5e..4a40003 100644 ---- a/drivers/hid/hid-logitech-dj.h -+++ b/drivers/hid/hid-logitech-dj.h -@@ -101,6 +101,7 @@ struct dj_receiver_dev { - struct work_struct work; - struct kfifo notif_fifo; - spinlock_t lock; -+ bool querying_devices; - }; - - struct dj_device { -diff --git a/drivers/hwmon/ad7314.c b/drivers/hwmon/ad7314.c -index cfec802..f915eb1 100644 ---- a/drivers/hwmon/ad7314.c -+++ b/drivers/hwmon/ad7314.c -@@ -87,10 +87,18 @@ static ssize_t ad7314_show_temperature(struct device *dev, - } - } - -+static ssize_t ad7314_show_name(struct device *dev, -+ struct device_attribute *devattr, char *buf) -+{ -+ return sprintf(buf, "%s\n", to_spi_device(dev)->modalias); -+} -+ -+static DEVICE_ATTR(name, S_IRUGO, ad7314_show_name, NULL); - static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, - ad7314_show_temperature, NULL, 0); - - static struct attribute *ad7314_attributes[] = { -+ &dev_attr_name.attr, - &sensor_dev_attr_temp1_input.dev_attr.attr, - NULL, - }; -diff --git a/drivers/hwmon/ads7871.c b/drivers/hwmon/ads7871.c -index e65c6e4..7bf4ce3 100644 ---- a/drivers/hwmon/ads7871.c -+++ b/drivers/hwmon/ads7871.c -@@ -139,6 +139,12 @@ static ssize_t show_voltage(struct device *dev, - } - } - -+static ssize_t ads7871_show_name(struct device *dev, -+ struct device_attribute *devattr, char *buf) -+{ -+ return sprintf(buf, "%s\n", to_spi_device(dev)->modalias); -+} -+ - static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_voltage, NULL, 0); - static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_voltage, NULL, 1); - static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_voltage, NULL, 2); -@@ -148,6 +154,8 @@ static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_voltage, NULL, 5); - static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_voltage, NULL, 6); - static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_voltage, NULL, 7); - -+static DEVICE_ATTR(name, S_IRUGO, ads7871_show_name, NULL); -+ - static struct attribute *ads7871_attributes[] = { - &sensor_dev_attr_in0_input.dev_attr.attr, - &sensor_dev_attr_in1_input.dev_attr.attr, -@@ -157,6 +165,7 @@ static struct attribute *ads7871_attributes[] = { - &sensor_dev_attr_in5_input.dev_attr.attr, - &sensor_dev_attr_in6_input.dev_attr.attr, - &sensor_dev_attr_in7_input.dev_attr.attr, -+ &dev_attr_name.attr, - NULL - }; - -diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c -index 6b13f1a..49dadf4 100644 ---- a/drivers/hwmon/fam15h_power.c -+++ b/drivers/hwmon/fam15h_power.c -@@ -128,12 +128,12 @@ static bool __devinit fam15h_power_is_internal_node0(struct pci_dev *f4) - * counter saturations resulting in bogus power readings. - * We correct this value ourselves to cope with older BIOSes. - */ --static DEFINE_PCI_DEVICE_TABLE(affected_device) = { -+static const struct pci_device_id affected_device[] = { - { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_NB_F4) }, - { 0 } - }; - --static void __devinit tweak_runavg_range(struct pci_dev *pdev) -+static void tweak_runavg_range(struct pci_dev *pdev) - { - u32 val; - -@@ -157,6 +157,16 @@ static void __devinit tweak_runavg_range(struct pci_dev *pdev) - REG_TDP_RUNNING_AVERAGE, val); - } - -+#ifdef CONFIG_PM -+static int fam15h_power_resume(struct pci_dev *pdev) -+{ -+ tweak_runavg_range(pdev); -+ return 0; -+} -+#else -+#define fam15h_power_resume NULL -+#endif -+ - static void __devinit fam15h_power_init_data(struct pci_dev *f4, - struct fam15h_power_data *data) - { -@@ -255,6 +265,7 @@ static struct pci_driver fam15h_power_driver = { - .id_table = fam15h_power_id_table, - .probe = fam15h_power_probe, - .remove = __devexit_p(fam15h_power_remove), -+ .resume = fam15h_power_resume, - }; - - module_pci_driver(fam15h_power_driver); -diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c -index 7f3f4a3..6021482 100644 ---- a/drivers/hwmon/ina2xx.c -+++ b/drivers/hwmon/ina2xx.c -@@ -69,22 +69,6 @@ struct ina2xx_data { - u16 regs[INA2XX_MAX_REGISTERS]; - }; - --int ina2xx_read_word(struct i2c_client *client, int reg) --{ -- int val = i2c_smbus_read_word_data(client, reg); -- if (unlikely(val < 0)) { -- dev_dbg(&client->dev, -- "Failed to read register: %d\n", reg); -- return val; -- } -- return be16_to_cpu(val); --} -- --void ina2xx_write_word(struct i2c_client *client, int reg, int data) --{ -- i2c_smbus_write_word_data(client, reg, cpu_to_be16(data)); --} -- - static struct ina2xx_data *ina2xx_update_device(struct device *dev) - { - struct i2c_client *client = to_i2c_client(dev); -@@ -102,7 +86,7 @@ static struct ina2xx_data *ina2xx_update_device(struct device *dev) - - /* Read all registers */ - for (i = 0; i < data->registers; i++) { -- int rv = ina2xx_read_word(client, i); -+ int rv = i2c_smbus_read_word_swapped(client, i); - if (rv < 0) { - ret = ERR_PTR(rv); - goto abort; -@@ -279,22 +263,26 @@ static int ina2xx_probe(struct i2c_client *client, - switch (data->kind) { - case ina219: - /* device configuration */ -- ina2xx_write_word(client, INA2XX_CONFIG, INA219_CONFIG_DEFAULT); -+ i2c_smbus_write_word_swapped(client, INA2XX_CONFIG, -+ INA219_CONFIG_DEFAULT); - - /* set current LSB to 1mA, shunt is in uOhms */ - /* (equation 13 in datasheet) */ -- ina2xx_write_word(client, INA2XX_CALIBRATION, 40960000 / shunt); -+ i2c_smbus_write_word_swapped(client, INA2XX_CALIBRATION, -+ 40960000 / shunt); - dev_info(&client->dev, - "power monitor INA219 (Rshunt = %li uOhm)\n", shunt); - data->registers = INA219_REGISTERS; - break; - case ina226: - /* device configuration */ -- ina2xx_write_word(client, INA2XX_CONFIG, INA226_CONFIG_DEFAULT); -+ i2c_smbus_write_word_swapped(client, INA2XX_CONFIG, -+ INA226_CONFIG_DEFAULT); - - /* set current LSB to 1mA, shunt is in uOhms */ - /* (equation 1 in datasheet)*/ -- ina2xx_write_word(client, INA2XX_CALIBRATION, 5120000 / shunt); -+ i2c_smbus_write_word_swapped(client, INA2XX_CALIBRATION, -+ 5120000 / shunt); - dev_info(&client->dev, - "power monitor INA226 (Rshunt = %li uOhm)\n", shunt); - data->registers = INA226_REGISTERS; -diff --git a/drivers/hwmon/twl4030-madc-hwmon.c b/drivers/hwmon/twl4030-madc-hwmon.c -index 0018c7d..1a174f0 100644 ---- a/drivers/hwmon/twl4030-madc-hwmon.c -+++ b/drivers/hwmon/twl4030-madc-hwmon.c -@@ -44,12 +44,13 @@ static ssize_t madc_read(struct device *dev, - struct device_attribute *devattr, char *buf) - { - struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); -- struct twl4030_madc_request req; -+ struct twl4030_madc_request req = { -+ .channels = 1 << attr->index, -+ .method = TWL4030_MADC_SW2, -+ .type = TWL4030_MADC_WAIT, -+ }; - long val; - -- req.channels = (1 << attr->index); -- req.method = TWL4030_MADC_SW2; -- req.func_cb = NULL; - val = twl4030_madc_conversion(&req); - if (val < 0) - return val; -diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c -index 31c47e1..5285f85 100644 ---- a/drivers/i2c/busses/i2c-powermac.c -+++ b/drivers/i2c/busses/i2c-powermac.c -@@ -227,28 +227,138 @@ static int __devexit i2c_powermac_remove(struct platform_device *dev) - return 0; - } - -+static u32 __devinit i2c_powermac_get_addr(struct i2c_adapter *adap, -+ struct pmac_i2c_bus *bus, -+ struct device_node *node) -+{ -+ const __be32 *prop; -+ int len; -+ -+ /* First check for valid "reg" */ -+ prop = of_get_property(node, "reg", &len); -+ if (prop && (len >= sizeof(int))) -+ return (be32_to_cpup(prop) & 0xff) >> 1; -+ -+ /* Then check old-style "i2c-address" */ -+ prop = of_get_property(node, "i2c-address", &len); -+ if (prop && (len >= sizeof(int))) -+ return (be32_to_cpup(prop) & 0xff) >> 1; -+ -+ /* Now handle some devices with missing "reg" properties */ -+ if (!strcmp(node->name, "cereal")) -+ return 0x60; -+ else if (!strcmp(node->name, "deq")) -+ return 0x34; -+ -+ dev_warn(&adap->dev, "No i2c address for %s\n", node->full_name); -+ -+ return 0xffffffff; -+} -+ -+static void __devinit i2c_powermac_create_one(struct i2c_adapter *adap, -+ const char *type, -+ u32 addr) -+{ -+ struct i2c_board_info info = {}; -+ struct i2c_client *newdev; -+ -+ strncpy(info.type, type, sizeof(info.type)); -+ info.addr = addr; -+ newdev = i2c_new_device(adap, &info); -+ if (!newdev) -+ dev_err(&adap->dev, -+ "i2c-powermac: Failure to register missing %s\n", -+ type); -+} -+ -+static void __devinit i2c_powermac_add_missing(struct i2c_adapter *adap, -+ struct pmac_i2c_bus *bus, -+ bool found_onyx) -+{ -+ struct device_node *busnode = pmac_i2c_get_bus_node(bus); -+ int rc; -+ -+ /* Check for the onyx audio codec */ -+#define ONYX_REG_CONTROL 67 -+ if (of_device_is_compatible(busnode, "k2-i2c") && !found_onyx) { -+ union i2c_smbus_data data; -+ -+ rc = i2c_smbus_xfer(adap, 0x46, 0, I2C_SMBUS_READ, -+ ONYX_REG_CONTROL, I2C_SMBUS_BYTE_DATA, -+ &data); -+ if (rc >= 0) -+ i2c_powermac_create_one(adap, "MAC,pcm3052", 0x46); -+ -+ rc = i2c_smbus_xfer(adap, 0x47, 0, I2C_SMBUS_READ, -+ ONYX_REG_CONTROL, I2C_SMBUS_BYTE_DATA, -+ &data); -+ if (rc >= 0) -+ i2c_powermac_create_one(adap, "MAC,pcm3052", 0x47); -+ } -+} -+ -+static bool __devinit i2c_powermac_get_type(struct i2c_adapter *adap, -+ struct device_node *node, -+ u32 addr, char *type, int type_size) -+{ -+ char tmp[16]; -+ -+ /* Note: we to _NOT_ want the standard -+ * i2c drivers to match with any of our powermac stuff -+ * unless they have been specifically modified to handle -+ * it on a case by case basis. For example, for thermal -+ * control, things like lm75 etc... shall match with their -+ * corresponding windfarm drivers, _NOT_ the generic ones, -+ * so we force a prefix of AAPL, onto the modalias to -+ * make that happen -+ */ -+ -+ /* First try proper modalias */ -+ if (of_modalias_node(node, tmp, sizeof(tmp)) >= 0) { -+ snprintf(type, type_size, "MAC,%s", tmp); -+ return true; -+ } -+ -+ /* Now look for known workarounds */ -+ if (!strcmp(node->name, "deq")) { -+ /* Apple uses address 0x34 for TAS3001 and 0x35 for TAS3004 */ -+ if (addr == 0x34) { -+ snprintf(type, type_size, "MAC,tas3001"); -+ return true; -+ } else if (addr == 0x35) { -+ snprintf(type, type_size, "MAC,tas3004"); -+ return true; -+ } -+ } -+ -+ dev_err(&adap->dev, "i2c-powermac: modalias failure" -+ " on %s\n", node->full_name); -+ return false; -+} -+ - static void __devinit i2c_powermac_register_devices(struct i2c_adapter *adap, - struct pmac_i2c_bus *bus) - { - struct i2c_client *newdev; - struct device_node *node; -+ bool found_onyx = 0; -+ -+ /* -+ * In some cases we end up with the via-pmu node itself, in this -+ * case we skip this function completely as the device-tree will -+ * not contain anything useful. -+ */ -+ if (!strcmp(adap->dev.of_node->name, "via-pmu")) -+ return; - - for_each_child_of_node(adap->dev.of_node, node) { - struct i2c_board_info info = {}; -- struct dev_archdata dev_ad = {}; -- const __be32 *reg; -- char tmp[16]; - u32 addr; -- int len; - - /* Get address & channel */ -- reg = of_get_property(node, "reg", &len); -- if (!reg || (len < sizeof(int))) { -- dev_err(&adap->dev, "i2c-powermac: invalid reg on %s\n", -- node->full_name); -+ addr = i2c_powermac_get_addr(adap, bus, node); -+ if (addr == 0xffffffff) - continue; -- } -- addr = be32_to_cpup(reg); - - /* Multibus setup, check channel */ - if (!pmac_i2c_match_adapter(node, adap)) -@@ -257,27 +367,23 @@ static void __devinit i2c_powermac_register_devices(struct i2c_adapter *adap, - dev_dbg(&adap->dev, "i2c-powermac: register %s\n", - node->full_name); - -- /* Make up a modalias. Note: we to _NOT_ want the standard -- * i2c drivers to match with any of our powermac stuff -- * unless they have been specifically modified to handle -- * it on a case by case basis. For example, for thermal -- * control, things like lm75 etc... shall match with their -- * corresponding windfarm drivers, _NOT_ the generic ones, -- * so we force a prefix of AAPL, onto the modalias to -- * make that happen -+ /* -+ * Keep track of some device existence to handle -+ * workarounds later. - */ -- if (of_modalias_node(node, tmp, sizeof(tmp)) < 0) { -- dev_err(&adap->dev, "i2c-powermac: modalias failure" -- " on %s\n", node->full_name); -+ if (of_device_is_compatible(node, "pcm3052")) -+ found_onyx = true; -+ -+ /* Make up a modalias */ -+ if (!i2c_powermac_get_type(adap, node, addr, -+ info.type, sizeof(info.type))) { - continue; - } -- snprintf(info.type, sizeof(info.type), "MAC,%s", tmp); - - /* Fill out the rest of the info structure */ -- info.addr = (addr & 0xff) >> 1; -+ info.addr = addr; - info.irq = irq_of_parse_and_map(node, 0); - info.of_node = of_node_get(node); -- info.archdata = &dev_ad; - - newdev = i2c_new_device(adap, &info); - if (!newdev) { -@@ -292,6 +398,9 @@ static void __devinit i2c_powermac_register_devices(struct i2c_adapter *adap, - continue; - } - } -+ -+ /* Additional workarounds */ -+ i2c_powermac_add_missing(adap, bus, found_onyx); - } - - static int __devinit i2c_powermac_probe(struct platform_device *dev) -diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h -index 6918773..d6cc77a 100644 ---- a/drivers/input/serio/i8042-x86ia64io.h -+++ b/drivers/input/serio/i8042-x86ia64io.h -@@ -335,6 +335,12 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { - }, - { - .matches = { -+ DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), -+ DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"), -+ }, -+ }, -+ { -+ .matches = { - DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"), - DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"), - }, -diff --git a/drivers/input/tablet/wacom_sys.c b/drivers/input/tablet/wacom_sys.c -index 8b31473..824abc7 100644 ---- a/drivers/input/tablet/wacom_sys.c -+++ b/drivers/input/tablet/wacom_sys.c -@@ -445,8 +445,7 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat - /* ask to report Wacom data */ - if (features->device_type == BTN_TOOL_FINGER) { - /* if it is an MT Tablet PC touch */ -- if (features->type == TABLETPC2FG || -- features->type == MTSCREEN) { -+ if (features->type > TABLETPC) { - do { - rep_data[0] = 3; - rep_data[1] = 4; -@@ -465,7 +464,7 @@ static int wacom_query_tablet_data(struct usb_interface *intf, struct wacom_feat - } while ((error < 0 || rep_data[1] != 4) && - limit++ < WAC_MSG_RETRIES); - } -- } else if (features->type != TABLETPC && -+ } else if (features->type <= BAMBOO_PT && - features->type != WIRELESS && - features->device_type == BTN_TOOL_PEN) { - do { -@@ -515,10 +514,7 @@ static int wacom_retrieve_hid_descriptor(struct usb_interface *intf, - } - - /* only devices that support touch need to retrieve the info */ -- if (features->type != TABLETPC && -- features->type != TABLETPC2FG && -- features->type != BAMBOO_PT && -- features->type != MTSCREEN) { -+ if (features->type < BAMBOO_PT) { - goto out; - } - -diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c -index 869e057..05e8cb3 100644 ---- a/drivers/input/tablet/wacom_wac.c -+++ b/drivers/input/tablet/wacom_wac.c -@@ -464,7 +464,7 @@ static void wacom_intuos_general(struct wacom_wac *wacom) - t = (data[6] << 2) | ((data[7] >> 6) & 3); - if ((features->type >= INTUOS4S && features->type <= INTUOS4L) || - (features->type >= INTUOS5S && features->type <= INTUOS5L) || -- features->type == WACOM_21UX2 || features->type == WACOM_24HD) { -+ (features->type >= WACOM_21UX2 && features->type <= WACOM_24HD)) { - t = (t << 1) | (data[1] & 1); - } - input_report_abs(input, ABS_PRESSURE, t); -@@ -614,7 +614,7 @@ static int wacom_intuos_irq(struct wacom_wac *wacom) - input_report_abs(input, ABS_MISC, 0); - } - } else { -- if (features->type == WACOM_21UX2) { -+ if (features->type == WACOM_21UX2 || features->type == WACOM_22HD) { - input_report_key(input, BTN_0, (data[5] & 0x01)); - input_report_key(input, BTN_1, (data[6] & 0x01)); - input_report_key(input, BTN_2, (data[6] & 0x02)); -@@ -633,6 +633,12 @@ static int wacom_intuos_irq(struct wacom_wac *wacom) - input_report_key(input, BTN_Z, (data[8] & 0x20)); - input_report_key(input, BTN_BASE, (data[8] & 0x40)); - input_report_key(input, BTN_BASE2, (data[8] & 0x80)); -+ -+ if (features->type == WACOM_22HD) { -+ input_report_key(input, KEY_PROG1, data[9] & 0x01); -+ input_report_key(input, KEY_PROG2, data[9] & 0x02); -+ input_report_key(input, KEY_PROG3, data[9] & 0x04); -+ } - } else { - input_report_key(input, BTN_0, (data[5] & 0x01)); - input_report_key(input, BTN_1, (data[5] & 0x02)); -@@ -1230,6 +1236,7 @@ void wacom_wac_irq(struct wacom_wac *wacom_wac, size_t len) - case CINTIQ: - case WACOM_BEE: - case WACOM_21UX2: -+ case WACOM_22HD: - case WACOM_24HD: - sync = wacom_intuos_irq(wacom_wac); - break; -@@ -1317,10 +1324,8 @@ void wacom_setup_device_quirks(struct wacom_features *features) - } - - /* these device have multiple inputs */ -- if (features->type == TABLETPC || features->type == TABLETPC2FG || -- features->type == BAMBOO_PT || features->type == WIRELESS || -- (features->type >= INTUOS5S && features->type <= INTUOS5L) || -- features->type == MTSCREEN) -+ if (features->type >= WIRELESS || -+ (features->type >= INTUOS5S && features->type <= INTUOS5L)) - features->quirks |= WACOM_QUIRK_MULTI_INPUT; - - /* quirk for bamboo touch with 2 low res touches */ -@@ -1432,6 +1437,12 @@ int wacom_setup_input_capabilities(struct input_dev *input_dev, - wacom_setup_cintiq(wacom_wac); - break; - -+ case WACOM_22HD: -+ __set_bit(KEY_PROG1, input_dev->keybit); -+ __set_bit(KEY_PROG2, input_dev->keybit); -+ __set_bit(KEY_PROG3, input_dev->keybit); -+ /* fall through */ -+ - case WACOM_21UX2: - __set_bit(BTN_A, input_dev->keybit); - __set_bit(BTN_B, input_dev->keybit); -@@ -1855,6 +1866,9 @@ static const struct wacom_features wacom_features_0xF0 = - static const struct wacom_features wacom_features_0xCC = - { "Wacom Cintiq 21UX2", WACOM_PKGLEN_INTUOS, 87200, 65600, 2047, - 63, WACOM_21UX2, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; -+static const struct wacom_features wacom_features_0xFA = -+ { "Wacom Cintiq 22HD", WACOM_PKGLEN_INTUOS, 95840, 54260, 2047, -+ 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; - static const struct wacom_features wacom_features_0x90 = - { "Wacom ISDv4 90", WACOM_PKGLEN_GRAPHIRE, 26202, 16325, 255, - 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; -@@ -2064,6 +2078,7 @@ const struct usb_device_id wacom_ids[] = { - { USB_DEVICE_WACOM(0xEC) }, - { USB_DEVICE_WACOM(0x47) }, - { USB_DEVICE_WACOM(0xF4) }, -+ { USB_DEVICE_WACOM(0xFA) }, - { USB_DEVICE_LENOVO(0x6004) }, - { } - }; -diff --git a/drivers/input/tablet/wacom_wac.h b/drivers/input/tablet/wacom_wac.h -index 78fbd3f..9ae9118 100644 ---- a/drivers/input/tablet/wacom_wac.h -+++ b/drivers/input/tablet/wacom_wac.h -@@ -62,8 +62,6 @@ enum { - PTU, - PL, - DTU, -- BAMBOO_PT, -- WIRELESS, - INTUOS, - INTUOS3S, - INTUOS3, -@@ -74,12 +72,15 @@ enum { - INTUOS5S, - INTUOS5, - INTUOS5L, -- WACOM_24HD, - WACOM_21UX2, -+ WACOM_22HD, -+ WACOM_24HD, - CINTIQ, - WACOM_BEE, - WACOM_MO, -- TABLETPC, -+ WIRELESS, -+ BAMBOO_PT, -+ TABLETPC, /* add new TPC below */ - TABLETPC2FG, - MTSCREEN, - MAX_TYPE -diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c -index 6d34706..55fe60d 100644 ---- a/drivers/iommu/intel_irq_remapping.c -+++ b/drivers/iommu/intel_irq_remapping.c -@@ -736,6 +736,7 @@ int __init parse_ioapics_under_ir(void) - { - struct dmar_drhd_unit *drhd; - int ir_supported = 0; -+ int ioapic_idx; - - for_each_drhd_unit(drhd) { - struct intel_iommu *iommu = drhd->iommu; -@@ -748,13 +749,20 @@ int __init parse_ioapics_under_ir(void) - } - } - -- if (ir_supported && ir_ioapic_num != nr_ioapics) { -- printk(KERN_WARNING -- "Not all IO-APIC's listed under remapping hardware\n"); -- return -1; -+ if (!ir_supported) -+ return 0; -+ -+ for (ioapic_idx = 0; ioapic_idx < nr_ioapics; ioapic_idx++) { -+ int ioapic_id = mpc_ioapic_id(ioapic_idx); -+ if (!map_ioapic_to_ir(ioapic_id)) { -+ pr_err(FW_BUG "ioapic %d has no mapping iommu, " -+ "interrupt remapping will be disabled\n", -+ ioapic_id); -+ return -1; -+ } - } - -- return ir_supported; -+ return 1; - } - - int __init ir_dev_scope_init(void) -diff --git a/drivers/isdn/hardware/mISDN/avmfritz.c b/drivers/isdn/hardware/mISDN/avmfritz.c -index fa6ca47..dceaec8 100644 ---- a/drivers/isdn/hardware/mISDN/avmfritz.c -+++ b/drivers/isdn/hardware/mISDN/avmfritz.c -@@ -857,8 +857,9 @@ avm_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) - switch (cmd) { - case CLOSE_CHANNEL: - test_and_clear_bit(FLG_OPEN, &bch->Flags); -+ cancel_work_sync(&bch->workq); - spin_lock_irqsave(&fc->lock, flags); -- mISDN_freebchannel(bch); -+ mISDN_clear_bchannel(bch); - modehdlc(bch, ISDN_P_NONE); - spin_unlock_irqrestore(&fc->lock, flags); - ch->protocol = ISDN_P_NONE; -diff --git a/drivers/isdn/hardware/mISDN/mISDNipac.c b/drivers/isdn/hardware/mISDN/mISDNipac.c -index 752e082..ccd7d85 100644 ---- a/drivers/isdn/hardware/mISDN/mISDNipac.c -+++ b/drivers/isdn/hardware/mISDN/mISDNipac.c -@@ -1406,8 +1406,9 @@ hscx_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) - switch (cmd) { - case CLOSE_CHANNEL: - test_and_clear_bit(FLG_OPEN, &bch->Flags); -+ cancel_work_sync(&bch->workq); - spin_lock_irqsave(hx->ip->hwlock, flags); -- mISDN_freebchannel(bch); -+ mISDN_clear_bchannel(bch); - hscx_mode(hx, ISDN_P_NONE); - spin_unlock_irqrestore(hx->ip->hwlock, flags); - ch->protocol = ISDN_P_NONE; -diff --git a/drivers/isdn/hardware/mISDN/mISDNisar.c b/drivers/isdn/hardware/mISDN/mISDNisar.c -index be5973d..182ecf0 100644 ---- a/drivers/isdn/hardware/mISDN/mISDNisar.c -+++ b/drivers/isdn/hardware/mISDN/mISDNisar.c -@@ -1588,8 +1588,9 @@ isar_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) - switch (cmd) { - case CLOSE_CHANNEL: - test_and_clear_bit(FLG_OPEN, &bch->Flags); -+ cancel_work_sync(&bch->workq); - spin_lock_irqsave(ich->is->hwlock, flags); -- mISDN_freebchannel(bch); -+ mISDN_clear_bchannel(bch); - modeisar(ich, ISDN_P_NONE); - spin_unlock_irqrestore(ich->is->hwlock, flags); - ch->protocol = ISDN_P_NONE; -diff --git a/drivers/isdn/hardware/mISDN/netjet.c b/drivers/isdn/hardware/mISDN/netjet.c -index c3e3e76..9bcade5 100644 ---- a/drivers/isdn/hardware/mISDN/netjet.c -+++ b/drivers/isdn/hardware/mISDN/netjet.c -@@ -812,8 +812,9 @@ nj_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) - switch (cmd) { - case CLOSE_CHANNEL: - test_and_clear_bit(FLG_OPEN, &bch->Flags); -+ cancel_work_sync(&bch->workq); - spin_lock_irqsave(&card->lock, flags); -- mISDN_freebchannel(bch); -+ mISDN_clear_bchannel(bch); - mode_tiger(bc, ISDN_P_NONE); - spin_unlock_irqrestore(&card->lock, flags); - ch->protocol = ISDN_P_NONE; -diff --git a/drivers/isdn/hardware/mISDN/w6692.c b/drivers/isdn/hardware/mISDN/w6692.c -index 26a86b8..335fe64 100644 ---- a/drivers/isdn/hardware/mISDN/w6692.c -+++ b/drivers/isdn/hardware/mISDN/w6692.c -@@ -1054,8 +1054,9 @@ w6692_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) - switch (cmd) { - case CLOSE_CHANNEL: - test_and_clear_bit(FLG_OPEN, &bch->Flags); -+ cancel_work_sync(&bch->workq); - spin_lock_irqsave(&card->lock, flags); -- mISDN_freebchannel(bch); -+ mISDN_clear_bchannel(bch); - w6692_mode(bc, ISDN_P_NONE); - spin_unlock_irqrestore(&card->lock, flags); - ch->protocol = ISDN_P_NONE; -diff --git a/drivers/isdn/isdnloop/isdnloop.c b/drivers/isdn/isdnloop/isdnloop.c -index 5405ec6..baf2686 100644 ---- a/drivers/isdn/isdnloop/isdnloop.c -+++ b/drivers/isdn/isdnloop/isdnloop.c -@@ -16,7 +16,6 @@ - #include <linux/sched.h> - #include "isdnloop.h" - --static char *revision = "$Revision: 1.11.6.7 $"; - static char *isdnloop_id = "loop0"; - - MODULE_DESCRIPTION("ISDN4Linux: Pseudo Driver that simulates an ISDN card"); -@@ -1494,17 +1493,6 @@ isdnloop_addcard(char *id1) - static int __init - isdnloop_init(void) - { -- char *p; -- char rev[10]; -- -- if ((p = strchr(revision, ':'))) { -- strcpy(rev, p + 1); -- p = strchr(rev, '$'); -- *p = 0; -- } else -- strcpy(rev, " ??? "); -- printk(KERN_NOTICE "isdnloop-ISDN-driver Rev%s\n", rev); -- - if (isdnloop_id) - return (isdnloop_addcard(isdnloop_id)); - -diff --git a/drivers/isdn/mISDN/hwchannel.c b/drivers/isdn/mISDN/hwchannel.c -index ef34fd4..2602be2 100644 ---- a/drivers/isdn/mISDN/hwchannel.c -+++ b/drivers/isdn/mISDN/hwchannel.c -@@ -148,17 +148,16 @@ mISDN_clear_bchannel(struct bchannel *ch) - ch->next_minlen = ch->init_minlen; - ch->maxlen = ch->init_maxlen; - ch->next_maxlen = ch->init_maxlen; -+ skb_queue_purge(&ch->rqueue); -+ ch->rcount = 0; - } - EXPORT_SYMBOL(mISDN_clear_bchannel); - --int -+void - mISDN_freebchannel(struct bchannel *ch) - { -+ cancel_work_sync(&ch->workq); - mISDN_clear_bchannel(ch); -- skb_queue_purge(&ch->rqueue); -- ch->rcount = 0; -- flush_work_sync(&ch->workq); -- return 0; - } - EXPORT_SYMBOL(mISDN_freebchannel); - -diff --git a/drivers/md/md.c b/drivers/md/md.c -index d5ab449..6fc0c26 100644 ---- a/drivers/md/md.c -+++ b/drivers/md/md.c -@@ -1157,8 +1157,11 @@ static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor - ret = 0; - } - rdev->sectors = rdev->sb_start; -- /* Limit to 4TB as metadata cannot record more than that */ -- if (rdev->sectors >= (2ULL << 32)) -+ /* Limit to 4TB as metadata cannot record more than that. -+ * (not needed for Linear and RAID0 as metadata doesn't -+ * record this size) -+ */ -+ if (rdev->sectors >= (2ULL << 32) && sb->level >= 1) - rdev->sectors = (2ULL << 32) - 2; - - if (rdev->sectors < ((sector_t)sb->size) * 2 && sb->level >= 1) -@@ -1449,7 +1452,7 @@ super_90_rdev_size_change(struct md_rdev *rdev, sector_t num_sectors) - /* Limit to 4TB as metadata cannot record more than that. - * 4TB == 2^32 KB, or 2*2^32 sectors. - */ -- if (num_sectors >= (2ULL << 32)) -+ if (num_sectors >= (2ULL << 32) && rdev->mddev->level >= 1) - num_sectors = (2ULL << 32) - 2; - md_super_write(rdev->mddev, rdev, rdev->sb_start, rdev->sb_size, - rdev->sb_page); -@@ -7669,6 +7672,8 @@ static int remove_and_add_spares(struct mddev *mddev) - } - } - } -+ if (removed) -+ set_bit(MD_CHANGE_DEVS, &mddev->flags); - return spares; - } - -@@ -7682,9 +7687,11 @@ static void reap_sync_thread(struct mddev *mddev) - !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { - /* success...*/ - /* activate any spares */ -- if (mddev->pers->spare_active(mddev)) -+ if (mddev->pers->spare_active(mddev)) { - sysfs_notify(&mddev->kobj, NULL, - "degraded"); -+ set_bit(MD_CHANGE_DEVS, &mddev->flags); -+ } - } - if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && - mddev->pers->finish_reshape) -diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c -index 8da6282..e987da4 100644 ---- a/drivers/md/raid10.c -+++ b/drivers/md/raid10.c -@@ -645,7 +645,11 @@ static int raid10_mergeable_bvec(struct request_queue *q, - max = biovec->bv_len; - - if (mddev->merge_check_needed) { -- struct r10bio r10_bio; -+ struct { -+ struct r10bio r10_bio; -+ struct r10dev devs[conf->copies]; -+ } on_stack; -+ struct r10bio *r10_bio = &on_stack.r10_bio; - int s; - if (conf->reshape_progress != MaxSector) { - /* Cannot give any guidance during reshape */ -@@ -653,18 +657,18 @@ static int raid10_mergeable_bvec(struct request_queue *q, - return biovec->bv_len; - return 0; - } -- r10_bio.sector = sector; -- raid10_find_phys(conf, &r10_bio); -+ r10_bio->sector = sector; -+ raid10_find_phys(conf, r10_bio); - rcu_read_lock(); - for (s = 0; s < conf->copies; s++) { -- int disk = r10_bio.devs[s].devnum; -+ int disk = r10_bio->devs[s].devnum; - struct md_rdev *rdev = rcu_dereference( - conf->mirrors[disk].rdev); - if (rdev && !test_bit(Faulty, &rdev->flags)) { - struct request_queue *q = - bdev_get_queue(rdev->bdev); - if (q->merge_bvec_fn) { -- bvm->bi_sector = r10_bio.devs[s].addr -+ bvm->bi_sector = r10_bio->devs[s].addr - + rdev->data_offset; - bvm->bi_bdev = rdev->bdev; - max = min(max, q->merge_bvec_fn( -@@ -676,7 +680,7 @@ static int raid10_mergeable_bvec(struct request_queue *q, - struct request_queue *q = - bdev_get_queue(rdev->bdev); - if (q->merge_bvec_fn) { -- bvm->bi_sector = r10_bio.devs[s].addr -+ bvm->bi_sector = r10_bio->devs[s].addr - + rdev->data_offset; - bvm->bi_bdev = rdev->bdev; - max = min(max, q->merge_bvec_fn( -@@ -1488,14 +1492,16 @@ static int _enough(struct r10conf *conf, struct geom *geo, int ignore) - do { - int n = conf->copies; - int cnt = 0; -+ int this = first; - while (n--) { -- if (conf->mirrors[first].rdev && -- first != ignore) -+ if (conf->mirrors[this].rdev && -+ this != ignore) - cnt++; -- first = (first+1) % geo->raid_disks; -+ this = (this+1) % geo->raid_disks; - } - if (cnt == 0) - return 0; -+ first = (first + geo->near_copies) % geo->raid_disks; - } while (first != 0); - return 1; - } -@@ -4389,14 +4395,18 @@ static int handle_reshape_read_error(struct mddev *mddev, - { - /* Use sync reads to get the blocks from somewhere else */ - int sectors = r10_bio->sectors; -- struct r10bio r10b; - struct r10conf *conf = mddev->private; -+ struct { -+ struct r10bio r10_bio; -+ struct r10dev devs[conf->copies]; -+ } on_stack; -+ struct r10bio *r10b = &on_stack.r10_bio; - int slot = 0; - int idx = 0; - struct bio_vec *bvec = r10_bio->master_bio->bi_io_vec; - -- r10b.sector = r10_bio->sector; -- __raid10_find_phys(&conf->prev, &r10b); -+ r10b->sector = r10_bio->sector; -+ __raid10_find_phys(&conf->prev, r10b); - - while (sectors) { - int s = sectors; -@@ -4407,7 +4417,7 @@ static int handle_reshape_read_error(struct mddev *mddev, - s = PAGE_SIZE >> 9; - - while (!success) { -- int d = r10b.devs[slot].devnum; -+ int d = r10b->devs[slot].devnum; - struct md_rdev *rdev = conf->mirrors[d].rdev; - sector_t addr; - if (rdev == NULL || -@@ -4415,7 +4425,7 @@ static int handle_reshape_read_error(struct mddev *mddev, - !test_bit(In_sync, &rdev->flags)) - goto failed; - -- addr = r10b.devs[slot].addr + idx * PAGE_SIZE; -+ addr = r10b->devs[slot].addr + idx * PAGE_SIZE; - success = sync_page_io(rdev, - addr, - s << 9, -diff --git a/drivers/md/raid10.h b/drivers/md/raid10.h -index 135b1b0..d2effe7 100644 ---- a/drivers/md/raid10.h -+++ b/drivers/md/raid10.h -@@ -110,7 +110,7 @@ struct r10bio { - * We choose the number when they are allocated. - * We sometimes need an extra bio to write to the replacement. - */ -- struct { -+ struct r10dev { - struct bio *bio; - union { - struct bio *repl_bio; /* used for resync and -diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c -index 04348d7..bcd096b 100644 ---- a/drivers/md/raid5.c -+++ b/drivers/md/raid5.c -@@ -380,6 +380,8 @@ static int calc_degraded(struct r5conf *conf) - degraded = 0; - for (i = 0; i < conf->previous_raid_disks; i++) { - struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev); -+ if (rdev && test_bit(Faulty, &rdev->flags)) -+ rdev = rcu_dereference(conf->disks[i].replacement); - if (!rdev || test_bit(Faulty, &rdev->flags)) - degraded++; - else if (test_bit(In_sync, &rdev->flags)) -@@ -404,6 +406,8 @@ static int calc_degraded(struct r5conf *conf) - degraded2 = 0; - for (i = 0; i < conf->raid_disks; i++) { - struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev); -+ if (rdev && test_bit(Faulty, &rdev->flags)) -+ rdev = rcu_dereference(conf->disks[i].replacement); - if (!rdev || test_bit(Faulty, &rdev->flags)) - degraded2++; - else if (test_bit(In_sync, &rdev->flags)) -diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c -index 6e16b09..cabc19c 100644 ---- a/drivers/media/rc/rc-main.c -+++ b/drivers/media/rc/rc-main.c -@@ -775,10 +775,11 @@ static ssize_t show_protocols(struct device *device, - if (dev->driver_type == RC_DRIVER_SCANCODE) { - enabled = dev->rc_map.rc_type; - allowed = dev->allowed_protos; -- } else { -+ } else if (dev->raw) { - enabled = dev->raw->enabled_protocols; - allowed = ir_raw_get_allowed_protocols(); -- } -+ } else -+ return -ENODEV; - - IR_dprintk(1, "allowed - 0x%llx, enabled - 0x%llx\n", - (long long)allowed, -diff --git a/drivers/misc/sgi-xp/xpc_uv.c b/drivers/misc/sgi-xp/xpc_uv.c -index 87b251a..b9e2000 100644 ---- a/drivers/misc/sgi-xp/xpc_uv.c -+++ b/drivers/misc/sgi-xp/xpc_uv.c -@@ -18,6 +18,8 @@ - #include <linux/interrupt.h> - #include <linux/delay.h> - #include <linux/device.h> -+#include <linux/cpu.h> -+#include <linux/module.h> - #include <linux/err.h> - #include <linux/slab.h> - #include <asm/uv/uv_hub.h> -@@ -59,6 +61,8 @@ static struct xpc_heartbeat_uv *xpc_heartbeat_uv; - XPC_NOTIFY_MSG_SIZE_UV) - #define XPC_NOTIFY_IRQ_NAME "xpc_notify" - -+static int xpc_mq_node = -1; -+ - static struct xpc_gru_mq_uv *xpc_activate_mq_uv; - static struct xpc_gru_mq_uv *xpc_notify_mq_uv; - -@@ -109,11 +113,8 @@ xpc_get_gru_mq_irq_uv(struct xpc_gru_mq_uv *mq, int cpu, char *irq_name) - #if defined CONFIG_X86_64 - mq->irq = uv_setup_irq(irq_name, cpu, mq->mmr_blade, mq->mmr_offset, - UV_AFFINITY_CPU); -- if (mq->irq < 0) { -- dev_err(xpc_part, "uv_setup_irq() returned error=%d\n", -- -mq->irq); -+ if (mq->irq < 0) - return mq->irq; -- } - - mq->mmr_value = uv_read_global_mmr64(mmr_pnode, mq->mmr_offset); - -@@ -238,8 +239,9 @@ xpc_create_gru_mq_uv(unsigned int mq_size, int cpu, char *irq_name, - mq->mmr_blade = uv_cpu_to_blade_id(cpu); - - nid = cpu_to_node(cpu); -- page = alloc_pages_exact_node(nid, GFP_KERNEL | __GFP_ZERO | GFP_THISNODE, -- pg_order); -+ page = alloc_pages_exact_node(nid, -+ GFP_KERNEL | __GFP_ZERO | GFP_THISNODE, -+ pg_order); - if (page == NULL) { - dev_err(xpc_part, "xpc_create_gru_mq_uv() failed to alloc %d " - "bytes of memory on nid=%d for GRU mq\n", mq_size, nid); -@@ -1731,9 +1733,50 @@ static struct xpc_arch_operations xpc_arch_ops_uv = { - .notify_senders_of_disconnect = xpc_notify_senders_of_disconnect_uv, - }; - -+static int -+xpc_init_mq_node(int nid) -+{ -+ int cpu; -+ -+ get_online_cpus(); -+ -+ for_each_cpu(cpu, cpumask_of_node(nid)) { -+ xpc_activate_mq_uv = -+ xpc_create_gru_mq_uv(XPC_ACTIVATE_MQ_SIZE_UV, nid, -+ XPC_ACTIVATE_IRQ_NAME, -+ xpc_handle_activate_IRQ_uv); -+ if (!IS_ERR(xpc_activate_mq_uv)) -+ break; -+ } -+ if (IS_ERR(xpc_activate_mq_uv)) { -+ put_online_cpus(); -+ return PTR_ERR(xpc_activate_mq_uv); -+ } -+ -+ for_each_cpu(cpu, cpumask_of_node(nid)) { -+ xpc_notify_mq_uv = -+ xpc_create_gru_mq_uv(XPC_NOTIFY_MQ_SIZE_UV, nid, -+ XPC_NOTIFY_IRQ_NAME, -+ xpc_handle_notify_IRQ_uv); -+ if (!IS_ERR(xpc_notify_mq_uv)) -+ break; -+ } -+ if (IS_ERR(xpc_notify_mq_uv)) { -+ xpc_destroy_gru_mq_uv(xpc_activate_mq_uv); -+ put_online_cpus(); -+ return PTR_ERR(xpc_notify_mq_uv); -+ } -+ -+ put_online_cpus(); -+ return 0; -+} -+ - int - xpc_init_uv(void) - { -+ int nid; -+ int ret = 0; -+ - xpc_arch_ops = xpc_arch_ops_uv; - - if (sizeof(struct xpc_notify_mq_msghdr_uv) > XPC_MSG_HDR_MAX_SIZE) { -@@ -1742,21 +1785,21 @@ xpc_init_uv(void) - return -E2BIG; - } - -- xpc_activate_mq_uv = xpc_create_gru_mq_uv(XPC_ACTIVATE_MQ_SIZE_UV, 0, -- XPC_ACTIVATE_IRQ_NAME, -- xpc_handle_activate_IRQ_uv); -- if (IS_ERR(xpc_activate_mq_uv)) -- return PTR_ERR(xpc_activate_mq_uv); -+ if (xpc_mq_node < 0) -+ for_each_online_node(nid) { -+ ret = xpc_init_mq_node(nid); - -- xpc_notify_mq_uv = xpc_create_gru_mq_uv(XPC_NOTIFY_MQ_SIZE_UV, 0, -- XPC_NOTIFY_IRQ_NAME, -- xpc_handle_notify_IRQ_uv); -- if (IS_ERR(xpc_notify_mq_uv)) { -- xpc_destroy_gru_mq_uv(xpc_activate_mq_uv); -- return PTR_ERR(xpc_notify_mq_uv); -- } -+ if (!ret) -+ break; -+ } -+ else -+ ret = xpc_init_mq_node(xpc_mq_node); - -- return 0; -+ if (ret < 0) -+ dev_err(xpc_part, "xpc_init_mq_node() returned error=%d\n", -+ -ret); -+ -+ return ret; - } - - void -@@ -1765,3 +1808,6 @@ xpc_exit_uv(void) - xpc_destroy_gru_mq_uv(xpc_notify_mq_uv); - xpc_destroy_gru_mq_uv(xpc_activate_mq_uv); - } -+ -+module_param(xpc_mq_node, int, 0); -+MODULE_PARM_DESC(xpc_mq_node, "Node number on which to allocate message queues."); -diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c -index 276d21c..7b66292 100644 ---- a/drivers/mmc/card/block.c -+++ b/drivers/mmc/card/block.c -@@ -1429,7 +1429,8 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) - /* complete ongoing async transfer before issuing discard */ - if (card->host->areq) - mmc_blk_issue_rw_rq(mq, NULL); -- if (req->cmd_flags & REQ_SECURE) -+ if (req->cmd_flags & REQ_SECURE && -+ !(card->quirks & MMC_QUIRK_SEC_ERASE_TRIM_BROKEN)) - ret = mmc_blk_issue_secdiscard_rq(mq, req); - else - ret = mmc_blk_issue_discard_rq(mq, req); -@@ -1734,6 +1735,7 @@ force_ro_fail: - #define CID_MANFID_SANDISK 0x2 - #define CID_MANFID_TOSHIBA 0x11 - #define CID_MANFID_MICRON 0x13 -+#define CID_MANFID_SAMSUNG 0x15 - - static const struct mmc_fixup blk_fixups[] = - { -@@ -1770,6 +1772,28 @@ static const struct mmc_fixup blk_fixups[] = - MMC_FIXUP(CID_NAME_ANY, CID_MANFID_MICRON, 0x200, add_quirk_mmc, - MMC_QUIRK_LONG_READ_TIME), - -+ /* -+ * On these Samsung MoviNAND parts, performing secure erase or -+ * secure trim can result in unrecoverable corruption due to a -+ * firmware bug. -+ */ -+ MMC_FIXUP("M8G2FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, -+ MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), -+ MMC_FIXUP("MAG4FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, -+ MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), -+ MMC_FIXUP("MBG8FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, -+ MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), -+ MMC_FIXUP("MCGAFA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, -+ MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), -+ MMC_FIXUP("VAL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, -+ MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), -+ MMC_FIXUP("VYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, -+ MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), -+ MMC_FIXUP("KYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, -+ MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), -+ MMC_FIXUP("VZL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, -+ MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), -+ - END_FIXUP - }; - -diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c -index f2c115e..1a69c63 100644 ---- a/drivers/mmc/host/atmel-mci.c -+++ b/drivers/mmc/host/atmel-mci.c -@@ -81,6 +81,7 @@ struct atmel_mci_caps { - bool has_bad_data_ordering; - bool need_reset_after_xfer; - bool need_blksz_mul_4; -+ bool need_notbusy_for_read_ops; - }; - - struct atmel_mci_dma { -@@ -1619,7 +1620,8 @@ static void atmci_tasklet_func(unsigned long priv) - __func__); - atmci_set_completed(host, EVENT_XFER_COMPLETE); - -- if (host->data->flags & MMC_DATA_WRITE) { -+ if (host->caps.need_notbusy_for_read_ops || -+ (host->data->flags & MMC_DATA_WRITE)) { - atmci_writel(host, ATMCI_IER, ATMCI_NOTBUSY); - state = STATE_WAITING_NOTBUSY; - } else if (host->mrq->stop) { -@@ -2212,6 +2214,7 @@ static void __init atmci_get_cap(struct atmel_mci *host) - host->caps.has_bad_data_ordering = 1; - host->caps.need_reset_after_xfer = 1; - host->caps.need_blksz_mul_4 = 1; -+ host->caps.need_notbusy_for_read_ops = 0; - - /* keep only major version number */ - switch (version & 0xf00) { -@@ -2232,6 +2235,7 @@ static void __init atmci_get_cap(struct atmel_mci *host) - case 0x200: - host->caps.has_rwproof = 1; - host->caps.need_blksz_mul_4 = 0; -+ host->caps.need_notbusy_for_read_ops = 1; - case 0x100: - host->caps.has_bad_data_ordering = 0; - host->caps.need_reset_after_xfer = 0; -diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c -index 277161d..e1fd2c8 100644 ---- a/drivers/mmc/host/mxs-mmc.c -+++ b/drivers/mmc/host/mxs-mmc.c -@@ -278,11 +278,11 @@ static irqreturn_t mxs_mmc_irq_handler(int irq, void *dev_id) - writel(stat & MXS_MMC_IRQ_BITS, - host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_CLR); - -+ spin_unlock(&host->lock); -+ - if ((stat & BM_SSP_CTRL1_SDIO_IRQ) && (stat & BM_SSP_CTRL1_SDIO_IRQ_EN)) - mmc_signal_sdio_irq(host->mmc); - -- spin_unlock(&host->lock); -- - if (stat & BM_SSP_CTRL1_RESP_TIMEOUT_IRQ) - cmd->error = -ETIMEDOUT; - else if (stat & BM_SSP_CTRL1_RESP_ERR_IRQ) -@@ -637,11 +637,6 @@ static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable) - host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET); - writel(BM_SSP_CTRL1_SDIO_IRQ_EN, - host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_SET); -- -- if (readl(host->base + HW_SSP_STATUS(host)) & -- BM_SSP_STATUS_SDIO_IRQ) -- mmc_signal_sdio_irq(host->mmc); -- - } else { - writel(BM_SSP_CTRL0_SDIO_IRQ_CHECK, - host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR); -@@ -650,6 +645,11 @@ static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable) - } - - spin_unlock_irqrestore(&host->lock, flags); -+ -+ if (enable && readl(host->base + HW_SSP_STATUS(host)) & -+ BM_SSP_STATUS_SDIO_IRQ) -+ mmc_signal_sdio_irq(host->mmc); -+ - } - - static const struct mmc_host_ops mxs_mmc_ops = { -diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h -index b97b2f5..d25f9ab 100644 ---- a/drivers/mmc/host/sdhci-esdhc.h -+++ b/drivers/mmc/host/sdhci-esdhc.h -@@ -48,14 +48,14 @@ static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock) - int div = 1; - u32 temp; - -+ if (clock == 0) -+ goto out; -+ - temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL); - temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN - | ESDHC_CLOCK_MASK); - sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL); - -- if (clock == 0) -- goto out; -- - while (host->max_clk / pre_div / 16 > clock && pre_div < 256) - pre_div *= 2; - -diff --git a/drivers/net/can/janz-ican3.c b/drivers/net/can/janz-ican3.c -index 08c893c..e7823dd 100644 ---- a/drivers/net/can/janz-ican3.c -+++ b/drivers/net/can/janz-ican3.c -@@ -1250,7 +1250,6 @@ static irqreturn_t ican3_irq(int irq, void *dev_id) - */ - static int ican3_reset_module(struct ican3_dev *mod) - { -- u8 val = 1 << mod->num; - unsigned long start; - u8 runold, runnew; - -@@ -1264,8 +1263,7 @@ static int ican3_reset_module(struct ican3_dev *mod) - runold = ioread8(mod->dpm + TARGET_RUNNING); - - /* reset the module */ -- iowrite8(val, &mod->ctrl->reset_assert); -- iowrite8(val, &mod->ctrl->reset_deassert); -+ iowrite8(0x00, &mod->dpmctrl->hwreset); - - /* wait until the module has finished resetting and is running */ - start = jiffies; -diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c -index 346785c..9d60742 100644 ---- a/drivers/net/can/mcp251x.c -+++ b/drivers/net/can/mcp251x.c -@@ -83,6 +83,11 @@ - #define INSTRUCTION_LOAD_TXB(n) (0x40 + 2 * (n)) - #define INSTRUCTION_READ_RXB(n) (((n) == 0) ? 0x90 : 0x94) - #define INSTRUCTION_RESET 0xC0 -+#define RTS_TXB0 0x01 -+#define RTS_TXB1 0x02 -+#define RTS_TXB2 0x04 -+#define INSTRUCTION_RTS(n) (0x80 | ((n) & 0x07)) -+ - - /* MPC251x registers */ - #define CANSTAT 0x0e -@@ -397,6 +402,7 @@ static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, - static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, - int tx_buf_idx) - { -+ struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); - u32 sid, eid, exide, rtr; - u8 buf[SPI_TRANSFER_BUF_LEN]; - -@@ -418,7 +424,10 @@ static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, - buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc; - memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc); - mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx); -- mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx), TXBCTRL_TXREQ); -+ -+ /* use INSTRUCTION_RTS, to avoid "repeated frame problem" */ -+ priv->spi_tx_buf[0] = INSTRUCTION_RTS(1 << tx_buf_idx); -+ mcp251x_spi_trans(priv->spi, 1); - } - - static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, -diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c -index 4accd7e..5ec2700 100644 ---- a/drivers/net/can/ti_hecc.c -+++ b/drivers/net/can/ti_hecc.c -@@ -984,12 +984,12 @@ static int __devexit ti_hecc_remove(struct platform_device *pdev) - struct net_device *ndev = platform_get_drvdata(pdev); - struct ti_hecc_priv *priv = netdev_priv(ndev); - -+ unregister_candev(ndev); - clk_disable(priv->clk); - clk_put(priv->clk); - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - iounmap(priv->base); - release_mem_region(res->start, resource_size(res)); -- unregister_candev(ndev); - free_candev(ndev); - platform_set_drvdata(pdev, NULL); - -diff --git a/drivers/net/ethernet/cirrus/cs89x0.c b/drivers/net/ethernet/cirrus/cs89x0.c -index 845b202..1384469 100644 ---- a/drivers/net/ethernet/cirrus/cs89x0.c -+++ b/drivers/net/ethernet/cirrus/cs89x0.c -@@ -1243,6 +1243,7 @@ static void set_multicast_list(struct net_device *dev) - { - struct net_local *lp = netdev_priv(dev); - unsigned long flags; -+ u16 cfg; - - spin_lock_irqsave(&lp->lock, flags); - if (dev->flags & IFF_PROMISC) -@@ -1260,11 +1261,10 @@ static void set_multicast_list(struct net_device *dev) - /* in promiscuous mode, we accept errored packets, - * so we have to enable interrupts on them also - */ -- writereg(dev, PP_RxCFG, -- (lp->curr_rx_cfg | -- (lp->rx_mode == RX_ALL_ACCEPT) -- ? (RX_CRC_ERROR_ENBL | RX_RUNT_ENBL | RX_EXTRA_DATA_ENBL) -- : 0)); -+ cfg = lp->curr_rx_cfg; -+ if (lp->rx_mode == RX_ALL_ACCEPT) -+ cfg |= RX_CRC_ERROR_ENBL | RX_RUNT_ENBL | RX_EXTRA_DATA_ENBL; -+ writereg(dev, PP_RxCFG, cfg); - spin_unlock_irqrestore(&lp->lock, flags); - } - -diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c -index ab1d80f..7f0183e 100644 ---- a/drivers/net/ethernet/freescale/gianfar.c -+++ b/drivers/net/ethernet/freescale/gianfar.c -@@ -1037,7 +1037,7 @@ static int gfar_probe(struct platform_device *ofdev) - - if (priv->device_flags & FSL_GIANFAR_DEV_HAS_VLAN) { - dev->hw_features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; -- dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; -+ dev->features |= NETIF_F_HW_VLAN_RX; - } - - if (priv->device_flags & FSL_GIANFAR_DEV_HAS_EXTENDED_HASH) { -diff --git a/drivers/net/ethernet/freescale/gianfar_ethtool.c b/drivers/net/ethernet/freescale/gianfar_ethtool.c -index 8a02557..4ca75ee 100644 ---- a/drivers/net/ethernet/freescale/gianfar_ethtool.c -+++ b/drivers/net/ethernet/freescale/gianfar_ethtool.c -@@ -1741,6 +1741,7 @@ static int gfar_get_nfc(struct net_device *dev, struct ethtool_rxnfc *cmd, - } - - int gfar_phc_index = -1; -+EXPORT_SYMBOL(gfar_phc_index); - - static int gfar_get_ts_info(struct net_device *dev, - struct ethtool_ts_info *info) -diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c -index c08e5d4..0daa66b 100644 ---- a/drivers/net/ethernet/freescale/gianfar_ptp.c -+++ b/drivers/net/ethernet/freescale/gianfar_ptp.c -@@ -515,7 +515,7 @@ static int gianfar_ptp_probe(struct platform_device *dev) - err = PTR_ERR(etsects->clock); - goto no_clock; - } -- gfar_phc_clock = ptp_clock_index(etsects->clock); -+ gfar_phc_index = ptp_clock_index(etsects->clock); - - dev_set_drvdata(&dev->dev, etsects); - -@@ -539,7 +539,7 @@ static int gianfar_ptp_remove(struct platform_device *dev) - gfar_write(&etsects->regs->tmr_temask, 0); - gfar_write(&etsects->regs->tmr_ctrl, 0); - -- gfar_phc_clock = -1; -+ gfar_phc_index = -1; - ptp_clock_unregister(etsects->clock); - iounmap(etsects->regs); - release_resource(etsects->rsrc); -diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c -index 9010cea..b68d28a 100644 ---- a/drivers/net/ethernet/ibm/ibmveth.c -+++ b/drivers/net/ethernet/ibm/ibmveth.c -@@ -472,14 +472,9 @@ static void ibmveth_cleanup(struct ibmveth_adapter *adapter) - } - - if (adapter->rx_queue.queue_addr != NULL) { -- if (!dma_mapping_error(dev, adapter->rx_queue.queue_dma)) { -- dma_unmap_single(dev, -- adapter->rx_queue.queue_dma, -- adapter->rx_queue.queue_len, -- DMA_BIDIRECTIONAL); -- adapter->rx_queue.queue_dma = DMA_ERROR_CODE; -- } -- kfree(adapter->rx_queue.queue_addr); -+ dma_free_coherent(dev, adapter->rx_queue.queue_len, -+ adapter->rx_queue.queue_addr, -+ adapter->rx_queue.queue_dma); - adapter->rx_queue.queue_addr = NULL; - } - -@@ -556,10 +551,13 @@ static int ibmveth_open(struct net_device *netdev) - goto err_out; - } - -+ dev = &adapter->vdev->dev; -+ - adapter->rx_queue.queue_len = sizeof(struct ibmveth_rx_q_entry) * - rxq_entries; -- adapter->rx_queue.queue_addr = kmalloc(adapter->rx_queue.queue_len, -- GFP_KERNEL); -+ adapter->rx_queue.queue_addr = -+ dma_alloc_coherent(dev, adapter->rx_queue.queue_len, -+ &adapter->rx_queue.queue_dma, GFP_KERNEL); - - if (!adapter->rx_queue.queue_addr) { - netdev_err(netdev, "unable to allocate rx queue pages\n"); -@@ -567,19 +565,13 @@ static int ibmveth_open(struct net_device *netdev) - goto err_out; - } - -- dev = &adapter->vdev->dev; -- - adapter->buffer_list_dma = dma_map_single(dev, - adapter->buffer_list_addr, 4096, DMA_BIDIRECTIONAL); - adapter->filter_list_dma = dma_map_single(dev, - adapter->filter_list_addr, 4096, DMA_BIDIRECTIONAL); -- adapter->rx_queue.queue_dma = dma_map_single(dev, -- adapter->rx_queue.queue_addr, -- adapter->rx_queue.queue_len, DMA_BIDIRECTIONAL); - - if ((dma_mapping_error(dev, adapter->buffer_list_dma)) || -- (dma_mapping_error(dev, adapter->filter_list_dma)) || -- (dma_mapping_error(dev, adapter->rx_queue.queue_dma))) { -+ (dma_mapping_error(dev, adapter->filter_list_dma))) { - netdev_err(netdev, "unable to map filter or buffer list " - "pages\n"); - rc = -ENOMEM; -diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c -index b95f2e1..16c4634 100644 ---- a/drivers/net/ethernet/sfc/efx.c -+++ b/drivers/net/ethernet/sfc/efx.c -@@ -1503,6 +1503,11 @@ static int efx_probe_all(struct efx_nic *efx) - goto fail2; - } - -+ BUILD_BUG_ON(EFX_DEFAULT_DMAQ_SIZE < EFX_RXQ_MIN_ENT); -+ if (WARN_ON(EFX_DEFAULT_DMAQ_SIZE < EFX_TXQ_MIN_ENT(efx))) { -+ rc = -EINVAL; -+ goto fail3; -+ } - efx->rxq_entries = efx->txq_entries = EFX_DEFAULT_DMAQ_SIZE; - - rc = efx_probe_filters(efx); -@@ -2070,6 +2075,7 @@ static int efx_register_netdev(struct efx_nic *efx) - net_dev->irq = efx->pci_dev->irq; - net_dev->netdev_ops = &efx_netdev_ops; - SET_ETHTOOL_OPS(net_dev, &efx_ethtool_ops); -+ net_dev->gso_max_segs = EFX_TSO_MAX_SEGS; - - rtnl_lock(); - -diff --git a/drivers/net/ethernet/sfc/efx.h b/drivers/net/ethernet/sfc/efx.h -index be8f915..70755c9 100644 ---- a/drivers/net/ethernet/sfc/efx.h -+++ b/drivers/net/ethernet/sfc/efx.h -@@ -30,6 +30,7 @@ extern netdev_tx_t - efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb); - extern void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index); - extern int efx_setup_tc(struct net_device *net_dev, u8 num_tc); -+extern unsigned int efx_tx_max_skb_descs(struct efx_nic *efx); - - /* RX */ - extern int efx_probe_rx_queue(struct efx_rx_queue *rx_queue); -@@ -52,10 +53,15 @@ extern void efx_schedule_slow_fill(struct efx_rx_queue *rx_queue); - #define EFX_MAX_EVQ_SIZE 16384UL - #define EFX_MIN_EVQ_SIZE 512UL - --/* The smallest [rt]xq_entries that the driver supports. Callers of -- * efx_wake_queue() assume that they can subsequently send at least one -- * skb. Falcon/A1 may require up to three descriptors per skb_frag. */ --#define EFX_MIN_RING_SIZE (roundup_pow_of_two(2 * 3 * MAX_SKB_FRAGS)) -+/* Maximum number of TCP segments we support for soft-TSO */ -+#define EFX_TSO_MAX_SEGS 100 -+ -+/* The smallest [rt]xq_entries that the driver supports. RX minimum -+ * is a bit arbitrary. For TX, we must have space for at least 2 -+ * TSO skbs. -+ */ -+#define EFX_RXQ_MIN_ENT 128U -+#define EFX_TXQ_MIN_ENT(efx) (2 * efx_tx_max_skb_descs(efx)) - - /* Filters */ - extern int efx_probe_filters(struct efx_nic *efx); -diff --git a/drivers/net/ethernet/sfc/ethtool.c b/drivers/net/ethernet/sfc/ethtool.c -index 03ded36..b1287f8 100644 ---- a/drivers/net/ethernet/sfc/ethtool.c -+++ b/drivers/net/ethernet/sfc/ethtool.c -@@ -680,21 +680,27 @@ static int efx_ethtool_set_ringparam(struct net_device *net_dev, - struct ethtool_ringparam *ring) - { - struct efx_nic *efx = netdev_priv(net_dev); -+ u32 txq_entries; - - if (ring->rx_mini_pending || ring->rx_jumbo_pending || - ring->rx_pending > EFX_MAX_DMAQ_SIZE || - ring->tx_pending > EFX_MAX_DMAQ_SIZE) - return -EINVAL; - -- if (ring->rx_pending < EFX_MIN_RING_SIZE || -- ring->tx_pending < EFX_MIN_RING_SIZE) { -+ if (ring->rx_pending < EFX_RXQ_MIN_ENT) { - netif_err(efx, drv, efx->net_dev, -- "TX and RX queues cannot be smaller than %ld\n", -- EFX_MIN_RING_SIZE); -+ "RX queues cannot be smaller than %u\n", -+ EFX_RXQ_MIN_ENT); - return -EINVAL; - } - -- return efx_realloc_channels(efx, ring->rx_pending, ring->tx_pending); -+ txq_entries = max(ring->tx_pending, EFX_TXQ_MIN_ENT(efx)); -+ if (txq_entries != ring->tx_pending) -+ netif_warn(efx, drv, efx->net_dev, -+ "increasing TX queue size to minimum of %u\n", -+ txq_entries); -+ -+ return efx_realloc_channels(efx, ring->rx_pending, txq_entries); - } - - static int efx_ethtool_set_pauseparam(struct net_device *net_dev, -@@ -857,8 +863,8 @@ static int efx_ethtool_get_class_rule(struct efx_nic *efx, - &ip_entry->ip4dst, &ip_entry->pdst); - if (rc != 0) { - rc = efx_filter_get_ipv4_full( -- &spec, &proto, &ip_entry->ip4src, &ip_entry->psrc, -- &ip_entry->ip4dst, &ip_entry->pdst); -+ &spec, &proto, &ip_entry->ip4dst, &ip_entry->pdst, -+ &ip_entry->ip4src, &ip_entry->psrc); - EFX_WARN_ON_PARANOID(rc); - ip_mask->ip4src = ~0; - ip_mask->psrc = ~0; -diff --git a/drivers/net/ethernet/sfc/tx.c b/drivers/net/ethernet/sfc/tx.c -index 94d0365..305430d 100644 ---- a/drivers/net/ethernet/sfc/tx.c -+++ b/drivers/net/ethernet/sfc/tx.c -@@ -119,6 +119,25 @@ efx_max_tx_len(struct efx_nic *efx, dma_addr_t dma_addr) - return len; - } - -+unsigned int efx_tx_max_skb_descs(struct efx_nic *efx) -+{ -+ /* Header and payload descriptor for each output segment, plus -+ * one for every input fragment boundary within a segment -+ */ -+ unsigned int max_descs = EFX_TSO_MAX_SEGS * 2 + MAX_SKB_FRAGS; -+ -+ /* Possibly one more per segment for the alignment workaround */ -+ if (EFX_WORKAROUND_5391(efx)) -+ max_descs += EFX_TSO_MAX_SEGS; -+ -+ /* Possibly more for PCIe page boundaries within input fragments */ -+ if (PAGE_SIZE > EFX_PAGE_SIZE) -+ max_descs += max_t(unsigned int, MAX_SKB_FRAGS, -+ DIV_ROUND_UP(GSO_MAX_SIZE, EFX_PAGE_SIZE)); -+ -+ return max_descs; -+} -+ - /* - * Add a socket buffer to a TX queue - * -diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c -index f9347ea..63ffbdf 100644 ---- a/drivers/net/netconsole.c -+++ b/drivers/net/netconsole.c -@@ -648,7 +648,6 @@ static int netconsole_netdev_event(struct notifier_block *this, - flags); - dev_put(nt->np.dev); - nt->np.dev = NULL; -- netconsole_target_put(nt); - } - nt->enabled = 0; - stopped = true; -diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c -index 1c98321..162464f 100644 ---- a/drivers/net/ppp/pptp.c -+++ b/drivers/net/ppp/pptp.c -@@ -189,7 +189,7 @@ static int pptp_xmit(struct ppp_channel *chan, struct sk_buff *skb) - if (sk_pppox(po)->sk_state & PPPOX_DEAD) - goto tx_error; - -- rt = ip_route_output_ports(&init_net, &fl4, NULL, -+ rt = ip_route_output_ports(sock_net(sk), &fl4, NULL, - opt->dst_addr.sin_addr.s_addr, - opt->src_addr.sin_addr.s_addr, - 0, 0, IPPROTO_GRE, -@@ -468,7 +468,7 @@ static int pptp_connect(struct socket *sock, struct sockaddr *uservaddr, - po->chan.private = sk; - po->chan.ops = &pptp_chan_ops; - -- rt = ip_route_output_ports(&init_net, &fl4, sk, -+ rt = ip_route_output_ports(sock_net(sk), &fl4, sk, - opt->dst_addr.sin_addr.s_addr, - opt->src_addr.sin_addr.s_addr, - 0, 0, -diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c -index 3ae80ec..ebcb7d4 100644 ---- a/drivers/net/usb/asix.c -+++ b/drivers/net/usb/asix.c -@@ -1604,6 +1604,10 @@ static const struct usb_device_id products [] = { - USB_DEVICE (0x2001, 0x3c05), - .driver_info = (unsigned long) &ax88772_info, - }, { -+ // DLink DUB-E100 H/W Ver C1 -+ USB_DEVICE (0x2001, 0x1a02), -+ .driver_info = (unsigned long) &ax88772_info, -+}, { - // Linksys USB1000 - USB_DEVICE (0x1737, 0x0039), - .driver_info = (unsigned long) &ax88178_info, -diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c -index a051ced..d124bdd 100644 ---- a/drivers/net/usb/qmi_wwan.c -+++ b/drivers/net/usb/qmi_wwan.c -@@ -444,6 +444,15 @@ static const struct usb_device_id products[] = { - .bInterfaceProtocol = 0xff, - .driver_info = (unsigned long)&qmi_wwan_shared, - }, -+ { /* Pantech UML290 - newer firmware */ -+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -+ .idVendor = 0x106c, -+ .idProduct = 0x3718, -+ .bInterfaceClass = 0xff, -+ .bInterfaceSubClass = 0xf1, -+ .bInterfaceProtocol = 0xff, -+ .driver_info = (unsigned long)&qmi_wwan_shared, -+ }, - { /* ZTE MF820D */ - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, - .idVendor = 0x19d2, -@@ -453,6 +462,15 @@ static const struct usb_device_id products[] = { - .bInterfaceProtocol = 0xff, - .driver_info = (unsigned long)&qmi_wwan_force_int4, - }, -+ { /* ZTE MF821D */ -+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -+ .idVendor = 0x19d2, -+ .idProduct = 0x0326, -+ .bInterfaceClass = 0xff, -+ .bInterfaceSubClass = 0xff, -+ .bInterfaceProtocol = 0xff, -+ .driver_info = (unsigned long)&qmi_wwan_force_int4, -+ }, - { /* ZTE (Vodafone) K3520-Z */ - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, - .idVendor = 0x19d2, -@@ -507,6 +525,15 @@ static const struct usb_device_id products[] = { - .bInterfaceProtocol = 0xff, - .driver_info = (unsigned long)&qmi_wwan_force_int4, - }, -+ { /* ZTE (Vodafone) K5006-Z */ -+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -+ .idVendor = 0x19d2, -+ .idProduct = 0x1018, -+ .bInterfaceClass = 0xff, -+ .bInterfaceSubClass = 0xff, -+ .bInterfaceProtocol = 0xff, -+ .driver_info = (unsigned long)&qmi_wwan_force_int3, -+ }, - { /* ZTE MF60 */ - .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, - .idVendor = 0x19d2, -@@ -525,6 +552,33 @@ static const struct usb_device_id products[] = { - .bInterfaceProtocol = 0xff, - .driver_info = (unsigned long)&qmi_wwan_sierra, - }, -+ { /* Sierra Wireless MC7700 */ -+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -+ .idVendor = 0x0f3d, -+ .idProduct = 0x68a2, -+ .bInterfaceClass = 0xff, -+ .bInterfaceSubClass = 0xff, -+ .bInterfaceProtocol = 0xff, -+ .driver_info = (unsigned long)&qmi_wwan_sierra, -+ }, -+ { /* Sierra Wireless MC7750 */ -+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -+ .idVendor = 0x114f, -+ .idProduct = 0x68a2, -+ .bInterfaceClass = 0xff, -+ .bInterfaceSubClass = 0xff, -+ .bInterfaceProtocol = 0xff, -+ .driver_info = (unsigned long)&qmi_wwan_sierra, -+ }, -+ { /* Sierra Wireless EM7700 */ -+ .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, -+ .idVendor = 0x1199, -+ .idProduct = 0x901c, -+ .bInterfaceClass = 0xff, -+ .bInterfaceSubClass = 0xff, -+ .bInterfaceProtocol = 0xff, -+ .driver_info = (unsigned long)&qmi_wwan_sierra, -+ }, - - /* Gobi 1000 devices */ - {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ -@@ -552,6 +606,8 @@ static const struct usb_device_id products[] = { - {QMI_GOBI_DEVICE(0x05c6, 0x9265)}, /* Asus Gobi 2000 Modem device (VR305) */ - {QMI_GOBI_DEVICE(0x05c6, 0x9235)}, /* Top Global Gobi 2000 Modem device (VR306) */ - {QMI_GOBI_DEVICE(0x05c6, 0x9275)}, /* iRex Technologies Gobi 2000 Modem device (VR307) */ -+ {QMI_GOBI_DEVICE(0x1199, 0x68a5)}, /* Sierra Wireless Modem */ -+ {QMI_GOBI_DEVICE(0x1199, 0x68a9)}, /* Sierra Wireless Modem */ - {QMI_GOBI_DEVICE(0x1199, 0x9001)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ - {QMI_GOBI_DEVICE(0x1199, 0x9002)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ - {QMI_GOBI_DEVICE(0x1199, 0x9003)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ -@@ -568,6 +624,8 @@ static const struct usb_device_id products[] = { - {QMI_GOBI_DEVICE(0x1199, 0x9013)}, /* Sierra Wireless Gobi 3000 Modem device (MC8355) */ - {QMI_GOBI_DEVICE(0x1199, 0x9015)}, /* Sierra Wireless Gobi 3000 Modem device */ - {QMI_GOBI_DEVICE(0x1199, 0x9019)}, /* Sierra Wireless Gobi 3000 Modem device */ -+ {QMI_GOBI_DEVICE(0x1199, 0x901b)}, /* Sierra Wireless MC7770 */ -+ - { } /* END */ - }; - MODULE_DEVICE_TABLE(usb, products); -diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c -index d237b3f..f2716a4 100644 ---- a/drivers/net/usb/usbnet.c -+++ b/drivers/net/usb/usbnet.c -@@ -1204,19 +1204,26 @@ deferred: - } - EXPORT_SYMBOL_GPL(usbnet_start_xmit); - --static void rx_alloc_submit(struct usbnet *dev, gfp_t flags) -+static int rx_alloc_submit(struct usbnet *dev, gfp_t flags) - { - struct urb *urb; - int i; -+ int ret = 0; - - /* don't refill the queue all at once */ - for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) { - urb = usb_alloc_urb(0, flags); - if (urb != NULL) { -- if (rx_submit(dev, urb, flags) == -ENOLINK) -- return; -+ ret = rx_submit(dev, urb, flags); -+ if (ret) -+ goto err; -+ } else { -+ ret = -ENOMEM; -+ goto err; - } - } -+err: -+ return ret; - } - - /*-------------------------------------------------------------------------*/ -@@ -1260,7 +1267,8 @@ static void usbnet_bh (unsigned long param) - int temp = dev->rxq.qlen; - - if (temp < RX_QLEN(dev)) { -- rx_alloc_submit(dev, GFP_ATOMIC); -+ if (rx_alloc_submit(dev, GFP_ATOMIC) == -ENOLINK) -+ return; - if (temp != dev->rxq.qlen) - netif_dbg(dev, link, dev->net, - "rxqlen %d --> %d\n", -diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c -index 236cb9f..3ae938f 100644 ---- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c -+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c -@@ -764,8 +764,11 @@ static void brcmf_c_arp_offload_set(struct brcmf_pub *drvr, int arp_mode) - { - char iovbuf[32]; - int retcode; -+ __le32 arp_mode_le; - -- brcmf_c_mkiovar("arp_ol", (char *)&arp_mode, 4, iovbuf, sizeof(iovbuf)); -+ arp_mode_le = cpu_to_le32(arp_mode); -+ brcmf_c_mkiovar("arp_ol", (char *)&arp_mode_le, 4, iovbuf, -+ sizeof(iovbuf)); - retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, - iovbuf, sizeof(iovbuf)); - retcode = retcode >= 0 ? 0 : retcode; -@@ -781,8 +784,11 @@ static void brcmf_c_arp_offload_enable(struct brcmf_pub *drvr, int arp_enable) - { - char iovbuf[32]; - int retcode; -+ __le32 arp_enable_le; - -- brcmf_c_mkiovar("arpoe", (char *)&arp_enable, 4, -+ arp_enable_le = cpu_to_le32(arp_enable); -+ -+ brcmf_c_mkiovar("arpoe", (char *)&arp_enable_le, 4, - iovbuf, sizeof(iovbuf)); - retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, - iovbuf, sizeof(iovbuf)); -@@ -802,10 +808,10 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr) - char buf[128], *ptr; - u32 dongle_align = drvr->bus_if->align; - u32 glom = 0; -- u32 roaming = 1; -- uint bcn_timeout = 3; -- int scan_assoc_time = 40; -- int scan_unassoc_time = 40; -+ __le32 roaming_le = cpu_to_le32(1); -+ __le32 bcn_timeout_le = cpu_to_le32(3); -+ __le32 scan_assoc_time_le = cpu_to_le32(40); -+ __le32 scan_unassoc_time_le = cpu_to_le32(40); - int i; - - mutex_lock(&drvr->proto_block); -@@ -840,14 +846,14 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr) - - /* Setup timeout if Beacons are lost and roam is off to report - link down */ -- brcmf_c_mkiovar("bcn_timeout", (char *)&bcn_timeout, 4, iovbuf, -+ brcmf_c_mkiovar("bcn_timeout", (char *)&bcn_timeout_le, 4, iovbuf, - sizeof(iovbuf)); - brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf, - sizeof(iovbuf)); - - /* Enable/Disable build-in roaming to allowed ext supplicant to take - of romaing */ -- brcmf_c_mkiovar("roam_off", (char *)&roaming, 4, -+ brcmf_c_mkiovar("roam_off", (char *)&roaming_le, 4, - iovbuf, sizeof(iovbuf)); - brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf, - sizeof(iovbuf)); -@@ -859,9 +865,9 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr) - sizeof(iovbuf)); - - brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_CHANNEL_TIME, -- (char *)&scan_assoc_time, sizeof(scan_assoc_time)); -+ (char *)&scan_assoc_time_le, sizeof(scan_assoc_time_le)); - brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_UNASSOC_TIME, -- (char *)&scan_unassoc_time, sizeof(scan_unassoc_time)); -+ (char *)&scan_unassoc_time_le, sizeof(scan_unassoc_time_le)); - - /* Set and enable ARP offload feature */ - brcmf_c_arp_offload_set(drvr, BRCMF_ARPOL_MODE); -diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c -index d13ae9c..e360939 100644 ---- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c -+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c -@@ -500,8 +500,10 @@ static void wl_iscan_prep(struct brcmf_scan_params_le *params_le, - params_le->active_time = cpu_to_le32(-1); - params_le->passive_time = cpu_to_le32(-1); - params_le->home_time = cpu_to_le32(-1); -- if (ssid && ssid->SSID_len) -- memcpy(¶ms_le->ssid_le, ssid, sizeof(struct brcmf_ssid)); -+ if (ssid && ssid->SSID_len) { -+ params_le->ssid_le.SSID_len = cpu_to_le32(ssid->SSID_len); -+ memcpy(¶ms_le->ssid_le.SSID, ssid->SSID, ssid->SSID_len); -+ } - } - - static s32 -diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c -index 7f97dec..5000690 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c -+++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c -@@ -128,6 +128,9 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file, - const struct fw_img *img; - size_t bufsz; - -+ if (!iwl_is_ready_rf(priv)) -+ return -EAGAIN; -+ - /* default is to dump the entire data segment */ - if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) { - priv->dbgfs_sram_offset = 0x800000; -diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h -index e959207..8215fad 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h -+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h -@@ -355,7 +355,7 @@ int iwl_queue_space(const struct iwl_queue *q); - /***************************************************** - * Error handling - ******************************************************/ --int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display); -+int iwl_dump_fh(struct iwl_trans *trans, char **buf); - void iwl_dump_csr(struct iwl_trans *trans); - - /***************************************************** -diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c -index 08517d3..5e18ff9 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c -+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c -@@ -559,7 +559,7 @@ static void iwl_irq_handle_error(struct iwl_trans *trans) - } - - iwl_dump_csr(trans); -- iwl_dump_fh(trans, NULL, false); -+ iwl_dump_fh(trans, NULL); - - iwl_op_mode_nic_error(trans->op_mode); - } -diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c -index 79c6b91..a1fb025 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c -+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c -@@ -1437,6 +1437,7 @@ static int iwl_trans_pcie_start_hw(struct iwl_trans *trans) - return err; - - err_free_irq: -+ trans_pcie->irq_requested = false; - free_irq(trans_pcie->irq, trans); - error: - iwl_free_isr_ict(trans); -@@ -1654,13 +1655,9 @@ static const char *get_fh_string(int cmd) - #undef IWL_CMD - } - --int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display) -+int iwl_dump_fh(struct iwl_trans *trans, char **buf) - { - int i; --#ifdef CONFIG_IWLWIFI_DEBUG -- int pos = 0; -- size_t bufsz = 0; --#endif - static const u32 fh_tbl[] = { - FH_RSCSR_CHNL0_STTS_WPTR_REG, - FH_RSCSR_CHNL0_RBDCB_BASE_REG, -@@ -1672,29 +1669,35 @@ int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display) - FH_TSSR_TX_STATUS_REG, - FH_TSSR_TX_ERROR_REG - }; --#ifdef CONFIG_IWLWIFI_DEBUG -- if (display) { -- bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40; -+ -+#ifdef CONFIG_IWLWIFI_DEBUGFS -+ if (buf) { -+ int pos = 0; -+ size_t bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40; -+ - *buf = kmalloc(bufsz, GFP_KERNEL); - if (!*buf) - return -ENOMEM; -+ - pos += scnprintf(*buf + pos, bufsz - pos, - "FH register values:\n"); -- for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) { -+ -+ for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) - pos += scnprintf(*buf + pos, bufsz - pos, - " %34s: 0X%08x\n", - get_fh_string(fh_tbl[i]), - iwl_read_direct32(trans, fh_tbl[i])); -- } -+ - return pos; - } - #endif -+ - IWL_ERR(trans, "FH register values:\n"); -- for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) { -+ for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) - IWL_ERR(trans, " %34s: 0X%08x\n", - get_fh_string(fh_tbl[i]), - iwl_read_direct32(trans, fh_tbl[i])); -- } -+ - return 0; - } - -@@ -1989,11 +1992,11 @@ static ssize_t iwl_dbgfs_fh_reg_read(struct file *file, - size_t count, loff_t *ppos) - { - struct iwl_trans *trans = file->private_data; -- char *buf; -+ char *buf = NULL; - int pos = 0; - ssize_t ret = -EFAULT; - -- ret = pos = iwl_dump_fh(trans, &buf, true); -+ ret = pos = iwl_dump_fh(trans, &buf); - if (buf) { - ret = simple_read_from_buffer(user_buf, - count, ppos, buf, pos); -diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c -index 5e6b501..d8594a2 100644 ---- a/drivers/net/wireless/rt2x00/rt2400pci.c -+++ b/drivers/net/wireless/rt2x00/rt2400pci.c -@@ -1611,6 +1611,7 @@ static int rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev) - { - int retval; -+ u32 reg; - - /* - * Allocate eeprom data. -@@ -1624,6 +1625,14 @@ static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev) - return retval; - - /* -+ * Enable rfkill polling by setting GPIO direction of the -+ * rfkill switch GPIO pin correctly. -+ */ -+ rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®); -+ rt2x00_set_field32(®, GPIOCSR_BIT8, 1); -+ rt2x00pci_register_write(rt2x00dev, GPIOCSR, reg); -+ -+ /* - * Initialize hw specifications. - */ - retval = rt2400pci_probe_hw_mode(rt2x00dev); -diff --git a/drivers/net/wireless/rt2x00/rt2400pci.h b/drivers/net/wireless/rt2x00/rt2400pci.h -index d3a4a68..7564ae9 100644 ---- a/drivers/net/wireless/rt2x00/rt2400pci.h -+++ b/drivers/net/wireless/rt2x00/rt2400pci.h -@@ -670,6 +670,7 @@ - #define GPIOCSR_BIT5 FIELD32(0x00000020) - #define GPIOCSR_BIT6 FIELD32(0x00000040) - #define GPIOCSR_BIT7 FIELD32(0x00000080) -+#define GPIOCSR_BIT8 FIELD32(0x00000100) - - /* - * BBPPCSR: BBP Pin control register. -diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c -index 136b849..2223e35 100644 ---- a/drivers/net/wireless/rt2x00/rt2500pci.c -+++ b/drivers/net/wireless/rt2x00/rt2500pci.c -@@ -1929,6 +1929,7 @@ static int rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev) - { - int retval; -+ u32 reg; - - /* - * Allocate eeprom data. -@@ -1942,6 +1943,14 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev) - return retval; - - /* -+ * Enable rfkill polling by setting GPIO direction of the -+ * rfkill switch GPIO pin correctly. -+ */ -+ rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®); -+ rt2x00_set_field32(®, GPIOCSR_DIR0, 1); -+ rt2x00pci_register_write(rt2x00dev, GPIOCSR, reg); -+ -+ /* - * Initialize hw specifications. - */ - retval = rt2500pci_probe_hw_mode(rt2x00dev); -diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c -index 669aecd..d6e87c0 100644 ---- a/drivers/net/wireless/rt2x00/rt2500usb.c -+++ b/drivers/net/wireless/rt2x00/rt2500usb.c -@@ -283,7 +283,7 @@ static int rt2500usb_rfkill_poll(struct rt2x00_dev *rt2x00dev) - u16 reg; - - rt2500usb_register_read(rt2x00dev, MAC_CSR19, ®); -- return rt2x00_get_field32(reg, MAC_CSR19_BIT7); -+ return rt2x00_get_field16(reg, MAC_CSR19_BIT7); - } - - #ifdef CONFIG_RT2X00_LIB_LEDS -@@ -1768,6 +1768,7 @@ static int rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev) - { - int retval; -+ u16 reg; - - /* - * Allocate eeprom data. -@@ -1781,6 +1782,14 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev) - return retval; - - /* -+ * Enable rfkill polling by setting GPIO direction of the -+ * rfkill switch GPIO pin correctly. -+ */ -+ rt2500usb_register_read(rt2x00dev, MAC_CSR19, ®); -+ rt2x00_set_field16(®, MAC_CSR19_BIT8, 0); -+ rt2500usb_register_write(rt2x00dev, MAC_CSR19, reg); -+ -+ /* - * Initialize hw specifications. - */ - retval = rt2500usb_probe_hw_mode(rt2x00dev); -diff --git a/drivers/net/wireless/rt2x00/rt2500usb.h b/drivers/net/wireless/rt2x00/rt2500usb.h -index b493306..196bd51 100644 ---- a/drivers/net/wireless/rt2x00/rt2500usb.h -+++ b/drivers/net/wireless/rt2x00/rt2500usb.h -@@ -189,14 +189,15 @@ - * MAC_CSR19: GPIO control register. - */ - #define MAC_CSR19 0x0426 --#define MAC_CSR19_BIT0 FIELD32(0x0001) --#define MAC_CSR19_BIT1 FIELD32(0x0002) --#define MAC_CSR19_BIT2 FIELD32(0x0004) --#define MAC_CSR19_BIT3 FIELD32(0x0008) --#define MAC_CSR19_BIT4 FIELD32(0x0010) --#define MAC_CSR19_BIT5 FIELD32(0x0020) --#define MAC_CSR19_BIT6 FIELD32(0x0040) --#define MAC_CSR19_BIT7 FIELD32(0x0080) -+#define MAC_CSR19_BIT0 FIELD16(0x0001) -+#define MAC_CSR19_BIT1 FIELD16(0x0002) -+#define MAC_CSR19_BIT2 FIELD16(0x0004) -+#define MAC_CSR19_BIT3 FIELD16(0x0008) -+#define MAC_CSR19_BIT4 FIELD16(0x0010) -+#define MAC_CSR19_BIT5 FIELD16(0x0020) -+#define MAC_CSR19_BIT6 FIELD16(0x0040) -+#define MAC_CSR19_BIT7 FIELD16(0x0080) -+#define MAC_CSR19_BIT8 FIELD16(0x0100) - - /* - * MAC_CSR20: LED control register. -diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c -index cad25bf..0f26ffb 100644 ---- a/drivers/net/wireless/rt2x00/rt2800pci.c -+++ b/drivers/net/wireless/rt2x00/rt2800pci.c -@@ -977,6 +977,7 @@ static int rt2800pci_validate_eeprom(struct rt2x00_dev *rt2x00dev) - static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev) - { - int retval; -+ u32 reg; - - /* - * Allocate eeprom data. -@@ -990,6 +991,14 @@ static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev) - return retval; - - /* -+ * Enable rfkill polling by setting GPIO direction of the -+ * rfkill switch GPIO pin correctly. -+ */ -+ rt2x00pci_register_read(rt2x00dev, GPIO_CTRL_CFG, ®); -+ rt2x00_set_field32(®, GPIO_CTRL_CFG_GPIOD_BIT2, 1); -+ rt2x00pci_register_write(rt2x00dev, GPIO_CTRL_CFG, reg); -+ -+ /* - * Initialize hw specifications. - */ - retval = rt2800_probe_hw_mode(rt2x00dev); -diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c -index 6cf3365..6b4226b 100644 ---- a/drivers/net/wireless/rt2x00/rt2800usb.c -+++ b/drivers/net/wireless/rt2x00/rt2800usb.c -@@ -667,8 +667,16 @@ static void rt2800usb_fill_rxdone(struct queue_entry *entry, - skb_pull(entry->skb, RXINFO_DESC_SIZE); - - /* -- * FIXME: we need to check for rx_pkt_len validity -+ * Check for rx_pkt_len validity. Return if invalid, leaving -+ * rxdesc->size zeroed out by the upper level. - */ -+ if (unlikely(rx_pkt_len == 0 || -+ rx_pkt_len > entry->queue->data_size)) { -+ ERROR(entry->queue->rt2x00dev, -+ "Bad frame size %d, forcing to 0\n", rx_pkt_len); -+ return; -+ } -+ - rxd = (__le32 *)(entry->skb->data + rx_pkt_len); - - /* -@@ -736,6 +744,7 @@ static int rt2800usb_validate_eeprom(struct rt2x00_dev *rt2x00dev) - static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev) - { - int retval; -+ u32 reg; - - /* - * Allocate eeprom data. -@@ -749,6 +758,14 @@ static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev) - return retval; - - /* -+ * Enable rfkill polling by setting GPIO direction of the -+ * rfkill switch GPIO pin correctly. -+ */ -+ rt2x00usb_register_read(rt2x00dev, GPIO_CTRL_CFG, ®); -+ rt2x00_set_field32(®, GPIO_CTRL_CFG_GPIOD_BIT2, 1); -+ rt2x00usb_register_write(rt2x00dev, GPIO_CTRL_CFG, reg); -+ -+ /* - * Initialize hw specifications. - */ - retval = rt2800_probe_hw_mode(rt2x00dev); -@@ -1157,6 +1174,8 @@ static struct usb_device_id rt2800usb_device_table[] = { - { USB_DEVICE(0x1690, 0x0744) }, - { USB_DEVICE(0x1690, 0x0761) }, - { USB_DEVICE(0x1690, 0x0764) }, -+ /* ASUS */ -+ { USB_DEVICE(0x0b05, 0x179d) }, - /* Cisco */ - { USB_DEVICE(0x167b, 0x4001) }, - /* EnGenius */ -@@ -1222,7 +1241,6 @@ static struct usb_device_id rt2800usb_device_table[] = { - { USB_DEVICE(0x0b05, 0x1760) }, - { USB_DEVICE(0x0b05, 0x1761) }, - { USB_DEVICE(0x0b05, 0x1790) }, -- { USB_DEVICE(0x0b05, 0x179d) }, - /* AzureWave */ - { USB_DEVICE(0x13d3, 0x3262) }, - { USB_DEVICE(0x13d3, 0x3284) }, -diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c -index e5404e5..8ac4482 100644 ---- a/drivers/net/wireless/rt2x00/rt2x00dev.c -+++ b/drivers/net/wireless/rt2x00/rt2x00dev.c -@@ -629,7 +629,7 @@ void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp) - */ - if (unlikely(rxdesc.size == 0 || - rxdesc.size > entry->queue->data_size)) { -- WARNING(rt2x00dev, "Wrong frame size %d max %d.\n", -+ ERROR(rt2x00dev, "Wrong frame size %d max %d.\n", - rxdesc.size, entry->queue->data_size); - dev_kfree_skb(entry->skb); - goto renew_skb; -diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c -index 5fb3a2e..02ba3cf 100644 ---- a/drivers/net/wireless/rt2x00/rt61pci.c -+++ b/drivers/net/wireless/rt2x00/rt61pci.c -@@ -2832,6 +2832,7 @@ static int rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev) - { - int retval; -+ u32 reg; - - /* - * Disable power saving. -@@ -2850,6 +2851,14 @@ static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev) - return retval; - - /* -+ * Enable rfkill polling by setting GPIO direction of the -+ * rfkill switch GPIO pin correctly. -+ */ -+ rt2x00pci_register_read(rt2x00dev, MAC_CSR13, ®); -+ rt2x00_set_field32(®, MAC_CSR13_BIT13, 1); -+ rt2x00pci_register_write(rt2x00dev, MAC_CSR13, reg); -+ -+ /* - * Initialize hw specifications. - */ - retval = rt61pci_probe_hw_mode(rt2x00dev); -diff --git a/drivers/net/wireless/rt2x00/rt61pci.h b/drivers/net/wireless/rt2x00/rt61pci.h -index e3cd6db..8f3da5a 100644 ---- a/drivers/net/wireless/rt2x00/rt61pci.h -+++ b/drivers/net/wireless/rt2x00/rt61pci.h -@@ -372,6 +372,7 @@ struct hw_pairwise_ta_entry { - #define MAC_CSR13_BIT10 FIELD32(0x00000400) - #define MAC_CSR13_BIT11 FIELD32(0x00000800) - #define MAC_CSR13_BIT12 FIELD32(0x00001000) -+#define MAC_CSR13_BIT13 FIELD32(0x00002000) - - /* - * MAC_CSR14: LED control register. -diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c -index 77ccbbc..ceb1c4f 100644 ---- a/drivers/net/wireless/rt2x00/rt73usb.c -+++ b/drivers/net/wireless/rt2x00/rt73usb.c -@@ -2177,6 +2177,7 @@ static int rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) - static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev) - { - int retval; -+ u32 reg; - - /* - * Allocate eeprom data. -@@ -2190,6 +2191,14 @@ static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev) - return retval; - - /* -+ * Enable rfkill polling by setting GPIO direction of the -+ * rfkill switch GPIO pin correctly. -+ */ -+ rt2x00usb_register_read(rt2x00dev, MAC_CSR13, ®); -+ rt2x00_set_field32(®, MAC_CSR13_BIT15, 0); -+ rt2x00usb_register_write(rt2x00dev, MAC_CSR13, reg); -+ -+ /* - * Initialize hw specifications. - */ - retval = rt73usb_probe_hw_mode(rt2x00dev); -diff --git a/drivers/net/wireless/rt2x00/rt73usb.h b/drivers/net/wireless/rt2x00/rt73usb.h -index 9f6b470..df1cc11 100644 ---- a/drivers/net/wireless/rt2x00/rt73usb.h -+++ b/drivers/net/wireless/rt2x00/rt73usb.h -@@ -282,6 +282,9 @@ struct hw_pairwise_ta_entry { - #define MAC_CSR13_BIT10 FIELD32(0x00000400) - #define MAC_CSR13_BIT11 FIELD32(0x00000800) - #define MAC_CSR13_BIT12 FIELD32(0x00001000) -+#define MAC_CSR13_BIT13 FIELD32(0x00002000) -+#define MAC_CSR13_BIT14 FIELD32(0x00004000) -+#define MAC_CSR13_BIT15 FIELD32(0x00008000) - - /* - * MAC_CSR14: LED control register. -diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h -index 04c3aef..2925094 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h -+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h -@@ -117,6 +117,7 @@ - - #define CHIP_VER_B BIT(4) - #define CHIP_92C_BITMASK BIT(0) -+#define CHIP_UNKNOWN BIT(7) - #define CHIP_92C_1T2R 0x03 - #define CHIP_92C 0x01 - #define CHIP_88C 0x00 -diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c -index 5c4d9bc..509f661 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c -@@ -995,8 +995,16 @@ static enum version_8192c _rtl92ce_read_chip_version(struct ieee80211_hw *hw) - version = (value32 & TYPE_ID) ? VERSION_A_CHIP_92C : - VERSION_A_CHIP_88C; - } else { -- version = (value32 & TYPE_ID) ? VERSION_B_CHIP_92C : -- VERSION_B_CHIP_88C; -+ version = (enum version_8192c) (CHIP_VER_B | -+ ((value32 & TYPE_ID) ? CHIP_92C_BITMASK : 0) | -+ ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0)); -+ if ((!IS_CHIP_VENDOR_UMC(version)) && (value32 & -+ CHIP_VER_RTL_MASK)) { -+ version = (enum version_8192c)(version | -+ ((((value32 & CHIP_VER_RTL_MASK) == BIT(12)) -+ ? CHIP_VENDOR_UMC_B_CUT : CHIP_UNKNOWN) | -+ CHIP_VENDOR_UMC)); -+ } - } - - switch (version) { -diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c -index 3aa927f..7d8f964 100644 ---- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c -+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c -@@ -162,10 +162,12 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw) - - /* request fw */ - if (IS_VENDOR_UMC_A_CUT(rtlhal->version) && -- !IS_92C_SERIAL(rtlhal->version)) -+ !IS_92C_SERIAL(rtlhal->version)) { - rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin"; -- else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) -+ } else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) { - rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin"; -+ pr_info("****** This B_CUT device may not work with kernels 3.6 and earlier\n"); -+ } - - rtlpriv->max_fw_size = 0x4000; - pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name); -diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c -index e38f91b..110c777 100644 ---- a/drivers/platform/x86/asus-laptop.c -+++ b/drivers/platform/x86/asus-laptop.c -@@ -863,9 +863,9 @@ static ssize_t show_infos(struct device *dev, - * The significance of others is yet to be found. - * If we don't find the method, we assume the device are present. - */ -- rv = acpi_evaluate_integer(asus->handle, "HRWS", NULL, &temp); -+ rv = acpi_evaluate_integer(asus->handle, "HWRS", NULL, &temp); - if (!ACPI_FAILURE(rv)) -- len += sprintf(page + len, "HRWS value : %#x\n", -+ len += sprintf(page + len, "HWRS value : %#x\n", - (uint) temp); - /* - * Another value for userspace: the ASYM method returns 0x02 for -@@ -1751,9 +1751,9 @@ static int asus_laptop_get_info(struct asus_laptop *asus) - * The significance of others is yet to be found. - */ - status = -- acpi_evaluate_integer(asus->handle, "HRWS", NULL, &hwrs_result); -+ acpi_evaluate_integer(asus->handle, "HWRS", NULL, &hwrs_result); - if (!ACPI_FAILURE(status)) -- pr_notice(" HRWS returned %x", (int)hwrs_result); -+ 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/drivers/platform/x86/asus-nb-wmi.c b/drivers/platform/x86/asus-nb-wmi.c -index 99a30b5..6de14fd 100644 ---- a/drivers/platform/x86/asus-nb-wmi.c -+++ b/drivers/platform/x86/asus-nb-wmi.c -@@ -94,6 +94,10 @@ static const struct key_entry asus_nb_wmi_keymap[] = { - { KE_KEY, 0x8A, { KEY_PROG1 } }, - { KE_KEY, 0x95, { KEY_MEDIA } }, - { KE_KEY, 0x99, { KEY_PHONE } }, -+ { KE_KEY, 0xA0, { KEY_SWITCHVIDEOMODE } }, /* SDSP HDMI only */ -+ { KE_KEY, 0xA1, { KEY_SWITCHVIDEOMODE } }, /* SDSP LCD + HDMI */ -+ { KE_KEY, 0xA2, { KEY_SWITCHVIDEOMODE } }, /* SDSP CRT + HDMI */ -+ { KE_KEY, 0xA3, { KEY_SWITCHVIDEOMODE } }, /* SDSP TV + HDMI */ - { KE_KEY, 0xb5, { KEY_CALC } }, - { KE_KEY, 0xc4, { KEY_KBDILLUMUP } }, - { KE_KEY, 0xc5, { KEY_KBDILLUMDOWN } }, -diff --git a/drivers/rtc/rtc-rs5c348.c b/drivers/rtc/rtc-rs5c348.c -index 77074cc..fd5c7af 100644 ---- a/drivers/rtc/rtc-rs5c348.c -+++ b/drivers/rtc/rtc-rs5c348.c -@@ -122,9 +122,12 @@ rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm) - tm->tm_min = bcd2bin(rxbuf[RS5C348_REG_MINS] & RS5C348_MINS_MASK); - tm->tm_hour = bcd2bin(rxbuf[RS5C348_REG_HOURS] & RS5C348_HOURS_MASK); - if (!pdata->rtc_24h) { -- tm->tm_hour %= 12; -- if (rxbuf[RS5C348_REG_HOURS] & RS5C348_BIT_PM) -+ if (rxbuf[RS5C348_REG_HOURS] & RS5C348_BIT_PM) { -+ tm->tm_hour -= 20; -+ tm->tm_hour %= 12; - tm->tm_hour += 12; -+ } else -+ tm->tm_hour %= 12; - } - tm->tm_wday = bcd2bin(rxbuf[RS5C348_REG_WDAY] & RS5C348_WDAY_MASK); - tm->tm_mday = bcd2bin(rxbuf[RS5C348_REG_DAY] & RS5C348_DAY_MASK); -diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c -index c5d06fe..9277d94 100644 ---- a/drivers/rtc/rtc-twl.c -+++ b/drivers/rtc/rtc-twl.c -@@ -495,6 +495,11 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev) - if (ret < 0) - goto out1; - -+ /* ensure interrupts are disabled, bootloaders can be strange */ -+ ret = twl_rtc_write_u8(0, REG_RTC_INTERRUPTS_REG); -+ if (ret < 0) -+ dev_warn(&pdev->dev, "unable to disable interrupt\n"); -+ - /* init cached IRQ enable bits */ - ret = twl_rtc_read_u8(&rtc_irq_bits, REG_RTC_INTERRUPTS_REG); - if (ret < 0) -diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c -index 86a12b4..3878e62 100644 ---- a/drivers/scsi/bnx2i/bnx2i_hwi.c -+++ b/drivers/scsi/bnx2i/bnx2i_hwi.c -@@ -1264,6 +1264,9 @@ int bnx2i_send_fw_iscsi_init_msg(struct bnx2i_hba *hba) - int rc = 0; - u64 mask64; - -+ memset(&iscsi_init, 0x00, sizeof(struct iscsi_kwqe_init1)); -+ memset(&iscsi_init2, 0x00, sizeof(struct iscsi_kwqe_init2)); -+ - bnx2i_adjust_qp_size(hba); - - iscsi_init.flags = -diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c -index 796482b..2b4261c 100644 ---- a/drivers/scsi/hpsa.c -+++ b/drivers/scsi/hpsa.c -@@ -1315,8 +1315,9 @@ static void complete_scsi_command(struct CommandList *cp) - } - break; - case CMD_PROTOCOL_ERR: -+ cmd->result = DID_ERROR << 16; - dev_warn(&h->pdev->dev, "cp %p has " -- "protocol error \n", cp); -+ "protocol error\n", cp); - break; - case CMD_HARDWARE_ERR: - cmd->result = DID_ERROR << 16; -diff --git a/drivers/scsi/lpfc/Makefile b/drivers/scsi/lpfc/Makefile -index fe5d396..e2516ba 100644 ---- a/drivers/scsi/lpfc/Makefile -+++ b/drivers/scsi/lpfc/Makefile -@@ -22,7 +22,9 @@ - ccflags-$(GCOV) := -fprofile-arcs -ftest-coverage - ccflags-$(GCOV) += -O0 - -+ifdef WARNINGS_BECOME_ERRORS - ccflags-y += -Werror -+endif - - obj-$(CONFIG_SCSI_LPFC) := lpfc.o - -diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c -index b25757d..9d5a56c 100644 ---- a/drivers/scsi/mpt2sas/mpt2sas_base.c -+++ b/drivers/scsi/mpt2sas/mpt2sas_base.c -@@ -1209,6 +1209,13 @@ _base_check_enable_msix(struct MPT2SAS_ADAPTER *ioc) - u16 message_control; - - -+ /* Check whether controller SAS2008 B0 controller, -+ if it is SAS2008 B0 controller use IO-APIC instead of MSIX */ -+ if (ioc->pdev->device == MPI2_MFGPAGE_DEVID_SAS2008 && -+ ioc->pdev->revision == 0x01) { -+ return -EINVAL; -+ } -+ - base = pci_find_capability(ioc->pdev, PCI_CAP_ID_MSIX); - if (!base) { - dfailprintk(ioc, printk(MPT2SAS_INFO_FMT "msix not " -diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c -index 1b38431..6661610 100644 ---- a/drivers/scsi/virtio_scsi.c -+++ b/drivers/scsi/virtio_scsi.c -@@ -198,7 +198,7 @@ static void virtscsi_map_sgl(struct scatterlist *sg, unsigned int *p_idx, - int i; - - for_each_sg(table->sgl, sg_elem, table->nents, i) -- sg_set_buf(&sg[idx++], sg_virt(sg_elem), sg_elem->length); -+ sg[idx++] = *sg_elem; - - *p_idx = idx; - } -diff --git a/drivers/staging/android/android_alarm.h b/drivers/staging/android/android_alarm.h -index d0cafd6..f2ffd96 100644 ---- a/drivers/staging/android/android_alarm.h -+++ b/drivers/staging/android/android_alarm.h -@@ -51,10 +51,12 @@ enum android_alarm_return_flags { - #define ANDROID_ALARM_WAIT _IO('a', 1) - - #define ALARM_IOW(c, type, size) _IOW('a', (c) | ((type) << 4), size) -+#define ALARM_IOR(c, type, size) _IOR('a', (c) | ((type) << 4), size) -+ - /* Set alarm */ - #define ANDROID_ALARM_SET(type) ALARM_IOW(2, type, struct timespec) - #define ANDROID_ALARM_SET_AND_WAIT(type) ALARM_IOW(3, type, struct timespec) --#define ANDROID_ALARM_GET_TIME(type) ALARM_IOW(4, type, struct timespec) -+#define ANDROID_ALARM_GET_TIME(type) ALARM_IOR(4, type, struct timespec) - #define ANDROID_ALARM_SET_RTC _IOW('a', 5, struct timespec) - #define ANDROID_ALARM_BASE_CMD(cmd) (cmd & ~(_IOC(0, 0, 0xf0, 0))) - #define ANDROID_ALARM_IOCTL_TO_TYPE(cmd) (_IOC_NR(cmd) >> 4) -diff --git a/drivers/staging/comedi/drivers/amplc_pci224.c b/drivers/staging/comedi/drivers/amplc_pci224.c -index fbf19ca..0def1be 100644 ---- a/drivers/staging/comedi/drivers/amplc_pci224.c -+++ b/drivers/staging/comedi/drivers/amplc_pci224.c -@@ -1519,6 +1519,13 @@ pci224_attach_pci(struct comedi_device *dev, struct pci_dev *pci_dev) - dev->minor, DRIVER_NAME); - return -EINVAL; - } -+ /* -+ * Need to 'get' the PCI device to match the 'put' in pci224_detach(). -+ * TODO: Remove the pci_dev_get() and matching pci_dev_put() once -+ * support for manual attachment of PCI devices via pci224_attach() -+ * has been removed. -+ */ -+ pci_dev_get(pci_dev); - return pci224_attach_common(dev, pci_dev, NULL); - } - -diff --git a/drivers/staging/comedi/drivers/das08.c b/drivers/staging/comedi/drivers/das08.c -index 1f31943..83dae6e 100644 ---- a/drivers/staging/comedi/drivers/das08.c -+++ b/drivers/staging/comedi/drivers/das08.c -@@ -403,7 +403,7 @@ static const struct das08_board_struct das08_boards[] = { - .ai = das08_ai_rinsn, - .ai_nbits = 16, - .ai_pg = das08_pg_none, -- .ai_encoding = das08_encode12, -+ .ai_encoding = das08_encode16, - .ao = das08jr_ao_winsn, - .ao_nbits = 16, - .di = das08jr_di_rbits, -@@ -678,7 +678,7 @@ static int das08jr_ao_winsn(struct comedi_device *dev, - int chan; - - lsb = data[0] & 0xff; -- msb = (data[0] >> 8) & 0xf; -+ msb = (data[0] >> 8) & 0xff; - - chan = CR_CHAN(insn->chanspec); - -diff --git a/drivers/staging/media/lirc/lirc_sir.c b/drivers/staging/media/lirc/lirc_sir.c -index 945d962..4afc3b4 100644 ---- a/drivers/staging/media/lirc/lirc_sir.c -+++ b/drivers/staging/media/lirc/lirc_sir.c -@@ -52,6 +52,7 @@ - #include <linux/io.h> - #include <asm/irq.h> - #include <linux/fcntl.h> -+#include <linux/platform_device.h> - #ifdef LIRC_ON_SA1100 - #include <asm/hardware.h> - #ifdef CONFIG_SA1100_COLLIE -@@ -487,9 +488,11 @@ static struct lirc_driver driver = { - .owner = THIS_MODULE, - }; - -+static struct platform_device *lirc_sir_dev; - - static int init_chrdev(void) - { -+ driver.dev = &lirc_sir_dev->dev; - driver.minor = lirc_register_driver(&driver); - if (driver.minor < 0) { - printk(KERN_ERR LIRC_DRIVER_NAME ": init_chrdev() failed.\n"); -@@ -1215,20 +1218,71 @@ static int init_lirc_sir(void) - return 0; - } - -+static int __devinit lirc_sir_probe(struct platform_device *dev) -+{ -+ return 0; -+} -+ -+static int __devexit lirc_sir_remove(struct platform_device *dev) -+{ -+ return 0; -+} -+ -+static struct platform_driver lirc_sir_driver = { -+ .probe = lirc_sir_probe, -+ .remove = __devexit_p(lirc_sir_remove), -+ .driver = { -+ .name = "lirc_sir", -+ .owner = THIS_MODULE, -+ }, -+}; - - static int __init lirc_sir_init(void) - { - int retval; - -+ retval = platform_driver_register(&lirc_sir_driver); -+ if (retval) { -+ printk(KERN_ERR LIRC_DRIVER_NAME ": Platform driver register " -+ "failed!\n"); -+ return -ENODEV; -+ } -+ -+ lirc_sir_dev = platform_device_alloc("lirc_dev", 0); -+ if (!lirc_sir_dev) { -+ printk(KERN_ERR LIRC_DRIVER_NAME ": Platform device alloc " -+ "failed!\n"); -+ retval = -ENOMEM; -+ goto pdev_alloc_fail; -+ } -+ -+ retval = platform_device_add(lirc_sir_dev); -+ if (retval) { -+ printk(KERN_ERR LIRC_DRIVER_NAME ": Platform device add " -+ "failed!\n"); -+ retval = -ENODEV; -+ goto pdev_add_fail; -+ } -+ - retval = init_chrdev(); - if (retval < 0) -- return retval; -+ goto fail; -+ - retval = init_lirc_sir(); - if (retval) { - drop_chrdev(); -- return retval; -+ goto fail; - } -+ - return 0; -+ -+fail: -+ platform_device_del(lirc_sir_dev); -+pdev_add_fail: -+ platform_device_put(lirc_sir_dev); -+pdev_alloc_fail: -+ platform_driver_unregister(&lirc_sir_driver); -+ return retval; - } - - static void __exit lirc_sir_exit(void) -@@ -1236,6 +1290,8 @@ static void __exit lirc_sir_exit(void) - drop_hardware(); - drop_chrdev(); - drop_port(); -+ platform_device_unregister(lirc_sir_dev); -+ platform_driver_unregister(&lirc_sir_driver); - printk(KERN_INFO LIRC_DRIVER_NAME ": Uninstalled.\n"); - } - -diff --git a/drivers/staging/rtl8712/recv_linux.c b/drivers/staging/rtl8712/recv_linux.c -index 0e26d5f..495ee12 100644 ---- a/drivers/staging/rtl8712/recv_linux.c -+++ b/drivers/staging/rtl8712/recv_linux.c -@@ -117,13 +117,8 @@ void r8712_recv_indicatepkt(struct _adapter *padapter, - if (skb == NULL) - goto _recv_indicatepkt_drop; - skb->data = precv_frame->u.hdr.rx_data; --#ifdef NET_SKBUFF_DATA_USES_OFFSET -- skb->tail = (sk_buff_data_t)(precv_frame->u.hdr.rx_tail - -- precv_frame->u.hdr.rx_head); --#else -- skb->tail = (sk_buff_data_t)precv_frame->u.hdr.rx_tail; --#endif - skb->len = precv_frame->u.hdr.len; -+ skb_set_tail_pointer(skb, skb->len); - if ((pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1)) - skb->ip_summed = CHECKSUM_UNNECESSARY; - else -diff --git a/drivers/staging/speakup/main.c b/drivers/staging/speakup/main.c -index 92b34e2..40e2488 100644 ---- a/drivers/staging/speakup/main.c -+++ b/drivers/staging/speakup/main.c -@@ -1854,7 +1854,7 @@ static void speakup_bits(struct vc_data *vc) - - static int handle_goto(struct vc_data *vc, u_char type, u_char ch, u_short key) - { -- static u_char *goto_buf = "\0\0\0\0\0\0"; -+ static u_char goto_buf[8]; - static int num; - int maxlen, go_pos; - char *cp; -diff --git a/drivers/staging/vt6656/dpc.c b/drivers/staging/vt6656/dpc.c -index e4bdf2a..3aa895e 100644 ---- a/drivers/staging/vt6656/dpc.c -+++ b/drivers/staging/vt6656/dpc.c -@@ -200,7 +200,7 @@ s_vProcessRxMACHeader ( - } else if (!compare_ether_addr(pbyRxBuffer, &pDevice->abySNAP_RFC1042[0])) { - cbHeaderSize += 6; - pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize); -- if ((*pwType == cpu_to_le16(ETH_P_IPX)) || -+ if ((*pwType == cpu_to_be16(ETH_P_IPX)) || - (*pwType == cpu_to_le16(0xF380))) { - cbHeaderSize -= 8; - pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize); -diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c -index 9b64b10..fe21868 100644 ---- a/drivers/staging/vt6656/rxtx.c -+++ b/drivers/staging/vt6656/rxtx.c -@@ -1701,7 +1701,7 @@ s_bPacketToWirelessUsb( - // 802.1H - if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) { - if (pDevice->dwDiagRefCount == 0) { -- if ((psEthHeader->wType == cpu_to_le16(ETH_P_IPX)) || -+ if ((psEthHeader->wType == cpu_to_be16(ETH_P_IPX)) || - (psEthHeader->wType == cpu_to_le16(0xF380))) { - memcpy((PBYTE) (pbyPayloadHead), - abySNAP_Bridgetunnel, 6); -@@ -2840,10 +2840,10 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb) - Packet_Type = skb->data[ETH_HLEN+1]; - Descriptor_type = skb->data[ETH_HLEN+1+1+2]; - Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]); -- if (pDevice->sTxEthHeader.wType == cpu_to_le16(ETH_P_PAE)) { -- /* 802.1x OR eapol-key challenge frame transfer */ -- if (((Protocol_Version == 1) || (Protocol_Version == 2)) && -- (Packet_Type == 3)) { -+ if (pDevice->sTxEthHeader.wType == cpu_to_be16(ETH_P_PAE)) { -+ /* 802.1x OR eapol-key challenge frame transfer */ -+ if (((Protocol_Version == 1) || (Protocol_Version == 2)) && -+ (Packet_Type == 3)) { - bTxeapol_key = TRUE; - if(!(Key_info & BIT3) && //WPA or RSN group-key challenge - (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key -@@ -2989,19 +2989,19 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb) - } - } - -- if (pDevice->sTxEthHeader.wType == cpu_to_le16(ETH_P_PAE)) { -- if (pDevice->byBBType != BB_TYPE_11A) { -- pDevice->wCurrentRate = RATE_1M; -- pDevice->byACKRate = RATE_1M; -- pDevice->byTopCCKBasicRate = RATE_1M; -- pDevice->byTopOFDMBasicRate = RATE_6M; -- } else { -- pDevice->wCurrentRate = RATE_6M; -- pDevice->byACKRate = RATE_6M; -- pDevice->byTopCCKBasicRate = RATE_1M; -- pDevice->byTopOFDMBasicRate = RATE_6M; -- } -- } -+ if (pDevice->sTxEthHeader.wType == cpu_to_be16(ETH_P_PAE)) { -+ if (pDevice->byBBType != BB_TYPE_11A) { -+ pDevice->wCurrentRate = RATE_1M; -+ pDevice->byACKRate = RATE_1M; -+ pDevice->byTopCCKBasicRate = RATE_1M; -+ pDevice->byTopOFDMBasicRate = RATE_6M; -+ } else { -+ pDevice->wCurrentRate = RATE_6M; -+ pDevice->byACKRate = RATE_6M; -+ pDevice->byTopCCKBasicRate = RATE_1M; -+ pDevice->byTopOFDMBasicRate = RATE_6M; -+ } -+ } - - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n", -@@ -3017,7 +3017,7 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb) - - if (bNeedEncryption == TRUE) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType)); -- if ((pDevice->sTxEthHeader.wType) == cpu_to_le16(ETH_P_PAE)) { -+ if ((pDevice->sTxEthHeader.wType) == cpu_to_be16(ETH_P_PAE)) { - bNeedEncryption = FALSE; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType)); - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) { -diff --git a/drivers/staging/zcache/zcache-main.c b/drivers/staging/zcache/zcache-main.c -index 784c796..8d30f5c 100644 ---- a/drivers/staging/zcache/zcache-main.c -+++ b/drivers/staging/zcache/zcache-main.c -@@ -1259,13 +1259,12 @@ static int zcache_pampd_get_data_and_free(char *data, size_t *bufsize, bool raw, - void *pampd, struct tmem_pool *pool, - struct tmem_oid *oid, uint32_t index) - { -- int ret = 0; -- - BUG_ON(!is_ephemeral(pool)); -- zbud_decompress((struct page *)(data), pampd); -+ if (zbud_decompress((struct page *)(data), pampd) < 0) -+ return -EINVAL; - zbud_free_and_delist((struct zbud_hdr *)pampd); - atomic_dec(&zcache_curr_eph_pampd_count); -- return ret; -+ return 0; - } - - /* -diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c -index df9824c..0981707 100644 ---- a/drivers/target/target_core_transport.c -+++ b/drivers/target/target_core_transport.c -@@ -2261,7 +2261,7 @@ out: - /* - * Used to obtain Sense Data from underlying Linux/SCSI struct scsi_cmnd - */ --static int transport_get_sense_data(struct se_cmd *cmd) -+static void transport_get_sense_data(struct se_cmd *cmd) - { - unsigned char *buffer = cmd->sense_buffer, *sense_buffer = NULL; - struct se_device *dev = cmd->se_dev; -@@ -2271,30 +2271,15 @@ static int transport_get_sense_data(struct se_cmd *cmd) - WARN_ON(!cmd->se_lun); - - if (!dev) -- return 0; -+ return; - - spin_lock_irqsave(&cmd->t_state_lock, flags); - if (cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) { - spin_unlock_irqrestore(&cmd->t_state_lock, flags); -- return 0; -- } -- -- if (!(cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE)) -- goto out; -- -- if (!dev->transport->get_sense_buffer) { -- pr_err("dev->transport->get_sense_buffer is NULL\n"); -- goto out; -+ return; - } - - sense_buffer = dev->transport->get_sense_buffer(cmd); -- if (!sense_buffer) { -- pr_err("ITT 0x%08x cmd %p: Unable to locate" -- " sense buffer for task with sense\n", -- cmd->se_tfo->get_task_tag(cmd), cmd); -- goto out; -- } -- - spin_unlock_irqrestore(&cmd->t_state_lock, flags); - - offset = cmd->se_tfo->set_fabric_sense_len(cmd, TRANSPORT_SENSE_BUFFER); -@@ -2306,11 +2291,6 @@ static int transport_get_sense_data(struct se_cmd *cmd) - - pr_debug("HBA_[%u]_PLUG[%s]: Set SAM STATUS: 0x%02x and sense\n", - dev->se_hba->hba_id, dev->transport->name, cmd->scsi_status); -- return 0; -- --out: -- spin_unlock_irqrestore(&cmd->t_state_lock, flags); -- return -1; - } - - static inline long long transport_dev_end_lba(struct se_device *dev) -@@ -3000,15 +2980,20 @@ static int transport_generic_cmd_sequencer( - /* Returns CHECK_CONDITION + INVALID_CDB_FIELD */ - goto out_invalid_cdb_field; - } -- -+ /* -+ * For the overflow case keep the existing fabric provided -+ * ->data_length. Otherwise for the underflow case, reset -+ * ->data_length to the smaller SCSI expected data transfer -+ * length. -+ */ - if (size > cmd->data_length) { - cmd->se_cmd_flags |= SCF_OVERFLOW_BIT; - cmd->residual_count = (size - cmd->data_length); - } else { - cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT; - cmd->residual_count = (cmd->data_length - size); -+ cmd->data_length = size; - } -- cmd->data_length = size; - } - - if (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) { -@@ -3166,7 +3151,7 @@ static void transport_handle_queue_full( - static void target_complete_ok_work(struct work_struct *work) - { - struct se_cmd *cmd = container_of(work, struct se_cmd, work); -- int reason = 0, ret; -+ int ret; - - /* - * Check if we need to move delayed/dormant tasks from cmds on the -@@ -3187,19 +3172,16 @@ static void target_complete_ok_work(struct work_struct *work) - * the struct se_cmd in question. - */ - if (cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) { -- if (transport_get_sense_data(cmd) < 0) -- reason = TCM_NON_EXISTENT_LUN; -- -- if (cmd->scsi_status) { -- ret = transport_send_check_condition_and_sense( -- cmd, reason, 1); -- if (ret == -EAGAIN || ret == -ENOMEM) -- goto queue_full; -+ WARN_ON(!cmd->scsi_status); -+ transport_get_sense_data(cmd); -+ ret = transport_send_check_condition_and_sense( -+ cmd, 0, 1); -+ if (ret == -EAGAIN || ret == -ENOMEM) -+ goto queue_full; - -- transport_lun_remove_cmd(cmd); -- transport_cmd_check_stop_to_fabric(cmd); -- return; -- } -+ transport_lun_remove_cmd(cmd); -+ transport_cmd_check_stop_to_fabric(cmd); -+ return; - } - /* - * Check for a callback, used by amongst other things -diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c -index 4ef7473..e983331 100644 ---- a/drivers/tty/serial/imx.c -+++ b/drivers/tty/serial/imx.c -@@ -132,6 +132,7 @@ - #define UCR4_OREN (1<<1) /* Receiver overrun interrupt enable */ - #define UCR4_DREN (1<<0) /* Recv data ready interrupt enable */ - #define UFCR_RXTL_SHF 0 /* Receiver trigger level shift */ -+#define UFCR_DCEDTE (1<<6) /* DCE/DTE mode select */ - #define UFCR_RFDIV (7<<7) /* Reference freq divider mask */ - #define UFCR_RFDIV_REG(x) (((x) < 7 ? 6 - (x) : 6) << 7) - #define UFCR_TXTL_SHF 10 /* Transmitter trigger level shift */ -@@ -668,22 +669,11 @@ static void imx_break_ctl(struct uart_port *port, int break_state) - static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode) - { - unsigned int val; -- unsigned int ufcr_rfdiv; -- -- /* set receiver / transmitter trigger level. -- * RFDIV is set such way to satisfy requested uartclk value -- */ -- val = TXTL << 10 | RXTL; -- ufcr_rfdiv = (clk_get_rate(sport->clk_per) + sport->port.uartclk / 2) -- / sport->port.uartclk; -- -- if(!ufcr_rfdiv) -- ufcr_rfdiv = 1; -- -- val |= UFCR_RFDIV_REG(ufcr_rfdiv); - -+ /* set receiver / transmitter trigger level */ -+ val = readl(sport->port.membase + UFCR) & (UFCR_RFDIV | UFCR_DCEDTE); -+ val |= TXTL << UFCR_TXTL_SHF | RXTL; - writel(val, sport->port.membase + UFCR); -- - return 0; - } - -@@ -758,6 +748,7 @@ static int imx_startup(struct uart_port *port) - } - } - -+ spin_lock_irqsave(&sport->port.lock, flags); - /* - * Finally, clear and enable interrupts - */ -@@ -811,7 +802,6 @@ static int imx_startup(struct uart_port *port) - /* - * Enable modem status interrupts - */ -- spin_lock_irqsave(&sport->port.lock,flags); - imx_enable_ms(&sport->port); - spin_unlock_irqrestore(&sport->port.lock,flags); - -@@ -841,10 +831,13 @@ static void imx_shutdown(struct uart_port *port) - { - struct imx_port *sport = (struct imx_port *)port; - unsigned long temp; -+ unsigned long flags; - -+ spin_lock_irqsave(&sport->port.lock, flags); - temp = readl(sport->port.membase + UCR2); - temp &= ~(UCR2_TXEN); - writel(temp, sport->port.membase + UCR2); -+ spin_unlock_irqrestore(&sport->port.lock, flags); - - if (USE_IRDA(sport)) { - struct imxuart_platform_data *pdata; -@@ -873,12 +866,14 @@ static void imx_shutdown(struct uart_port *port) - * Disable all interrupts, port and break condition. - */ - -+ spin_lock_irqsave(&sport->port.lock, flags); - temp = readl(sport->port.membase + UCR1); - temp &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN); - if (USE_IRDA(sport)) - temp &= ~(UCR1_IREN); - - writel(temp, sport->port.membase + UCR1); -+ spin_unlock_irqrestore(&sport->port.lock, flags); - } - - static void -@@ -1221,6 +1216,9 @@ imx_console_write(struct console *co, const char *s, unsigned int count) - struct imx_port *sport = imx_ports[co->index]; - struct imx_port_ucrs old_ucr; - unsigned int ucr1; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&sport->port.lock, flags); - - /* - * First, save UCR1/2/3 and then disable interrupts -@@ -1246,6 +1244,8 @@ imx_console_write(struct console *co, const char *s, unsigned int count) - while (!(readl(sport->port.membase + USR2) & USR2_TXDC)); - - imx_port_ucrs_restore(&sport->port, &old_ucr); -+ -+ spin_unlock_irqrestore(&sport->port.lock, flags); - } - - /* -diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c -index 4fdec6a..558ce85 100644 ---- a/drivers/tty/serial/pch_uart.c -+++ b/drivers/tty/serial/pch_uart.c -@@ -253,6 +253,9 @@ struct eg20t_port { - dma_addr_t rx_buf_dma; - - struct dentry *debugfs; -+ -+ /* protect the eg20t_port private structure and io access to membase */ -+ spinlock_t lock; - }; - - /** -@@ -754,7 +757,8 @@ static void pch_dma_rx_complete(void *arg) - tty_flip_buffer_push(tty); - tty_kref_put(tty); - async_tx_ack(priv->desc_rx); -- pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_RX_INT); -+ pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_RX_INT | -+ PCH_UART_HAL_RX_ERR_INT); - } - - static void pch_dma_tx_complete(void *arg) -@@ -809,7 +813,8 @@ static int handle_rx_to(struct eg20t_port *priv) - int rx_size; - int ret; - if (!priv->start_rx) { -- pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_RX_INT); -+ pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_RX_INT | -+ PCH_UART_HAL_RX_ERR_INT); - return 0; - } - buf = &priv->rxbuf; -@@ -1058,7 +1063,7 @@ static irqreturn_t pch_uart_interrupt(int irq, void *dev_id) - int next = 1; - u8 msr; - -- spin_lock_irqsave(&priv->port.lock, flags); -+ spin_lock_irqsave(&priv->lock, flags); - handled = 0; - while (next) { - iid = pch_uart_hal_get_iid(priv); -@@ -1078,11 +1083,13 @@ static irqreturn_t pch_uart_interrupt(int irq, void *dev_id) - case PCH_UART_IID_RDR: /* Received Data Ready */ - if (priv->use_dma) { - pch_uart_hal_disable_interrupt(priv, -- PCH_UART_HAL_RX_INT); -+ PCH_UART_HAL_RX_INT | -+ PCH_UART_HAL_RX_ERR_INT); - ret = dma_handle_rx(priv); - if (!ret) - pch_uart_hal_enable_interrupt(priv, -- PCH_UART_HAL_RX_INT); -+ PCH_UART_HAL_RX_INT | -+ PCH_UART_HAL_RX_ERR_INT); - } else { - ret = handle_rx(priv); - } -@@ -1116,7 +1123,7 @@ static irqreturn_t pch_uart_interrupt(int irq, void *dev_id) - handled |= (unsigned int)ret; - } - -- spin_unlock_irqrestore(&priv->port.lock, flags); -+ spin_unlock_irqrestore(&priv->lock, flags); - return IRQ_RETVAL(handled); - } - -@@ -1208,7 +1215,8 @@ static void pch_uart_stop_rx(struct uart_port *port) - struct eg20t_port *priv; - priv = container_of(port, struct eg20t_port, port); - priv->start_rx = 0; -- pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_RX_INT); -+ pch_uart_hal_disable_interrupt(priv, PCH_UART_HAL_RX_INT | -+ PCH_UART_HAL_RX_ERR_INT); - } - - /* Enable the modem status interrupts. */ -@@ -1226,9 +1234,9 @@ static void pch_uart_break_ctl(struct uart_port *port, int ctl) - unsigned long flags; - - priv = container_of(port, struct eg20t_port, port); -- spin_lock_irqsave(&port->lock, flags); -+ spin_lock_irqsave(&priv->lock, flags); - pch_uart_hal_set_break(priv, ctl); -- spin_unlock_irqrestore(&port->lock, flags); -+ spin_unlock_irqrestore(&priv->lock, flags); - } - - /* Grab any interrupt resources and initialise any low level driver state. */ -@@ -1263,6 +1271,7 @@ static int pch_uart_startup(struct uart_port *port) - break; - case 16: - fifo_size = PCH_UART_HAL_FIFO16; -+ break; - case 1: - default: - fifo_size = PCH_UART_HAL_FIFO_DIS; -@@ -1300,7 +1309,8 @@ static int pch_uart_startup(struct uart_port *port) - pch_request_dma(port); - - priv->start_rx = 1; -- pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_RX_INT); -+ pch_uart_hal_enable_interrupt(priv, PCH_UART_HAL_RX_INT | -+ PCH_UART_HAL_RX_ERR_INT); - uart_update_timeout(port, CS8, default_baud); - - return 0; -@@ -1358,7 +1368,7 @@ static void pch_uart_set_termios(struct uart_port *port, - stb = PCH_UART_HAL_STB1; - - if (termios->c_cflag & PARENB) { -- if (!(termios->c_cflag & PARODD)) -+ if (termios->c_cflag & PARODD) - parity = PCH_UART_HAL_PARITY_ODD; - else - parity = PCH_UART_HAL_PARITY_EVEN; -@@ -1376,7 +1386,8 @@ static void pch_uart_set_termios(struct uart_port *port, - - baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16); - -- spin_lock_irqsave(&port->lock, flags); -+ spin_lock_irqsave(&priv->lock, flags); -+ spin_lock(&port->lock); - - uart_update_timeout(port, termios->c_cflag, baud); - rtn = pch_uart_hal_set_line(priv, baud, parity, bits, stb); -@@ -1389,7 +1400,8 @@ static void pch_uart_set_termios(struct uart_port *port, - tty_termios_encode_baud_rate(termios, baud, baud); - - out: -- spin_unlock_irqrestore(&port->lock, flags); -+ spin_unlock(&port->lock); -+ spin_unlock_irqrestore(&priv->lock, flags); - } - - static const char *pch_uart_type(struct uart_port *port) -@@ -1538,8 +1550,9 @@ pch_console_write(struct console *co, const char *s, unsigned int count) - { - struct eg20t_port *priv; - unsigned long flags; -+ int priv_locked = 1; -+ int port_locked = 1; - u8 ier; -- int locked = 1; - - priv = pch_uart_ports[co->index]; - -@@ -1547,12 +1560,16 @@ pch_console_write(struct console *co, const char *s, unsigned int count) - - local_irq_save(flags); - if (priv->port.sysrq) { -- /* serial8250_handle_port() already took the lock */ -- locked = 0; -+ spin_lock(&priv->lock); -+ /* serial8250_handle_port() already took the port lock */ -+ port_locked = 0; - } else if (oops_in_progress) { -- locked = spin_trylock(&priv->port.lock); -- } else -+ priv_locked = spin_trylock(&priv->lock); -+ port_locked = spin_trylock(&priv->port.lock); -+ } else { -+ spin_lock(&priv->lock); - spin_lock(&priv->port.lock); -+ } - - /* - * First save the IER then disable the interrupts -@@ -1570,8 +1587,10 @@ pch_console_write(struct console *co, const char *s, unsigned int count) - wait_for_xmitr(priv, BOTH_EMPTY); - iowrite8(ier, priv->membase + UART_IER); - -- if (locked) -+ if (port_locked) - spin_unlock(&priv->port.lock); -+ if (priv_locked) -+ spin_unlock(&priv->lock); - local_irq_restore(flags); - } - -@@ -1669,6 +1688,8 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev, - pci_enable_msi(pdev); - pci_set_master(pdev); - -+ spin_lock_init(&priv->lock); -+ - iobase = pci_resource_start(pdev, 0); - mapbase = pci_resource_start(pdev, 1); - priv->mapbase = mapbase; -diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c -index 51f9694..ea271d7 100644 ---- a/drivers/usb/chipidea/udc.c -+++ b/drivers/usb/chipidea/udc.c -@@ -77,8 +77,7 @@ static inline int ep_to_bit(struct ci13xxx *udc, int n) - } - - /** -- * hw_device_state: enables/disables interrupts & starts/stops device (execute -- * without interruption) -+ * hw_device_state: enables/disables interrupts (execute without interruption) - * @dma: 0 => disable, !0 => enable and set dma engine - * - * This function returns an error code -@@ -92,7 +91,6 @@ static int hw_device_state(struct ci13xxx *udc, u32 dma) - USBi_UI|USBi_UEI|USBi_PCI|USBi_URI|USBi_SLI); - hw_write(udc, OP_USBCMD, USBCMD_RS, USBCMD_RS); - } else { -- hw_write(udc, OP_USBCMD, USBCMD_RS, 0); - hw_write(udc, OP_USBINTR, ~0, 0); - } - return 0; -@@ -773,10 +771,7 @@ __acquires(mEp->lock) - { - struct ci13xxx_req *mReq, *mReqTemp; - struct ci13xxx_ep *mEpTemp = mEp; -- int uninitialized_var(retval); -- -- if (list_empty(&mEp->qh.queue)) -- return -EINVAL; -+ int retval = 0; - - list_for_each_entry_safe(mReq, mReqTemp, &mEp->qh.queue, - queue) { -@@ -1419,6 +1414,21 @@ static int ci13xxx_vbus_draw(struct usb_gadget *_gadget, unsigned mA) - return -ENOTSUPP; - } - -+/* Change Data+ pullup status -+ * this func is used by usb_gadget_connect/disconnet -+ */ -+static int ci13xxx_pullup(struct usb_gadget *_gadget, int is_on) -+{ -+ struct ci13xxx *ci = container_of(_gadget, struct ci13xxx, gadget); -+ -+ if (is_on) -+ hw_write(ci, OP_USBCMD, USBCMD_RS, USBCMD_RS); -+ else -+ hw_write(ci, OP_USBCMD, USBCMD_RS, 0); -+ -+ return 0; -+} -+ - static int ci13xxx_start(struct usb_gadget *gadget, - struct usb_gadget_driver *driver); - static int ci13xxx_stop(struct usb_gadget *gadget, -@@ -1431,6 +1441,7 @@ static int ci13xxx_stop(struct usb_gadget *gadget, - static const struct usb_gadget_ops usb_gadget_ops = { - .vbus_session = ci13xxx_vbus_session, - .wakeup = ci13xxx_wakeup, -+ .pullup = ci13xxx_pullup, - .vbus_draw = ci13xxx_vbus_draw, - .udc_start = ci13xxx_start, - .udc_stop = ci13xxx_stop, -@@ -1454,7 +1465,12 @@ static int init_eps(struct ci13xxx *udc) - - mEp->ep.name = mEp->name; - mEp->ep.ops = &usb_ep_ops; -- mEp->ep.maxpacket = CTRL_PAYLOAD_MAX; -+ /* -+ * for ep0: maxP defined in desc, for other -+ * eps, maxP is set by epautoconfig() called -+ * by gadget layer -+ */ -+ mEp->ep.maxpacket = (unsigned short)~0; - - INIT_LIST_HEAD(&mEp->qh.queue); - mEp->qh.ptr = dma_pool_alloc(udc->qh_pool, GFP_KERNEL, -@@ -1474,6 +1490,7 @@ static int init_eps(struct ci13xxx *udc) - else - udc->ep0in = mEp; - -+ mEp->ep.maxpacket = CTRL_PAYLOAD_MAX; - continue; - } - -@@ -1483,6 +1500,17 @@ static int init_eps(struct ci13xxx *udc) - return retval; - } - -+static void destroy_eps(struct ci13xxx *udc) -+{ -+ int i; -+ -+ for (i = 0; i < udc->hw_ep_max; i++) { -+ struct ci13xxx_ep *mEp = &udc->ci13xxx_ep[i]; -+ -+ dma_pool_free(udc->qh_pool, mEp->qh.ptr, mEp->qh.dma); -+ } -+} -+ - /** - * ci13xxx_start: register a gadget driver - * @gadget: our gadget -@@ -1692,7 +1720,7 @@ static int udc_start(struct ci13xxx *udc) - if (udc->udc_driver->flags & CI13XXX_REQUIRE_TRANSCEIVER) { - if (udc->transceiver == NULL) { - retval = -ENODEV; -- goto free_pools; -+ goto destroy_eps; - } - } - -@@ -1730,7 +1758,7 @@ static int udc_start(struct ci13xxx *udc) - - remove_trans: - if (udc->transceiver) { -- otg_set_peripheral(udc->transceiver->otg, &udc->gadget); -+ otg_set_peripheral(udc->transceiver->otg, NULL); - usb_put_transceiver(udc->transceiver); - } - -@@ -1742,6 +1770,8 @@ unreg_device: - put_transceiver: - if (udc->transceiver) - usb_put_transceiver(udc->transceiver); -+destroy_eps: -+ destroy_eps(udc); - free_pools: - dma_pool_destroy(udc->td_pool); - free_qh_pool: -@@ -1756,18 +1786,12 @@ free_qh_pool: - */ - static void udc_stop(struct ci13xxx *udc) - { -- int i; -- - if (udc == NULL) - return; - - usb_del_gadget_udc(&udc->gadget); - -- for (i = 0; i < udc->hw_ep_max; i++) { -- struct ci13xxx_ep *mEp = &udc->ci13xxx_ep[i]; -- -- dma_pool_free(udc->qh_pool, mEp->qh.ptr, mEp->qh.dma); -- } -+ destroy_eps(udc); - - dma_pool_destroy(udc->td_pool); - dma_pool_destroy(udc->qh_pool); -diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c -index ee46927..3cc771e 100644 ---- a/drivers/usb/class/cdc-wdm.c -+++ b/drivers/usb/class/cdc-wdm.c -@@ -134,12 +134,14 @@ static struct usb_driver wdm_driver; - /* return intfdata if we own the interface, else look up intf in the list */ - static struct wdm_device *wdm_find_device(struct usb_interface *intf) - { -- struct wdm_device *desc = NULL; -+ struct wdm_device *desc; - - spin_lock(&wdm_device_list_lock); - list_for_each_entry(desc, &wdm_device_list, device_list) - if (desc->intf == intf) -- break; -+ goto found; -+ desc = NULL; -+found: - spin_unlock(&wdm_device_list_lock); - - return desc; -@@ -147,12 +149,14 @@ static struct wdm_device *wdm_find_device(struct usb_interface *intf) - - static struct wdm_device *wdm_find_device_by_minor(int minor) - { -- struct wdm_device *desc = NULL; -+ struct wdm_device *desc; - - spin_lock(&wdm_device_list_lock); - list_for_each_entry(desc, &wdm_device_list, device_list) - if (desc->intf->minor == minor) -- break; -+ goto found; -+ desc = NULL; -+found: - spin_unlock(&wdm_device_list_lock); - - return desc; -diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c -index d956965..3440812 100644 ---- a/drivers/usb/core/devices.c -+++ b/drivers/usb/core/devices.c -@@ -624,7 +624,7 @@ static ssize_t usb_device_read(struct file *file, char __user *buf, - /* print devices for all busses */ - list_for_each_entry(bus, &usb_bus_list, bus_list) { - /* recurse through all children of the root hub */ -- if (!bus->root_hub) -+ if (!bus_to_hcd(bus)->rh_registered) - continue; - usb_lock_device(bus->root_hub); - ret = usb_device_dump(&buf, &nbytes, &skip_bytes, ppos, -diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c -index 190b1ec..6b6891fc 100644 ---- a/drivers/usb/core/hcd.c -+++ b/drivers/usb/core/hcd.c -@@ -1011,10 +1011,7 @@ static int register_root_hub(struct usb_hcd *hcd) - if (retval) { - dev_err (parent_dev, "can't register root hub for %s, %d\n", - dev_name(&usb_dev->dev), retval); -- } -- mutex_unlock(&usb_bus_list_lock); -- -- if (retval == 0) { -+ } else { - spin_lock_irq (&hcd_root_hub_lock); - hcd->rh_registered = 1; - spin_unlock_irq (&hcd_root_hub_lock); -@@ -1023,6 +1020,7 @@ static int register_root_hub(struct usb_hcd *hcd) - if (HCD_DEAD(hcd)) - usb_hc_died (hcd); /* This time clean up */ - } -+ mutex_unlock(&usb_bus_list_lock); - - return retval; - } -diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c -index 32d3adc..8b2a9d8 100644 ---- a/drivers/usb/core/quirks.c -+++ b/drivers/usb/core/quirks.c -@@ -96,6 +96,10 @@ static const struct usb_device_id usb_quirk_list[] = { - { USB_DEVICE(0x04b4, 0x0526), .driver_info = - USB_QUIRK_CONFIG_INTF_STRINGS }, - -+ /* Microchip Joss Optical infrared touchboard device */ -+ { USB_DEVICE(0x04d8, 0x000c), .driver_info = -+ USB_QUIRK_CONFIG_INTF_STRINGS }, -+ - /* Samsung Android phone modem - ID conflict with SPH-I500 */ - { USB_DEVICE(0x04e8, 0x6601), .driver_info = - USB_QUIRK_CONFIG_INTF_STRINGS }, -diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c -index 1040bdb..6dc9d2f 100644 ---- a/drivers/usb/dwc3/core.c -+++ b/drivers/usb/dwc3/core.c -@@ -429,16 +429,21 @@ static int __devinit dwc3_probe(struct platform_device *pdev) - dev_err(dev, "missing IRQ\n"); - return -ENODEV; - } -- dwc->xhci_resources[1] = *res; -+ dwc->xhci_resources[1].start = res->start; -+ dwc->xhci_resources[1].end = res->end; -+ dwc->xhci_resources[1].flags = res->flags; -+ dwc->xhci_resources[1].name = res->name; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) { - dev_err(dev, "missing memory resource\n"); - return -ENODEV; - } -- dwc->xhci_resources[0] = *res; -+ dwc->xhci_resources[0].start = res->start; - dwc->xhci_resources[0].end = dwc->xhci_resources[0].start + - DWC3_XHCI_REGS_END; -+ dwc->xhci_resources[0].flags = res->flags; -+ dwc->xhci_resources[0].name = res->name; - - /* - * Request memory region but exclude xHCI regs, -diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c -index 9e8a3dc..127551c 100644 ---- a/drivers/usb/dwc3/ep0.c -+++ b/drivers/usb/dwc3/ep0.c -@@ -702,7 +702,6 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, - transferred = min_t(u32, ur->length, - transfer_size - length); - memcpy(ur->buf, dwc->ep0_bounce, transferred); -- dwc->ep0_bounced = false; - } else { - transferred = ur->length - length; - } -diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c -index ec70df7..0b24d9d 100644 ---- a/drivers/usb/dwc3/gadget.c -+++ b/drivers/usb/dwc3/gadget.c -@@ -238,8 +238,11 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, - if (req->request.status == -EINPROGRESS) - req->request.status = status; - -- usb_gadget_unmap_request(&dwc->gadget, &req->request, -- req->direction); -+ if (dwc->ep0_bounced && dep->number == 0) -+ dwc->ep0_bounced = false; -+ else -+ usb_gadget_unmap_request(&dwc->gadget, &req->request, -+ req->direction); - - dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n", - req, dep->name, req->request.actual, -diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c -index 1a4430f..22865dd 100644 ---- a/drivers/usb/gadget/at91_udc.c -+++ b/drivers/usb/gadget/at91_udc.c -@@ -475,8 +475,7 @@ static int at91_ep_enable(struct usb_ep *_ep, - unsigned long flags; - - if (!_ep || !ep -- || !desc || ep->ep.desc -- || _ep->name == ep0name -+ || !desc || _ep->name == ep0name - || desc->bDescriptorType != USB_DT_ENDPOINT - || (maxpacket = usb_endpoint_maxp(desc)) == 0 - || maxpacket > ep->maxpacket) { -@@ -530,7 +529,6 @@ ok: - tmp |= AT91_UDP_EPEDS; - __raw_writel(tmp, ep->creg); - -- ep->ep.desc = desc; - ep->ep.maxpacket = maxpacket; - - /* -@@ -1634,7 +1632,6 @@ static int at91_start(struct usb_gadget *gadget, - udc = container_of(gadget, struct at91_udc, gadget); - udc->driver = driver; - udc->gadget.dev.driver = &driver->driver; -- dev_set_drvdata(&udc->gadget.dev, &driver->driver); - udc->enabled = 1; - udc->selfpowered = 1; - -@@ -1655,7 +1652,6 @@ static int at91_stop(struct usb_gadget *gadget, - spin_unlock_irqrestore(&udc->lock, flags); - - udc->gadget.dev.driver = NULL; -- dev_set_drvdata(&udc->gadget.dev, NULL); - udc->driver = NULL; - - DBG("unbound from %s\n", driver->driver.name); -diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c -index b799106..afdbb1c 100644 ---- a/drivers/usb/gadget/dummy_hcd.c -+++ b/drivers/usb/gadget/dummy_hcd.c -@@ -1916,6 +1916,27 @@ done: - return retval; - } - -+/* usb 3.0 root hub device descriptor */ -+struct { -+ struct usb_bos_descriptor bos; -+ struct usb_ss_cap_descriptor ss_cap; -+} __packed usb3_bos_desc = { -+ -+ .bos = { -+ .bLength = USB_DT_BOS_SIZE, -+ .bDescriptorType = USB_DT_BOS, -+ .wTotalLength = cpu_to_le16(sizeof(usb3_bos_desc)), -+ .bNumDeviceCaps = 1, -+ }, -+ .ss_cap = { -+ .bLength = USB_DT_USB_SS_CAP_SIZE, -+ .bDescriptorType = USB_DT_DEVICE_CAPABILITY, -+ .bDevCapabilityType = USB_SS_CAP_TYPE, -+ .wSpeedSupported = cpu_to_le16(USB_5GBPS_OPERATION), -+ .bFunctionalitySupport = ilog2(USB_5GBPS_OPERATION), -+ }, -+}; -+ - static inline void - ss_hub_descriptor(struct usb_hub_descriptor *desc) - { -@@ -2006,6 +2027,18 @@ static int dummy_hub_control( - else - hub_descriptor((struct usb_hub_descriptor *) buf); - break; -+ -+ case DeviceRequest | USB_REQ_GET_DESCRIPTOR: -+ if (hcd->speed != HCD_USB3) -+ goto error; -+ -+ if ((wValue >> 8) != USB_DT_BOS) -+ goto error; -+ -+ memcpy(buf, &usb3_bos_desc, sizeof(usb3_bos_desc)); -+ retval = sizeof(usb3_bos_desc); -+ break; -+ - case GetHubStatus: - *(__le32 *) buf = cpu_to_le32(0); - break; -@@ -2503,10 +2536,8 @@ static int dummy_hcd_probe(struct platform_device *pdev) - hs_hcd->has_tt = 1; - - retval = usb_add_hcd(hs_hcd, 0, 0); -- if (retval != 0) { -- usb_put_hcd(hs_hcd); -- return retval; -- } -+ if (retval) -+ goto put_usb2_hcd; - - if (mod_data.is_super_speed) { - ss_hcd = usb_create_shared_hcd(&dummy_hcd, &pdev->dev, -@@ -2525,6 +2556,8 @@ static int dummy_hcd_probe(struct platform_device *pdev) - put_usb3_hcd: - usb_put_hcd(ss_hcd); - dealloc_usb2_hcd: -+ usb_remove_hcd(hs_hcd); -+put_usb2_hcd: - usb_put_hcd(hs_hcd); - the_controller.hs_hcd = the_controller.ss_hcd = NULL; - return retval; -diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c -index c304354..4a54418 100644 ---- a/drivers/usb/host/ehci-omap.c -+++ b/drivers/usb/host/ehci-omap.c -@@ -56,15 +56,6 @@ - #define EHCI_INSNREG05_ULPI_EXTREGADD_SHIFT 8 - #define EHCI_INSNREG05_ULPI_WRDATA_SHIFT 0 - --/* Errata i693 */ --static struct clk *utmi_p1_fck; --static struct clk *utmi_p2_fck; --static struct clk *xclk60mhsp1_ck; --static struct clk *xclk60mhsp2_ck; --static struct clk *usbhost_p1_fck; --static struct clk *usbhost_p2_fck; --static struct clk *init_60m_fclk; -- - /*-------------------------------------------------------------------------*/ - - static const struct hc_driver ehci_omap_hc_driver; -@@ -80,40 +71,6 @@ static inline u32 ehci_read(void __iomem *base, u32 reg) - return __raw_readl(base + reg); - } - --/* Erratum i693 workaround sequence */ --static void omap_ehci_erratum_i693(struct ehci_hcd *ehci) --{ -- int ret = 0; -- -- /* Switch to the internal 60 MHz clock */ -- ret = clk_set_parent(utmi_p1_fck, init_60m_fclk); -- if (ret != 0) -- ehci_err(ehci, "init_60m_fclk set parent" -- "failed error:%d\n", ret); -- -- ret = clk_set_parent(utmi_p2_fck, init_60m_fclk); -- if (ret != 0) -- ehci_err(ehci, "init_60m_fclk set parent" -- "failed error:%d\n", ret); -- -- clk_enable(usbhost_p1_fck); -- clk_enable(usbhost_p2_fck); -- -- /* Wait 1ms and switch back to the external clock */ -- mdelay(1); -- ret = clk_set_parent(utmi_p1_fck, xclk60mhsp1_ck); -- if (ret != 0) -- ehci_err(ehci, "xclk60mhsp1_ck set parent" -- "failed error:%d\n", ret); -- -- ret = clk_set_parent(utmi_p2_fck, xclk60mhsp2_ck); -- if (ret != 0) -- ehci_err(ehci, "xclk60mhsp2_ck set parent" -- "failed error:%d\n", ret); -- -- clk_disable(usbhost_p1_fck); -- clk_disable(usbhost_p2_fck); --} - - static void omap_ehci_soft_phy_reset(struct platform_device *pdev, u8 port) - { -@@ -145,50 +102,6 @@ static void omap_ehci_soft_phy_reset(struct platform_device *pdev, u8 port) - } - } - --static int omap_ehci_hub_control( -- struct usb_hcd *hcd, -- u16 typeReq, -- u16 wValue, -- u16 wIndex, -- char *buf, -- u16 wLength --) --{ -- struct ehci_hcd *ehci = hcd_to_ehci(hcd); -- u32 __iomem *status_reg = &ehci->regs->port_status[ -- (wIndex & 0xff) - 1]; -- u32 temp; -- unsigned long flags; -- int retval = 0; -- -- spin_lock_irqsave(&ehci->lock, flags); -- -- if (typeReq == SetPortFeature && wValue == USB_PORT_FEAT_SUSPEND) { -- temp = ehci_readl(ehci, status_reg); -- if ((temp & PORT_PE) == 0 || (temp & PORT_RESET) != 0) { -- retval = -EPIPE; -- goto done; -- } -- -- temp &= ~PORT_WKCONN_E; -- temp |= PORT_WKDISC_E | PORT_WKOC_E; -- ehci_writel(ehci, temp | PORT_SUSPEND, status_reg); -- -- omap_ehci_erratum_i693(ehci); -- -- set_bit((wIndex & 0xff) - 1, &ehci->suspended_ports); -- goto done; -- } -- -- spin_unlock_irqrestore(&ehci->lock, flags); -- -- /* Handle the hub control events here */ -- return ehci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength); --done: -- spin_unlock_irqrestore(&ehci->lock, flags); -- return retval; --} -- - static void disable_put_regulator( - struct ehci_hcd_omap_platform_data *pdata) - { -@@ -351,76 +264,9 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) - /* root ports should always stay powered */ - ehci_port_power(omap_ehci, 1); - -- /* get clocks */ -- utmi_p1_fck = clk_get(dev, "utmi_p1_gfclk"); -- if (IS_ERR(utmi_p1_fck)) { -- ret = PTR_ERR(utmi_p1_fck); -- dev_err(dev, "utmi_p1_gfclk failed error:%d\n", ret); -- goto err_add_hcd; -- } -- -- xclk60mhsp1_ck = clk_get(dev, "xclk60mhsp1_ck"); -- if (IS_ERR(xclk60mhsp1_ck)) { -- ret = PTR_ERR(xclk60mhsp1_ck); -- dev_err(dev, "xclk60mhsp1_ck failed error:%d\n", ret); -- goto err_utmi_p1_fck; -- } -- -- utmi_p2_fck = clk_get(dev, "utmi_p2_gfclk"); -- if (IS_ERR(utmi_p2_fck)) { -- ret = PTR_ERR(utmi_p2_fck); -- dev_err(dev, "utmi_p2_gfclk failed error:%d\n", ret); -- goto err_xclk60mhsp1_ck; -- } -- -- xclk60mhsp2_ck = clk_get(dev, "xclk60mhsp2_ck"); -- if (IS_ERR(xclk60mhsp2_ck)) { -- ret = PTR_ERR(xclk60mhsp2_ck); -- dev_err(dev, "xclk60mhsp2_ck failed error:%d\n", ret); -- goto err_utmi_p2_fck; -- } -- -- usbhost_p1_fck = clk_get(dev, "usb_host_hs_utmi_p1_clk"); -- if (IS_ERR(usbhost_p1_fck)) { -- ret = PTR_ERR(usbhost_p1_fck); -- dev_err(dev, "usbhost_p1_fck failed error:%d\n", ret); -- goto err_xclk60mhsp2_ck; -- } -- -- usbhost_p2_fck = clk_get(dev, "usb_host_hs_utmi_p2_clk"); -- if (IS_ERR(usbhost_p2_fck)) { -- ret = PTR_ERR(usbhost_p2_fck); -- dev_err(dev, "usbhost_p2_fck failed error:%d\n", ret); -- goto err_usbhost_p1_fck; -- } -- -- init_60m_fclk = clk_get(dev, "init_60m_fclk"); -- if (IS_ERR(init_60m_fclk)) { -- ret = PTR_ERR(init_60m_fclk); -- dev_err(dev, "init_60m_fclk failed error:%d\n", ret); -- goto err_usbhost_p2_fck; -- } - - return 0; - --err_usbhost_p2_fck: -- clk_put(usbhost_p2_fck); -- --err_usbhost_p1_fck: -- clk_put(usbhost_p1_fck); -- --err_xclk60mhsp2_ck: -- clk_put(xclk60mhsp2_ck); -- --err_utmi_p2_fck: -- clk_put(utmi_p2_fck); -- --err_xclk60mhsp1_ck: -- clk_put(xclk60mhsp1_ck); -- --err_utmi_p1_fck: -- clk_put(utmi_p1_fck); -- - err_add_hcd: - disable_put_regulator(pdata); - pm_runtime_put_sync(dev); -@@ -450,14 +296,6 @@ static int ehci_hcd_omap_remove(struct platform_device *pdev) - iounmap(hcd->regs); - usb_put_hcd(hcd); - -- clk_put(utmi_p1_fck); -- clk_put(utmi_p2_fck); -- clk_put(xclk60mhsp1_ck); -- clk_put(xclk60mhsp2_ck); -- clk_put(usbhost_p1_fck); -- clk_put(usbhost_p2_fck); -- clk_put(init_60m_fclk); -- - pm_runtime_put_sync(dev); - pm_runtime_disable(dev); - -@@ -528,7 +366,7 @@ static const struct hc_driver ehci_omap_hc_driver = { - * root hub support - */ - .hub_status_data = ehci_hub_status_data, -- .hub_control = omap_ehci_hub_control, -+ .hub_control = ehci_hub_control, - .bus_suspend = ehci_bus_suspend, - .bus_resume = ehci_bus_resume, - -diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c -index 4378bf7..d2b0957 100644 ---- a/drivers/usb/host/ehci-q.c -+++ b/drivers/usb/host/ehci-q.c -@@ -128,9 +128,17 @@ qh_refresh (struct ehci_hcd *ehci, struct ehci_qh *qh) - else { - qtd = list_entry (qh->qtd_list.next, - struct ehci_qtd, qtd_list); -- /* first qtd may already be partially processed */ -- if (cpu_to_hc32(ehci, qtd->qtd_dma) == qh->hw->hw_current) -+ /* -+ * first qtd may already be partially processed. -+ * If we come here during unlink, the QH overlay region -+ * might have reference to the just unlinked qtd. The -+ * qtd is updated in qh_completions(). Update the QH -+ * overlay here. -+ */ -+ if (cpu_to_hc32(ehci, qtd->qtd_dma) == qh->hw->hw_current) { -+ qh->hw->hw_qtd_next = qtd->hw_next; - qtd = NULL; -+ } - } - - if (qtd) -diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c -index a665b3e..0bf72f9 100644 ---- a/drivers/usb/host/ohci-at91.c -+++ b/drivers/usb/host/ohci-at91.c -@@ -467,7 +467,8 @@ static irqreturn_t ohci_hcd_at91_overcurrent_irq(int irq, void *data) - /* From the GPIO notifying the over-current situation, find - * out the corresponding port */ - at91_for_each_port(port) { -- if (gpio_to_irq(pdata->overcurrent_pin[port]) == irq) { -+ if (gpio_is_valid(pdata->overcurrent_pin[port]) && -+ gpio_to_irq(pdata->overcurrent_pin[port]) == irq) { - gpio = pdata->overcurrent_pin[port]; - break; - } -@@ -570,6 +571,16 @@ static int __devinit ohci_hcd_at91_drv_probe(struct platform_device *pdev) - - if (pdata) { - at91_for_each_port(i) { -+ /* -+ * do not configure PIO if not in relation with -+ * real USB port on board -+ */ -+ if (i >= pdata->ports) { -+ pdata->vbus_pin[i] = -EINVAL; -+ pdata->overcurrent_pin[i] = -EINVAL; -+ break; -+ } -+ - if (!gpio_is_valid(pdata->vbus_pin[i])) - continue; - gpio = pdata->vbus_pin[i]; -diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c -index c5e9e4a..966d148 100644 ---- a/drivers/usb/host/pci-quirks.c -+++ b/drivers/usb/host/pci-quirks.c -@@ -75,7 +75,9 @@ - #define NB_PIF0_PWRDOWN_1 0x01100013 - - #define USB_INTEL_XUSB2PR 0xD0 -+#define USB_INTEL_USB2PRM 0xD4 - #define USB_INTEL_USB3_PSSEN 0xD8 -+#define USB_INTEL_USB3PRM 0xDC - - static struct amd_chipset_info { - struct pci_dev *nb_dev; -@@ -772,10 +774,18 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev) - return; - } - -- ports_available = 0xffffffff; -+ /* Read USB3PRM, the USB 3.0 Port Routing Mask Register -+ * Indicate the ports that can be changed from OS. -+ */ -+ pci_read_config_dword(xhci_pdev, USB_INTEL_USB3PRM, -+ &ports_available); -+ -+ dev_dbg(&xhci_pdev->dev, "Configurable ports to enable SuperSpeed: 0x%x\n", -+ ports_available); -+ - /* Write USB3_PSSEN, the USB 3.0 Port SuperSpeed Enable -- * Register, to turn on SuperSpeed terminations for all -- * available ports. -+ * Register, to turn on SuperSpeed terminations for the -+ * switchable ports. - */ - pci_write_config_dword(xhci_pdev, USB_INTEL_USB3_PSSEN, - cpu_to_le32(ports_available)); -@@ -785,7 +795,16 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev) - dev_dbg(&xhci_pdev->dev, "USB 3.0 ports that are now enabled " - "under xHCI: 0x%x\n", ports_available); - -- ports_available = 0xffffffff; -+ /* Read XUSB2PRM, xHCI USB 2.0 Port Routing Mask Register -+ * Indicate the USB 2.0 ports to be controlled by the xHCI host. -+ */ -+ -+ pci_read_config_dword(xhci_pdev, USB_INTEL_USB2PRM, -+ &ports_available); -+ -+ dev_dbg(&xhci_pdev->dev, "Configurable USB 2.0 ports to hand over to xCHI: 0x%x\n", -+ ports_available); -+ - /* Write XUSB2PR, the xHC USB 2.0 Port Routing Register, to - * switch the USB 2.0 power and data lines over to the xHCI - * host. -@@ -822,12 +841,12 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev) - void __iomem *op_reg_base; - u32 val; - int timeout; -+ int len = pci_resource_len(pdev, 0); - - if (!mmio_resource_enabled(pdev, 0)) - return; - -- base = ioremap_nocache(pci_resource_start(pdev, 0), -- pci_resource_len(pdev, 0)); -+ base = ioremap_nocache(pci_resource_start(pdev, 0), len); - if (base == NULL) - return; - -@@ -837,9 +856,17 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev) - */ - ext_cap_offset = xhci_find_next_cap_offset(base, XHCI_HCC_PARAMS_OFFSET); - do { -+ if ((ext_cap_offset + sizeof(val)) > len) { -+ /* We're reading garbage from the controller */ -+ dev_warn(&pdev->dev, -+ "xHCI controller failing to respond"); -+ return; -+ } -+ - if (!ext_cap_offset) - /* We've reached the end of the extended capabilities */ - goto hc_init; -+ - val = readl(base + ext_cap_offset); - if (XHCI_EXT_CAPS_ID(val) == XHCI_EXT_CAPS_LEGACY) - break; -@@ -870,9 +897,10 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev) - /* Disable any BIOS SMIs and clear all SMI events*/ - writel(val, base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET); - -+hc_init: - if (usb_is_intel_switchable_xhci(pdev)) - usb_enable_xhci_ports(pdev); --hc_init: -+ - op_reg_base = base + XHCI_HC_LENGTH(readl(base)); - - /* Wait for the host controller to be ready before writing any -diff --git a/drivers/usb/host/pci-quirks.h b/drivers/usb/host/pci-quirks.h -index ef004a5..7f69a39 100644 ---- a/drivers/usb/host/pci-quirks.h -+++ b/drivers/usb/host/pci-quirks.h -@@ -15,6 +15,7 @@ void usb_disable_xhci_ports(struct pci_dev *xhci_pdev); - static inline void usb_amd_quirk_pll_disable(void) {} - static inline void usb_amd_quirk_pll_enable(void) {} - static inline void usb_amd_dev_put(void) {} -+static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {} - #endif /* CONFIG_PCI */ - - #endif /* __LINUX_USB_PCI_QUIRKS_H */ -diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c -index 7b01094..32ca289 100644 ---- a/drivers/usb/host/xhci-hub.c -+++ b/drivers/usb/host/xhci-hub.c -@@ -493,11 +493,48 @@ static void xhci_hub_report_link_state(u32 *status, u32 status_reg) - * when this bit is set. - */ - pls |= USB_PORT_STAT_CONNECTION; -+ } else { -+ /* -+ * If CAS bit isn't set but the Port is already at -+ * Compliance Mode, fake a connection so the USB core -+ * notices the Compliance state and resets the port. -+ * This resolves an issue generated by the SN65LVPE502CP -+ * in which sometimes the port enters compliance mode -+ * caused by a delay on the host-device negotiation. -+ */ -+ if (pls == USB_SS_PORT_LS_COMP_MOD) -+ pls |= USB_PORT_STAT_CONNECTION; - } -+ - /* update status field */ - *status |= pls; - } - -+/* -+ * Function for Compliance Mode Quirk. -+ * -+ * This Function verifies if all xhc USB3 ports have entered U0, if so, -+ * the compliance mode timer is deleted. A port won't enter -+ * compliance mode if it has previously entered U0. -+ */ -+void xhci_del_comp_mod_timer(struct xhci_hcd *xhci, u32 status, u16 wIndex) -+{ -+ u32 all_ports_seen_u0 = ((1 << xhci->num_usb3_ports)-1); -+ bool port_in_u0 = ((status & PORT_PLS_MASK) == XDEV_U0); -+ -+ if (!(xhci->quirks & XHCI_COMP_MODE_QUIRK)) -+ return; -+ -+ if ((xhci->port_status_u0 != all_ports_seen_u0) && port_in_u0) { -+ xhci->port_status_u0 |= 1 << wIndex; -+ if (xhci->port_status_u0 == all_ports_seen_u0) { -+ del_timer_sync(&xhci->comp_mode_recovery_timer); -+ xhci_dbg(xhci, "All USB3 ports have entered U0 already!\n"); -+ xhci_dbg(xhci, "Compliance Mode Recovery Timer Deleted.\n"); -+ } -+ } -+} -+ - int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, - u16 wIndex, char *buf, u16 wLength) - { -@@ -645,6 +682,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, - /* Update Port Link State for super speed ports*/ - if (hcd->speed == HCD_USB3) { - xhci_hub_report_link_state(&status, temp); -+ /* -+ * Verify if all USB3 Ports Have entered U0 already. -+ * Delete Compliance Mode Timer if so. -+ */ -+ xhci_del_comp_mod_timer(xhci, temp, wIndex); - } - if (bus_state->port_c_suspend & (1 << wIndex)) - status |= 1 << USB_PORT_FEAT_C_SUSPEND; -diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c -index 689bc18..df90fe5 100644 ---- a/drivers/usb/host/xhci-plat.c -+++ b/drivers/usb/host/xhci-plat.c -@@ -118,7 +118,7 @@ static int xhci_plat_probe(struct platform_device *pdev) - goto put_hcd; - } - -- hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); -+ hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); - if (!hcd->regs) { - dev_dbg(&pdev->dev, "error mapping memory\n"); - ret = -EFAULT; -diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c -index 81aa10c..45f0b65 100644 ---- a/drivers/usb/host/xhci.c -+++ b/drivers/usb/host/xhci.c -@@ -26,6 +26,7 @@ - #include <linux/module.h> - #include <linux/moduleparam.h> - #include <linux/slab.h> -+#include <linux/dmi.h> - - #include "xhci.h" - -@@ -398,6 +399,95 @@ static void xhci_msix_sync_irqs(struct xhci_hcd *xhci) - - #endif - -+static void compliance_mode_recovery(unsigned long arg) -+{ -+ struct xhci_hcd *xhci; -+ struct usb_hcd *hcd; -+ u32 temp; -+ int i; -+ -+ xhci = (struct xhci_hcd *)arg; -+ -+ for (i = 0; i < xhci->num_usb3_ports; i++) { -+ temp = xhci_readl(xhci, xhci->usb3_ports[i]); -+ if ((temp & PORT_PLS_MASK) == USB_SS_PORT_LS_COMP_MOD) { -+ /* -+ * Compliance Mode Detected. Letting USB Core -+ * handle the Warm Reset -+ */ -+ xhci_dbg(xhci, "Compliance Mode Detected->Port %d!\n", -+ i + 1); -+ xhci_dbg(xhci, "Attempting Recovery routine!\n"); -+ hcd = xhci->shared_hcd; -+ -+ if (hcd->state == HC_STATE_SUSPENDED) -+ usb_hcd_resume_root_hub(hcd); -+ -+ usb_hcd_poll_rh_status(hcd); -+ } -+ } -+ -+ if (xhci->port_status_u0 != ((1 << xhci->num_usb3_ports)-1)) -+ mod_timer(&xhci->comp_mode_recovery_timer, -+ jiffies + msecs_to_jiffies(COMP_MODE_RCVRY_MSECS)); -+} -+ -+/* -+ * Quirk to work around issue generated by the SN65LVPE502CP USB3.0 re-driver -+ * that causes ports behind that hardware to enter compliance mode sometimes. -+ * The quirk creates a timer that polls every 2 seconds the link state of -+ * each host controller's port and recovers it by issuing a Warm reset -+ * if Compliance mode is detected, otherwise the port will become "dead" (no -+ * device connections or disconnections will be detected anymore). Becasue no -+ * status event is generated when entering compliance mode (per xhci spec), -+ * this quirk is needed on systems that have the failing hardware installed. -+ */ -+static void compliance_mode_recovery_timer_init(struct xhci_hcd *xhci) -+{ -+ xhci->port_status_u0 = 0; -+ init_timer(&xhci->comp_mode_recovery_timer); -+ -+ xhci->comp_mode_recovery_timer.data = (unsigned long) xhci; -+ xhci->comp_mode_recovery_timer.function = compliance_mode_recovery; -+ xhci->comp_mode_recovery_timer.expires = jiffies + -+ msecs_to_jiffies(COMP_MODE_RCVRY_MSECS); -+ -+ set_timer_slack(&xhci->comp_mode_recovery_timer, -+ msecs_to_jiffies(COMP_MODE_RCVRY_MSECS)); -+ add_timer(&xhci->comp_mode_recovery_timer); -+ xhci_dbg(xhci, "Compliance Mode Recovery Timer Initialized.\n"); -+} -+ -+/* -+ * This function identifies the systems that have installed the SN65LVPE502CP -+ * USB3.0 re-driver and that need the Compliance Mode Quirk. -+ * Systems: -+ * Vendor: Hewlett-Packard -> System Models: Z420, Z620 and Z820 -+ */ -+static bool compliance_mode_recovery_timer_quirk_check(void) -+{ -+ const char *dmi_product_name, *dmi_sys_vendor; -+ -+ dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME); -+ dmi_sys_vendor = dmi_get_system_info(DMI_SYS_VENDOR); -+ -+ if (!(strstr(dmi_sys_vendor, "Hewlett-Packard"))) -+ return false; -+ -+ if (strstr(dmi_product_name, "Z420") || -+ strstr(dmi_product_name, "Z620") || -+ strstr(dmi_product_name, "Z820")) -+ return true; -+ -+ return false; -+} -+ -+static int xhci_all_ports_seen_u0(struct xhci_hcd *xhci) -+{ -+ return (xhci->port_status_u0 == ((1 << xhci->num_usb3_ports)-1)); -+} -+ -+ - /* - * Initialize memory for HCD and xHC (one-time init). - * -@@ -421,6 +511,12 @@ int xhci_init(struct usb_hcd *hcd) - retval = xhci_mem_init(xhci, GFP_KERNEL); - xhci_dbg(xhci, "Finished xhci_init\n"); - -+ /* Initializing Compliance Mode Recovery Data If Needed */ -+ if (compliance_mode_recovery_timer_quirk_check()) { -+ xhci->quirks |= XHCI_COMP_MODE_QUIRK; -+ compliance_mode_recovery_timer_init(xhci); -+ } -+ - return retval; - } - -@@ -629,6 +725,11 @@ void xhci_stop(struct usb_hcd *hcd) - del_timer_sync(&xhci->event_ring_timer); - #endif - -+ /* Deleting Compliance Mode Recovery Timer */ -+ if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && -+ (!(xhci_all_ports_seen_u0(xhci)))) -+ del_timer_sync(&xhci->comp_mode_recovery_timer); -+ - if (xhci->quirks & XHCI_AMD_PLL_FIX) - usb_amd_dev_put(); - -@@ -659,7 +760,7 @@ void xhci_shutdown(struct usb_hcd *hcd) - { - struct xhci_hcd *xhci = hcd_to_xhci(hcd); - -- if (xhci->quirks && XHCI_SPURIOUS_REBOOT) -+ if (xhci->quirks & XHCI_SPURIOUS_REBOOT) - usb_disable_xhci_ports(to_pci_dev(hcd->self.controller)); - - spin_lock_irq(&xhci->lock); -@@ -806,6 +907,16 @@ int xhci_suspend(struct xhci_hcd *xhci) - } - spin_unlock_irq(&xhci->lock); - -+ /* -+ * Deleting Compliance Mode Recovery Timer because the xHCI Host -+ * is about to be suspended. -+ */ -+ if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && -+ (!(xhci_all_ports_seen_u0(xhci)))) { -+ del_timer_sync(&xhci->comp_mode_recovery_timer); -+ xhci_dbg(xhci, "Compliance Mode Recovery Timer Deleted!\n"); -+ } -+ - /* step 5: remove core well power */ - /* synchronize irq when using MSI-X */ - xhci_msix_sync_irqs(xhci); -@@ -938,6 +1049,16 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) - usb_hcd_resume_root_hub(hcd); - usb_hcd_resume_root_hub(xhci->shared_hcd); - } -+ -+ /* -+ * If system is subject to the Quirk, Compliance Mode Timer needs to -+ * be re-initialized Always after a system resume. Ports are subject -+ * to suffer the Compliance Mode issue again. It doesn't matter if -+ * ports have entered previously to U0 before system's suspension. -+ */ -+ if (xhci->quirks & XHCI_COMP_MODE_QUIRK) -+ compliance_mode_recovery_timer_init(xhci); -+ - return retval; - } - #endif /* CONFIG_PM */ -diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h -index 27497d3..a7760bf 100644 ---- a/drivers/usb/host/xhci.h -+++ b/drivers/usb/host/xhci.h -@@ -1495,6 +1495,7 @@ struct xhci_hcd { - #define XHCI_LPM_SUPPORT (1 << 11) - #define XHCI_INTEL_HOST (1 << 12) - #define XHCI_SPURIOUS_REBOOT (1 << 13) -+#define XHCI_COMP_MODE_QUIRK (1 << 14) - unsigned int num_active_eps; - unsigned int limit_active_eps; - /* There are two roothubs to keep track of bus suspend info for */ -@@ -1511,6 +1512,11 @@ struct xhci_hcd { - unsigned sw_lpm_support:1; - /* support xHCI 1.0 spec USB2 hardware LPM */ - unsigned hw_lpm_support:1; -+ /* Compliance Mode Recovery Data */ -+ struct timer_list comp_mode_recovery_timer; -+ u32 port_status_u0; -+/* Compliance Mode Timer Triggered every 2 seconds */ -+#define COMP_MODE_RCVRY_MSECS 2000 - }; - - /* convert between an HCD pointer and the corresponding EHCI_HCD */ -diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c -index 5620db6..f906b3a 100644 ---- a/drivers/usb/serial/ftdi_sio.c -+++ b/drivers/usb/serial/ftdi_sio.c -@@ -704,6 +704,7 @@ static struct usb_device_id id_table_combined [] = { - { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) }, - { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) }, -+ { USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) }, - { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) }, - { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) }, - { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) }, -@@ -804,13 +805,32 @@ static struct usb_device_id id_table_combined [] = { - .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, - { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), - .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, -- { USB_DEVICE(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID) }, -+ { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID, -+ USB_CLASS_VENDOR_SPEC, -+ USB_SUBCLASS_VENDOR_SPEC, 0x00) }, - { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, - { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), - .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, - { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) }, - { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) }, -+ { USB_DEVICE(FTDI_VID, PI_C865_PID) }, -+ { USB_DEVICE(FTDI_VID, PI_C857_PID) }, -+ { USB_DEVICE(PI_VID, PI_C866_PID) }, -+ { USB_DEVICE(PI_VID, PI_C663_PID) }, -+ { USB_DEVICE(PI_VID, PI_C725_PID) }, -+ { USB_DEVICE(PI_VID, PI_E517_PID) }, -+ { USB_DEVICE(PI_VID, PI_C863_PID) }, - { USB_DEVICE(PI_VID, PI_E861_PID) }, -+ { USB_DEVICE(PI_VID, PI_C867_PID) }, -+ { USB_DEVICE(PI_VID, PI_E609_PID) }, -+ { USB_DEVICE(PI_VID, PI_E709_PID) }, -+ { USB_DEVICE(PI_VID, PI_100F_PID) }, -+ { USB_DEVICE(PI_VID, PI_1011_PID) }, -+ { USB_DEVICE(PI_VID, PI_1012_PID) }, -+ { USB_DEVICE(PI_VID, PI_1013_PID) }, -+ { USB_DEVICE(PI_VID, PI_1014_PID) }, -+ { USB_DEVICE(PI_VID, PI_1015_PID) }, -+ { USB_DEVICE(PI_VID, PI_1016_PID) }, - { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) }, - { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, - { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), -diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h -index 5dd96ca..41fe582 100644 ---- a/drivers/usb/serial/ftdi_sio_ids.h -+++ b/drivers/usb/serial/ftdi_sio_ids.h -@@ -75,6 +75,9 @@ - #define FTDI_OPENDCC_GATEWAY_PID 0xBFDB - #define FTDI_OPENDCC_GBM_PID 0xBFDC - -+/* NZR SEM 16+ USB (http://www.nzr.de) */ -+#define FTDI_NZR_SEM_USB_PID 0xC1E0 /* NZR SEM-LOG16+ */ -+ - /* - * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com) - */ -@@ -539,7 +542,10 @@ - /* - * Microchip Technology, Inc. - * -- * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are also used by: -+ * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are -+ * used by single function CDC ACM class based firmware demo -+ * applications. The VID/PID has also been used in firmware -+ * emulating FTDI serial chips by: - * Hornby Elite - Digital Command Control Console - * http://www.hornby.com/hornby-dcc/controllers/ - */ -@@ -791,8 +797,27 @@ - * Physik Instrumente - * http://www.physikinstrumente.com/en/products/ - */ -+/* These two devices use the VID of FTDI */ -+#define PI_C865_PID 0xe0a0 /* PI C-865 Piezomotor Controller */ -+#define PI_C857_PID 0xe0a1 /* PI Encoder Trigger Box */ -+ - #define PI_VID 0x1a72 /* Vendor ID */ --#define PI_E861_PID 0x1008 /* E-861 piezo controller USB connection */ -+#define PI_C866_PID 0x1000 /* PI C-866 Piezomotor Controller */ -+#define PI_C663_PID 0x1001 /* PI C-663 Mercury-Step */ -+#define PI_C725_PID 0x1002 /* PI C-725 Piezomotor Controller */ -+#define PI_E517_PID 0x1005 /* PI E-517 Digital Piezo Controller Operation Module */ -+#define PI_C863_PID 0x1007 /* PI C-863 */ -+#define PI_E861_PID 0x1008 /* PI E-861 Piezomotor Controller */ -+#define PI_C867_PID 0x1009 /* PI C-867 Piezomotor Controller */ -+#define PI_E609_PID 0x100D /* PI E-609 Digital Piezo Controller */ -+#define PI_E709_PID 0x100E /* PI E-709 Digital Piezo Controller */ -+#define PI_100F_PID 0x100F /* PI Digital Piezo Controller */ -+#define PI_1011_PID 0x1011 /* PI Digital Piezo Controller */ -+#define PI_1012_PID 0x1012 /* PI Motion Controller */ -+#define PI_1013_PID 0x1013 /* PI Motion Controller */ -+#define PI_1014_PID 0x1014 /* PI Device */ -+#define PI_1015_PID 0x1015 /* PI Device */ -+#define PI_1016_PID 0x1016 /* PI Digital Servo Module */ - - /* - * Kondo Kagaku Co.Ltd. -diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c -index d2c2698..61ab0ed 100644 ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -886,8 +886,6 @@ static const struct usb_device_id option_ids[] = { - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), - .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, -- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1018, 0xff, 0xff, 0xff), -- .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) }, -@@ -1092,6 +1090,10 @@ static const struct usb_device_id option_ids[] = { - .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff), - .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist }, -+ { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, -+ { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, -+ - { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, - { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, - { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */ -diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c -index 2e471c2..88e9204 100644 ---- a/drivers/video/console/fbcon.c -+++ b/drivers/video/console/fbcon.c -@@ -372,8 +372,15 @@ static void fb_flashcursor(struct work_struct *work) - struct vc_data *vc = NULL; - int c; - int mode; -+ int ret; -+ -+ /* FIXME: we should sort out the unbind locking instead */ -+ /* instead we just fail to flash the cursor if we can't get -+ * the lock instead of blocking fbcon deinit */ -+ ret = console_trylock(); -+ if (ret == 0) -+ return; - -- console_lock(); - if (ops && ops->currcon != -1) - vc = vc_cons[ops->currcon].d; - -diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c -index 1eff743..ae60406 100644 ---- a/drivers/watchdog/hpwdt.c -+++ b/drivers/watchdog/hpwdt.c -@@ -814,6 +814,9 @@ static int __devinit hpwdt_init_one(struct pci_dev *dev, - hpwdt_timer_reg = pci_mem_addr + 0x70; - hpwdt_timer_con = pci_mem_addr + 0x72; - -+ /* Make sure that timer is disabled until /dev/watchdog is opened */ -+ hpwdt_stop(); -+ - /* Make sure that we have a valid soft_margin */ - if (hpwdt_change_timer(soft_margin)) - hpwdt_change_timer(DEFAULT_MARGIN); -diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c -index 1ffd03b..7f12416 100644 ---- a/drivers/xen/gntdev.c -+++ b/drivers/xen/gntdev.c -@@ -314,8 +314,9 @@ static int __unmap_grant_pages(struct grant_map *map, int offset, int pages) - } - } - -- err = gnttab_unmap_refs(map->unmap_ops + offset, map->pages + offset, -- pages, true); -+ err = gnttab_unmap_refs(map->unmap_ops + offset, -+ use_ptemod ? map->kmap_ops + offset : NULL, map->pages + offset, -+ pages); - if (err) - return err; - -diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c -index 0bfc1ef..0067266 100644 ---- a/drivers/xen/grant-table.c -+++ b/drivers/xen/grant-table.c -@@ -870,7 +870,8 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, - EXPORT_SYMBOL_GPL(gnttab_map_refs); - - int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, -- struct page **pages, unsigned int count, bool clear_pte) -+ struct gnttab_map_grant_ref *kmap_ops, -+ struct page **pages, unsigned int count) - { - int i, ret; - bool lazy = false; -@@ -888,7 +889,8 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, - } - - for (i = 0; i < count; i++) { -- ret = m2p_remove_override(pages[i], clear_pte); -+ ret = m2p_remove_override(pages[i], kmap_ops ? -+ &kmap_ops[i] : NULL); - if (ret) - return ret; - } -diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c -index fbb9da9..33ef60d 100644 ---- a/fs/cifs/cifs_unicode.c -+++ b/fs/cifs/cifs_unicode.c -@@ -328,6 +328,6 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen, - } - - ctoUTF16_out: -- return i; -+ return j; - } - -diff --git a/fs/dcache.c b/fs/dcache.c -index 4046904..4123b92 100644 ---- a/fs/dcache.c -+++ b/fs/dcache.c -@@ -389,7 +389,7 @@ static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent) - * Inform try_to_ascend() that we are no longer attached to the - * dentry tree - */ -- dentry->d_flags |= DCACHE_DISCONNECTED; -+ dentry->d_flags |= DCACHE_DENTRY_KILLED; - if (parent) - spin_unlock(&parent->d_lock); - dentry_iput(dentry); -@@ -1046,7 +1046,7 @@ static struct dentry *try_to_ascend(struct dentry *old, int locked, unsigned seq - * or deletion - */ - if (new != old->d_parent || -- (old->d_flags & DCACHE_DISCONNECTED) || -+ (old->d_flags & DCACHE_DENTRY_KILLED) || - (!locked && read_seqretry(&rename_lock, seq))) { - spin_unlock(&new->d_lock); - new = NULL; -diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c -index a07441a..02e2fec 100644 ---- a/fs/ecryptfs/inode.c -+++ b/fs/ecryptfs/inode.c -@@ -621,6 +621,7 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, - struct dentry *lower_old_dir_dentry; - struct dentry *lower_new_dir_dentry; - struct dentry *trap = NULL; -+ struct inode *target_inode; - - lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry); - lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry); -@@ -628,6 +629,7 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, - dget(lower_new_dentry); - lower_old_dir_dentry = dget_parent(lower_old_dentry); - lower_new_dir_dentry = dget_parent(lower_new_dentry); -+ target_inode = new_dentry->d_inode; - trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry); - /* source should not be ancestor of target */ - if (trap == lower_old_dentry) { -@@ -643,6 +645,9 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, - lower_new_dir_dentry->d_inode, lower_new_dentry); - if (rc) - goto out_lock; -+ if (target_inode) -+ fsstack_copy_attr_all(target_inode, -+ ecryptfs_inode_to_lower(target_inode)); - fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode); - if (new_dir != old_dir) - fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode); -diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c -index f430057..b1f3675 100644 ---- a/fs/nfs/dir.c -+++ b/fs/nfs/dir.c -@@ -1123,7 +1123,7 @@ static int nfs_lookup_revalidate(struct dentry *dentry, struct nameidata *nd) - struct nfs_fattr *fattr = NULL; - int error; - -- if (nd->flags & LOOKUP_RCU) -+ if (nd && (nd->flags & LOOKUP_RCU)) - return -ECHILD; - - parent = dget_parent(dentry); -@@ -1526,7 +1526,7 @@ static int nfs4_lookup_revalidate(struct dentry *dentry, struct nameidata *nd) - struct inode *dir; - int openflags, ret = 0; - -- if (nd->flags & LOOKUP_RCU) -+ if (nd && (nd->flags & LOOKUP_RCU)) - return -ECHILD; - - inode = dentry->d_inode; -diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c -index f729698..30bd45a 100644 ---- a/fs/nfs/inode.c -+++ b/fs/nfs/inode.c -@@ -152,7 +152,7 @@ static void nfs_zap_caches_locked(struct inode *inode) - nfsi->attrtimeo = NFS_MINATTRTIMEO(inode); - nfsi->attrtimeo_timestamp = jiffies; - -- memset(NFS_COOKIEVERF(inode), 0, sizeof(NFS_COOKIEVERF(inode))); -+ memset(NFS_I(inode)->cookieverf, 0, sizeof(NFS_I(inode)->cookieverf)); - if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) - nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE; - else -diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c -index af051d8..fda63e9 100644 ---- a/fs/nfs/nfs3proc.c -+++ b/fs/nfs/nfs3proc.c -@@ -643,7 +643,7 @@ nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, - u64 cookie, struct page **pages, unsigned int count, int plus) - { - struct inode *dir = dentry->d_inode; -- __be32 *verf = NFS_COOKIEVERF(dir); -+ __be32 *verf = NFS_I(dir)->cookieverf; - struct nfs3_readdirargs arg = { - .fh = NFS_FH(dir), - .cookie = cookie, -diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c -index b3bca1e..dd372e2 100644 ---- a/fs/nfs/nfs4proc.c -+++ b/fs/nfs/nfs4proc.c -@@ -3189,11 +3189,11 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, - dentry->d_parent->d_name.name, - dentry->d_name.name, - (unsigned long long)cookie); -- nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args); -+ nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args); - res.pgbase = args.pgbase; - status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0); - if (status >= 0) { -- memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE); -+ memcpy(NFS_I(dir)->cookieverf, res.verifier.data, NFS4_VERIFIER_SIZE); - status += args.pgbase; - } - -diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c -index 18fae29..cfce99b 100644 ---- a/fs/nfs/nfs4xdr.c -+++ b/fs/nfs/nfs4xdr.c -@@ -6262,7 +6262,8 @@ static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, struct xdr_stream *xdr, - status = decode_open(xdr, res); - if (status) - goto out; -- if (decode_getfh(xdr, &res->fh) != 0) -+ status = decode_getfh(xdr, &res->fh); -+ if (status) - goto out; - decode_getfattr(xdr, res->f_attr, res->server); - out: -diff --git a/fs/nfs/super.c b/fs/nfs/super.c -index 1d4b23e..cdbaae2 100644 ---- a/fs/nfs/super.c -+++ b/fs/nfs/super.c -@@ -1918,6 +1918,7 @@ static int nfs23_validate_mount_data(void *options, - - memcpy(sap, &data->addr, sizeof(data->addr)); - args->nfs_server.addrlen = sizeof(data->addr); -+ args->nfs_server.port = ntohs(data->addr.sin_port); - if (!nfs_verify_server_address(sap)) - goto out_no_address; - -@@ -2651,6 +2652,7 @@ static int nfs4_validate_mount_data(void *options, - return -EFAULT; - if (!nfs_verify_server_address(sap)) - goto out_no_address; -+ args->nfs_server.port = ntohs(((struct sockaddr_in *)sap)->sin_port); - - if (data->auth_flavourlen) { - if (data->auth_flavourlen > 1) -diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c -index c55298e..fa49cff 100644 ---- a/fs/nfsd/nfsctl.c -+++ b/fs/nfsd/nfsctl.c -@@ -673,9 +673,7 @@ static ssize_t __write_ports_addfd(char *buf) - - err = svc_addsock(nfsd_serv, fd, buf, SIMPLE_TRANSACTION_LIMIT); - if (err < 0) { -- if (nfsd_serv->sv_nrthreads == 1) -- svc_shutdown_net(nfsd_serv, net); -- svc_destroy(nfsd_serv); -+ nfsd_destroy(net); - return err; - } - -@@ -744,9 +742,7 @@ out_close: - svc_xprt_put(xprt); - } - out_err: -- if (nfsd_serv->sv_nrthreads == 1) -- svc_shutdown_net(nfsd_serv, net); -- svc_destroy(nfsd_serv); -+ nfsd_destroy(net); - return err; - } - -diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h -index 1671429..1336a65 100644 ---- a/fs/nfsd/nfsd.h -+++ b/fs/nfsd/nfsd.h -@@ -73,6 +73,17 @@ int nfsd_nrpools(void); - int nfsd_get_nrthreads(int n, int *); - int nfsd_set_nrthreads(int n, int *); - -+static inline void nfsd_destroy(struct net *net) -+{ -+ int destroy = (nfsd_serv->sv_nrthreads == 1); -+ -+ if (destroy) -+ svc_shutdown_net(nfsd_serv, net); -+ svc_destroy(nfsd_serv); -+ if (destroy) -+ nfsd_serv = NULL; -+} -+ - #if defined(CONFIG_NFSD_V2_ACL) || defined(CONFIG_NFSD_V3_ACL) - #ifdef CONFIG_NFSD_V2_ACL - extern struct svc_version nfsd_acl_version2; -diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c -index ee709fc..240473c 100644 ---- a/fs/nfsd/nfssvc.c -+++ b/fs/nfsd/nfssvc.c -@@ -254,8 +254,6 @@ static void nfsd_shutdown(void) - - static void nfsd_last_thread(struct svc_serv *serv, struct net *net) - { -- /* When last nfsd thread exits we need to do some clean-up */ -- nfsd_serv = NULL; - nfsd_shutdown(); - - svc_rpcb_cleanup(serv, net); -@@ -332,6 +330,7 @@ static int nfsd_get_default_max_blksize(void) - int nfsd_create_serv(void) - { - int error; -+ struct net *net = current->nsproxy->net_ns; - - WARN_ON(!mutex_is_locked(&nfsd_mutex)); - if (nfsd_serv) { -@@ -346,7 +345,7 @@ int nfsd_create_serv(void) - if (nfsd_serv == NULL) - return -ENOMEM; - -- error = svc_bind(nfsd_serv, current->nsproxy->net_ns); -+ error = svc_bind(nfsd_serv, net); - if (error < 0) { - svc_destroy(nfsd_serv); - return error; -@@ -427,11 +426,7 @@ int nfsd_set_nrthreads(int n, int *nthreads) - if (err) - break; - } -- -- if (nfsd_serv->sv_nrthreads == 1) -- svc_shutdown_net(nfsd_serv, net); -- svc_destroy(nfsd_serv); -- -+ nfsd_destroy(net); - return err; - } - -@@ -478,9 +473,7 @@ out_shutdown: - if (error < 0 && !nfsd_up_before) - nfsd_shutdown(); - out_destroy: -- if (nfsd_serv->sv_nrthreads == 1) -- svc_shutdown_net(nfsd_serv, net); -- svc_destroy(nfsd_serv); /* Release server */ -+ nfsd_destroy(net); /* Release server */ - out: - mutex_unlock(&nfsd_mutex); - return error; -@@ -563,12 +556,13 @@ nfsd(void *vrqstp) - nfsdstats.th_cnt --; - - out: -- if (rqstp->rq_server->sv_nrthreads == 1) -- svc_shutdown_net(rqstp->rq_server, &init_net); -+ rqstp->rq_server = NULL; - - /* Release the thread */ - svc_exit_thread(rqstp); - -+ nfsd_destroy(&init_net); -+ - /* Release module */ - mutex_unlock(&nfsd_mutex); - module_put_and_exit(0); -@@ -682,9 +676,7 @@ int nfsd_pool_stats_release(struct inode *inode, struct file *file) - - mutex_lock(&nfsd_mutex); - /* this function really, really should have been called svc_put() */ -- if (nfsd_serv->sv_nrthreads == 1) -- svc_shutdown_net(nfsd_serv, net); -- svc_destroy(nfsd_serv); -+ nfsd_destroy(net); - mutex_unlock(&nfsd_mutex); - return ret; - } -diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c -index 3476bca..5d00eb8 100644 ---- a/fs/proc/proc_sysctl.c -+++ b/fs/proc/proc_sysctl.c -@@ -462,9 +462,6 @@ static struct dentry *proc_sys_lookup(struct inode *dir, struct dentry *dentry, - - err = ERR_PTR(-ENOMEM); - inode = proc_sys_make_inode(dir->i_sb, h ? h : head, p); -- if (h) -- sysctl_head_finish(h); -- - if (!inode) - goto out; - -@@ -473,6 +470,8 @@ static struct dentry *proc_sys_lookup(struct inode *dir, struct dentry *dentry, - d_add(dentry, inode); - - out: -+ if (h) -+ sysctl_head_finish(h); - sysctl_head_finish(head); - return err; - } -diff --git a/fs/stat.c b/fs/stat.c -index b6ff118..4078022 100644 ---- a/fs/stat.c -+++ b/fs/stat.c -@@ -58,7 +58,7 @@ EXPORT_SYMBOL(vfs_getattr); - int vfs_fstat(unsigned int fd, struct kstat *stat) - { - int fput_needed; -- struct file *f = fget_light(fd, &fput_needed); -+ struct file *f = fget_raw_light(fd, &fput_needed); - int error = -EBADF; - - if (f) { -diff --git a/include/asm-generic/mutex-xchg.h b/include/asm-generic/mutex-xchg.h -index 580a6d3..c04e0db 100644 ---- a/include/asm-generic/mutex-xchg.h -+++ b/include/asm-generic/mutex-xchg.h -@@ -26,7 +26,13 @@ static inline void - __mutex_fastpath_lock(atomic_t *count, void (*fail_fn)(atomic_t *)) - { - if (unlikely(atomic_xchg(count, 0) != 1)) -- fail_fn(count); -+ /* -+ * We failed to acquire the lock, so mark it contended -+ * to ensure that any waiting tasks are woken up by the -+ * unlock slow path. -+ */ -+ if (likely(atomic_xchg(count, -1) != 1)) -+ fail_fn(count); - } - - /** -@@ -43,7 +49,8 @@ static inline int - __mutex_fastpath_lock_retval(atomic_t *count, int (*fail_fn)(atomic_t *)) - { - if (unlikely(atomic_xchg(count, 0) != 1)) -- return fail_fn(count); -+ if (likely(atomic_xchg(count, -1) != 1)) -+ return fail_fn(count); - return 0; - } - -diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h -index 5581980..3d6301b 100644 ---- a/include/drm/drm_mode.h -+++ b/include/drm/drm_mode.h -@@ -359,8 +359,9 @@ struct drm_mode_mode_cmd { - struct drm_mode_modeinfo mode; - }; - --#define DRM_MODE_CURSOR_BO (1<<0) --#define DRM_MODE_CURSOR_MOVE (1<<1) -+#define DRM_MODE_CURSOR_BO 0x01 -+#define DRM_MODE_CURSOR_MOVE 0x02 -+#define DRM_MODE_CURSOR_FLAGS 0x03 - - /* - * depending on the value in flags different members are used. -diff --git a/include/linux/dcache.h b/include/linux/dcache.h -index 094789f..525ab12 100644 ---- a/include/linux/dcache.h -+++ b/include/linux/dcache.h -@@ -206,6 +206,8 @@ struct dentry_operations { - #define DCACHE_MANAGED_DENTRY \ - (DCACHE_MOUNTED|DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT) - -+#define DCACHE_DENTRY_KILLED 0x100000 -+ - extern seqlock_t rename_lock; - - static inline int dname_external(struct dentry *dentry) -diff --git a/include/linux/init_task.h b/include/linux/init_task.h -index 9e65eff..b806b82 100644 ---- a/include/linux/init_task.h -+++ b/include/linux/init_task.h -@@ -123,8 +123,17 @@ extern struct group_info init_groups; - - extern struct cred init_cred; - -+extern struct task_group root_task_group; -+ -+#ifdef CONFIG_CGROUP_SCHED -+# define INIT_CGROUP_SCHED(tsk) \ -+ .sched_task_group = &root_task_group, -+#else -+# define INIT_CGROUP_SCHED(tsk) -+#endif -+ - #ifdef CONFIG_PERF_EVENTS --# define INIT_PERF_EVENTS(tsk) \ -+# define INIT_PERF_EVENTS(tsk) \ - .perf_event_mutex = \ - __MUTEX_INITIALIZER(tsk.perf_event_mutex), \ - .perf_event_list = LIST_HEAD_INIT(tsk.perf_event_list), -@@ -161,6 +170,7 @@ extern struct cred init_cred; - }, \ - .tasks = LIST_HEAD_INIT(tsk.tasks), \ - INIT_PUSHABLE_TASKS(tsk) \ -+ INIT_CGROUP_SCHED(tsk) \ - .ptraced = LIST_HEAD_INIT(tsk.ptraced), \ - .ptrace_entry = LIST_HEAD_INIT(tsk.ptrace_entry), \ - .real_parent = &tsk, \ -diff --git a/include/linux/kobject.h b/include/linux/kobject.h -index fc615a9..1e57449 100644 ---- a/include/linux/kobject.h -+++ b/include/linux/kobject.h -@@ -224,7 +224,7 @@ static inline int kobject_uevent_env(struct kobject *kobj, - - static inline __printf(2, 3) - int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) --{ return 0; } -+{ return -ENOMEM; } - - static inline int kobject_action_type(const char *buf, size_t count, - enum kobject_action *type) -diff --git a/include/linux/kthread.h b/include/linux/kthread.h -index 0714b24..22ccf9d 100644 ---- a/include/linux/kthread.h -+++ b/include/linux/kthread.h -@@ -49,8 +49,6 @@ extern int tsk_fork_get_node(struct task_struct *tsk); - * can be queued and flushed using queue/flush_kthread_work() - * respectively. Queued kthread_works are processed by a kthread - * running kthread_worker_fn(). -- * -- * A kthread_work can't be freed while it is executing. - */ - struct kthread_work; - typedef void (*kthread_work_func_t)(struct kthread_work *work); -@@ -59,15 +57,14 @@ struct kthread_worker { - spinlock_t lock; - struct list_head work_list; - struct task_struct *task; -+ struct kthread_work *current_work; - }; - - struct kthread_work { - struct list_head node; - kthread_work_func_t func; - wait_queue_head_t done; -- atomic_t flushing; -- int queue_seq; -- int done_seq; -+ struct kthread_worker *worker; - }; - - #define KTHREAD_WORKER_INIT(worker) { \ -@@ -79,7 +76,6 @@ struct kthread_work { - .node = LIST_HEAD_INIT((work).node), \ - .func = (fn), \ - .done = __WAIT_QUEUE_HEAD_INITIALIZER((work).done), \ -- .flushing = ATOMIC_INIT(0), \ - } - - #define DEFINE_KTHREAD_WORKER(worker) \ -diff --git a/include/linux/ktime.h b/include/linux/ktime.h -index 603bec2..06177ba10 100644 ---- a/include/linux/ktime.h -+++ b/include/linux/ktime.h -@@ -58,13 +58,6 @@ union ktime { - - typedef union ktime ktime_t; /* Kill this */ - --#define KTIME_MAX ((s64)~((u64)1 << 63)) --#if (BITS_PER_LONG == 64) --# define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) --#else --# define KTIME_SEC_MAX LONG_MAX --#endif -- - /* - * ktime_t definitions when using the 64-bit scalar representation: - */ -diff --git a/include/linux/mISDNhw.h b/include/linux/mISDNhw.h -index d0752ec..9d96d5d 100644 ---- a/include/linux/mISDNhw.h -+++ b/include/linux/mISDNhw.h -@@ -183,7 +183,7 @@ extern int mISDN_initbchannel(struct bchannel *, unsigned short, - unsigned short); - extern int mISDN_freedchannel(struct dchannel *); - extern void mISDN_clear_bchannel(struct bchannel *); --extern int mISDN_freebchannel(struct bchannel *); -+extern void mISDN_freebchannel(struct bchannel *); - extern int mISDN_ctrl_bchannel(struct bchannel *, struct mISDN_ctrl_req *); - extern void queue_ch_frame(struct mISDNchannel *, u_int, - int, struct sk_buff *); -diff --git a/include/linux/memory.h b/include/linux/memory.h -index 1ac7f6e..ff9a9f8 100644 ---- a/include/linux/memory.h -+++ b/include/linux/memory.h -@@ -19,7 +19,7 @@ - #include <linux/compiler.h> - #include <linux/mutex.h> - --#define MIN_MEMORY_BLOCK_SIZE (1 << SECTION_SIZE_BITS) -+#define MIN_MEMORY_BLOCK_SIZE (1UL << SECTION_SIZE_BITS) - - struct memory_block { - unsigned long start_section_nr; -diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h -index d76513b..2bd1769 100644 ---- a/include/linux/mmc/card.h -+++ b/include/linux/mmc/card.h -@@ -238,6 +238,7 @@ struct mmc_card { - #define MMC_QUIRK_BLK_NO_CMD23 (1<<7) /* Avoid CMD23 for regular multiblock */ - #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8) /* Avoid sending 512 bytes in */ - #define MMC_QUIRK_LONG_READ_TIME (1<<9) /* Data read time > CSD says */ -+#define MMC_QUIRK_SEC_ERASE_TRIM_BROKEN (1<<10) /* Skip secure for erase/trim */ - /* byte mode */ - unsigned int poweroff_notify_state; /* eMMC4.5 notify feature */ - #define MMC_NO_POWER_NOTIFICATION 0 -diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index d94cb14..b52070a 100644 ---- a/include/linux/netdevice.h -+++ b/include/linux/netdevice.h -@@ -1301,6 +1301,8 @@ struct net_device { - /* for setting kernel sock attribute on TCP connection setup */ - #define GSO_MAX_SIZE 65536 - unsigned int gso_max_size; -+#define GSO_MAX_SEGS 65535 -+ u16 gso_max_segs; - - #ifdef CONFIG_DCB - /* Data Center Bridging netlink ops */ -@@ -1518,6 +1520,8 @@ struct packet_type { - struct sk_buff **(*gro_receive)(struct sk_buff **head, - struct sk_buff *skb); - int (*gro_complete)(struct sk_buff *skb); -+ bool (*id_match)(struct packet_type *ptype, -+ struct sock *sk); - void *af_packet_priv; - struct list_head list; - }; -diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h -index b23cfc1..4841108 100644 ---- a/include/linux/nfs_fs.h -+++ b/include/linux/nfs_fs.h -@@ -265,11 +265,6 @@ static inline const struct nfs_rpc_ops *NFS_PROTO(const struct inode *inode) - return NFS_SERVER(inode)->nfs_client->rpc_ops; - } - --static inline __be32 *NFS_COOKIEVERF(const struct inode *inode) --{ -- return NFS_I(inode)->cookieverf; --} -- - static inline unsigned NFS_MINATTRTIMEO(const struct inode *inode) - { - struct nfs_server *nfss = NFS_SERVER(inode); -diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h -index ab741b0..c642b81 100644 ---- a/include/linux/pci_ids.h -+++ b/include/linux/pci_ids.h -@@ -2148,7 +2148,7 @@ - #define PCI_DEVICE_ID_TIGON3_5704S 0x16a8 - #define PCI_DEVICE_ID_NX2_57800_VF 0x16a9 - #define PCI_DEVICE_ID_NX2_5706S 0x16aa --#define PCI_DEVICE_ID_NX2_57840_MF 0x16ab -+#define PCI_DEVICE_ID_NX2_57840_MF 0x16a4 - #define PCI_DEVICE_ID_NX2_5708S 0x16ac - #define PCI_DEVICE_ID_NX2_57840_VF 0x16ad - #define PCI_DEVICE_ID_NX2_57810_MF 0x16ae -diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h -index 45db49f..c3c98a6 100644 ---- a/include/linux/perf_event.h -+++ b/include/linux/perf_event.h -@@ -274,6 +274,8 @@ struct perf_event_attr { - __u64 branch_sample_type; /* enum branch_sample_type */ - }; - -+#define perf_flags(attr) (*(&(attr)->read_format + 1)) -+ - /* - * Ioctls that can be done on a perf event fd: - */ -@@ -925,7 +927,7 @@ struct perf_event { - struct hw_perf_event hw; - - struct perf_event_context *ctx; -- struct file *filp; -+ atomic_long_t refcount; - - /* - * These accumulate total time (in nanoseconds) that children -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 4a1f493..e63650f 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -1244,6 +1244,9 @@ struct task_struct { - const struct sched_class *sched_class; - struct sched_entity se; - struct sched_rt_entity rt; -+#ifdef CONFIG_CGROUP_SCHED -+ struct task_group *sched_task_group; -+#endif - - #ifdef CONFIG_PREEMPT_NOTIFIERS - /* list of struct preempt_notifier: */ -@@ -2723,7 +2726,7 @@ extern int sched_group_set_rt_period(struct task_group *tg, - extern long sched_group_rt_period(struct task_group *tg); - extern int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk); - #endif --#endif -+#endif /* CONFIG_CGROUP_SCHED */ - - extern int task_can_switch_user(struct user_struct *up, - struct task_struct *tsk); -diff --git a/include/linux/security.h b/include/linux/security.h -index 3dea6a9..d143b8e 100644 ---- a/include/linux/security.h -+++ b/include/linux/security.h -@@ -118,6 +118,7 @@ void reset_security_ops(void); - extern unsigned long mmap_min_addr; - extern unsigned long dac_mmap_min_addr; - #else -+#define mmap_min_addr 0UL - #define dac_mmap_min_addr 0UL - #endif - -diff --git a/include/linux/time.h b/include/linux/time.h -index c81c5e4..b51e664 100644 ---- a/include/linux/time.h -+++ b/include/linux/time.h -@@ -107,11 +107,36 @@ static inline struct timespec timespec_sub(struct timespec lhs, - return ts_delta; - } - -+#define KTIME_MAX ((s64)~((u64)1 << 63)) -+#if (BITS_PER_LONG == 64) -+# define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) -+#else -+# define KTIME_SEC_MAX LONG_MAX -+#endif -+ - /* - * Returns true if the timespec is norm, false if denorm: - */ --#define timespec_valid(ts) \ -- (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) -+static inline bool timespec_valid(const struct timespec *ts) -+{ -+ /* Dates before 1970 are bogus */ -+ if (ts->tv_sec < 0) -+ return false; -+ /* Can't have more nanoseconds then a second */ -+ if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) -+ return false; -+ return true; -+} -+ -+static inline bool timespec_valid_strict(const struct timespec *ts) -+{ -+ if (!timespec_valid(ts)) -+ return false; -+ /* Disallow values that could overflow ktime_t */ -+ if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX) -+ return false; -+ return true; -+} - - extern void read_persistent_clock(struct timespec *ts); - extern void read_boot_clock(struct timespec *ts); -diff --git a/include/net/bluetooth/smp.h b/include/net/bluetooth/smp.h -index ca356a7..8b27927 100644 ---- a/include/net/bluetooth/smp.h -+++ b/include/net/bluetooth/smp.h -@@ -136,7 +136,7 @@ struct smp_chan { - }; - - /* SMP Commands */ --int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level); -+int smp_conn_security(struct hci_conn *hcon, __u8 sec_level); - int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb); - int smp_distribute_keys(struct l2cap_conn *conn, __u8 force); - int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey); -diff --git a/include/net/codel.h b/include/net/codel.h -index 550debf..389cf62 100644 ---- a/include/net/codel.h -+++ b/include/net/codel.h -@@ -305,6 +305,8 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch, - } - } - } else if (drop) { -+ u32 delta; -+ - if (params->ecn && INET_ECN_set_ce(skb)) { - stats->ecn_mark++; - } else { -@@ -320,9 +322,11 @@ static struct sk_buff *codel_dequeue(struct Qdisc *sch, - * assume that the drop rate that controlled the queue on the - * last cycle is a good starting point to control it now. - */ -- if (codel_time_before(now - vars->drop_next, -+ delta = vars->count - vars->lastcount; -+ if (delta > 1 && -+ codel_time_before(now - vars->drop_next, - 16 * params->interval)) { -- vars->count = (vars->count - vars->lastcount) | 1; -+ vars->count = delta; - /* we dont care if rec_inv_sqrt approximation - * is not very precise : - * Next Newton steps will correct it quadratically. -diff --git a/include/net/scm.h b/include/net/scm.h -index d456f4c..0c0017c 100644 ---- a/include/net/scm.h -+++ b/include/net/scm.h -@@ -71,9 +71,11 @@ static __inline__ void scm_destroy(struct scm_cookie *scm) - } - - static __inline__ int scm_send(struct socket *sock, struct msghdr *msg, -- struct scm_cookie *scm) -+ struct scm_cookie *scm, bool forcecreds) - { - memset(scm, 0, sizeof(*scm)); -+ if (forcecreds) -+ scm_set_cred(scm, task_tgid(current), current_cred()); - unix_get_peersec_dgram(sock, scm); - if (msg->msg_controllen <= 0) - return 0; -diff --git a/include/net/sock.h b/include/net/sock.h -index 4a45216..5de6557 100644 ---- a/include/net/sock.h -+++ b/include/net/sock.h -@@ -217,6 +217,7 @@ struct cg_proto; - * @sk_route_nocaps: forbidden route capabilities (e.g NETIF_F_GSO_MASK) - * @sk_gso_type: GSO type (e.g. %SKB_GSO_TCPV4) - * @sk_gso_max_size: Maximum GSO segment size to build -+ * @sk_gso_max_segs: Maximum number of GSO segments - * @sk_lingertime: %SO_LINGER l_linger setting - * @sk_backlog: always used with the per-socket spinlock held - * @sk_callback_lock: used with the callbacks in the end of this struct -@@ -336,6 +337,7 @@ struct sock { - netdev_features_t sk_route_nocaps; - int sk_gso_type; - unsigned int sk_gso_max_size; -+ u16 sk_gso_max_segs; - int sk_rcvlowat; - unsigned long sk_lingertime; - struct sk_buff_head sk_error_queue; -diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h -index 5f889f1..08fa272 100644 ---- a/include/trace/events/kmem.h -+++ b/include/trace/events/kmem.h -@@ -214,7 +214,7 @@ TRACE_EVENT(mm_page_alloc, - - TP_printk("page=%p pfn=%lu order=%d migratetype=%d gfp_flags=%s", - __entry->page, -- page_to_pfn(__entry->page), -+ __entry->page ? page_to_pfn(__entry->page) : 0, - __entry->order, - __entry->migratetype, - show_gfp_flags(__entry->gfp_flags)) -@@ -240,7 +240,7 @@ DECLARE_EVENT_CLASS(mm_page, - - TP_printk("page=%p pfn=%lu order=%u migratetype=%d percpu_refill=%d", - __entry->page, -- page_to_pfn(__entry->page), -+ __entry->page ? page_to_pfn(__entry->page) : 0, - __entry->order, - __entry->migratetype, - __entry->order == 0) -diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h -index 11e27c3..f19fff8 100644 ---- a/include/xen/grant_table.h -+++ b/include/xen/grant_table.h -@@ -187,6 +187,7 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, - struct gnttab_map_grant_ref *kmap_ops, - struct page **pages, unsigned int count); - int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, -- struct page **pages, unsigned int count, bool clear_pte); -+ struct gnttab_map_grant_ref *kunmap_ops, -+ struct page **pages, unsigned int count); - - #endif /* __ASM_GNTTAB_H__ */ -diff --git a/kernel/async.c b/kernel/async.c -index bd0c168..32d8dc9 100644 ---- a/kernel/async.c -+++ b/kernel/async.c -@@ -86,6 +86,13 @@ static async_cookie_t __lowest_in_progress(struct list_head *running) - { - struct async_entry *entry; - -+ if (!running) { /* just check the entry count */ -+ if (atomic_read(&entry_count)) -+ return 0; /* smaller than any cookie */ -+ else -+ return next_cookie; -+ } -+ - if (!list_empty(running)) { - entry = list_first_entry(running, - struct async_entry, list); -@@ -236,9 +243,7 @@ EXPORT_SYMBOL_GPL(async_schedule_domain); - */ - void async_synchronize_full(void) - { -- do { -- async_synchronize_cookie(next_cookie); -- } while (!list_empty(&async_running) || !list_empty(&async_pending)); -+ async_synchronize_cookie_domain(next_cookie, NULL); - } - EXPORT_SYMBOL_GPL(async_synchronize_full); - -@@ -258,7 +263,7 @@ EXPORT_SYMBOL_GPL(async_synchronize_full_domain); - /** - * async_synchronize_cookie_domain - synchronize asynchronous function calls within a certain domain with cookie checkpointing - * @cookie: async_cookie_t to use as checkpoint -- * @running: running list to synchronize on -+ * @running: running list to synchronize on, NULL indicates all lists - * - * This function waits until all asynchronous function calls for the - * synchronization domain specified by the running list @list submitted -diff --git a/kernel/events/core.c b/kernel/events/core.c -index d7d71d6..11409af 100644 ---- a/kernel/events/core.c -+++ b/kernel/events/core.c -@@ -2933,12 +2933,12 @@ EXPORT_SYMBOL_GPL(perf_event_release_kernel); - /* - * Called when the last reference to the file is gone. - */ --static int perf_release(struct inode *inode, struct file *file) -+static void put_event(struct perf_event *event) - { -- struct perf_event *event = file->private_data; - struct task_struct *owner; - -- file->private_data = NULL; -+ if (!atomic_long_dec_and_test(&event->refcount)) -+ return; - - rcu_read_lock(); - owner = ACCESS_ONCE(event->owner); -@@ -2973,7 +2973,13 @@ static int perf_release(struct inode *inode, struct file *file) - put_task_struct(owner); - } - -- return perf_event_release_kernel(event); -+ perf_event_release_kernel(event); -+} -+ -+static int perf_release(struct inode *inode, struct file *file) -+{ -+ put_event(file->private_data); -+ return 0; - } - - u64 perf_event_read_value(struct perf_event *event, u64 *enabled, u64 *running) -@@ -3225,7 +3231,7 @@ unlock: - - static const struct file_operations perf_fops; - --static struct perf_event *perf_fget_light(int fd, int *fput_needed) -+static struct file *perf_fget_light(int fd, int *fput_needed) - { - struct file *file; - -@@ -3239,7 +3245,7 @@ static struct perf_event *perf_fget_light(int fd, int *fput_needed) - return ERR_PTR(-EBADF); - } - -- return file->private_data; -+ return file; - } - - static int perf_event_set_output(struct perf_event *event, -@@ -3271,19 +3277,21 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) - - case PERF_EVENT_IOC_SET_OUTPUT: - { -+ struct file *output_file = NULL; - struct perf_event *output_event = NULL; - int fput_needed = 0; - int ret; - - if (arg != -1) { -- output_event = perf_fget_light(arg, &fput_needed); -- if (IS_ERR(output_event)) -- return PTR_ERR(output_event); -+ output_file = perf_fget_light(arg, &fput_needed); -+ if (IS_ERR(output_file)) -+ return PTR_ERR(output_file); -+ output_event = output_file->private_data; - } - - ret = perf_event_set_output(event, output_event); - if (output_event) -- fput_light(output_event->filp, fput_needed); -+ fput_light(output_file, fput_needed); - - return ret; - } -@@ -5922,6 +5930,7 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, - - mutex_init(&event->mmap_mutex); - -+ atomic_long_set(&event->refcount, 1); - event->cpu = cpu; - event->attr = *attr; - event->group_leader = group_leader; -@@ -6232,12 +6241,12 @@ SYSCALL_DEFINE5(perf_event_open, - return event_fd; - - if (group_fd != -1) { -- group_leader = perf_fget_light(group_fd, &fput_needed); -- if (IS_ERR(group_leader)) { -- err = PTR_ERR(group_leader); -+ group_file = perf_fget_light(group_fd, &fput_needed); -+ if (IS_ERR(group_file)) { -+ err = PTR_ERR(group_file); - goto err_fd; - } -- group_file = group_leader->filp; -+ group_leader = group_file->private_data; - if (flags & PERF_FLAG_FD_OUTPUT) - output_event = group_leader; - if (flags & PERF_FLAG_FD_NO_GROUP) -@@ -6372,7 +6381,6 @@ SYSCALL_DEFINE5(perf_event_open, - put_ctx(gctx); - } - -- event->filp = event_file; - WARN_ON_ONCE(ctx->parent_ctx); - mutex_lock(&ctx->mutex); - -@@ -6462,7 +6470,6 @@ perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu, - goto err_free; - } - -- event->filp = NULL; - WARN_ON_ONCE(ctx->parent_ctx); - mutex_lock(&ctx->mutex); - perf_install_in_context(ctx, event, cpu); -@@ -6511,7 +6518,7 @@ static void sync_child_event(struct perf_event *child_event, - * Release the parent event, if this was the last - * reference to it. - */ -- fput(parent_event->filp); -+ put_event(parent_event); - } - - static void -@@ -6587,9 +6594,8 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn) - * - * __perf_event_exit_task() - * sync_child_event() -- * fput(parent_event->filp) -- * perf_release() -- * mutex_lock(&ctx->mutex) -+ * put_event() -+ * mutex_lock(&ctx->mutex) - * - * But since its the parent context it won't be the same instance. - */ -@@ -6657,7 +6663,7 @@ static void perf_free_event(struct perf_event *event, - list_del_init(&event->child_list); - mutex_unlock(&parent->child_mutex); - -- fput(parent->filp); -+ put_event(parent); - - perf_group_detach(event); - list_del_event(event, ctx); -@@ -6737,6 +6743,12 @@ inherit_event(struct perf_event *parent_event, - NULL, NULL); - if (IS_ERR(child_event)) - return child_event; -+ -+ if (!atomic_long_inc_not_zero(&parent_event->refcount)) { -+ free_event(child_event); -+ return NULL; -+ } -+ - get_ctx(child_ctx); - - /* -@@ -6778,14 +6790,6 @@ inherit_event(struct perf_event *parent_event, - raw_spin_unlock_irqrestore(&child_ctx->lock, flags); - - /* -- * Get a reference to the parent filp - we will fput it -- * when the child event exits. This is safe to do because -- * we are in the parent and we know that the filp still -- * exists and has a nonzero count: -- */ -- atomic_long_inc(&parent_event->filp->f_count); -- -- /* - * Link this into the parent event's child list - */ - WARN_ON_ONCE(parent_event->ctx->parent_ctx); -diff --git a/kernel/kthread.c b/kernel/kthread.c -index 3d3de63..b579af5 100644 ---- a/kernel/kthread.c -+++ b/kernel/kthread.c -@@ -360,16 +360,12 @@ repeat: - struct kthread_work, node); - list_del_init(&work->node); - } -+ worker->current_work = work; - spin_unlock_irq(&worker->lock); - - if (work) { - __set_current_state(TASK_RUNNING); - work->func(work); -- smp_wmb(); /* wmb worker-b0 paired with flush-b1 */ -- work->done_seq = work->queue_seq; -- smp_mb(); /* mb worker-b1 paired with flush-b0 */ -- if (atomic_read(&work->flushing)) -- wake_up_all(&work->done); - } else if (!freezing(current)) - schedule(); - -@@ -378,6 +374,19 @@ repeat: - } - EXPORT_SYMBOL_GPL(kthread_worker_fn); - -+/* insert @work before @pos in @worker */ -+static void insert_kthread_work(struct kthread_worker *worker, -+ struct kthread_work *work, -+ struct list_head *pos) -+{ -+ lockdep_assert_held(&worker->lock); -+ -+ list_add_tail(&work->node, pos); -+ work->worker = worker; -+ if (likely(worker->task)) -+ wake_up_process(worker->task); -+} -+ - /** - * queue_kthread_work - queue a kthread_work - * @worker: target kthread_worker -@@ -395,10 +404,7 @@ bool queue_kthread_work(struct kthread_worker *worker, - - spin_lock_irqsave(&worker->lock, flags); - if (list_empty(&work->node)) { -- list_add_tail(&work->node, &worker->work_list); -- work->queue_seq++; -- if (likely(worker->task)) -- wake_up_process(worker->task); -+ insert_kthread_work(worker, work, &worker->work_list); - ret = true; - } - spin_unlock_irqrestore(&worker->lock, flags); -@@ -406,6 +412,18 @@ bool queue_kthread_work(struct kthread_worker *worker, - } - EXPORT_SYMBOL_GPL(queue_kthread_work); - -+struct kthread_flush_work { -+ struct kthread_work work; -+ struct completion done; -+}; -+ -+static void kthread_flush_work_fn(struct kthread_work *work) -+{ -+ struct kthread_flush_work *fwork = -+ container_of(work, struct kthread_flush_work, work); -+ complete(&fwork->done); -+} -+ - /** - * flush_kthread_work - flush a kthread_work - * @work: work to flush -@@ -414,39 +432,37 @@ EXPORT_SYMBOL_GPL(queue_kthread_work); - */ - void flush_kthread_work(struct kthread_work *work) - { -- int seq = work->queue_seq; -- -- atomic_inc(&work->flushing); -+ struct kthread_flush_work fwork = { -+ KTHREAD_WORK_INIT(fwork.work, kthread_flush_work_fn), -+ COMPLETION_INITIALIZER_ONSTACK(fwork.done), -+ }; -+ struct kthread_worker *worker; -+ bool noop = false; - -- /* -- * mb flush-b0 paired with worker-b1, to make sure either -- * worker sees the above increment or we see done_seq update. -- */ -- smp_mb__after_atomic_inc(); -+retry: -+ worker = work->worker; -+ if (!worker) -+ return; - -- /* A - B <= 0 tests whether B is in front of A regardless of overflow */ -- wait_event(work->done, seq - work->done_seq <= 0); -- atomic_dec(&work->flushing); -+ spin_lock_irq(&worker->lock); -+ if (work->worker != worker) { -+ spin_unlock_irq(&worker->lock); -+ goto retry; -+ } - -- /* -- * rmb flush-b1 paired with worker-b0, to make sure our caller -- * sees every change made by work->func(). -- */ -- smp_mb__after_atomic_dec(); --} --EXPORT_SYMBOL_GPL(flush_kthread_work); -+ if (!list_empty(&work->node)) -+ insert_kthread_work(worker, &fwork.work, work->node.next); -+ else if (worker->current_work == work) -+ insert_kthread_work(worker, &fwork.work, worker->work_list.next); -+ else -+ noop = true; - --struct kthread_flush_work { -- struct kthread_work work; -- struct completion done; --}; -+ spin_unlock_irq(&worker->lock); - --static void kthread_flush_work_fn(struct kthread_work *work) --{ -- struct kthread_flush_work *fwork = -- container_of(work, struct kthread_flush_work, work); -- complete(&fwork->done); -+ if (!noop) -+ wait_for_completion(&fwork.done); - } -+EXPORT_SYMBOL_GPL(flush_kthread_work); - - /** - * flush_kthread_worker - flush all current works on a kthread_worker -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 39c44fa..c04c9ff 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -1096,7 +1096,7 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu) - * a task's CPU. ->pi_lock for waking tasks, rq->lock for runnable tasks. - * - * sched_move_task() holds both and thus holding either pins the cgroup, -- * see set_task_rq(). -+ * see task_group(). - * - * Furthermore, all task_rq users should acquire both locks, see - * task_rq_lock(). -@@ -7596,6 +7596,7 @@ void sched_destroy_group(struct task_group *tg) - */ - void sched_move_task(struct task_struct *tsk) - { -+ struct task_group *tg; - int on_rq, running; - unsigned long flags; - struct rq *rq; -@@ -7610,6 +7611,12 @@ void sched_move_task(struct task_struct *tsk) - if (unlikely(running)) - tsk->sched_class->put_prev_task(rq, tsk); - -+ tg = container_of(task_subsys_state_check(tsk, cpu_cgroup_subsys_id, -+ lockdep_is_held(&tsk->sighand->siglock)), -+ struct task_group, css); -+ tg = autogroup_task_group(tsk, tg); -+ tsk->sched_task_group = tg; -+ - #ifdef CONFIG_FAIR_GROUP_SCHED - if (tsk->sched_class->task_move_group) - tsk->sched_class->task_move_group(tsk, on_rq); -diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h -index 5cf093f..749f712 100644 ---- a/kernel/sched/sched.h -+++ b/kernel/sched/sched.h -@@ -538,22 +538,19 @@ extern int group_balance_cpu(struct sched_group *sg); - /* - * Return the group to which this tasks belongs. - * -- * We use task_subsys_state_check() and extend the RCU verification with -- * pi->lock and rq->lock because cpu_cgroup_attach() holds those locks for each -- * task it moves into the cgroup. Therefore by holding either of those locks, -- * we pin the task to the current cgroup. -+ * We cannot use task_subsys_state() and friends because the cgroup -+ * subsystem changes that value before the cgroup_subsys::attach() method -+ * is called, therefore we cannot pin it and might observe the wrong value. -+ * -+ * The same is true for autogroup's p->signal->autogroup->tg, the autogroup -+ * core changes this before calling sched_move_task(). -+ * -+ * Instead we use a 'copy' which is updated from sched_move_task() while -+ * holding both task_struct::pi_lock and rq::lock. - */ - static inline struct task_group *task_group(struct task_struct *p) - { -- struct task_group *tg; -- struct cgroup_subsys_state *css; -- -- css = task_subsys_state_check(p, cpu_cgroup_subsys_id, -- lockdep_is_held(&p->pi_lock) || -- lockdep_is_held(&task_rq(p)->lock)); -- tg = container_of(css, struct task_group, css); -- -- return autogroup_task_group(p, tg); -+ return p->sched_task_group; - } - - /* Change a task's cfs_rq and parent entity if it moves across CPUs/groups */ -diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c -index 4a08472..a057ed4 100644 ---- a/kernel/time/tick-sched.c -+++ b/kernel/time/tick-sched.c -@@ -145,6 +145,7 @@ static void tick_nohz_update_jiffies(ktime_t now) - tick_do_update_jiffies64(now); - local_irq_restore(flags); - -+ calc_load_exit_idle(); - touch_softlockup_watchdog(); - } - -diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c -index 3447cfa..63c88c1 100644 ---- a/kernel/time/timekeeping.c -+++ b/kernel/time/timekeeping.c -@@ -384,7 +384,7 @@ int do_settimeofday(const struct timespec *tv) - struct timespec ts_delta; - unsigned long flags; - -- if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) -+ if (!timespec_valid_strict(tv)) - return -EINVAL; - - write_seqlock_irqsave(&timekeeper.lock, flags); -@@ -418,6 +418,8 @@ EXPORT_SYMBOL(do_settimeofday); - int timekeeping_inject_offset(struct timespec *ts) - { - unsigned long flags; -+ struct timespec tmp; -+ int ret = 0; - - if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) - return -EINVAL; -@@ -426,10 +428,17 @@ int timekeeping_inject_offset(struct timespec *ts) - - timekeeping_forward_now(); - -+ tmp = timespec_add(timekeeper.xtime, *ts); -+ if (!timespec_valid_strict(&tmp)) { -+ ret = -EINVAL; -+ goto error; -+ } -+ - timekeeper.xtime = timespec_add(timekeeper.xtime, *ts); - timekeeper.wall_to_monotonic = - timespec_sub(timekeeper.wall_to_monotonic, *ts); - -+error: /* even if we error out, we forwarded the time, so call update */ - timekeeping_update(true); - - write_sequnlock_irqrestore(&timekeeper.lock, flags); -@@ -437,7 +446,7 @@ int timekeeping_inject_offset(struct timespec *ts) - /* signal hrtimers about time change */ - clock_was_set(); - -- return 0; -+ return ret; - } - EXPORT_SYMBOL(timekeeping_inject_offset); - -@@ -597,7 +606,20 @@ void __init timekeeping_init(void) - struct timespec now, boot; - - read_persistent_clock(&now); -+ if (!timespec_valid_strict(&now)) { -+ pr_warn("WARNING: Persistent clock returned invalid value!\n" -+ " Check your CMOS/BIOS settings.\n"); -+ now.tv_sec = 0; -+ now.tv_nsec = 0; -+ } -+ - read_boot_clock(&boot); -+ if (!timespec_valid_strict(&boot)) { -+ pr_warn("WARNING: Boot clock returned invalid value!\n" -+ " Check your CMOS/BIOS settings.\n"); -+ boot.tv_sec = 0; -+ boot.tv_nsec = 0; -+ } - - seqlock_init(&timekeeper.lock); - -@@ -643,7 +665,7 @@ static void update_sleep_time(struct timespec t) - */ - static void __timekeeping_inject_sleeptime(struct timespec *delta) - { -- if (!timespec_valid(delta)) { -+ if (!timespec_valid_strict(delta)) { - printk(KERN_WARNING "__timekeeping_inject_sleeptime: Invalid " - "sleep delta value!\n"); - return; -@@ -1033,6 +1055,10 @@ static void update_wall_time(void) - #else - offset = (clock->read(clock) - clock->cycle_last) & clock->mask; - #endif -+ /* Check if there's really nothing to do */ -+ if (offset < timekeeper.cycle_interval) -+ goto out; -+ - timekeeper.xtime_nsec = (s64)timekeeper.xtime.tv_nsec << - timekeeper.shift; - -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index bc63253..2016347 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -3441,14 +3441,17 @@ static int __cpuinit trustee_thread(void *__gcwq) - - for_each_busy_worker(worker, i, pos, gcwq) { - struct work_struct *rebind_work = &worker->rebind_work; -+ unsigned long worker_flags = worker->flags; - - /* - * Rebind_work may race with future cpu hotplug - * operations. Use a separate flag to mark that -- * rebinding is scheduled. -+ * rebinding is scheduled. The morphing should -+ * be atomic. - */ -- worker->flags |= WORKER_REBIND; -- worker->flags &= ~WORKER_ROGUE; -+ worker_flags |= WORKER_REBIND; -+ worker_flags &= ~WORKER_ROGUE; -+ ACCESS_ONCE(worker->flags) = worker_flags; - - /* queue rebind_work, wq doesn't matter, use the default one */ - if (test_and_set_bit(WORK_STRUCT_PENDING_BIT, -@@ -3628,18 +3631,17 @@ static int __devinit workqueue_cpu_down_callback(struct notifier_block *nfb, - #ifdef CONFIG_SMP - - struct work_for_cpu { -- struct completion completion; -+ struct work_struct work; - long (*fn)(void *); - void *arg; - long ret; - }; - --static int do_work_for_cpu(void *_wfc) -+static void work_for_cpu_fn(struct work_struct *work) - { -- struct work_for_cpu *wfc = _wfc; -+ struct work_for_cpu *wfc = container_of(work, struct work_for_cpu, work); -+ - wfc->ret = wfc->fn(wfc->arg); -- complete(&wfc->completion); -- return 0; - } - - /** -@@ -3654,19 +3656,11 @@ static int do_work_for_cpu(void *_wfc) - */ - long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) - { -- struct task_struct *sub_thread; -- struct work_for_cpu wfc = { -- .completion = COMPLETION_INITIALIZER_ONSTACK(wfc.completion), -- .fn = fn, -- .arg = arg, -- }; -+ struct work_for_cpu wfc = { .fn = fn, .arg = arg }; - -- sub_thread = kthread_create(do_work_for_cpu, &wfc, "work_for_cpu"); -- if (IS_ERR(sub_thread)) -- return PTR_ERR(sub_thread); -- kthread_bind(sub_thread, cpu); -- wake_up_process(sub_thread); -- wait_for_completion(&wfc.completion); -+ INIT_WORK_ONSTACK(&wfc.work, work_for_cpu_fn); -+ schedule_work_on(cpu, &wfc.work); -+ flush_work(&wfc.work); - return wfc.ret; - } - EXPORT_SYMBOL_GPL(work_on_cpu); -diff --git a/lib/digsig.c b/lib/digsig.c -index 286d558..8c0e629 100644 ---- a/lib/digsig.c -+++ b/lib/digsig.c -@@ -163,9 +163,11 @@ static int digsig_verify_rsa(struct key *key, - memcpy(out1 + head, p, l); - - err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len); -+ if (err) -+ goto err; - -- if (!err && len == hlen) -- err = memcmp(out2, h, hlen); -+ if (len != hlen || memcmp(out2, h, hlen)) -+ err = -EINVAL; - - err: - mpi_free(in); -diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c -index 427bb29..0086ac9 100644 ---- a/mm/memory_hotplug.c -+++ b/mm/memory_hotplug.c -@@ -126,9 +126,6 @@ static void register_page_bootmem_info_section(unsigned long start_pfn) - struct mem_section *ms; - struct page *page, *memmap; - -- if (!pfn_valid(start_pfn)) -- return; -- - section_nr = pfn_to_section_nr(start_pfn); - ms = __nr_to_section(section_nr); - -@@ -187,9 +184,16 @@ void register_page_bootmem_info_node(struct pglist_data *pgdat) - end_pfn = pfn + pgdat->node_spanned_pages; - - /* register_section info */ -- for (; pfn < end_pfn; pfn += PAGES_PER_SECTION) -- register_page_bootmem_info_section(pfn); -- -+ for (; pfn < end_pfn; pfn += PAGES_PER_SECTION) { -+ /* -+ * Some platforms can assign the same pfn to multiple nodes - on -+ * node0 as well as nodeN. To avoid registering a pfn against -+ * multiple nodes we check that this pfn does not already -+ * reside in some other node. -+ */ -+ if (pfn_valid(pfn) && (pfn_to_nid(pfn) == node)) -+ register_page_bootmem_info_section(pfn); -+ } - } - #endif /* !CONFIG_SPARSEMEM_VMEMMAP */ - -diff --git a/mm/page_alloc.c b/mm/page_alloc.c -index 201b508..34d879e 100644 ---- a/mm/page_alloc.c -+++ b/mm/page_alloc.c -@@ -580,7 +580,7 @@ static inline void __free_one_page(struct page *page, - combined_idx = buddy_idx & page_idx; - higher_page = page + (combined_idx - page_idx); - buddy_idx = __find_buddy_index(combined_idx, order + 1); -- higher_buddy = page + (buddy_idx - combined_idx); -+ higher_buddy = higher_page + (buddy_idx - combined_idx); - if (page_is_buddy(higher_page, higher_buddy, order + 1)) { - list_add_tail(&page->lru, - &zone->free_area[order].free_list[migratetype]); -diff --git a/net/atm/common.c b/net/atm/common.c -index b4b44db..0c0ad93 100644 ---- a/net/atm/common.c -+++ b/net/atm/common.c -@@ -812,6 +812,7 @@ int vcc_getsockopt(struct socket *sock, int level, int optname, - - if (!vcc->dev || !test_bit(ATM_VF_ADDR, &vcc->flags)) - return -ENOTCONN; -+ memset(&pvc, 0, sizeof(pvc)); - pvc.sap_family = AF_ATMPVC; - pvc.sap_addr.itf = vcc->dev->number; - pvc.sap_addr.vpi = vcc->vpi; -diff --git a/net/atm/pvc.c b/net/atm/pvc.c -index 3a73491..ae03240 100644 ---- a/net/atm/pvc.c -+++ b/net/atm/pvc.c -@@ -95,6 +95,7 @@ static int pvc_getname(struct socket *sock, struct sockaddr *sockaddr, - return -ENOTCONN; - *sockaddr_len = sizeof(struct sockaddr_atmpvc); - addr = (struct sockaddr_atmpvc *)sockaddr; -+ memset(addr, 0, sizeof(*addr)); - addr->sap_family = AF_ATMPVC; - addr->sap_addr.itf = vcc->dev->number; - addr->sap_addr.vpi = vcc->vpi; -diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c -index 3f18a6e..d74947d 100644 ---- a/net/bluetooth/hci_conn.c -+++ b/net/bluetooth/hci_conn.c -@@ -42,6 +42,7 @@ - - #include <net/bluetooth/bluetooth.h> - #include <net/bluetooth/hci_core.h> -+#include <net/bluetooth/smp.h> - - static void hci_le_connect(struct hci_conn *conn) - { -@@ -627,6 +628,9 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) - { - BT_DBG("conn %p", conn); - -+ if (conn->type == LE_LINK) -+ return smp_conn_security(conn, sec_level); -+ - /* For sdp we don't need the link key. */ - if (sec_level == BT_SECURITY_SDP) - return 1; -diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c -index 411ace8..730ff46 100644 ---- a/net/bluetooth/hci_core.c -+++ b/net/bluetooth/hci_core.c -@@ -753,6 +753,8 @@ static int hci_dev_do_close(struct hci_dev *hdev) - - cancel_work_sync(&hdev->le_scan); - -+ cancel_delayed_work(&hdev->power_off); -+ - hci_req_cancel(hdev, ENODEV); - hci_req_lock(hdev); - -diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c -index 5914623..bedc768 100644 ---- a/net/bluetooth/hci_sock.c -+++ b/net/bluetooth/hci_sock.c -@@ -706,6 +706,7 @@ static int hci_sock_getname(struct socket *sock, struct sockaddr *addr, int *add - *addr_len = sizeof(*haddr); - haddr->hci_family = AF_BLUETOOTH; - haddr->hci_dev = hdev->id; -+ haddr->hci_channel= 0; - - release_sock(sk); - return 0; -@@ -1016,6 +1017,7 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname, char - { - struct hci_filter *f = &hci_pi(sk)->filter; - -+ memset(&uf, 0, sizeof(uf)); - uf.type_mask = f->type_mask; - uf.opcode = f->opcode; - uf.event_mask[0] = *((u32 *) f->event_mask + 0); -diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c -index 7568a6f..6204170 100644 ---- a/net/bluetooth/l2cap_core.c -+++ b/net/bluetooth/l2cap_core.c -@@ -1184,14 +1184,15 @@ clean: - static void l2cap_conn_ready(struct l2cap_conn *conn) - { - struct l2cap_chan *chan; -+ struct hci_conn *hcon = conn->hcon; - - BT_DBG("conn %p", conn); - -- if (!conn->hcon->out && conn->hcon->type == LE_LINK) -+ if (!hcon->out && hcon->type == LE_LINK) - l2cap_le_conn_ready(conn); - -- if (conn->hcon->out && conn->hcon->type == LE_LINK) -- smp_conn_security(conn, conn->hcon->pending_sec_level); -+ if (hcon->out && hcon->type == LE_LINK) -+ smp_conn_security(hcon, hcon->pending_sec_level); - - mutex_lock(&conn->chan_lock); - -@@ -1199,8 +1200,8 @@ static void l2cap_conn_ready(struct l2cap_conn *conn) - - l2cap_chan_lock(chan); - -- if (conn->hcon->type == LE_LINK) { -- if (smp_conn_security(conn, chan->sec_level)) -+ if (hcon->type == LE_LINK) { -+ if (smp_conn_security(hcon, chan->sec_level)) - l2cap_chan_ready(chan); - - } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { -diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c -index 3bb1611..9c94d44 100644 ---- a/net/bluetooth/l2cap_sock.c -+++ b/net/bluetooth/l2cap_sock.c -@@ -246,6 +246,7 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr, int *l - - BT_DBG("sock %p, sk %p", sock, sk); - -+ memset(la, 0, sizeof(struct sockaddr_l2)); - addr->sa_family = AF_BLUETOOTH; - *len = sizeof(struct sockaddr_l2); - -@@ -595,7 +596,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch - break; - } - -- if (smp_conn_security(conn, sec.level)) -+ if (smp_conn_security(conn->hcon, sec.level)) - break; - sk->sk_state = BT_CONFIG; - chan->state = BT_CONFIG; -diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c -index 3e5e336..3571450 100644 ---- a/net/bluetooth/mgmt.c -+++ b/net/bluetooth/mgmt.c -@@ -2879,6 +2879,22 @@ int mgmt_powered(struct hci_dev *hdev, u8 powered) - if (scan) - hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan); - -+ if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) { -+ u8 ssp = 1; -+ -+ hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, 1, &ssp); -+ } -+ -+ if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) { -+ struct hci_cp_write_le_host_supported cp; -+ -+ cp.le = 1; -+ cp.simul = !!(hdev->features[6] & LMP_SIMUL_LE_BR); -+ -+ hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, -+ sizeof(cp), &cp); -+ } -+ - update_class(hdev); - update_name(hdev, hdev->dev_name); - update_eir(hdev); -diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c -index e8707de..2df6956 100644 ---- a/net/bluetooth/rfcomm/sock.c -+++ b/net/bluetooth/rfcomm/sock.c -@@ -547,6 +547,7 @@ static int rfcomm_sock_getname(struct socket *sock, struct sockaddr *addr, int * - - BT_DBG("sock %p, sk %p", sock, sk); - -+ memset(sa, 0, sizeof(*sa)); - sa->rc_family = AF_BLUETOOTH; - sa->rc_channel = rfcomm_pi(sk)->channel; - if (peer) -@@ -841,6 +842,7 @@ static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optname, c - } - - sec.level = rfcomm_pi(sk)->sec_level; -+ sec.key_size = 0; - - len = min_t(unsigned int, len, sizeof(sec)); - if (copy_to_user(optval, (char *) &sec, len)) -diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c -index d1820ff..6435296 100644 ---- a/net/bluetooth/rfcomm/tty.c -+++ b/net/bluetooth/rfcomm/tty.c -@@ -461,7 +461,7 @@ static int rfcomm_get_dev_list(void __user *arg) - - size = sizeof(*dl) + dev_num * sizeof(*di); - -- dl = kmalloc(size, GFP_KERNEL); -+ dl = kzalloc(size, GFP_KERNEL); - if (!dl) - return -ENOMEM; - -diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c -index 37df4e9..926043c 100644 ---- a/net/bluetooth/smp.c -+++ b/net/bluetooth/smp.c -@@ -266,10 +266,10 @@ static void smp_failure(struct l2cap_conn *conn, u8 reason, u8 send) - mgmt_auth_failed(conn->hcon->hdev, conn->dst, hcon->type, - hcon->dst_type, reason); - -- if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) { -- cancel_delayed_work_sync(&conn->security_timer); -+ cancel_delayed_work_sync(&conn->security_timer); -+ -+ if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) - smp_chan_destroy(conn); -- } - } - - #define JUST_WORKS 0x00 -@@ -756,9 +756,9 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb) - return 0; - } - --int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level) -+int smp_conn_security(struct hci_conn *hcon, __u8 sec_level) - { -- struct hci_conn *hcon = conn->hcon; -+ struct l2cap_conn *conn = hcon->l2cap_data; - struct smp_chan *smp = conn->smp_chan; - __u8 authreq; - -diff --git a/net/core/dev.c b/net/core/dev.c -index a000840..e2215ee 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -1055,6 +1055,8 @@ rollback: - */ - int dev_set_alias(struct net_device *dev, const char *alias, size_t len) - { -+ char *new_ifalias; -+ - ASSERT_RTNL(); - - if (len >= IFALIASZ) -@@ -1068,9 +1070,10 @@ int dev_set_alias(struct net_device *dev, const char *alias, size_t len) - return 0; - } - -- dev->ifalias = krealloc(dev->ifalias, len + 1, GFP_KERNEL); -- if (!dev->ifalias) -+ new_ifalias = krealloc(dev->ifalias, len + 1, GFP_KERNEL); -+ if (!new_ifalias) - return -ENOMEM; -+ dev->ifalias = new_ifalias; - - strlcpy(dev->ifalias, alias, len+1); - return len; -@@ -1637,6 +1640,19 @@ static inline int deliver_skb(struct sk_buff *skb, - return pt_prev->func(skb, skb->dev, pt_prev, orig_dev); - } - -+static inline bool skb_loop_sk(struct packet_type *ptype, struct sk_buff *skb) -+{ -+ if (ptype->af_packet_priv == NULL) -+ return false; -+ -+ if (ptype->id_match) -+ return ptype->id_match(ptype, skb->sk); -+ else if ((struct sock *)ptype->af_packet_priv == skb->sk) -+ return true; -+ -+ return false; -+} -+ - /* - * Support routine. Sends outgoing frames to any network - * taps currently in use. -@@ -1654,8 +1670,7 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev) - * they originated from - MvS (miquels@drinkel.ow.org) - */ - if ((ptype->dev == dev || !ptype->dev) && -- (ptype->af_packet_priv == NULL || -- (struct sock *)ptype->af_packet_priv != skb->sk)) { -+ (!skb_loop_sk(ptype, skb))) { - if (pt_prev) { - deliver_skb(skb2, pt_prev, skb->dev); - pt_prev = ptype; -@@ -2119,6 +2134,9 @@ netdev_features_t netif_skb_features(struct sk_buff *skb) - __be16 protocol = skb->protocol; - netdev_features_t features = skb->dev->features; - -+ if (skb_shinfo(skb)->gso_segs > skb->dev->gso_max_segs) -+ features &= ~NETIF_F_GSO_MASK; -+ - if (protocol == htons(ETH_P_8021Q)) { - struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; - protocol = veh->h_vlan_encapsulated_proto; -@@ -5911,6 +5929,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, - dev_net_set(dev, &init_net); - - dev->gso_max_size = GSO_MAX_SIZE; -+ dev->gso_max_segs = GSO_MAX_SEGS; - - INIT_LIST_HEAD(&dev->napi_list); - INIT_LIST_HEAD(&dev->unreg_list); -diff --git a/net/core/sock.c b/net/core/sock.c -index 9e5b71f..fcf8fdf 100644 ---- a/net/core/sock.c -+++ b/net/core/sock.c -@@ -1403,6 +1403,7 @@ void sk_setup_caps(struct sock *sk, struct dst_entry *dst) - } else { - sk->sk_route_caps |= NETIF_F_SG | NETIF_F_HW_CSUM; - sk->sk_gso_max_size = dst->dev->gso_max_size; -+ sk->sk_gso_max_segs = dst->dev->gso_max_segs; - } - } - } -diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c -index 8c67bed..ce0d140 100644 ---- a/net/dccp/ccids/ccid3.c -+++ b/net/dccp/ccids/ccid3.c -@@ -531,6 +531,7 @@ static int ccid3_hc_tx_getsockopt(struct sock *sk, const int optname, int len, - case DCCP_SOCKOPT_CCID_TX_INFO: - if (len < sizeof(tfrc)) - return -EINVAL; -+ memset(&tfrc, 0, sizeof(tfrc)); - tfrc.tfrctx_x = hc->tx_x; - tfrc.tfrctx_x_recv = hc->tx_x_recv; - tfrc.tfrctx_x_calc = hc->tx_x_calc; -diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c -index c94bbc6..9be3d17 100644 ---- a/net/ipv4/ipmr.c -+++ b/net/ipv4/ipmr.c -@@ -124,6 +124,8 @@ static DEFINE_SPINLOCK(mfc_unres_lock); - static struct kmem_cache *mrt_cachep __read_mostly; - - static struct mr_table *ipmr_new_table(struct net *net, u32 id); -+static void ipmr_free_table(struct mr_table *mrt); -+ - static int ip_mr_forward(struct net *net, struct mr_table *mrt, - struct sk_buff *skb, struct mfc_cache *cache, - int local); -@@ -131,6 +133,7 @@ static int ipmr_cache_report(struct mr_table *mrt, - struct sk_buff *pkt, vifi_t vifi, int assert); - static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, - struct mfc_cache *c, struct rtmsg *rtm); -+static void mroute_clean_tables(struct mr_table *mrt); - static void ipmr_expire_process(unsigned long arg); - - #ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES -@@ -271,7 +274,7 @@ static void __net_exit ipmr_rules_exit(struct net *net) - - list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) { - list_del(&mrt->list); -- kfree(mrt); -+ ipmr_free_table(mrt); - } - fib_rules_unregister(net->ipv4.mr_rules_ops); - } -@@ -299,7 +302,7 @@ static int __net_init ipmr_rules_init(struct net *net) - - static void __net_exit ipmr_rules_exit(struct net *net) - { -- kfree(net->ipv4.mrt); -+ ipmr_free_table(net->ipv4.mrt); - } - #endif - -@@ -336,6 +339,13 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id) - return mrt; - } - -+static void ipmr_free_table(struct mr_table *mrt) -+{ -+ del_timer_sync(&mrt->ipmr_expire_timer); -+ mroute_clean_tables(mrt); -+ kfree(mrt); -+} -+ - /* Service routines creating virtual interfaces: DVMRP tunnels and PIMREG */ - - static void ipmr_del_tunnel(struct net_device *dev, struct vifctl *v) -diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c -index 6fcd885..7ac0ce6 100644 ---- a/net/ipv4/tcp.c -+++ b/net/ipv4/tcp.c -@@ -805,7 +805,9 @@ static unsigned int tcp_xmit_size_goal(struct sock *sk, u32 mss_now, - old_size_goal + mss_now > xmit_size_goal)) { - xmit_size_goal = old_size_goal; - } else { -- tp->xmit_size_goal_segs = xmit_size_goal / mss_now; -+ tp->xmit_size_goal_segs = -+ min_t(u16, xmit_size_goal / mss_now, -+ sk->sk_gso_max_segs); - xmit_size_goal = tp->xmit_size_goal_segs * mss_now; - } - } -diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c -index 04dbd7a..41ef65d 100644 ---- a/net/ipv4/tcp_cong.c -+++ b/net/ipv4/tcp_cong.c -@@ -291,7 +291,8 @@ bool tcp_is_cwnd_limited(const struct sock *sk, u32 in_flight) - left = tp->snd_cwnd - in_flight; - if (sk_can_gso(sk) && - left * sysctl_tcp_tso_win_divisor < tp->snd_cwnd && -- left * tp->mss_cache < sk->sk_gso_max_size) -+ left * tp->mss_cache < sk->sk_gso_max_size && -+ left < sk->sk_gso_max_segs) - return true; - return left <= tcp_max_tso_deferred_mss(tp); - } -diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c -index 05fe1f4..262316b 100644 ---- a/net/ipv4/tcp_input.c -+++ b/net/ipv4/tcp_input.c -@@ -3107,13 +3107,14 @@ static void tcp_enter_recovery(struct sock *sk, bool ece_ack) - * tcp_xmit_retransmit_queue(). - */ - static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, -- int newly_acked_sacked, bool is_dupack, -+ int prior_sacked, bool is_dupack, - int flag) - { - struct inet_connection_sock *icsk = inet_csk(sk); - struct tcp_sock *tp = tcp_sk(sk); - int do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) && - (tcp_fackets_out(tp) > tp->reordering)); -+ int newly_acked_sacked = 0; - int fast_rexmit = 0; - - if (WARN_ON(!tp->packets_out && tp->sacked_out)) -@@ -3173,6 +3174,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, - tcp_add_reno_sack(sk); - } else - do_lost = tcp_try_undo_partial(sk, pkts_acked); -+ newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; - break; - case TCP_CA_Loss: - if (flag & FLAG_DATA_ACKED) -@@ -3194,6 +3196,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, - if (is_dupack) - tcp_add_reno_sack(sk); - } -+ newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; - - if (icsk->icsk_ca_state <= TCP_CA_Disorder) - tcp_try_undo_dsack(sk); -@@ -3771,7 +3774,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) - int prior_packets; - int prior_sacked = tp->sacked_out; - int pkts_acked = 0; -- int newly_acked_sacked = 0; - bool frto_cwnd = false; - - /* If the ack is older than previous acks -@@ -3847,8 +3849,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) - flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una); - - pkts_acked = prior_packets - tp->packets_out; -- newly_acked_sacked = (prior_packets - prior_sacked) - -- (tp->packets_out - tp->sacked_out); - - if (tp->frto_counter) - frto_cwnd = tcp_process_frto(sk, flag); -@@ -3862,7 +3862,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) - tcp_may_raise_cwnd(sk, flag)) - tcp_cong_avoid(sk, ack, prior_in_flight); - is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); -- tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked, -+ tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, - is_dupack, flag); - } else { - if ((flag & FLAG_DATA_ACKED) && !frto_cwnd) -@@ -3877,7 +3877,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) - no_queue: - /* If data was DSACKed, see if we can undo a cwnd reduction. */ - if (flag & FLAG_DSACKING_ACK) -- tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked, -+ tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, - is_dupack, flag); - /* If this ack opens up a zero window, clear backoff. It was - * being used to time the probes, and is probably far higher than -@@ -3897,8 +3897,7 @@ old_ack: - */ - if (TCP_SKB_CB(skb)->sacked) { - flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una); -- newly_acked_sacked = tp->sacked_out - prior_sacked; -- tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked, -+ tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, - is_dupack, flag); - } - -diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c -index 803cbfe..90b10d0 100644 ---- a/net/ipv4/tcp_output.c -+++ b/net/ipv4/tcp_output.c -@@ -1334,21 +1334,21 @@ static void tcp_cwnd_validate(struct sock *sk) - * when we would be allowed to send the split-due-to-Nagle skb fully. - */ - static unsigned int tcp_mss_split_point(const struct sock *sk, const struct sk_buff *skb, -- unsigned int mss_now, unsigned int cwnd) -+ unsigned int mss_now, unsigned int max_segs) - { - const struct tcp_sock *tp = tcp_sk(sk); -- u32 needed, window, cwnd_len; -+ u32 needed, window, max_len; - - window = tcp_wnd_end(tp) - TCP_SKB_CB(skb)->seq; -- cwnd_len = mss_now * cwnd; -+ max_len = mss_now * max_segs; - -- if (likely(cwnd_len <= window && skb != tcp_write_queue_tail(sk))) -- return cwnd_len; -+ if (likely(max_len <= window && skb != tcp_write_queue_tail(sk))) -+ return max_len; - - needed = min(skb->len, window); - -- if (cwnd_len <= needed) -- return cwnd_len; -+ if (max_len <= needed) -+ return max_len; - - return needed - needed % mss_now; - } -@@ -1577,7 +1577,8 @@ static bool tcp_tso_should_defer(struct sock *sk, struct sk_buff *skb) - limit = min(send_win, cong_win); - - /* If a full-sized TSO skb can be sent, do it. */ -- if (limit >= sk->sk_gso_max_size) -+ if (limit >= min_t(unsigned int, sk->sk_gso_max_size, -+ sk->sk_gso_max_segs * tp->mss_cache)) - goto send_now; - - /* Middle in queue won't get any more data, full sendable already? */ -@@ -1803,7 +1804,9 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, - limit = mss_now; - if (tso_segs > 1 && !tcp_urg_mode(tp)) - limit = tcp_mss_split_point(sk, skb, mss_now, -- cwnd_quota); -+ min_t(unsigned int, -+ cwnd_quota, -+ sk->sk_gso_max_segs)); - - if (skb->len > limit && - unlikely(tso_fragment(sk, skb, limit, mss_now, gfp))) -diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c -index 8f6411c..938ba6d 100644 ---- a/net/ipv6/addrconf.c -+++ b/net/ipv6/addrconf.c -@@ -493,8 +493,7 @@ static void addrconf_forward_change(struct net *net, __s32 newf) - struct net_device *dev; - struct inet6_dev *idev; - -- rcu_read_lock(); -- for_each_netdev_rcu(net, dev) { -+ for_each_netdev(net, dev) { - idev = __in6_dev_get(dev); - if (idev) { - int changed = (!idev->cnf.forwarding) ^ (!newf); -@@ -503,7 +502,6 @@ static void addrconf_forward_change(struct net *net, __s32 newf) - dev_forward_change(idev); - } - } -- rcu_read_unlock(); - } - - static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int newf) -diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c -index 32b2155..cb6584f7 100644 ---- a/net/l2tp/l2tp_core.c -+++ b/net/l2tp/l2tp_core.c -@@ -1346,11 +1346,10 @@ static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel) - /* Remove from tunnel list */ - spin_lock_bh(&pn->l2tp_tunnel_list_lock); - list_del_rcu(&tunnel->list); -+ kfree_rcu(tunnel, rcu); - spin_unlock_bh(&pn->l2tp_tunnel_list_lock); -- synchronize_rcu(); - - atomic_dec(&l2tp_tunnel_count); -- kfree(tunnel); - } - - /* Create a socket for the tunnel, if one isn't set up by -diff --git a/net/l2tp/l2tp_core.h b/net/l2tp/l2tp_core.h -index a38ec6c..56d583e 100644 ---- a/net/l2tp/l2tp_core.h -+++ b/net/l2tp/l2tp_core.h -@@ -163,6 +163,7 @@ struct l2tp_tunnel_cfg { - - struct l2tp_tunnel { - int magic; /* Should be L2TP_TUNNEL_MAGIC */ -+ struct rcu_head rcu; - rwlock_t hlist_lock; /* protect session_hlist */ - struct hlist_head session_hlist[L2TP_HASH_SIZE]; - /* hashed list of sessions, -diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c -index 35e1e4b..9275471 100644 ---- a/net/l2tp/l2tp_ip6.c -+++ b/net/l2tp/l2tp_ip6.c -@@ -410,6 +410,7 @@ static int l2tp_ip6_getname(struct socket *sock, struct sockaddr *uaddr, - lsa->l2tp_family = AF_INET6; - lsa->l2tp_flowinfo = 0; - lsa->l2tp_scope_id = 0; -+ lsa->l2tp_unused = 0; - if (peer) { - if (!lsk->peer_conn_id) - return -ENOTCONN; -diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c -index fe5453c..a13c3e2 100644 ---- a/net/llc/af_llc.c -+++ b/net/llc/af_llc.c -@@ -969,14 +969,13 @@ static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr, - struct sockaddr_llc sllc; - struct sock *sk = sock->sk; - struct llc_sock *llc = llc_sk(sk); -- int rc = 0; -+ int rc = -EBADF; - - memset(&sllc, 0, sizeof(sllc)); - lock_sock(sk); - if (sock_flag(sk, SOCK_ZAPPED)) - goto out; - *uaddrlen = sizeof(sllc); -- memset(uaddr, 0, *uaddrlen); - if (peer) { - rc = -ENOTCONN; - if (sk->sk_state != TCP_ESTABLISHED) -diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c -index 95ae431..92028de 100644 ---- a/net/mac80211/mlme.c -+++ b/net/mac80211/mlme.c -@@ -3270,6 +3270,8 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, - goto out_unlock; - - err_clear: -+ memset(ifmgd->bssid, 0, ETH_ALEN); -+ ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); - ifmgd->auth_data = NULL; - err_free: - kfree(auth_data); -@@ -3449,6 +3451,8 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, - err = 0; - goto out; - err_clear: -+ memset(ifmgd->bssid, 0, ETH_ALEN); -+ ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); - ifmgd->assoc_data = NULL; - err_free: - kfree(assoc_data); -diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c -index 84444dd..72bf32a 100644 ---- a/net/netfilter/ipvs/ip_vs_ctl.c -+++ b/net/netfilter/ipvs/ip_vs_ctl.c -@@ -2759,6 +2759,7 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) - { - struct ip_vs_timeout_user t; - -+ memset(&t, 0, sizeof(t)); - __ip_vs_get_timeouts(net, &t); - if (copy_to_user(user, &t, sizeof(t)) != 0) - ret = -EFAULT; -diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c -index b3025a6..20b32fd 100644 ---- a/net/netlink/af_netlink.c -+++ b/net/netlink/af_netlink.c -@@ -1344,7 +1344,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock, - if (NULL == siocb->scm) - siocb->scm = &scm; - -- err = scm_send(sock, msg, siocb->scm); -+ err = scm_send(sock, msg, siocb->scm, true); - if (err < 0) - return err; - -@@ -1355,7 +1355,8 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock, - dst_pid = addr->nl_pid; - dst_group = ffs(addr->nl_groups); - err = -EPERM; -- if (dst_group && !netlink_capable(sock, NL_NONROOT_SEND)) -+ if ((dst_group || dst_pid) && -+ !netlink_capable(sock, NL_NONROOT_SEND)) - goto out; - } else { - dst_pid = nlk->dst_pid; -@@ -2124,6 +2125,7 @@ static void __init netlink_add_usersock_entry(void) - rcu_assign_pointer(nl_table[NETLINK_USERSOCK].listeners, listeners); - nl_table[NETLINK_USERSOCK].module = THIS_MODULE; - nl_table[NETLINK_USERSOCK].registered = 1; -+ nl_table[NETLINK_USERSOCK].nl_nonroot = NL_NONROOT_SEND; - - netlink_table_ungrab(); - } -diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c -index b6b1d7d..ce5348f 100644 ---- a/net/openvswitch/vport-internal_dev.c -+++ b/net/openvswitch/vport-internal_dev.c -@@ -24,6 +24,9 @@ - #include <linux/ethtool.h> - #include <linux/skbuff.h> - -+#include <net/dst.h> -+#include <net/xfrm.h> -+ - #include "datapath.h" - #include "vport-internal_dev.h" - #include "vport-netdev.h" -@@ -209,6 +212,11 @@ static int internal_dev_recv(struct vport *vport, struct sk_buff *skb) - int len; - - len = skb->len; -+ -+ skb_dst_drop(skb); -+ nf_reset(skb); -+ secpath_reset(skb); -+ - skb->dev = netdev; - skb->pkt_type = PACKET_HOST; - skb->protocol = eth_type_trans(skb, netdev); -diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c -index 0f66174..901cffd 100644 ---- a/net/packet/af_packet.c -+++ b/net/packet/af_packet.c -@@ -1280,6 +1280,14 @@ static void __fanout_unlink(struct sock *sk, struct packet_sock *po) - spin_unlock(&f->lock); - } - -+bool match_fanout_group(struct packet_type *ptype, struct sock * sk) -+{ -+ if (ptype->af_packet_priv == (void*)((struct packet_sock *)sk)->fanout) -+ return true; -+ -+ return false; -+} -+ - static int fanout_add(struct sock *sk, u16 id, u16 type_flags) - { - struct packet_sock *po = pkt_sk(sk); -@@ -1332,6 +1340,7 @@ static int fanout_add(struct sock *sk, u16 id, u16 type_flags) - match->prot_hook.dev = po->prot_hook.dev; - match->prot_hook.func = packet_rcv_fanout; - match->prot_hook.af_packet_priv = match; -+ match->prot_hook.id_match = match_fanout_group; - dev_add_pack(&match->prot_hook); - list_add(&match->list, &fanout_list); - } -@@ -1943,7 +1952,6 @@ static void tpacket_destruct_skb(struct sk_buff *skb) - - if (likely(po->tx_ring.pg_vec)) { - ph = skb_shinfo(skb)->destructor_arg; -- BUG_ON(__packet_get_status(po, ph) != TP_STATUS_SENDING); - BUG_ON(atomic_read(&po->tx_ring.pending) == 0); - atomic_dec(&po->tx_ring.pending); - __packet_set_status(po, ph, TP_STATUS_AVAILABLE); -diff --git a/net/rds/recv.c b/net/rds/recv.c -index 5c6e9f1..9f0f17c 100644 ---- a/net/rds/recv.c -+++ b/net/rds/recv.c -@@ -410,6 +410,8 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, - - rdsdebug("size %zu flags 0x%x timeo %ld\n", size, msg_flags, timeo); - -+ msg->msg_namelen = 0; -+ - if (msg_flags & MSG_OOB) - goto out; - -@@ -485,6 +487,7 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, - sin->sin_port = inc->i_hdr.h_sport; - sin->sin_addr.s_addr = inc->i_saddr; - memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); -+ msg->msg_namelen = sizeof(*sin); - } - break; - } -diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c -index f10fb82..05d60859 100644 ---- a/net/sched/act_gact.c -+++ b/net/sched/act_gact.c -@@ -67,6 +67,9 @@ static int tcf_gact_init(struct nlattr *nla, struct nlattr *est, - struct tcf_common *pc; - int ret = 0; - int err; -+#ifdef CONFIG_GACT_PROB -+ struct tc_gact_p *p_parm = NULL; -+#endif - - if (nla == NULL) - return -EINVAL; -@@ -82,6 +85,12 @@ static int tcf_gact_init(struct nlattr *nla, struct nlattr *est, - #ifndef CONFIG_GACT_PROB - if (tb[TCA_GACT_PROB] != NULL) - return -EOPNOTSUPP; -+#else -+ if (tb[TCA_GACT_PROB]) { -+ p_parm = nla_data(tb[TCA_GACT_PROB]); -+ if (p_parm->ptype >= MAX_RAND) -+ return -EINVAL; -+ } - #endif - - pc = tcf_hash_check(parm->index, a, bind, &gact_hash_info); -@@ -103,8 +112,7 @@ static int tcf_gact_init(struct nlattr *nla, struct nlattr *est, - spin_lock_bh(&gact->tcf_lock); - gact->tcf_action = parm->action; - #ifdef CONFIG_GACT_PROB -- if (tb[TCA_GACT_PROB] != NULL) { -- struct tc_gact_p *p_parm = nla_data(tb[TCA_GACT_PROB]); -+ if (p_parm) { - gact->tcfg_paction = p_parm->paction; - gact->tcfg_pval = p_parm->pval; - gact->tcfg_ptype = p_parm->ptype; -@@ -133,7 +141,7 @@ static int tcf_gact(struct sk_buff *skb, const struct tc_action *a, - - spin_lock(&gact->tcf_lock); - #ifdef CONFIG_GACT_PROB -- if (gact->tcfg_ptype && gact_rand[gact->tcfg_ptype] != NULL) -+ if (gact->tcfg_ptype) - action = gact_rand[gact->tcfg_ptype](gact); - else - action = gact->tcf_action; -diff --git a/net/socket.c b/net/socket.c -index a990aa9..bce45cc 100644 ---- a/net/socket.c -+++ b/net/socket.c -@@ -2658,6 +2658,7 @@ static int dev_ifconf(struct net *net, struct compat_ifconf __user *uifc32) - if (copy_from_user(&ifc32, uifc32, sizeof(struct compat_ifconf))) - return -EFAULT; - -+ memset(&ifc, 0, sizeof(ifc)); - if (ifc32.ifcbuf == 0) { - ifc32.ifc_len = 0; - ifc.ifc_len = 0; -diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c -index 641f2e4..9aa708c 100644 ---- a/net/unix/af_unix.c -+++ b/net/unix/af_unix.c -@@ -1448,7 +1448,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, - if (NULL == siocb->scm) - siocb->scm = &tmp_scm; - wait_for_unix_gc(); -- err = scm_send(sock, msg, siocb->scm); -+ err = scm_send(sock, msg, siocb->scm, false); - if (err < 0) - return err; - -@@ -1617,7 +1617,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock, - if (NULL == siocb->scm) - siocb->scm = &tmp_scm; - wait_for_unix_gc(); -- err = scm_send(sock, msg, siocb->scm); -+ err = scm_send(sock, msg, siocb->scm, false); - if (err < 0) - return err; - -diff --git a/net/wireless/reg.c b/net/wireless/reg.c -index 460af03..b01449f 100644 ---- a/net/wireless/reg.c -+++ b/net/wireless/reg.c -@@ -340,6 +340,9 @@ static void reg_regdb_search(struct work_struct *work) - struct reg_regdb_search_request *request; - const struct ieee80211_regdomain *curdom, *regdom; - int i, r; -+ bool set_reg = false; -+ -+ mutex_lock(&cfg80211_mutex); - - mutex_lock(®_regdb_search_mutex); - while (!list_empty(®_regdb_search_list)) { -@@ -355,9 +358,7 @@ static void reg_regdb_search(struct work_struct *work) - r = reg_copy_regd(®dom, curdom); - if (r) - break; -- mutex_lock(&cfg80211_mutex); -- set_regdom(regdom); -- mutex_unlock(&cfg80211_mutex); -+ set_reg = true; - break; - } - } -@@ -365,6 +366,11 @@ static void reg_regdb_search(struct work_struct *work) - kfree(request); - } - mutex_unlock(®_regdb_search_mutex); -+ -+ if (set_reg) -+ set_regdom(regdom); -+ -+ mutex_unlock(&cfg80211_mutex); - } - - static DECLARE_WORK(reg_regdb_work, reg_regdb_search); -diff --git a/sound/aoa/codecs/onyx.c b/sound/aoa/codecs/onyx.c -index 270790d..4cedc69 100644 ---- a/sound/aoa/codecs/onyx.c -+++ b/sound/aoa/codecs/onyx.c -@@ -997,45 +997,10 @@ static void onyx_exit_codec(struct aoa_codec *codec) - onyx->codec.soundbus_dev->detach_codec(onyx->codec.soundbus_dev, onyx); - } - --static int onyx_create(struct i2c_adapter *adapter, -- struct device_node *node, -- int addr) --{ -- struct i2c_board_info info; -- struct i2c_client *client; -- -- memset(&info, 0, sizeof(struct i2c_board_info)); -- strlcpy(info.type, "aoa_codec_onyx", I2C_NAME_SIZE); -- info.addr = addr; -- info.platform_data = node; -- client = i2c_new_device(adapter, &info); -- if (!client) -- return -ENODEV; -- -- /* -- * We know the driver is already loaded, so the device should be -- * already bound. If not it means binding failed, which suggests -- * the device doesn't really exist and should be deleted. -- * Ideally this would be replaced by better checks _before_ -- * instantiating the device. -- */ -- if (!client->driver) { -- i2c_unregister_device(client); -- return -ENODEV; -- } -- -- /* -- * Let i2c-core delete that device on driver removal. -- * This is safe because i2c-core holds the core_lock mutex for us. -- */ -- list_add_tail(&client->detected, &client->driver->clients); -- return 0; --} -- - static int onyx_i2c_probe(struct i2c_client *client, - const struct i2c_device_id *id) - { -- struct device_node *node = client->dev.platform_data; -+ struct device_node *node = client->dev.of_node; - struct onyx *onyx; - u8 dummy; - -@@ -1071,40 +1036,6 @@ static int onyx_i2c_probe(struct i2c_client *client, - return -ENODEV; - } - --static int onyx_i2c_attach(struct i2c_adapter *adapter) --{ -- struct device_node *busnode, *dev = NULL; -- struct pmac_i2c_bus *bus; -- -- bus = pmac_i2c_adapter_to_bus(adapter); -- if (bus == NULL) -- return -ENODEV; -- busnode = pmac_i2c_get_bus_node(bus); -- -- while ((dev = of_get_next_child(busnode, dev)) != NULL) { -- if (of_device_is_compatible(dev, "pcm3052")) { -- const u32 *addr; -- printk(KERN_DEBUG PFX "found pcm3052\n"); -- addr = of_get_property(dev, "reg", NULL); -- if (!addr) -- return -ENODEV; -- return onyx_create(adapter, dev, (*addr)>>1); -- } -- } -- -- /* if that didn't work, try desperate mode for older -- * machines that have stuff missing from the device tree */ -- -- if (!of_device_is_compatible(busnode, "k2-i2c")) -- return -ENODEV; -- -- printk(KERN_DEBUG PFX "found k2-i2c, checking if onyx chip is on it\n"); -- /* probe both possible addresses for the onyx chip */ -- if (onyx_create(adapter, NULL, 0x46) == 0) -- return 0; -- return onyx_create(adapter, NULL, 0x47); --} -- - static int onyx_i2c_remove(struct i2c_client *client) - { - struct onyx *onyx = i2c_get_clientdata(client); -@@ -1117,16 +1048,16 @@ static int onyx_i2c_remove(struct i2c_client *client) - } - - static const struct i2c_device_id onyx_i2c_id[] = { -- { "aoa_codec_onyx", 0 }, -+ { "MAC,pcm3052", 0 }, - { } - }; -+MODULE_DEVICE_TABLE(i2c,onyx_i2c_id); - - static struct i2c_driver onyx_driver = { - .driver = { - .name = "aoa_codec_onyx", - .owner = THIS_MODULE, - }, -- .attach_adapter = onyx_i2c_attach, - .probe = onyx_i2c_probe, - .remove = onyx_i2c_remove, - .id_table = onyx_i2c_id, -diff --git a/sound/aoa/codecs/tas.c b/sound/aoa/codecs/tas.c -index 8e63d1f..c491ae0 100644 ---- a/sound/aoa/codecs/tas.c -+++ b/sound/aoa/codecs/tas.c -@@ -883,43 +883,10 @@ static void tas_exit_codec(struct aoa_codec *codec) - } - - --static int tas_create(struct i2c_adapter *adapter, -- struct device_node *node, -- int addr) --{ -- struct i2c_board_info info; -- struct i2c_client *client; -- -- memset(&info, 0, sizeof(struct i2c_board_info)); -- strlcpy(info.type, "aoa_codec_tas", I2C_NAME_SIZE); -- info.addr = addr; -- info.platform_data = node; -- -- client = i2c_new_device(adapter, &info); -- if (!client) -- return -ENODEV; -- /* -- * We know the driver is already loaded, so the device should be -- * already bound. If not it means binding failed, and then there -- * is no point in keeping the device instantiated. -- */ -- if (!client->driver) { -- i2c_unregister_device(client); -- return -ENODEV; -- } -- -- /* -- * Let i2c-core delete that device on driver removal. -- * This is safe because i2c-core holds the core_lock mutex for us. -- */ -- list_add_tail(&client->detected, &client->driver->clients); -- return 0; --} -- - static int tas_i2c_probe(struct i2c_client *client, - const struct i2c_device_id *id) - { -- struct device_node *node = client->dev.platform_data; -+ struct device_node *node = client->dev.of_node; - struct tas *tas; - - tas = kzalloc(sizeof(struct tas), GFP_KERNEL); -@@ -953,47 +920,6 @@ static int tas_i2c_probe(struct i2c_client *client, - return -EINVAL; - } - --static int tas_i2c_attach(struct i2c_adapter *adapter) --{ -- struct device_node *busnode, *dev = NULL; -- struct pmac_i2c_bus *bus; -- -- bus = pmac_i2c_adapter_to_bus(adapter); -- if (bus == NULL) -- return -ENODEV; -- busnode = pmac_i2c_get_bus_node(bus); -- -- while ((dev = of_get_next_child(busnode, dev)) != NULL) { -- if (of_device_is_compatible(dev, "tas3004")) { -- const u32 *addr; -- printk(KERN_DEBUG PFX "found tas3004\n"); -- addr = of_get_property(dev, "reg", NULL); -- if (!addr) -- continue; -- return tas_create(adapter, dev, ((*addr) >> 1) & 0x7f); -- } -- /* older machines have no 'codec' node with a 'compatible' -- * property that says 'tas3004', they just have a 'deq' -- * node without any such property... */ -- if (strcmp(dev->name, "deq") == 0) { -- const u32 *_addr; -- u32 addr; -- printk(KERN_DEBUG PFX "found 'deq' node\n"); -- _addr = of_get_property(dev, "i2c-address", NULL); -- if (!_addr) -- continue; -- addr = ((*_addr) >> 1) & 0x7f; -- /* now, if the address doesn't match any of the two -- * that a tas3004 can have, we cannot handle this. -- * I doubt it ever happens but hey. */ -- if (addr != 0x34 && addr != 0x35) -- continue; -- return tas_create(adapter, dev, addr); -- } -- } -- return -ENODEV; --} -- - static int tas_i2c_remove(struct i2c_client *client) - { - struct tas *tas = i2c_get_clientdata(client); -@@ -1011,16 +937,16 @@ static int tas_i2c_remove(struct i2c_client *client) - } - - static const struct i2c_device_id tas_i2c_id[] = { -- { "aoa_codec_tas", 0 }, -+ { "MAC,tas3004", 0 }, - { } - }; -+MODULE_DEVICE_TABLE(i2c,tas_i2c_id); - - static struct i2c_driver tas_driver = { - .driver = { - .name = "aoa_codec_tas", - .owner = THIS_MODULE, - }, -- .attach_adapter = tas_i2c_attach, - .probe = tas_i2c_probe, - .remove = tas_i2c_remove, - .id_table = tas_i2c_id, -diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c -index c0fa629..f1c6164 100644 ---- a/sound/pci/hda/hda_codec.c -+++ b/sound/pci/hda/hda_codec.c -@@ -2325,6 +2325,7 @@ int snd_hda_codec_reset(struct hda_codec *codec) - } - if (codec->patch_ops.free) - codec->patch_ops.free(codec); -+ memset(&codec->patch_ops, 0, sizeof(codec->patch_ops)); - snd_hda_jack_tbl_clear(codec); - codec->proc_widget_hook = NULL; - codec->spec = NULL; -@@ -2340,7 +2341,6 @@ int snd_hda_codec_reset(struct hda_codec *codec) - codec->num_pcms = 0; - codec->pcm_info = NULL; - codec->preset = NULL; -- memset(&codec->patch_ops, 0, sizeof(codec->patch_ops)); - codec->slave_dig_outs = NULL; - codec->spdif_status_reset = 0; - module_put(codec->owner); -diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c -index 44d2ab5..7faf28c 100644 ---- a/sound/pci/hda/patch_realtek.c -+++ b/sound/pci/hda/patch_realtek.c -@@ -201,6 +201,7 @@ struct alc_spec { - unsigned int vol_in_capsrc:1; /* use capsrc volume (ADC has no vol) */ - unsigned int parse_flags; /* passed to snd_hda_parse_pin_defcfg() */ - unsigned int shared_mic_hp:1; /* HP/Mic-in sharing */ -+ unsigned int no_primary_hp:1; /* Don't prefer HP pins to speaker pins */ - - /* auto-mute control */ - int automute_mode; -@@ -4182,7 +4183,8 @@ static int alc_parse_auto_config(struct hda_codec *codec, - return 0; /* can't find valid BIOS pin config */ - } - -- if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT && -+ if (!spec->no_primary_hp && -+ cfg->line_out_type == AUTO_PIN_SPEAKER_OUT && - cfg->line_outs <= cfg->hp_outs) { - /* use HP as primary out */ - cfg->speaker_outs = cfg->line_outs; -@@ -4909,6 +4911,7 @@ enum { - ALC889_FIXUP_DAC_ROUTE, - ALC889_FIXUP_MBP_VREF, - ALC889_FIXUP_IMAC91_VREF, -+ ALC882_FIXUP_NO_PRIMARY_HP, - }; - - static void alc889_fixup_coef(struct hda_codec *codec, -@@ -5030,6 +5033,17 @@ static void alc889_fixup_imac91_vref(struct hda_codec *codec, - spec->keep_vref_in_automute = 1; - } - -+/* Don't take HP output as primary -+ * strangely, the speaker output doesn't work on VAIO Z through DAC 0x05 -+ */ -+static void alc882_fixup_no_primary_hp(struct hda_codec *codec, -+ const struct alc_fixup *fix, int action) -+{ -+ struct alc_spec *spec = codec->spec; -+ if (action == ALC_FIXUP_ACT_PRE_PROBE) -+ spec->no_primary_hp = 1; -+} -+ - static const struct alc_fixup alc882_fixups[] = { - [ALC882_FIXUP_ABIT_AW9D_MAX] = { - .type = ALC_FIXUP_PINS, -@@ -5212,6 +5226,10 @@ static const struct alc_fixup alc882_fixups[] = { - .chained = true, - .chain_id = ALC882_FIXUP_GPIO1, - }, -+ [ALC882_FIXUP_NO_PRIMARY_HP] = { -+ .type = ALC_FIXUP_FUNC, -+ .v.func = alc882_fixup_no_primary_hp, -+ }, - }; - - static const struct snd_pci_quirk alc882_fixup_tbl[] = { -@@ -5246,6 +5264,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = { - SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC), - SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601), - SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT), -+ SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP), - - /* All Apple entries are in codec SSIDs */ - SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF), -@@ -5286,6 +5305,7 @@ static const struct alc_model_fixup alc882_fixup_models[] = { - {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"}, - {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"}, - {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"}, -+ {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"}, - {} - }; - -diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c -index d2f2264..b98aded 100644 ---- a/sound/pci/hda/patch_sigmatel.c -+++ b/sound/pci/hda/patch_sigmatel.c -@@ -1075,7 +1075,7 @@ static struct snd_kcontrol_new stac_smux_mixer = { - - static const char * const slave_pfxs[] = { - "Front", "Surround", "Center", "LFE", "Side", -- "Headphone", "Speaker", "IEC958", -+ "Headphone", "Speaker", "IEC958", "PCM", - NULL - }; - -diff --git a/sound/pci/ice1712/prodigy_hifi.c b/sound/pci/ice1712/prodigy_hifi.c -index 764cc93..075d5aa 100644 ---- a/sound/pci/ice1712/prodigy_hifi.c -+++ b/sound/pci/ice1712/prodigy_hifi.c -@@ -297,6 +297,7 @@ static int ak4396_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem - } - - static const DECLARE_TLV_DB_SCALE(db_scale_wm_dac, -12700, 100, 1); -+static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0); - - static struct snd_kcontrol_new prodigy_hd2_controls[] __devinitdata = { - { -@@ -307,7 +308,7 @@ static struct snd_kcontrol_new prodigy_hd2_controls[] __devinitdata = { - .info = ak4396_dac_vol_info, - .get = ak4396_dac_vol_get, - .put = ak4396_dac_vol_put, -- .tlv = { .p = db_scale_wm_dac }, -+ .tlv = { .p = ak4396_db_scale }, - }, - }; - -diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c -index 0418fa1..45f2faf 100644 ---- a/sound/soc/codecs/wm2000.c -+++ b/sound/soc/codecs/wm2000.c -@@ -675,7 +675,7 @@ static int wm2000_resume(struct snd_soc_codec *codec) - #endif - - static const struct regmap_config wm2000_regmap = { -- .reg_bits = 8, -+ .reg_bits = 16, - .val_bits = 8, - }; - -diff --git a/sound/soc/samsung/dma.c b/sound/soc/samsung/dma.c -index ddc6cde..2526eca 100644 ---- a/sound/soc/samsung/dma.c -+++ b/sound/soc/samsung/dma.c -@@ -34,9 +34,7 @@ static const struct snd_pcm_hardware dma_hardware = { - .info = SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP | -- SNDRV_PCM_INFO_MMAP_VALID | -- SNDRV_PCM_INFO_PAUSE | -- SNDRV_PCM_INFO_RESUME, -+ SNDRV_PCM_INFO_MMAP_VALID, - .formats = SNDRV_PCM_FMTBIT_S16_LE | - SNDRV_PCM_FMTBIT_U16_LE | - SNDRV_PCM_FMTBIT_U8 | -@@ -246,15 +244,11 @@ static int dma_trigger(struct snd_pcm_substream *substream, int cmd) - - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: -- case SNDRV_PCM_TRIGGER_RESUME: -- case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - prtd->state |= ST_RUNNING; - prtd->params->ops->trigger(prtd->params->ch); - break; - - case SNDRV_PCM_TRIGGER_STOP: -- case SNDRV_PCM_TRIGGER_SUSPEND: -- case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - prtd->state &= ~ST_RUNNING; - prtd->params->ops->stop(prtd->params->ch); - break; -diff --git a/sound/soc/tegra/tegra_alc5632.c b/sound/soc/tegra/tegra_alc5632.c -index 32de700..2f272c5 100644 ---- a/sound/soc/tegra/tegra_alc5632.c -+++ b/sound/soc/tegra/tegra_alc5632.c -@@ -92,7 +92,6 @@ static struct snd_soc_jack_gpio tegra_alc5632_hp_jack_gpio = { - .name = "Headset detection", - .report = SND_JACK_HEADSET, - .debounce_time = 150, -- .invert = 1, - }; - - static const struct snd_soc_dapm_widget tegra_alc5632_dapm_widgets[] = { -diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c -index d6e2bb4..060dccb 100644 ---- a/sound/usb/endpoint.c -+++ b/sound/usb/endpoint.c -@@ -197,7 +197,13 @@ static void prepare_outbound_urb(struct snd_usb_endpoint *ep, - /* no data provider, so send silence */ - unsigned int offs = 0; - for (i = 0; i < ctx->packets; ++i) { -- int counts = ctx->packet_size[i]; -+ int counts; -+ -+ if (ctx->packet_size[i]) -+ counts = ctx->packet_size[i]; -+ else -+ counts = snd_usb_endpoint_next_packet_size(ep); -+ - urb->iso_frame_desc[i].offset = offs * ep->stride; - urb->iso_frame_desc[i].length = counts * ep->stride; - offs += counts; -diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c -index fd5e982..f782ce1 100644 ---- a/sound/usb/pcm.c -+++ b/sound/usb/pcm.c -@@ -1140,6 +1140,12 @@ static void retire_playback_urb(struct snd_usb_substream *subs, - int processed = urb->transfer_buffer_length / stride; - int est_delay; - -+ /* ignore the delay accounting when procssed=0 is given, i.e. -+ * silent payloads are procssed before handling the actual data -+ */ -+ if (!processed) -+ return; -+ - spin_lock_irqsave(&subs->lock, flags); - est_delay = snd_usb_pcm_delay(subs, runtime->rate); - /* update delay with exact number of samples played */ diff --git a/3.5.5/0000_README b/3.5.6/0000_README index 95939b8..2e0bf11 100644 --- a/3.5.5/0000_README +++ b/3.5.6/0000_README @@ -2,7 +2,7 @@ README ----------------------------------------------------------------------------- Individual Patch Descriptions: ----------------------------------------------------------------------------- -Patch: 4420_grsecurity-2.9.1-3.5.5-201210070828.patch +Patch: 4420_grsecurity-2.9.1-3.5.6-201210071716.patch From: http://www.grsecurity.net Desc: hardened-sources base patch from upstream grsecurity diff --git a/3.5.5/4420_grsecurity-2.9.1-3.5.5-201210070828.patch b/3.5.6/4420_grsecurity-2.9.1-3.5.6-201210071716.patch index 5345b72..3a2e2b8 100644 --- a/3.5.5/4420_grsecurity-2.9.1-3.5.5-201210070828.patch +++ b/3.5.6/4420_grsecurity-2.9.1-3.5.6-201210071716.patch @@ -285,7 +285,7 @@ index 13d6166..8c235b6 100644 ============================================================== diff --git a/Makefile b/Makefile -index b3dfc85..61372d3 100644 +index 75c7683..a1ee05c 100644 --- a/Makefile +++ b/Makefile @@ -241,8 +241,9 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ @@ -13761,7 +13761,7 @@ index 7261083..5c12053 100644 bogus_magic: jmp bogus_magic diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c -index 73ef56c..0238021 100644 +index bda833c..a9bdd97 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c @@ -276,6 +276,13 @@ void __init_or_module apply_alternatives(struct alt_instr *start, @@ -31415,10 +31415,10 @@ index 8a8725c..afed796 100644 marker = list_first_entry(&queue->head, struct vmw_marker, head); diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c -index 1f6957c..b579481 100644 +index 0e4d41e..dfd88b4 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c -@@ -2153,7 +2153,7 @@ static bool hid_ignore(struct hid_device *hdev) +@@ -2163,7 +2163,7 @@ static bool hid_ignore(struct hid_device *hdev) int hid_add_device(struct hid_device *hdev) { @@ -31427,7 +31427,7 @@ index 1f6957c..b579481 100644 int ret; if (WARN_ON(hdev->status & HID_STAT_ADDED)) -@@ -2188,7 +2188,7 @@ int hid_add_device(struct hid_device *hdev) +@@ -2198,7 +2198,7 @@ int hid_add_device(struct hid_device *hdev) /* XXX hack, any other cleaner solution after the driver core * is converted to allow more than 20 bytes as the device name? */ dev_set_name(&hdev->dev, "%04X:%04X:%04X.%04X", hdev->bus, @@ -33483,7 +33483,7 @@ index 35c94ff..20d4c17 100644 schedule_work(&sc->trigger_event); } diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c -index 2e227fb..44ead1f 100644 +index f220a69..512fd1c 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -390,7 +390,7 @@ static int device_area_is_invalid(struct dm_target *ti, struct dm_dev *dev, @@ -33518,7 +33518,7 @@ index 3e2907f..c28851a 100644 pmd->bl_info.value_type.inc = data_block_inc; pmd->bl_info.value_type.dec = data_block_dec; diff --git a/drivers/md/dm.c b/drivers/md/dm.c -index e24143c..ce2f21a1 100644 +index 9ff3019..c119fde 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -176,9 +176,9 @@ struct mapped_device { @@ -33533,7 +33533,7 @@ index e24143c..ce2f21a1 100644 struct list_head uevent_list; spinlock_t uevent_lock; /* Protect access to uevent_list */ -@@ -1845,8 +1845,8 @@ static struct mapped_device *alloc_dev(int minor) +@@ -1865,8 +1865,8 @@ static struct mapped_device *alloc_dev(int minor) rwlock_init(&md->map_lock); atomic_set(&md->holders, 1); atomic_set(&md->open_count, 0); @@ -33544,7 +33544,7 @@ index e24143c..ce2f21a1 100644 INIT_LIST_HEAD(&md->uevent_list); spin_lock_init(&md->uevent_lock); -@@ -1980,7 +1980,7 @@ static void event_callback(void *context) +@@ -2000,7 +2000,7 @@ static void event_callback(void *context) dm_send_uevents(&uevents, &disk_to_dev(md->disk)->kobj); @@ -33553,7 +33553,7 @@ index e24143c..ce2f21a1 100644 wake_up(&md->eventq); } -@@ -2622,18 +2622,18 @@ int dm_kobject_uevent(struct mapped_device *md, enum kobject_action action, +@@ -2642,18 +2642,18 @@ int dm_kobject_uevent(struct mapped_device *md, enum kobject_action action, uint32_t dm_next_uevent_seq(struct mapped_device *md) { @@ -36793,7 +36793,7 @@ index b48c24f..dac0fbc 100644 /* These three are default values which can be overridden */ diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c -index 2b4261c..e01516c 100644 +index f9823f2..7bc3e81 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c @@ -536,7 +536,7 @@ static inline u32 next_command(struct ctlr_info *h, u8 q) @@ -37508,7 +37508,7 @@ index dae3873..bb4bee6 100644 disposition = scsi_decide_disposition(cmd); if (disposition != SUCCESS && diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c -index bb7c482..7551a95 100644 +index 08d48a3..2be990d 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -660,7 +660,7 @@ show_iostat_##field(struct device *dev, struct device_attribute *attr, \ @@ -37739,23 +37739,6 @@ index c7b5e8b..783d6cb 100644 return -EFAULT; return 0; -diff --git a/drivers/staging/speakup/speakup_soft.c b/drivers/staging/speakup/speakup_soft.c -index 42cdafe..2769103 100644 ---- a/drivers/staging/speakup/speakup_soft.c -+++ b/drivers/staging/speakup/speakup_soft.c -@@ -241,11 +241,11 @@ static ssize_t softsynth_read(struct file *fp, char *buf, size_t count, - break; - } else if (!initialized) { - if (*init) { -- ch = *init; - init++; - } else { - initialized = 1; - } -+ ch = *init; - } else { - ch = synth_buffer_getc(); - } diff --git a/drivers/staging/usbip/usbip_common.h b/drivers/staging/usbip/usbip_common.h index 5d89c0f..9261317 100644 --- a/drivers/staging/usbip/usbip_common.h @@ -38277,10 +38260,10 @@ index 324467d..504cc25 100644 tty_port_tty_set(&ch->port, tty); mutex_lock(&ch->port.mutex); diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c -index c43b683..4dab83e 100644 +index 90dff82..08119c3 100644 --- a/drivers/tty/n_gsm.c +++ b/drivers/tty/n_gsm.c -@@ -1629,7 +1629,7 @@ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr) +@@ -1639,7 +1639,7 @@ static struct gsm_dlci *gsm_dlci_alloc(struct gsm_mux *gsm, int addr) kref_init(&dlci->ref); mutex_init(&dlci->mutex); dlci->fifo = &dlci->_fifo; @@ -38289,7 +38272,7 @@ index c43b683..4dab83e 100644 kfree(dlci); return NULL; } -@@ -2895,7 +2895,7 @@ static int gsmtty_open(struct tty_struct *tty, struct file *filp) +@@ -2909,7 +2909,7 @@ static int gsmtty_open(struct tty_struct *tty, struct file *filp) if (dlci == NULL) return -ENOMEM; port = &dlci->port; @@ -38299,10 +38282,10 @@ index c43b683..4dab83e 100644 dlci_get(dlci); dlci_get(dlci->gsm->dlci[0]); diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c -index ee1c268..0e97caf 100644 +index 26f0d0e..b7c4273 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c -@@ -2123,6 +2123,7 @@ void n_tty_inherit_ops(struct tty_ldisc_ops *ops) +@@ -2124,6 +2124,7 @@ void n_tty_inherit_ops(struct tty_ldisc_ops *ops) { *ops = tty_ldisc_N_TTY; ops->owner = NULL; @@ -39032,7 +39015,7 @@ index bf6e238..d401c04 100644 tty_port_tty_set(port, tty); diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c -index 48cc6f2..85584dd 100644 +index 770a854..e5d3db3 100644 --- a/drivers/tty/vt/keyboard.c +++ b/drivers/tty/vt/keyboard.c @@ -659,6 +659,16 @@ static void k_spec(struct vc_data *vc, unsigned char value, char up_flag) @@ -39052,7 +39035,7 @@ index 48cc6f2..85584dd 100644 fn_handler[value](vc); } -@@ -1808,9 +1818,6 @@ int vt_do_kdsk_ioctl(int cmd, struct kbentry __user *user_kbe, int perm, +@@ -1805,9 +1815,6 @@ int vt_do_kdsk_ioctl(int cmd, struct kbentry __user *user_kbe, int perm, if (copy_from_user(&tmp, user_kbe, sizeof(struct kbentry))) return -EFAULT; @@ -39062,7 +39045,7 @@ index 48cc6f2..85584dd 100644 switch (cmd) { case KDGKBENT: /* Ensure another thread doesn't free it under us */ -@@ -1825,6 +1832,9 @@ int vt_do_kdsk_ioctl(int cmd, struct kbentry __user *user_kbe, int perm, +@@ -1822,6 +1829,9 @@ int vt_do_kdsk_ioctl(int cmd, struct kbentry __user *user_kbe, int perm, spin_unlock_irqrestore(&kbd_event_lock, flags); return put_user(val, &user_kbe->kb_value); case KDSKBENT: @@ -39072,7 +39055,7 @@ index 48cc6f2..85584dd 100644 if (!perm) return -EPERM; if (!i && v == K_NOSUCHMAP) { -@@ -1915,9 +1925,6 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user *user_kdgkb, int perm) +@@ -1912,9 +1922,6 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user *user_kdgkb, int perm) int i, j, k; int ret; @@ -39082,7 +39065,7 @@ index 48cc6f2..85584dd 100644 kbs = kmalloc(sizeof(*kbs), GFP_KERNEL); if (!kbs) { ret = -ENOMEM; -@@ -1951,6 +1958,9 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user *user_kdgkb, int perm) +@@ -1948,6 +1955,9 @@ int vt_do_kdgkb_ioctl(int cmd, struct kbsentry __user *user_kdgkb, int perm) kfree(kbs); return ((p && *p) ? -EOVERFLOW : 0); case KDSKBSENT: @@ -42923,7 +42906,7 @@ index d146e18..12d1bd1 100644 fd_offset + ex.a_text); if (error != N_DATADDR(ex)) { diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c -index 1b52956..725eca7 100644 +index 0225fdd..9f0ef53 100644 --- a/fs/binfmt_elf.c +++ b/fs/binfmt_elf.c @@ -32,6 +32,7 @@ @@ -43592,7 +43575,7 @@ index 1b52956..725eca7 100644 fill_note(note, "CORE", NT_AUXV, i * sizeof(elf_addr_t), auxv); } -@@ -1890,14 +2338,14 @@ static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum, +@@ -1879,14 +2327,14 @@ static void fill_extnum_info(struct elfhdr *elf, struct elf_shdr *shdr4extnum, } static size_t elf_core_vma_data_size(struct vm_area_struct *gate_vma, @@ -43609,7 +43592,7 @@ index 1b52956..725eca7 100644 return size; } -@@ -1991,7 +2439,7 @@ static int elf_core_dump(struct coredump_params *cprm) +@@ -1980,7 +2428,7 @@ static int elf_core_dump(struct coredump_params *cprm) dataoff = offset = roundup(offset, ELF_EXEC_PAGESIZE); @@ -43618,7 +43601,7 @@ index 1b52956..725eca7 100644 offset += elf_core_extra_data_size(); e_shoff = offset; -@@ -2005,10 +2453,12 @@ static int elf_core_dump(struct coredump_params *cprm) +@@ -1994,10 +2442,12 @@ static int elf_core_dump(struct coredump_params *cprm) offset = dataoff; size += sizeof(*elf); @@ -43631,7 +43614,7 @@ index 1b52956..725eca7 100644 if (size > cprm->limit || !dump_write(cprm->file, phdr4note, sizeof(*phdr4note))) goto end_coredump; -@@ -2022,7 +2472,7 @@ static int elf_core_dump(struct coredump_params *cprm) +@@ -2011,7 +2461,7 @@ static int elf_core_dump(struct coredump_params *cprm) phdr.p_offset = offset; phdr.p_vaddr = vma->vm_start; phdr.p_paddr = 0; @@ -43640,7 +43623,7 @@ index 1b52956..725eca7 100644 phdr.p_memsz = vma->vm_end - vma->vm_start; offset += phdr.p_filesz; phdr.p_flags = vma->vm_flags & VM_READ ? PF_R : 0; -@@ -2033,6 +2483,7 @@ static int elf_core_dump(struct coredump_params *cprm) +@@ -2022,6 +2472,7 @@ static int elf_core_dump(struct coredump_params *cprm) phdr.p_align = ELF_EXEC_PAGESIZE; size += sizeof(phdr); @@ -43648,7 +43631,7 @@ index 1b52956..725eca7 100644 if (size > cprm->limit || !dump_write(cprm->file, &phdr, sizeof(phdr))) goto end_coredump; -@@ -2057,7 +2508,7 @@ static int elf_core_dump(struct coredump_params *cprm) +@@ -2046,7 +2497,7 @@ static int elf_core_dump(struct coredump_params *cprm) unsigned long addr; unsigned long end; @@ -43657,7 +43640,7 @@ index 1b52956..725eca7 100644 for (addr = vma->vm_start; addr < end; addr += PAGE_SIZE) { struct page *page; -@@ -2066,6 +2517,7 @@ static int elf_core_dump(struct coredump_params *cprm) +@@ -2055,6 +2506,7 @@ static int elf_core_dump(struct coredump_params *cprm) page = get_dump_page(addr); if (page) { void *kaddr = kmap(page); @@ -43665,7 +43648,7 @@ index 1b52956..725eca7 100644 stop = ((size += PAGE_SIZE) > cprm->limit) || !dump_write(cprm->file, kaddr, PAGE_SIZE); -@@ -2083,6 +2535,7 @@ static int elf_core_dump(struct coredump_params *cprm) +@@ -2072,6 +2524,7 @@ static int elf_core_dump(struct coredump_params *cprm) if (e_phnum == PN_XNUM) { size += sizeof(*shdr4extnum); @@ -43673,7 +43656,7 @@ index 1b52956..725eca7 100644 if (size > cprm->limit || !dump_write(cprm->file, shdr4extnum, sizeof(*shdr4extnum))) -@@ -2103,6 +2556,97 @@ out: +@@ -2092,6 +2545,97 @@ out: #endif /* CONFIG_ELF_CORE */ @@ -44653,37 +44636,10 @@ index 7e6c52d..94bc756 100644 /* * We'll have a dentry and an inode for diff --git a/fs/dcache.c b/fs/dcache.c -index 4123b92..5381f16 100644 +index 9560257..5381f16 100644 --- a/fs/dcache.c +++ b/fs/dcache.c -@@ -1132,6 +1132,8 @@ positive: - return 1; - - rename_retry: -+ if (locked) -+ goto again; - locked = 1; - write_seqlock(&rename_lock); - goto again; -@@ -1234,6 +1236,8 @@ out: - rename_retry: - if (found) - return found; -+ if (locked) -+ goto again; - locked = 1; - write_seqlock(&rename_lock); - goto again; -@@ -3031,6 +3035,8 @@ resume: - return; - - rename_retry: -+ if (locked) -+ goto again; - locked = 1; - write_seqlock(&rename_lock); - goto again; -@@ -3154,7 +3160,7 @@ void __init vfs_caches_init(unsigned long mempages) +@@ -3160,7 +3160,7 @@ void __init vfs_caches_init(unsigned long mempages) mempages -= reserve; names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0, @@ -49597,10 +49553,18 @@ index b1822dd..df622cb 100644 seq_putc(m, '\n'); diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c -index 06e1cc1..aa6fbbf 100644 +index 06e1cc1..a6eba7d 100644 --- a/fs/proc/proc_net.c +++ b/fs/proc/proc_net.c -@@ -105,6 +105,17 @@ static struct net *get_proc_task_net(struct inode *dir) +@@ -23,6 +23,7 @@ + #include <linux/nsproxy.h> + #include <net/net_namespace.h> + #include <linux/seq_file.h> ++#include <linux/grsecurity.h> + + #include "internal.h" + +@@ -105,6 +106,17 @@ static struct net *get_proc_task_net(struct inode *dir) struct task_struct *task; struct nsproxy *ns; struct net *net = NULL; diff --git a/3.5.5/4430_grsec-remove-localversion-grsec.patch b/3.5.6/4430_grsec-remove-localversion-grsec.patch index 31cf878..31cf878 100644 --- a/3.5.5/4430_grsec-remove-localversion-grsec.patch +++ b/3.5.6/4430_grsec-remove-localversion-grsec.patch diff --git a/3.5.5/4435_grsec-mute-warnings.patch b/3.5.6/4435_grsec-mute-warnings.patch index e1a7a3c..e1a7a3c 100644 --- a/3.5.5/4435_grsec-mute-warnings.patch +++ b/3.5.6/4435_grsec-mute-warnings.patch diff --git a/3.5.5/4440_grsec-remove-protected-paths.patch b/3.5.6/4440_grsec-remove-protected-paths.patch index 637934a..637934a 100644 --- a/3.5.5/4440_grsec-remove-protected-paths.patch +++ b/3.5.6/4440_grsec-remove-protected-paths.patch diff --git a/3.5.5/4450_grsec-kconfig-default-gids.patch b/3.5.6/4450_grsec-kconfig-default-gids.patch index eb5154a..eb5154a 100644 --- a/3.5.5/4450_grsec-kconfig-default-gids.patch +++ b/3.5.6/4450_grsec-kconfig-default-gids.patch diff --git a/3.5.5/4465_selinux-avc_audit-log-curr_ip.patch b/3.5.6/4465_selinux-avc_audit-log-curr_ip.patch index fd7ab67..fd7ab67 100644 --- a/3.5.5/4465_selinux-avc_audit-log-curr_ip.patch +++ b/3.5.6/4465_selinux-avc_audit-log-curr_ip.patch diff --git a/3.5.5/4470_disable-compat_vdso.patch b/3.5.6/4470_disable-compat_vdso.patch index 68af025..68af025 100644 --- a/3.5.5/4470_disable-compat_vdso.patch +++ b/3.5.6/4470_disable-compat_vdso.patch |