From 28cd9f2d37242e2930caf1458cb57bc722fe6849 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 3 May 2011 19:21:11 +0200 Subject: [PATCH 1/9] projects/Generic/linux: build UDF and ISO support as modules Signed-off-by: Stephan Raue --- projects/Generic/linux/linux.i386.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/Generic/linux/linux.i386.conf b/projects/Generic/linux/linux.i386.conf index dbdb1a76c3..2129f916bc 100644 --- a/projects/Generic/linux/linux.i386.conf +++ b/projects/Generic/linux/linux.i386.conf @@ -1,6 +1,6 @@ # # Automatically generated make config: don't edit -# Linux/i386 2.6.39-rc5-git2 Kernel Configuration +# Linux/i386 2.6.39-rc5-git4 Kernel Configuration # # CONFIG_64BIT is not set CONFIG_X86_32=y @@ -2577,10 +2577,10 @@ CONFIG_FUSE_FS=y # # CD-ROM/DVD Filesystems # -CONFIG_ISO9660_FS=y +CONFIG_ISO9660_FS=m CONFIG_JOLIET=y CONFIG_ZISOFS=y -CONFIG_UDF_FS=y +CONFIG_UDF_FS=m CONFIG_UDF_NLS=y # From 2604fd561fd23ebfdc1966be0caec4193b1a748c Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 3 May 2011 19:21:45 +0200 Subject: [PATCH 2/9] linux: update to linux-2.6.39-rc5-git7 Signed-off-by: Stephan Raue --- ....6.39-rc5-000-linux-2.6.39-rc5-git7.patch} | 3723 ++++++++++++++++- 1 file changed, 3720 insertions(+), 3 deletions(-) rename packages/linux/patches/{linux-2.6.39-rc5-000-linux-2.6.39-rc5-git4.patch => linux-2.6.39-rc5-000-linux-2.6.39-rc5-git7.patch} (55%) diff --git a/packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git4.patch b/packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git7.patch similarity index 55% rename from packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git4.patch rename to packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git7.patch index 2d659fbfa9..43ec39c059 100644 --- a/packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git4.patch +++ b/packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git7.patch @@ -385,8 +385,63 @@ index cb47e72..1e96ce6 100644 5. Apply iterative sensor S_FMT for sensor output window. +diff --git a/Documentation/workqueue.txt b/Documentation/workqueue.txt +index 01c513f..a0b577d 100644 +--- a/Documentation/workqueue.txt ++++ b/Documentation/workqueue.txt +@@ -12,6 +12,7 @@ CONTENTS + 4. Application Programming Interface (API) + 5. Example Execution Scenarios + 6. Guidelines ++7. Debugging + + + 1. Introduction +@@ -379,3 +380,42 @@ If q1 has WQ_CPU_INTENSIVE set, + * Unless work items are expected to consume a huge amount of CPU + cycles, using a bound wq is usually beneficial due to the increased + level of locality in wq operations and work item execution. ++ ++ ++7. Debugging ++ ++Because the work functions are executed by generic worker threads ++there are a few tricks needed to shed some light on misbehaving ++workqueue users. ++ ++Worker threads show up in the process list as: ++ ++root 5671 0.0 0.0 0 0 ? S 12:07 0:00 [kworker/0:1] ++root 5672 0.0 0.0 0 0 ? S 12:07 0:00 [kworker/1:2] ++root 5673 0.0 0.0 0 0 ? S 12:12 0:00 [kworker/0:0] ++root 5674 0.0 0.0 0 0 ? S 12:13 0:00 [kworker/1:0] ++ ++If kworkers are going crazy (using too much cpu), there are two types ++of possible problems: ++ ++ 1. Something beeing scheduled in rapid succession ++ 2. A single work item that consumes lots of cpu cycles ++ ++The first one can be tracked using tracing: ++ ++ $ echo workqueue:workqueue_queue_work > /sys/kernel/debug/tracing/set_event ++ $ cat /sys/kernel/debug/tracing/trace_pipe > out.txt ++ (wait a few secs) ++ ^C ++ ++If something is busy looping on work queueing, it would be dominating ++the output and the offender can be determined with the work item ++function. ++ ++For the second type of problems it should be possible to just check ++the stack trace of the offending worker thread. ++ ++ $ cat /proc/THE_OFFENDING_KWORKER/stack ++ ++The work item's function should be trivially visible in the stack ++trace. diff --git a/MAINTAINERS b/MAINTAINERS -index 1380312..2199ba1 100644 +index 1380312..16a5c5f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1032,12 +1032,13 @@ W: http://www.fluff.org/ben/linux/ @@ -413,6 +468,15 @@ index 1380312..2199ba1 100644 F: drivers/gpio/ F: include/linux/gpio* +@@ -6555,7 +6556,7 @@ S: Maintained + F: drivers/usb/host/uhci* + + USB "USBNET" DRIVER FRAMEWORK +-M: David Brownell ++M: Oliver Neukum + L: netdev@vger.kernel.org + W: http://www.linux-usb.org/usbnet + S: Maintained @@ -6921,6 +6922,18 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86. S: Maintained F: drivers/platform/x86 @@ -452,7 +516,7 @@ index 1380312..2199ba1 100644 P: Silicon Graphics Inc M: Alex Elder diff --git a/Makefile b/Makefile -index 5a7a2e4..6bc5e73 100644 +index 5a7a2e4..b6aeb66 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ @@ -460,10 +524,1456 @@ index 5a7a2e4..6bc5e73 100644 PATCHLEVEL = 6 SUBLEVEL = 39 -EXTRAVERSION = -rc5 -+EXTRAVERSION = -rc5-git4 ++EXTRAVERSION = -rc5-git7 NAME = Flesh-Eating Bats with Fangs # *DOCUMENTATION* +diff --git a/arch/arm/include/asm/kprobes.h b/arch/arm/include/asm/kprobes.h +index bb8a19b..e46bdd0 100644 +--- a/arch/arm/include/asm/kprobes.h ++++ b/arch/arm/include/asm/kprobes.h +@@ -39,10 +39,13 @@ typedef u32 kprobe_opcode_t; + struct kprobe; + typedef void (kprobe_insn_handler_t)(struct kprobe *, struct pt_regs *); + ++typedef unsigned long (kprobe_check_cc)(unsigned long); ++ + /* Architecture specific copy of original instruction. */ + struct arch_specific_insn { + kprobe_opcode_t *insn; + kprobe_insn_handler_t *insn_handler; ++ kprobe_check_cc *insn_check_cc; + }; + + struct prev_kprobe { +diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c +index 2389131..15eeff6 100644 +--- a/arch/arm/kernel/kprobes-decode.c ++++ b/arch/arm/kernel/kprobes-decode.c +@@ -34,9 +34,6 @@ + * + * *) If the PC is written to by the instruction, the + * instruction must be fully simulated in software. +- * If it is a conditional instruction, the handler +- * will use insn[0] to copy its condition code to +- * set r0 to 1 and insn[1] to "mov pc, lr" to return. + * + * *) Otherwise, a modified form of the instruction is + * directly executed. Its handler calls the +@@ -68,13 +65,17 @@ + + #define branch_displacement(insn) sign_extend(((insn) & 0xffffff) << 2, 25) + ++#define is_r15(insn, bitpos) (((insn) & (0xf << bitpos)) == (0xf << bitpos)) ++ ++/* ++ * Test if load/store instructions writeback the address register. ++ * if P (bit 24) == 0 or W (bit 21) == 1 ++ */ ++#define is_writeback(insn) ((insn ^ 0x01000000) & 0x01200000) ++ + #define PSR_fs (PSR_f|PSR_s) + + #define KPROBE_RETURN_INSTRUCTION 0xe1a0f00e /* mov pc, lr */ +-#define SET_R0_TRUE_INSTRUCTION 0xe3a00001 /* mov r0, #1 */ +- +-#define truecc_insn(insn) (((insn) & 0xf0000000) | \ +- (SET_R0_TRUE_INSTRUCTION & 0x0fffffff)) + + typedef long (insn_0arg_fn_t)(void); + typedef long (insn_1arg_fn_t)(long); +@@ -419,14 +420,10 @@ insnslot_llret_4arg_rwflags(long r0, long r1, long r2, long r3, long *cpsr, + + static void __kprobes simulate_bbl(struct kprobe *p, struct pt_regs *regs) + { +- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; + kprobe_opcode_t insn = p->opcode; + long iaddr = (long)p->addr; + int disp = branch_displacement(insn); + +- if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) +- return; +- + if (insn & (1 << 24)) + regs->ARM_lr = iaddr + 4; + +@@ -446,14 +443,10 @@ static void __kprobes simulate_blx1(struct kprobe *p, struct pt_regs *regs) + + static void __kprobes simulate_blx2bx(struct kprobe *p, struct pt_regs *regs) + { +- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; + kprobe_opcode_t insn = p->opcode; + int rm = insn & 0xf; + long rmv = regs->uregs[rm]; + +- if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) +- return; +- + if (insn & (1 << 5)) + regs->ARM_lr = (long)p->addr + 4; + +@@ -463,9 +456,16 @@ static void __kprobes simulate_blx2bx(struct kprobe *p, struct pt_regs *regs) + regs->ARM_cpsr |= PSR_T_BIT; + } + ++static void __kprobes simulate_mrs(struct kprobe *p, struct pt_regs *regs) ++{ ++ kprobe_opcode_t insn = p->opcode; ++ int rd = (insn >> 12) & 0xf; ++ unsigned long mask = 0xf8ff03df; /* Mask out execution state */ ++ regs->uregs[rd] = regs->ARM_cpsr & mask; ++} ++ + static void __kprobes simulate_ldm1stm1(struct kprobe *p, struct pt_regs *regs) + { +- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; + kprobe_opcode_t insn = p->opcode; + int rn = (insn >> 16) & 0xf; + int lbit = insn & (1 << 20); +@@ -476,9 +476,6 @@ static void __kprobes simulate_ldm1stm1(struct kprobe *p, struct pt_regs *regs) + int reg_bit_vector; + int reg_count; + +- if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) +- return; +- + reg_count = 0; + reg_bit_vector = insn & 0xffff; + while (reg_bit_vector) { +@@ -510,11 +507,6 @@ static void __kprobes simulate_ldm1stm1(struct kprobe *p, struct pt_regs *regs) + + static void __kprobes simulate_stm1_pc(struct kprobe *p, struct pt_regs *regs) + { +- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; +- +- if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) +- return; +- + regs->ARM_pc = (long)p->addr + str_pc_offset; + simulate_ldm1stm1(p, regs); + regs->ARM_pc = (long)p->addr + 4; +@@ -525,24 +517,16 @@ static void __kprobes simulate_mov_ipsp(struct kprobe *p, struct pt_regs *regs) + regs->uregs[12] = regs->uregs[13]; + } + +-static void __kprobes emulate_ldcstc(struct kprobe *p, struct pt_regs *regs) +-{ +- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; +- kprobe_opcode_t insn = p->opcode; +- int rn = (insn >> 16) & 0xf; +- long rnv = regs->uregs[rn]; +- +- /* Save Rn in case of writeback. */ +- regs->uregs[rn] = insnslot_1arg_rflags(rnv, regs->ARM_cpsr, i_fn); +-} +- + static void __kprobes emulate_ldrd(struct kprobe *p, struct pt_regs *regs) + { + insn_2arg_fn_t *i_fn = (insn_2arg_fn_t *)&p->ainsn.insn[0]; + kprobe_opcode_t insn = p->opcode; ++ long ppc = (long)p->addr + 8; + int rd = (insn >> 12) & 0xf; + int rn = (insn >> 16) & 0xf; + int rm = insn & 0xf; /* rm may be invalid, don't care. */ ++ long rmv = (rm == 15) ? ppc : regs->uregs[rm]; ++ long rnv = (rn == 15) ? ppc : regs->uregs[rn]; + + /* Not following the C calling convention here, so need asm(). */ + __asm__ __volatile__ ( +@@ -554,29 +538,36 @@ static void __kprobes emulate_ldrd(struct kprobe *p, struct pt_regs *regs) + "str r0, %[rn] \n\t" /* in case of writeback */ + "str r2, %[rd0] \n\t" + "str r3, %[rd1] \n\t" +- : [rn] "+m" (regs->uregs[rn]), ++ : [rn] "+m" (rnv), + [rd0] "=m" (regs->uregs[rd]), + [rd1] "=m" (regs->uregs[rd+1]) +- : [rm] "m" (regs->uregs[rm]), ++ : [rm] "m" (rmv), + [cpsr] "r" (regs->ARM_cpsr), + [i_fn] "r" (i_fn) + : "r0", "r1", "r2", "r3", "lr", "cc" + ); ++ if (is_writeback(insn)) ++ regs->uregs[rn] = rnv; + } + + static void __kprobes emulate_strd(struct kprobe *p, struct pt_regs *regs) + { + insn_4arg_fn_t *i_fn = (insn_4arg_fn_t *)&p->ainsn.insn[0]; + kprobe_opcode_t insn = p->opcode; ++ long ppc = (long)p->addr + 8; + int rd = (insn >> 12) & 0xf; + int rn = (insn >> 16) & 0xf; + int rm = insn & 0xf; +- long rnv = regs->uregs[rn]; +- long rmv = regs->uregs[rm]; /* rm/rmv may be invalid, don't care. */ ++ long rnv = (rn == 15) ? ppc : regs->uregs[rn]; ++ /* rm/rmv may be invalid, don't care. */ ++ long rmv = (rm == 15) ? ppc : regs->uregs[rm]; ++ long rnv_wb; + +- regs->uregs[rn] = insnslot_4arg_rflags(rnv, rmv, regs->uregs[rd], ++ rnv_wb = insnslot_4arg_rflags(rnv, rmv, regs->uregs[rd], + regs->uregs[rd+1], + regs->ARM_cpsr, i_fn); ++ if (is_writeback(insn)) ++ regs->uregs[rn] = rnv_wb; + } + + static void __kprobes emulate_ldr(struct kprobe *p, struct pt_regs *regs) +@@ -630,31 +621,6 @@ static void __kprobes emulate_str(struct kprobe *p, struct pt_regs *regs) + regs->uregs[rn] = rnv_wb; /* Save Rn in case of writeback. */ + } + +-static void __kprobes emulate_mrrc(struct kprobe *p, struct pt_regs *regs) +-{ +- insn_llret_0arg_fn_t *i_fn = (insn_llret_0arg_fn_t *)&p->ainsn.insn[0]; +- kprobe_opcode_t insn = p->opcode; +- union reg_pair fnr; +- int rd = (insn >> 12) & 0xf; +- int rn = (insn >> 16) & 0xf; +- +- fnr.dr = insnslot_llret_0arg_rflags(regs->ARM_cpsr, i_fn); +- regs->uregs[rn] = fnr.r0; +- regs->uregs[rd] = fnr.r1; +-} +- +-static void __kprobes emulate_mcrr(struct kprobe *p, struct pt_regs *regs) +-{ +- insn_2arg_fn_t *i_fn = (insn_2arg_fn_t *)&p->ainsn.insn[0]; +- kprobe_opcode_t insn = p->opcode; +- int rd = (insn >> 12) & 0xf; +- int rn = (insn >> 16) & 0xf; +- long rnv = regs->uregs[rn]; +- long rdv = regs->uregs[rd]; +- +- insnslot_2arg_rflags(rnv, rdv, regs->ARM_cpsr, i_fn); +-} +- + static void __kprobes emulate_sat(struct kprobe *p, struct pt_regs *regs) + { + insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; +@@ -688,32 +654,32 @@ static void __kprobes emulate_none(struct kprobe *p, struct pt_regs *regs) + insnslot_0arg_rflags(regs->ARM_cpsr, i_fn); + } + +-static void __kprobes emulate_rd12(struct kprobe *p, struct pt_regs *regs) ++static void __kprobes emulate_nop(struct kprobe *p, struct pt_regs *regs) + { +- insn_0arg_fn_t *i_fn = (insn_0arg_fn_t *)&p->ainsn.insn[0]; +- kprobe_opcode_t insn = p->opcode; +- int rd = (insn >> 12) & 0xf; +- +- regs->uregs[rd] = insnslot_0arg_rflags(regs->ARM_cpsr, i_fn); + } + +-static void __kprobes emulate_ird12(struct kprobe *p, struct pt_regs *regs) ++static void __kprobes ++emulate_rd12_modify(struct kprobe *p, struct pt_regs *regs) + { + insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; + kprobe_opcode_t insn = p->opcode; +- int ird = (insn >> 12) & 0xf; ++ int rd = (insn >> 12) & 0xf; ++ long rdv = regs->uregs[rd]; + +- insnslot_1arg_rflags(regs->uregs[ird], regs->ARM_cpsr, i_fn); ++ regs->uregs[rd] = insnslot_1arg_rflags(rdv, regs->ARM_cpsr, i_fn); + } + +-static void __kprobes emulate_rn16(struct kprobe *p, struct pt_regs *regs) ++static void __kprobes ++emulate_rd12rn0_modify(struct kprobe *p, struct pt_regs *regs) + { +- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; ++ insn_2arg_fn_t *i_fn = (insn_2arg_fn_t *)&p->ainsn.insn[0]; + kprobe_opcode_t insn = p->opcode; +- int rn = (insn >> 16) & 0xf; ++ int rd = (insn >> 12) & 0xf; ++ int rn = insn & 0xf; ++ long rdv = regs->uregs[rd]; + long rnv = regs->uregs[rn]; + +- insnslot_1arg_rflags(rnv, regs->ARM_cpsr, i_fn); ++ regs->uregs[rd] = insnslot_2arg_rflags(rdv, rnv, regs->ARM_cpsr, i_fn); + } + + static void __kprobes emulate_rd12rm0(struct kprobe *p, struct pt_regs *regs) +@@ -819,6 +785,17 @@ emulate_alu_imm_rwflags(struct kprobe *p, struct pt_regs *regs) + } + + static void __kprobes ++emulate_alu_tests_imm(struct kprobe *p, struct pt_regs *regs) ++{ ++ insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; ++ kprobe_opcode_t insn = p->opcode; ++ int rn = (insn >> 16) & 0xf; ++ long rnv = (rn == 15) ? (long)p->addr + 8 : regs->uregs[rn]; ++ ++ insnslot_1arg_rwflags(rnv, ®s->ARM_cpsr, i_fn); ++} ++ ++static void __kprobes + emulate_alu_rflags(struct kprobe *p, struct pt_regs *regs) + { + insn_3arg_fn_t *i_fn = (insn_3arg_fn_t *)&p->ainsn.insn[0]; +@@ -854,14 +831,34 @@ emulate_alu_rwflags(struct kprobe *p, struct pt_regs *regs) + insnslot_3arg_rwflags(rnv, rmv, rsv, ®s->ARM_cpsr, i_fn); + } + ++static void __kprobes ++emulate_alu_tests(struct kprobe *p, struct pt_regs *regs) ++{ ++ insn_3arg_fn_t *i_fn = (insn_3arg_fn_t *)&p->ainsn.insn[0]; ++ kprobe_opcode_t insn = p->opcode; ++ long ppc = (long)p->addr + 8; ++ int rn = (insn >> 16) & 0xf; ++ int rs = (insn >> 8) & 0xf; /* rs/rsv may be invalid, don't care. */ ++ int rm = insn & 0xf; ++ long rnv = (rn == 15) ? ppc : regs->uregs[rn]; ++ long rmv = (rm == 15) ? ppc : regs->uregs[rm]; ++ long rsv = regs->uregs[rs]; ++ ++ insnslot_3arg_rwflags(rnv, rmv, rsv, ®s->ARM_cpsr, i_fn); ++} ++ + static enum kprobe_insn __kprobes + prep_emulate_ldr_str(kprobe_opcode_t insn, struct arch_specific_insn *asi) + { +- int ibit = (insn & (1 << 26)) ? 25 : 22; ++ int not_imm = (insn & (1 << 26)) ? (insn & (1 << 25)) ++ : (~insn & (1 << 22)); ++ ++ if (is_writeback(insn) && is_r15(insn, 16)) ++ return INSN_REJECTED; /* Writeback to PC */ + + insn &= 0xfff00fff; + insn |= 0x00001000; /* Rn = r0, Rd = r1 */ +- if (insn & (1 << ibit)) { ++ if (not_imm) { + insn &= ~0xf; + insn |= 2; /* Rm = r2 */ + } +@@ -871,20 +868,40 @@ prep_emulate_ldr_str(kprobe_opcode_t insn, struct arch_specific_insn *asi) + } + + static enum kprobe_insn __kprobes +-prep_emulate_rd12rm0(kprobe_opcode_t insn, struct arch_specific_insn *asi) ++prep_emulate_rd12_modify(kprobe_opcode_t insn, struct arch_specific_insn *asi) + { +- insn &= 0xffff0ff0; /* Rd = r0, Rm = r0 */ ++ if (is_r15(insn, 12)) ++ return INSN_REJECTED; /* Rd is PC */ ++ ++ insn &= 0xffff0fff; /* Rd = r0 */ + asi->insn[0] = insn; +- asi->insn_handler = emulate_rd12rm0; ++ asi->insn_handler = emulate_rd12_modify; + return INSN_GOOD; + } + + static enum kprobe_insn __kprobes +-prep_emulate_rd12(kprobe_opcode_t insn, struct arch_specific_insn *asi) ++prep_emulate_rd12rn0_modify(kprobe_opcode_t insn, ++ struct arch_specific_insn *asi) + { +- insn &= 0xffff0fff; /* Rd = r0 */ ++ if (is_r15(insn, 12)) ++ return INSN_REJECTED; /* Rd is PC */ ++ ++ insn &= 0xffff0ff0; /* Rd = r0 */ ++ insn |= 0x00000001; /* Rn = r1 */ ++ asi->insn[0] = insn; ++ asi->insn_handler = emulate_rd12rn0_modify; ++ return INSN_GOOD; ++} ++ ++static enum kprobe_insn __kprobes ++prep_emulate_rd12rm0(kprobe_opcode_t insn, struct arch_specific_insn *asi) ++{ ++ if (is_r15(insn, 12)) ++ return INSN_REJECTED; /* Rd is PC */ ++ ++ insn &= 0xffff0ff0; /* Rd = r0, Rm = r0 */ + asi->insn[0] = insn; +- asi->insn_handler = emulate_rd12; ++ asi->insn_handler = emulate_rd12rm0; + return INSN_GOOD; + } + +@@ -892,6 +909,9 @@ static enum kprobe_insn __kprobes + prep_emulate_rd12rn16rm0_wflags(kprobe_opcode_t insn, + struct arch_specific_insn *asi) + { ++ if (is_r15(insn, 12)) ++ return INSN_REJECTED; /* Rd is PC */ ++ + insn &= 0xfff00ff0; /* Rd = r0, Rn = r0 */ + insn |= 0x00000001; /* Rm = r1 */ + asi->insn[0] = insn; +@@ -903,6 +923,9 @@ static enum kprobe_insn __kprobes + prep_emulate_rd16rs8rm0_wflags(kprobe_opcode_t insn, + struct arch_specific_insn *asi) + { ++ if (is_r15(insn, 16)) ++ return INSN_REJECTED; /* Rd is PC */ ++ + insn &= 0xfff0f0f0; /* Rd = r0, Rs = r0 */ + insn |= 0x00000001; /* Rm = r1 */ + asi->insn[0] = insn; +@@ -914,6 +937,9 @@ static enum kprobe_insn __kprobes + prep_emulate_rd16rn12rs8rm0_wflags(kprobe_opcode_t insn, + struct arch_specific_insn *asi) + { ++ if (is_r15(insn, 16)) ++ return INSN_REJECTED; /* Rd is PC */ ++ + insn &= 0xfff000f0; /* Rd = r0, Rn = r0 */ + insn |= 0x00000102; /* Rs = r1, Rm = r2 */ + asi->insn[0] = insn; +@@ -925,6 +951,9 @@ static enum kprobe_insn __kprobes + prep_emulate_rdhi16rdlo12rs8rm0_wflags(kprobe_opcode_t insn, + struct arch_specific_insn *asi) + { ++ if (is_r15(insn, 16) || is_r15(insn, 12)) ++ return INSN_REJECTED; /* RdHi or RdLo is PC */ ++ + insn &= 0xfff000f0; /* RdHi = r0, RdLo = r1 */ + insn |= 0x00001203; /* Rs = r2, Rm = r3 */ + asi->insn[0] = insn; +@@ -945,20 +974,13 @@ prep_emulate_rdhi16rdlo12rs8rm0_wflags(kprobe_opcode_t insn, + static enum kprobe_insn __kprobes + space_1111(kprobe_opcode_t insn, struct arch_specific_insn *asi) + { +- /* CPS mmod == 1 : 1111 0001 0000 xx10 xxxx xxxx xx0x xxxx */ +- /* RFE : 1111 100x x0x1 xxxx xxxx 1010 xxxx xxxx */ +- /* SRS : 1111 100x x1x0 1101 xxxx 0101 xxxx xxxx */ +- if ((insn & 0xfff30020) == 0xf1020000 || +- (insn & 0xfe500f00) == 0xf8100a00 || +- (insn & 0xfe5f0f00) == 0xf84d0500) +- return INSN_REJECTED; +- +- /* PLD : 1111 01x1 x101 xxxx xxxx xxxx xxxx xxxx : */ +- if ((insn & 0xfd700000) == 0xf4500000) { +- insn &= 0xfff0ffff; /* Rn = r0 */ +- asi->insn[0] = insn; +- asi->insn_handler = emulate_rn16; +- return INSN_GOOD; ++ /* memory hint : 1111 0100 x001 xxxx xxxx xxxx xxxx xxxx : */ ++ /* PLDI : 1111 0100 x101 xxxx xxxx xxxx xxxx xxxx : */ ++ /* PLDW : 1111 0101 x001 xxxx xxxx xxxx xxxx xxxx : */ ++ /* PLD : 1111 0101 x101 xxxx xxxx xxxx xxxx xxxx : */ ++ if ((insn & 0xfe300000) == 0xf4100000) { ++ asi->insn_handler = emulate_nop; ++ return INSN_GOOD_NO_SLOT; + } + + /* BLX(1) : 1111 101x xxxx xxxx xxxx xxxx xxxx xxxx : */ +@@ -967,41 +989,22 @@ space_1111(kprobe_opcode_t insn, struct arch_specific_insn *asi) + return INSN_GOOD_NO_SLOT; + } + +- /* SETEND : 1111 0001 0000 0001 xxxx xxxx 0000 xxxx */ +- /* CDP2 : 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ +- if ((insn & 0xffff00f0) == 0xf1010000 || +- (insn & 0xff000010) == 0xfe000000) { +- asi->insn[0] = insn; +- asi->insn_handler = emulate_none; +- return INSN_GOOD; +- } ++ /* CPS : 1111 0001 0000 xxx0 xxxx xxxx xx0x xxxx */ ++ /* SETEND: 1111 0001 0000 0001 xxxx xxxx 0000 xxxx */ + ++ /* SRS : 1111 100x x1x0 xxxx xxxx xxxx xxxx xxxx */ ++ /* RFE : 1111 100x x0x1 xxxx xxxx xxxx xxxx xxxx */ ++ ++ /* Coprocessor instructions... */ + /* MCRR2 : 1111 1100 0100 xxxx xxxx xxxx xxxx xxxx : (Rd != Rn) */ + /* MRRC2 : 1111 1100 0101 xxxx xxxx xxxx xxxx xxxx : (Rd != Rn) */ +- if ((insn & 0xffe00000) == 0xfc400000) { +- insn &= 0xfff00fff; /* Rn = r0 */ +- insn |= 0x00001000; /* Rd = r1 */ +- asi->insn[0] = insn; +- asi->insn_handler = +- (insn & (1 << 20)) ? emulate_mrrc : emulate_mcrr; +- return INSN_GOOD; +- } ++ /* LDC2 : 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ ++ /* STC2 : 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ ++ /* CDP2 : 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ ++ /* MCR2 : 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ ++ /* MRC2 : 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ + +- /* LDC2 : 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ +- /* STC2 : 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ +- if ((insn & 0xfe000000) == 0xfc000000) { +- insn &= 0xfff0ffff; /* Rn = r0 */ +- asi->insn[0] = insn; +- asi->insn_handler = emulate_ldcstc; +- return INSN_GOOD; +- } +- +- /* MCR2 : 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ +- /* MRC2 : 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ +- insn &= 0xffff0fff; /* Rd = r0 */ +- asi->insn[0] = insn; +- asi->insn_handler = (insn & (1 << 20)) ? emulate_rd12 : emulate_ird12; +- return INSN_GOOD; ++ return INSN_REJECTED; + } + + static enum kprobe_insn __kprobes +@@ -1010,19 +1013,18 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + /* cccc 0001 0xx0 xxxx xxxx xxxx xxxx xxx0 xxxx */ + if ((insn & 0x0f900010) == 0x01000000) { + +- /* BXJ : cccc 0001 0010 xxxx xxxx xxxx 0010 xxxx */ +- /* MSR : cccc 0001 0x10 xxxx xxxx xxxx 0000 xxxx */ +- if ((insn & 0x0ff000f0) == 0x01200020 || +- (insn & 0x0fb000f0) == 0x01200000) +- return INSN_REJECTED; +- +- /* MRS : cccc 0001 0x00 xxxx xxxx xxxx 0000 xxxx */ +- if ((insn & 0x0fb00010) == 0x01000000) +- return prep_emulate_rd12(insn, asi); ++ /* MRS cpsr : cccc 0001 0000 xxxx xxxx xxxx 0000 xxxx */ ++ if ((insn & 0x0ff000f0) == 0x01000000) { ++ if (is_r15(insn, 12)) ++ return INSN_REJECTED; /* Rd is PC */ ++ asi->insn_handler = simulate_mrs; ++ return INSN_GOOD_NO_SLOT; ++ } + + /* SMLALxy : cccc 0001 0100 xxxx xxxx xxxx 1xx0 xxxx */ + if ((insn & 0x0ff00090) == 0x01400080) +- return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, asi); ++ return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, ++ asi); + + /* SMULWy : cccc 0001 0010 xxxx xxxx xxxx 1x10 xxxx */ + /* SMULxy : cccc 0001 0110 xxxx xxxx xxxx 1xx0 xxxx */ +@@ -1031,24 +1033,29 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + return prep_emulate_rd16rs8rm0_wflags(insn, asi); + + /* SMLAxy : cccc 0001 0000 xxxx xxxx xxxx 1xx0 xxxx : Q */ +- /* SMLAWy : cccc 0001 0010 xxxx xxxx xxxx 0x00 xxxx : Q */ +- return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); ++ /* SMLAWy : cccc 0001 0010 xxxx xxxx xxxx 1x00 xxxx : Q */ ++ if ((insn & 0x0ff00090) == 0x01000080 || ++ (insn & 0x0ff000b0) == 0x01200080) ++ return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); ++ ++ /* BXJ : cccc 0001 0010 xxxx xxxx xxxx 0010 xxxx */ ++ /* MSR : cccc 0001 0x10 xxxx xxxx xxxx 0000 xxxx */ ++ /* MRS spsr : cccc 0001 0100 xxxx xxxx xxxx 0000 xxxx */ + ++ /* Other instruction encodings aren't yet defined */ ++ return INSN_REJECTED; + } + + /* cccc 0001 0xx0 xxxx xxxx xxxx xxxx 0xx1 xxxx */ + else if ((insn & 0x0f900090) == 0x01000010) { + +- /* BKPT : 1110 0001 0010 xxxx xxxx xxxx 0111 xxxx */ +- if ((insn & 0xfff000f0) == 0xe1200070) +- return INSN_REJECTED; +- + /* BLX(2) : cccc 0001 0010 xxxx xxxx xxxx 0011 xxxx */ + /* BX : cccc 0001 0010 xxxx xxxx xxxx 0001 xxxx */ + if ((insn & 0x0ff000d0) == 0x01200010) { +- asi->insn[0] = truecc_insn(insn); ++ if ((insn & 0x0ff000ff) == 0x0120003f) ++ return INSN_REJECTED; /* BLX pc */ + asi->insn_handler = simulate_blx2bx; +- return INSN_GOOD; ++ return INSN_GOOD_NO_SLOT; + } + + /* CLZ : cccc 0001 0110 xxxx xxxx xxxx 0001 xxxx */ +@@ -1059,17 +1066,27 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + /* QSUB : cccc 0001 0010 xxxx xxxx xxxx 0101 xxxx :Q */ + /* QDADD : cccc 0001 0100 xxxx xxxx xxxx 0101 xxxx :Q */ + /* QDSUB : cccc 0001 0110 xxxx xxxx xxxx 0101 xxxx :Q */ +- return prep_emulate_rd12rn16rm0_wflags(insn, asi); ++ if ((insn & 0x0f9000f0) == 0x01000050) ++ return prep_emulate_rd12rn16rm0_wflags(insn, asi); ++ ++ /* BKPT : 1110 0001 0010 xxxx xxxx xxxx 0111 xxxx */ ++ /* SMC : cccc 0001 0110 xxxx xxxx xxxx 0111 xxxx */ ++ ++ /* Other instruction encodings aren't yet defined */ ++ return INSN_REJECTED; + } + + /* cccc 0000 xxxx xxxx xxxx xxxx xxxx 1001 xxxx */ +- else if ((insn & 0x0f000090) == 0x00000090) { ++ else if ((insn & 0x0f0000f0) == 0x00000090) { + + /* MUL : cccc 0000 0000 xxxx xxxx xxxx 1001 xxxx : */ + /* MULS : cccc 0000 0001 xxxx xxxx xxxx 1001 xxxx :cc */ + /* MLA : cccc 0000 0010 xxxx xxxx xxxx 1001 xxxx : */ + /* MLAS : cccc 0000 0011 xxxx xxxx xxxx 1001 xxxx :cc */ + /* UMAAL : cccc 0000 0100 xxxx xxxx xxxx 1001 xxxx : */ ++ /* undef : cccc 0000 0101 xxxx xxxx xxxx 1001 xxxx : */ ++ /* MLS : cccc 0000 0110 xxxx xxxx xxxx 1001 xxxx : */ ++ /* undef : cccc 0000 0111 xxxx xxxx xxxx 1001 xxxx : */ + /* UMULL : cccc 0000 1000 xxxx xxxx xxxx 1001 xxxx : */ + /* UMULLS : cccc 0000 1001 xxxx xxxx xxxx 1001 xxxx :cc */ + /* UMLAL : cccc 0000 1010 xxxx xxxx xxxx 1001 xxxx : */ +@@ -1078,13 +1095,15 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + /* SMULLS : cccc 0000 1101 xxxx xxxx xxxx 1001 xxxx :cc */ + /* SMLAL : cccc 0000 1110 xxxx xxxx xxxx 1001 xxxx : */ + /* SMLALS : cccc 0000 1111 xxxx xxxx xxxx 1001 xxxx :cc */ +- if ((insn & 0x0fe000f0) == 0x00000090) { +- return prep_emulate_rd16rs8rm0_wflags(insn, asi); +- } else if ((insn & 0x0fe000f0) == 0x00200090) { +- return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); +- } else { +- return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, asi); +- } ++ if ((insn & 0x00d00000) == 0x00500000) ++ return INSN_REJECTED; ++ else if ((insn & 0x00e00000) == 0x00000000) ++ return prep_emulate_rd16rs8rm0_wflags(insn, asi); ++ else if ((insn & 0x00a00000) == 0x00200000) ++ return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); ++ else ++ return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, ++ asi); + } + + /* cccc 000x xxxx xxxx xxxx xxxx xxxx 1xx1 xxxx */ +@@ -1092,23 +1111,45 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + + /* SWP : cccc 0001 0000 xxxx xxxx xxxx 1001 xxxx */ + /* SWPB : cccc 0001 0100 xxxx xxxx xxxx 1001 xxxx */ +- /* LDRD : cccc 000x xxx0 xxxx xxxx xxxx 1101 xxxx */ +- /* STRD : cccc 000x xxx0 xxxx xxxx xxxx 1111 xxxx */ ++ /* ??? : cccc 0001 0x01 xxxx xxxx xxxx 1001 xxxx */ ++ /* ??? : cccc 0001 0x10 xxxx xxxx xxxx 1001 xxxx */ ++ /* ??? : cccc 0001 0x11 xxxx xxxx xxxx 1001 xxxx */ + /* STREX : cccc 0001 1000 xxxx xxxx xxxx 1001 xxxx */ + /* LDREX : cccc 0001 1001 xxxx xxxx xxxx 1001 xxxx */ ++ /* STREXD: cccc 0001 1010 xxxx xxxx xxxx 1001 xxxx */ ++ /* LDREXD: cccc 0001 1011 xxxx xxxx xxxx 1001 xxxx */ ++ /* STREXB: cccc 0001 1100 xxxx xxxx xxxx 1001 xxxx */ ++ /* LDREXB: cccc 0001 1101 xxxx xxxx xxxx 1001 xxxx */ ++ /* STREXH: cccc 0001 1110 xxxx xxxx xxxx 1001 xxxx */ ++ /* LDREXH: cccc 0001 1111 xxxx xxxx xxxx 1001 xxxx */ ++ ++ /* LDRD : cccc 000x xxx0 xxxx xxxx xxxx 1101 xxxx */ ++ /* STRD : cccc 000x xxx0 xxxx xxxx xxxx 1111 xxxx */ + /* LDRH : cccc 000x xxx1 xxxx xxxx xxxx 1011 xxxx */ + /* STRH : cccc 000x xxx0 xxxx xxxx xxxx 1011 xxxx */ + /* LDRSB : cccc 000x xxx1 xxxx xxxx xxxx 1101 xxxx */ + /* LDRSH : cccc 000x xxx1 xxxx xxxx xxxx 1111 xxxx */ +- if ((insn & 0x0fb000f0) == 0x01000090) { +- /* SWP/SWPB */ +- return prep_emulate_rd12rn16rm0_wflags(insn, asi); ++ if ((insn & 0x0f0000f0) == 0x01000090) { ++ if ((insn & 0x0fb000f0) == 0x01000090) { ++ /* SWP/SWPB */ ++ return prep_emulate_rd12rn16rm0_wflags(insn, ++ asi); ++ } else { ++ /* STREX/LDREX variants and unallocaed space */ ++ return INSN_REJECTED; ++ } ++ + } else if ((insn & 0x0e1000d0) == 0x00000d0) { + /* STRD/LDRD */ ++ if ((insn & 0x0000e000) == 0x0000e000) ++ return INSN_REJECTED; /* Rd is LR or PC */ ++ if (is_writeback(insn) && is_r15(insn, 16)) ++ return INSN_REJECTED; /* Writeback to PC */ ++ + insn &= 0xfff00fff; + insn |= 0x00002000; /* Rn = r0, Rd = r2 */ +- if (insn & (1 << 22)) { +- /* I bit */ ++ if (!(insn & (1 << 22))) { ++ /* Register index */ + insn &= ~0xf; + insn |= 1; /* Rm = r1 */ + } +@@ -1118,6 +1159,9 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + return INSN_GOOD; + } + ++ /* LDRH/STRH/LDRSB/LDRSH */ ++ if (is_r15(insn, 12)) ++ return INSN_REJECTED; /* Rd is PC */ + return prep_emulate_ldr_str(insn, asi); + } + +@@ -1125,7 +1169,7 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + + /* + * ALU op with S bit and Rd == 15 : +- * cccc 000x xxx1 xxxx 1111 xxxx xxxx xxxx ++ * cccc 000x xxx1 xxxx 1111 xxxx xxxx xxxx + */ + if ((insn & 0x0e10f000) == 0x0010f000) + return INSN_REJECTED; +@@ -1154,22 +1198,61 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + insn |= 0x00000200; /* Rs = r2 */ + } + asi->insn[0] = insn; +- asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ ++ ++ if ((insn & 0x0f900000) == 0x01100000) { ++ /* ++ * TST : cccc 0001 0001 xxxx xxxx xxxx xxxx xxxx ++ * TEQ : cccc 0001 0011 xxxx xxxx xxxx xxxx xxxx ++ * CMP : cccc 0001 0101 xxxx xxxx xxxx xxxx xxxx ++ * CMN : cccc 0001 0111 xxxx xxxx xxxx xxxx xxxx ++ */ ++ asi->insn_handler = emulate_alu_tests; ++ } else { ++ /* ALU ops which write to Rd */ ++ asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ + emulate_alu_rwflags : emulate_alu_rflags; ++ } + return INSN_GOOD; + } + + static enum kprobe_insn __kprobes + space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + { ++ /* MOVW : cccc 0011 0000 xxxx xxxx xxxx xxxx xxxx */ ++ /* MOVT : cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx */ ++ if ((insn & 0x0fb00000) == 0x03000000) ++ return prep_emulate_rd12_modify(insn, asi); ++ ++ /* hints : cccc 0011 0010 0000 xxxx xxxx xxxx xxxx */ ++ if ((insn & 0x0fff0000) == 0x03200000) { ++ unsigned op2 = insn & 0x000000ff; ++ if (op2 == 0x01 || op2 == 0x04) { ++ /* YIELD : cccc 0011 0010 0000 xxxx xxxx 0000 0001 */ ++ /* SEV : cccc 0011 0010 0000 xxxx xxxx 0000 0100 */ ++ asi->insn[0] = insn; ++ asi->insn_handler = emulate_none; ++ return INSN_GOOD; ++ } else if (op2 <= 0x03) { ++ /* NOP : cccc 0011 0010 0000 xxxx xxxx 0000 0000 */ ++ /* WFE : cccc 0011 0010 0000 xxxx xxxx 0000 0010 */ ++ /* WFI : cccc 0011 0010 0000 xxxx xxxx 0000 0011 */ ++ /* ++ * We make WFE and WFI true NOPs to avoid stalls due ++ * to missing events whilst processing the probe. ++ */ ++ asi->insn_handler = emulate_nop; ++ return INSN_GOOD_NO_SLOT; ++ } ++ /* For DBG and unallocated hints it's safest to reject them */ ++ return INSN_REJECTED; ++ } ++ + /* + * MSR : cccc 0011 0x10 xxxx xxxx xxxx xxxx xxxx +- * Undef : cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx + * ALU op with S bit and Rd == 15 : + * cccc 001x xxx1 xxxx 1111 xxxx xxxx xxxx + */ + if ((insn & 0x0fb00000) == 0x03200000 || /* MSR */ +- (insn & 0x0ff00000) == 0x03400000 || /* Undef */ + (insn & 0x0e10f000) == 0x0210f000) /* ALU s-bit, R15 */ + return INSN_REJECTED; + +@@ -1180,10 +1263,22 @@ space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + * *S (bit 20) updates condition codes + * ADC/SBC/RSC reads the C flag + */ +- insn &= 0xffff0fff; /* Rd = r0 */ ++ insn &= 0xfff00fff; /* Rn = r0 and Rd = r0 */ + asi->insn[0] = insn; +- asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ ++ ++ if ((insn & 0x0f900000) == 0x03100000) { ++ /* ++ * TST : cccc 0011 0001 xxxx xxxx xxxx xxxx xxxx ++ * TEQ : cccc 0011 0011 xxxx xxxx xxxx xxxx xxxx ++ * CMP : cccc 0011 0101 xxxx xxxx xxxx xxxx xxxx ++ * CMN : cccc 0011 0111 xxxx xxxx xxxx xxxx xxxx ++ */ ++ asi->insn_handler = emulate_alu_tests_imm; ++ } else { ++ /* ALU ops which write to Rd */ ++ asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ + emulate_alu_imm_rwflags : emulate_alu_imm_rflags; ++ } + return INSN_GOOD; + } + +@@ -1192,6 +1287,8 @@ space_cccc_0110__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) + { + /* SEL : cccc 0110 1000 xxxx xxxx xxxx 1011 xxxx GE: !!! */ + if ((insn & 0x0ff000f0) == 0x068000b0) { ++ if (is_r15(insn, 12)) ++ return INSN_REJECTED; /* Rd is PC */ + insn &= 0xfff00ff0; /* Rd = r0, Rn = r0 */ + insn |= 0x00000001; /* Rm = r1 */ + asi->insn[0] = insn; +@@ -1205,6 +1302,8 @@ space_cccc_0110__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) + /* USAT16 : cccc 0110 1110 xxxx xxxx xxxx 0011 xxxx :Q */ + if ((insn & 0x0fa00030) == 0x06a00010 || + (insn & 0x0fb000f0) == 0x06a00030) { ++ if (is_r15(insn, 12)) ++ return INSN_REJECTED; /* Rd is PC */ + insn &= 0xffff0ff0; /* Rd = r0, Rm = r0 */ + asi->insn[0] = insn; + asi->insn_handler = emulate_sat; +@@ -1213,57 +1312,101 @@ space_cccc_0110__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) + + /* REV : cccc 0110 1011 xxxx xxxx xxxx 0011 xxxx */ + /* REV16 : cccc 0110 1011 xxxx xxxx xxxx 1011 xxxx */ ++ /* RBIT : cccc 0110 1111 xxxx xxxx xxxx 0011 xxxx */ + /* REVSH : cccc 0110 1111 xxxx xxxx xxxx 1011 xxxx */ + if ((insn & 0x0ff00070) == 0x06b00030 || +- (insn & 0x0ff000f0) == 0x06f000b0) ++ (insn & 0x0ff00070) == 0x06f00030) + return prep_emulate_rd12rm0(insn, asi); + ++ /* ??? : cccc 0110 0000 xxxx xxxx xxxx xxx1 xxxx : */ + /* SADD16 : cccc 0110 0001 xxxx xxxx xxxx 0001 xxxx :GE */ + /* SADDSUBX : cccc 0110 0001 xxxx xxxx xxxx 0011 xxxx :GE */ + /* SSUBADDX : cccc 0110 0001 xxxx xxxx xxxx 0101 xxxx :GE */ + /* SSUB16 : cccc 0110 0001 xxxx xxxx xxxx 0111 xxxx :GE */ + /* SADD8 : cccc 0110 0001 xxxx xxxx xxxx 1001 xxxx :GE */ ++ /* ??? : cccc 0110 0001 xxxx xxxx xxxx 1011 xxxx : */ ++ /* ??? : cccc 0110 0001 xxxx xxxx xxxx 1101 xxxx : */ + /* SSUB8 : cccc 0110 0001 xxxx xxxx xxxx 1111 xxxx :GE */ + /* QADD16 : cccc 0110 0010 xxxx xxxx xxxx 0001 xxxx : */ + /* QADDSUBX : cccc 0110 0010 xxxx xxxx xxxx 0011 xxxx : */ + /* QSUBADDX : cccc 0110 0010 xxxx xxxx xxxx 0101 xxxx : */ + /* QSUB16 : cccc 0110 0010 xxxx xxxx xxxx 0111 xxxx : */ + /* QADD8 : cccc 0110 0010 xxxx xxxx xxxx 1001 xxxx : */ ++ /* ??? : cccc 0110 0010 xxxx xxxx xxxx 1011 xxxx : */ ++ /* ??? : cccc 0110 0010 xxxx xxxx xxxx 1101 xxxx : */ + /* QSUB8 : cccc 0110 0010 xxxx xxxx xxxx 1111 xxxx : */ + /* SHADD16 : cccc 0110 0011 xxxx xxxx xxxx 0001 xxxx : */ + /* SHADDSUBX : cccc 0110 0011 xxxx xxxx xxxx 0011 xxxx : */ + /* SHSUBADDX : cccc 0110 0011 xxxx xxxx xxxx 0101 xxxx : */ + /* SHSUB16 : cccc 0110 0011 xxxx xxxx xxxx 0111 xxxx : */ + /* SHADD8 : cccc 0110 0011 xxxx xxxx xxxx 1001 xxxx : */ ++ /* ??? : cccc 0110 0011 xxxx xxxx xxxx 1011 xxxx : */ ++ /* ??? : cccc 0110 0011 xxxx xxxx xxxx 1101 xxxx : */ + /* SHSUB8 : cccc 0110 0011 xxxx xxxx xxxx 1111 xxxx : */ ++ /* ??? : cccc 0110 0100 xxxx xxxx xxxx xxx1 xxxx : */ + /* UADD16 : cccc 0110 0101 xxxx xxxx xxxx 0001 xxxx :GE */ + /* UADDSUBX : cccc 0110 0101 xxxx xxxx xxxx 0011 xxxx :GE */ + /* USUBADDX : cccc 0110 0101 xxxx xxxx xxxx 0101 xxxx :GE */ + /* USUB16 : cccc 0110 0101 xxxx xxxx xxxx 0111 xxxx :GE */ + /* UADD8 : cccc 0110 0101 xxxx xxxx xxxx 1001 xxxx :GE */ ++ /* ??? : cccc 0110 0101 xxxx xxxx xxxx 1011 xxxx : */ ++ /* ??? : cccc 0110 0101 xxxx xxxx xxxx 1101 xxxx : */ + /* USUB8 : cccc 0110 0101 xxxx xxxx xxxx 1111 xxxx :GE */ + /* UQADD16 : cccc 0110 0110 xxxx xxxx xxxx 0001 xxxx : */ + /* UQADDSUBX : cccc 0110 0110 xxxx xxxx xxxx 0011 xxxx : */ + /* UQSUBADDX : cccc 0110 0110 xxxx xxxx xxxx 0101 xxxx : */ + /* UQSUB16 : cccc 0110 0110 xxxx xxxx xxxx 0111 xxxx : */ + /* UQADD8 : cccc 0110 0110 xxxx xxxx xxxx 1001 xxxx : */ ++ /* ??? : cccc 0110 0110 xxxx xxxx xxxx 1011 xxxx : */ ++ /* ??? : cccc 0110 0110 xxxx xxxx xxxx 1101 xxxx : */ + /* UQSUB8 : cccc 0110 0110 xxxx xxxx xxxx 1111 xxxx : */ + /* UHADD16 : cccc 0110 0111 xxxx xxxx xxxx 0001 xxxx : */ + /* UHADDSUBX : cccc 0110 0111 xxxx xxxx xxxx 0011 xxxx : */ + /* UHSUBADDX : cccc 0110 0111 xxxx xxxx xxxx 0101 xxxx : */ + /* UHSUB16 : cccc 0110 0111 xxxx xxxx xxxx 0111 xxxx : */ + /* UHADD8 : cccc 0110 0111 xxxx xxxx xxxx 1001 xxxx : */ ++ /* ??? : cccc 0110 0111 xxxx xxxx xxxx 1011 xxxx : */ ++ /* ??? : cccc 0110 0111 xxxx xxxx xxxx 1101 xxxx : */ + /* UHSUB8 : cccc 0110 0111 xxxx xxxx xxxx 1111 xxxx : */ ++ if ((insn & 0x0f800010) == 0x06000010) { ++ if ((insn & 0x00300000) == 0x00000000 || ++ (insn & 0x000000e0) == 0x000000a0 || ++ (insn & 0x000000e0) == 0x000000c0) ++ return INSN_REJECTED; /* Unallocated space */ ++ return prep_emulate_rd12rn16rm0_wflags(insn, asi); ++ } ++ + /* PKHBT : cccc 0110 1000 xxxx xxxx xxxx x001 xxxx : */ + /* PKHTB : cccc 0110 1000 xxxx xxxx xxxx x101 xxxx : */ ++ if ((insn & 0x0ff00030) == 0x06800010) ++ return prep_emulate_rd12rn16rm0_wflags(insn, asi); ++ + /* SXTAB16 : cccc 0110 1000 xxxx xxxx xxxx 0111 xxxx : */ +- /* SXTB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */ ++ /* SXTB16 : cccc 0110 1000 1111 xxxx xxxx 0111 xxxx : */ ++ /* ??? : cccc 0110 1001 xxxx xxxx xxxx 0111 xxxx : */ + /* SXTAB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */ ++ /* SXTB : cccc 0110 1010 1111 xxxx xxxx 0111 xxxx : */ + /* SXTAH : cccc 0110 1011 xxxx xxxx xxxx 0111 xxxx : */ ++ /* SXTH : cccc 0110 1011 1111 xxxx xxxx 0111 xxxx : */ + /* UXTAB16 : cccc 0110 1100 xxxx xxxx xxxx 0111 xxxx : */ ++ /* UXTB16 : cccc 0110 1100 1111 xxxx xxxx 0111 xxxx : */ ++ /* ??? : cccc 0110 1101 xxxx xxxx xxxx 0111 xxxx : */ + /* UXTAB : cccc 0110 1110 xxxx xxxx xxxx 0111 xxxx : */ ++ /* UXTB : cccc 0110 1110 1111 xxxx xxxx 0111 xxxx : */ + /* UXTAH : cccc 0110 1111 xxxx xxxx xxxx 0111 xxxx : */ +- return prep_emulate_rd12rn16rm0_wflags(insn, asi); ++ /* UXTH : cccc 0110 1111 1111 xxxx xxxx 0111 xxxx : */ ++ if ((insn & 0x0f8000f0) == 0x06800070) { ++ if ((insn & 0x00300000) == 0x00100000) ++ return INSN_REJECTED; /* Unallocated space */ ++ ++ if ((insn & 0x000f0000) == 0x000f0000) ++ return prep_emulate_rd12rm0(insn, asi); ++ else ++ return prep_emulate_rd12rn16rm0_wflags(insn, asi); ++ } ++ ++ /* Other instruction encodings aren't yet defined */ ++ return INSN_REJECTED; + } + + static enum kprobe_insn __kprobes +@@ -1273,29 +1416,49 @@ space_cccc_0111__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) + if ((insn & 0x0ff000f0) == 0x03f000f0) + return INSN_REJECTED; + +- /* USADA8 : cccc 0111 1000 xxxx xxxx xxxx 0001 xxxx */ +- /* USAD8 : cccc 0111 1000 xxxx 1111 xxxx 0001 xxxx */ +- if ((insn & 0x0ff000f0) == 0x07800010) +- return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); +- + /* SMLALD : cccc 0111 0100 xxxx xxxx xxxx 00x1 xxxx */ + /* SMLSLD : cccc 0111 0100 xxxx xxxx xxxx 01x1 xxxx */ + if ((insn & 0x0ff00090) == 0x07400010) + return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, asi); + + /* SMLAD : cccc 0111 0000 xxxx xxxx xxxx 00x1 xxxx :Q */ ++ /* SMUAD : cccc 0111 0000 xxxx 1111 xxxx 00x1 xxxx :Q */ + /* SMLSD : cccc 0111 0000 xxxx xxxx xxxx 01x1 xxxx :Q */ ++ /* SMUSD : cccc 0111 0000 xxxx 1111 xxxx 01x1 xxxx : */ + /* SMMLA : cccc 0111 0101 xxxx xxxx xxxx 00x1 xxxx : */ +- /* SMMLS : cccc 0111 0101 xxxx xxxx xxxx 11x1 xxxx : */ ++ /* SMMUL : cccc 0111 0101 xxxx 1111 xxxx 00x1 xxxx : */ ++ /* USADA8 : cccc 0111 1000 xxxx xxxx xxxx 0001 xxxx : */ ++ /* USAD8 : cccc 0111 1000 xxxx 1111 xxxx 0001 xxxx : */ + if ((insn & 0x0ff00090) == 0x07000010 || + (insn & 0x0ff000d0) == 0x07500010 || +- (insn & 0x0ff000d0) == 0x075000d0) ++ (insn & 0x0ff000f0) == 0x07800010) { ++ ++ if ((insn & 0x0000f000) == 0x0000f000) ++ return prep_emulate_rd16rs8rm0_wflags(insn, asi); ++ else ++ return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); ++ } ++ ++ /* SMMLS : cccc 0111 0101 xxxx xxxx xxxx 11x1 xxxx : */ ++ if ((insn & 0x0ff000d0) == 0x075000d0) + return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); + +- /* SMUSD : cccc 0111 0000 xxxx xxxx xxxx 01x1 xxxx : */ +- /* SMUAD : cccc 0111 0000 xxxx 1111 xxxx 00x1 xxxx :Q */ +- /* SMMUL : cccc 0111 0101 xxxx 1111 xxxx 00x1 xxxx : */ +- return prep_emulate_rd16rs8rm0_wflags(insn, asi); ++ /* SBFX : cccc 0111 101x xxxx xxxx xxxx x101 xxxx : */ ++ /* UBFX : cccc 0111 111x xxxx xxxx xxxx x101 xxxx : */ ++ if ((insn & 0x0fa00070) == 0x07a00050) ++ return prep_emulate_rd12rm0(insn, asi); ++ ++ /* BFI : cccc 0111 110x xxxx xxxx xxxx x001 xxxx : */ ++ /* BFC : cccc 0111 110x xxxx xxxx xxxx x001 1111 : */ ++ if ((insn & 0x0fe00070) == 0x07c00010) { ++ ++ if ((insn & 0x0000000f) == 0x0000000f) ++ return prep_emulate_rd12_modify(insn, asi); ++ else ++ return prep_emulate_rd12rn0_modify(insn, asi); ++ } ++ ++ return INSN_REJECTED; + } + + static enum kprobe_insn __kprobes +@@ -1309,6 +1472,10 @@ space_cccc_01xx(kprobe_opcode_t insn, struct arch_specific_insn *asi) + /* STRB : cccc 01xx x1x0 xxxx xxxx xxxx xxxx xxxx */ + /* STRBT : cccc 01x0 x110 xxxx xxxx xxxx xxxx xxxx */ + /* STRT : cccc 01x0 x010 xxxx xxxx xxxx xxxx xxxx */ ++ ++ if ((insn & 0x00500000) == 0x00500000 && is_r15(insn, 12)) ++ return INSN_REJECTED; /* LDRB into PC */ ++ + return prep_emulate_ldr_str(insn, asi); + } + +@@ -1323,10 +1490,9 @@ space_cccc_100x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + + /* LDM(1) : cccc 100x x0x1 xxxx xxxx xxxx xxxx xxxx */ + /* STM(1) : cccc 100x x0x0 xxxx xxxx xxxx xxxx xxxx */ +- asi->insn[0] = truecc_insn(insn); + asi->insn_handler = ((insn & 0x108000) == 0x008000) ? /* STM & R15 */ + simulate_stm1_pc : simulate_ldm1stm1; +- return INSN_GOOD; ++ return INSN_GOOD_NO_SLOT; + } + + static enum kprobe_insn __kprobes +@@ -1334,58 +1500,117 @@ space_cccc_101x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + { + /* B : cccc 1010 xxxx xxxx xxxx xxxx xxxx xxxx */ + /* BL : cccc 1011 xxxx xxxx xxxx xxxx xxxx xxxx */ +- asi->insn[0] = truecc_insn(insn); + asi->insn_handler = simulate_bbl; +- return INSN_GOOD; ++ return INSN_GOOD_NO_SLOT; + } + + static enum kprobe_insn __kprobes +-space_cccc_1100_010x(kprobe_opcode_t insn, struct arch_specific_insn *asi) ++space_cccc_11xx(kprobe_opcode_t insn, struct arch_specific_insn *asi) + { ++ /* Coprocessor instructions... */ + /* MCRR : cccc 1100 0100 xxxx xxxx xxxx xxxx xxxx : (Rd!=Rn) */ + /* MRRC : cccc 1100 0101 xxxx xxxx xxxx xxxx xxxx : (Rd!=Rn) */ +- insn &= 0xfff00fff; +- insn |= 0x00001000; /* Rn = r0, Rd = r1 */ +- asi->insn[0] = insn; +- asi->insn_handler = (insn & (1 << 20)) ? emulate_mrrc : emulate_mcrr; +- return INSN_GOOD; ++ /* LDC : cccc 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ ++ /* STC : cccc 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ ++ /* CDP : cccc 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ ++ /* MCR : cccc 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ ++ /* MRC : cccc 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ ++ ++ /* SVC : cccc 1111 xxxx xxxx xxxx xxxx xxxx xxxx */ ++ ++ return INSN_REJECTED; + } + +-static enum kprobe_insn __kprobes +-space_cccc_110x(kprobe_opcode_t insn, struct arch_specific_insn *asi) ++static unsigned long __kprobes __check_eq(unsigned long cpsr) + { +- /* LDC : cccc 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ +- /* STC : cccc 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ +- insn &= 0xfff0ffff; /* Rn = r0 */ +- asi->insn[0] = insn; +- asi->insn_handler = emulate_ldcstc; +- return INSN_GOOD; ++ return cpsr & PSR_Z_BIT; + } + +-static enum kprobe_insn __kprobes +-space_cccc_111x(kprobe_opcode_t insn, struct arch_specific_insn *asi) ++static unsigned long __kprobes __check_ne(unsigned long cpsr) + { +- /* BKPT : 1110 0001 0010 xxxx xxxx xxxx 0111 xxxx */ +- /* SWI : cccc 1111 xxxx xxxx xxxx xxxx xxxx xxxx */ +- if ((insn & 0xfff000f0) == 0xe1200070 || +- (insn & 0x0f000000) == 0x0f000000) +- return INSN_REJECTED; ++ return (~cpsr) & PSR_Z_BIT; ++} + +- /* CDP : cccc 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ +- if ((insn & 0x0f000010) == 0x0e000000) { +- asi->insn[0] = insn; +- asi->insn_handler = emulate_none; +- return INSN_GOOD; +- } ++static unsigned long __kprobes __check_cs(unsigned long cpsr) ++{ ++ return cpsr & PSR_C_BIT; ++} + +- /* MCR : cccc 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ +- /* MRC : cccc 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ +- insn &= 0xffff0fff; /* Rd = r0 */ +- asi->insn[0] = insn; +- asi->insn_handler = (insn & (1 << 20)) ? emulate_rd12 : emulate_ird12; +- return INSN_GOOD; ++static unsigned long __kprobes __check_cc(unsigned long cpsr) ++{ ++ return (~cpsr) & PSR_C_BIT; ++} ++ ++static unsigned long __kprobes __check_mi(unsigned long cpsr) ++{ ++ return cpsr & PSR_N_BIT; ++} ++ ++static unsigned long __kprobes __check_pl(unsigned long cpsr) ++{ ++ return (~cpsr) & PSR_N_BIT; ++} ++ ++static unsigned long __kprobes __check_vs(unsigned long cpsr) ++{ ++ return cpsr & PSR_V_BIT; ++} ++ ++static unsigned long __kprobes __check_vc(unsigned long cpsr) ++{ ++ return (~cpsr) & PSR_V_BIT; ++} ++ ++static unsigned long __kprobes __check_hi(unsigned long cpsr) ++{ ++ cpsr &= ~(cpsr >> 1); /* PSR_C_BIT &= ~PSR_Z_BIT */ ++ return cpsr & PSR_C_BIT; + } + ++static unsigned long __kprobes __check_ls(unsigned long cpsr) ++{ ++ cpsr &= ~(cpsr >> 1); /* PSR_C_BIT &= ~PSR_Z_BIT */ ++ return (~cpsr) & PSR_C_BIT; ++} ++ ++static unsigned long __kprobes __check_ge(unsigned long cpsr) ++{ ++ cpsr ^= (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ ++ return (~cpsr) & PSR_N_BIT; ++} ++ ++static unsigned long __kprobes __check_lt(unsigned long cpsr) ++{ ++ cpsr ^= (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ ++ return cpsr & PSR_N_BIT; ++} ++ ++static unsigned long __kprobes __check_gt(unsigned long cpsr) ++{ ++ unsigned long temp = cpsr ^ (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ ++ temp |= (cpsr << 1); /* PSR_N_BIT |= PSR_Z_BIT */ ++ return (~temp) & PSR_N_BIT; ++} ++ ++static unsigned long __kprobes __check_le(unsigned long cpsr) ++{ ++ unsigned long temp = cpsr ^ (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ ++ temp |= (cpsr << 1); /* PSR_N_BIT |= PSR_Z_BIT */ ++ return temp & PSR_N_BIT; ++} ++ ++static unsigned long __kprobes __check_al(unsigned long cpsr) ++{ ++ return true; ++} ++ ++static kprobe_check_cc * const condition_checks[16] = { ++ &__check_eq, &__check_ne, &__check_cs, &__check_cc, ++ &__check_mi, &__check_pl, &__check_vs, &__check_vc, ++ &__check_hi, &__check_ls, &__check_ge, &__check_lt, ++ &__check_gt, &__check_le, &__check_al, &__check_al ++}; ++ + /* Return: + * INSN_REJECTED If instruction is one not allowed to kprobe, + * INSN_GOOD If instruction is supported and uses instruction slot, +@@ -1401,133 +1626,45 @@ space_cccc_111x(kprobe_opcode_t insn, struct arch_specific_insn *asi) + enum kprobe_insn __kprobes + arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) + { ++ asi->insn_check_cc = condition_checks[insn>>28]; + asi->insn[1] = KPROBE_RETURN_INSTRUCTION; + +- if ((insn & 0xf0000000) == 0xf0000000) { ++ if ((insn & 0xf0000000) == 0xf0000000) + + return space_1111(insn, asi); + +- } else if ((insn & 0x0e000000) == 0x00000000) { ++ else if ((insn & 0x0e000000) == 0x00000000) + + return space_cccc_000x(insn, asi); + +- } else if ((insn & 0x0e000000) == 0x02000000) { ++ else if ((insn & 0x0e000000) == 0x02000000) + + return space_cccc_001x(insn, asi); + +- } else if ((insn & 0x0f000010) == 0x06000010) { ++ else if ((insn & 0x0f000010) == 0x06000010) + + return space_cccc_0110__1(insn, asi); + +- } else if ((insn & 0x0f000010) == 0x07000010) { ++ else if ((insn & 0x0f000010) == 0x07000010) + + return space_cccc_0111__1(insn, asi); + +- } else if ((insn & 0x0c000000) == 0x04000000) { ++ else if ((insn & 0x0c000000) == 0x04000000) + + return space_cccc_01xx(insn, asi); + +- } else if ((insn & 0x0e000000) == 0x08000000) { ++ else if ((insn & 0x0e000000) == 0x08000000) + + return space_cccc_100x(insn, asi); + +- } else if ((insn & 0x0e000000) == 0x0a000000) { ++ else if ((insn & 0x0e000000) == 0x0a000000) + + return space_cccc_101x(insn, asi); + +- } else if ((insn & 0x0fe00000) == 0x0c400000) { +- +- return space_cccc_1100_010x(insn, asi); +- +- } else if ((insn & 0x0e000000) == 0x0c000000) { +- +- return space_cccc_110x(insn, asi); +- +- } +- +- return space_cccc_111x(insn, asi); ++ return space_cccc_11xx(insn, asi); + } + + void __init arm_kprobe_decode_init(void) + { + find_str_pc_offset(); + } +- +- +-/* +- * All ARM instructions listed below. +- * +- * Instructions and their general purpose registers are given. +- * If a particular register may not use R15, it is prefixed with a "!". +- * If marked with a "*" means the value returned by reading R15 +- * is implementation defined. +- * +- * ADC/ADD/AND/BIC/CMN/CMP/EOR/MOV/MVN/ORR/RSB/RSC/SBC/SUB/TEQ +- * TST: Rd, Rn, Rm, !Rs +- * BX: Rm +- * BLX(2): !Rm +- * BX: Rm (R15 legal, but discouraged) +- * BXJ: !Rm, +- * CLZ: !Rd, !Rm +- * CPY: Rd, Rm +- * LDC/2,STC/2 immediate offset & unindex: Rn +- * LDC/2,STC/2 immediate pre/post-indexed: !Rn +- * LDM(1/3): !Rn, register_list +- * LDM(2): !Rn, !register_list +- * LDR,STR,PLD immediate offset: Rd, Rn +- * LDR,STR,PLD register offset: Rd, Rn, !Rm +- * LDR,STR,PLD scaled register offset: Rd, !Rn, !Rm +- * LDR,STR immediate pre/post-indexed: Rd, !Rn +- * LDR,STR register pre/post-indexed: Rd, !Rn, !Rm +- * LDR,STR scaled register pre/post-indexed: Rd, !Rn, !Rm +- * LDRB,STRB immediate offset: !Rd, Rn +- * LDRB,STRB register offset: !Rd, Rn, !Rm +- * LDRB,STRB scaled register offset: !Rd, !Rn, !Rm +- * LDRB,STRB immediate pre/post-indexed: !Rd, !Rn +- * LDRB,STRB register pre/post-indexed: !Rd, !Rn, !Rm +- * LDRB,STRB scaled register pre/post-indexed: !Rd, !Rn, !Rm +- * LDRT,LDRBT,STRBT immediate pre/post-indexed: !Rd, !Rn +- * LDRT,LDRBT,STRBT register pre/post-indexed: !Rd, !Rn, !Rm +- * LDRT,LDRBT,STRBT scaled register pre/post-indexed: !Rd, !Rn, !Rm +- * LDRH/SH/SB/D,STRH/SH/SB/D immediate offset: !Rd, Rn +- * LDRH/SH/SB/D,STRH/SH/SB/D register offset: !Rd, Rn, !Rm +- * LDRH/SH/SB/D,STRH/SH/SB/D immediate pre/post-indexed: !Rd, !Rn +- * LDRH/SH/SB/D,STRH/SH/SB/D register pre/post-indexed: !Rd, !Rn, !Rm +- * LDREX: !Rd, !Rn +- * MCR/2: !Rd +- * MCRR/2,MRRC/2: !Rd, !Rn +- * MLA: !Rd, !Rn, !Rm, !Rs +- * MOV: Rd +- * MRC/2: !Rd (if Rd==15, only changes cond codes, not the register) +- * MRS,MSR: !Rd +- * MUL: !Rd, !Rm, !Rs +- * PKH{BT,TB}: !Rd, !Rn, !Rm +- * QDADD,[U]QADD/16/8/SUBX: !Rd, !Rm, !Rn +- * QDSUB,[U]QSUB/16/8/ADDX: !Rd, !Rm, !Rn +- * REV/16/SH: !Rd, !Rm +- * RFE: !Rn +- * {S,U}[H]ADD{16,8,SUBX},{S,U}[H]SUB{16,8,ADDX}: !Rd, !Rn, !Rm +- * SEL: !Rd, !Rn, !Rm +- * SMLA,SMLA{D,W},SMLSD,SMML{A,S}: !Rd, !Rn, !Rm, !Rs +- * SMLAL,SMLA{D,LD},SMLSLD,SMMULL,SMULW: !RdHi, !RdLo, !Rm, !Rs +- * SMMUL,SMUAD,SMUL,SMUSD: !Rd, !Rm, !Rs +- * SSAT/16: !Rd, !Rm +- * STM(1/2): !Rn, register_list* (R15 in reg list not recommended) +- * STRT immediate pre/post-indexed: Rd*, !Rn +- * STRT register pre/post-indexed: Rd*, !Rn, !Rm +- * STRT scaled register pre/post-indexed: Rd*, !Rn, !Rm +- * STREX: !Rd, !Rn, !Rm +- * SWP/B: !Rd, !Rn, !Rm +- * {S,U}XTA{B,B16,H}: !Rd, !Rn, !Rm +- * {S,U}XT{B,B16,H}: !Rd, !Rm +- * UM{AA,LA,UL}L: !RdHi, !RdLo, !Rm, !Rs +- * USA{D8,A8,T,T16}: !Rd, !Rm, !Rs +- * +- * May transfer control by writing R15 (possible mode changes or alternate +- * mode accesses marked by "*"): +- * ALU op (* with s-bit), B, BL, BKPT, BLX(1/2), BX, BXJ, CPS*, CPY, +- * LDM(1), LDM(2/3)*, LDR, MOV, RFE*, SWI* +- * +- * Instructions that do not take general registers, nor transfer control: +- * CDP/2, SETEND, SRS* +- */ +diff --git a/arch/arm/kernel/kprobes.c b/arch/arm/kernel/kprobes.c +index 2ba7deb..1656c87 100644 +--- a/arch/arm/kernel/kprobes.c ++++ b/arch/arm/kernel/kprobes.c +@@ -134,7 +134,8 @@ static void __kprobes singlestep(struct kprobe *p, struct pt_regs *regs, + struct kprobe_ctlblk *kcb) + { + regs->ARM_pc += 4; +- p->ainsn.insn_handler(p, regs); ++ if (p->ainsn.insn_check_cc(regs->ARM_cpsr)) ++ p->ainsn.insn_handler(p, regs); + } + + /* +diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c +index 979da39..139e3c8 100644 +--- a/arch/arm/kernel/perf_event.c ++++ b/arch/arm/kernel/perf_event.c +@@ -746,7 +746,8 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) + + tail = (struct frame_tail __user *)regs->ARM_fp - 1; + +- while (tail && !((unsigned long)tail & 0x3)) ++ while ((entry->nr < PERF_MAX_STACK_DEPTH) && ++ tail && !((unsigned long)tail & 0x3)) + tail = user_backtrace(tail, entry); + } + +diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c +index 8fe05ad..f29b8a2 100644 +--- a/arch/arm/kernel/smp.c ++++ b/arch/arm/kernel/smp.c +@@ -479,7 +479,7 @@ static void broadcast_timer_set_mode(enum clock_event_mode mode, + { + } + +-static void broadcast_timer_setup(struct clock_event_device *evt) ++static void __cpuinit broadcast_timer_setup(struct clock_event_device *evt) + { + evt->name = "dummy_timer"; + evt->features = CLOCK_EVT_FEAT_ONESHOT | +diff --git a/arch/arm/kernel/sys_oabi-compat.c b/arch/arm/kernel/sys_oabi-compat.c +index 4ad8da1..af0aaeb 100644 +--- a/arch/arm/kernel/sys_oabi-compat.c ++++ b/arch/arm/kernel/sys_oabi-compat.c +@@ -311,7 +311,7 @@ asmlinkage long sys_oabi_semtimedop(int semid, + long err; + int i; + +- if (nsops < 1) ++ if (nsops < 1 || nsops > SEMOPM) + return -EINVAL; + sops = kmalloc(sizeof(*sops) * nsops, GFP_KERNEL); + if (!sops) +diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig +index 32f1479..c0deaca 100644 +--- a/arch/arm/mach-davinci/Kconfig ++++ b/arch/arm/mach-davinci/Kconfig +@@ -63,6 +63,7 @@ config MACH_DAVINCI_EVM + depends on ARCH_DAVINCI_DM644x + select MISC_DEVICES + select EEPROM_AT24 ++ select I2C + help + Configure this option to specify the whether the board used + for development is a DM644x EVM +@@ -72,6 +73,7 @@ config MACH_SFFSDR + depends on ARCH_DAVINCI_DM644x + select MISC_DEVICES + select EEPROM_AT24 ++ select I2C + help + Say Y here to select the Lyrtech Small Form Factor + Software Defined Radio (SFFSDR) board. +@@ -105,6 +107,7 @@ config MACH_DAVINCI_DM6467_EVM + select MACH_DAVINCI_DM6467TEVM + select MISC_DEVICES + select EEPROM_AT24 ++ select I2C + help + Configure this option to specify the whether the board used + for development is a DM6467 EVM +@@ -118,6 +121,7 @@ config MACH_DAVINCI_DM365_EVM + depends on ARCH_DAVINCI_DM365 + select MISC_DEVICES + select EEPROM_AT24 ++ select I2C + help + Configure this option to specify whether the board used + for development is a DM365 EVM +@@ -129,6 +133,7 @@ config MACH_DAVINCI_DA830_EVM + select GPIO_PCF857X + select MISC_DEVICES + select EEPROM_AT24 ++ select I2C + help + Say Y here to select the TI DA830/OMAP-L137/AM17x Evaluation Module. + +@@ -205,6 +210,7 @@ config MACH_MITYOMAPL138 + depends on ARCH_DAVINCI_DA850 + select MISC_DEVICES + select EEPROM_AT24 ++ select I2C + help + Say Y here to select the Critical Link MityDSP-L138/MityARM-1808 + System on Module. Information on this SoM may be found at +diff --git a/arch/arm/mach-davinci/board-mityomapl138.c b/arch/arm/mach-davinci/board-mityomapl138.c +index 2aa79c5..606a6f2 100644 +--- a/arch/arm/mach-davinci/board-mityomapl138.c ++++ b/arch/arm/mach-davinci/board-mityomapl138.c +@@ -29,7 +29,7 @@ + #include + #include + +-#define MITYOMAPL138_PHY_ID "0:03" ++#define MITYOMAPL138_PHY_ID "" + + #define FACTORY_CONFIG_MAGIC 0x012C0138 + #define FACTORY_CONFIG_VERSION 0x00010001 +@@ -414,7 +414,7 @@ static struct resource mityomapl138_nandflash_resource[] = { + + static struct platform_device mityomapl138_nandflash_device = { + .name = "davinci_nand", +- .id = 0, ++ .id = 1, + .dev = { + .platform_data = &mityomapl138_nandflash_data, + }, +diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c +index 625d4b6..58a02dc 100644 +--- a/arch/arm/mach-davinci/devices-da8xx.c ++++ b/arch/arm/mach-davinci/devices-da8xx.c +@@ -39,7 +39,8 @@ + #define DA8XX_GPIO_BASE 0x01e26000 + #define DA8XX_I2C1_BASE 0x01e28000 + #define DA8XX_SPI0_BASE 0x01c41000 +-#define DA8XX_SPI1_BASE 0x01f0e000 ++#define DA830_SPI1_BASE 0x01e12000 ++#define DA850_SPI1_BASE 0x01f0e000 + + #define DA8XX_EMAC_CTRL_REG_OFFSET 0x3000 + #define DA8XX_EMAC_MOD_REG_OFFSET 0x2000 +@@ -762,8 +763,8 @@ static struct resource da8xx_spi0_resources[] = { + + static struct resource da8xx_spi1_resources[] = { + [0] = { +- .start = DA8XX_SPI1_BASE, +- .end = DA8XX_SPI1_BASE + SZ_4K - 1, ++ .start = DA830_SPI1_BASE, ++ .end = DA830_SPI1_BASE + SZ_4K - 1, + .flags = IORESOURCE_MEM, + }, + [1] = { +@@ -832,5 +833,10 @@ int __init da8xx_register_spi(int instance, struct spi_board_info *info, + + da8xx_spi_pdata[instance].num_chipselect = len; + ++ if (instance == 1 && cpu_is_davinci_da850()) { ++ da8xx_spi1_resources[0].start = DA850_SPI1_BASE; ++ da8xx_spi1_resources[0].end = DA850_SPI1_BASE + SZ_4K - 1; ++ } ++ + return platform_device_register(&da8xx_spi_device[instance]); + } diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index f680122..a3a94e9 100644 --- a/arch/arm/mach-davinci/dm355.c @@ -490,6 +2000,131 @@ index 5f8a654..4c82c27 100644 }; static struct clk_lookup dm644x_clks[] = { +diff --git a/arch/arm/mach-davinci/include/mach/debug-macro.S b/arch/arm/mach-davinci/include/mach/debug-macro.S +index 9f1befc..f8b7ea4 100644 +--- a/arch/arm/mach-davinci/include/mach/debug-macro.S ++++ b/arch/arm/mach-davinci/include/mach/debug-macro.S +@@ -24,6 +24,9 @@ + + #define UART_SHIFT 2 + ++#define davinci_uart_v2p(x) ((x) - PAGE_OFFSET + PLAT_PHYS_OFFSET) ++#define davinci_uart_p2v(x) ((x) - PLAT_PHYS_OFFSET + PAGE_OFFSET) ++ + .pushsection .data + davinci_uart_phys: .word 0 + davinci_uart_virt: .word 0 +@@ -34,7 +37,7 @@ davinci_uart_virt: .word 0 + /* Use davinci_uart_phys/virt if already configured */ + 10: mrc p15, 0, \rp, c1, c0 + tst \rp, #1 @ MMU enabled? +- ldreq \rp, =__virt_to_phys(davinci_uart_phys) ++ ldreq \rp, =davinci_uart_v2p(davinci_uart_phys) + ldrne \rp, =davinci_uart_phys + add \rv, \rp, #4 @ davinci_uart_virt + ldr \rp, [\rp, #0] +@@ -48,18 +51,18 @@ davinci_uart_virt: .word 0 + tst \rp, #1 @ MMU enabled? + + /* Copy uart phys address from decompressor uart info */ +- ldreq \rv, =__virt_to_phys(davinci_uart_phys) ++ ldreq \rv, =davinci_uart_v2p(davinci_uart_phys) + ldrne \rv, =davinci_uart_phys + ldreq \rp, =DAVINCI_UART_INFO +- ldrne \rp, =__phys_to_virt(DAVINCI_UART_INFO) ++ ldrne \rp, =davinci_uart_p2v(DAVINCI_UART_INFO) + ldr \rp, [\rp, #0] + str \rp, [\rv] + + /* Copy uart virt address from decompressor uart info */ +- ldreq \rv, =__virt_to_phys(davinci_uart_virt) ++ ldreq \rv, =davinci_uart_v2p(davinci_uart_virt) + ldrne \rv, =davinci_uart_virt + ldreq \rp, =DAVINCI_UART_INFO +- ldrne \rp, =__phys_to_virt(DAVINCI_UART_INFO) ++ ldrne \rp, =davinci_uart_p2v(DAVINCI_UART_INFO) + ldr \rp, [\rp, #4] + str \rp, [\rv] + +diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h +index 8051110..c9e6ce1 100644 +--- a/arch/arm/mach-davinci/include/mach/serial.h ++++ b/arch/arm/mach-davinci/include/mach/serial.h +@@ -22,7 +22,7 @@ + * + * This area sits just below the page tables (see arch/arm/kernel/head.S). + */ +-#define DAVINCI_UART_INFO (PHYS_OFFSET + 0x3ff8) ++#define DAVINCI_UART_INFO (PLAT_PHYS_OFFSET + 0x3ff8) + + #define DAVINCI_UART0_BASE (IO_PHYS + 0x20000) + #define DAVINCI_UART1_BASE (IO_PHYS + 0x20400) +diff --git a/arch/arm/mach-mx3/mach-vpr200.c b/arch/arm/mach-mx3/mach-vpr200.c +index 2cf390f..47a69cb 100644 +--- a/arch/arm/mach-mx3/mach-vpr200.c ++++ b/arch/arm/mach-mx3/mach-vpr200.c +@@ -257,11 +257,16 @@ static const struct fsl_usb2_platform_data otg_device_pdata __initconst = { + .workaround = FLS_USB2_WORKAROUND_ENGCM09152, + }; + ++static int vpr200_usbh_init(struct platform_device *pdev) ++{ ++ return mx35_initialize_usb_hw(pdev->id, ++ MXC_EHCI_INTERFACE_SINGLE_UNI | MXC_EHCI_INTERNAL_PHY); ++} ++ + /* USB HOST config */ + static const struct mxc_usbh_platform_data usb_host_pdata __initconst = { +- .portsc = MXC_EHCI_MODE_SERIAL, +- .flags = MXC_EHCI_INTERFACE_SINGLE_UNI | +- MXC_EHCI_INTERNAL_PHY, ++ .init = vpr200_usbh_init, ++ .portsc = MXC_EHCI_MODE_SERIAL, + }; + + static struct platform_device *devices[] __initdata = { +diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-mx5/board-mx53_loco.c +index 10a1bea..6206b11 100644 +--- a/arch/arm/mach-mx5/board-mx53_loco.c ++++ b/arch/arm/mach-mx5/board-mx53_loco.c +@@ -193,7 +193,7 @@ static iomux_v3_cfg_t mx53_loco_pads[] = { + .wakeup = wake, \ + } + +-static const struct gpio_keys_button loco_buttons[] __initconst = { ++static struct gpio_keys_button loco_buttons[] = { + GPIO_BUTTON(MX53_LOCO_POWER, KEY_POWER, 1, "power", 0), + GPIO_BUTTON(MX53_LOCO_UI1, KEY_VOLUMEUP, 1, "volume-up", 0), + GPIO_BUTTON(MX53_LOCO_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0), +diff --git a/arch/arm/mach-mxs/clock-mx28.c b/arch/arm/mach-mxs/clock-mx28.c +index 1ad97fe..5dcc59d 100644 +--- a/arch/arm/mach-mxs/clock-mx28.c ++++ b/arch/arm/mach-mxs/clock-mx28.c +@@ -295,11 +295,11 @@ static int name##_set_rate(struct clk *clk, unsigned long rate) \ + unsigned long diff, parent_rate, calc_rate; \ + int i; \ + \ +- parent_rate = clk_get_rate(clk->parent); \ + div_max = BM_CLKCTRL_##dr##_DIV >> BP_CLKCTRL_##dr##_DIV; \ + bm_busy = BM_CLKCTRL_##dr##_BUSY; \ + \ + if (clk->parent == &ref_xtal_clk) { \ ++ parent_rate = clk_get_rate(clk->parent); \ + div = DIV_ROUND_UP(parent_rate, rate); \ + if (clk == &cpu_clk) { \ + div_max = BM_CLKCTRL_CPU_DIV_XTAL >> \ +@@ -309,6 +309,11 @@ static int name##_set_rate(struct clk *clk, unsigned long rate) \ + if (div == 0 || div > div_max) \ + return -EINVAL; \ + } else { \ ++ /* \ ++ * hack alert: this block modifies clk->parent, too, \ ++ * so the base to use it the grand parent. \ ++ */ \ ++ parent_rate = clk_get_rate(clk->parent->parent); \ + rate >>= PARENT_RATE_SHIFT; \ + parent_rate >>= PARENT_RATE_SHIFT; \ + diff = parent_rate; \ diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index a45cd64..512b152 100644 --- a/arch/arm/mach-omap2/Makefile @@ -826,6 +2461,83 @@ index 6fb5209..0c1552d 100644 vdd->volt_scale = vp_forceupdate_scale_voltage; vdd->vp_enabled = false; +diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c +index 6de0ad0..9cdcca5 100644 +--- a/arch/arm/mach-pxa/hx4700.c ++++ b/arch/arm/mach-pxa/hx4700.c +@@ -711,7 +711,7 @@ static struct regulator_consumer_supply bq24022_consumers[] = { + static struct regulator_init_data bq24022_init_data = { + .constraints = { + .max_uA = 500000, +- .valid_ops_mask = REGULATOR_CHANGE_CURRENT, ++ .valid_ops_mask = REGULATOR_CHANGE_CURRENT|REGULATOR_CHANGE_STATUS, + }, + .num_consumer_supplies = ARRAY_SIZE(bq24022_consumers), + .consumer_supplies = bq24022_consumers, +diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c +index a72993d..9984ef7 100644 +--- a/arch/arm/mach-pxa/magician.c ++++ b/arch/arm/mach-pxa/magician.c +@@ -599,7 +599,7 @@ static struct regulator_consumer_supply bq24022_consumers[] = { + static struct regulator_init_data bq24022_init_data = { + .constraints = { + .max_uA = 500000, +- .valid_ops_mask = REGULATOR_CHANGE_CURRENT, ++ .valid_ops_mask = REGULATOR_CHANGE_CURRENT | REGULATOR_CHANGE_STATUS, + }, + .num_consumer_supplies = ARRAY_SIZE(bq24022_consumers), + .consumer_supplies = bq24022_consumers, +diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S +index ce233bc..42af976 100644 +--- a/arch/arm/mm/proc-xscale.S ++++ b/arch/arm/mm/proc-xscale.S +@@ -395,7 +395,7 @@ ENTRY(xscale_dma_a0_map_area) + teq r2, #DMA_TO_DEVICE + beq xscale_dma_clean_range + b xscale_dma_flush_range +-ENDPROC(xscsale_dma_a0_map_area) ++ENDPROC(xscale_dma_a0_map_area) + + /* + * dma_unmap_area(start, size, dir) +diff --git a/arch/arm/plat-mxc/gpio.c b/arch/arm/plat-mxc/gpio.c +index 7a10724..6cd6d7f 100644 +--- a/arch/arm/plat-mxc/gpio.c ++++ b/arch/arm/plat-mxc/gpio.c +@@ -295,6 +295,12 @@ static int mxc_gpio_direction_output(struct gpio_chip *chip, + return 0; + } + ++/* ++ * This lock class tells lockdep that GPIO irqs are in a different ++ * category than their parents, so it won't report false recursion. ++ */ ++static struct lock_class_key gpio_lock_class; ++ + int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt) + { + int i, j; +@@ -311,6 +317,7 @@ int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt) + __raw_writel(~0, port[i].base + GPIO_ISR); + for (j = port[i].virtual_irq_start; + j < port[i].virtual_irq_start + 32; j++) { ++ irq_set_lockdep_class(j, &gpio_lock_class); + irq_set_chip_and_handler(j, &gpio_irq_chip, + handle_level_irq); + set_irq_flags(j, IRQF_VALID); +diff --git a/arch/arm/plat-mxc/ssi-fiq.S b/arch/arm/plat-mxc/ssi-fiq.S +index 4ddce56..8397a2d 100644 +--- a/arch/arm/plat-mxc/ssi-fiq.S ++++ b/arch/arm/plat-mxc/ssi-fiq.S +@@ -124,6 +124,8 @@ imx_ssi_fiq_start: + 1: + @ return from FIQ + subs pc, lr, #4 ++ ++ .align + imx_ssi_fiq_base: + .word 0x0 + imx_ssi_fiq_rx_buffer: diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c index 02b7a03..8b3db1c 100644 --- a/arch/m68k/mm/motorola.c @@ -855,6 +2567,21 @@ index b7ed8d7..b1d1262 100644 #endif /* +diff --git a/arch/powerpc/include/asm/8xx_immap.h b/arch/powerpc/include/asm/8xx_immap.h +index 6b6dc20..bdf0563 100644 +--- a/arch/powerpc/include/asm/8xx_immap.h ++++ b/arch/powerpc/include/asm/8xx_immap.h +@@ -393,8 +393,8 @@ typedef struct fec { + uint fec_addr_low; /* lower 32 bits of station address */ + ushort fec_addr_high; /* upper 16 bits of station address */ + ushort res1; /* reserved */ +- uint fec_hash_table_high; /* upper 32-bits of hash table */ +- uint fec_hash_table_low; /* lower 32-bits of hash table */ ++ uint fec_grp_hash_table_high; /* upper 32-bits of hash table */ ++ uint fec_grp_hash_table_low; /* lower 32-bits of hash table */ + uint fec_r_des_start; /* beginning of Rx descriptor ring */ + uint fec_x_des_start; /* beginning of Tx descriptor ring */ + uint fec_r_buff_size; /* Rx buffer size */ diff --git a/arch/powerpc/include/asm/uninorth.h b/arch/powerpc/include/asm/uninorth.h index ae9c899..d12b11d 100644 --- a/arch/powerpc/include/asm/uninorth.h @@ -868,6 +2595,39 @@ index ae9c899..d12b11d 100644 * * In order to invalidate the GART (which is probably necessary to inval * the bridge internal TLBs), the following sequence has to be written, +diff --git a/arch/s390/crypto/prng.c b/arch/s390/crypto/prng.c +index 44bca3f..8b16c47 100644 +--- a/arch/s390/crypto/prng.c ++++ b/arch/s390/crypto/prng.c +@@ -76,7 +76,7 @@ static void prng_seed(int nbytes) + + /* Add the entropy */ + while (nbytes >= 8) { +- *((__u64 *)parm_block) ^= *((__u64 *)buf+i); ++ *((__u64 *)parm_block) ^= *((__u64 *)(buf+i)); + prng_add_entropy(); + i += 8; + nbytes -= 8; +diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c +index 4cf85fe..ab98813 100644 +--- a/arch/s390/mm/fault.c ++++ b/arch/s390/mm/fault.c +@@ -543,7 +543,6 @@ static void pfault_interrupt(unsigned int ext_int_code, + struct task_struct *tsk; + __u16 subcode; + +- kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++; + /* + * Get the external interruption subcode & pfault + * initial/completion signal bit. VM stores this +@@ -553,6 +552,7 @@ static void pfault_interrupt(unsigned int ext_int_code, + subcode = ext_int_code >> 16; + if ((subcode & 0xff00) != __SUBCODE_MASK) + return; ++ kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++; + + /* + * Get the token (= address of the task structure of the affected task). diff --git a/arch/um/Kconfig.um b/arch/um/Kconfig.um index 90a438a..b5e675e 100644 --- a/arch/um/Kconfig.um @@ -1424,6 +3184,58 @@ index 4573c83..abbbd33 100644 if (capable) { if (wakeup_sysfs_add(dev)) return; +diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c +index 0fc0a79..6db161f 100644 +--- a/drivers/clk/clkdev.c ++++ b/drivers/clk/clkdev.c +@@ -32,10 +32,9 @@ static DEFINE_MUTEX(clocks_mutex); + * Then we take the most specific entry - with the following + * order of precedence: dev+con > dev only > con only. + */ +-static struct clk *clk_find(const char *dev_id, const char *con_id) ++static struct clk_lookup *clk_find(const char *dev_id, const char *con_id) + { +- struct clk_lookup *p; +- struct clk *clk = NULL; ++ struct clk_lookup *p, *cl = NULL; + int match, best = 0; + + list_for_each_entry(p, &clocks, node) { +@@ -52,27 +51,27 @@ static struct clk *clk_find(const char *dev_id, const char *con_id) + } + + if (match > best) { +- clk = p->clk; ++ cl = p; + if (match != 3) + best = match; + else + break; + } + } +- return clk; ++ return cl; + } + + struct clk *clk_get_sys(const char *dev_id, const char *con_id) + { +- struct clk *clk; ++ struct clk_lookup *cl; + + mutex_lock(&clocks_mutex); +- clk = clk_find(dev_id, con_id); +- if (clk && !__clk_get(clk)) +- clk = NULL; ++ cl = clk_find(dev_id, con_id); ++ if (cl && !__clk_get(cl->clk)) ++ cl = NULL; + mutex_unlock(&clocks_mutex); + +- return clk ? clk : ERR_PTR(-ENOENT); ++ return cl ? cl->clk : ERR_PTR(-ENOENT); + } + EXPORT_SYMBOL(clk_get_sys); + diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index c58f691..b493663 100644 --- a/drivers/gpu/drm/Kconfig @@ -1684,6 +3496,127 @@ index c43b4e9..2f94f95 100644 } } else if (man_id == 0x4D) { /* Maxim */ +diff --git a/drivers/hwmon/twl4030-madc-hwmon.c b/drivers/hwmon/twl4030-madc-hwmon.c +index de58191..5724074 100644 +--- a/drivers/hwmon/twl4030-madc-hwmon.c ++++ b/drivers/hwmon/twl4030-madc-hwmon.c +@@ -98,7 +98,6 @@ static const struct attribute_group twl4030_madc_group = { + static int __devinit twl4030_madc_hwmon_probe(struct platform_device *pdev) + { + int ret; +- int status; + struct device *hwmon; + + ret = sysfs_create_group(&pdev->dev.kobj, &twl4030_madc_group); +@@ -107,7 +106,7 @@ static int __devinit twl4030_madc_hwmon_probe(struct platform_device *pdev) + hwmon = hwmon_device_register(&pdev->dev); + if (IS_ERR(hwmon)) { + dev_err(&pdev->dev, "hwmon_device_register failed.\n"); +- status = PTR_ERR(hwmon); ++ ret = PTR_ERR(hwmon); + goto err_reg; + } + +diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c +index 72c0415..455e909 100644 +--- a/drivers/i2c/busses/i2c-i801.c ++++ b/drivers/i2c/busses/i2c-i801.c +@@ -134,10 +134,15 @@ + SMBHSTSTS_BUS_ERR | SMBHSTSTS_DEV_ERR | \ + SMBHSTSTS_INTR) + ++/* Older devices have their ID defined in */ ++#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 ++#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 + /* Patsburg also has three 'Integrated Device Function' SMBus controllers */ + #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0 0x1d70 + #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71 + #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72 ++#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 ++#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 + + struct i801_priv { + struct i2c_adapter adapter; +diff --git a/drivers/i2c/busses/i2c-parport.c b/drivers/i2c/busses/i2c-parport.c +index 0eb1515..2dbba16 100644 +--- a/drivers/i2c/busses/i2c-parport.c ++++ b/drivers/i2c/busses/i2c-parport.c +@@ -1,7 +1,7 @@ + /* ------------------------------------------------------------------------ * + * i2c-parport.c I2C bus over parallel port * + * ------------------------------------------------------------------------ * +- Copyright (C) 2003-2010 Jean Delvare ++ Copyright (C) 2003-2011 Jean Delvare + + Based on older i2c-philips-par.c driver + Copyright (C) 1995-2000 Simon G. Vogl +@@ -33,6 +33,8 @@ + #include + #include + #include ++#include ++#include + #include "i2c-parport.h" + + /* ----- Device list ------------------------------------------------------ */ +@@ -43,10 +45,11 @@ struct i2c_par { + struct i2c_algo_bit_data algo_data; + struct i2c_smbus_alert_setup alert_data; + struct i2c_client *ara; +- struct i2c_par *next; ++ struct list_head node; + }; + +-static struct i2c_par *adapter_list; ++static LIST_HEAD(adapter_list); ++static DEFINE_MUTEX(adapter_list_lock); + + /* ----- Low-level parallel port access ----------------------------------- */ + +@@ -228,8 +231,9 @@ static void i2c_parport_attach (struct parport *port) + } + + /* Add the new adapter to the list */ +- adapter->next = adapter_list; +- adapter_list = adapter; ++ mutex_lock(&adapter_list_lock); ++ list_add_tail(&adapter->node, &adapter_list); ++ mutex_unlock(&adapter_list_lock); + return; + + ERROR1: +@@ -241,11 +245,11 @@ ERROR0: + + static void i2c_parport_detach (struct parport *port) + { +- struct i2c_par *adapter, *prev; ++ struct i2c_par *adapter, *_n; + + /* Walk the list */ +- for (prev = NULL, adapter = adapter_list; adapter; +- prev = adapter, adapter = adapter->next) { ++ mutex_lock(&adapter_list_lock); ++ list_for_each_entry_safe(adapter, _n, &adapter_list, node) { + if (adapter->pdev->port == port) { + if (adapter->ara) { + parport_disable_irq(port); +@@ -259,14 +263,11 @@ static void i2c_parport_detach (struct parport *port) + + parport_release(adapter->pdev); + parport_unregister_device(adapter->pdev); +- if (prev) +- prev->next = adapter->next; +- else +- adapter_list = adapter->next; ++ list_del(&adapter->node); + kfree(adapter); +- return; + } + } ++ mutex_unlock(&adapter_list_lock); + } + + static struct parport_driver i2c_parport_driver = { diff --git a/drivers/infiniband/hw/qib/qib_iba6120.c b/drivers/infiniband/hw/qib/qib_iba6120.c index 7de4b7e..d8ca0a0 100644 --- a/drivers/infiniband/hw/qib/qib_iba6120.c @@ -3113,6 +5046,896 @@ index 96c0b34..657b9f4 100644 * command to complete */ udelay(50); +diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c +index 88495c4..241b185 100644 +--- a/drivers/net/amd8111e.c ++++ b/drivers/net/amd8111e.c +@@ -106,7 +106,7 @@ MODULE_DESCRIPTION ("AMD8111 based 10/100 Ethernet Controller. Driver Version "M + MODULE_LICENSE("GPL"); + MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl); + module_param_array(speed_duplex, int, NULL, 0); +-MODULE_PARM_DESC(speed_duplex, "Set device speed and duplex modes, 0: Auto Negotitate, 1: 10Mbps Half Duplex, 2: 10Mbps Full Duplex, 3: 100Mbps Half Duplex, 4: 100Mbps Full Duplex"); ++MODULE_PARM_DESC(speed_duplex, "Set device speed and duplex modes, 0: Auto Negotiate, 1: 10Mbps Half Duplex, 2: 10Mbps Full Duplex, 3: 100Mbps Half Duplex, 4: 100Mbps Full Duplex"); + module_param_array(coalesce, bool, NULL, 0); + MODULE_PARM_DESC(coalesce, "Enable or Disable interrupt coalescing, 1: Enable, 0: Disable"); + module_param_array(dynamic_ipg, bool, NULL, 0); +diff --git a/drivers/net/atl1c/atl1c.h b/drivers/net/atl1c/atl1c.h +index 7cb375e..925929d 100644 +--- a/drivers/net/atl1c/atl1c.h ++++ b/drivers/net/atl1c/atl1c.h +@@ -566,9 +566,9 @@ struct atl1c_adapter { + #define __AT_TESTING 0x0001 + #define __AT_RESETTING 0x0002 + #define __AT_DOWN 0x0003 +- u8 work_event; +-#define ATL1C_WORK_EVENT_RESET 0x01 +-#define ATL1C_WORK_EVENT_LINK_CHANGE 0x02 ++ unsigned long work_event; ++#define ATL1C_WORK_EVENT_RESET 0 ++#define ATL1C_WORK_EVENT_LINK_CHANGE 1 + u32 msg_enable; + + bool have_msi; +diff --git a/drivers/net/atl1c/atl1c_main.c b/drivers/net/atl1c/atl1c_main.c +index 7d9d506..a6e1c36 100644 +--- a/drivers/net/atl1c/atl1c_main.c ++++ b/drivers/net/atl1c/atl1c_main.c +@@ -325,7 +325,7 @@ static void atl1c_link_chg_event(struct atl1c_adapter *adapter) + } + } + +- adapter->work_event |= ATL1C_WORK_EVENT_LINK_CHANGE; ++ set_bit(ATL1C_WORK_EVENT_LINK_CHANGE, &adapter->work_event); + schedule_work(&adapter->common_task); + } + +@@ -337,20 +337,16 @@ static void atl1c_common_task(struct work_struct *work) + adapter = container_of(work, struct atl1c_adapter, common_task); + netdev = adapter->netdev; + +- if (adapter->work_event & ATL1C_WORK_EVENT_RESET) { +- adapter->work_event &= ~ATL1C_WORK_EVENT_RESET; ++ if (test_and_clear_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event)) { + netif_device_detach(netdev); + atl1c_down(adapter); + atl1c_up(adapter); + netif_device_attach(netdev); +- return; + } + +- if (adapter->work_event & ATL1C_WORK_EVENT_LINK_CHANGE) { +- adapter->work_event &= ~ATL1C_WORK_EVENT_LINK_CHANGE; ++ if (test_and_clear_bit(ATL1C_WORK_EVENT_LINK_CHANGE, ++ &adapter->work_event)) + atl1c_check_link_status(adapter); +- } +- return; + } + + +@@ -369,7 +365,7 @@ static void atl1c_tx_timeout(struct net_device *netdev) + struct atl1c_adapter *adapter = netdev_priv(netdev); + + /* Do the reset outside of interrupt context */ +- adapter->work_event |= ATL1C_WORK_EVENT_RESET; ++ set_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event); + schedule_work(&adapter->common_task); + } + +diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c +index 7cb5a11..02a0443 100644 +--- a/drivers/net/benet/be_main.c ++++ b/drivers/net/benet/be_main.c +@@ -1873,6 +1873,7 @@ static void be_worker(struct work_struct *work) + be_detect_dump_ue(adapter); + + reschedule: ++ adapter->work_counter++; + schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); + } + +diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c +index 8e6d618..d8383a9 100644 +--- a/drivers/net/bnx2.c ++++ b/drivers/net/bnx2.c +@@ -8413,6 +8413,8 @@ bnx2_remove_one(struct pci_dev *pdev) + + unregister_netdev(dev); + ++ del_timer_sync(&bp->timer); ++ + if (bp->mips_firmware) + release_firmware(bp->mips_firmware); + if (bp->rv2p_firmware) +diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c +index e83ac6d..16581df 100644 +--- a/drivers/net/bnx2x/bnx2x_cmn.c ++++ b/drivers/net/bnx2x/bnx2x_cmn.c +@@ -2019,15 +2019,23 @@ static inline void bnx2x_set_pbd_gso(struct sk_buff *skb, + static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb, + u32 *parsing_data, u32 xmit_type) + { +- *parsing_data |= ((tcp_hdrlen(skb)/4) << +- ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) & +- ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW; ++ *parsing_data |= ++ ((((u8 *)skb_transport_header(skb) - skb->data) >> 1) << ++ ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) & ++ ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W; + +- *parsing_data |= ((((u8 *)tcp_hdr(skb) - skb->data) / 2) << +- ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) & +- ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W; ++ if (xmit_type & XMIT_CSUM_TCP) { ++ *parsing_data |= ((tcp_hdrlen(skb) / 4) << ++ ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) & ++ ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW; + +- return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data; ++ return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data; ++ } else ++ /* We support checksum offload for TCP and UDP only. ++ * No need to pass the UDP header length - it's a constant. ++ */ ++ return skb_transport_header(skb) + ++ sizeof(struct udphdr) - skb->data; + } + + /** +@@ -2043,7 +2051,7 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb, + struct eth_tx_parse_bd_e1x *pbd, + u32 xmit_type) + { +- u8 hlen = (skb_network_header(skb) - skb->data) / 2; ++ u8 hlen = (skb_network_header(skb) - skb->data) >> 1; + + /* for now NS flag is not used in Linux */ + pbd->global_data = +@@ -2051,9 +2059,15 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb, + ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT)); + + pbd->ip_hlen_w = (skb_transport_header(skb) - +- skb_network_header(skb)) / 2; ++ skb_network_header(skb)) >> 1; + +- hlen += pbd->ip_hlen_w + tcp_hdrlen(skb) / 2; ++ hlen += pbd->ip_hlen_w; ++ ++ /* We support checksum offload for TCP and UDP only */ ++ if (xmit_type & XMIT_CSUM_TCP) ++ hlen += tcp_hdrlen(skb) / 2; ++ else ++ hlen += sizeof(struct udphdr) / 2; + + pbd->total_hlen_w = cpu_to_le16(hlen); + hlen = hlen*2; +diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c +index 494bf96..31912f1 100644 +--- a/drivers/net/bonding/bond_3ad.c ++++ b/drivers/net/bonding/bond_3ad.c +@@ -1482,8 +1482,11 @@ static struct aggregator *ad_agg_selection_test(struct aggregator *best, + + static int agg_device_up(const struct aggregator *agg) + { +- return (netif_running(agg->slave->dev) && +- netif_carrier_ok(agg->slave->dev)); ++ struct port *port = agg->lag_ports; ++ if (!port) ++ return 0; ++ return (netif_running(port->slave->dev) && ++ netif_carrier_ok(port->slave->dev)); + } + + /** +diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c +index f75d314..53c0f04 100644 +--- a/drivers/net/ehea/ehea_main.c ++++ b/drivers/net/ehea/ehea_main.c +@@ -3040,11 +3040,14 @@ static void ehea_rereg_mrs(void) + + if (dev->flags & IFF_UP) { + mutex_lock(&port->port_lock); +- port_napi_enable(port); + ret = ehea_restart_qps(dev); +- check_sqs(port); +- if (!ret) ++ if (!ret) { ++ check_sqs(port); ++ port_napi_enable(port); + netif_wake_queue(dev); ++ } else { ++ netdev_err(dev, "Unable to restart QPS\n"); ++ } + mutex_unlock(&port->port_lock); + } + } +diff --git a/drivers/net/fs_enet/mac-fec.c b/drivers/net/fs_enet/mac-fec.c +index 61035fc..b9fbc83 100644 +--- a/drivers/net/fs_enet/mac-fec.c ++++ b/drivers/net/fs_enet/mac-fec.c +@@ -226,8 +226,8 @@ static void set_multicast_finish(struct net_device *dev) + } + + FC(fecp, r_cntrl, FEC_RCNTRL_PROM); +- FW(fecp, hash_table_high, fep->fec.hthi); +- FW(fecp, hash_table_low, fep->fec.htlo); ++ FW(fecp, grp_hash_table_high, fep->fec.hthi); ++ FW(fecp, grp_hash_table_low, fep->fec.htlo); + } + + static void set_multicast_list(struct net_device *dev) +@@ -273,8 +273,8 @@ static void restart(struct net_device *dev) + /* + * Reset all multicast. + */ +- FW(fecp, hash_table_high, fep->fec.hthi); +- FW(fecp, hash_table_low, fep->fec.htlo); ++ FW(fecp, grp_hash_table_high, fep->fec.hthi); ++ FW(fecp, grp_hash_table_low, fep->fec.htlo); + + /* + * Set maximum receive buffer size. +diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c +index a316619..9bd7746 100644 +--- a/drivers/net/ftmac100.c ++++ b/drivers/net/ftmac100.c +@@ -139,11 +139,11 @@ static int ftmac100_reset(struct ftmac100 *priv) + * that hardware reset completed (what the f*ck). + * We still need to wait for a while. + */ +- usleep_range(500, 1000); ++ udelay(500); + return 0; + } + +- usleep_range(1000, 10000); ++ udelay(1000); + } + + netdev_err(netdev, "software reset failed\n"); +@@ -772,7 +772,7 @@ static int ftmac100_mdio_read(struct net_device *netdev, int phy_id, int reg) + if ((phycr & FTMAC100_PHYCR_MIIRD) == 0) + return phycr & FTMAC100_PHYCR_MIIRDATA; + +- usleep_range(100, 1000); ++ udelay(100); + } + + netdev_err(netdev, "mdio read timed out\n"); +@@ -801,7 +801,7 @@ static void ftmac100_mdio_write(struct net_device *netdev, int phy_id, int reg, + if ((phycr & FTMAC100_PHYCR_MIIWR) == 0) + return; + +- usleep_range(100, 1000); ++ udelay(100); + } + + netdev_err(netdev, "mdio write timed out\n"); +diff --git a/drivers/net/mii.c b/drivers/net/mii.c +index 0a6c6a2..d4fc00b 100644 +--- a/drivers/net/mii.c ++++ b/drivers/net/mii.c +@@ -49,6 +49,10 @@ static u32 mii_get_an(struct mii_if_info *mii, u16 addr) + result |= ADVERTISED_100baseT_Half; + if (advert & ADVERTISE_100FULL) + result |= ADVERTISED_100baseT_Full; ++ if (advert & ADVERTISE_PAUSE_CAP) ++ result |= ADVERTISED_Pause; ++ if (advert & ADVERTISE_PAUSE_ASYM) ++ result |= ADVERTISED_Asym_Pause; + + return result; + } +diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c +index dfb67eb..eb41e44 100644 +--- a/drivers/net/netconsole.c ++++ b/drivers/net/netconsole.c +@@ -671,6 +671,7 @@ static int netconsole_netdev_event(struct notifier_block *this, + goto done; + + spin_lock_irqsave(&target_list_lock, flags); ++restart: + list_for_each_entry(nt, &target_list, list) { + netconsole_target_get(nt); + if (nt->np.dev == dev) { +@@ -683,9 +684,16 @@ static int netconsole_netdev_event(struct notifier_block *this, + * rtnl_lock already held + */ + if (nt->np.dev) { ++ spin_unlock_irqrestore( ++ &target_list_lock, ++ flags); + __netpoll_cleanup(&nt->np); ++ spin_lock_irqsave(&target_list_lock, ++ flags); + dev_put(nt->np.dev); + nt->np.dev = NULL; ++ netconsole_target_put(nt); ++ goto restart; + } + /* Fall through */ + case NETDEV_GOING_DOWN: +diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c +index 493b0de..397c368 100644 +--- a/drivers/net/r8169.c ++++ b/drivers/net/r8169.c +@@ -170,6 +170,16 @@ static const struct { + }; + #undef _R + ++static const struct rtl_firmware_info { ++ int mac_version; ++ const char *fw_name; ++} rtl_firmware_infos[] = { ++ { .mac_version = RTL_GIGA_MAC_VER_25, .fw_name = FIRMWARE_8168D_1 }, ++ { .mac_version = RTL_GIGA_MAC_VER_26, .fw_name = FIRMWARE_8168D_2 }, ++ { .mac_version = RTL_GIGA_MAC_VER_29, .fw_name = FIRMWARE_8105E_1 }, ++ { .mac_version = RTL_GIGA_MAC_VER_30, .fw_name = FIRMWARE_8105E_1 } ++}; ++ + enum cfg_version { + RTL_CFG_0 = 0x00, + RTL_CFG_1, +@@ -565,6 +575,7 @@ struct rtl8169_private { + u32 saved_wolopts; + + const struct firmware *fw; ++#define RTL_FIRMWARE_UNKNOWN ERR_PTR(-EAGAIN); + }; + + MODULE_AUTHOR("Realtek and the Linux r8169 crew "); +@@ -1789,25 +1800,26 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw) + + static void rtl_release_firmware(struct rtl8169_private *tp) + { +- release_firmware(tp->fw); +- tp->fw = NULL; ++ if (!IS_ERR_OR_NULL(tp->fw)) ++ release_firmware(tp->fw); ++ tp->fw = RTL_FIRMWARE_UNKNOWN; + } + +-static int rtl_apply_firmware(struct rtl8169_private *tp, const char *fw_name) ++static void rtl_apply_firmware(struct rtl8169_private *tp) + { +- const struct firmware **fw = &tp->fw; +- int rc = !*fw; +- +- if (rc) { +- rc = request_firmware(fw, fw_name, &tp->pci_dev->dev); +- if (rc < 0) +- goto out; +- } ++ const struct firmware *fw = tp->fw; + + /* TODO: release firmware once rtl_phy_write_fw signals failures. */ +- rtl_phy_write_fw(tp, *fw); +-out: +- return rc; ++ if (!IS_ERR_OR_NULL(fw)) ++ rtl_phy_write_fw(tp, fw); ++} ++ ++static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val) ++{ ++ if (rtl_readphy(tp, reg) != val) ++ netif_warn(tp, hw, tp->dev, "chipset not ready for firmware\n"); ++ else ++ rtl_apply_firmware(tp); + } + + static void rtl8169s_hw_phy_config(struct rtl8169_private *tp) +@@ -2246,10 +2258,8 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp) + + rtl_writephy(tp, 0x1f, 0x0005); + rtl_writephy(tp, 0x05, 0x001b); +- if ((rtl_readphy(tp, 0x06) != 0xbf00) || +- (rtl_apply_firmware(tp, FIRMWARE_8168D_1) < 0)) { +- netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); +- } ++ ++ rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xbf00); + + rtl_writephy(tp, 0x1f, 0x0000); + } +@@ -2351,10 +2361,8 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp) + + rtl_writephy(tp, 0x1f, 0x0005); + rtl_writephy(tp, 0x05, 0x001b); +- if ((rtl_readphy(tp, 0x06) != 0xb300) || +- (rtl_apply_firmware(tp, FIRMWARE_8168D_2) < 0)) { +- netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); +- } ++ ++ rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xb300); + + rtl_writephy(tp, 0x1f, 0x0000); + } +@@ -2474,8 +2482,7 @@ static void rtl8105e_hw_phy_config(struct rtl8169_private *tp) + rtl_writephy(tp, 0x18, 0x0310); + msleep(100); + +- if (rtl_apply_firmware(tp, FIRMWARE_8105E_1) < 0) +- netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); ++ rtl_apply_firmware(tp); + + rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); + } +@@ -3237,6 +3244,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + tp->timer.data = (unsigned long) dev; + tp->timer.function = rtl8169_phy_timer; + ++ tp->fw = RTL_FIRMWARE_UNKNOWN; ++ + rc = register_netdev(dev); + if (rc < 0) + goto err_out_msi_4; +@@ -3288,10 +3297,10 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev) + + cancel_delayed_work_sync(&tp->task); + +- rtl_release_firmware(tp); +- + unregister_netdev(dev); + ++ rtl_release_firmware(tp); ++ + if (pci_dev_run_wake(pdev)) + pm_runtime_get_noresume(&pdev->dev); + +@@ -3303,6 +3312,37 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev) + pci_set_drvdata(pdev, NULL); + } + ++static void rtl_request_firmware(struct rtl8169_private *tp) ++{ ++ int i; ++ ++ /* Return early if the firmware is already loaded / cached. */ ++ if (!IS_ERR(tp->fw)) ++ goto out; ++ ++ for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) { ++ const struct rtl_firmware_info *info = rtl_firmware_infos + i; ++ ++ if (info->mac_version == tp->mac_version) { ++ const char *name = info->fw_name; ++ int rc; ++ ++ rc = request_firmware(&tp->fw, name, &tp->pci_dev->dev); ++ if (rc < 0) { ++ netif_warn(tp, ifup, tp->dev, "unable to load " ++ "firmware patch %s (%d)\n", name, rc); ++ goto out_disable_request_firmware; ++ } ++ goto out; ++ } ++ } ++ ++out_disable_request_firmware: ++ tp->fw = NULL; ++out: ++ return; ++} ++ + static int rtl8169_open(struct net_device *dev) + { + struct rtl8169_private *tp = netdev_priv(dev); +@@ -3334,11 +3374,13 @@ static int rtl8169_open(struct net_device *dev) + + smp_mb(); + ++ rtl_request_firmware(tp); ++ + retval = request_irq(dev->irq, rtl8169_interrupt, + (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED, + dev->name, dev); + if (retval < 0) +- goto err_release_ring_2; ++ goto err_release_fw_2; + + napi_enable(&tp->napi); + +@@ -3359,7 +3401,8 @@ static int rtl8169_open(struct net_device *dev) + out: + return retval; + +-err_release_ring_2: ++err_release_fw_2: ++ rtl_release_firmware(tp); + rtl8169_rx_clear(tp); + err_free_rx_1: + dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, +diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c +index b8c5f35..7a5daef 100644 +--- a/drivers/net/tg3.c ++++ b/drivers/net/tg3.c +@@ -12327,8 +12327,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) + if (val & VCPU_CFGSHDW_ASPM_DBNC) + tp->tg3_flags |= TG3_FLAG_ASPM_WORKAROUND; + if ((val & VCPU_CFGSHDW_WOL_ENABLE) && +- (val & VCPU_CFGSHDW_WOL_MAGPKT)) ++ (val & VCPU_CFGSHDW_WOL_MAGPKT)) { + tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; ++ device_set_wakeup_enable(&tp->pdev->dev, true); ++ } + goto done; + } + +@@ -12461,8 +12463,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) + tp->tg3_flags &= ~TG3_FLAG_WOL_CAP; + + if ((tp->tg3_flags & TG3_FLAG_WOL_CAP) && +- (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) ++ (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) { + tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; ++ device_set_wakeup_enable(&tp->pdev->dev, true); ++ } + + if (cfg2 & (1 << 17)) + tp->phy_flags |= TG3_PHYFLG_CAPACITIVE_COUPLING; +diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c +index 341f705..a301479 100644 +--- a/drivers/net/usb/cdc_ether.c ++++ b/drivers/net/usb/cdc_ether.c +@@ -460,7 +460,7 @@ static const struct driver_info cdc_info = { + .manage_power = cdc_manage_power, + }; + +-static const struct driver_info mbm_info = { ++static const struct driver_info wwan_info = { + .description = "Mobile Broadband Network Device", + .flags = FLAG_WWAN, + .bind = usbnet_cdc_bind, +@@ -471,6 +471,7 @@ static const struct driver_info mbm_info = { + + /*-------------------------------------------------------------------------*/ + ++#define HUAWEI_VENDOR_ID 0x12D1 + + static const struct usb_device_id products [] = { + /* +@@ -587,8 +588,17 @@ static const struct usb_device_id products [] = { + }, { + USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM, + USB_CDC_PROTO_NONE), +- .driver_info = (unsigned long)&mbm_info, ++ .driver_info = (unsigned long)&wwan_info, + ++}, { ++ /* Various Huawei modems with a network port like the UMG1831 */ ++ .match_flags = USB_DEVICE_ID_MATCH_VENDOR ++ | USB_DEVICE_ID_MATCH_INT_INFO, ++ .idVendor = HUAWEI_VENDOR_ID, ++ .bInterfaceClass = USB_CLASS_COMM, ++ .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, ++ .bInterfaceProtocol = 255, ++ .driver_info = (unsigned long)&wwan_info, + }, + { }, // END + }; +diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c +index 967371f..1033ef6 100644 +--- a/drivers/net/usb/cdc_ncm.c ++++ b/drivers/net/usb/cdc_ncm.c +@@ -54,13 +54,13 @@ + #include + #include + +-#define DRIVER_VERSION "7-Feb-2011" ++#define DRIVER_VERSION "23-Apr-2011" + + /* CDC NCM subclass 3.2.1 */ + #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 + + /* Maximum NTB length */ +-#define CDC_NCM_NTB_MAX_SIZE_TX 16384 /* bytes */ ++#define CDC_NCM_NTB_MAX_SIZE_TX (16384 + 4) /* bytes, must be short terminated */ + #define CDC_NCM_NTB_MAX_SIZE_RX 16384 /* bytes */ + + /* Minimum value for MaxDatagramSize, ch. 6.2.9 */ +diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c +index 47a6c87..48d4efd 100644 +--- a/drivers/net/usb/smsc95xx.c ++++ b/drivers/net/usb/smsc95xx.c +@@ -730,7 +730,7 @@ static int smsc95xx_phy_initialize(struct usbnet *dev) + msleep(10); + bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR); + timeout++; +- } while ((bmcr & MII_BMCR) && (timeout < 100)); ++ } while ((bmcr & BMCR_RESET) && (timeout < 100)); + + if (timeout >= 100) { + netdev_warn(dev->net, "timeout on PHY Reset"); +diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c +index 069c1cf..009bba3 100644 +--- a/drivers/net/usb/usbnet.c ++++ b/drivers/net/usb/usbnet.c +@@ -736,6 +736,7 @@ int usbnet_open (struct net_device *net) + } + } + ++ set_bit(EVENT_DEV_OPEN, &dev->flags); + netif_start_queue (net); + netif_info(dev, ifup, dev->net, + "open: enable queueing (rx %d, tx %d) mtu %d %s framing\n", +@@ -1259,6 +1260,9 @@ void usbnet_disconnect (struct usb_interface *intf) + if (dev->driver_info->unbind) + dev->driver_info->unbind (dev, intf); + ++ usb_kill_urb(dev->interrupt); ++ usb_free_urb(dev->interrupt); ++ + free_netdev(net); + usb_put_dev (xdev); + } +@@ -1498,6 +1502,10 @@ int usbnet_resume (struct usb_interface *intf) + int retval; + + if (!--dev->suspend_count) { ++ /* resume interrupt URBs */ ++ if (dev->interrupt && test_bit(EVENT_DEV_OPEN, &dev->flags)) ++ usb_submit_urb(dev->interrupt, GFP_NOIO); ++ + spin_lock_irq(&dev->txq.lock); + while ((res = usb_get_from_anchor(&dev->deferred))) { + +diff --git a/drivers/net/veth.c b/drivers/net/veth.c +index 2de9b90..3b99f64 100644 +--- a/drivers/net/veth.c ++++ b/drivers/net/veth.c +@@ -403,6 +403,17 @@ static int veth_newlink(struct net *src_net, struct net_device *dev, + if (tb[IFLA_ADDRESS] == NULL) + random_ether_addr(dev->dev_addr); + ++ if (tb[IFLA_IFNAME]) ++ nla_strlcpy(dev->name, tb[IFLA_IFNAME], IFNAMSIZ); ++ else ++ snprintf(dev->name, IFNAMSIZ, DRV_NAME "%%d"); ++ ++ if (strchr(dev->name, '%')) { ++ err = dev_alloc_name(dev, dev->name); ++ if (err < 0) ++ goto err_alloc_name; ++ } ++ + err = register_netdevice(dev); + if (err < 0) + goto err_register_dev; +@@ -422,6 +433,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev, + + err_register_dev: + /* nothing to do */ ++err_alloc_name: + err_configure_peer: + unregister_netdevice(peer); + return err; +diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c +index dcd19bc..b29c80d 100644 +--- a/drivers/net/wireless/ath/ath9k/recv.c ++++ b/drivers/net/wireless/ath/ath9k/recv.c +@@ -506,7 +506,7 @@ bool ath_stoprecv(struct ath_softc *sc) + "confusing the DMA engine when we start RX up\n"); + ATH_DBG_WARN_ON_ONCE(!stopped); + } +- return stopped || reset; ++ return stopped && !reset; + } + + void ath_flushrecv(struct ath_softc *sc) +diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c +index d59b016..5af40d9 100644 +--- a/drivers/net/wireless/b43/main.c ++++ b/drivers/net/wireless/b43/main.c +@@ -72,6 +72,7 @@ MODULE_FIRMWARE("b43/ucode11.fw"); + MODULE_FIRMWARE("b43/ucode13.fw"); + MODULE_FIRMWARE("b43/ucode14.fw"); + MODULE_FIRMWARE("b43/ucode15.fw"); ++MODULE_FIRMWARE("b43/ucode16_mimo.fw"); + MODULE_FIRMWARE("b43/ucode5.fw"); + MODULE_FIRMWARE("b43/ucode9.fw"); + +diff --git a/drivers/net/wireless/iwlegacy/iwl-4965-tx.c b/drivers/net/wireless/iwlegacy/iwl-4965-tx.c +index 5c40502..79ac081 100644 +--- a/drivers/net/wireless/iwlegacy/iwl-4965-tx.c ++++ b/drivers/net/wireless/iwlegacy/iwl-4965-tx.c +@@ -316,12 +316,18 @@ int iwl4965_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) + + hdr_len = ieee80211_hdrlen(fc); + +- /* Find index into station table for destination station */ +- sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta); +- if (sta_id == IWL_INVALID_STATION) { +- IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", +- hdr->addr1); +- goto drop_unlock; ++ /* For management frames use broadcast id to do not break aggregation */ ++ if (!ieee80211_is_data(fc)) ++ sta_id = ctx->bcast_sta_id; ++ else { ++ /* Find index into station table for destination station */ ++ sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta); ++ ++ if (sta_id == IWL_INVALID_STATION) { ++ IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", ++ hdr->addr1); ++ goto drop_unlock; ++ } + } + + IWL_DEBUG_TX(priv, "station Id %d\n", sta_id); +@@ -1127,12 +1133,16 @@ int iwl4965_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index) + q->read_ptr = iwl_legacy_queue_inc_wrap(q->read_ptr, q->n_bd)) { + + tx_info = &txq->txb[txq->q.read_ptr]; +- iwl4965_tx_status(priv, tx_info, +- txq_id >= IWL4965_FIRST_AMPDU_QUEUE); ++ ++ if (WARN_ON_ONCE(tx_info->skb == NULL)) ++ continue; + + hdr = (struct ieee80211_hdr *)tx_info->skb->data; +- if (hdr && ieee80211_is_data_qos(hdr->frame_control)) ++ if (ieee80211_is_data_qos(hdr->frame_control)) + nfreed++; ++ ++ iwl4965_tx_status(priv, tx_info, ++ txq_id >= IWL4965_FIRST_AMPDU_QUEUE); + tx_info->skb = NULL; + + priv->cfg->ops->lib->txq_free_tfd(priv, txq); +diff --git a/drivers/net/wireless/iwlegacy/iwl-led.c b/drivers/net/wireless/iwlegacy/iwl-led.c +index 15eb8b7..bda0d61 100644 +--- a/drivers/net/wireless/iwlegacy/iwl-led.c ++++ b/drivers/net/wireless/iwlegacy/iwl-led.c +@@ -48,8 +48,21 @@ module_param(led_mode, int, S_IRUGO); + MODULE_PARM_DESC(led_mode, "0=system default, " + "1=On(RF On)/Off(RF Off), 2=blinking"); + ++/* Throughput OFF time(ms) ON time (ms) ++ * >300 25 25 ++ * >200 to 300 40 40 ++ * >100 to 200 55 55 ++ * >70 to 100 65 65 ++ * >50 to 70 75 75 ++ * >20 to 50 85 85 ++ * >10 to 20 95 95 ++ * >5 to 10 110 110 ++ * >1 to 5 130 130 ++ * >0 to 1 167 167 ++ * <=0 SOLID ON ++ */ + static const struct ieee80211_tpt_blink iwl_blink[] = { +- { .throughput = 0 * 1024 - 1, .blink_time = 334 }, ++ { .throughput = 0, .blink_time = 334 }, + { .throughput = 1 * 1024 - 1, .blink_time = 260 }, + { .throughput = 5 * 1024 - 1, .blink_time = 220 }, + { .throughput = 10 * 1024 - 1, .blink_time = 190 }, +@@ -101,6 +114,11 @@ static int iwl_legacy_led_cmd(struct iwl_priv *priv, + if (priv->blink_on == on && priv->blink_off == off) + return 0; + ++ if (off == 0) { ++ /* led is SOLID_ON */ ++ on = IWL_LED_SOLID; ++ } ++ + IWL_DEBUG_LED(priv, "Led blink time compensation=%u\n", + priv->cfg->base_params->led_compensation); + led_cmd.on = iwl_legacy_blink_compensation(priv, on, +diff --git a/drivers/net/wireless/iwlegacy/iwl4965-base.c b/drivers/net/wireless/iwlegacy/iwl4965-base.c +index d484c36..a62fe24 100644 +--- a/drivers/net/wireless/iwlegacy/iwl4965-base.c ++++ b/drivers/net/wireless/iwlegacy/iwl4965-base.c +@@ -2984,15 +2984,15 @@ static void iwl4965_bg_txpower_work(struct work_struct *work) + struct iwl_priv *priv = container_of(work, struct iwl_priv, + txpower_work); + ++ mutex_lock(&priv->mutex); ++ + /* If a scan happened to start before we got here + * then just return; the statistics notification will + * kick off another scheduled work to compensate for + * any temperature delta we missed here. */ + if (test_bit(STATUS_EXIT_PENDING, &priv->status) || + test_bit(STATUS_SCANNING, &priv->status)) +- return; +- +- mutex_lock(&priv->mutex); ++ goto out; + + /* Regardless of if we are associated, we must reconfigure the + * TX power since frames can be sent on non-radar channels while +@@ -3002,7 +3002,7 @@ static void iwl4965_bg_txpower_work(struct work_struct *work) + /* Update last_temperature to keep is_calib_needed from running + * when it isn't needed... */ + priv->last_temperature = priv->temperature; +- ++out: + mutex_unlock(&priv->mutex); + } + +diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c +index dfdbea6..fbbde07 100644 +--- a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c ++++ b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c +@@ -335,7 +335,6 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed) + struct ieee80211_channel *channel = conf->channel; + const struct iwl_channel_info *ch_info; + int ret = 0; +- bool ht_changed[NUM_IWL_RXON_CTX] = {}; + + IWL_DEBUG_MAC80211(priv, "changed %#x", changed); + +@@ -383,10 +382,8 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed) + + for_each_context(priv, ctx) { + /* Configure HT40 channels */ +- if (ctx->ht.enabled != conf_is_ht(conf)) { ++ if (ctx->ht.enabled != conf_is_ht(conf)) + ctx->ht.enabled = conf_is_ht(conf); +- ht_changed[ctx->ctxid] = true; +- } + + if (ctx->ht.enabled) { + if (conf_is_ht40_minus(conf)) { +@@ -455,8 +452,6 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed) + if (!memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging))) + continue; + iwlagn_commit_rxon(priv, ctx); +- if (ht_changed[ctx->ctxid]) +- iwlagn_update_qos(priv, ctx); + } + out: + mutex_unlock(&priv->mutex); +diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c +index a709d05..0712b67 100644 +--- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c ++++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c +@@ -568,12 +568,17 @@ int iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) + + hdr_len = ieee80211_hdrlen(fc); + +- /* Find index into station table for destination station */ +- sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta); +- if (sta_id == IWL_INVALID_STATION) { +- IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", +- hdr->addr1); +- goto drop_unlock; ++ /* For management frames use broadcast id to do not break aggregation */ ++ if (!ieee80211_is_data(fc)) ++ sta_id = ctx->bcast_sta_id; ++ else { ++ /* Find index into station table for destination station */ ++ sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta); ++ if (sta_id == IWL_INVALID_STATION) { ++ IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", ++ hdr->addr1); ++ goto drop_unlock; ++ } + } + + IWL_DEBUG_TX(priv, "station Id %d\n", sta_id); +@@ -1224,12 +1229,16 @@ int iwlagn_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index) + q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) { + + tx_info = &txq->txb[txq->q.read_ptr]; +- iwlagn_tx_status(priv, tx_info, +- txq_id >= IWLAGN_FIRST_AMPDU_QUEUE); ++ ++ if (WARN_ON_ONCE(tx_info->skb == NULL)) ++ continue; + + hdr = (struct ieee80211_hdr *)tx_info->skb->data; +- if (hdr && ieee80211_is_data_qos(hdr->frame_control)) ++ if (ieee80211_is_data_qos(hdr->frame_control)) + nfreed++; ++ ++ iwlagn_tx_status(priv, tx_info, ++ txq_id >= IWLAGN_FIRST_AMPDU_QUEUE); + tx_info->skb = NULL; + + if (priv->cfg->ops->lib->txq_inval_byte_cnt_tbl) diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c index fe77e82..e8c19de 100644 --- a/drivers/pcmcia/pcmcia_resource.c @@ -3147,6 +5970,42 @@ index 174036d..20494b5 100644 platform_set_drvdata(pdev, info); return 0; +diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c +index 29143ed..85dddb1 100644 +--- a/drivers/s390/block/dasd_diag.c ++++ b/drivers/s390/block/dasd_diag.c +@@ -239,7 +239,6 @@ static void dasd_ext_handler(unsigned int ext_int_code, + addr_t ip; + int rc; + +- kstat_cpu(smp_processor_id()).irqs[EXTINT_DSD]++; + switch (ext_int_code >> 24) { + case DASD_DIAG_CODE_31BIT: + ip = (addr_t) param32; +@@ -250,6 +249,7 @@ static void dasd_ext_handler(unsigned int ext_int_code, + default: + return; + } ++ kstat_cpu(smp_processor_id()).irqs[EXTINT_DSD]++; + if (!ip) { /* no intparm: unsolicited interrupt */ + DBF_EVENT(DBF_NOTICE, "%s", "caught unsolicited " + "interrupt"); +diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c +index 414427d..607998f 100644 +--- a/drivers/s390/kvm/kvm_virtio.c ++++ b/drivers/s390/kvm/kvm_virtio.c +@@ -381,10 +381,10 @@ static void kvm_extint_handler(unsigned int ext_int_code, + u16 subcode; + u32 param; + +- kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++; + subcode = ext_int_code >> 16; + if ((subcode & 0xff00) != VIRTIO_SUBCODE_64) + return; ++ kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++; + + /* The LSB might be overloaded, we have to mask it */ + vq = (struct virtqueue *)(param64 & ~1UL); diff --git a/drivers/scsi/device_handler/scsi_dh.c b/drivers/scsi/device_handler/scsi_dh.c index 564e6ec..0119b81 100644 --- a/drivers/scsi/device_handler/scsi_dh.c @@ -4010,6 +6869,155 @@ index b68f87a..938387a 100644 __u8 xe_type; /* the low 7 bits indicate the name prefix * type and the highest bit indicates whether * the EA is stored in the local storage. */ +diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c +index 4d0cb12..40fa780 100644 +--- a/fs/ubifs/log.c ++++ b/fs/ubifs/log.c +@@ -175,26 +175,6 @@ void ubifs_add_bud(struct ubifs_info *c, struct ubifs_bud *bud) + } + + /** +- * ubifs_create_buds_lists - create journal head buds lists for remount rw. +- * @c: UBIFS file-system description object +- */ +-void ubifs_create_buds_lists(struct ubifs_info *c) +-{ +- struct rb_node *p; +- +- spin_lock(&c->buds_lock); +- p = rb_first(&c->buds); +- while (p) { +- struct ubifs_bud *bud = rb_entry(p, struct ubifs_bud, rb); +- struct ubifs_jhead *jhead = &c->jheads[bud->jhead]; +- +- list_add_tail(&bud->list, &jhead->buds_list); +- p = rb_next(p); +- } +- spin_unlock(&c->buds_lock); +-} +- +-/** + * ubifs_add_bud_to_log - add a new bud to the log. + * @c: UBIFS file-system description object + * @jhead: journal head the bud belongs to +diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c +index eed0fcf..d3d6d36 100644 +--- a/fs/ubifs/replay.c ++++ b/fs/ubifs/replay.c +@@ -59,6 +59,7 @@ enum { + * @new_size: truncation new size + * @free: amount of free space in a bud + * @dirty: amount of dirty space in a bud from padding and deletion nodes ++ * @jhead: journal head number of the bud + * + * UBIFS journal replay must compare node sequence numbers, which means it must + * build a tree of node information to insert into the TNC. +@@ -80,6 +81,7 @@ struct replay_entry { + struct { + int free; + int dirty; ++ int jhead; + }; + }; + }; +@@ -159,6 +161,11 @@ static int set_bud_lprops(struct ubifs_info *c, struct replay_entry *r) + err = PTR_ERR(lp); + goto out; + } ++ ++ /* Make sure the journal head points to the latest bud */ ++ err = ubifs_wbuf_seek_nolock(&c->jheads[r->jhead].wbuf, r->lnum, ++ c->leb_size - r->free, UBI_SHORTTERM); ++ + out: + ubifs_release_lprops(c); + return err; +@@ -627,10 +634,6 @@ static int replay_bud(struct ubifs_info *c, int lnum, int offs, int jhead, + ubifs_assert(sleb->endpt - offs >= used); + ubifs_assert(sleb->endpt % c->min_io_size == 0); + +- if (sleb->endpt + c->min_io_size <= c->leb_size && !c->ro_mount) +- err = ubifs_wbuf_seek_nolock(&c->jheads[jhead].wbuf, lnum, +- sleb->endpt, UBI_SHORTTERM); +- + *dirty = sleb->endpt - offs - used; + *free = c->leb_size - sleb->endpt; + +@@ -653,12 +656,14 @@ out_dump: + * @sqnum: sequence number + * @free: amount of free space in bud + * @dirty: amount of dirty space from padding and deletion nodes ++ * @jhead: journal head number for the bud + * + * This function inserts a reference node to the replay tree and returns zero + * in case of success or a negative error code in case of failure. + */ + static int insert_ref_node(struct ubifs_info *c, int lnum, int offs, +- unsigned long long sqnum, int free, int dirty) ++ unsigned long long sqnum, int free, int dirty, ++ int jhead) + { + struct rb_node **p = &c->replay_tree.rb_node, *parent = NULL; + struct replay_entry *r; +@@ -688,6 +693,7 @@ static int insert_ref_node(struct ubifs_info *c, int lnum, int offs, + r->flags = REPLAY_REF; + r->free = free; + r->dirty = dirty; ++ r->jhead = jhead; + + rb_link_node(&r->rb, parent, p); + rb_insert_color(&r->rb, &c->replay_tree); +@@ -712,7 +718,7 @@ static int replay_buds(struct ubifs_info *c) + if (err) + return err; + err = insert_ref_node(c, b->bud->lnum, b->bud->start, b->sqnum, +- free, dirty); ++ free, dirty, b->bud->jhead); + if (err) + return err; + } +diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c +index be6c7b0..04ad07f 100644 +--- a/fs/ubifs/super.c ++++ b/fs/ubifs/super.c +@@ -1257,12 +1257,12 @@ static int mount_ubifs(struct ubifs_info *c) + goto out_free; + } + ++ err = alloc_wbufs(c); ++ if (err) ++ goto out_cbuf; ++ + sprintf(c->bgt_name, BGT_NAME_PATTERN, c->vi.ubi_num, c->vi.vol_id); + if (!c->ro_mount) { +- err = alloc_wbufs(c); +- if (err) +- goto out_cbuf; +- + /* Create background thread */ + c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name); + if (IS_ERR(c->bgt)) { +@@ -1631,12 +1631,6 @@ static int ubifs_remount_rw(struct ubifs_info *c) + if (err) + goto out; + +- err = alloc_wbufs(c); +- if (err) +- goto out; +- +- ubifs_create_buds_lists(c); +- + /* Create background thread */ + c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name); + if (IS_ERR(c->bgt)) { +@@ -1744,7 +1738,6 @@ static void ubifs_remount_ro(struct ubifs_info *c) + if (err) + ubifs_ro_mode(c, err); + +- free_wbufs(c); + vfree(c->orph_buf); + c->orph_buf = NULL; + kfree(c->write_reserve_buf); diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h index f22e7fe..ade09d7 100644 --- a/include/drm/drm_fb_helper.h @@ -4093,6 +7101,34 @@ index 78b101e..890dce2 100644 #define NFS_ATTR_FATTR (NFS_ATTR_FATTR_TYPE \ | NFS_ATTR_FATTR_MODE \ +diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h +index 4e2c915..8abe8d7 100644 +--- a/include/linux/pci_ids.h ++++ b/include/linux/pci_ids.h +@@ -2477,15 +2477,12 @@ + #define PCI_DEVICE_ID_INTEL_82840_HB 0x1a21 + #define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 + #define PCI_DEVICE_ID_INTEL_IOAT 0x1a38 +-#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 + #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN 0x1c41 + #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX 0x1c5f +-#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 + #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_0 0x1d40 + #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_1 0x1d41 + #define PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MIN 0x2310 + #define PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MAX 0x231f +-#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 + #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 + #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 + #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 +@@ -2696,7 +2693,6 @@ + #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 + #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN 0x3b00 + #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX 0x3b1f +-#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 + #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f + #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 + #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index d81db80..f73c482 100644 --- a/include/linux/sunrpc/sched.h @@ -4115,6 +7151,18 @@ index d81db80..f73c482 100644 #define RPC_TASK_RUNNING 0 #define RPC_TASK_QUEUED 1 +diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h +index 0e18550..605b0aa 100644 +--- a/include/linux/usb/usbnet.h ++++ b/include/linux/usb/usbnet.h +@@ -68,6 +68,7 @@ struct usbnet { + # define EVENT_RX_PAUSED 5 + # define EVENT_DEV_WAKING 6 + # define EVENT_DEV_ASLEEP 7 ++# define EVENT_DEV_OPEN 8 + }; + + static inline struct usb_driver *driver_of(struct usb_interface *intf) diff --git a/include/linux/v4l2-mediabus.h b/include/linux/v4l2-mediabus.h index 7054a7a..de5c159 100644 --- a/include/linux/v4l2-mediabus.h @@ -4245,6 +7293,50 @@ index 140dce7..14733d4 100644 goto out; } kthread_bind(p, cpu); +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index 8859a41..e3378e8 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -1291,8 +1291,14 @@ __acquires(&gcwq->lock) + return true; + spin_unlock_irq(&gcwq->lock); + +- /* CPU has come up in between, retry migration */ ++ /* ++ * We've raced with CPU hot[un]plug. Give it a breather ++ * and retry migration. cond_resched() is required here; ++ * otherwise, we might deadlock against cpu_stop trying to ++ * bring down the CPU on non-preemptive kernel. ++ */ + cpu_relax(); ++ cond_resched(); + } + } + +diff --git a/lib/xz/xz_dec_lzma2.c b/lib/xz/xz_dec_lzma2.c +index ea5fa4f..a6cdc96 100644 +--- a/lib/xz/xz_dec_lzma2.c ++++ b/lib/xz/xz_dec_lzma2.c +@@ -969,6 +969,9 @@ XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s, + */ + tmp = b->in[b->in_pos++]; + ++ if (tmp == 0x00) ++ return XZ_STREAM_END; ++ + if (tmp >= 0xE0 || tmp == 0x01) { + s->lzma2.need_props = true; + s->lzma2.need_dict_reset = false; +@@ -1001,9 +1004,6 @@ XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s, + lzma_reset(s); + } + } else { +- if (tmp == 0x00) +- return XZ_STREAM_END; +- + if (tmp > 0x02) + return XZ_DATA_ERROR; + diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 470dcda..83326ad 100644 --- a/mm/huge_memory.c @@ -4376,6 +7468,345 @@ index 83fb72c1..f52e85c 100644 task_unlock(p); /* +diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c +index c83f618..b5a8afc 100644 +--- a/net/bluetooth/hci_core.c ++++ b/net/bluetooth/hci_core.c +@@ -587,10 +587,8 @@ static int hci_dev_do_close(struct hci_dev *hdev) + hci_req_cancel(hdev, ENODEV); + hci_req_lock(hdev); + +- /* Stop timer, it might be running */ +- del_timer_sync(&hdev->cmd_timer); +- + if (!test_and_clear_bit(HCI_UP, &hdev->flags)) { ++ del_timer_sync(&hdev->cmd_timer); + hci_req_unlock(hdev); + return 0; + } +@@ -629,6 +627,7 @@ static int hci_dev_do_close(struct hci_dev *hdev) + + /* Drop last sent command */ + if (hdev->sent_cmd) { ++ del_timer_sync(&hdev->cmd_timer); + kfree_skb(hdev->sent_cmd); + hdev->sent_cmd = NULL; + } +diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c +index cebe7588..b257015 100644 +--- a/net/bluetooth/hci_event.c ++++ b/net/bluetooth/hci_event.c +@@ -2387,8 +2387,6 @@ static inline void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *s + if (!conn) + goto unlock; + +- hci_conn_hold(conn); +- + conn->remote_cap = ev->capability; + conn->remote_oob = ev->oob_data; + conn->remote_auth = ev->authentication; +diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c +index ca27f3a..2c8dd44 100644 +--- a/net/bluetooth/l2cap_core.c ++++ b/net/bluetooth/l2cap_core.c +@@ -1051,6 +1051,7 @@ static void l2cap_retransmit_one_frame(struct sock *sk, u8 tx_seq) + tx_skb = skb_clone(skb, GFP_ATOMIC); + bt_cb(skb)->retries++; + control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); ++ control &= L2CAP_CTRL_SAR; + + if (pi->conn_state & L2CAP_CONN_SEND_FBIT) { + control |= L2CAP_CTRL_FINAL; +diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c +index 42fdffd..94954c7 100644 +--- a/net/bluetooth/sco.c ++++ b/net/bluetooth/sco.c +@@ -369,6 +369,15 @@ static void __sco_sock_close(struct sock *sk) + + case BT_CONNECTED: + case BT_CONFIG: ++ if (sco_pi(sk)->conn) { ++ sk->sk_state = BT_DISCONN; ++ sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT); ++ hci_conn_put(sco_pi(sk)->conn->hcon); ++ sco_pi(sk)->conn = NULL; ++ } else ++ sco_chan_del(sk, ECONNRESET); ++ break; ++ + case BT_CONNECT: + case BT_DISCONN: + sco_chan_del(sk, ECONNRESET); +diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c +index e216079..0c7bada 100644 +--- a/net/bridge/br_input.c ++++ b/net/bridge/br_input.c +@@ -164,7 +164,7 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb) + goto drop; + + /* If STP is turned off, then forward */ +- if (p->br->stp_enabled == BR_NO_STP) ++ if (p->br->stp_enabled == BR_NO_STP && dest[5] == 0) + goto forward; + + if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev, +diff --git a/net/can/bcm.c b/net/can/bcm.c +index 57b1aed..8a6a05e 100644 +--- a/net/can/bcm.c ++++ b/net/can/bcm.c +@@ -1427,9 +1427,14 @@ static int bcm_init(struct sock *sk) + static int bcm_release(struct socket *sock) + { + struct sock *sk = sock->sk; +- struct bcm_sock *bo = bcm_sk(sk); ++ struct bcm_sock *bo; + struct bcm_op *op, *next; + ++ if (sk == NULL) ++ return 0; ++ ++ bo = bcm_sk(sk); ++ + /* remove bcm_ops, timer, rx_unregister(), etc. */ + + unregister_netdevice_notifier(&bo->notifier); +diff --git a/net/can/raw.c b/net/can/raw.c +index 649acfa..0eb39a7 100644 +--- a/net/can/raw.c ++++ b/net/can/raw.c +@@ -305,7 +305,12 @@ static int raw_init(struct sock *sk) + static int raw_release(struct socket *sock) + { + struct sock *sk = sock->sk; +- struct raw_sock *ro = raw_sk(sk); ++ struct raw_sock *ro; ++ ++ if (!sk) ++ return 0; ++ ++ ro = raw_sk(sk); + + unregister_netdevice_notifier(&ro->notifier); + +diff --git a/net/core/dev.c b/net/core/dev.c +index c2ac599..856b6ee 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -4773,7 +4773,7 @@ static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cm + * is never reached + */ + WARN_ON(1); +- err = -EINVAL; ++ err = -ENOTTY; + break; + + } +@@ -5041,7 +5041,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg) + /* Set the per device memory buffer space. + * Not applicable in our case */ + case SIOCSIFLINK: +- return -EINVAL; ++ return -ENOTTY; + + /* + * Unknown or private ioctl. +@@ -5062,7 +5062,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg) + /* Take care of Wireless Extensions */ + if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) + return wext_handle_ioctl(net, &ifr, cmd, arg); +- return -EINVAL; ++ return -ENOTTY; + } + } + +diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig +index 87bb5f4..c53ded2 100644 +--- a/net/dsa/Kconfig ++++ b/net/dsa/Kconfig +@@ -41,12 +41,12 @@ config NET_DSA_MV88E6XXX_NEED_PPU + default n + + config NET_DSA_MV88E6131 +- bool "Marvell 88E6095/6095F/6131 ethernet switch chip support" ++ bool "Marvell 88E6085/6095/6095F/6131 ethernet switch chip support" + select NET_DSA_MV88E6XXX + select NET_DSA_MV88E6XXX_NEED_PPU + select NET_DSA_TAG_DSA + ---help--- +- This enables support for the Marvell 88E6095/6095F/6131 ++ This enables support for the Marvell 88E6085/6095/6095F/6131 + ethernet switch chips. + + config NET_DSA_MV88E6123_61_65 +diff --git a/net/dsa/mv88e6131.c b/net/dsa/mv88e6131.c +index 3da4188..45f7411 100644 +--- a/net/dsa/mv88e6131.c ++++ b/net/dsa/mv88e6131.c +@@ -207,8 +207,15 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p) + * mode, but do not enable forwarding of unknown unicasts. + */ + val = 0x0433; +- if (p == dsa_upstream_port(ds)) ++ if (p == dsa_upstream_port(ds)) { + val |= 0x0104; ++ /* ++ * On 6085, unknown multicast forward is controlled ++ * here rather than in Port Control 2 register. ++ */ ++ if (ps->id == ID_6085) ++ val |= 0x0008; ++ } + if (ds->dsa_port_mask & (1 << p)) + val |= 0x0100; + REG_WRITE(addr, 0x04, val); +@@ -251,10 +258,19 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p) + * If this is the upstream port for this switch, enable + * forwarding of unknown multicast addresses. + */ +- val = 0x0080 | dsa_upstream_port(ds); +- if (p == dsa_upstream_port(ds)) +- val |= 0x0040; +- REG_WRITE(addr, 0x08, val); ++ if (ps->id == ID_6085) ++ /* ++ * on 6085, bits 3:0 are reserved, bit 6 control ARP ++ * mirroring, and multicast forward is handled in ++ * Port Control register. ++ */ ++ REG_WRITE(addr, 0x08, 0x0080); ++ else { ++ val = 0x0080 | dsa_upstream_port(ds); ++ if (p == dsa_upstream_port(ds)) ++ val |= 0x0040; ++ REG_WRITE(addr, 0x08, val); ++ } + + /* + * Rate Control: disable ingress rate limiting. +diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c +index 5345b0b..cd9ca08 100644 +--- a/net/ipv4/devinet.c ++++ b/net/ipv4/devinet.c +@@ -1680,7 +1680,7 @@ static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf) + return; + + cnf->sysctl = NULL; +- unregister_sysctl_table(t->sysctl_header); ++ unregister_net_sysctl_table(t->sysctl_header); + kfree(t->dev_name); + kfree(t); + } +diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c +index e9013d6..5fe9b8b 100644 +--- a/net/ipv4/fib_trie.c ++++ b/net/ipv4/fib_trie.c +@@ -1978,9 +1978,6 @@ struct fib_table *fib_trie_table(u32 id) + t = (struct trie *) tb->tb_data; + memset(t, 0, sizeof(*t)); + +- if (id == RT_TABLE_LOCAL) +- pr_info("IPv4 FIB: Using LC-trie version %s\n", VERSION); +- + return tb; + } + +diff --git a/net/ipv4/route.c b/net/ipv4/route.c +index c1acf69..99e6e4b 100644 +--- a/net/ipv4/route.c ++++ b/net/ipv4/route.c +@@ -2690,6 +2690,12 @@ static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu) + { + } + ++static u32 *ipv4_rt_blackhole_cow_metrics(struct dst_entry *dst, ++ unsigned long old) ++{ ++ return NULL; ++} ++ + static struct dst_ops ipv4_dst_blackhole_ops = { + .family = AF_INET, + .protocol = cpu_to_be16(ETH_P_IP), +@@ -2698,6 +2704,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = { + .default_mtu = ipv4_blackhole_default_mtu, + .default_advmss = ipv4_default_advmss, + .update_pmtu = ipv4_rt_blackhole_update_pmtu, ++ .cow_metrics = ipv4_rt_blackhole_cow_metrics, + }; + + struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_orig) +diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c +index 1493534..a7bda07 100644 +--- a/net/ipv6/addrconf.c ++++ b/net/ipv6/addrconf.c +@@ -4537,7 +4537,7 @@ static void __addrconf_sysctl_unregister(struct ipv6_devconf *p) + + t = p->sysctl; + p->sysctl = NULL; +- unregister_sysctl_table(t->sysctl_header); ++ unregister_net_sysctl_table(t->sysctl_header); + kfree(t->dev_name); + kfree(t); + } +diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c +index 5aa8ec8..59dccfb 100644 +--- a/net/ipv6/esp6.c ++++ b/net/ipv6/esp6.c +@@ -371,7 +371,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb) + iv = esp_tmp_iv(aead, tmp, seqhilen); + req = esp_tmp_req(aead, iv); + asg = esp_req_sg(aead, req); +- sg = asg + 1; ++ sg = asg + sglists; + + skb->ip_summed = CHECKSUM_NONE; + +diff --git a/net/ipv6/route.c b/net/ipv6/route.c +index 843406f..fd0eec6 100644 +--- a/net/ipv6/route.c ++++ b/net/ipv6/route.c +@@ -153,6 +153,12 @@ static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu) + { + } + ++static u32 *ip6_rt_blackhole_cow_metrics(struct dst_entry *dst, ++ unsigned long old) ++{ ++ return NULL; ++} ++ + static struct dst_ops ip6_dst_blackhole_ops = { + .family = AF_INET6, + .protocol = cpu_to_be16(ETH_P_IPV6), +@@ -161,6 +167,7 @@ static struct dst_ops ip6_dst_blackhole_ops = { + .default_mtu = ip6_blackhole_default_mtu, + .default_advmss = ip6_default_advmss, + .update_pmtu = ip6_rt_blackhole_update_pmtu, ++ .cow_metrics = ip6_rt_blackhole_cow_metrics, + }; + + static const u32 ip6_template_metrics[RTAX_MAX] = { +@@ -2012,7 +2019,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, + rt->dst.output = ip6_output; + rt->rt6i_dev = net->loopback_dev; + rt->rt6i_idev = idev; +- dst_metric_set(&rt->dst, RTAX_HOPLIMIT, -1); + rt->dst.obsolete = -1; + + rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP; +diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c +index 15c3774..9e305d74 100644 +--- a/net/ipv6/udp.c ++++ b/net/ipv6/udp.c +@@ -1335,7 +1335,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, u32 features) + skb->ip_summed = CHECKSUM_NONE; + + /* Check if there is enough headroom to insert fragment header. */ +- if ((skb_headroom(skb) < frag_hdr_sz) && ++ if ((skb_mac_header(skb) < skb->head + frag_hdr_sz) && + pskb_expand_head(skb, frag_hdr_sz, 0, GFP_ATOMIC)) + goto out; + diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index fce9bd3..5c04f3e 100644 --- a/net/l2tp/l2tp_ip.c @@ -4389,6 +7820,35 @@ index fce9bd3..5c04f3e 100644 * enums */ MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 2, IPPROTO_L2TP); +diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c +index 3342135..4404973 100644 +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -1504,6 +1504,8 @@ int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata, + enum ieee80211_smps_mode old_req; + int err; + ++ lockdep_assert_held(&sdata->u.mgd.mtx); ++ + old_req = sdata->u.mgd.req_smps; + sdata->u.mgd.req_smps = smps_mode; + +diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c +index dacace6..9ea7c0d 100644 +--- a/net/mac80211/debugfs_netdev.c ++++ b/net/mac80211/debugfs_netdev.c +@@ -177,9 +177,9 @@ static int ieee80211_set_smps(struct ieee80211_sub_if_data *sdata, + if (sdata->vif.type != NL80211_IFTYPE_STATION) + return -EOPNOTSUPP; + +- mutex_lock(&local->iflist_mtx); ++ mutex_lock(&sdata->u.mgd.mtx); + err = __ieee80211_request_smps(sdata, smps_mode); +- mutex_unlock(&local->iflist_mtx); ++ mutex_unlock(&sdata->u.mgd.mtx); + + return err; + } diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c index dff27d5..61b1f5a 100644 --- a/net/sctp/ulpevent.c @@ -4481,6 +7941,74 @@ index 9494c37..ce5eb68 100644 spin_lock_bh(&xprt->transport_lock); xprt->ops->set_retrans_timeout(task); +diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c +index 3a43a83..b1d75be 100644 +--- a/net/unix/af_unix.c ++++ b/net/unix/af_unix.c +@@ -524,6 +524,8 @@ static int unix_dgram_connect(struct socket *, struct sockaddr *, + int, int); + static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *, + struct msghdr *, size_t); ++static int unix_seqpacket_recvmsg(struct kiocb *, struct socket *, ++ struct msghdr *, size_t, int); + + static const struct proto_ops unix_stream_ops = { + .family = PF_UNIX, +@@ -583,7 +585,7 @@ static const struct proto_ops unix_seqpacket_ops = { + .setsockopt = sock_no_setsockopt, + .getsockopt = sock_no_getsockopt, + .sendmsg = unix_seqpacket_sendmsg, +- .recvmsg = unix_dgram_recvmsg, ++ .recvmsg = unix_seqpacket_recvmsg, + .mmap = sock_no_mmap, + .sendpage = sock_no_sendpage, + }; +@@ -1699,6 +1701,18 @@ static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock, + return unix_dgram_sendmsg(kiocb, sock, msg, len); + } + ++static int unix_seqpacket_recvmsg(struct kiocb *iocb, struct socket *sock, ++ struct msghdr *msg, size_t size, ++ int flags) ++{ ++ struct sock *sk = sock->sk; ++ ++ if (sk->sk_state != TCP_ESTABLISHED) ++ return -ENOTCONN; ++ ++ return unix_dgram_recvmsg(iocb, sock, msg, size, flags); ++} ++ + static void unix_copy_addr(struct msghdr *msg, struct sock *sk) + { + struct unix_sock *u = unix_sk(sk); +diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c +index f218385..e8a7814 100644 +--- a/net/xfrm/xfrm_replay.c ++++ b/net/xfrm/xfrm_replay.c +@@ -532,7 +532,7 @@ int xfrm_init_replay(struct xfrm_state *x) + + if (replay_esn) { + if (replay_esn->replay_window > +- replay_esn->bmp_len * sizeof(__u32)) ++ replay_esn->bmp_len * sizeof(__u32) * 8) + return -EINVAL; + + if ((x->props.flags & XFRM_STATE_ESN) && x->replay_esn) +diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c +index 5d1d60d..c658cb3 100644 +--- a/net/xfrm/xfrm_user.c ++++ b/net/xfrm/xfrm_user.c +@@ -124,6 +124,9 @@ static inline int verify_replay(struct xfrm_usersa_info *p, + { + struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL]; + ++ if ((p->flags & XFRM_STATE_ESN) && !rt) ++ return -EINVAL; ++ + if (!rt) + return 0; + diff --git a/sound/aoa/codecs/tas.c b/sound/aoa/codecs/tas.c index 58804c7..fd2188c 100644 --- a/sound/aoa/codecs/tas.c @@ -4494,3 +8022,192 @@ index 58804c7..fd2188c 100644 * is 1, at a value of 0x07f17b (mixer table * value is 0x07f17a) */ tmp = tas_gaintable[left]; +diff --git a/sound/pci/au88x0/au88x0_pcm.c b/sound/pci/au88x0/au88x0_pcm.c +index 33f0ba5..62e9591 100644 +--- a/sound/pci/au88x0/au88x0_pcm.c ++++ b/sound/pci/au88x0/au88x0_pcm.c +@@ -44,10 +44,10 @@ static struct snd_pcm_hardware snd_vortex_playback_hw_adb = { + .channels_min = 1, + .channels_max = 2, + .buffer_bytes_max = 0x10000, +- .period_bytes_min = 0x1, ++ .period_bytes_min = 0x20, + .period_bytes_max = 0x1000, + .periods_min = 2, +- .periods_max = 32, ++ .periods_max = 1024, + }; + + #ifndef CHIP_AU8820 +@@ -140,6 +140,9 @@ static int snd_vortex_pcm_open(struct snd_pcm_substream *substream) + SNDRV_PCM_HW_PARAM_PERIOD_BYTES)) < 0) + return err; + ++ snd_pcm_hw_constraint_step(runtime, 0, ++ SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 64); ++ + if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) { + #ifndef CHIP_AU8820 + if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_A3D) { +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index d3bd2c1..c82979a 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -1704,11 +1704,11 @@ static void alc_apply_fixup(struct hda_codec *codec, int action) + codec->chip_name, fix->type); + break; + } +- if (!fix[id].chained) ++ if (!fix->chained) + break; + if (++depth > 10) + break; +- id = fix[id].chain_id; ++ id = fix->chain_id; + } + } + +@@ -5645,6 +5645,7 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, + static struct snd_pci_quirk beep_white_list[] = { + SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), + SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1), ++ SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1), + SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), + {} + }; +@@ -9863,6 +9864,7 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = { + SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), + SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL), + SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch), ++ SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG), + + SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG), + SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG), +@@ -10699,7 +10701,6 @@ enum { + PINFIX_LENOVO_Y530, + PINFIX_PB_M5210, + PINFIX_ACER_ASPIRE_7736, +- PINFIX_GIGABYTE_880GM, + }; + + static const struct alc_fixup alc882_fixups[] = { +@@ -10731,13 +10732,6 @@ static const struct alc_fixup alc882_fixups[] = { + .type = ALC_FIXUP_SKU, + .v.sku = ALC_FIXUP_SKU_IGNORE, + }, +- [PINFIX_GIGABYTE_880GM] = { +- .type = ALC_FIXUP_PINS, +- .v.pins = (const struct alc_pincfg[]) { +- { 0x14, 0x1114410 }, /* set as speaker */ +- { } +- } +- }, + }; + + static struct snd_pci_quirk alc882_fixup_tbl[] = { +@@ -10745,7 +10739,6 @@ static struct snd_pci_quirk alc882_fixup_tbl[] = { + SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", PINFIX_LENOVO_Y530), + SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), + SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", PINFIX_ACER_ASPIRE_7736), +- SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte", PINFIX_GIGABYTE_880GM), + {} + }; + +@@ -18805,6 +18798,8 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { + ALC662_3ST_6ch_DIG), + SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO), + SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), ++ SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", ++ ALC662_3ST_6ch_DIG), + SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13), + SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), + SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA), +@@ -19478,7 +19473,7 @@ enum { + ALC662_FIXUP_IDEAPAD, + ALC272_FIXUP_MARIO, + ALC662_FIXUP_CZC_P10T, +- ALC662_FIXUP_GIGABYTE, ++ ALC662_FIXUP_SKU_IGNORE, + }; + + static const struct alc_fixup alc662_fixups[] = { +@@ -19507,20 +19502,17 @@ static const struct alc_fixup alc662_fixups[] = { + {} + } + }, +- [ALC662_FIXUP_GIGABYTE] = { +- .type = ALC_FIXUP_PINS, +- .v.pins = (const struct alc_pincfg[]) { +- { 0x14, 0x1114410 }, /* set as speaker */ +- { } +- } ++ [ALC662_FIXUP_SKU_IGNORE] = { ++ .type = ALC_FIXUP_SKU, ++ .v.sku = ALC_FIXUP_SKU_IGNORE, + }, + }; + + static struct snd_pci_quirk alc662_fixup_tbl[] = { + SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE), ++ SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE), + SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), + SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), +- SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte", ALC662_FIXUP_GIGABYTE), + SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), + SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), + SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T), +diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c +index 1371b57..0997031 100644 +--- a/sound/pci/hda/patch_via.c ++++ b/sound/pci/hda/patch_via.c +@@ -1292,14 +1292,18 @@ static void notify_aa_path_ctls(struct hda_codec *codec) + { + int i; + struct snd_ctl_elem_id id; +- const char *labels[] = {"Mic", "Front Mic", "Line"}; ++ const char *labels[] = {"Mic", "Front Mic", "Line", "Rear Mic"}; ++ struct snd_kcontrol *ctl; + + memset(&id, 0, sizeof(id)); + id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; + for (i = 0; i < ARRAY_SIZE(labels); i++) { + sprintf(id.name, "%s Playback Volume", labels[i]); +- snd_ctl_notify(codec->bus->card, SNDRV_CTL_EVENT_MASK_VALUE, +- &id); ++ ctl = snd_hda_find_mixer_ctl(codec, id.name); ++ if (ctl) ++ snd_ctl_notify(codec->bus->card, ++ SNDRV_CTL_EVENT_MASK_VALUE, ++ &ctl->id); + } + } + +diff --git a/sound/usb/format.c b/sound/usb/format.c +index 5b792d2..f079b5e 100644 +--- a/sound/usb/format.c ++++ b/sound/usb/format.c +@@ -176,9 +176,11 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof + if (!rate) + continue; + /* C-Media CM6501 mislabels its 96 kHz altsetting */ ++ /* Terratec Aureon 7.1 USB C-Media 6206, too */ + if (rate == 48000 && nr_rates == 1 && + (chip->usb_id == USB_ID(0x0d8c, 0x0201) || +- chip->usb_id == USB_ID(0x0d8c, 0x0102)) && ++ chip->usb_id == USB_ID(0x0d8c, 0x0102) || ++ chip->usb_id == USB_ID(0x0ccd, 0x00b1)) && + fp->altsetting == 5 && fp->maxpacksize == 392) + rate = 96000; + /* Creative VF0470 Live Cam reports 16 kHz instead of 8kHz */ +diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c +index ec07e62..1b94ec3 100644 +--- a/sound/usb/quirks.c ++++ b/sound/usb/quirks.c +@@ -533,6 +533,7 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev, + + case USB_ID(0x0d8c, 0x0102): + /* C-Media CM6206 / CM106-Like Sound Device */ ++ case USB_ID(0x0ccd, 0x00b1): /* Terratec Aureon 7.1 USB */ + return snd_usb_cm6206_boot_quirk(dev); + + case USB_ID(0x133e, 0x0815): From 0c40ddbad698a9039e0d69064643285f77c2831c Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Tue, 3 May 2011 19:23:03 +0200 Subject: [PATCH 3/9] busybox: add remote log support Signed-off-by: Stephan Raue --- packages/sysutils/busybox/config/busybox.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sysutils/busybox/config/busybox.conf b/packages/sysutils/busybox/config/busybox.conf index c547bae270..b61494e50c 100644 --- a/packages/sysutils/busybox/config/busybox.conf +++ b/packages/sysutils/busybox/config/busybox.conf @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Busybox version: 1.18.4 -# Tue Apr 12 14:24:15 2011 +# Tue May 3 19:22:30 2011 # CONFIG_HAVE_DOT_CONFIG=y @@ -966,7 +966,7 @@ CONFIG_FEATURE_SH_EXTRA_QUIET=y # CONFIG_SYSLOGD=y CONFIG_FEATURE_ROTATE_LOGFILE=y -# CONFIG_FEATURE_REMOTE_LOG is not set +CONFIG_FEATURE_REMOTE_LOG=y CONFIG_FEATURE_SYSLOGD_DUP=y CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256 CONFIG_FEATURE_IPC_SYSLOG=y From eb48bb00d2bf87937be2cc2a63e87d53ce66672b Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 4 May 2011 04:23:57 +0200 Subject: [PATCH 4/9] bluez: update to bluez-4.93 Signed-off-by: Stephan Raue --- packages/network/bluez/meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/network/bluez/meta b/packages/network/bluez/meta index 1d72079cb8..2a05930025 100644 --- a/packages/network/bluez/meta +++ b/packages/network/bluez/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="bluez" -PKG_VERSION="4.92" +PKG_VERSION="4.93" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" From eef4e10ab50747e5f03f11f9fd69dc144eb90322 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 4 May 2011 04:25:06 +0200 Subject: [PATCH 5/9] xbmc: add ugly hack to manage systemwide installed PIL to work (bought from fedora) Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc/install | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/mediacenter/xbmc/install b/packages/mediacenter/xbmc/install index 58d9f182bf..1753b43cf8 100755 --- a/packages/mediacenter/xbmc/install +++ b/packages/mediacenter/xbmc/install @@ -55,6 +55,12 @@ mkdir -p $INSTALL/usr/share/xbmc/media # cp $PKG_DIR/splash/splash.png $INSTALL/usr/share/xbmc/media/Splash.png # fi +# cleanup and python addon fixes + mkdir -p $INSTALL/usr/share/xbmc/addons/script.module.pil/lib + ln -s `ls -d $INSTALL/usr/lib/python*/site-packages | sed -e "s,$INSTALL,,"`/PIL \ + $INSTALL/usr/share/xbmc/addons/script.module.pil/lib/PIL + rm -rf $INSTALL/usr/share/xbmc/addons/script.module.pysqlite + mkdir -p $INSTALL/usr/share/xbmc/addons cp -R $PKG_DIR/config/os.openelec.tv $INSTALL/usr/share/xbmc/addons $SED "s|@ADDON_OS_VERSION@|$OS_VERSION|g" -i $INSTALL/usr/share/xbmc/addons/os.openelec.tv/addon.xml From adc8d203ab126a792661421191a7ec1a907daa1a Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 4 May 2011 05:28:05 +0200 Subject: [PATCH 6/9] projects/*/options: enable build of imonlcd module per default on all supported builds Signed-off-by: Stephan Raue --- projects/Generic/options | 2 +- projects/Intel/options | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/projects/Generic/options b/projects/Generic/options index 1b412f914c..0feb0b39ee 100644 --- a/projects/Generic/options +++ b/projects/Generic/options @@ -208,7 +208,7 @@ # 'all' compiles all drivers; # 'all,!xxx,!yyy' de-selects previously selected drivers # "none" for disable LCD support - LCD_DRIVER="irtrans,imon" + LCD_DRIVER="irtrans,imon,imonlcd" # additional Firmware to use (dvb-firmware, wlan-firmware) # Space separated list is supported, diff --git a/projects/Intel/options b/projects/Intel/options index 9c6a87419b..4d8971b7c5 100644 --- a/projects/Intel/options +++ b/projects/Intel/options @@ -208,7 +208,7 @@ # 'all' compiles all drivers; # 'all,!xxx,!yyy' de-selects previously selected drivers # "none" for disable LCD support - LCD_DRIVER="irtrans,imon" + LCD_DRIVER="irtrans,imon,imonlcd" # additional Firmware to use (dvb-firmware, wlan-firmware) # Space separated list is supported, From c4d4c049e98b58d2dda6a04f51343be8f7488bc8 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 4 May 2011 05:28:30 +0200 Subject: [PATCH 7/9] xbmc-addon-settings: add imonlcd support Signed-off-by: Stephan Raue --- packages/mediacenter/xbmc-addon-settings/source/addon.xml | 2 +- packages/mediacenter/xbmc-addon-settings/source/default.py | 2 +- .../xbmc-addon-settings/source/resources/settings.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mediacenter/xbmc-addon-settings/source/addon.xml b/packages/mediacenter/xbmc-addon-settings/source/addon.xml index b336d1425b..e906c3cfb3 100644 --- a/packages/mediacenter/xbmc-addon-settings/source/addon.xml +++ b/packages/mediacenter/xbmc-addon-settings/source/addon.xml @@ -1,7 +1,7 @@ diff --git a/packages/mediacenter/xbmc-addon-settings/source/default.py b/packages/mediacenter/xbmc-addon-settings/source/default.py index 56513f7138..ba0e9bfbc6 100644 --- a/packages/mediacenter/xbmc-addon-settings/source/default.py +++ b/packages/mediacenter/xbmc-addon-settings/source/default.py @@ -27,7 +27,7 @@ __author__ = "OpenELEC" __url__ = "http://www.openelec.tv" __svn_url__ = "" __credits__ = "" -__version__ = "0.0.7" +__version__ = "0.0.8" __XBMC_Revision__ = "22240" __settings__ = xbmcaddon.Addon(id='os.openelec.settings') diff --git a/packages/mediacenter/xbmc-addon-settings/source/resources/settings.xml b/packages/mediacenter/xbmc-addon-settings/source/resources/settings.xml index e945aa5dba..493b522f7f 100644 --- a/packages/mediacenter/xbmc-addon-settings/source/resources/settings.xml +++ b/packages/mediacenter/xbmc-addon-settings/source/resources/settings.xml @@ -11,7 +11,7 @@ - + From abfcf511b867f593354f08f5730ae130eab2def5 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 4 May 2011 07:50:32 +0200 Subject: [PATCH 8/9] linux: update to linux-2.6.39-rc6 Signed-off-by: Stephan Raue --- packages/linux/meta | 2 +- ...2.6.39-rc5-000-linux-2.6.39-rc5-git7.patch | 8213 ----------------- ...> linux-2.6.39-rc6-000_crosscompile.patch} | 0 ...ux-2.6.39-rc6-002_bash_only_feature.patch} | 0 ...linux-2.6.39-rc6-003-no_dev_console.patch} | 0 ...c6-004_lower_undefined_mode_timeout.patch} | 0 ...2.6.39-rc6-005_kconfig_no_timestamp.patch} | 0 ...=> linux-2.6.39-rc6-006_enable_utf8.patch} | 0 ...linux-2.6.39-rc6-007_die_floppy_die.patch} | 0 ...08-hda_intel_prealloc_4mb_dmabuffer.patch} | 0 ...09_disable_i8042_check_on_apple_mac.patch} | 0 ...6.39-rc6-050_add_appleir_usb_driver.patch} | 0 ....39-rc6-052-aureal_remote_quirk-0.1.patch} | 0 ...i-remote_all_keys_and_keychange-0.1.patch} | 0 ...n-cir-only-warn-about-unknown-chips.patch} | 0 ...enable-CIR-on-w83667hg-chip-variant.patch} | 0 ...c6-056_mceusb_add_DELL_receiver-0.1.patch} | 0 ...2.6.39-rc6-057_ite-resume-debug-0.1.patch} | 0 ...rc6-071-silence_i915_agp-module-0.1.patch} | 0 ...map4_pandaboard_fix_dvi_support-0.1.patch} | 0 ...x-2.6.39-rc6-716_mm-zero_swappiness.patch} | 0 21 files changed, 1 insertion(+), 8214 deletions(-) delete mode 100644 packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git7.patch rename packages/linux/patches/{linux-2.6.39-rc5-000_crosscompile.patch => linux-2.6.39-rc6-000_crosscompile.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-002_bash_only_feature.patch => linux-2.6.39-rc6-002_bash_only_feature.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-003-no_dev_console.patch => linux-2.6.39-rc6-003-no_dev_console.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-004_lower_undefined_mode_timeout.patch => linux-2.6.39-rc6-004_lower_undefined_mode_timeout.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-005_kconfig_no_timestamp.patch => linux-2.6.39-rc6-005_kconfig_no_timestamp.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-006_enable_utf8.patch => linux-2.6.39-rc6-006_enable_utf8.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-007_die_floppy_die.patch => linux-2.6.39-rc6-007_die_floppy_die.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-008-hda_intel_prealloc_4mb_dmabuffer.patch => linux-2.6.39-rc6-008-hda_intel_prealloc_4mb_dmabuffer.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-009_disable_i8042_check_on_apple_mac.patch => linux-2.6.39-rc6-009_disable_i8042_check_on_apple_mac.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-050_add_appleir_usb_driver.patch => linux-2.6.39-rc6-050_add_appleir_usb_driver.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-052-aureal_remote_quirk-0.1.patch => linux-2.6.39-rc6-052-aureal_remote_quirk-0.1.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-053_ati-remote_all_keys_and_keychange-0.1.patch => linux-2.6.39-rc6-053_ati-remote_all_keys_and_keychange-0.1.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-054_nuvoton-cir-only-warn-about-unknown-chips.patch => linux-2.6.39-rc6-054_nuvoton-cir-only-warn-about-unknown-chips.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-055_nuvoton-cir-enable-CIR-on-w83667hg-chip-variant.patch => linux-2.6.39-rc6-055_nuvoton-cir-enable-CIR-on-w83667hg-chip-variant.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-056_mceusb_add_DELL_receiver-0.1.patch => linux-2.6.39-rc6-056_mceusb_add_DELL_receiver-0.1.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-057_ite-resume-debug-0.1.patch => linux-2.6.39-rc6-057_ite-resume-debug-0.1.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-071-silence_i915_agp-module-0.1.patch => linux-2.6.39-rc6-071-silence_i915_agp-module-0.1.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-322-omap4_pandaboard_fix_dvi_support-0.1.patch => linux-2.6.39-rc6-322-omap4_pandaboard_fix_dvi_support-0.1.patch} (100%) rename packages/linux/patches/{linux-2.6.39-rc5-716_mm-zero_swappiness.patch => linux-2.6.39-rc6-716_mm-zero_swappiness.patch} (100%) diff --git a/packages/linux/meta b/packages/linux/meta index 90a863f44a..284ef7f368 100644 --- a/packages/linux/meta +++ b/packages/linux/meta @@ -19,7 +19,7 @@ ################################################################################ PKG_NAME="linux" -PKG_VERSION="2.6.39-rc5" +PKG_VERSION="2.6.39-rc6" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git7.patch b/packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git7.patch deleted file mode 100644 index 43ec39c059..0000000000 --- a/packages/linux/patches/linux-2.6.39-rc5-000-linux-2.6.39-rc5-git7.patch +++ /dev/null @@ -1,8213 +0,0 @@ -diff --git a/Documentation/DocBook/media-entities.tmpl b/Documentation/DocBook/media-entities.tmpl -index 5d259c6..fea63b4 100644 ---- a/Documentation/DocBook/media-entities.tmpl -+++ b/Documentation/DocBook/media-entities.tmpl -@@ -294,6 +294,7 @@ - - - -+ - - - -diff --git a/Documentation/DocBook/v4l/media-ioc-setup-link.xml b/Documentation/DocBook/v4l/media-ioc-setup-link.xml -index 2331e76..cec97af 100644 ---- a/Documentation/DocBook/v4l/media-ioc-setup-link.xml -+++ b/Documentation/DocBook/v4l/media-ioc-setup-link.xml -@@ -34,7 +34,7 @@ - - request - -- MEDIA_IOC_ENUM_LINKS -+ MEDIA_IOC_SETUP_LINK - - - -diff --git a/Documentation/DocBook/v4l/pixfmt-y12.xml b/Documentation/DocBook/v4l/pixfmt-y12.xml -new file mode 100644 -index 0000000..ff417b8 ---- /dev/null -+++ b/Documentation/DocBook/v4l/pixfmt-y12.xml -@@ -0,0 +1,79 @@ -+ -+ -+ V4L2_PIX_FMT_Y12 ('Y12 ') -+ &manvol; -+ -+ -+ V4L2_PIX_FMT_Y12 -+ Grey-scale image -+ -+ -+ Description -+ -+ This is a grey-scale image with a depth of 12 bits per pixel. Pixels -+are stored in 16-bit words with unused high bits padded with 0. The least -+significant byte is stored at lower memory addresses (little-endian). -+ -+ -+ <constant>V4L2_PIX_FMT_Y12</constant> 4 × 4 -+pixel image -+ -+ -+ Byte Order. -+ Each cell is one byte. -+ -+ -+ -+ -+ -+ start + 0: -+ Y'00low -+ Y'00high -+ Y'01low -+ Y'01high -+ Y'02low -+ Y'02high -+ Y'03low -+ Y'03high -+ -+ -+ start + 8: -+ Y'10low -+ Y'10high -+ Y'11low -+ Y'11high -+ Y'12low -+ Y'12high -+ Y'13low -+ Y'13high -+ -+ -+ start + 16: -+ Y'20low -+ Y'20high -+ Y'21low -+ Y'21high -+ Y'22low -+ Y'22high -+ Y'23low -+ Y'23high -+ -+ -+ start + 24: -+ Y'30low -+ Y'30high -+ Y'31low -+ Y'31high -+ Y'32low -+ Y'32high -+ Y'33low -+ Y'33high -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/Documentation/DocBook/v4l/pixfmt.xml b/Documentation/DocBook/v4l/pixfmt.xml -index c6fdcbb..40af4be 100644 ---- a/Documentation/DocBook/v4l/pixfmt.xml -+++ b/Documentation/DocBook/v4l/pixfmt.xml -@@ -696,6 +696,7 @@ information. - &sub-packed-yuv; - &sub-grey; - &sub-y10; -+ &sub-y12; - &sub-y16; - &sub-yuyv; - &sub-uyvy; -diff --git a/Documentation/DocBook/v4l/subdev-formats.xml b/Documentation/DocBook/v4l/subdev-formats.xml -index 7041127..d7ccd25 100644 ---- a/Documentation/DocBook/v4l/subdev-formats.xml -+++ b/Documentation/DocBook/v4l/subdev-formats.xml -@@ -456,6 +456,23 @@ - b1 - b0 - -+ -+ V4L2_MBUS_FMT_SGBRG8_1X8 -+ 0x3013 -+ -+ - -+ - -+ - -+ - -+ g7 -+ g6 -+ g5 -+ g4 -+ g3 -+ g2 -+ g1 -+ g0 -+ - - V4L2_MBUS_FMT_SGRBG8_1X8 - 0x3002 -@@ -473,6 +490,23 @@ - g1 - g0 - -+ -+ V4L2_MBUS_FMT_SRGGB8_1X8 -+ 0x3014 -+ -+ - -+ - -+ - -+ - -+ r7 -+ r6 -+ r5 -+ r4 -+ r3 -+ r2 -+ r1 -+ r0 -+ - - V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8 - 0x300b -@@ -2159,6 +2193,31 @@ - u1 - u0 - -+ -+ V4L2_MBUS_FMT_Y12_1X12 -+ 0x2013 -+ -+ - -+ - -+ - -+ - -+ - -+ - -+ - -+ - -+ y11 -+ y10 -+ y9 -+ y8 -+ y7 -+ y6 -+ y5 -+ y4 -+ y3 -+ y2 -+ y1 -+ y0 -+ - - V4L2_MBUS_FMT_UYVY8_1X16 - 0x200f -diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt -index b6ed61c..7c16347 100644 ---- a/Documentation/cgroups/memory.txt -+++ b/Documentation/cgroups/memory.txt -@@ -52,8 +52,10 @@ Brief summary of control files. - tasks # attach a task(thread) and show list of threads - cgroup.procs # show list of processes - cgroup.event_control # an interface for event_fd() -- memory.usage_in_bytes # show current memory(RSS+Cache) usage. -- memory.memsw.usage_in_bytes # show current memory+Swap usage -+ memory.usage_in_bytes # show current res_counter usage for memory -+ (See 5.5 for details) -+ memory.memsw.usage_in_bytes # show current res_counter usage for memory+Swap -+ (See 5.5 for details) - memory.limit_in_bytes # set/show limit of memory usage - memory.memsw.limit_in_bytes # set/show limit of memory+Swap usage - memory.failcnt # show the number of memory usage hits limits -@@ -453,6 +455,15 @@ memory under it will be reclaimed. - You can reset failcnt by writing 0 to failcnt file. - # echo 0 > .../memory.failcnt - -+5.5 usage_in_bytes -+ -+For efficiency, as other kernel components, memory cgroup uses some optimization -+to avoid unnecessary cacheline false sharing. usage_in_bytes is affected by the -+method and doesn't show 'exact' value of memory(and swap) usage, it's an fuzz -+value for efficient access. (Of course, when necessary, it's synchronized.) -+If you want to know more exact memory usage, you should use RSS+CACHE(+SWAP) -+value in memory.stat(see 5.2). -+ - 6. Hierarchy support - - The memory controller supports a deep hierarchy and hierarchical accounting. -diff --git a/Documentation/hwmon/adm1021 b/Documentation/hwmon/adm1021 -index 03d02bf..02ad96c 100644 ---- a/Documentation/hwmon/adm1021 -+++ b/Documentation/hwmon/adm1021 -@@ -14,10 +14,6 @@ Supported chips: - Prefix: 'gl523sm' - Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e - Datasheet: -- * Intel Xeon Processor -- Prefix: - any other - may require 'force_adm1021' parameter -- Addresses scanned: none -- Datasheet: Publicly available at Intel website - * Maxim MAX1617 - Prefix: 'max1617' - Addresses scanned: I2C 0x18 - 0x1a, 0x29 - 0x2b, 0x4c - 0x4e -@@ -91,21 +87,27 @@ will do no harm, but will return 'old' values. It is possible to make - ADM1021-clones do faster measurements, but there is really no good reason - for that. - --Xeon support -------------- - --Some Xeon processors have real max1617, adm1021, or compatible chips --within them, with two temperature sensors. -+Netburst-based Xeon support -+--------------------------- - --Other Xeons have chips with only one sensor. -+Some Xeon processors based on the Netburst (early Pentium 4, from 2001 to -+2003) microarchitecture had real MAX1617, ADM1021, or compatible chips -+within them, with two temperature sensors. Other Xeon processors of this -+era (with 400 MHz FSB) had chips with only one temperature sensor. - --If you have a Xeon, and the adm1021 module loads, and both temperatures --appear valid, then things are good. -+If you have such an old Xeon, and you get two valid temperatures when -+loading the adm1021 module, then things are good. - --If the adm1021 module doesn't load, you should try this: -- modprobe adm1021 force_adm1021=BUS,ADDRESS -- ADDRESS can only be 0x18, 0x1a, 0x29, 0x2b, 0x4c, or 0x4e. -+If nothing happens when loading the adm1021 module, and you are certain -+that your specific Xeon processor model includes compatible sensors, you -+will have to explicitly instantiate the sensor chips from user-space. See -+method 4 in Documentation/i2c/instantiating-devices. Possible slave -+addresses are 0x18, 0x1a, 0x29, 0x2b, 0x4c, or 0x4e. It is likely that -+only temp2 will be correct and temp1 will have to be ignored. - --If you have dual Xeons you may have appear to have two separate --adm1021-compatible chips, or two single-temperature sensors, at distinct --addresses. -+Previous generations of the Xeon processor (based on Pentium II/III) -+didn't have these sensors. Next generations of Xeon processors (533 MHz -+FSB and faster) lost them, until the Core-based generation which -+introduced integrated digital thermal sensors. These are supported by -+the coretemp driver. -diff --git a/Documentation/hwmon/lm90 b/Documentation/hwmon/lm90 -index fa475c0..f3efd18 100644 ---- a/Documentation/hwmon/lm90 -+++ b/Documentation/hwmon/lm90 -@@ -32,6 +32,16 @@ Supported chips: - Addresses scanned: I2C 0x4c and 0x4d - Datasheet: Publicly available at the ON Semiconductor website - http://www.onsemi.com/PowerSolutions/product.do?id=ADT7461 -+ * Analog Devices ADT7461A -+ Prefix: 'adt7461a' -+ Addresses scanned: I2C 0x4c and 0x4d -+ Datasheet: Publicly available at the ON Semiconductor website -+ http://www.onsemi.com/PowerSolutions/product.do?id=ADT7461A -+ * ON Semiconductor NCT1008 -+ Prefix: 'nct1008' -+ Addresses scanned: I2C 0x4c and 0x4d -+ Datasheet: Publicly available at the ON Semiconductor website -+ http://www.onsemi.com/PowerSolutions/product.do?id=NCT1008 - * Maxim MAX6646 - Prefix: 'max6646' - Addresses scanned: I2C 0x4d -@@ -149,7 +159,7 @@ ADM1032: - * ALERT is triggered by open remote sensor. - * SMBus PEC support for Write Byte and Receive Byte transactions. - --ADT7461: -+ADT7461, ADT7461A, NCT1008: - * Extended temperature range (breaks compatibility) - * Lower resolution for remote temperature - -@@ -195,9 +205,9 @@ are exported, one for each channel, but these values are of course linked. - Only the local hysteresis can be set from user-space, and the same delta - applies to the remote hysteresis. - --The lm90 driver will not update its values more frequently than every --other second; reading them more often will do no harm, but will return --'old' values. -+The lm90 driver will not update its values more frequently than configured with -+the update_interval attribute; reading them more often will do no harm, but will -+return 'old' values. - - SMBus Alert Support - ------------------- -@@ -205,11 +215,12 @@ SMBus Alert Support - This driver has basic support for SMBus alert. When an alert is received, - the status register is read and the faulty temperature channel is logged. - --The Analog Devices chips (ADM1032 and ADT7461) do not implement the SMBus --alert protocol properly so additional care is needed: the ALERT output is --disabled when an alert is received, and is re-enabled only when the alarm --is gone. Otherwise the chip would block alerts from other chips in the bus --as long as the alarm is active. -+The Analog Devices chips (ADM1032, ADT7461 and ADT7461A) and ON -+Semiconductor chips (NCT1008) do not implement the SMBus alert protocol -+properly so additional care is needed: the ALERT output is disabled when -+an alert is received, and is re-enabled only when the alarm is gone. -+Otherwise the chip would block alerts from other chips in the bus as long -+as the alarm is active. - - PEC Support - ----------- -diff --git a/Documentation/video4linux/sh_mobile_ceu_camera.txt b/Documentation/video4linux/sh_mobile_ceu_camera.txt -index cb47e72..1e96ce6 100644 ---- a/Documentation/video4linux/sh_mobile_ceu_camera.txt -+++ b/Documentation/video4linux/sh_mobile_ceu_camera.txt -@@ -37,7 +37,7 @@ Generic scaling / cropping scheme - -1'- - - In the above chart minuses and slashes represent "real" data amounts, points and --accents represent "useful" data, basically, CEU scaled amd cropped output, -+accents represent "useful" data, basically, CEU scaled and cropped output, - mapped back onto the client's source plane. - - Such a configuration can be produced by user requests: -@@ -65,7 +65,7 @@ Do not touch input rectangle - it is already optimal. - - 1. Calculate current sensor scales: - -- scale_s = ((3') - (3)) / ((2') - (2)) -+ scale_s = ((2') - (2)) / ((3') - (3)) - - 2. Calculate "effective" input crop (sensor subwindow) - CEU crop scaled back at - current sensor scales onto input window - this is user S_CROP: -@@ -80,7 +80,7 @@ window: - 4. Calculate sensor output window by applying combined scales to real input - window: - -- width_s_out = ((2') - (2)) / scale_comb -+ width_s_out = ((7') - (7)) = ((2') - (2)) / scale_comb - - 5. Apply iterative sensor S_FMT for sensor output window. - -diff --git a/Documentation/workqueue.txt b/Documentation/workqueue.txt -index 01c513f..a0b577d 100644 ---- a/Documentation/workqueue.txt -+++ b/Documentation/workqueue.txt -@@ -12,6 +12,7 @@ CONTENTS - 4. Application Programming Interface (API) - 5. Example Execution Scenarios - 6. Guidelines -+7. Debugging - - - 1. Introduction -@@ -379,3 +380,42 @@ If q1 has WQ_CPU_INTENSIVE set, - * Unless work items are expected to consume a huge amount of CPU - cycles, using a bound wq is usually beneficial due to the increased - level of locality in wq operations and work item execution. -+ -+ -+7. Debugging -+ -+Because the work functions are executed by generic worker threads -+there are a few tricks needed to shed some light on misbehaving -+workqueue users. -+ -+Worker threads show up in the process list as: -+ -+root 5671 0.0 0.0 0 0 ? S 12:07 0:00 [kworker/0:1] -+root 5672 0.0 0.0 0 0 ? S 12:07 0:00 [kworker/1:2] -+root 5673 0.0 0.0 0 0 ? S 12:12 0:00 [kworker/0:0] -+root 5674 0.0 0.0 0 0 ? S 12:13 0:00 [kworker/1:0] -+ -+If kworkers are going crazy (using too much cpu), there are two types -+of possible problems: -+ -+ 1. Something beeing scheduled in rapid succession -+ 2. A single work item that consumes lots of cpu cycles -+ -+The first one can be tracked using tracing: -+ -+ $ echo workqueue:workqueue_queue_work > /sys/kernel/debug/tracing/set_event -+ $ cat /sys/kernel/debug/tracing/trace_pipe > out.txt -+ (wait a few secs) -+ ^C -+ -+If something is busy looping on work queueing, it would be dominating -+the output and the offender can be determined with the work item -+function. -+ -+For the second type of problems it should be possible to just check -+the stack trace of the offending worker thread. -+ -+ $ cat /proc/THE_OFFENDING_KWORKER/stack -+ -+The work item's function should be trivially visible in the stack -+trace. -diff --git a/MAINTAINERS b/MAINTAINERS -index 1380312..16a5c5f 100644 ---- a/MAINTAINERS -+++ b/MAINTAINERS -@@ -1032,12 +1032,13 @@ W: http://www.fluff.org/ben/linux/ - S: Maintained - F: arch/arm/mach-s3c64xx/ - --ARM/S5P ARM ARCHITECTURES -+ARM/S5P EXYNOS ARM ARCHITECTURES - M: Kukjin Kim - L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) - L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers) - S: Maintained - F: arch/arm/mach-s5p*/ -+F: arch/arm/mach-exynos*/ - - ARM/SAMSUNG MOBILE MACHINE SUPPORT - M: Kyungmin Park -@@ -2808,7 +2809,7 @@ GPIO SUBSYSTEM - M: Grant Likely - S: Maintained - T: git git://git.secretlab.ca/git/linux-2.6.git --F: Documentation/gpio/gpio.txt -+F: Documentation/gpio.txt - F: drivers/gpio/ - F: include/linux/gpio* - -@@ -6555,7 +6556,7 @@ S: Maintained - F: drivers/usb/host/uhci* - - USB "USBNET" DRIVER FRAMEWORK --M: David Brownell -+M: Oliver Neukum - L: netdev@vger.kernel.org - W: http://www.linux-usb.org/usbnet - S: Maintained -@@ -6921,6 +6922,18 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86. - S: Maintained - F: drivers/platform/x86 - -+XEN HYPERVISOR INTERFACE -+M: Jeremy Fitzhardinge -+M: Konrad Rzeszutek Wilk -+L: xen-devel@lists.xensource.com (moderated for non-subscribers) -+L: virtualization@lists.linux-foundation.org -+S: Supported -+F: arch/x86/xen/ -+F: drivers/*/xen-*front.c -+F: drivers/xen/ -+F: arch/x86/include/asm/xen/ -+F: include/xen/ -+ - XEN NETWORK BACKEND DRIVER - M: Ian Campbell - L: xen-devel@lists.xensource.com (moderated for non-subscribers) -@@ -6942,18 +6955,6 @@ S: Supported - F: arch/x86/xen/*swiotlb* - F: drivers/xen/*swiotlb* - --XEN HYPERVISOR INTERFACE --M: Jeremy Fitzhardinge --M: Konrad Rzeszutek Wilk --L: xen-devel@lists.xensource.com (moderated for non-subscribers) --L: virtualization@lists.linux-foundation.org --S: Supported --F: arch/x86/xen/ --F: drivers/*/xen-*front.c --F: drivers/xen/ --F: arch/x86/include/asm/xen/ --F: include/xen/ -- - XFS FILESYSTEM - P: Silicon Graphics Inc - M: Alex Elder -diff --git a/Makefile b/Makefile -index 5a7a2e4..b6aeb66 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,7 +1,7 @@ - VERSION = 2 - PATCHLEVEL = 6 - SUBLEVEL = 39 --EXTRAVERSION = -rc5 -+EXTRAVERSION = -rc5-git7 - NAME = Flesh-Eating Bats with Fangs - - # *DOCUMENTATION* -diff --git a/arch/arm/include/asm/kprobes.h b/arch/arm/include/asm/kprobes.h -index bb8a19b..e46bdd0 100644 ---- a/arch/arm/include/asm/kprobes.h -+++ b/arch/arm/include/asm/kprobes.h -@@ -39,10 +39,13 @@ typedef u32 kprobe_opcode_t; - struct kprobe; - typedef void (kprobe_insn_handler_t)(struct kprobe *, struct pt_regs *); - -+typedef unsigned long (kprobe_check_cc)(unsigned long); -+ - /* Architecture specific copy of original instruction. */ - struct arch_specific_insn { - kprobe_opcode_t *insn; - kprobe_insn_handler_t *insn_handler; -+ kprobe_check_cc *insn_check_cc; - }; - - struct prev_kprobe { -diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c -index 2389131..15eeff6 100644 ---- a/arch/arm/kernel/kprobes-decode.c -+++ b/arch/arm/kernel/kprobes-decode.c -@@ -34,9 +34,6 @@ - * - * *) If the PC is written to by the instruction, the - * instruction must be fully simulated in software. -- * If it is a conditional instruction, the handler -- * will use insn[0] to copy its condition code to -- * set r0 to 1 and insn[1] to "mov pc, lr" to return. - * - * *) Otherwise, a modified form of the instruction is - * directly executed. Its handler calls the -@@ -68,13 +65,17 @@ - - #define branch_displacement(insn) sign_extend(((insn) & 0xffffff) << 2, 25) - -+#define is_r15(insn, bitpos) (((insn) & (0xf << bitpos)) == (0xf << bitpos)) -+ -+/* -+ * Test if load/store instructions writeback the address register. -+ * if P (bit 24) == 0 or W (bit 21) == 1 -+ */ -+#define is_writeback(insn) ((insn ^ 0x01000000) & 0x01200000) -+ - #define PSR_fs (PSR_f|PSR_s) - - #define KPROBE_RETURN_INSTRUCTION 0xe1a0f00e /* mov pc, lr */ --#define SET_R0_TRUE_INSTRUCTION 0xe3a00001 /* mov r0, #1 */ -- --#define truecc_insn(insn) (((insn) & 0xf0000000) | \ -- (SET_R0_TRUE_INSTRUCTION & 0x0fffffff)) - - typedef long (insn_0arg_fn_t)(void); - typedef long (insn_1arg_fn_t)(long); -@@ -419,14 +420,10 @@ insnslot_llret_4arg_rwflags(long r0, long r1, long r2, long r3, long *cpsr, - - static void __kprobes simulate_bbl(struct kprobe *p, struct pt_regs *regs) - { -- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; - kprobe_opcode_t insn = p->opcode; - long iaddr = (long)p->addr; - int disp = branch_displacement(insn); - -- if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) -- return; -- - if (insn & (1 << 24)) - regs->ARM_lr = iaddr + 4; - -@@ -446,14 +443,10 @@ static void __kprobes simulate_blx1(struct kprobe *p, struct pt_regs *regs) - - static void __kprobes simulate_blx2bx(struct kprobe *p, struct pt_regs *regs) - { -- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; - kprobe_opcode_t insn = p->opcode; - int rm = insn & 0xf; - long rmv = regs->uregs[rm]; - -- if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) -- return; -- - if (insn & (1 << 5)) - regs->ARM_lr = (long)p->addr + 4; - -@@ -463,9 +456,16 @@ static void __kprobes simulate_blx2bx(struct kprobe *p, struct pt_regs *regs) - regs->ARM_cpsr |= PSR_T_BIT; - } - -+static void __kprobes simulate_mrs(struct kprobe *p, struct pt_regs *regs) -+{ -+ kprobe_opcode_t insn = p->opcode; -+ int rd = (insn >> 12) & 0xf; -+ unsigned long mask = 0xf8ff03df; /* Mask out execution state */ -+ regs->uregs[rd] = regs->ARM_cpsr & mask; -+} -+ - static void __kprobes simulate_ldm1stm1(struct kprobe *p, struct pt_regs *regs) - { -- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; - kprobe_opcode_t insn = p->opcode; - int rn = (insn >> 16) & 0xf; - int lbit = insn & (1 << 20); -@@ -476,9 +476,6 @@ static void __kprobes simulate_ldm1stm1(struct kprobe *p, struct pt_regs *regs) - int reg_bit_vector; - int reg_count; - -- if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) -- return; -- - reg_count = 0; - reg_bit_vector = insn & 0xffff; - while (reg_bit_vector) { -@@ -510,11 +507,6 @@ static void __kprobes simulate_ldm1stm1(struct kprobe *p, struct pt_regs *regs) - - static void __kprobes simulate_stm1_pc(struct kprobe *p, struct pt_regs *regs) - { -- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; -- -- if (!insnslot_1arg_rflags(0, regs->ARM_cpsr, i_fn)) -- return; -- - regs->ARM_pc = (long)p->addr + str_pc_offset; - simulate_ldm1stm1(p, regs); - regs->ARM_pc = (long)p->addr + 4; -@@ -525,24 +517,16 @@ static void __kprobes simulate_mov_ipsp(struct kprobe *p, struct pt_regs *regs) - regs->uregs[12] = regs->uregs[13]; - } - --static void __kprobes emulate_ldcstc(struct kprobe *p, struct pt_regs *regs) --{ -- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; -- kprobe_opcode_t insn = p->opcode; -- int rn = (insn >> 16) & 0xf; -- long rnv = regs->uregs[rn]; -- -- /* Save Rn in case of writeback. */ -- regs->uregs[rn] = insnslot_1arg_rflags(rnv, regs->ARM_cpsr, i_fn); --} -- - static void __kprobes emulate_ldrd(struct kprobe *p, struct pt_regs *regs) - { - insn_2arg_fn_t *i_fn = (insn_2arg_fn_t *)&p->ainsn.insn[0]; - kprobe_opcode_t insn = p->opcode; -+ long ppc = (long)p->addr + 8; - int rd = (insn >> 12) & 0xf; - int rn = (insn >> 16) & 0xf; - int rm = insn & 0xf; /* rm may be invalid, don't care. */ -+ long rmv = (rm == 15) ? ppc : regs->uregs[rm]; -+ long rnv = (rn == 15) ? ppc : regs->uregs[rn]; - - /* Not following the C calling convention here, so need asm(). */ - __asm__ __volatile__ ( -@@ -554,29 +538,36 @@ static void __kprobes emulate_ldrd(struct kprobe *p, struct pt_regs *regs) - "str r0, %[rn] \n\t" /* in case of writeback */ - "str r2, %[rd0] \n\t" - "str r3, %[rd1] \n\t" -- : [rn] "+m" (regs->uregs[rn]), -+ : [rn] "+m" (rnv), - [rd0] "=m" (regs->uregs[rd]), - [rd1] "=m" (regs->uregs[rd+1]) -- : [rm] "m" (regs->uregs[rm]), -+ : [rm] "m" (rmv), - [cpsr] "r" (regs->ARM_cpsr), - [i_fn] "r" (i_fn) - : "r0", "r1", "r2", "r3", "lr", "cc" - ); -+ if (is_writeback(insn)) -+ regs->uregs[rn] = rnv; - } - - static void __kprobes emulate_strd(struct kprobe *p, struct pt_regs *regs) - { - insn_4arg_fn_t *i_fn = (insn_4arg_fn_t *)&p->ainsn.insn[0]; - kprobe_opcode_t insn = p->opcode; -+ long ppc = (long)p->addr + 8; - int rd = (insn >> 12) & 0xf; - int rn = (insn >> 16) & 0xf; - int rm = insn & 0xf; -- long rnv = regs->uregs[rn]; -- long rmv = regs->uregs[rm]; /* rm/rmv may be invalid, don't care. */ -+ long rnv = (rn == 15) ? ppc : regs->uregs[rn]; -+ /* rm/rmv may be invalid, don't care. */ -+ long rmv = (rm == 15) ? ppc : regs->uregs[rm]; -+ long rnv_wb; - -- regs->uregs[rn] = insnslot_4arg_rflags(rnv, rmv, regs->uregs[rd], -+ rnv_wb = insnslot_4arg_rflags(rnv, rmv, regs->uregs[rd], - regs->uregs[rd+1], - regs->ARM_cpsr, i_fn); -+ if (is_writeback(insn)) -+ regs->uregs[rn] = rnv_wb; - } - - static void __kprobes emulate_ldr(struct kprobe *p, struct pt_regs *regs) -@@ -630,31 +621,6 @@ static void __kprobes emulate_str(struct kprobe *p, struct pt_regs *regs) - regs->uregs[rn] = rnv_wb; /* Save Rn in case of writeback. */ - } - --static void __kprobes emulate_mrrc(struct kprobe *p, struct pt_regs *regs) --{ -- insn_llret_0arg_fn_t *i_fn = (insn_llret_0arg_fn_t *)&p->ainsn.insn[0]; -- kprobe_opcode_t insn = p->opcode; -- union reg_pair fnr; -- int rd = (insn >> 12) & 0xf; -- int rn = (insn >> 16) & 0xf; -- -- fnr.dr = insnslot_llret_0arg_rflags(regs->ARM_cpsr, i_fn); -- regs->uregs[rn] = fnr.r0; -- regs->uregs[rd] = fnr.r1; --} -- --static void __kprobes emulate_mcrr(struct kprobe *p, struct pt_regs *regs) --{ -- insn_2arg_fn_t *i_fn = (insn_2arg_fn_t *)&p->ainsn.insn[0]; -- kprobe_opcode_t insn = p->opcode; -- int rd = (insn >> 12) & 0xf; -- int rn = (insn >> 16) & 0xf; -- long rnv = regs->uregs[rn]; -- long rdv = regs->uregs[rd]; -- -- insnslot_2arg_rflags(rnv, rdv, regs->ARM_cpsr, i_fn); --} -- - static void __kprobes emulate_sat(struct kprobe *p, struct pt_regs *regs) - { - insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; -@@ -688,32 +654,32 @@ static void __kprobes emulate_none(struct kprobe *p, struct pt_regs *regs) - insnslot_0arg_rflags(regs->ARM_cpsr, i_fn); - } - --static void __kprobes emulate_rd12(struct kprobe *p, struct pt_regs *regs) -+static void __kprobes emulate_nop(struct kprobe *p, struct pt_regs *regs) - { -- insn_0arg_fn_t *i_fn = (insn_0arg_fn_t *)&p->ainsn.insn[0]; -- kprobe_opcode_t insn = p->opcode; -- int rd = (insn >> 12) & 0xf; -- -- regs->uregs[rd] = insnslot_0arg_rflags(regs->ARM_cpsr, i_fn); - } - --static void __kprobes emulate_ird12(struct kprobe *p, struct pt_regs *regs) -+static void __kprobes -+emulate_rd12_modify(struct kprobe *p, struct pt_regs *regs) - { - insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; - kprobe_opcode_t insn = p->opcode; -- int ird = (insn >> 12) & 0xf; -+ int rd = (insn >> 12) & 0xf; -+ long rdv = regs->uregs[rd]; - -- insnslot_1arg_rflags(regs->uregs[ird], regs->ARM_cpsr, i_fn); -+ regs->uregs[rd] = insnslot_1arg_rflags(rdv, regs->ARM_cpsr, i_fn); - } - --static void __kprobes emulate_rn16(struct kprobe *p, struct pt_regs *regs) -+static void __kprobes -+emulate_rd12rn0_modify(struct kprobe *p, struct pt_regs *regs) - { -- insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; -+ insn_2arg_fn_t *i_fn = (insn_2arg_fn_t *)&p->ainsn.insn[0]; - kprobe_opcode_t insn = p->opcode; -- int rn = (insn >> 16) & 0xf; -+ int rd = (insn >> 12) & 0xf; -+ int rn = insn & 0xf; -+ long rdv = regs->uregs[rd]; - long rnv = regs->uregs[rn]; - -- insnslot_1arg_rflags(rnv, regs->ARM_cpsr, i_fn); -+ regs->uregs[rd] = insnslot_2arg_rflags(rdv, rnv, regs->ARM_cpsr, i_fn); - } - - static void __kprobes emulate_rd12rm0(struct kprobe *p, struct pt_regs *regs) -@@ -819,6 +785,17 @@ emulate_alu_imm_rwflags(struct kprobe *p, struct pt_regs *regs) - } - - static void __kprobes -+emulate_alu_tests_imm(struct kprobe *p, struct pt_regs *regs) -+{ -+ insn_1arg_fn_t *i_fn = (insn_1arg_fn_t *)&p->ainsn.insn[0]; -+ kprobe_opcode_t insn = p->opcode; -+ int rn = (insn >> 16) & 0xf; -+ long rnv = (rn == 15) ? (long)p->addr + 8 : regs->uregs[rn]; -+ -+ insnslot_1arg_rwflags(rnv, ®s->ARM_cpsr, i_fn); -+} -+ -+static void __kprobes - emulate_alu_rflags(struct kprobe *p, struct pt_regs *regs) - { - insn_3arg_fn_t *i_fn = (insn_3arg_fn_t *)&p->ainsn.insn[0]; -@@ -854,14 +831,34 @@ emulate_alu_rwflags(struct kprobe *p, struct pt_regs *regs) - insnslot_3arg_rwflags(rnv, rmv, rsv, ®s->ARM_cpsr, i_fn); - } - -+static void __kprobes -+emulate_alu_tests(struct kprobe *p, struct pt_regs *regs) -+{ -+ insn_3arg_fn_t *i_fn = (insn_3arg_fn_t *)&p->ainsn.insn[0]; -+ kprobe_opcode_t insn = p->opcode; -+ long ppc = (long)p->addr + 8; -+ int rn = (insn >> 16) & 0xf; -+ int rs = (insn >> 8) & 0xf; /* rs/rsv may be invalid, don't care. */ -+ int rm = insn & 0xf; -+ long rnv = (rn == 15) ? ppc : regs->uregs[rn]; -+ long rmv = (rm == 15) ? ppc : regs->uregs[rm]; -+ long rsv = regs->uregs[rs]; -+ -+ insnslot_3arg_rwflags(rnv, rmv, rsv, ®s->ARM_cpsr, i_fn); -+} -+ - static enum kprobe_insn __kprobes - prep_emulate_ldr_str(kprobe_opcode_t insn, struct arch_specific_insn *asi) - { -- int ibit = (insn & (1 << 26)) ? 25 : 22; -+ int not_imm = (insn & (1 << 26)) ? (insn & (1 << 25)) -+ : (~insn & (1 << 22)); -+ -+ if (is_writeback(insn) && is_r15(insn, 16)) -+ return INSN_REJECTED; /* Writeback to PC */ - - insn &= 0xfff00fff; - insn |= 0x00001000; /* Rn = r0, Rd = r1 */ -- if (insn & (1 << ibit)) { -+ if (not_imm) { - insn &= ~0xf; - insn |= 2; /* Rm = r2 */ - } -@@ -871,20 +868,40 @@ prep_emulate_ldr_str(kprobe_opcode_t insn, struct arch_specific_insn *asi) - } - - static enum kprobe_insn __kprobes --prep_emulate_rd12rm0(kprobe_opcode_t insn, struct arch_specific_insn *asi) -+prep_emulate_rd12_modify(kprobe_opcode_t insn, struct arch_specific_insn *asi) - { -- insn &= 0xffff0ff0; /* Rd = r0, Rm = r0 */ -+ if (is_r15(insn, 12)) -+ return INSN_REJECTED; /* Rd is PC */ -+ -+ insn &= 0xffff0fff; /* Rd = r0 */ - asi->insn[0] = insn; -- asi->insn_handler = emulate_rd12rm0; -+ asi->insn_handler = emulate_rd12_modify; - return INSN_GOOD; - } - - static enum kprobe_insn __kprobes --prep_emulate_rd12(kprobe_opcode_t insn, struct arch_specific_insn *asi) -+prep_emulate_rd12rn0_modify(kprobe_opcode_t insn, -+ struct arch_specific_insn *asi) - { -- insn &= 0xffff0fff; /* Rd = r0 */ -+ if (is_r15(insn, 12)) -+ return INSN_REJECTED; /* Rd is PC */ -+ -+ insn &= 0xffff0ff0; /* Rd = r0 */ -+ insn |= 0x00000001; /* Rn = r1 */ -+ asi->insn[0] = insn; -+ asi->insn_handler = emulate_rd12rn0_modify; -+ return INSN_GOOD; -+} -+ -+static enum kprobe_insn __kprobes -+prep_emulate_rd12rm0(kprobe_opcode_t insn, struct arch_specific_insn *asi) -+{ -+ if (is_r15(insn, 12)) -+ return INSN_REJECTED; /* Rd is PC */ -+ -+ insn &= 0xffff0ff0; /* Rd = r0, Rm = r0 */ - asi->insn[0] = insn; -- asi->insn_handler = emulate_rd12; -+ asi->insn_handler = emulate_rd12rm0; - return INSN_GOOD; - } - -@@ -892,6 +909,9 @@ static enum kprobe_insn __kprobes - prep_emulate_rd12rn16rm0_wflags(kprobe_opcode_t insn, - struct arch_specific_insn *asi) - { -+ if (is_r15(insn, 12)) -+ return INSN_REJECTED; /* Rd is PC */ -+ - insn &= 0xfff00ff0; /* Rd = r0, Rn = r0 */ - insn |= 0x00000001; /* Rm = r1 */ - asi->insn[0] = insn; -@@ -903,6 +923,9 @@ static enum kprobe_insn __kprobes - prep_emulate_rd16rs8rm0_wflags(kprobe_opcode_t insn, - struct arch_specific_insn *asi) - { -+ if (is_r15(insn, 16)) -+ return INSN_REJECTED; /* Rd is PC */ -+ - insn &= 0xfff0f0f0; /* Rd = r0, Rs = r0 */ - insn |= 0x00000001; /* Rm = r1 */ - asi->insn[0] = insn; -@@ -914,6 +937,9 @@ static enum kprobe_insn __kprobes - prep_emulate_rd16rn12rs8rm0_wflags(kprobe_opcode_t insn, - struct arch_specific_insn *asi) - { -+ if (is_r15(insn, 16)) -+ return INSN_REJECTED; /* Rd is PC */ -+ - insn &= 0xfff000f0; /* Rd = r0, Rn = r0 */ - insn |= 0x00000102; /* Rs = r1, Rm = r2 */ - asi->insn[0] = insn; -@@ -925,6 +951,9 @@ static enum kprobe_insn __kprobes - prep_emulate_rdhi16rdlo12rs8rm0_wflags(kprobe_opcode_t insn, - struct arch_specific_insn *asi) - { -+ if (is_r15(insn, 16) || is_r15(insn, 12)) -+ return INSN_REJECTED; /* RdHi or RdLo is PC */ -+ - insn &= 0xfff000f0; /* RdHi = r0, RdLo = r1 */ - insn |= 0x00001203; /* Rs = r2, Rm = r3 */ - asi->insn[0] = insn; -@@ -945,20 +974,13 @@ prep_emulate_rdhi16rdlo12rs8rm0_wflags(kprobe_opcode_t insn, - static enum kprobe_insn __kprobes - space_1111(kprobe_opcode_t insn, struct arch_specific_insn *asi) - { -- /* CPS mmod == 1 : 1111 0001 0000 xx10 xxxx xxxx xx0x xxxx */ -- /* RFE : 1111 100x x0x1 xxxx xxxx 1010 xxxx xxxx */ -- /* SRS : 1111 100x x1x0 1101 xxxx 0101 xxxx xxxx */ -- if ((insn & 0xfff30020) == 0xf1020000 || -- (insn & 0xfe500f00) == 0xf8100a00 || -- (insn & 0xfe5f0f00) == 0xf84d0500) -- return INSN_REJECTED; -- -- /* PLD : 1111 01x1 x101 xxxx xxxx xxxx xxxx xxxx : */ -- if ((insn & 0xfd700000) == 0xf4500000) { -- insn &= 0xfff0ffff; /* Rn = r0 */ -- asi->insn[0] = insn; -- asi->insn_handler = emulate_rn16; -- return INSN_GOOD; -+ /* memory hint : 1111 0100 x001 xxxx xxxx xxxx xxxx xxxx : */ -+ /* PLDI : 1111 0100 x101 xxxx xxxx xxxx xxxx xxxx : */ -+ /* PLDW : 1111 0101 x001 xxxx xxxx xxxx xxxx xxxx : */ -+ /* PLD : 1111 0101 x101 xxxx xxxx xxxx xxxx xxxx : */ -+ if ((insn & 0xfe300000) == 0xf4100000) { -+ asi->insn_handler = emulate_nop; -+ return INSN_GOOD_NO_SLOT; - } - - /* BLX(1) : 1111 101x xxxx xxxx xxxx xxxx xxxx xxxx : */ -@@ -967,41 +989,22 @@ space_1111(kprobe_opcode_t insn, struct arch_specific_insn *asi) - return INSN_GOOD_NO_SLOT; - } - -- /* SETEND : 1111 0001 0000 0001 xxxx xxxx 0000 xxxx */ -- /* CDP2 : 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ -- if ((insn & 0xffff00f0) == 0xf1010000 || -- (insn & 0xff000010) == 0xfe000000) { -- asi->insn[0] = insn; -- asi->insn_handler = emulate_none; -- return INSN_GOOD; -- } -+ /* CPS : 1111 0001 0000 xxx0 xxxx xxxx xx0x xxxx */ -+ /* SETEND: 1111 0001 0000 0001 xxxx xxxx 0000 xxxx */ - -+ /* SRS : 1111 100x x1x0 xxxx xxxx xxxx xxxx xxxx */ -+ /* RFE : 1111 100x x0x1 xxxx xxxx xxxx xxxx xxxx */ -+ -+ /* Coprocessor instructions... */ - /* MCRR2 : 1111 1100 0100 xxxx xxxx xxxx xxxx xxxx : (Rd != Rn) */ - /* MRRC2 : 1111 1100 0101 xxxx xxxx xxxx xxxx xxxx : (Rd != Rn) */ -- if ((insn & 0xffe00000) == 0xfc400000) { -- insn &= 0xfff00fff; /* Rn = r0 */ -- insn |= 0x00001000; /* Rd = r1 */ -- asi->insn[0] = insn; -- asi->insn_handler = -- (insn & (1 << 20)) ? emulate_mrrc : emulate_mcrr; -- return INSN_GOOD; -- } -+ /* LDC2 : 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ -+ /* STC2 : 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ -+ /* CDP2 : 1111 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ -+ /* MCR2 : 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ -+ /* MRC2 : 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ - -- /* LDC2 : 1111 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ -- /* STC2 : 1111 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ -- if ((insn & 0xfe000000) == 0xfc000000) { -- insn &= 0xfff0ffff; /* Rn = r0 */ -- asi->insn[0] = insn; -- asi->insn_handler = emulate_ldcstc; -- return INSN_GOOD; -- } -- -- /* MCR2 : 1111 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ -- /* MRC2 : 1111 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ -- insn &= 0xffff0fff; /* Rd = r0 */ -- asi->insn[0] = insn; -- asi->insn_handler = (insn & (1 << 20)) ? emulate_rd12 : emulate_ird12; -- return INSN_GOOD; -+ return INSN_REJECTED; - } - - static enum kprobe_insn __kprobes -@@ -1010,19 +1013,18 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - /* cccc 0001 0xx0 xxxx xxxx xxxx xxxx xxx0 xxxx */ - if ((insn & 0x0f900010) == 0x01000000) { - -- /* BXJ : cccc 0001 0010 xxxx xxxx xxxx 0010 xxxx */ -- /* MSR : cccc 0001 0x10 xxxx xxxx xxxx 0000 xxxx */ -- if ((insn & 0x0ff000f0) == 0x01200020 || -- (insn & 0x0fb000f0) == 0x01200000) -- return INSN_REJECTED; -- -- /* MRS : cccc 0001 0x00 xxxx xxxx xxxx 0000 xxxx */ -- if ((insn & 0x0fb00010) == 0x01000000) -- return prep_emulate_rd12(insn, asi); -+ /* MRS cpsr : cccc 0001 0000 xxxx xxxx xxxx 0000 xxxx */ -+ if ((insn & 0x0ff000f0) == 0x01000000) { -+ if (is_r15(insn, 12)) -+ return INSN_REJECTED; /* Rd is PC */ -+ asi->insn_handler = simulate_mrs; -+ return INSN_GOOD_NO_SLOT; -+ } - - /* SMLALxy : cccc 0001 0100 xxxx xxxx xxxx 1xx0 xxxx */ - if ((insn & 0x0ff00090) == 0x01400080) -- return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, asi); -+ return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, -+ asi); - - /* SMULWy : cccc 0001 0010 xxxx xxxx xxxx 1x10 xxxx */ - /* SMULxy : cccc 0001 0110 xxxx xxxx xxxx 1xx0 xxxx */ -@@ -1031,24 +1033,29 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - return prep_emulate_rd16rs8rm0_wflags(insn, asi); - - /* SMLAxy : cccc 0001 0000 xxxx xxxx xxxx 1xx0 xxxx : Q */ -- /* SMLAWy : cccc 0001 0010 xxxx xxxx xxxx 0x00 xxxx : Q */ -- return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); -+ /* SMLAWy : cccc 0001 0010 xxxx xxxx xxxx 1x00 xxxx : Q */ -+ if ((insn & 0x0ff00090) == 0x01000080 || -+ (insn & 0x0ff000b0) == 0x01200080) -+ return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); -+ -+ /* BXJ : cccc 0001 0010 xxxx xxxx xxxx 0010 xxxx */ -+ /* MSR : cccc 0001 0x10 xxxx xxxx xxxx 0000 xxxx */ -+ /* MRS spsr : cccc 0001 0100 xxxx xxxx xxxx 0000 xxxx */ - -+ /* Other instruction encodings aren't yet defined */ -+ return INSN_REJECTED; - } - - /* cccc 0001 0xx0 xxxx xxxx xxxx xxxx 0xx1 xxxx */ - else if ((insn & 0x0f900090) == 0x01000010) { - -- /* BKPT : 1110 0001 0010 xxxx xxxx xxxx 0111 xxxx */ -- if ((insn & 0xfff000f0) == 0xe1200070) -- return INSN_REJECTED; -- - /* BLX(2) : cccc 0001 0010 xxxx xxxx xxxx 0011 xxxx */ - /* BX : cccc 0001 0010 xxxx xxxx xxxx 0001 xxxx */ - if ((insn & 0x0ff000d0) == 0x01200010) { -- asi->insn[0] = truecc_insn(insn); -+ if ((insn & 0x0ff000ff) == 0x0120003f) -+ return INSN_REJECTED; /* BLX pc */ - asi->insn_handler = simulate_blx2bx; -- return INSN_GOOD; -+ return INSN_GOOD_NO_SLOT; - } - - /* CLZ : cccc 0001 0110 xxxx xxxx xxxx 0001 xxxx */ -@@ -1059,17 +1066,27 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - /* QSUB : cccc 0001 0010 xxxx xxxx xxxx 0101 xxxx :Q */ - /* QDADD : cccc 0001 0100 xxxx xxxx xxxx 0101 xxxx :Q */ - /* QDSUB : cccc 0001 0110 xxxx xxxx xxxx 0101 xxxx :Q */ -- return prep_emulate_rd12rn16rm0_wflags(insn, asi); -+ if ((insn & 0x0f9000f0) == 0x01000050) -+ return prep_emulate_rd12rn16rm0_wflags(insn, asi); -+ -+ /* BKPT : 1110 0001 0010 xxxx xxxx xxxx 0111 xxxx */ -+ /* SMC : cccc 0001 0110 xxxx xxxx xxxx 0111 xxxx */ -+ -+ /* Other instruction encodings aren't yet defined */ -+ return INSN_REJECTED; - } - - /* cccc 0000 xxxx xxxx xxxx xxxx xxxx 1001 xxxx */ -- else if ((insn & 0x0f000090) == 0x00000090) { -+ else if ((insn & 0x0f0000f0) == 0x00000090) { - - /* MUL : cccc 0000 0000 xxxx xxxx xxxx 1001 xxxx : */ - /* MULS : cccc 0000 0001 xxxx xxxx xxxx 1001 xxxx :cc */ - /* MLA : cccc 0000 0010 xxxx xxxx xxxx 1001 xxxx : */ - /* MLAS : cccc 0000 0011 xxxx xxxx xxxx 1001 xxxx :cc */ - /* UMAAL : cccc 0000 0100 xxxx xxxx xxxx 1001 xxxx : */ -+ /* undef : cccc 0000 0101 xxxx xxxx xxxx 1001 xxxx : */ -+ /* MLS : cccc 0000 0110 xxxx xxxx xxxx 1001 xxxx : */ -+ /* undef : cccc 0000 0111 xxxx xxxx xxxx 1001 xxxx : */ - /* UMULL : cccc 0000 1000 xxxx xxxx xxxx 1001 xxxx : */ - /* UMULLS : cccc 0000 1001 xxxx xxxx xxxx 1001 xxxx :cc */ - /* UMLAL : cccc 0000 1010 xxxx xxxx xxxx 1001 xxxx : */ -@@ -1078,13 +1095,15 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - /* SMULLS : cccc 0000 1101 xxxx xxxx xxxx 1001 xxxx :cc */ - /* SMLAL : cccc 0000 1110 xxxx xxxx xxxx 1001 xxxx : */ - /* SMLALS : cccc 0000 1111 xxxx xxxx xxxx 1001 xxxx :cc */ -- if ((insn & 0x0fe000f0) == 0x00000090) { -- return prep_emulate_rd16rs8rm0_wflags(insn, asi); -- } else if ((insn & 0x0fe000f0) == 0x00200090) { -- return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); -- } else { -- return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, asi); -- } -+ if ((insn & 0x00d00000) == 0x00500000) -+ return INSN_REJECTED; -+ else if ((insn & 0x00e00000) == 0x00000000) -+ return prep_emulate_rd16rs8rm0_wflags(insn, asi); -+ else if ((insn & 0x00a00000) == 0x00200000) -+ return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); -+ else -+ return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, -+ asi); - } - - /* cccc 000x xxxx xxxx xxxx xxxx xxxx 1xx1 xxxx */ -@@ -1092,23 +1111,45 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - - /* SWP : cccc 0001 0000 xxxx xxxx xxxx 1001 xxxx */ - /* SWPB : cccc 0001 0100 xxxx xxxx xxxx 1001 xxxx */ -- /* LDRD : cccc 000x xxx0 xxxx xxxx xxxx 1101 xxxx */ -- /* STRD : cccc 000x xxx0 xxxx xxxx xxxx 1111 xxxx */ -+ /* ??? : cccc 0001 0x01 xxxx xxxx xxxx 1001 xxxx */ -+ /* ??? : cccc 0001 0x10 xxxx xxxx xxxx 1001 xxxx */ -+ /* ??? : cccc 0001 0x11 xxxx xxxx xxxx 1001 xxxx */ - /* STREX : cccc 0001 1000 xxxx xxxx xxxx 1001 xxxx */ - /* LDREX : cccc 0001 1001 xxxx xxxx xxxx 1001 xxxx */ -+ /* STREXD: cccc 0001 1010 xxxx xxxx xxxx 1001 xxxx */ -+ /* LDREXD: cccc 0001 1011 xxxx xxxx xxxx 1001 xxxx */ -+ /* STREXB: cccc 0001 1100 xxxx xxxx xxxx 1001 xxxx */ -+ /* LDREXB: cccc 0001 1101 xxxx xxxx xxxx 1001 xxxx */ -+ /* STREXH: cccc 0001 1110 xxxx xxxx xxxx 1001 xxxx */ -+ /* LDREXH: cccc 0001 1111 xxxx xxxx xxxx 1001 xxxx */ -+ -+ /* LDRD : cccc 000x xxx0 xxxx xxxx xxxx 1101 xxxx */ -+ /* STRD : cccc 000x xxx0 xxxx xxxx xxxx 1111 xxxx */ - /* LDRH : cccc 000x xxx1 xxxx xxxx xxxx 1011 xxxx */ - /* STRH : cccc 000x xxx0 xxxx xxxx xxxx 1011 xxxx */ - /* LDRSB : cccc 000x xxx1 xxxx xxxx xxxx 1101 xxxx */ - /* LDRSH : cccc 000x xxx1 xxxx xxxx xxxx 1111 xxxx */ -- if ((insn & 0x0fb000f0) == 0x01000090) { -- /* SWP/SWPB */ -- return prep_emulate_rd12rn16rm0_wflags(insn, asi); -+ if ((insn & 0x0f0000f0) == 0x01000090) { -+ if ((insn & 0x0fb000f0) == 0x01000090) { -+ /* SWP/SWPB */ -+ return prep_emulate_rd12rn16rm0_wflags(insn, -+ asi); -+ } else { -+ /* STREX/LDREX variants and unallocaed space */ -+ return INSN_REJECTED; -+ } -+ - } else if ((insn & 0x0e1000d0) == 0x00000d0) { - /* STRD/LDRD */ -+ if ((insn & 0x0000e000) == 0x0000e000) -+ return INSN_REJECTED; /* Rd is LR or PC */ -+ if (is_writeback(insn) && is_r15(insn, 16)) -+ return INSN_REJECTED; /* Writeback to PC */ -+ - insn &= 0xfff00fff; - insn |= 0x00002000; /* Rn = r0, Rd = r2 */ -- if (insn & (1 << 22)) { -- /* I bit */ -+ if (!(insn & (1 << 22))) { -+ /* Register index */ - insn &= ~0xf; - insn |= 1; /* Rm = r1 */ - } -@@ -1118,6 +1159,9 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - return INSN_GOOD; - } - -+ /* LDRH/STRH/LDRSB/LDRSH */ -+ if (is_r15(insn, 12)) -+ return INSN_REJECTED; /* Rd is PC */ - return prep_emulate_ldr_str(insn, asi); - } - -@@ -1125,7 +1169,7 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - - /* - * ALU op with S bit and Rd == 15 : -- * cccc 000x xxx1 xxxx 1111 xxxx xxxx xxxx -+ * cccc 000x xxx1 xxxx 1111 xxxx xxxx xxxx - */ - if ((insn & 0x0e10f000) == 0x0010f000) - return INSN_REJECTED; -@@ -1154,22 +1198,61 @@ space_cccc_000x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - insn |= 0x00000200; /* Rs = r2 */ - } - asi->insn[0] = insn; -- asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ -+ -+ if ((insn & 0x0f900000) == 0x01100000) { -+ /* -+ * TST : cccc 0001 0001 xxxx xxxx xxxx xxxx xxxx -+ * TEQ : cccc 0001 0011 xxxx xxxx xxxx xxxx xxxx -+ * CMP : cccc 0001 0101 xxxx xxxx xxxx xxxx xxxx -+ * CMN : cccc 0001 0111 xxxx xxxx xxxx xxxx xxxx -+ */ -+ asi->insn_handler = emulate_alu_tests; -+ } else { -+ /* ALU ops which write to Rd */ -+ asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ - emulate_alu_rwflags : emulate_alu_rflags; -+ } - return INSN_GOOD; - } - - static enum kprobe_insn __kprobes - space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - { -+ /* MOVW : cccc 0011 0000 xxxx xxxx xxxx xxxx xxxx */ -+ /* MOVT : cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx */ -+ if ((insn & 0x0fb00000) == 0x03000000) -+ return prep_emulate_rd12_modify(insn, asi); -+ -+ /* hints : cccc 0011 0010 0000 xxxx xxxx xxxx xxxx */ -+ if ((insn & 0x0fff0000) == 0x03200000) { -+ unsigned op2 = insn & 0x000000ff; -+ if (op2 == 0x01 || op2 == 0x04) { -+ /* YIELD : cccc 0011 0010 0000 xxxx xxxx 0000 0001 */ -+ /* SEV : cccc 0011 0010 0000 xxxx xxxx 0000 0100 */ -+ asi->insn[0] = insn; -+ asi->insn_handler = emulate_none; -+ return INSN_GOOD; -+ } else if (op2 <= 0x03) { -+ /* NOP : cccc 0011 0010 0000 xxxx xxxx 0000 0000 */ -+ /* WFE : cccc 0011 0010 0000 xxxx xxxx 0000 0010 */ -+ /* WFI : cccc 0011 0010 0000 xxxx xxxx 0000 0011 */ -+ /* -+ * We make WFE and WFI true NOPs to avoid stalls due -+ * to missing events whilst processing the probe. -+ */ -+ asi->insn_handler = emulate_nop; -+ return INSN_GOOD_NO_SLOT; -+ } -+ /* For DBG and unallocated hints it's safest to reject them */ -+ return INSN_REJECTED; -+ } -+ - /* - * MSR : cccc 0011 0x10 xxxx xxxx xxxx xxxx xxxx -- * Undef : cccc 0011 0100 xxxx xxxx xxxx xxxx xxxx - * ALU op with S bit and Rd == 15 : - * cccc 001x xxx1 xxxx 1111 xxxx xxxx xxxx - */ - if ((insn & 0x0fb00000) == 0x03200000 || /* MSR */ -- (insn & 0x0ff00000) == 0x03400000 || /* Undef */ - (insn & 0x0e10f000) == 0x0210f000) /* ALU s-bit, R15 */ - return INSN_REJECTED; - -@@ -1180,10 +1263,22 @@ space_cccc_001x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - * *S (bit 20) updates condition codes - * ADC/SBC/RSC reads the C flag - */ -- insn &= 0xffff0fff; /* Rd = r0 */ -+ insn &= 0xfff00fff; /* Rn = r0 and Rd = r0 */ - asi->insn[0] = insn; -- asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ -+ -+ if ((insn & 0x0f900000) == 0x03100000) { -+ /* -+ * TST : cccc 0011 0001 xxxx xxxx xxxx xxxx xxxx -+ * TEQ : cccc 0011 0011 xxxx xxxx xxxx xxxx xxxx -+ * CMP : cccc 0011 0101 xxxx xxxx xxxx xxxx xxxx -+ * CMN : cccc 0011 0111 xxxx xxxx xxxx xxxx xxxx -+ */ -+ asi->insn_handler = emulate_alu_tests_imm; -+ } else { -+ /* ALU ops which write to Rd */ -+ asi->insn_handler = (insn & (1 << 20)) ? /* S-bit */ - emulate_alu_imm_rwflags : emulate_alu_imm_rflags; -+ } - return INSN_GOOD; - } - -@@ -1192,6 +1287,8 @@ space_cccc_0110__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) - { - /* SEL : cccc 0110 1000 xxxx xxxx xxxx 1011 xxxx GE: !!! */ - if ((insn & 0x0ff000f0) == 0x068000b0) { -+ if (is_r15(insn, 12)) -+ return INSN_REJECTED; /* Rd is PC */ - insn &= 0xfff00ff0; /* Rd = r0, Rn = r0 */ - insn |= 0x00000001; /* Rm = r1 */ - asi->insn[0] = insn; -@@ -1205,6 +1302,8 @@ space_cccc_0110__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) - /* USAT16 : cccc 0110 1110 xxxx xxxx xxxx 0011 xxxx :Q */ - if ((insn & 0x0fa00030) == 0x06a00010 || - (insn & 0x0fb000f0) == 0x06a00030) { -+ if (is_r15(insn, 12)) -+ return INSN_REJECTED; /* Rd is PC */ - insn &= 0xffff0ff0; /* Rd = r0, Rm = r0 */ - asi->insn[0] = insn; - asi->insn_handler = emulate_sat; -@@ -1213,57 +1312,101 @@ space_cccc_0110__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) - - /* REV : cccc 0110 1011 xxxx xxxx xxxx 0011 xxxx */ - /* REV16 : cccc 0110 1011 xxxx xxxx xxxx 1011 xxxx */ -+ /* RBIT : cccc 0110 1111 xxxx xxxx xxxx 0011 xxxx */ - /* REVSH : cccc 0110 1111 xxxx xxxx xxxx 1011 xxxx */ - if ((insn & 0x0ff00070) == 0x06b00030 || -- (insn & 0x0ff000f0) == 0x06f000b0) -+ (insn & 0x0ff00070) == 0x06f00030) - return prep_emulate_rd12rm0(insn, asi); - -+ /* ??? : cccc 0110 0000 xxxx xxxx xxxx xxx1 xxxx : */ - /* SADD16 : cccc 0110 0001 xxxx xxxx xxxx 0001 xxxx :GE */ - /* SADDSUBX : cccc 0110 0001 xxxx xxxx xxxx 0011 xxxx :GE */ - /* SSUBADDX : cccc 0110 0001 xxxx xxxx xxxx 0101 xxxx :GE */ - /* SSUB16 : cccc 0110 0001 xxxx xxxx xxxx 0111 xxxx :GE */ - /* SADD8 : cccc 0110 0001 xxxx xxxx xxxx 1001 xxxx :GE */ -+ /* ??? : cccc 0110 0001 xxxx xxxx xxxx 1011 xxxx : */ -+ /* ??? : cccc 0110 0001 xxxx xxxx xxxx 1101 xxxx : */ - /* SSUB8 : cccc 0110 0001 xxxx xxxx xxxx 1111 xxxx :GE */ - /* QADD16 : cccc 0110 0010 xxxx xxxx xxxx 0001 xxxx : */ - /* QADDSUBX : cccc 0110 0010 xxxx xxxx xxxx 0011 xxxx : */ - /* QSUBADDX : cccc 0110 0010 xxxx xxxx xxxx 0101 xxxx : */ - /* QSUB16 : cccc 0110 0010 xxxx xxxx xxxx 0111 xxxx : */ - /* QADD8 : cccc 0110 0010 xxxx xxxx xxxx 1001 xxxx : */ -+ /* ??? : cccc 0110 0010 xxxx xxxx xxxx 1011 xxxx : */ -+ /* ??? : cccc 0110 0010 xxxx xxxx xxxx 1101 xxxx : */ - /* QSUB8 : cccc 0110 0010 xxxx xxxx xxxx 1111 xxxx : */ - /* SHADD16 : cccc 0110 0011 xxxx xxxx xxxx 0001 xxxx : */ - /* SHADDSUBX : cccc 0110 0011 xxxx xxxx xxxx 0011 xxxx : */ - /* SHSUBADDX : cccc 0110 0011 xxxx xxxx xxxx 0101 xxxx : */ - /* SHSUB16 : cccc 0110 0011 xxxx xxxx xxxx 0111 xxxx : */ - /* SHADD8 : cccc 0110 0011 xxxx xxxx xxxx 1001 xxxx : */ -+ /* ??? : cccc 0110 0011 xxxx xxxx xxxx 1011 xxxx : */ -+ /* ??? : cccc 0110 0011 xxxx xxxx xxxx 1101 xxxx : */ - /* SHSUB8 : cccc 0110 0011 xxxx xxxx xxxx 1111 xxxx : */ -+ /* ??? : cccc 0110 0100 xxxx xxxx xxxx xxx1 xxxx : */ - /* UADD16 : cccc 0110 0101 xxxx xxxx xxxx 0001 xxxx :GE */ - /* UADDSUBX : cccc 0110 0101 xxxx xxxx xxxx 0011 xxxx :GE */ - /* USUBADDX : cccc 0110 0101 xxxx xxxx xxxx 0101 xxxx :GE */ - /* USUB16 : cccc 0110 0101 xxxx xxxx xxxx 0111 xxxx :GE */ - /* UADD8 : cccc 0110 0101 xxxx xxxx xxxx 1001 xxxx :GE */ -+ /* ??? : cccc 0110 0101 xxxx xxxx xxxx 1011 xxxx : */ -+ /* ??? : cccc 0110 0101 xxxx xxxx xxxx 1101 xxxx : */ - /* USUB8 : cccc 0110 0101 xxxx xxxx xxxx 1111 xxxx :GE */ - /* UQADD16 : cccc 0110 0110 xxxx xxxx xxxx 0001 xxxx : */ - /* UQADDSUBX : cccc 0110 0110 xxxx xxxx xxxx 0011 xxxx : */ - /* UQSUBADDX : cccc 0110 0110 xxxx xxxx xxxx 0101 xxxx : */ - /* UQSUB16 : cccc 0110 0110 xxxx xxxx xxxx 0111 xxxx : */ - /* UQADD8 : cccc 0110 0110 xxxx xxxx xxxx 1001 xxxx : */ -+ /* ??? : cccc 0110 0110 xxxx xxxx xxxx 1011 xxxx : */ -+ /* ??? : cccc 0110 0110 xxxx xxxx xxxx 1101 xxxx : */ - /* UQSUB8 : cccc 0110 0110 xxxx xxxx xxxx 1111 xxxx : */ - /* UHADD16 : cccc 0110 0111 xxxx xxxx xxxx 0001 xxxx : */ - /* UHADDSUBX : cccc 0110 0111 xxxx xxxx xxxx 0011 xxxx : */ - /* UHSUBADDX : cccc 0110 0111 xxxx xxxx xxxx 0101 xxxx : */ - /* UHSUB16 : cccc 0110 0111 xxxx xxxx xxxx 0111 xxxx : */ - /* UHADD8 : cccc 0110 0111 xxxx xxxx xxxx 1001 xxxx : */ -+ /* ??? : cccc 0110 0111 xxxx xxxx xxxx 1011 xxxx : */ -+ /* ??? : cccc 0110 0111 xxxx xxxx xxxx 1101 xxxx : */ - /* UHSUB8 : cccc 0110 0111 xxxx xxxx xxxx 1111 xxxx : */ -+ if ((insn & 0x0f800010) == 0x06000010) { -+ if ((insn & 0x00300000) == 0x00000000 || -+ (insn & 0x000000e0) == 0x000000a0 || -+ (insn & 0x000000e0) == 0x000000c0) -+ return INSN_REJECTED; /* Unallocated space */ -+ return prep_emulate_rd12rn16rm0_wflags(insn, asi); -+ } -+ - /* PKHBT : cccc 0110 1000 xxxx xxxx xxxx x001 xxxx : */ - /* PKHTB : cccc 0110 1000 xxxx xxxx xxxx x101 xxxx : */ -+ if ((insn & 0x0ff00030) == 0x06800010) -+ return prep_emulate_rd12rn16rm0_wflags(insn, asi); -+ - /* SXTAB16 : cccc 0110 1000 xxxx xxxx xxxx 0111 xxxx : */ -- /* SXTB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */ -+ /* SXTB16 : cccc 0110 1000 1111 xxxx xxxx 0111 xxxx : */ -+ /* ??? : cccc 0110 1001 xxxx xxxx xxxx 0111 xxxx : */ - /* SXTAB : cccc 0110 1010 xxxx xxxx xxxx 0111 xxxx : */ -+ /* SXTB : cccc 0110 1010 1111 xxxx xxxx 0111 xxxx : */ - /* SXTAH : cccc 0110 1011 xxxx xxxx xxxx 0111 xxxx : */ -+ /* SXTH : cccc 0110 1011 1111 xxxx xxxx 0111 xxxx : */ - /* UXTAB16 : cccc 0110 1100 xxxx xxxx xxxx 0111 xxxx : */ -+ /* UXTB16 : cccc 0110 1100 1111 xxxx xxxx 0111 xxxx : */ -+ /* ??? : cccc 0110 1101 xxxx xxxx xxxx 0111 xxxx : */ - /* UXTAB : cccc 0110 1110 xxxx xxxx xxxx 0111 xxxx : */ -+ /* UXTB : cccc 0110 1110 1111 xxxx xxxx 0111 xxxx : */ - /* UXTAH : cccc 0110 1111 xxxx xxxx xxxx 0111 xxxx : */ -- return prep_emulate_rd12rn16rm0_wflags(insn, asi); -+ /* UXTH : cccc 0110 1111 1111 xxxx xxxx 0111 xxxx : */ -+ if ((insn & 0x0f8000f0) == 0x06800070) { -+ if ((insn & 0x00300000) == 0x00100000) -+ return INSN_REJECTED; /* Unallocated space */ -+ -+ if ((insn & 0x000f0000) == 0x000f0000) -+ return prep_emulate_rd12rm0(insn, asi); -+ else -+ return prep_emulate_rd12rn16rm0_wflags(insn, asi); -+ } -+ -+ /* Other instruction encodings aren't yet defined */ -+ return INSN_REJECTED; - } - - static enum kprobe_insn __kprobes -@@ -1273,29 +1416,49 @@ space_cccc_0111__1(kprobe_opcode_t insn, struct arch_specific_insn *asi) - if ((insn & 0x0ff000f0) == 0x03f000f0) - return INSN_REJECTED; - -- /* USADA8 : cccc 0111 1000 xxxx xxxx xxxx 0001 xxxx */ -- /* USAD8 : cccc 0111 1000 xxxx 1111 xxxx 0001 xxxx */ -- if ((insn & 0x0ff000f0) == 0x07800010) -- return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); -- - /* SMLALD : cccc 0111 0100 xxxx xxxx xxxx 00x1 xxxx */ - /* SMLSLD : cccc 0111 0100 xxxx xxxx xxxx 01x1 xxxx */ - if ((insn & 0x0ff00090) == 0x07400010) - return prep_emulate_rdhi16rdlo12rs8rm0_wflags(insn, asi); - - /* SMLAD : cccc 0111 0000 xxxx xxxx xxxx 00x1 xxxx :Q */ -+ /* SMUAD : cccc 0111 0000 xxxx 1111 xxxx 00x1 xxxx :Q */ - /* SMLSD : cccc 0111 0000 xxxx xxxx xxxx 01x1 xxxx :Q */ -+ /* SMUSD : cccc 0111 0000 xxxx 1111 xxxx 01x1 xxxx : */ - /* SMMLA : cccc 0111 0101 xxxx xxxx xxxx 00x1 xxxx : */ -- /* SMMLS : cccc 0111 0101 xxxx xxxx xxxx 11x1 xxxx : */ -+ /* SMMUL : cccc 0111 0101 xxxx 1111 xxxx 00x1 xxxx : */ -+ /* USADA8 : cccc 0111 1000 xxxx xxxx xxxx 0001 xxxx : */ -+ /* USAD8 : cccc 0111 1000 xxxx 1111 xxxx 0001 xxxx : */ - if ((insn & 0x0ff00090) == 0x07000010 || - (insn & 0x0ff000d0) == 0x07500010 || -- (insn & 0x0ff000d0) == 0x075000d0) -+ (insn & 0x0ff000f0) == 0x07800010) { -+ -+ if ((insn & 0x0000f000) == 0x0000f000) -+ return prep_emulate_rd16rs8rm0_wflags(insn, asi); -+ else -+ return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); -+ } -+ -+ /* SMMLS : cccc 0111 0101 xxxx xxxx xxxx 11x1 xxxx : */ -+ if ((insn & 0x0ff000d0) == 0x075000d0) - return prep_emulate_rd16rn12rs8rm0_wflags(insn, asi); - -- /* SMUSD : cccc 0111 0000 xxxx xxxx xxxx 01x1 xxxx : */ -- /* SMUAD : cccc 0111 0000 xxxx 1111 xxxx 00x1 xxxx :Q */ -- /* SMMUL : cccc 0111 0101 xxxx 1111 xxxx 00x1 xxxx : */ -- return prep_emulate_rd16rs8rm0_wflags(insn, asi); -+ /* SBFX : cccc 0111 101x xxxx xxxx xxxx x101 xxxx : */ -+ /* UBFX : cccc 0111 111x xxxx xxxx xxxx x101 xxxx : */ -+ if ((insn & 0x0fa00070) == 0x07a00050) -+ return prep_emulate_rd12rm0(insn, asi); -+ -+ /* BFI : cccc 0111 110x xxxx xxxx xxxx x001 xxxx : */ -+ /* BFC : cccc 0111 110x xxxx xxxx xxxx x001 1111 : */ -+ if ((insn & 0x0fe00070) == 0x07c00010) { -+ -+ if ((insn & 0x0000000f) == 0x0000000f) -+ return prep_emulate_rd12_modify(insn, asi); -+ else -+ return prep_emulate_rd12rn0_modify(insn, asi); -+ } -+ -+ return INSN_REJECTED; - } - - static enum kprobe_insn __kprobes -@@ -1309,6 +1472,10 @@ space_cccc_01xx(kprobe_opcode_t insn, struct arch_specific_insn *asi) - /* STRB : cccc 01xx x1x0 xxxx xxxx xxxx xxxx xxxx */ - /* STRBT : cccc 01x0 x110 xxxx xxxx xxxx xxxx xxxx */ - /* STRT : cccc 01x0 x010 xxxx xxxx xxxx xxxx xxxx */ -+ -+ if ((insn & 0x00500000) == 0x00500000 && is_r15(insn, 12)) -+ return INSN_REJECTED; /* LDRB into PC */ -+ - return prep_emulate_ldr_str(insn, asi); - } - -@@ -1323,10 +1490,9 @@ space_cccc_100x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - - /* LDM(1) : cccc 100x x0x1 xxxx xxxx xxxx xxxx xxxx */ - /* STM(1) : cccc 100x x0x0 xxxx xxxx xxxx xxxx xxxx */ -- asi->insn[0] = truecc_insn(insn); - asi->insn_handler = ((insn & 0x108000) == 0x008000) ? /* STM & R15 */ - simulate_stm1_pc : simulate_ldm1stm1; -- return INSN_GOOD; -+ return INSN_GOOD_NO_SLOT; - } - - static enum kprobe_insn __kprobes -@@ -1334,58 +1500,117 @@ space_cccc_101x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - { - /* B : cccc 1010 xxxx xxxx xxxx xxxx xxxx xxxx */ - /* BL : cccc 1011 xxxx xxxx xxxx xxxx xxxx xxxx */ -- asi->insn[0] = truecc_insn(insn); - asi->insn_handler = simulate_bbl; -- return INSN_GOOD; -+ return INSN_GOOD_NO_SLOT; - } - - static enum kprobe_insn __kprobes --space_cccc_1100_010x(kprobe_opcode_t insn, struct arch_specific_insn *asi) -+space_cccc_11xx(kprobe_opcode_t insn, struct arch_specific_insn *asi) - { -+ /* Coprocessor instructions... */ - /* MCRR : cccc 1100 0100 xxxx xxxx xxxx xxxx xxxx : (Rd!=Rn) */ - /* MRRC : cccc 1100 0101 xxxx xxxx xxxx xxxx xxxx : (Rd!=Rn) */ -- insn &= 0xfff00fff; -- insn |= 0x00001000; /* Rn = r0, Rd = r1 */ -- asi->insn[0] = insn; -- asi->insn_handler = (insn & (1 << 20)) ? emulate_mrrc : emulate_mcrr; -- return INSN_GOOD; -+ /* LDC : cccc 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ -+ /* STC : cccc 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ -+ /* CDP : cccc 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ -+ /* MCR : cccc 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ -+ /* MRC : cccc 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ -+ -+ /* SVC : cccc 1111 xxxx xxxx xxxx xxxx xxxx xxxx */ -+ -+ return INSN_REJECTED; - } - --static enum kprobe_insn __kprobes --space_cccc_110x(kprobe_opcode_t insn, struct arch_specific_insn *asi) -+static unsigned long __kprobes __check_eq(unsigned long cpsr) - { -- /* LDC : cccc 110x xxx1 xxxx xxxx xxxx xxxx xxxx */ -- /* STC : cccc 110x xxx0 xxxx xxxx xxxx xxxx xxxx */ -- insn &= 0xfff0ffff; /* Rn = r0 */ -- asi->insn[0] = insn; -- asi->insn_handler = emulate_ldcstc; -- return INSN_GOOD; -+ return cpsr & PSR_Z_BIT; - } - --static enum kprobe_insn __kprobes --space_cccc_111x(kprobe_opcode_t insn, struct arch_specific_insn *asi) -+static unsigned long __kprobes __check_ne(unsigned long cpsr) - { -- /* BKPT : 1110 0001 0010 xxxx xxxx xxxx 0111 xxxx */ -- /* SWI : cccc 1111 xxxx xxxx xxxx xxxx xxxx xxxx */ -- if ((insn & 0xfff000f0) == 0xe1200070 || -- (insn & 0x0f000000) == 0x0f000000) -- return INSN_REJECTED; -+ return (~cpsr) & PSR_Z_BIT; -+} - -- /* CDP : cccc 1110 xxxx xxxx xxxx xxxx xxx0 xxxx */ -- if ((insn & 0x0f000010) == 0x0e000000) { -- asi->insn[0] = insn; -- asi->insn_handler = emulate_none; -- return INSN_GOOD; -- } -+static unsigned long __kprobes __check_cs(unsigned long cpsr) -+{ -+ return cpsr & PSR_C_BIT; -+} - -- /* MCR : cccc 1110 xxx0 xxxx xxxx xxxx xxx1 xxxx */ -- /* MRC : cccc 1110 xxx1 xxxx xxxx xxxx xxx1 xxxx */ -- insn &= 0xffff0fff; /* Rd = r0 */ -- asi->insn[0] = insn; -- asi->insn_handler = (insn & (1 << 20)) ? emulate_rd12 : emulate_ird12; -- return INSN_GOOD; -+static unsigned long __kprobes __check_cc(unsigned long cpsr) -+{ -+ return (~cpsr) & PSR_C_BIT; -+} -+ -+static unsigned long __kprobes __check_mi(unsigned long cpsr) -+{ -+ return cpsr & PSR_N_BIT; -+} -+ -+static unsigned long __kprobes __check_pl(unsigned long cpsr) -+{ -+ return (~cpsr) & PSR_N_BIT; -+} -+ -+static unsigned long __kprobes __check_vs(unsigned long cpsr) -+{ -+ return cpsr & PSR_V_BIT; -+} -+ -+static unsigned long __kprobes __check_vc(unsigned long cpsr) -+{ -+ return (~cpsr) & PSR_V_BIT; -+} -+ -+static unsigned long __kprobes __check_hi(unsigned long cpsr) -+{ -+ cpsr &= ~(cpsr >> 1); /* PSR_C_BIT &= ~PSR_Z_BIT */ -+ return cpsr & PSR_C_BIT; - } - -+static unsigned long __kprobes __check_ls(unsigned long cpsr) -+{ -+ cpsr &= ~(cpsr >> 1); /* PSR_C_BIT &= ~PSR_Z_BIT */ -+ return (~cpsr) & PSR_C_BIT; -+} -+ -+static unsigned long __kprobes __check_ge(unsigned long cpsr) -+{ -+ cpsr ^= (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ -+ return (~cpsr) & PSR_N_BIT; -+} -+ -+static unsigned long __kprobes __check_lt(unsigned long cpsr) -+{ -+ cpsr ^= (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ -+ return cpsr & PSR_N_BIT; -+} -+ -+static unsigned long __kprobes __check_gt(unsigned long cpsr) -+{ -+ unsigned long temp = cpsr ^ (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ -+ temp |= (cpsr << 1); /* PSR_N_BIT |= PSR_Z_BIT */ -+ return (~temp) & PSR_N_BIT; -+} -+ -+static unsigned long __kprobes __check_le(unsigned long cpsr) -+{ -+ unsigned long temp = cpsr ^ (cpsr << 3); /* PSR_N_BIT ^= PSR_V_BIT */ -+ temp |= (cpsr << 1); /* PSR_N_BIT |= PSR_Z_BIT */ -+ return temp & PSR_N_BIT; -+} -+ -+static unsigned long __kprobes __check_al(unsigned long cpsr) -+{ -+ return true; -+} -+ -+static kprobe_check_cc * const condition_checks[16] = { -+ &__check_eq, &__check_ne, &__check_cs, &__check_cc, -+ &__check_mi, &__check_pl, &__check_vs, &__check_vc, -+ &__check_hi, &__check_ls, &__check_ge, &__check_lt, -+ &__check_gt, &__check_le, &__check_al, &__check_al -+}; -+ - /* Return: - * INSN_REJECTED If instruction is one not allowed to kprobe, - * INSN_GOOD If instruction is supported and uses instruction slot, -@@ -1401,133 +1626,45 @@ space_cccc_111x(kprobe_opcode_t insn, struct arch_specific_insn *asi) - enum kprobe_insn __kprobes - arm_kprobe_decode_insn(kprobe_opcode_t insn, struct arch_specific_insn *asi) - { -+ asi->insn_check_cc = condition_checks[insn>>28]; - asi->insn[1] = KPROBE_RETURN_INSTRUCTION; - -- if ((insn & 0xf0000000) == 0xf0000000) { -+ if ((insn & 0xf0000000) == 0xf0000000) - - return space_1111(insn, asi); - -- } else if ((insn & 0x0e000000) == 0x00000000) { -+ else if ((insn & 0x0e000000) == 0x00000000) - - return space_cccc_000x(insn, asi); - -- } else if ((insn & 0x0e000000) == 0x02000000) { -+ else if ((insn & 0x0e000000) == 0x02000000) - - return space_cccc_001x(insn, asi); - -- } else if ((insn & 0x0f000010) == 0x06000010) { -+ else if ((insn & 0x0f000010) == 0x06000010) - - return space_cccc_0110__1(insn, asi); - -- } else if ((insn & 0x0f000010) == 0x07000010) { -+ else if ((insn & 0x0f000010) == 0x07000010) - - return space_cccc_0111__1(insn, asi); - -- } else if ((insn & 0x0c000000) == 0x04000000) { -+ else if ((insn & 0x0c000000) == 0x04000000) - - return space_cccc_01xx(insn, asi); - -- } else if ((insn & 0x0e000000) == 0x08000000) { -+ else if ((insn & 0x0e000000) == 0x08000000) - - return space_cccc_100x(insn, asi); - -- } else if ((insn & 0x0e000000) == 0x0a000000) { -+ else if ((insn & 0x0e000000) == 0x0a000000) - - return space_cccc_101x(insn, asi); - -- } else if ((insn & 0x0fe00000) == 0x0c400000) { -- -- return space_cccc_1100_010x(insn, asi); -- -- } else if ((insn & 0x0e000000) == 0x0c000000) { -- -- return space_cccc_110x(insn, asi); -- -- } -- -- return space_cccc_111x(insn, asi); -+ return space_cccc_11xx(insn, asi); - } - - void __init arm_kprobe_decode_init(void) - { - find_str_pc_offset(); - } -- -- --/* -- * All ARM instructions listed below. -- * -- * Instructions and their general purpose registers are given. -- * If a particular register may not use R15, it is prefixed with a "!". -- * If marked with a "*" means the value returned by reading R15 -- * is implementation defined. -- * -- * ADC/ADD/AND/BIC/CMN/CMP/EOR/MOV/MVN/ORR/RSB/RSC/SBC/SUB/TEQ -- * TST: Rd, Rn, Rm, !Rs -- * BX: Rm -- * BLX(2): !Rm -- * BX: Rm (R15 legal, but discouraged) -- * BXJ: !Rm, -- * CLZ: !Rd, !Rm -- * CPY: Rd, Rm -- * LDC/2,STC/2 immediate offset & unindex: Rn -- * LDC/2,STC/2 immediate pre/post-indexed: !Rn -- * LDM(1/3): !Rn, register_list -- * LDM(2): !Rn, !register_list -- * LDR,STR,PLD immediate offset: Rd, Rn -- * LDR,STR,PLD register offset: Rd, Rn, !Rm -- * LDR,STR,PLD scaled register offset: Rd, !Rn, !Rm -- * LDR,STR immediate pre/post-indexed: Rd, !Rn -- * LDR,STR register pre/post-indexed: Rd, !Rn, !Rm -- * LDR,STR scaled register pre/post-indexed: Rd, !Rn, !Rm -- * LDRB,STRB immediate offset: !Rd, Rn -- * LDRB,STRB register offset: !Rd, Rn, !Rm -- * LDRB,STRB scaled register offset: !Rd, !Rn, !Rm -- * LDRB,STRB immediate pre/post-indexed: !Rd, !Rn -- * LDRB,STRB register pre/post-indexed: !Rd, !Rn, !Rm -- * LDRB,STRB scaled register pre/post-indexed: !Rd, !Rn, !Rm -- * LDRT,LDRBT,STRBT immediate pre/post-indexed: !Rd, !Rn -- * LDRT,LDRBT,STRBT register pre/post-indexed: !Rd, !Rn, !Rm -- * LDRT,LDRBT,STRBT scaled register pre/post-indexed: !Rd, !Rn, !Rm -- * LDRH/SH/SB/D,STRH/SH/SB/D immediate offset: !Rd, Rn -- * LDRH/SH/SB/D,STRH/SH/SB/D register offset: !Rd, Rn, !Rm -- * LDRH/SH/SB/D,STRH/SH/SB/D immediate pre/post-indexed: !Rd, !Rn -- * LDRH/SH/SB/D,STRH/SH/SB/D register pre/post-indexed: !Rd, !Rn, !Rm -- * LDREX: !Rd, !Rn -- * MCR/2: !Rd -- * MCRR/2,MRRC/2: !Rd, !Rn -- * MLA: !Rd, !Rn, !Rm, !Rs -- * MOV: Rd -- * MRC/2: !Rd (if Rd==15, only changes cond codes, not the register) -- * MRS,MSR: !Rd -- * MUL: !Rd, !Rm, !Rs -- * PKH{BT,TB}: !Rd, !Rn, !Rm -- * QDADD,[U]QADD/16/8/SUBX: !Rd, !Rm, !Rn -- * QDSUB,[U]QSUB/16/8/ADDX: !Rd, !Rm, !Rn -- * REV/16/SH: !Rd, !Rm -- * RFE: !Rn -- * {S,U}[H]ADD{16,8,SUBX},{S,U}[H]SUB{16,8,ADDX}: !Rd, !Rn, !Rm -- * SEL: !Rd, !Rn, !Rm -- * SMLA,SMLA{D,W},SMLSD,SMML{A,S}: !Rd, !Rn, !Rm, !Rs -- * SMLAL,SMLA{D,LD},SMLSLD,SMMULL,SMULW: !RdHi, !RdLo, !Rm, !Rs -- * SMMUL,SMUAD,SMUL,SMUSD: !Rd, !Rm, !Rs -- * SSAT/16: !Rd, !Rm -- * STM(1/2): !Rn, register_list* (R15 in reg list not recommended) -- * STRT immediate pre/post-indexed: Rd*, !Rn -- * STRT register pre/post-indexed: Rd*, !Rn, !Rm -- * STRT scaled register pre/post-indexed: Rd*, !Rn, !Rm -- * STREX: !Rd, !Rn, !Rm -- * SWP/B: !Rd, !Rn, !Rm -- * {S,U}XTA{B,B16,H}: !Rd, !Rn, !Rm -- * {S,U}XT{B,B16,H}: !Rd, !Rm -- * UM{AA,LA,UL}L: !RdHi, !RdLo, !Rm, !Rs -- * USA{D8,A8,T,T16}: !Rd, !Rm, !Rs -- * -- * May transfer control by writing R15 (possible mode changes or alternate -- * mode accesses marked by "*"): -- * ALU op (* with s-bit), B, BL, BKPT, BLX(1/2), BX, BXJ, CPS*, CPY, -- * LDM(1), LDM(2/3)*, LDR, MOV, RFE*, SWI* -- * -- * Instructions that do not take general registers, nor transfer control: -- * CDP/2, SETEND, SRS* -- */ -diff --git a/arch/arm/kernel/kprobes.c b/arch/arm/kernel/kprobes.c -index 2ba7deb..1656c87 100644 ---- a/arch/arm/kernel/kprobes.c -+++ b/arch/arm/kernel/kprobes.c -@@ -134,7 +134,8 @@ static void __kprobes singlestep(struct kprobe *p, struct pt_regs *regs, - struct kprobe_ctlblk *kcb) - { - regs->ARM_pc += 4; -- p->ainsn.insn_handler(p, regs); -+ if (p->ainsn.insn_check_cc(regs->ARM_cpsr)) -+ p->ainsn.insn_handler(p, regs); - } - - /* -diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c -index 979da39..139e3c8 100644 ---- a/arch/arm/kernel/perf_event.c -+++ b/arch/arm/kernel/perf_event.c -@@ -746,7 +746,8 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) - - tail = (struct frame_tail __user *)regs->ARM_fp - 1; - -- while (tail && !((unsigned long)tail & 0x3)) -+ while ((entry->nr < PERF_MAX_STACK_DEPTH) && -+ tail && !((unsigned long)tail & 0x3)) - tail = user_backtrace(tail, entry); - } - -diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c -index 8fe05ad..f29b8a2 100644 ---- a/arch/arm/kernel/smp.c -+++ b/arch/arm/kernel/smp.c -@@ -479,7 +479,7 @@ static void broadcast_timer_set_mode(enum clock_event_mode mode, - { - } - --static void broadcast_timer_setup(struct clock_event_device *evt) -+static void __cpuinit broadcast_timer_setup(struct clock_event_device *evt) - { - evt->name = "dummy_timer"; - evt->features = CLOCK_EVT_FEAT_ONESHOT | -diff --git a/arch/arm/kernel/sys_oabi-compat.c b/arch/arm/kernel/sys_oabi-compat.c -index 4ad8da1..af0aaeb 100644 ---- a/arch/arm/kernel/sys_oabi-compat.c -+++ b/arch/arm/kernel/sys_oabi-compat.c -@@ -311,7 +311,7 @@ asmlinkage long sys_oabi_semtimedop(int semid, - long err; - int i; - -- if (nsops < 1) -+ if (nsops < 1 || nsops > SEMOPM) - return -EINVAL; - sops = kmalloc(sizeof(*sops) * nsops, GFP_KERNEL); - if (!sops) -diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig -index 32f1479..c0deaca 100644 ---- a/arch/arm/mach-davinci/Kconfig -+++ b/arch/arm/mach-davinci/Kconfig -@@ -63,6 +63,7 @@ config MACH_DAVINCI_EVM - depends on ARCH_DAVINCI_DM644x - select MISC_DEVICES - select EEPROM_AT24 -+ select I2C - help - Configure this option to specify the whether the board used - for development is a DM644x EVM -@@ -72,6 +73,7 @@ config MACH_SFFSDR - depends on ARCH_DAVINCI_DM644x - select MISC_DEVICES - select EEPROM_AT24 -+ select I2C - help - Say Y here to select the Lyrtech Small Form Factor - Software Defined Radio (SFFSDR) board. -@@ -105,6 +107,7 @@ config MACH_DAVINCI_DM6467_EVM - select MACH_DAVINCI_DM6467TEVM - select MISC_DEVICES - select EEPROM_AT24 -+ select I2C - help - Configure this option to specify the whether the board used - for development is a DM6467 EVM -@@ -118,6 +121,7 @@ config MACH_DAVINCI_DM365_EVM - depends on ARCH_DAVINCI_DM365 - select MISC_DEVICES - select EEPROM_AT24 -+ select I2C - help - Configure this option to specify whether the board used - for development is a DM365 EVM -@@ -129,6 +133,7 @@ config MACH_DAVINCI_DA830_EVM - select GPIO_PCF857X - select MISC_DEVICES - select EEPROM_AT24 -+ select I2C - help - Say Y here to select the TI DA830/OMAP-L137/AM17x Evaluation Module. - -@@ -205,6 +210,7 @@ config MACH_MITYOMAPL138 - depends on ARCH_DAVINCI_DA850 - select MISC_DEVICES - select EEPROM_AT24 -+ select I2C - help - Say Y here to select the Critical Link MityDSP-L138/MityARM-1808 - System on Module. Information on this SoM may be found at -diff --git a/arch/arm/mach-davinci/board-mityomapl138.c b/arch/arm/mach-davinci/board-mityomapl138.c -index 2aa79c5..606a6f2 100644 ---- a/arch/arm/mach-davinci/board-mityomapl138.c -+++ b/arch/arm/mach-davinci/board-mityomapl138.c -@@ -29,7 +29,7 @@ - #include - #include - --#define MITYOMAPL138_PHY_ID "0:03" -+#define MITYOMAPL138_PHY_ID "" - - #define FACTORY_CONFIG_MAGIC 0x012C0138 - #define FACTORY_CONFIG_VERSION 0x00010001 -@@ -414,7 +414,7 @@ static struct resource mityomapl138_nandflash_resource[] = { - - static struct platform_device mityomapl138_nandflash_device = { - .name = "davinci_nand", -- .id = 0, -+ .id = 1, - .dev = { - .platform_data = &mityomapl138_nandflash_data, - }, -diff --git a/arch/arm/mach-davinci/devices-da8xx.c b/arch/arm/mach-davinci/devices-da8xx.c -index 625d4b6..58a02dc 100644 ---- a/arch/arm/mach-davinci/devices-da8xx.c -+++ b/arch/arm/mach-davinci/devices-da8xx.c -@@ -39,7 +39,8 @@ - #define DA8XX_GPIO_BASE 0x01e26000 - #define DA8XX_I2C1_BASE 0x01e28000 - #define DA8XX_SPI0_BASE 0x01c41000 --#define DA8XX_SPI1_BASE 0x01f0e000 -+#define DA830_SPI1_BASE 0x01e12000 -+#define DA850_SPI1_BASE 0x01f0e000 - - #define DA8XX_EMAC_CTRL_REG_OFFSET 0x3000 - #define DA8XX_EMAC_MOD_REG_OFFSET 0x2000 -@@ -762,8 +763,8 @@ static struct resource da8xx_spi0_resources[] = { - - static struct resource da8xx_spi1_resources[] = { - [0] = { -- .start = DA8XX_SPI1_BASE, -- .end = DA8XX_SPI1_BASE + SZ_4K - 1, -+ .start = DA830_SPI1_BASE, -+ .end = DA830_SPI1_BASE + SZ_4K - 1, - .flags = IORESOURCE_MEM, - }, - [1] = { -@@ -832,5 +833,10 @@ int __init da8xx_register_spi(int instance, struct spi_board_info *info, - - da8xx_spi_pdata[instance].num_chipselect = len; - -+ if (instance == 1 && cpu_is_davinci_da850()) { -+ da8xx_spi1_resources[0].start = DA850_SPI1_BASE; -+ da8xx_spi1_resources[0].end = DA850_SPI1_BASE + SZ_4K - 1; -+ } -+ - return platform_device_register(&da8xx_spi_device[instance]); - } -diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c -index f680122..a3a94e9 100644 ---- a/arch/arm/mach-davinci/dm355.c -+++ b/arch/arm/mach-davinci/dm355.c -@@ -314,7 +314,7 @@ static struct clk timer2_clk = { - .name = "timer2", - .parent = &pll1_aux_clk, - .lpsc = DAVINCI_LPSC_TIMER2, -- .usecount = 1, /* REVISIT: why can't' this be disabled? */ -+ .usecount = 1, /* REVISIT: why can't this be disabled? */ - }; - - static struct clk timer3_clk = { -diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c -index 5f8a654..4c82c27 100644 ---- a/arch/arm/mach-davinci/dm644x.c -+++ b/arch/arm/mach-davinci/dm644x.c -@@ -274,7 +274,7 @@ static struct clk timer2_clk = { - .name = "timer2", - .parent = &pll1_aux_clk, - .lpsc = DAVINCI_LPSC_TIMER2, -- .usecount = 1, /* REVISIT: why can't' this be disabled? */ -+ .usecount = 1, /* REVISIT: why can't this be disabled? */ - }; - - static struct clk_lookup dm644x_clks[] = { -diff --git a/arch/arm/mach-davinci/include/mach/debug-macro.S b/arch/arm/mach-davinci/include/mach/debug-macro.S -index 9f1befc..f8b7ea4 100644 ---- a/arch/arm/mach-davinci/include/mach/debug-macro.S -+++ b/arch/arm/mach-davinci/include/mach/debug-macro.S -@@ -24,6 +24,9 @@ - - #define UART_SHIFT 2 - -+#define davinci_uart_v2p(x) ((x) - PAGE_OFFSET + PLAT_PHYS_OFFSET) -+#define davinci_uart_p2v(x) ((x) - PLAT_PHYS_OFFSET + PAGE_OFFSET) -+ - .pushsection .data - davinci_uart_phys: .word 0 - davinci_uart_virt: .word 0 -@@ -34,7 +37,7 @@ davinci_uart_virt: .word 0 - /* Use davinci_uart_phys/virt if already configured */ - 10: mrc p15, 0, \rp, c1, c0 - tst \rp, #1 @ MMU enabled? -- ldreq \rp, =__virt_to_phys(davinci_uart_phys) -+ ldreq \rp, =davinci_uart_v2p(davinci_uart_phys) - ldrne \rp, =davinci_uart_phys - add \rv, \rp, #4 @ davinci_uart_virt - ldr \rp, [\rp, #0] -@@ -48,18 +51,18 @@ davinci_uart_virt: .word 0 - tst \rp, #1 @ MMU enabled? - - /* Copy uart phys address from decompressor uart info */ -- ldreq \rv, =__virt_to_phys(davinci_uart_phys) -+ ldreq \rv, =davinci_uart_v2p(davinci_uart_phys) - ldrne \rv, =davinci_uart_phys - ldreq \rp, =DAVINCI_UART_INFO -- ldrne \rp, =__phys_to_virt(DAVINCI_UART_INFO) -+ ldrne \rp, =davinci_uart_p2v(DAVINCI_UART_INFO) - ldr \rp, [\rp, #0] - str \rp, [\rv] - - /* Copy uart virt address from decompressor uart info */ -- ldreq \rv, =__virt_to_phys(davinci_uart_virt) -+ ldreq \rv, =davinci_uart_v2p(davinci_uart_virt) - ldrne \rv, =davinci_uart_virt - ldreq \rp, =DAVINCI_UART_INFO -- ldrne \rp, =__phys_to_virt(DAVINCI_UART_INFO) -+ ldrne \rp, =davinci_uart_p2v(DAVINCI_UART_INFO) - ldr \rp, [\rp, #4] - str \rp, [\rv] - -diff --git a/arch/arm/mach-davinci/include/mach/serial.h b/arch/arm/mach-davinci/include/mach/serial.h -index 8051110..c9e6ce1 100644 ---- a/arch/arm/mach-davinci/include/mach/serial.h -+++ b/arch/arm/mach-davinci/include/mach/serial.h -@@ -22,7 +22,7 @@ - * - * This area sits just below the page tables (see arch/arm/kernel/head.S). - */ --#define DAVINCI_UART_INFO (PHYS_OFFSET + 0x3ff8) -+#define DAVINCI_UART_INFO (PLAT_PHYS_OFFSET + 0x3ff8) - - #define DAVINCI_UART0_BASE (IO_PHYS + 0x20000) - #define DAVINCI_UART1_BASE (IO_PHYS + 0x20400) -diff --git a/arch/arm/mach-mx3/mach-vpr200.c b/arch/arm/mach-mx3/mach-vpr200.c -index 2cf390f..47a69cb 100644 ---- a/arch/arm/mach-mx3/mach-vpr200.c -+++ b/arch/arm/mach-mx3/mach-vpr200.c -@@ -257,11 +257,16 @@ static const struct fsl_usb2_platform_data otg_device_pdata __initconst = { - .workaround = FLS_USB2_WORKAROUND_ENGCM09152, - }; - -+static int vpr200_usbh_init(struct platform_device *pdev) -+{ -+ return mx35_initialize_usb_hw(pdev->id, -+ MXC_EHCI_INTERFACE_SINGLE_UNI | MXC_EHCI_INTERNAL_PHY); -+} -+ - /* USB HOST config */ - static const struct mxc_usbh_platform_data usb_host_pdata __initconst = { -- .portsc = MXC_EHCI_MODE_SERIAL, -- .flags = MXC_EHCI_INTERFACE_SINGLE_UNI | -- MXC_EHCI_INTERNAL_PHY, -+ .init = vpr200_usbh_init, -+ .portsc = MXC_EHCI_MODE_SERIAL, - }; - - static struct platform_device *devices[] __initdata = { -diff --git a/arch/arm/mach-mx5/board-mx53_loco.c b/arch/arm/mach-mx5/board-mx53_loco.c -index 10a1bea..6206b11 100644 ---- a/arch/arm/mach-mx5/board-mx53_loco.c -+++ b/arch/arm/mach-mx5/board-mx53_loco.c -@@ -193,7 +193,7 @@ static iomux_v3_cfg_t mx53_loco_pads[] = { - .wakeup = wake, \ - } - --static const struct gpio_keys_button loco_buttons[] __initconst = { -+static struct gpio_keys_button loco_buttons[] = { - GPIO_BUTTON(MX53_LOCO_POWER, KEY_POWER, 1, "power", 0), - GPIO_BUTTON(MX53_LOCO_UI1, KEY_VOLUMEUP, 1, "volume-up", 0), - GPIO_BUTTON(MX53_LOCO_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0), -diff --git a/arch/arm/mach-mxs/clock-mx28.c b/arch/arm/mach-mxs/clock-mx28.c -index 1ad97fe..5dcc59d 100644 ---- a/arch/arm/mach-mxs/clock-mx28.c -+++ b/arch/arm/mach-mxs/clock-mx28.c -@@ -295,11 +295,11 @@ static int name##_set_rate(struct clk *clk, unsigned long rate) \ - unsigned long diff, parent_rate, calc_rate; \ - int i; \ - \ -- parent_rate = clk_get_rate(clk->parent); \ - div_max = BM_CLKCTRL_##dr##_DIV >> BP_CLKCTRL_##dr##_DIV; \ - bm_busy = BM_CLKCTRL_##dr##_BUSY; \ - \ - if (clk->parent == &ref_xtal_clk) { \ -+ parent_rate = clk_get_rate(clk->parent); \ - div = DIV_ROUND_UP(parent_rate, rate); \ - if (clk == &cpu_clk) { \ - div_max = BM_CLKCTRL_CPU_DIV_XTAL >> \ -@@ -309,6 +309,11 @@ static int name##_set_rate(struct clk *clk, unsigned long rate) \ - if (div == 0 || div > div_max) \ - return -EINVAL; \ - } else { \ -+ /* \ -+ * hack alert: this block modifies clk->parent, too, \ -+ * so the base to use it the grand parent. \ -+ */ \ -+ parent_rate = clk_get_rate(clk->parent->parent); \ - rate >>= PARENT_RATE_SHIFT; \ - parent_rate >>= PARENT_RATE_SHIFT; \ - diff = parent_rate; \ -diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile -index a45cd64..512b152 100644 ---- a/arch/arm/mach-omap2/Makefile -+++ b/arch/arm/mach-omap2/Makefile -@@ -68,7 +68,7 @@ obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o - obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o - - AFLAGS_sleep24xx.o :=-Wa,-march=armv6 --AFLAGS_sleep34xx.o :=-Wa,-march=armv7-a -+AFLAGS_sleep34xx.o :=-Wa,-march=armv7-a$(plus_sec) - - ifeq ($(CONFIG_PM_VERBOSE),y) - CFLAGS_pm_bus.o += -DDEBUG -diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c -index e964895..f8ba20a 100644 ---- a/arch/arm/mach-omap2/board-rx51.c -+++ b/arch/arm/mach-omap2/board-rx51.c -@@ -141,14 +141,19 @@ static void __init rx51_init(void) - static void __init rx51_map_io(void) - { - omap2_set_globals_3xxx(); -- rx51_video_mem_init(); - omap34xx_map_common_io(); - } - -+static void __init rx51_reserve(void) -+{ -+ rx51_video_mem_init(); -+ omap_reserve(); -+} -+ - MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") - /* Maintainer: Lauri Leukkunen */ - .boot_params = 0x80000100, -- .reserve = omap_reserve, -+ .reserve = rx51_reserve, - .map_io = rx51_map_io, - .init_early = rx51_init_early, - .init_irq = omap_init_irq, -diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c -index 276992d..8c96567 100644 ---- a/arch/arm/mach-omap2/clock44xx_data.c -+++ b/arch/arm/mach-omap2/clock44xx_data.c -@@ -3116,14 +3116,9 @@ static struct omap_clk omap44xx_clks[] = { - CLK(NULL, "dsp_fck", &dsp_fck, CK_443X), - CLK("omapdss_dss", "sys_clk", &dss_sys_clk, CK_443X), - CLK("omapdss_dss", "tv_clk", &dss_tv_clk, CK_443X), -- CLK("omapdss_dss", "dss_clk", &dss_dss_clk, CK_443X), - CLK("omapdss_dss", "video_clk", &dss_48mhz_clk, CK_443X), -- CLK("omapdss_dss", "fck", &dss_fck, CK_443X), -- /* -- * On OMAP4, DSS ick is a dummy clock; this is needed for compatibility -- * with OMAP2/3. -- */ -- CLK("omapdss_dss", "ick", &dummy_ck, CK_443X), -+ CLK("omapdss_dss", "fck", &dss_dss_clk, CK_443X), -+ CLK("omapdss_dss", "ick", &dss_fck, CK_443X), - CLK(NULL, "efuse_ctrl_cust_fck", &efuse_ctrl_cust_fck, CK_443X), - CLK(NULL, "emif1_fck", &emif1_fck, CK_443X), - CLK(NULL, "emif2_fck", &emif2_fck, CK_443X), -diff --git a/arch/arm/mach-omap2/cm2xxx_3xxx.c b/arch/arm/mach-omap2/cm2xxx_3xxx.c -index 9d0dec8..38830d8 100644 ---- a/arch/arm/mach-omap2/cm2xxx_3xxx.c -+++ b/arch/arm/mach-omap2/cm2xxx_3xxx.c -@@ -247,6 +247,7 @@ struct omap3_cm_regs { - u32 per_cm_clksel; - u32 emu_cm_clksel; - u32 emu_cm_clkstctrl; -+ u32 pll_cm_autoidle; - u32 pll_cm_autoidle2; - u32 pll_cm_clksel4; - u32 pll_cm_clksel5; -@@ -319,6 +320,15 @@ void omap3_cm_save_context(void) - omap2_cm_read_mod_reg(OMAP3430_EMU_MOD, CM_CLKSEL1); - cm_context.emu_cm_clkstctrl = - omap2_cm_read_mod_reg(OMAP3430_EMU_MOD, OMAP2_CM_CLKSTCTRL); -+ /* -+ * As per erratum i671, ROM code does not respect the PER DPLL -+ * programming scheme if CM_AUTOIDLE_PLL.AUTO_PERIPH_DPLL == 1. -+ * In this case, even though this register has been saved in -+ * scratchpad contents, we need to restore AUTO_PERIPH_DPLL -+ * by ourselves. So, we need to save it anyway. -+ */ -+ cm_context.pll_cm_autoidle = -+ omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE); - cm_context.pll_cm_autoidle2 = - omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE2); - cm_context.pll_cm_clksel4 = -@@ -441,6 +451,13 @@ void omap3_cm_restore_context(void) - CM_CLKSEL1); - omap2_cm_write_mod_reg(cm_context.emu_cm_clkstctrl, OMAP3430_EMU_MOD, - OMAP2_CM_CLKSTCTRL); -+ /* -+ * As per erratum i671, ROM code does not respect the PER DPLL -+ * programming scheme if CM_AUTOIDLE_PLL.AUTO_PERIPH_DPLL == 1. -+ * In this case, we need to restore AUTO_PERIPH_DPLL by ourselves. -+ */ -+ omap2_cm_write_mod_reg(cm_context.pll_cm_autoidle, PLL_MOD, -+ CM_AUTOIDLE); - omap2_cm_write_mod_reg(cm_context.pll_cm_autoidle2, PLL_MOD, - CM_AUTOIDLE2); - omap2_cm_write_mod_reg(cm_context.pll_cm_clksel4, PLL_MOD, -diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c -index 6952794..da53ba3 100644 ---- a/arch/arm/mach-omap2/control.c -+++ b/arch/arm/mach-omap2/control.c -@@ -316,8 +316,14 @@ void omap3_save_scratchpad_contents(void) - omap2_cm_read_mod_reg(WKUP_MOD, CM_CLKSEL); - prcm_block_contents.cm_clken_pll = - omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN); -+ /* -+ * As per erratum i671, ROM code does not respect the PER DPLL -+ * programming scheme if CM_AUTOIDLE_PLL..AUTO_PERIPH_DPLL == 1. -+ * Then, in anycase, clear these bits to avoid extra latencies. -+ */ - prcm_block_contents.cm_autoidle_pll = -- omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_AUTOIDLE_PLL); -+ omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE) & -+ ~OMAP3430_AUTO_PERIPH_DPLL_MASK; - prcm_block_contents.cm_clksel1_pll = - omap2_cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL1_PLL); - prcm_block_contents.cm_clksel2_pll = -diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c -index 8eb3ce1..c4d0ae8 100644 ---- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c -+++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c -@@ -1639,6 +1639,7 @@ static struct omap_hwmod_ocp_if *omap2420_gpio1_slaves[] = { - - static struct omap_hwmod omap2420_gpio1_hwmod = { - .name = "gpio1", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap242x_gpio1_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio1_irqs), - .main_clk = "gpios_fck", -@@ -1669,6 +1670,7 @@ static struct omap_hwmod_ocp_if *omap2420_gpio2_slaves[] = { - - static struct omap_hwmod omap2420_gpio2_hwmod = { - .name = "gpio2", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap242x_gpio2_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio2_irqs), - .main_clk = "gpios_fck", -@@ -1699,6 +1701,7 @@ static struct omap_hwmod_ocp_if *omap2420_gpio3_slaves[] = { - - static struct omap_hwmod omap2420_gpio3_hwmod = { - .name = "gpio3", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap242x_gpio3_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio3_irqs), - .main_clk = "gpios_fck", -@@ -1729,6 +1732,7 @@ static struct omap_hwmod_ocp_if *omap2420_gpio4_slaves[] = { - - static struct omap_hwmod omap2420_gpio4_hwmod = { - .name = "gpio4", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap242x_gpio4_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio4_irqs), - .main_clk = "gpios_fck", -@@ -1782,7 +1786,7 @@ static struct omap_hwmod_irq_info omap2420_dma_system_irqs[] = { - static struct omap_hwmod_addr_space omap2420_dma_system_addrs[] = { - { - .pa_start = 0x48056000, -- .pa_end = 0x4a0560ff, -+ .pa_end = 0x48056fff, - .flags = ADDR_TYPE_RT - }, - }; -diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c -index e6e3810..9682dd5 100644 ---- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c -+++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c -@@ -1742,6 +1742,7 @@ static struct omap_hwmod_ocp_if *omap2430_gpio1_slaves[] = { - - static struct omap_hwmod omap2430_gpio1_hwmod = { - .name = "gpio1", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap243x_gpio1_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio1_irqs), - .main_clk = "gpios_fck", -@@ -1772,6 +1773,7 @@ static struct omap_hwmod_ocp_if *omap2430_gpio2_slaves[] = { - - static struct omap_hwmod omap2430_gpio2_hwmod = { - .name = "gpio2", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap243x_gpio2_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio2_irqs), - .main_clk = "gpios_fck", -@@ -1802,6 +1804,7 @@ static struct omap_hwmod_ocp_if *omap2430_gpio3_slaves[] = { - - static struct omap_hwmod omap2430_gpio3_hwmod = { - .name = "gpio3", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap243x_gpio3_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio3_irqs), - .main_clk = "gpios_fck", -@@ -1832,6 +1835,7 @@ static struct omap_hwmod_ocp_if *omap2430_gpio4_slaves[] = { - - static struct omap_hwmod omap2430_gpio4_hwmod = { - .name = "gpio4", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap243x_gpio4_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio4_irqs), - .main_clk = "gpios_fck", -@@ -1862,6 +1866,7 @@ static struct omap_hwmod_ocp_if *omap2430_gpio5_slaves[] = { - - static struct omap_hwmod omap2430_gpio5_hwmod = { - .name = "gpio5", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap243x_gpio5_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio5_irqs), - .main_clk = "gpio5_fck", -@@ -1915,7 +1920,7 @@ static struct omap_hwmod_irq_info omap2430_dma_system_irqs[] = { - static struct omap_hwmod_addr_space omap2430_dma_system_addrs[] = { - { - .pa_start = 0x48056000, -- .pa_end = 0x4a0560ff, -+ .pa_end = 0x48056fff, - .flags = ADDR_TYPE_RT - }, - }; -diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c -index b98e2df..909a84d 100644 ---- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c -+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c -@@ -2141,6 +2141,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio1_slaves[] = { - - static struct omap_hwmod omap3xxx_gpio1_hwmod = { - .name = "gpio1", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap3xxx_gpio1_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio1_irqs), - .main_clk = "gpio1_ick", -@@ -2177,6 +2178,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio2_slaves[] = { - - static struct omap_hwmod omap3xxx_gpio2_hwmod = { - .name = "gpio2", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap3xxx_gpio2_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio2_irqs), - .main_clk = "gpio2_ick", -@@ -2213,6 +2215,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio3_slaves[] = { - - static struct omap_hwmod omap3xxx_gpio3_hwmod = { - .name = "gpio3", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap3xxx_gpio3_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio3_irqs), - .main_clk = "gpio3_ick", -@@ -2249,6 +2252,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio4_slaves[] = { - - static struct omap_hwmod omap3xxx_gpio4_hwmod = { - .name = "gpio4", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap3xxx_gpio4_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio4_irqs), - .main_clk = "gpio4_ick", -@@ -2285,6 +2289,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio5_slaves[] = { - - static struct omap_hwmod omap3xxx_gpio5_hwmod = { - .name = "gpio5", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap3xxx_gpio5_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio5_irqs), - .main_clk = "gpio5_ick", -@@ -2321,6 +2326,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio6_slaves[] = { - - static struct omap_hwmod omap3xxx_gpio6_hwmod = { - .name = "gpio6", -+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, - .mpu_irqs = omap3xxx_gpio6_irqs, - .mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio6_irqs), - .main_clk = "gpio6_ick", -@@ -2386,7 +2392,7 @@ static struct omap_hwmod_irq_info omap3xxx_dma_system_irqs[] = { - static struct omap_hwmod_addr_space omap3xxx_dma_system_addrs[] = { - { - .pa_start = 0x48056000, -- .pa_end = 0x4a0560ff, -+ .pa_end = 0x48056fff, - .flags = ADDR_TYPE_RT - }, - }; -diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c -index 3e88dd3..abc548a 100644 ---- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c -+++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c -@@ -885,7 +885,7 @@ static struct omap_hwmod_ocp_if *omap44xx_dma_system_masters[] = { - static struct omap_hwmod_addr_space omap44xx_dma_system_addrs[] = { - { - .pa_start = 0x4a056000, -- .pa_end = 0x4a0560ff, -+ .pa_end = 0x4a056fff, - .flags = ADDR_TYPE_RT - }, - }; -diff --git a/arch/arm/mach-omap2/omap_l3_smx.c b/arch/arm/mach-omap2/omap_l3_smx.c -index 5f2da756..4321e79 100644 ---- a/arch/arm/mach-omap2/omap_l3_smx.c -+++ b/arch/arm/mach-omap2/omap_l3_smx.c -@@ -196,11 +196,11 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) - /* No timeout error for debug sources */ - } - -- base = ((l3->rt) + (*(omap3_l3_bases[int_type] + err_source))); -- - /* identify the error source */ - for (err_source = 0; !(status & (1 << err_source)); err_source++) - ; -+ -+ base = l3->rt + *(omap3_l3_bases[int_type] + err_source); - error = omap3_l3_readll(base, L3_ERROR_LOG); - - if (error) { -diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c -index 30af335..49486f5 100644 ---- a/arch/arm/mach-omap2/pm.c -+++ b/arch/arm/mach-omap2/pm.c -@@ -89,6 +89,7 @@ static void omap2_init_processor_devices(void) - if (cpu_is_omap44xx()) { - _init_omap_device("l3_main_1", &l3_dev); - _init_omap_device("dsp", &dsp_dev); -+ _init_omap_device("iva", &iva_dev); - } else { - _init_omap_device("l3_main", &l3_dev); - } -diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c -index 6fb5209..0c1552d 100644 ---- a/arch/arm/mach-omap2/voltage.c -+++ b/arch/arm/mach-omap2/voltage.c -@@ -114,7 +114,6 @@ static int __init _config_common_vdd_data(struct omap_vdd_info *vdd) - sys_clk_speed /= 1000; - - /* Generic voltage parameters */ -- vdd->curr_volt = 1200000; - vdd->volt_scale = vp_forceupdate_scale_voltage; - vdd->vp_enabled = false; - -diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c -index 6de0ad0..9cdcca5 100644 ---- a/arch/arm/mach-pxa/hx4700.c -+++ b/arch/arm/mach-pxa/hx4700.c -@@ -711,7 +711,7 @@ static struct regulator_consumer_supply bq24022_consumers[] = { - static struct regulator_init_data bq24022_init_data = { - .constraints = { - .max_uA = 500000, -- .valid_ops_mask = REGULATOR_CHANGE_CURRENT, -+ .valid_ops_mask = REGULATOR_CHANGE_CURRENT|REGULATOR_CHANGE_STATUS, - }, - .num_consumer_supplies = ARRAY_SIZE(bq24022_consumers), - .consumer_supplies = bq24022_consumers, -diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c -index a72993d..9984ef7 100644 ---- a/arch/arm/mach-pxa/magician.c -+++ b/arch/arm/mach-pxa/magician.c -@@ -599,7 +599,7 @@ static struct regulator_consumer_supply bq24022_consumers[] = { - static struct regulator_init_data bq24022_init_data = { - .constraints = { - .max_uA = 500000, -- .valid_ops_mask = REGULATOR_CHANGE_CURRENT, -+ .valid_ops_mask = REGULATOR_CHANGE_CURRENT | REGULATOR_CHANGE_STATUS, - }, - .num_consumer_supplies = ARRAY_SIZE(bq24022_consumers), - .consumer_supplies = bq24022_consumers, -diff --git a/arch/arm/mm/proc-xscale.S b/arch/arm/mm/proc-xscale.S -index ce233bc..42af976 100644 ---- a/arch/arm/mm/proc-xscale.S -+++ b/arch/arm/mm/proc-xscale.S -@@ -395,7 +395,7 @@ ENTRY(xscale_dma_a0_map_area) - teq r2, #DMA_TO_DEVICE - beq xscale_dma_clean_range - b xscale_dma_flush_range --ENDPROC(xscsale_dma_a0_map_area) -+ENDPROC(xscale_dma_a0_map_area) - - /* - * dma_unmap_area(start, size, dir) -diff --git a/arch/arm/plat-mxc/gpio.c b/arch/arm/plat-mxc/gpio.c -index 7a10724..6cd6d7f 100644 ---- a/arch/arm/plat-mxc/gpio.c -+++ b/arch/arm/plat-mxc/gpio.c -@@ -295,6 +295,12 @@ static int mxc_gpio_direction_output(struct gpio_chip *chip, - return 0; - } - -+/* -+ * This lock class tells lockdep that GPIO irqs are in a different -+ * category than their parents, so it won't report false recursion. -+ */ -+static struct lock_class_key gpio_lock_class; -+ - int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt) - { - int i, j; -@@ -311,6 +317,7 @@ int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt) - __raw_writel(~0, port[i].base + GPIO_ISR); - for (j = port[i].virtual_irq_start; - j < port[i].virtual_irq_start + 32; j++) { -+ irq_set_lockdep_class(j, &gpio_lock_class); - irq_set_chip_and_handler(j, &gpio_irq_chip, - handle_level_irq); - set_irq_flags(j, IRQF_VALID); -diff --git a/arch/arm/plat-mxc/ssi-fiq.S b/arch/arm/plat-mxc/ssi-fiq.S -index 4ddce56..8397a2d 100644 ---- a/arch/arm/plat-mxc/ssi-fiq.S -+++ b/arch/arm/plat-mxc/ssi-fiq.S -@@ -124,6 +124,8 @@ imx_ssi_fiq_start: - 1: - @ return from FIQ - subs pc, lr, #4 -+ -+ .align - imx_ssi_fiq_base: - .word 0x0 - imx_ssi_fiq_rx_buffer: -diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c -index 02b7a03..8b3db1c 100644 ---- a/arch/m68k/mm/motorola.c -+++ b/arch/m68k/mm/motorola.c -@@ -300,6 +300,8 @@ void __init paging_init(void) - zones_size[ZONE_DMA] = m68k_memory[i].size >> PAGE_SHIFT; - free_area_init_node(i, zones_size, - m68k_memory[i].addr >> PAGE_SHIFT, NULL); -+ if (node_present_pages(i)) -+ node_set_state(i, N_NORMAL_MEMORY); - } - } - -diff --git a/arch/parisc/mm/init.c b/arch/parisc/mm/init.c -index b7ed8d7..b1d1262 100644 ---- a/arch/parisc/mm/init.c -+++ b/arch/parisc/mm/init.c -@@ -266,8 +266,10 @@ static void __init setup_bootmem(void) - } - memset(pfnnid_map, 0xff, sizeof(pfnnid_map)); - -- for (i = 0; i < npmem_ranges; i++) -+ for (i = 0; i < npmem_ranges; i++) { -+ node_set_state(i, N_NORMAL_MEMORY); - node_set_online(i); -+ } - #endif - - /* -diff --git a/arch/powerpc/include/asm/8xx_immap.h b/arch/powerpc/include/asm/8xx_immap.h -index 6b6dc20..bdf0563 100644 ---- a/arch/powerpc/include/asm/8xx_immap.h -+++ b/arch/powerpc/include/asm/8xx_immap.h -@@ -393,8 +393,8 @@ typedef struct fec { - uint fec_addr_low; /* lower 32 bits of station address */ - ushort fec_addr_high; /* upper 16 bits of station address */ - ushort res1; /* reserved */ -- uint fec_hash_table_high; /* upper 32-bits of hash table */ -- uint fec_hash_table_low; /* lower 32-bits of hash table */ -+ uint fec_grp_hash_table_high; /* upper 32-bits of hash table */ -+ uint fec_grp_hash_table_low; /* lower 32-bits of hash table */ - uint fec_r_des_start; /* beginning of Rx descriptor ring */ - uint fec_x_des_start; /* beginning of Tx descriptor ring */ - uint fec_r_buff_size; /* Rx buffer size */ -diff --git a/arch/powerpc/include/asm/uninorth.h b/arch/powerpc/include/asm/uninorth.h -index ae9c899..d12b11d 100644 ---- a/arch/powerpc/include/asm/uninorth.h -+++ b/arch/powerpc/include/asm/uninorth.h -@@ -60,7 +60,7 @@ - * - * Obviously, the GART is not cache coherent and so any change to it - * must be flushed to memory (or maybe just make the GART space non -- * cachable). AGP memory itself does't seem to be cache coherent neither. -+ * cachable). AGP memory itself doesn't seem to be cache coherent neither. - * - * In order to invalidate the GART (which is probably necessary to inval - * the bridge internal TLBs), the following sequence has to be written, -diff --git a/arch/s390/crypto/prng.c b/arch/s390/crypto/prng.c -index 44bca3f..8b16c47 100644 ---- a/arch/s390/crypto/prng.c -+++ b/arch/s390/crypto/prng.c -@@ -76,7 +76,7 @@ static void prng_seed(int nbytes) - - /* Add the entropy */ - while (nbytes >= 8) { -- *((__u64 *)parm_block) ^= *((__u64 *)buf+i); -+ *((__u64 *)parm_block) ^= *((__u64 *)(buf+i)); - prng_add_entropy(); - i += 8; - nbytes -= 8; -diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c -index 4cf85fe..ab98813 100644 ---- a/arch/s390/mm/fault.c -+++ b/arch/s390/mm/fault.c -@@ -543,7 +543,6 @@ static void pfault_interrupt(unsigned int ext_int_code, - struct task_struct *tsk; - __u16 subcode; - -- kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++; - /* - * Get the external interruption subcode & pfault - * initial/completion signal bit. VM stores this -@@ -553,6 +552,7 @@ static void pfault_interrupt(unsigned int ext_int_code, - subcode = ext_int_code >> 16; - if ((subcode & 0xff00) != __SUBCODE_MASK) - return; -+ kstat_cpu(smp_processor_id()).irqs[EXTINT_PFL]++; - - /* - * Get the token (= address of the task structure of the affected task). -diff --git a/arch/um/Kconfig.um b/arch/um/Kconfig.um -index 90a438a..b5e675e 100644 ---- a/arch/um/Kconfig.um -+++ b/arch/um/Kconfig.um -@@ -47,7 +47,7 @@ config HOSTFS - - config HPPFS - tristate "HoneyPot ProcFS (EXPERIMENTAL)" -- depends on EXPERIMENTAL -+ depends on EXPERIMENTAL && PROC_FS - help - hppfs (HoneyPot ProcFS) is a filesystem which allows UML /proc - entries to be overridden, removed, or fabricated from the host. -diff --git a/arch/um/include/asm/thread_info.h b/arch/um/include/asm/thread_info.h -index e2cf786..5bd1bad 100644 ---- a/arch/um/include/asm/thread_info.h -+++ b/arch/um/include/asm/thread_info.h -@@ -49,7 +49,10 @@ static inline struct thread_info *current_thread_info(void) - { - struct thread_info *ti; - unsigned long mask = THREAD_SIZE - 1; -- ti = (struct thread_info *) (((unsigned long) &ti) & ~mask); -+ void *p; -+ -+ asm volatile ("" : "=r" (p) : "0" (&ti)); -+ ti = (struct thread_info *) (((unsigned long)p) & ~mask); - return ti; - } - -diff --git a/arch/um/sys-i386/Makefile b/arch/um/sys-i386/Makefile -index 804b28d..b1da91c 100644 ---- a/arch/um/sys-i386/Makefile -+++ b/arch/um/sys-i386/Makefile -@@ -4,7 +4,7 @@ - - obj-y = bug.o bugs.o checksum.o delay.o fault.o ksyms.o ldt.o ptrace.o \ - ptrace_user.o setjmp.o signal.o stub.o stub_segv.o syscalls.o sysrq.o \ -- sys_call_table.o tls.o -+ sys_call_table.o tls.o atomic64_cx8_32.o - - obj-$(CONFIG_BINFMT_ELF) += elfcore.o - -diff --git a/arch/um/sys-i386/atomic64_cx8_32.S b/arch/um/sys-i386/atomic64_cx8_32.S -new file mode 100644 -index 0000000..1e901d3 ---- /dev/null -+++ b/arch/um/sys-i386/atomic64_cx8_32.S -@@ -0,0 +1,225 @@ -+/* -+ * atomic64_t for 586+ -+ * -+ * Copied from arch/x86/lib/atomic64_cx8_32.S -+ * -+ * Copyright © 2010 Luca Barbieri -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ */ -+ -+#include -+#include -+#include -+ -+.macro SAVE reg -+ pushl_cfi %\reg -+ CFI_REL_OFFSET \reg, 0 -+.endm -+ -+.macro RESTORE reg -+ popl_cfi %\reg -+ CFI_RESTORE \reg -+.endm -+ -+.macro read64 reg -+ movl %ebx, %eax -+ movl %ecx, %edx -+/* we need LOCK_PREFIX since otherwise cmpxchg8b always does the write */ -+ LOCK_PREFIX -+ cmpxchg8b (\reg) -+.endm -+ -+ENTRY(atomic64_read_cx8) -+ CFI_STARTPROC -+ -+ read64 %ecx -+ ret -+ CFI_ENDPROC -+ENDPROC(atomic64_read_cx8) -+ -+ENTRY(atomic64_set_cx8) -+ CFI_STARTPROC -+ -+1: -+/* we don't need LOCK_PREFIX since aligned 64-bit writes -+ * are atomic on 586 and newer */ -+ cmpxchg8b (%esi) -+ jne 1b -+ -+ ret -+ CFI_ENDPROC -+ENDPROC(atomic64_set_cx8) -+ -+ENTRY(atomic64_xchg_cx8) -+ CFI_STARTPROC -+ -+ movl %ebx, %eax -+ movl %ecx, %edx -+1: -+ LOCK_PREFIX -+ cmpxchg8b (%esi) -+ jne 1b -+ -+ ret -+ CFI_ENDPROC -+ENDPROC(atomic64_xchg_cx8) -+ -+.macro addsub_return func ins insc -+ENTRY(atomic64_\func\()_return_cx8) -+ CFI_STARTPROC -+ SAVE ebp -+ SAVE ebx -+ SAVE esi -+ SAVE edi -+ -+ movl %eax, %esi -+ movl %edx, %edi -+ movl %ecx, %ebp -+ -+ read64 %ebp -+1: -+ movl %eax, %ebx -+ movl %edx, %ecx -+ \ins\()l %esi, %ebx -+ \insc\()l %edi, %ecx -+ LOCK_PREFIX -+ cmpxchg8b (%ebp) -+ jne 1b -+ -+10: -+ movl %ebx, %eax -+ movl %ecx, %edx -+ RESTORE edi -+ RESTORE esi -+ RESTORE ebx -+ RESTORE ebp -+ ret -+ CFI_ENDPROC -+ENDPROC(atomic64_\func\()_return_cx8) -+.endm -+ -+addsub_return add add adc -+addsub_return sub sub sbb -+ -+.macro incdec_return func ins insc -+ENTRY(atomic64_\func\()_return_cx8) -+ CFI_STARTPROC -+ SAVE ebx -+ -+ read64 %esi -+1: -+ movl %eax, %ebx -+ movl %edx, %ecx -+ \ins\()l $1, %ebx -+ \insc\()l $0, %ecx -+ LOCK_PREFIX -+ cmpxchg8b (%esi) -+ jne 1b -+ -+10: -+ movl %ebx, %eax -+ movl %ecx, %edx -+ RESTORE ebx -+ ret -+ CFI_ENDPROC -+ENDPROC(atomic64_\func\()_return_cx8) -+.endm -+ -+incdec_return inc add adc -+incdec_return dec sub sbb -+ -+ENTRY(atomic64_dec_if_positive_cx8) -+ CFI_STARTPROC -+ SAVE ebx -+ -+ read64 %esi -+1: -+ movl %eax, %ebx -+ movl %edx, %ecx -+ subl $1, %ebx -+ sbb $0, %ecx -+ js 2f -+ LOCK_PREFIX -+ cmpxchg8b (%esi) -+ jne 1b -+ -+2: -+ movl %ebx, %eax -+ movl %ecx, %edx -+ RESTORE ebx -+ ret -+ CFI_ENDPROC -+ENDPROC(atomic64_dec_if_positive_cx8) -+ -+ENTRY(atomic64_add_unless_cx8) -+ CFI_STARTPROC -+ SAVE ebp -+ SAVE ebx -+/* these just push these two parameters on the stack */ -+ SAVE edi -+ SAVE esi -+ -+ movl %ecx, %ebp -+ movl %eax, %esi -+ movl %edx, %edi -+ -+ read64 %ebp -+1: -+ cmpl %eax, 0(%esp) -+ je 4f -+2: -+ movl %eax, %ebx -+ movl %edx, %ecx -+ addl %esi, %ebx -+ adcl %edi, %ecx -+ LOCK_PREFIX -+ cmpxchg8b (%ebp) -+ jne 1b -+ -+ movl $1, %eax -+3: -+ addl $8, %esp -+ CFI_ADJUST_CFA_OFFSET -8 -+ RESTORE ebx -+ RESTORE ebp -+ ret -+4: -+ cmpl %edx, 4(%esp) -+ jne 2b -+ xorl %eax, %eax -+ jmp 3b -+ CFI_ENDPROC -+ENDPROC(atomic64_add_unless_cx8) -+ -+ENTRY(atomic64_inc_not_zero_cx8) -+ CFI_STARTPROC -+ SAVE ebx -+ -+ read64 %esi -+1: -+ testl %eax, %eax -+ je 4f -+2: -+ movl %eax, %ebx -+ movl %edx, %ecx -+ addl $1, %ebx -+ adcl $0, %ecx -+ LOCK_PREFIX -+ cmpxchg8b (%esi) -+ jne 1b -+ -+ movl $1, %eax -+3: -+ RESTORE ebx -+ ret -+4: -+ testl %edx, %edx -+ jne 2b -+ jmp 3b -+ CFI_ENDPROC -+ENDPROC(atomic64_inc_not_zero_cx8) -diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c -index cae3feb..db75d07 100644 ---- a/arch/x86/boot/memory.c -+++ b/arch/x86/boot/memory.c -@@ -91,7 +91,7 @@ static int detect_memory_e801(void) - if (oreg.ax > 15*1024) { - return -1; /* Bogus! */ - } else if (oreg.ax == 15*1024) { -- boot_params.alt_mem_k = (oreg.dx << 6) + oreg.ax; -+ boot_params.alt_mem_k = (oreg.bx << 6) + oreg.ax; - } else { - /* - * This ignores memory above 16MB if we have a memory -diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h -index c4bd267..a97a240 100644 ---- a/arch/x86/include/asm/io_apic.h -+++ b/arch/x86/include/asm/io_apic.h -@@ -150,7 +150,7 @@ void setup_IO_APIC_irq_extra(u32 gsi); - extern void ioapic_and_gsi_init(void); - extern void ioapic_insert_resources(void); - --int io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr); -+int io_apic_setup_irq_pin_once(unsigned int irq, int node, struct io_apic_irq_attr *attr); - - extern struct IO_APIC_route_entry **alloc_ioapic_entries(void); - extern void free_ioapic_entries(struct IO_APIC_route_entry **ioapic_entries); -diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c -index 68df09b..45fd33d 100644 ---- a/arch/x86/kernel/apic/io_apic.c -+++ b/arch/x86/kernel/apic/io_apic.c -@@ -128,8 +128,8 @@ static int __init parse_noapic(char *str) - } - early_param("noapic", parse_noapic); - --static int io_apic_setup_irq_pin_once(unsigned int irq, int node, -- struct io_apic_irq_attr *attr); -+static int io_apic_setup_irq_pin(unsigned int irq, int node, -+ struct io_apic_irq_attr *attr); - - /* Will be called in mpparse/acpi/sfi codes for saving IRQ info */ - void mp_save_irq(struct mpc_intsrc *m) -@@ -3570,7 +3570,7 @@ int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev) - } - #endif /* CONFIG_HT_IRQ */ - --int -+static int - io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr) - { - struct irq_cfg *cfg = alloc_irq_and_cfg_at(irq, node); -@@ -3585,8 +3585,8 @@ io_apic_setup_irq_pin(unsigned int irq, int node, struct io_apic_irq_attr *attr) - return ret; - } - --static int io_apic_setup_irq_pin_once(unsigned int irq, int node, -- struct io_apic_irq_attr *attr) -+int io_apic_setup_irq_pin_once(unsigned int irq, int node, -+ struct io_apic_irq_attr *attr) - { - unsigned int id = attr->ioapic, pin = attr->ioapic_pin; - int ret; -diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c -index 632e5dc..e638689 100644 ---- a/arch/x86/kernel/cpu/perf_event.c -+++ b/arch/x86/kernel/cpu/perf_event.c -@@ -613,8 +613,8 @@ static int x86_setup_perfctr(struct perf_event *event) - /* - * Branch tracing: - */ -- if ((attr->config == PERF_COUNT_HW_BRANCH_INSTRUCTIONS) && -- (hwc->sample_period == 1)) { -+ if (attr->config == PERF_COUNT_HW_BRANCH_INSTRUCTIONS && -+ !attr->freq && hwc->sample_period == 1) { - /* BTS is not supported by this architecture. */ - if (!x86_pmu.bts_active) - return -EOPNOTSUPP; -@@ -1288,6 +1288,16 @@ static int x86_pmu_handle_irq(struct pt_regs *regs) - - cpuc = &__get_cpu_var(cpu_hw_events); - -+ /* -+ * Some chipsets need to unmask the LVTPC in a particular spot -+ * inside the nmi handler. As a result, the unmasking was pushed -+ * into all the nmi handlers. -+ * -+ * This generic handler doesn't seem to have any issues where the -+ * unmasking occurs so it was left at the top. -+ */ -+ apic_write(APIC_LVTPC, APIC_DM_NMI); -+ - for (idx = 0; idx < x86_pmu.num_counters; idx++) { - if (!test_bit(idx, cpuc->active_mask)) { - /* -@@ -1374,8 +1384,6 @@ perf_event_nmi_handler(struct notifier_block *self, - return NOTIFY_DONE; - } - -- apic_write(APIC_LVTPC, APIC_DM_NMI); -- - handled = x86_pmu.handle_irq(args->regs); - if (!handled) - return NOTIFY_DONE; -diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c -index 43fa20b..e61539b 100644 ---- a/arch/x86/kernel/cpu/perf_event_intel.c -+++ b/arch/x86/kernel/cpu/perf_event_intel.c -@@ -25,7 +25,7 @@ struct intel_percore { - /* - * Intel PerfMon, used on Core and later. - */ --static const u64 intel_perfmon_event_map[] = -+static u64 intel_perfmon_event_map[PERF_COUNT_HW_MAX] __read_mostly = - { - [PERF_COUNT_HW_CPU_CYCLES] = 0x003c, - [PERF_COUNT_HW_INSTRUCTIONS] = 0x00c0, -@@ -933,6 +933,16 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) - - cpuc = &__get_cpu_var(cpu_hw_events); - -+ /* -+ * Some chipsets need to unmask the LVTPC in a particular spot -+ * inside the nmi handler. As a result, the unmasking was pushed -+ * into all the nmi handlers. -+ * -+ * This handler doesn't seem to have any issues with the unmasking -+ * so it was left at the top. -+ */ -+ apic_write(APIC_LVTPC, APIC_DM_NMI); -+ - intel_pmu_disable_all(); - handled = intel_pmu_drain_bts_buffer(); - status = intel_pmu_get_status(); -@@ -998,6 +1008,9 @@ intel_bts_constraints(struct perf_event *event) - struct hw_perf_event *hwc = &event->hw; - unsigned int hw_event, bts_event; - -+ if (event->attr.freq) -+ return NULL; -+ - hw_event = hwc->config & INTEL_ARCH_EVENT_MASK; - bts_event = x86_pmu.event_map(PERF_COUNT_HW_BRANCH_INSTRUCTIONS); - -@@ -1305,7 +1318,7 @@ static void intel_clovertown_quirks(void) - * AJ106 could possibly be worked around by not allowing LBR - * usage from PEBS, including the fixup. - * AJ68 could possibly be worked around by always programming -- * a pebs_event_reset[0] value and coping with the lost events. -+ * a pebs_event_reset[0] value and coping with the lost events. - * - * But taken together it might just make sense to not enable PEBS on - * these chips. -@@ -1409,6 +1422,18 @@ static __init int intel_pmu_init(void) - x86_pmu.percore_constraints = intel_nehalem_percore_constraints; - x86_pmu.enable_all = intel_pmu_nhm_enable_all; - x86_pmu.extra_regs = intel_nehalem_extra_regs; -+ -+ if (ebx & 0x40) { -+ /* -+ * Erratum AAJ80 detected, we work it around by using -+ * the BR_MISP_EXEC.ANY event. This will over-count -+ * branch-misses, but it's still much better than the -+ * architectural event which is often completely bogus: -+ */ -+ intel_perfmon_event_map[PERF_COUNT_HW_BRANCH_MISSES] = 0x7f89; -+ -+ pr_cont("erratum AAJ80 worked around, "); -+ } - pr_cont("Nehalem events, "); - break; - -diff --git a/arch/x86/kernel/cpu/perf_event_p4.c b/arch/x86/kernel/cpu/perf_event_p4.c -index d1f77e2..e93fcd5 100644 ---- a/arch/x86/kernel/cpu/perf_event_p4.c -+++ b/arch/x86/kernel/cpu/perf_event_p4.c -@@ -950,11 +950,20 @@ static int p4_pmu_handle_irq(struct pt_regs *regs) - x86_pmu_stop(event, 0); - } - -- if (handled) { -- /* p4 quirk: unmask it again */ -- apic_write(APIC_LVTPC, apic_read(APIC_LVTPC) & ~APIC_LVT_MASKED); -+ if (handled) - inc_irq_stat(apic_perf_irqs); -- } -+ -+ /* -+ * When dealing with the unmasking of the LVTPC on P4 perf hw, it has -+ * been observed that the OVF bit flag has to be cleared first _before_ -+ * the LVTPC can be unmasked. -+ * -+ * The reason is the NMI line will continue to be asserted while the OVF -+ * bit is set. This causes a second NMI to generate if the LVTPC is -+ * unmasked before the OVF bit is cleared, leading to unknown NMI -+ * messages. -+ */ -+ apic_write(APIC_LVTPC, APIC_DM_NMI); - - return handled; - } -diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c -index 706a9fb..e90f084 100644 ---- a/arch/x86/kernel/devicetree.c -+++ b/arch/x86/kernel/devicetree.c -@@ -391,7 +391,7 @@ static int ioapic_xlate(struct irq_domain *id, const u32 *intspec, u32 intsize, - - set_io_apic_irq_attr(&attr, idx, line, it->trigger, it->polarity); - -- return io_apic_setup_irq_pin(*out_hwirq, cpu_to_node(0), &attr); -+ return io_apic_setup_irq_pin_once(*out_hwirq, cpu_to_node(0), &attr); - } - - static void __init ioapic_add_ofnode(struct device_node *np) -diff --git a/arch/x86/platform/ce4100/falconfalls.dts b/arch/x86/platform/ce4100/falconfalls.dts -index 2d6d226..e70be38 100644 ---- a/arch/x86/platform/ce4100/falconfalls.dts -+++ b/arch/x86/platform/ce4100/falconfalls.dts -@@ -347,7 +347,7 @@ - "pciclass0c03"; - - reg = <0x16800 0x0 0x0 0x0 0x0>; -- interrupts = <22 3>; -+ interrupts = <22 1>; - }; - - usb@d,1 { -@@ -357,7 +357,7 @@ - "pciclass0c03"; - - reg = <0x16900 0x0 0x0 0x0 0x0>; -- interrupts = <22 3>; -+ interrupts = <22 1>; - }; - - sata@e,0 { -@@ -367,7 +367,7 @@ - "pciclass0106"; - - reg = <0x17000 0x0 0x0 0x0 0x0>; -- interrupts = <23 3>; -+ interrupts = <23 1>; - }; - - flash@f,0 { -diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c -index b136c9c..449c556 100644 ---- a/drivers/acpi/scan.c -+++ b/drivers/acpi/scan.c -@@ -943,6 +943,10 @@ static int acpi_bus_get_flags(struct acpi_device *device) - if (ACPI_SUCCESS(status)) - device->flags.lockable = 1; - -+ /* Power resources cannot be power manageable. */ -+ if (device->device_type == ACPI_BUS_TYPE_POWER) -+ return 0; -+ - /* Presence of _PS0|_PR0 indicates 'power manageable' */ - status = acpi_get_handle(device->handle, "_PS0", &temp); - if (ACPI_FAILURE(status)) -diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c -index fbc5b6e..abe3ab7 100644 ---- a/drivers/base/power/main.c -+++ b/drivers/base/power/main.c -@@ -63,6 +63,7 @@ void device_pm_init(struct device *dev) - dev->power.wakeup = NULL; - spin_lock_init(&dev->power.lock); - pm_runtime_init(dev); -+ INIT_LIST_HEAD(&dev->power.entry); - } - - /** -diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c -index 4573c83..abbbd33 100644 ---- a/drivers/base/power/wakeup.c -+++ b/drivers/base/power/wakeup.c -@@ -258,7 +258,7 @@ void device_set_wakeup_capable(struct device *dev, bool capable) - if (!!dev->power.can_wakeup == !!capable) - return; - -- if (device_is_registered(dev)) { -+ if (device_is_registered(dev) && !list_empty(&dev->power.entry)) { - if (capable) { - if (wakeup_sysfs_add(dev)) - return; -diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c -index 0fc0a79..6db161f 100644 ---- a/drivers/clk/clkdev.c -+++ b/drivers/clk/clkdev.c -@@ -32,10 +32,9 @@ static DEFINE_MUTEX(clocks_mutex); - * Then we take the most specific entry - with the following - * order of precedence: dev+con > dev only > con only. - */ --static struct clk *clk_find(const char *dev_id, const char *con_id) -+static struct clk_lookup *clk_find(const char *dev_id, const char *con_id) - { -- struct clk_lookup *p; -- struct clk *clk = NULL; -+ struct clk_lookup *p, *cl = NULL; - int match, best = 0; - - list_for_each_entry(p, &clocks, node) { -@@ -52,27 +51,27 @@ static struct clk *clk_find(const char *dev_id, const char *con_id) - } - - if (match > best) { -- clk = p->clk; -+ cl = p; - if (match != 3) - best = match; - else - break; - } - } -- return clk; -+ return cl; - } - - struct clk *clk_get_sys(const char *dev_id, const char *con_id) - { -- struct clk *clk; -+ struct clk_lookup *cl; - - mutex_lock(&clocks_mutex); -- clk = clk_find(dev_id, con_id); -- if (clk && !__clk_get(clk)) -- clk = NULL; -+ cl = clk_find(dev_id, con_id); -+ if (cl && !__clk_get(cl->clk)) -+ cl = NULL; - mutex_unlock(&clocks_mutex); - -- return clk ? clk : ERR_PTR(-ENOENT); -+ return cl ? cl->clk : ERR_PTR(-ENOENT); - } - EXPORT_SYMBOL(clk_get_sys); - -diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig -index c58f691..b493663 100644 ---- a/drivers/gpu/drm/Kconfig -+++ b/drivers/gpu/drm/Kconfig -@@ -24,6 +24,7 @@ config DRM_KMS_HELPER - depends on DRM - select FB - select FRAMEBUFFER_CONSOLE if !EXPERT -+ select FRAMEBUFFER_CONSOLE_DETECT_PRIMARY if FRAMEBUFFER_CONSOLE - help - FB and CRTC helpers for KMS drivers. - -diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c -index 9507204..11d7a72 100644 ---- a/drivers/gpu/drm/drm_fb_helper.c -+++ b/drivers/gpu/drm/drm_fb_helper.c -@@ -342,9 +342,22 @@ int drm_fb_helper_debug_leave(struct fb_info *info) - } - EXPORT_SYMBOL(drm_fb_helper_debug_leave); - -+bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper) -+{ -+ bool error = false; -+ int i, ret; -+ for (i = 0; i < fb_helper->crtc_count; i++) { -+ struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set; -+ ret = drm_crtc_helper_set_config(mode_set); -+ if (ret) -+ error = true; -+ } -+ return error; -+} -+EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode); -+ - bool drm_fb_helper_force_kernel_mode(void) - { -- int i = 0; - bool ret, error = false; - struct drm_fb_helper *helper; - -@@ -352,12 +365,12 @@ bool drm_fb_helper_force_kernel_mode(void) - return false; - - list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) { -- for (i = 0; i < helper->crtc_count; i++) { -- struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set; -- ret = drm_crtc_helper_set_config(mode_set); -- if (ret) -- error = true; -- } -+ if (helper->dev->switch_power_state == DRM_SWITCH_POWER_OFF) -+ continue; -+ -+ ret = drm_fb_helper_restore_fbdev_mode(helper); -+ if (ret) -+ error = true; - } - return error; - } -diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c -index 7273037..12876f2 100644 ---- a/drivers/gpu/drm/i915/i915_dma.c -+++ b/drivers/gpu/drm/i915/i915_dma.c -@@ -2207,7 +2207,7 @@ void i915_driver_lastclose(struct drm_device * dev) - drm_i915_private_t *dev_priv = dev->dev_private; - - if (!dev_priv || drm_core_check_feature(dev, DRIVER_MODESET)) { -- drm_fb_helper_restore(); -+ intel_fb_restore_mode(dev); - vga_switcheroo_process_delayed_switch(); - return; - } -diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h -index f5b0d83..1d20712 100644 ---- a/drivers/gpu/drm/i915/intel_drv.h -+++ b/drivers/gpu/drm/i915/intel_drv.h -@@ -338,4 +338,5 @@ extern int intel_overlay_attrs(struct drm_device *dev, void *data, - struct drm_file *file_priv); - - extern void intel_fb_output_poll_changed(struct drm_device *dev); -+extern void intel_fb_restore_mode(struct drm_device *dev); - #endif /* __INTEL_DRV_H__ */ -diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c -index 5127827..ec49bae 100644 ---- a/drivers/gpu/drm/i915/intel_fb.c -+++ b/drivers/gpu/drm/i915/intel_fb.c -@@ -264,3 +264,13 @@ void intel_fb_output_poll_changed(struct drm_device *dev) - drm_i915_private_t *dev_priv = dev->dev_private; - drm_fb_helper_hotplug_event(&dev_priv->fbdev->helper); - } -+ -+void intel_fb_restore_mode(struct drm_device *dev) -+{ -+ int ret; -+ drm_i915_private_t *dev_priv = dev->dev_private; -+ -+ ret = drm_fb_helper_restore_fbdev_mode(&dev_priv->fbdev->helper); -+ if (ret) -+ DRM_DEBUG("failed to restore crtc mode\n"); -+} -diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c -index bf7d4c0..871df03 100644 ---- a/drivers/gpu/drm/radeon/radeon_kms.c -+++ b/drivers/gpu/drm/radeon/radeon_kms.c -@@ -221,6 +221,19 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) - return -EINVAL; - } - break; -+ case RADEON_INFO_NUM_TILE_PIPES: -+ if (rdev->family >= CHIP_CAYMAN) -+ value = rdev->config.cayman.max_tile_pipes; -+ else if (rdev->family >= CHIP_CEDAR) -+ value = rdev->config.evergreen.max_tile_pipes; -+ else if (rdev->family >= CHIP_RV770) -+ value = rdev->config.rv770.max_tile_pipes; -+ else if (rdev->family >= CHIP_R600) -+ value = rdev->config.r600.max_tile_pipes; -+ else { -+ return -EINVAL; -+ } -+ break; - default: - DRM_DEBUG_KMS("Invalid request %d\n", info->request); - return -EINVAL; -diff --git a/drivers/gpu/drm/radeon/reg_srcs/r600 b/drivers/gpu/drm/radeon/reg_srcs/r600 -index af0da4a..92f1900 100644 ---- a/drivers/gpu/drm/radeon/reg_srcs/r600 -+++ b/drivers/gpu/drm/radeon/reg_srcs/r600 -@@ -708,6 +708,7 @@ r600 0x9400 - 0x00028D0C DB_RENDER_CONTROL - 0x00028D10 DB_RENDER_OVERRIDE - 0x0002880C DB_SHADER_CONTROL -+0x00028D28 DB_SRESULTS_COMPARE_STATE0 - 0x00028D2C DB_SRESULTS_COMPARE_STATE1 - 0x00028430 DB_STENCILREFMASK - 0x00028434 DB_STENCILREFMASK_BF -diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig -index 060ef63..50e40db 100644 ---- a/drivers/hwmon/Kconfig -+++ b/drivers/hwmon/Kconfig -@@ -110,8 +110,7 @@ config SENSORS_ADM1021 - help - If you say yes here you get support for Analog Devices ADM1021 - and ADM1023 sensor chips and clones: Maxim MAX1617 and MAX1617A, -- Genesys Logic GL523SM, National Semiconductor LM84, TI THMC10, -- and the XEON processor built-in sensor. -+ Genesys Logic GL523SM, National Semiconductor LM84 and TI THMC10. - - This driver can also be built as a module. If so, the module - will be called adm1021. -@@ -618,10 +617,10 @@ config SENSORS_LM90 - depends on I2C - help - If you say yes here you get support for National Semiconductor LM90, -- LM86, LM89 and LM99, Analog Devices ADM1032 and ADT7461, Maxim -- MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659, -- MAX6680, MAX6681, MAX6692, MAX6695, MAX6696, and Winbond/Nuvoton -- W83L771W/G/AWG/ASG sensor chips. -+ LM86, LM89 and LM99, Analog Devices ADM1032, ADT7461, and ADT7461A, -+ Maxim MAX6646, MAX6647, MAX6648, MAX6649, MAX6657, MAX6658, MAX6659, -+ MAX6680, MAX6681, MAX6692, MAX6695, MAX6696, ON Semiconductor NCT1008, -+ and Winbond/Nuvoton W83L771W/G/AWG/ASG sensor chips. - - This driver can also be built as a module. If so, the module - will be called lm90. -diff --git a/drivers/hwmon/lm85.c b/drivers/hwmon/lm85.c -index 250d099..da72dc1 100644 ---- a/drivers/hwmon/lm85.c -+++ b/drivers/hwmon/lm85.c -@@ -1094,6 +1094,7 @@ static struct attribute *lm85_attributes_minctl[] = { - &sensor_dev_attr_pwm1_auto_pwm_minctl.dev_attr.attr, - &sensor_dev_attr_pwm2_auto_pwm_minctl.dev_attr.attr, - &sensor_dev_attr_pwm3_auto_pwm_minctl.dev_attr.attr, -+ NULL - }; - - static const struct attribute_group lm85_group_minctl = { -@@ -1104,6 +1105,7 @@ static struct attribute *lm85_attributes_temp_off[] = { - &sensor_dev_attr_temp1_auto_temp_off.dev_attr.attr, - &sensor_dev_attr_temp2_auto_temp_off.dev_attr.attr, - &sensor_dev_attr_temp3_auto_temp_off.dev_attr.attr, -+ NULL - }; - - static const struct attribute_group lm85_group_temp_off = { -@@ -1329,11 +1331,11 @@ static int lm85_probe(struct i2c_client *client, - if (data->type != emc6d103s) { - err = sysfs_create_group(&client->dev.kobj, &lm85_group_minctl); - if (err) -- goto err_kfree; -+ goto err_remove_files; - err = sysfs_create_group(&client->dev.kobj, - &lm85_group_temp_off); - if (err) -- goto err_kfree; -+ goto err_remove_files; - } - - /* The ADT7463/68 have an optional VRM 10 mode where pin 21 is used -diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c -index c43b4e9..2f94f95 100644 ---- a/drivers/hwmon/lm90.c -+++ b/drivers/hwmon/lm90.c -@@ -49,10 +49,10 @@ - * chips, but support three temperature sensors instead of two. MAX6695 - * and MAX6696 only differ in the pinout so they can be treated identically. - * -- * This driver also supports the ADT7461 chip from Analog Devices. -- * It's supported in both compatibility and extended mode. It is mostly -- * compatible with LM90 except for a data format difference for the -- * temperature value registers. -+ * This driver also supports ADT7461 and ADT7461A from Analog Devices as well as -+ * NCT1008 from ON Semiconductor. The chips are supported in both compatibility -+ * and extended mode. They are mostly compatible with LM90 except for a data -+ * format difference for the temperature value registers. - * - * Since the LM90 was the first chipset supported by this driver, most - * comments will refer to this chipset, but are actually general and -@@ -88,9 +88,10 @@ - * Addresses to scan - * Address is fully defined internally and cannot be changed except for - * MAX6659, MAX6680 and MAX6681. -- * LM86, LM89, LM90, LM99, ADM1032, ADM1032-1, ADT7461, MAX6649, MAX6657, -- * MAX6658 and W83L771 have address 0x4c. -- * ADM1032-2, ADT7461-2, LM89-1, LM99-1 and MAX6646 have address 0x4d. -+ * LM86, LM89, LM90, LM99, ADM1032, ADM1032-1, ADT7461, ADT7461A, MAX6649, -+ * MAX6657, MAX6658, NCT1008 and W83L771 have address 0x4c. -+ * ADM1032-2, ADT7461-2, ADT7461A-2, LM89-1, LM99-1, MAX6646, and NCT1008D -+ * have address 0x4d. - * MAX6647 has address 0x4e. - * MAX6659 can have address 0x4c, 0x4d or 0x4e. - * MAX6680 and MAX6681 can have address 0x18, 0x19, 0x1a, 0x29, 0x2a, 0x2b, -@@ -174,6 +175,7 @@ enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680, - static const struct i2c_device_id lm90_id[] = { - { "adm1032", adm1032 }, - { "adt7461", adt7461 }, -+ { "adt7461a", adt7461 }, - { "lm90", lm90 }, - { "lm86", lm86 }, - { "lm89", lm86 }, -@@ -188,6 +190,7 @@ static const struct i2c_device_id lm90_id[] = { - { "max6681", max6680 }, - { "max6695", max6696 }, - { "max6696", max6696 }, -+ { "nct1008", adt7461 }, - { "w83l771", w83l771 }, - { } - }; -@@ -1153,6 +1156,11 @@ static int lm90_detect(struct i2c_client *new_client, - && (reg_config1 & 0x1B) == 0x00 - && reg_convrate <= 0x0A) { - name = "adt7461"; -+ } else -+ if (chip_id == 0x57 /* ADT7461A, NCT1008 */ -+ && (reg_config1 & 0x1B) == 0x00 -+ && reg_convrate <= 0x0A) { -+ name = "adt7461a"; - } - } else - if (man_id == 0x4D) { /* Maxim */ -diff --git a/drivers/hwmon/twl4030-madc-hwmon.c b/drivers/hwmon/twl4030-madc-hwmon.c -index de58191..5724074 100644 ---- a/drivers/hwmon/twl4030-madc-hwmon.c -+++ b/drivers/hwmon/twl4030-madc-hwmon.c -@@ -98,7 +98,6 @@ static const struct attribute_group twl4030_madc_group = { - static int __devinit twl4030_madc_hwmon_probe(struct platform_device *pdev) - { - int ret; -- int status; - struct device *hwmon; - - ret = sysfs_create_group(&pdev->dev.kobj, &twl4030_madc_group); -@@ -107,7 +106,7 @@ static int __devinit twl4030_madc_hwmon_probe(struct platform_device *pdev) - hwmon = hwmon_device_register(&pdev->dev); - if (IS_ERR(hwmon)) { - dev_err(&pdev->dev, "hwmon_device_register failed.\n"); -- status = PTR_ERR(hwmon); -+ ret = PTR_ERR(hwmon); - goto err_reg; - } - -diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c -index 72c0415..455e909 100644 ---- a/drivers/i2c/busses/i2c-i801.c -+++ b/drivers/i2c/busses/i2c-i801.c -@@ -134,10 +134,15 @@ - SMBHSTSTS_BUS_ERR | SMBHSTSTS_DEV_ERR | \ - SMBHSTSTS_INTR) - -+/* Older devices have their ID defined in */ -+#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 -+#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 - /* Patsburg also has three 'Integrated Device Function' SMBus controllers */ - #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0 0x1d70 - #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71 - #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72 -+#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 -+#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 - - struct i801_priv { - struct i2c_adapter adapter; -diff --git a/drivers/i2c/busses/i2c-parport.c b/drivers/i2c/busses/i2c-parport.c -index 0eb1515..2dbba16 100644 ---- a/drivers/i2c/busses/i2c-parport.c -+++ b/drivers/i2c/busses/i2c-parport.c -@@ -1,7 +1,7 @@ - /* ------------------------------------------------------------------------ * - * i2c-parport.c I2C bus over parallel port * - * ------------------------------------------------------------------------ * -- Copyright (C) 2003-2010 Jean Delvare -+ Copyright (C) 2003-2011 Jean Delvare - - Based on older i2c-philips-par.c driver - Copyright (C) 1995-2000 Simon G. Vogl -@@ -33,6 +33,8 @@ - #include - #include - #include -+#include -+#include - #include "i2c-parport.h" - - /* ----- Device list ------------------------------------------------------ */ -@@ -43,10 +45,11 @@ struct i2c_par { - struct i2c_algo_bit_data algo_data; - struct i2c_smbus_alert_setup alert_data; - struct i2c_client *ara; -- struct i2c_par *next; -+ struct list_head node; - }; - --static struct i2c_par *adapter_list; -+static LIST_HEAD(adapter_list); -+static DEFINE_MUTEX(adapter_list_lock); - - /* ----- Low-level parallel port access ----------------------------------- */ - -@@ -228,8 +231,9 @@ static void i2c_parport_attach (struct parport *port) - } - - /* Add the new adapter to the list */ -- adapter->next = adapter_list; -- adapter_list = adapter; -+ mutex_lock(&adapter_list_lock); -+ list_add_tail(&adapter->node, &adapter_list); -+ mutex_unlock(&adapter_list_lock); - return; - - ERROR1: -@@ -241,11 +245,11 @@ ERROR0: - - static void i2c_parport_detach (struct parport *port) - { -- struct i2c_par *adapter, *prev; -+ struct i2c_par *adapter, *_n; - - /* Walk the list */ -- for (prev = NULL, adapter = adapter_list; adapter; -- prev = adapter, adapter = adapter->next) { -+ mutex_lock(&adapter_list_lock); -+ list_for_each_entry_safe(adapter, _n, &adapter_list, node) { - if (adapter->pdev->port == port) { - if (adapter->ara) { - parport_disable_irq(port); -@@ -259,14 +263,11 @@ static void i2c_parport_detach (struct parport *port) - - parport_release(adapter->pdev); - parport_unregister_device(adapter->pdev); -- if (prev) -- prev->next = adapter->next; -- else -- adapter_list = adapter->next; -+ list_del(&adapter->node); - kfree(adapter); -- return; - } - } -+ mutex_unlock(&adapter_list_lock); - } - - static struct parport_driver i2c_parport_driver = { -diff --git a/drivers/infiniband/hw/qib/qib_iba6120.c b/drivers/infiniband/hw/qib/qib_iba6120.c -index 7de4b7e..d8ca0a0 100644 ---- a/drivers/infiniband/hw/qib/qib_iba6120.c -+++ b/drivers/infiniband/hw/qib/qib_iba6120.c -@@ -1799,7 +1799,7 @@ static int qib_6120_setup_reset(struct qib_devdata *dd) - /* - * Keep chip from being accessed until we are ready. Use - * writeq() directly, to allow the write even though QIB_PRESENT -- * isn't' set. -+ * isn't set. - */ - dd->flags &= ~(QIB_INITTED | QIB_PRESENT); - dd->int_counter = 0; /* so we check interrupts work again */ -diff --git a/drivers/infiniband/hw/qib/qib_iba7220.c b/drivers/infiniband/hw/qib/qib_iba7220.c -index 74fe036..c765a2e 100644 ---- a/drivers/infiniband/hw/qib/qib_iba7220.c -+++ b/drivers/infiniband/hw/qib/qib_iba7220.c -@@ -2111,7 +2111,7 @@ static int qib_setup_7220_reset(struct qib_devdata *dd) - /* - * Keep chip from being accessed until we are ready. Use - * writeq() directly, to allow the write even though QIB_PRESENT -- * isn't' set. -+ * isn't set. - */ - dd->flags &= ~(QIB_INITTED | QIB_PRESENT); - dd->int_counter = 0; /* so we check interrupts work again */ -diff --git a/drivers/infiniband/hw/qib/qib_iba7322.c b/drivers/infiniband/hw/qib/qib_iba7322.c -index 55de3cf..6bab3ea 100644 ---- a/drivers/infiniband/hw/qib/qib_iba7322.c -+++ b/drivers/infiniband/hw/qib/qib_iba7322.c -@@ -3299,7 +3299,7 @@ static int qib_do_7322_reset(struct qib_devdata *dd) - /* - * Keep chip from being accessed until we are ready. Use - * writeq() directly, to allow the write even though QIB_PRESENT -- * isn't' set. -+ * isn't set. - */ - dd->flags &= ~(QIB_INITTED | QIB_PRESENT | QIB_BADINTR); - dd->flags |= QIB_DOING_RESET; -diff --git a/drivers/media/common/tuners/tda18271-common.c b/drivers/media/common/tuners/tda18271-common.c -index 5466d47..aae40e5 100644 ---- a/drivers/media/common/tuners/tda18271-common.c -+++ b/drivers/media/common/tuners/tda18271-common.c -@@ -533,16 +533,7 @@ int tda18271_calc_main_pll(struct dvb_frontend *fe, u32 freq) - if (tda_fail(ret)) - goto fail; - -- regs[R_MPD] = (0x77 & pd); -- -- switch (priv->mode) { -- case TDA18271_ANALOG: -- regs[R_MPD] &= ~0x08; -- break; -- case TDA18271_DIGITAL: -- regs[R_MPD] |= 0x08; -- break; -- } -+ regs[R_MPD] = (0x7f & pd); - - div = ((d * (freq / 1000)) << 7) / 125; - -diff --git a/drivers/media/common/tuners/tda18271-fe.c b/drivers/media/common/tuners/tda18271-fe.c -index 9ad4454..d884f5e 100644 ---- a/drivers/media/common/tuners/tda18271-fe.c -+++ b/drivers/media/common/tuners/tda18271-fe.c -@@ -579,8 +579,8 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq) - #define RF3 2 - u32 rf_default[3]; - u32 rf_freq[3]; -- u8 prog_cal[3]; -- u8 prog_tab[3]; -+ s32 prog_cal[3]; -+ s32 prog_tab[3]; - - i = tda18271_lookup_rf_band(fe, &freq, NULL); - -@@ -602,32 +602,33 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq) - return bcal; - - tda18271_calc_rf_cal(fe, &rf_freq[rf]); -- prog_tab[rf] = regs[R_EB14]; -+ prog_tab[rf] = (s32)regs[R_EB14]; - - if (1 == bcal) -- prog_cal[rf] = tda18271_calibrate_rf(fe, rf_freq[rf]); -+ prog_cal[rf] = -+ (s32)tda18271_calibrate_rf(fe, rf_freq[rf]); - else - prog_cal[rf] = prog_tab[rf]; - - switch (rf) { - case RF1: - map[i].rf_a1 = 0; -- map[i].rf_b1 = (s32)(prog_cal[RF1] - prog_tab[RF1]); -+ map[i].rf_b1 = (prog_cal[RF1] - prog_tab[RF1]); - map[i].rf1 = rf_freq[RF1] / 1000; - break; - case RF2: -- dividend = (s32)(prog_cal[RF2] - prog_tab[RF2]) - -- (s32)(prog_cal[RF1] + prog_tab[RF1]); -+ dividend = (prog_cal[RF2] - prog_tab[RF2] - -+ prog_cal[RF1] + prog_tab[RF1]); - divisor = (s32)(rf_freq[RF2] - rf_freq[RF1]) / 1000; - map[i].rf_a1 = (dividend / divisor); - map[i].rf2 = rf_freq[RF2] / 1000; - break; - case RF3: -- dividend = (s32)(prog_cal[RF3] - prog_tab[RF3]) - -- (s32)(prog_cal[RF2] + prog_tab[RF2]); -+ dividend = (prog_cal[RF3] - prog_tab[RF3] - -+ prog_cal[RF2] + prog_tab[RF2]); - divisor = (s32)(rf_freq[RF3] - rf_freq[RF2]) / 1000; - map[i].rf_a2 = (dividend / divisor); -- map[i].rf_b2 = (s32)(prog_cal[RF2] - prog_tab[RF2]); -+ map[i].rf_b2 = (prog_cal[RF2] - prog_tab[RF2]); - map[i].rf3 = rf_freq[RF3] / 1000; - break; - default: -diff --git a/drivers/media/common/tuners/tda18271-maps.c b/drivers/media/common/tuners/tda18271-maps.c -index e7f84c7..3d5b6ab 100644 ---- a/drivers/media/common/tuners/tda18271-maps.c -+++ b/drivers/media/common/tuners/tda18271-maps.c -@@ -229,8 +229,7 @@ static struct tda18271_map tda18271c2_km[] = { - static struct tda18271_map tda18271_rf_band[] = { - { .rfmax = 47900, .val = 0x00 }, - { .rfmax = 61100, .val = 0x01 }, --/* { .rfmax = 152600, .val = 0x02 }, */ -- { .rfmax = 121200, .val = 0x02 }, -+ { .rfmax = 152600, .val = 0x02 }, - { .rfmax = 164700, .val = 0x03 }, - { .rfmax = 203500, .val = 0x04 }, - { .rfmax = 457800, .val = 0x05 }, -@@ -448,7 +447,7 @@ static struct tda18271_map tda18271c2_rf_cal[] = { - { .rfmax = 150000, .val = 0xb0 }, - { .rfmax = 151000, .val = 0xb1 }, - { .rfmax = 152000, .val = 0xb7 }, -- { .rfmax = 153000, .val = 0xbd }, -+ { .rfmax = 152600, .val = 0xbd }, - { .rfmax = 154000, .val = 0x20 }, - { .rfmax = 155000, .val = 0x22 }, - { .rfmax = 156000, .val = 0x24 }, -@@ -459,7 +458,7 @@ static struct tda18271_map tda18271c2_rf_cal[] = { - { .rfmax = 161000, .val = 0x2d }, - { .rfmax = 163000, .val = 0x2e }, - { .rfmax = 164000, .val = 0x2f }, -- { .rfmax = 165000, .val = 0x30 }, -+ { .rfmax = 164700, .val = 0x30 }, - { .rfmax = 166000, .val = 0x11 }, - { .rfmax = 167000, .val = 0x12 }, - { .rfmax = 168000, .val = 0x13 }, -@@ -510,7 +509,8 @@ static struct tda18271_map tda18271c2_rf_cal[] = { - { .rfmax = 236000, .val = 0x1b }, - { .rfmax = 237000, .val = 0x1c }, - { .rfmax = 240000, .val = 0x1d }, -- { .rfmax = 242000, .val = 0x1f }, -+ { .rfmax = 242000, .val = 0x1e }, -+ { .rfmax = 244000, .val = 0x1f }, - { .rfmax = 247000, .val = 0x20 }, - { .rfmax = 249000, .val = 0x21 }, - { .rfmax = 252000, .val = 0x22 }, -@@ -624,7 +624,7 @@ static struct tda18271_map tda18271c2_rf_cal[] = { - { .rfmax = 453000, .val = 0x93 }, - { .rfmax = 454000, .val = 0x94 }, - { .rfmax = 456000, .val = 0x96 }, -- { .rfmax = 457000, .val = 0x98 }, -+ { .rfmax = 457800, .val = 0x98 }, - { .rfmax = 461000, .val = 0x11 }, - { .rfmax = 468000, .val = 0x12 }, - { .rfmax = 472000, .val = 0x13 }, -diff --git a/drivers/media/dvb/b2c2/flexcop-pci.c b/drivers/media/dvb/b2c2/flexcop-pci.c -index 9552540..03f96d6 100644 ---- a/drivers/media/dvb/b2c2/flexcop-pci.c -+++ b/drivers/media/dvb/b2c2/flexcop-pci.c -@@ -38,7 +38,7 @@ MODULE_PARM_DESC(debug, - DEBSTATUS); - - #define DRIVER_VERSION "0.1" --#define DRIVER_NAME "Technisat/B2C2 FlexCop II/IIb/III Digital TV PCI Driver" -+#define DRIVER_NAME "flexcop-pci" - #define DRIVER_AUTHOR "Patrick Boettcher " - - struct flexcop_pci { -diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig -index fe4f894..ccbd39a 100644 ---- a/drivers/media/dvb/dvb-usb/Kconfig -+++ b/drivers/media/dvb/dvb-usb/Kconfig -@@ -362,7 +362,7 @@ config DVB_USB_LME2510 - config DVB_USB_TECHNISAT_USB2 - tristate "Technisat DVB-S/S2 USB2.0 support" - depends on DVB_USB -- select DVB_STB0899 if !DVB_FE_CUSTOMISE -- select DVB_STB6100 if !DVB_FE_CUSTOMISE -+ select DVB_STV090x if !DVB_FE_CUSTOMISE -+ select DVB_STV6110x if !DVB_FE_CUSTOMISE - help - Say Y here to support the Technisat USB2 DVB-S/S2 device -diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c -index 97af266..65214af 100644 ---- a/drivers/media/dvb/dvb-usb/dib0700_devices.c -+++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c -@@ -2162,7 +2162,7 @@ struct dibx000_agc_config dib7090_agc_config[2] = { - .agc1_pt3 = 98, - .agc1_slope1 = 0, - .agc1_slope2 = 167, -- .agc1_pt1 = 98, -+ .agc2_pt1 = 98, - .agc2_pt2 = 255, - .agc2_slope1 = 104, - .agc2_slope2 = 0, -@@ -2440,11 +2440,11 @@ static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap) - dib0700_set_i2c_speed(adap->dev, 340); - adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x90, &tfe7090pvr_dib7000p_config[0]); - -- dib7090_slave_reset(adap->fe); -- - if (adap->fe == NULL) - return -ENODEV; - -+ dib7090_slave_reset(adap->fe); -+ - return 0; - } - -diff --git a/drivers/media/media-entity.c b/drivers/media/media-entity.c -index 23640ed..056138f 100644 ---- a/drivers/media/media-entity.c -+++ b/drivers/media/media-entity.c -@@ -378,7 +378,6 @@ EXPORT_SYMBOL_GPL(media_entity_create_link); - - static int __media_entity_setup_link_notify(struct media_link *link, u32 flags) - { -- const u32 mask = MEDIA_LNK_FL_ENABLED; - int ret; - - /* Notify both entities. */ -@@ -395,7 +394,7 @@ static int __media_entity_setup_link_notify(struct media_link *link, u32 flags) - return ret; - } - -- link->flags = (link->flags & ~mask) | (flags & mask); -+ link->flags = flags; - link->reverse->flags = link->flags; - - return 0; -@@ -417,6 +416,7 @@ static int __media_entity_setup_link_notify(struct media_link *link, u32 flags) - */ - int __media_entity_setup_link(struct media_link *link, u32 flags) - { -+ const u32 mask = MEDIA_LNK_FL_ENABLED; - struct media_device *mdev; - struct media_entity *source, *sink; - int ret = -EBUSY; -@@ -424,6 +424,10 @@ int __media_entity_setup_link(struct media_link *link, u32 flags) - if (link == NULL) - return -EINVAL; - -+ /* The non-modifiable link flags must not be modified. */ -+ if ((link->flags & ~mask) != (flags & ~mask)) -+ return -EINVAL; -+ - if (link->flags & MEDIA_LNK_FL_IMMUTABLE) - return link->flags == flags ? 0 : -EINVAL; - -diff --git a/drivers/media/radio/radio-sf16fmr2.c b/drivers/media/radio/radio-sf16fmr2.c -index dc3f04c..87bad76 100644 ---- a/drivers/media/radio/radio-sf16fmr2.c -+++ b/drivers/media/radio/radio-sf16fmr2.c -@@ -170,7 +170,7 @@ static int fmr2_setfreq(struct fmr2 *dev) - return 0; - } - --/* !!! not tested, in my card this does't work !!! */ -+/* !!! not tested, in my card this doesn't work !!! */ - static int fmr2_setvolume(struct fmr2 *dev) - { - int vol[16] = { 0x021, 0x084, 0x090, 0x104, -diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig -index 4498b94..00f51dd 100644 ---- a/drivers/media/video/Kconfig -+++ b/drivers/media/video/Kconfig -@@ -875,7 +875,7 @@ config MX3_VIDEO - config VIDEO_MX3 - tristate "i.MX3x Camera Sensor Interface driver" - depends on VIDEO_DEV && MX3_IPU && SOC_CAMERA -- select VIDEOBUF_DMA_CONTIG -+ select VIDEOBUF2_DMA_CONTIG - select MX3_VIDEO - ---help--- - This is a v4l2 driver for the i.MX3x Camera Sensor Interface -diff --git a/drivers/media/video/cx18/cx18-streams.c b/drivers/media/video/cx18/cx18-streams.c -index c6e2ca3..6fbc356 100644 ---- a/drivers/media/video/cx18/cx18-streams.c -+++ b/drivers/media/video/cx18/cx18-streams.c -@@ -350,9 +350,17 @@ void cx18_streams_cleanup(struct cx18 *cx, int unregister) - - /* No struct video_device, but can have buffers allocated */ - if (type == CX18_ENC_STREAM_TYPE_IDX) { -+ /* If the module params didn't inhibit IDX ... */ - if (cx->stream_buffers[type] != 0) { - cx->stream_buffers[type] = 0; -- cx18_stream_free(&cx->streams[type]); -+ /* -+ * Before calling cx18_stream_free(), -+ * check if the IDX stream was actually set up. -+ * Needed, since the cx18_probe() error path -+ * exits through here as well as normal clean up -+ */ -+ if (cx->streams[type].buffers != 0) -+ cx18_stream_free(&cx->streams[type]); - } - continue; - } -diff --git a/drivers/media/video/cx23885/Kconfig b/drivers/media/video/cx23885/Kconfig -index 3b6e7f2..caab1bf 100644 ---- a/drivers/media/video/cx23885/Kconfig -+++ b/drivers/media/video/cx23885/Kconfig -@@ -22,6 +22,7 @@ config VIDEO_CX23885 - select DVB_CX24116 if !DVB_FE_CUSTOMISE - select DVB_STV0900 if !DVB_FE_CUSTOMISE - select DVB_DS3000 if !DVB_FE_CUSTOMISE -+ select DVB_STV0367 if !DVB_FE_CUSTOMISE - select MEDIA_TUNER_MT2131 if !MEDIA_TUNER_CUSTOMISE - select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMISE - select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMISE -diff --git a/drivers/media/video/imx074.c b/drivers/media/video/imx074.c -index 1a11691..0382ea7 100644 ---- a/drivers/media/video/imx074.c -+++ b/drivers/media/video/imx074.c -@@ -298,7 +298,7 @@ static unsigned long imx074_query_bus_param(struct soc_camera_device *icd) - static int imx074_set_bus_param(struct soc_camera_device *icd, - unsigned long flags) - { -- return -1; -+ return -EINVAL; - } - - static struct soc_camera_ops imx074_ops = { -diff --git a/drivers/media/video/omap3isp/isp.c b/drivers/media/video/omap3isp/isp.c -index 503bd79..472a693 100644 ---- a/drivers/media/video/omap3isp/isp.c -+++ b/drivers/media/video/omap3isp/isp.c -@@ -215,20 +215,21 @@ static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel) - } - - switch (xclksel) { -- case 0: -+ case ISP_XCLK_A: - isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, - ISPTCTRL_CTRL_DIVA_MASK, - divisor << ISPTCTRL_CTRL_DIVA_SHIFT); - dev_dbg(isp->dev, "isp_set_xclk(): cam_xclka set to %d Hz\n", - currentxclk); - break; -- case 1: -+ case ISP_XCLK_B: - isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, - ISPTCTRL_CTRL_DIVB_MASK, - divisor << ISPTCTRL_CTRL_DIVB_SHIFT); - dev_dbg(isp->dev, "isp_set_xclk(): cam_xclkb set to %d Hz\n", - currentxclk); - break; -+ case ISP_XCLK_NONE: - default: - omap3isp_put(isp); - dev_dbg(isp->dev, "ISP_ERR: isp_set_xclk(): Invalid requested " -@@ -237,13 +238,13 @@ static u32 isp_set_xclk(struct isp_device *isp, u32 xclk, u8 xclksel) - } - - /* Do we go from stable whatever to clock? */ -- if (divisor >= 2 && isp->xclk_divisor[xclksel] < 2) -+ if (divisor >= 2 && isp->xclk_divisor[xclksel - 1] < 2) - omap3isp_get(isp); - /* Stopping the clock. */ -- else if (divisor < 2 && isp->xclk_divisor[xclksel] >= 2) -+ else if (divisor < 2 && isp->xclk_divisor[xclksel - 1] >= 2) - omap3isp_put(isp); - -- isp->xclk_divisor[xclksel] = divisor; -+ isp->xclk_divisor[xclksel - 1] = divisor; - - omap3isp_put(isp); - -@@ -285,7 +286,8 @@ static void isp_power_settings(struct isp_device *isp, int idle) - */ - void omap3isp_configure_bridge(struct isp_device *isp, - enum ccdc_input_entity input, -- const struct isp_parallel_platform_data *pdata) -+ const struct isp_parallel_platform_data *pdata, -+ unsigned int shift) - { - u32 ispctrl_val; - -@@ -298,9 +300,9 @@ void omap3isp_configure_bridge(struct isp_device *isp, - switch (input) { - case CCDC_INPUT_PARALLEL: - ispctrl_val |= ISPCTRL_PAR_SER_CLK_SEL_PARALLEL; -- ispctrl_val |= pdata->data_lane_shift << ISPCTRL_SHIFT_SHIFT; - ispctrl_val |= pdata->clk_pol << ISPCTRL_PAR_CLK_POL_SHIFT; - ispctrl_val |= pdata->bridge << ISPCTRL_PAR_BRIDGE_SHIFT; -+ shift += pdata->data_lane_shift * 2; - break; - - case CCDC_INPUT_CSI2A: -@@ -319,6 +321,8 @@ void omap3isp_configure_bridge(struct isp_device *isp, - return; - } - -+ ispctrl_val |= ((shift/2) << ISPCTRL_SHIFT_SHIFT) & ISPCTRL_SHIFT_MASK; -+ - ispctrl_val &= ~ISPCTRL_SYNC_DETECT_MASK; - ispctrl_val |= ISPCTRL_SYNC_DETECT_VSRISE; - -@@ -658,6 +662,8 @@ int omap3isp_pipeline_pm_use(struct media_entity *entity, int use) - - /* Apply power change to connected non-nodes. */ - ret = isp_pipeline_pm_power(entity, change); -+ if (ret < 0) -+ entity->use_count -= change; - - mutex_unlock(&entity->parent->graph_mutex); - -@@ -872,6 +878,9 @@ static int isp_pipeline_disable(struct isp_pipeline *pipe) - } - } - -+ if (failure < 0) -+ isp->needs_reset = true; -+ - return failure; - } - -@@ -884,7 +893,8 @@ static int isp_pipeline_disable(struct isp_pipeline *pipe) - * single-shot or continuous mode. - * - * Return 0 if successful, or the return value of the failed video::s_stream -- * operation otherwise. -+ * operation otherwise. The pipeline state is not updated when the operation -+ * fails, except when stopping the pipeline. - */ - int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe, - enum isp_pipeline_stream_state state) -@@ -895,7 +905,9 @@ int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe, - ret = isp_pipeline_disable(pipe); - else - ret = isp_pipeline_enable(pipe, state); -- pipe->stream_state = state; -+ -+ if (ret == 0 || state == ISP_PIPELINE_STREAM_STOPPED) -+ pipe->stream_state = state; - - return ret; - } -@@ -1481,6 +1493,10 @@ void omap3isp_put(struct isp_device *isp) - if (--isp->ref_count == 0) { - isp_disable_interrupts(isp); - isp_save_ctx(isp); -+ if (isp->needs_reset) { -+ isp_reset(isp); -+ isp->needs_reset = false; -+ } - isp_disable_clocks(isp); - } - mutex_unlock(&isp->isp_mutex); -diff --git a/drivers/media/video/omap3isp/isp.h b/drivers/media/video/omap3isp/isp.h -index cf5214e..2620c40 100644 ---- a/drivers/media/video/omap3isp/isp.h -+++ b/drivers/media/video/omap3isp/isp.h -@@ -132,7 +132,6 @@ struct isp_reg { - - /** - * struct isp_parallel_platform_data - Parallel interface platform data -- * @width: Parallel bus width in bits (8, 10, 11 or 12) - * @data_lane_shift: Data lane shifter - * 0 - CAMEXT[13:0] -> CAM[13:0] - * 1 - CAMEXT[13:2] -> CAM[11:0] -@@ -146,7 +145,6 @@ struct isp_reg { - * ISPCTRL_PAR_BRIDGE_BENDIAN - Big endian - */ - struct isp_parallel_platform_data { -- unsigned int width; - unsigned int data_lane_shift:2; - unsigned int clk_pol:1; - unsigned int bridge:4; -@@ -262,6 +260,7 @@ struct isp_device { - /* ISP Obj */ - spinlock_t stat_lock; /* common lock for statistic drivers */ - struct mutex isp_mutex; /* For handling ref_count field */ -+ bool needs_reset; - int has_context; - int ref_count; - unsigned int autoidle; -@@ -311,11 +310,12 @@ int omap3isp_pipeline_set_stream(struct isp_pipeline *pipe, - enum isp_pipeline_stream_state state); - void omap3isp_configure_bridge(struct isp_device *isp, - enum ccdc_input_entity input, -- const struct isp_parallel_platform_data *pdata); -+ const struct isp_parallel_platform_data *pdata, -+ unsigned int shift); - --#define ISP_XCLK_NONE -1 --#define ISP_XCLK_A 0 --#define ISP_XCLK_B 1 -+#define ISP_XCLK_NONE 0 -+#define ISP_XCLK_A 1 -+#define ISP_XCLK_B 2 - - struct isp_device *omap3isp_get(struct isp_device *isp); - void omap3isp_put(struct isp_device *isp); -diff --git a/drivers/media/video/omap3isp/ispccdc.c b/drivers/media/video/omap3isp/ispccdc.c -index 5ff9d14..39d501b 100644 ---- a/drivers/media/video/omap3isp/ispccdc.c -+++ b/drivers/media/video/omap3isp/ispccdc.c -@@ -43,6 +43,12 @@ __ccdc_get_format(struct isp_ccdc_device *ccdc, struct v4l2_subdev_fh *fh, - - static const unsigned int ccdc_fmts[] = { - V4L2_MBUS_FMT_Y8_1X8, -+ V4L2_MBUS_FMT_Y10_1X10, -+ V4L2_MBUS_FMT_Y12_1X12, -+ V4L2_MBUS_FMT_SGRBG8_1X8, -+ V4L2_MBUS_FMT_SRGGB8_1X8, -+ V4L2_MBUS_FMT_SBGGR8_1X8, -+ V4L2_MBUS_FMT_SGBRG8_1X8, - V4L2_MBUS_FMT_SGRBG10_1X10, - V4L2_MBUS_FMT_SRGGB10_1X10, - V4L2_MBUS_FMT_SBGGR10_1X10, -@@ -1110,21 +1116,38 @@ static void ccdc_configure(struct isp_ccdc_device *ccdc) - struct isp_parallel_platform_data *pdata = NULL; - struct v4l2_subdev *sensor; - struct v4l2_mbus_framefmt *format; -+ const struct isp_format_info *fmt_info; -+ struct v4l2_subdev_format fmt_src; -+ unsigned int depth_out; -+ unsigned int depth_in = 0; - struct media_pad *pad; - unsigned long flags; -+ unsigned int shift; - u32 syn_mode; - u32 ccdc_pattern; - -- if (ccdc->input == CCDC_INPUT_PARALLEL) { -- pad = media_entity_remote_source(&ccdc->pads[CCDC_PAD_SINK]); -- sensor = media_entity_to_v4l2_subdev(pad->entity); -+ pad = media_entity_remote_source(&ccdc->pads[CCDC_PAD_SINK]); -+ sensor = media_entity_to_v4l2_subdev(pad->entity); -+ if (ccdc->input == CCDC_INPUT_PARALLEL) - pdata = &((struct isp_v4l2_subdevs_group *)sensor->host_priv) - ->bus.parallel; -+ -+ /* Compute shift value for lane shifter to configure the bridge. */ -+ fmt_src.pad = pad->index; -+ fmt_src.which = V4L2_SUBDEV_FORMAT_ACTIVE; -+ if (!v4l2_subdev_call(sensor, pad, get_fmt, NULL, &fmt_src)) { -+ fmt_info = omap3isp_video_format_info(fmt_src.format.code); -+ depth_in = fmt_info->bpp; - } - -- omap3isp_configure_bridge(isp, ccdc->input, pdata); -+ fmt_info = omap3isp_video_format_info -+ (isp->isp_ccdc.formats[CCDC_PAD_SINK].code); -+ depth_out = fmt_info->bpp; -+ -+ shift = depth_in - depth_out; -+ omap3isp_configure_bridge(isp, ccdc->input, pdata, shift); - -- ccdc->syncif.datsz = pdata ? pdata->width : 10; -+ ccdc->syncif.datsz = depth_out; - ccdc_config_sync_if(ccdc, &ccdc->syncif); - - /* CCDC_PAD_SINK */ -@@ -1338,7 +1361,7 @@ static int ccdc_sbl_wait_idle(struct isp_ccdc_device *ccdc, - * @ccdc: Pointer to ISP CCDC device. - * @event: Pointing which event trigger handler - * -- * Return 1 when the event and stopping request combination is satisfyied, -+ * Return 1 when the event and stopping request combination is satisfied, - * zero otherwise. - */ - static int __ccdc_handle_stopping(struct isp_ccdc_device *ccdc, u32 event) -@@ -1618,7 +1641,7 @@ static int ccdc_video_queue(struct isp_video *video, struct isp_buffer *buffer) - - ccdc_set_outaddr(ccdc, buffer->isp_addr); - -- /* We now have a buffer queued on the output, restart the pipeline in -+ /* We now have a buffer queued on the output, restart the pipeline - * on the next CCDC interrupt if running in continuous mode (or when - * starting the stream). - */ -diff --git a/drivers/media/video/omap3isp/isppreview.c b/drivers/media/video/omap3isp/isppreview.c -index 2b16988..aba537a 100644 ---- a/drivers/media/video/omap3isp/isppreview.c -+++ b/drivers/media/video/omap3isp/isppreview.c -@@ -755,7 +755,7 @@ static struct preview_update update_attrs[] = { - * @configs - pointer to update config structure. - * @config - return pointer to appropriate structure field. - * @bit - for which feature to return pointers. -- * Return size of coresponding prev_params member -+ * Return size of corresponding prev_params member - */ - static u32 - __preview_get_ptrs(struct prev_params *params, void **param, -diff --git a/drivers/media/video/omap3isp/ispqueue.c b/drivers/media/video/omap3isp/ispqueue.c -index 8fddc58..9c31714 100644 ---- a/drivers/media/video/omap3isp/ispqueue.c -+++ b/drivers/media/video/omap3isp/ispqueue.c -@@ -339,7 +339,7 @@ static int isp_video_buffer_prepare_user(struct isp_video_buffer *buf) - up_read(¤t->mm->mmap_sem); - - if (ret != buf->npages) { -- buf->npages = ret; -+ buf->npages = ret < 0 ? 0 : ret; - isp_video_buffer_cleanup(buf); - return -EFAULT; - } -@@ -408,8 +408,8 @@ done: - * isp_video_buffer_prepare_vm_flags - Get VMA flags for a userspace address - * - * This function locates the VMAs for the buffer's userspace address and checks -- * that their flags match. The onlflag that we need to care for at the moment is -- * VM_PFNMAP. -+ * that their flags match. The only flag that we need to care for at the moment -+ * is VM_PFNMAP. - * - * The buffer vm_flags field is set to the first VMA flags. - * -diff --git a/drivers/media/video/omap3isp/ispresizer.c b/drivers/media/video/omap3isp/ispresizer.c -index 653f88b..0bb0f8c 100644 ---- a/drivers/media/video/omap3isp/ispresizer.c -+++ b/drivers/media/video/omap3isp/ispresizer.c -@@ -714,19 +714,50 @@ static void resizer_print_status(struct isp_res_device *res) - * iw and ih are the input width and height after cropping. Those equations need - * to be satisfied exactly for the resizer to work correctly. - * -- * Reverting the equations, we can compute the resizing ratios with -+ * The equations can't be easily reverted, as the >> 8 operation is not linear. -+ * In addition, not all input sizes can be achieved for a given output size. To -+ * get the highest input size lower than or equal to the requested input size, -+ * we need to compute the highest resizing ratio that satisfies the following -+ * inequality (taking the 4-tap mode width equation as an example) -+ * -+ * iw >= (32 * sph + (ow - 1) * hrsz + 16) >> 8 - 7 -+ * -+ * (where iw is the requested input width) which can be rewritten as -+ * -+ * iw - 7 >= (32 * sph + (ow - 1) * hrsz + 16) >> 8 -+ * (iw - 7) << 8 >= 32 * sph + (ow - 1) * hrsz + 16 - b -+ * ((iw - 7) << 8) + b >= 32 * sph + (ow - 1) * hrsz + 16 -+ * -+ * where b is the value of the 8 least significant bits of the right hand side -+ * expression of the last inequality. The highest resizing ratio value will be -+ * achieved when b is equal to its maximum value of 255. That resizing ratio -+ * value will still satisfy the original inequality, as b will disappear when -+ * the expression will be shifted right by 8. -+ * -+ * The reverted the equations thus become - * - * - 8-phase, 4-tap mode -- * hrsz = ((iw - 7) * 256 - 16 - 32 * sph) / (ow - 1) -- * vrsz = ((ih - 4) * 256 - 16 - 32 * spv) / (oh - 1) -+ * hrsz = ((iw - 7) * 256 + 255 - 16 - 32 * sph) / (ow - 1) -+ * vrsz = ((ih - 4) * 256 + 255 - 16 - 32 * spv) / (oh - 1) - * - 4-phase, 7-tap mode -- * hrsz = ((iw - 7) * 256 - 32 - 64 * sph) / (ow - 1) -- * vrsz = ((ih - 7) * 256 - 32 - 64 * spv) / (oh - 1) -+ * hrsz = ((iw - 7) * 256 + 255 - 32 - 64 * sph) / (ow - 1) -+ * vrsz = ((ih - 7) * 256 + 255 - 32 - 64 * spv) / (oh - 1) - * -- * The ratios are integer values, and must be rounded down to ensure that the -- * cropped input size is not bigger than the uncropped input size. As the ratio -- * in 7-tap mode is always smaller than the ratio in 4-tap mode, we can use the -- * 7-tap mode equations to compute a ratio approximation. -+ * The ratios are integer values, and are rounded down to ensure that the -+ * cropped input size is not bigger than the uncropped input size. -+ * -+ * As the number of phases/taps, used to select the correct equations to compute -+ * the ratio, depends on the ratio, we start with the 4-tap mode equations to -+ * compute an approximation of the ratio, and switch to the 7-tap mode equations -+ * if the approximation is higher than the ratio threshold. -+ * -+ * As the 7-tap mode equations will return a ratio smaller than or equal to the -+ * 4-tap mode equations, the resulting ratio could become lower than or equal to -+ * the ratio threshold. This 'equations loop' isn't an issue as long as the -+ * correct equations are used to compute the final input size. Starting with the -+ * 4-tap mode equations ensure that, in case of values resulting in a 'ratio -+ * loop', the smallest of the ratio values will be used, never exceeding the -+ * requested input size. - * - * We first clamp the output size according to the hardware capabilitie to avoid - * auto-cropping the input more than required to satisfy the TRM equations. The -@@ -775,6 +806,8 @@ static void resizer_calc_ratios(struct isp_res_device *res, - unsigned int max_width; - unsigned int max_height; - unsigned int width_alignment; -+ unsigned int width; -+ unsigned int height; - - /* - * Clamp the output height based on the hardware capabilities and -@@ -786,19 +819,22 @@ static void resizer_calc_ratios(struct isp_res_device *res, - max_height = min_t(unsigned int, max_height, MAX_OUT_HEIGHT); - output->height = clamp(output->height, min_height, max_height); - -- ratio->vert = ((input->height - 7) * 256 - 32 - 64 * spv) -+ ratio->vert = ((input->height - 4) * 256 + 255 - 16 - 32 * spv) - / (output->height - 1); -+ if (ratio->vert > MID_RESIZE_VALUE) -+ ratio->vert = ((input->height - 7) * 256 + 255 - 32 - 64 * spv) -+ / (output->height - 1); - ratio->vert = clamp_t(unsigned int, ratio->vert, - MIN_RESIZE_VALUE, MAX_RESIZE_VALUE); - - if (ratio->vert <= MID_RESIZE_VALUE) { - upscaled_height = (output->height - 1) * ratio->vert - + 32 * spv + 16; -- input->height = (upscaled_height >> 8) + 4; -+ height = (upscaled_height >> 8) + 4; - } else { - upscaled_height = (output->height - 1) * ratio->vert - + 64 * spv + 32; -- input->height = (upscaled_height >> 8) + 7; -+ height = (upscaled_height >> 8) + 7; - } - - /* -@@ -854,20 +890,29 @@ static void resizer_calc_ratios(struct isp_res_device *res, - max_width & ~(width_alignment - 1)); - output->width = ALIGN(output->width, width_alignment); - -- ratio->horz = ((input->width - 7) * 256 - 32 - 64 * sph) -+ ratio->horz = ((input->width - 7) * 256 + 255 - 16 - 32 * sph) - / (output->width - 1); -+ if (ratio->horz > MID_RESIZE_VALUE) -+ ratio->horz = ((input->width - 7) * 256 + 255 - 32 - 64 * sph) -+ / (output->width - 1); - ratio->horz = clamp_t(unsigned int, ratio->horz, - MIN_RESIZE_VALUE, MAX_RESIZE_VALUE); - - if (ratio->horz <= MID_RESIZE_VALUE) { - upscaled_width = (output->width - 1) * ratio->horz - + 32 * sph + 16; -- input->width = (upscaled_width >> 8) + 7; -+ width = (upscaled_width >> 8) + 7; - } else { - upscaled_width = (output->width - 1) * ratio->horz - + 64 * sph + 32; -- input->width = (upscaled_width >> 8) + 7; -+ width = (upscaled_width >> 8) + 7; - } -+ -+ /* Center the new crop rectangle. */ -+ input->left += (input->width - width) / 2; -+ input->top += (input->height - height) / 2; -+ input->width = width; -+ input->height = height; - } - - /* -diff --git a/drivers/media/video/omap3isp/ispstat.h b/drivers/media/video/omap3isp/ispstat.h -index 820950c..d86da94 100644 ---- a/drivers/media/video/omap3isp/ispstat.h -+++ b/drivers/media/video/omap3isp/ispstat.h -@@ -131,9 +131,9 @@ struct ispstat { - struct ispstat_generic_config { - /* - * Fields must be in the same order as in: -- * - isph3a_aewb_config -- * - isph3a_af_config -- * - isphist_config -+ * - omap3isp_h3a_aewb_config -+ * - omap3isp_h3a_af_config -+ * - omap3isp_hist_config - */ - u32 buf_size; - u16 config_counter; -diff --git a/drivers/media/video/omap3isp/ispvideo.c b/drivers/media/video/omap3isp/ispvideo.c -index 208a7ec..9cd8f1a 100644 ---- a/drivers/media/video/omap3isp/ispvideo.c -+++ b/drivers/media/video/omap3isp/ispvideo.c -@@ -47,29 +47,59 @@ - - static struct isp_format_info formats[] = { - { V4L2_MBUS_FMT_Y8_1X8, V4L2_MBUS_FMT_Y8_1X8, -- V4L2_MBUS_FMT_Y8_1X8, V4L2_PIX_FMT_GREY, 8, }, -+ V4L2_MBUS_FMT_Y8_1X8, V4L2_MBUS_FMT_Y8_1X8, -+ V4L2_PIX_FMT_GREY, 8, }, -+ { V4L2_MBUS_FMT_Y10_1X10, V4L2_MBUS_FMT_Y10_1X10, -+ V4L2_MBUS_FMT_Y10_1X10, V4L2_MBUS_FMT_Y8_1X8, -+ V4L2_PIX_FMT_Y10, 10, }, -+ { V4L2_MBUS_FMT_Y12_1X12, V4L2_MBUS_FMT_Y10_1X10, -+ V4L2_MBUS_FMT_Y12_1X12, V4L2_MBUS_FMT_Y8_1X8, -+ V4L2_PIX_FMT_Y12, 12, }, -+ { V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_MBUS_FMT_SBGGR8_1X8, -+ V4L2_MBUS_FMT_SBGGR8_1X8, V4L2_MBUS_FMT_SBGGR8_1X8, -+ V4L2_PIX_FMT_SBGGR8, 8, }, -+ { V4L2_MBUS_FMT_SGBRG8_1X8, V4L2_MBUS_FMT_SGBRG8_1X8, -+ V4L2_MBUS_FMT_SGBRG8_1X8, V4L2_MBUS_FMT_SGBRG8_1X8, -+ V4L2_PIX_FMT_SGBRG8, 8, }, -+ { V4L2_MBUS_FMT_SGRBG8_1X8, V4L2_MBUS_FMT_SGRBG8_1X8, -+ V4L2_MBUS_FMT_SGRBG8_1X8, V4L2_MBUS_FMT_SGRBG8_1X8, -+ V4L2_PIX_FMT_SGRBG8, 8, }, -+ { V4L2_MBUS_FMT_SRGGB8_1X8, V4L2_MBUS_FMT_SRGGB8_1X8, -+ V4L2_MBUS_FMT_SRGGB8_1X8, V4L2_MBUS_FMT_SRGGB8_1X8, -+ V4L2_PIX_FMT_SRGGB8, 8, }, - { V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8, V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8, -- V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_PIX_FMT_SGRBG10DPCM8, 8, }, -+ V4L2_MBUS_FMT_SGRBG10_1X10, 0, -+ V4L2_PIX_FMT_SGRBG10DPCM8, 8, }, - { V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_MBUS_FMT_SBGGR10_1X10, -- V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_PIX_FMT_SBGGR10, 10, }, -+ V4L2_MBUS_FMT_SBGGR10_1X10, V4L2_MBUS_FMT_SBGGR8_1X8, -+ V4L2_PIX_FMT_SBGGR10, 10, }, - { V4L2_MBUS_FMT_SGBRG10_1X10, V4L2_MBUS_FMT_SGBRG10_1X10, -- V4L2_MBUS_FMT_SGBRG10_1X10, V4L2_PIX_FMT_SGBRG10, 10, }, -+ V4L2_MBUS_FMT_SGBRG10_1X10, V4L2_MBUS_FMT_SGBRG8_1X8, -+ V4L2_PIX_FMT_SGBRG10, 10, }, - { V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_MBUS_FMT_SGRBG10_1X10, -- V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_PIX_FMT_SGRBG10, 10, }, -+ V4L2_MBUS_FMT_SGRBG10_1X10, V4L2_MBUS_FMT_SGRBG8_1X8, -+ V4L2_PIX_FMT_SGRBG10, 10, }, - { V4L2_MBUS_FMT_SRGGB10_1X10, V4L2_MBUS_FMT_SRGGB10_1X10, -- V4L2_MBUS_FMT_SRGGB10_1X10, V4L2_PIX_FMT_SRGGB10, 10, }, -+ V4L2_MBUS_FMT_SRGGB10_1X10, V4L2_MBUS_FMT_SRGGB8_1X8, -+ V4L2_PIX_FMT_SRGGB10, 10, }, - { V4L2_MBUS_FMT_SBGGR12_1X12, V4L2_MBUS_FMT_SBGGR10_1X10, -- V4L2_MBUS_FMT_SBGGR12_1X12, V4L2_PIX_FMT_SBGGR12, 12, }, -+ V4L2_MBUS_FMT_SBGGR12_1X12, V4L2_MBUS_FMT_SBGGR8_1X8, -+ V4L2_PIX_FMT_SBGGR12, 12, }, - { V4L2_MBUS_FMT_SGBRG12_1X12, V4L2_MBUS_FMT_SGBRG10_1X10, -- V4L2_MBUS_FMT_SGBRG12_1X12, V4L2_PIX_FMT_SGBRG12, 12, }, -+ V4L2_MBUS_FMT_SGBRG12_1X12, V4L2_MBUS_FMT_SGBRG8_1X8, -+ V4L2_PIX_FMT_SGBRG12, 12, }, - { V4L2_MBUS_FMT_SGRBG12_1X12, V4L2_MBUS_FMT_SGRBG10_1X10, -- V4L2_MBUS_FMT_SGRBG12_1X12, V4L2_PIX_FMT_SGRBG12, 12, }, -+ V4L2_MBUS_FMT_SGRBG12_1X12, V4L2_MBUS_FMT_SGRBG8_1X8, -+ V4L2_PIX_FMT_SGRBG12, 12, }, - { V4L2_MBUS_FMT_SRGGB12_1X12, V4L2_MBUS_FMT_SRGGB10_1X10, -- V4L2_MBUS_FMT_SRGGB12_1X12, V4L2_PIX_FMT_SRGGB12, 12, }, -+ V4L2_MBUS_FMT_SRGGB12_1X12, V4L2_MBUS_FMT_SRGGB8_1X8, -+ V4L2_PIX_FMT_SRGGB12, 12, }, - { V4L2_MBUS_FMT_UYVY8_1X16, V4L2_MBUS_FMT_UYVY8_1X16, -- V4L2_MBUS_FMT_UYVY8_1X16, V4L2_PIX_FMT_UYVY, 16, }, -+ V4L2_MBUS_FMT_UYVY8_1X16, 0, -+ V4L2_PIX_FMT_UYVY, 16, }, - { V4L2_MBUS_FMT_YUYV8_1X16, V4L2_MBUS_FMT_YUYV8_1X16, -- V4L2_MBUS_FMT_YUYV8_1X16, V4L2_PIX_FMT_YUYV, 16, }, -+ V4L2_MBUS_FMT_YUYV8_1X16, 0, -+ V4L2_PIX_FMT_YUYV, 16, }, - }; - - const struct isp_format_info * -@@ -86,6 +116,37 @@ omap3isp_video_format_info(enum v4l2_mbus_pixelcode code) - } - - /* -+ * Decide whether desired output pixel code can be obtained with -+ * the lane shifter by shifting the input pixel code. -+ * @in: input pixelcode to shifter -+ * @out: output pixelcode from shifter -+ * @additional_shift: # of bits the sensor's LSB is offset from CAMEXT[0] -+ * -+ * return true if the combination is possible -+ * return false otherwise -+ */ -+static bool isp_video_is_shiftable(enum v4l2_mbus_pixelcode in, -+ enum v4l2_mbus_pixelcode out, -+ unsigned int additional_shift) -+{ -+ const struct isp_format_info *in_info, *out_info; -+ -+ if (in == out) -+ return true; -+ -+ in_info = omap3isp_video_format_info(in); -+ out_info = omap3isp_video_format_info(out); -+ -+ if ((in_info->flavor == 0) || (out_info->flavor == 0)) -+ return false; -+ -+ if (in_info->flavor != out_info->flavor) -+ return false; -+ -+ return in_info->bpp - out_info->bpp + additional_shift <= 6; -+} -+ -+/* - * isp_video_mbus_to_pix - Convert v4l2_mbus_framefmt to v4l2_pix_format - * @video: ISP video instance - * @mbus: v4l2_mbus_framefmt format (input) -@@ -235,6 +296,7 @@ static int isp_video_validate_pipeline(struct isp_pipeline *pipe) - return -EPIPE; - - while (1) { -+ unsigned int shifter_link; - /* Retrieve the sink format */ - pad = &subdev->entity.pads[0]; - if (!(pad->flags & MEDIA_PAD_FL_SINK)) -@@ -263,6 +325,10 @@ static int isp_video_validate_pipeline(struct isp_pipeline *pipe) - return -ENOSPC; - } - -+ /* If sink pad is on CCDC, the link has the lane shifter -+ * in the middle of it. */ -+ shifter_link = subdev == &isp->isp_ccdc.subdev; -+ - /* Retrieve the source format */ - pad = media_entity_remote_source(pad); - if (pad == NULL || -@@ -278,10 +344,24 @@ static int isp_video_validate_pipeline(struct isp_pipeline *pipe) - return -EPIPE; - - /* Check if the two ends match */ -- if (fmt_source.format.code != fmt_sink.format.code || -- fmt_source.format.width != fmt_sink.format.width || -+ if (fmt_source.format.width != fmt_sink.format.width || - fmt_source.format.height != fmt_sink.format.height) - return -EPIPE; -+ -+ if (shifter_link) { -+ unsigned int parallel_shift = 0; -+ if (isp->isp_ccdc.input == CCDC_INPUT_PARALLEL) { -+ struct isp_parallel_platform_data *pdata = -+ &((struct isp_v4l2_subdevs_group *) -+ subdev->host_priv)->bus.parallel; -+ parallel_shift = pdata->data_lane_shift * 2; -+ } -+ if (!isp_video_is_shiftable(fmt_source.format.code, -+ fmt_sink.format.code, -+ parallel_shift)) -+ return -EPIPE; -+ } else if (fmt_source.format.code != fmt_sink.format.code) -+ return -EPIPE; - } - - return 0; -diff --git a/drivers/media/video/omap3isp/ispvideo.h b/drivers/media/video/omap3isp/ispvideo.h -index 524a1ac..911bea6 100644 ---- a/drivers/media/video/omap3isp/ispvideo.h -+++ b/drivers/media/video/omap3isp/ispvideo.h -@@ -49,6 +49,8 @@ struct v4l2_pix_format; - * bits. Identical to @code if the format is 10 bits wide or less. - * @uncompressed: V4L2 media bus format code for the corresponding uncompressed - * format. Identical to @code if the format is not DPCM compressed. -+ * @flavor: V4L2 media bus format code for the same pixel layout but -+ * shifted to be 8 bits per pixel. =0 if format is not shiftable. - * @pixelformat: V4L2 pixel format FCC identifier - * @bpp: Bits per pixel - */ -@@ -56,6 +58,7 @@ struct isp_format_info { - enum v4l2_mbus_pixelcode code; - enum v4l2_mbus_pixelcode truncated; - enum v4l2_mbus_pixelcode uncompressed; -+ enum v4l2_mbus_pixelcode flavor; - u32 pixelformat; - unsigned int bpp; - }; -diff --git a/drivers/media/video/s5p-fimc/fimc-capture.c b/drivers/media/video/s5p-fimc/fimc-capture.c -index 95f8b4e1..d142b40 100644 ---- a/drivers/media/video/s5p-fimc/fimc-capture.c -+++ b/drivers/media/video/s5p-fimc/fimc-capture.c -@@ -527,7 +527,7 @@ static int fimc_cap_s_fmt_mplane(struct file *file, void *priv, - if (ret) - return ret; - -- if (vb2_is_streaming(&fimc->vid_cap.vbq) || fimc_capture_active(fimc)) -+ if (vb2_is_busy(&fimc->vid_cap.vbq) || fimc_capture_active(fimc)) - return -EBUSY; - - frame = &ctx->d_frame; -@@ -539,8 +539,10 @@ static int fimc_cap_s_fmt_mplane(struct file *file, void *priv, - return -EINVAL; - } - -- for (i = 0; i < frame->fmt->colplanes; i++) -- frame->payload[i] = pix->plane_fmt[i].bytesperline * pix->height; -+ for (i = 0; i < frame->fmt->colplanes; i++) { -+ frame->payload[i] = -+ (pix->width * pix->height * frame->fmt->depth[i]) >> 3; -+ } - - /* Output DMA frame pixel size and offsets. */ - frame->f_width = pix->plane_fmt[0].bytesperline * 8 -diff --git a/drivers/media/video/s5p-fimc/fimc-core.c b/drivers/media/video/s5p-fimc/fimc-core.c -index 6c919b3..dc91a85 100644 ---- a/drivers/media/video/s5p-fimc/fimc-core.c -+++ b/drivers/media/video/s5p-fimc/fimc-core.c -@@ -361,10 +361,20 @@ static void fimc_capture_irq_handler(struct fimc_dev *fimc) - { - struct fimc_vid_cap *cap = &fimc->vid_cap; - struct fimc_vid_buffer *v_buf; -+ struct timeval *tv; -+ struct timespec ts; - - if (!list_empty(&cap->active_buf_q) && - test_bit(ST_CAPT_RUN, &fimc->state)) { -+ ktime_get_real_ts(&ts); -+ - v_buf = active_queue_pop(cap); -+ -+ tv = &v_buf->vb.v4l2_buf.timestamp; -+ tv->tv_sec = ts.tv_sec; -+ tv->tv_usec = ts.tv_nsec / NSEC_PER_USEC; -+ v_buf->vb.v4l2_buf.sequence = cap->frame_count++; -+ - vb2_buffer_done(&v_buf->vb, VB2_BUF_STATE_DONE); - } - -@@ -758,7 +768,7 @@ static void fimc_unlock(struct vb2_queue *vq) - mutex_unlock(&ctx->fimc_dev->lock); - } - --struct vb2_ops fimc_qops = { -+static struct vb2_ops fimc_qops = { - .queue_setup = fimc_queue_setup, - .buf_prepare = fimc_buf_prepare, - .buf_queue = fimc_buf_queue, -@@ -927,23 +937,23 @@ int fimc_vidioc_try_fmt_mplane(struct file *file, void *priv, - pix->num_planes = fmt->memplanes; - pix->colorspace = V4L2_COLORSPACE_JPEG; - -- for (i = 0; i < pix->num_planes; ++i) { -- int bpl = pix->plane_fmt[i].bytesperline; - -- dbg("[%d] bpl: %d, depth: %d, w: %d, h: %d", -- i, bpl, fmt->depth[i], pix->width, pix->height); -+ for (i = 0; i < pix->num_planes; ++i) { -+ u32 bpl = pix->plane_fmt[i].bytesperline; -+ u32 *sizeimage = &pix->plane_fmt[i].sizeimage; - -- if (!bpl || (bpl * 8 / fmt->depth[i]) > pix->width) -- bpl = (pix->width * fmt->depth[0]) >> 3; -+ if (fmt->colplanes > 1 && (bpl == 0 || bpl < pix->width)) -+ bpl = pix->width; /* Planar */ - -- if (!pix->plane_fmt[i].sizeimage) -- pix->plane_fmt[i].sizeimage = pix->height * bpl; -+ if (fmt->colplanes == 1 && /* Packed */ -+ (bpl == 0 || ((bpl * 8) / fmt->depth[i]) < pix->width)) -+ bpl = (pix->width * fmt->depth[0]) / 8; - -- pix->plane_fmt[i].bytesperline = bpl; -+ if (i == 0) /* Same bytesperline for each plane. */ -+ mod_x = bpl; - -- dbg("[%d]: bpl: %d, sizeimage: %d", -- i, pix->plane_fmt[i].bytesperline, -- pix->plane_fmt[i].sizeimage); -+ pix->plane_fmt[i].bytesperline = mod_x; -+ *sizeimage = (pix->width * pix->height * fmt->depth[i]) / 8; - } - - return 0; -@@ -965,7 +975,7 @@ static int fimc_m2m_s_fmt_mplane(struct file *file, void *priv, - - vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type); - -- if (vb2_is_streaming(vq)) { -+ if (vb2_is_busy(vq)) { - v4l2_err(&fimc->m2m.v4l2_dev, "queue (%d) busy\n", f->type); - return -EBUSY; - } -@@ -985,8 +995,10 @@ static int fimc_m2m_s_fmt_mplane(struct file *file, void *priv, - if (!frame->fmt) - return -EINVAL; - -- for (i = 0; i < frame->fmt->colplanes; i++) -- frame->payload[i] = pix->plane_fmt[i].bytesperline * pix->height; -+ for (i = 0; i < frame->fmt->colplanes; i++) { -+ frame->payload[i] = -+ (pix->width * pix->height * frame->fmt->depth[i]) / 8; -+ } - - frame->f_width = pix->plane_fmt[0].bytesperline * 8 / - frame->fmt->depth[0]; -@@ -1750,7 +1762,7 @@ static int __devexit fimc_remove(struct platform_device *pdev) - } - - /* Image pixel limits, similar across several FIMC HW revisions. */ --static struct fimc_pix_limit s5p_pix_limit[3] = { -+static struct fimc_pix_limit s5p_pix_limit[4] = { - [0] = { - .scaler_en_w = 3264, - .scaler_dis_w = 8192, -@@ -1775,6 +1787,14 @@ static struct fimc_pix_limit s5p_pix_limit[3] = { - .out_rot_en_w = 1280, - .out_rot_dis_w = 1920, - }, -+ [3] = { -+ .scaler_en_w = 1920, -+ .scaler_dis_w = 8192, -+ .in_rot_en_h = 1366, -+ .in_rot_dis_w = 8192, -+ .out_rot_en_w = 1366, -+ .out_rot_dis_w = 1920, -+ }, - }; - - static struct samsung_fimc_variant fimc0_variant_s5p = { -@@ -1827,7 +1847,7 @@ static struct samsung_fimc_variant fimc2_variant_s5pv210 = { - .pix_limit = &s5p_pix_limit[2], - }; - --static struct samsung_fimc_variant fimc0_variant_s5pv310 = { -+static struct samsung_fimc_variant fimc0_variant_exynos4 = { - .pix_hoff = 1, - .has_inp_rot = 1, - .has_out_rot = 1, -@@ -1840,7 +1860,7 @@ static struct samsung_fimc_variant fimc0_variant_s5pv310 = { - .pix_limit = &s5p_pix_limit[1], - }; - --static struct samsung_fimc_variant fimc2_variant_s5pv310 = { -+static struct samsung_fimc_variant fimc2_variant_exynos4 = { - .pix_hoff = 1, - .has_cistatus2 = 1, - .has_mainscaler_ext = 1, -@@ -1848,7 +1868,7 @@ static struct samsung_fimc_variant fimc2_variant_s5pv310 = { - .min_out_pixsize = 16, - .hor_offs_align = 1, - .out_buf_count = 32, -- .pix_limit = &s5p_pix_limit[2], -+ .pix_limit = &s5p_pix_limit[3], - }; - - /* S5PC100 */ -@@ -1874,12 +1894,12 @@ static struct samsung_fimc_driverdata fimc_drvdata_s5pv210 = { - }; - - /* S5PV310, S5PC210 */ --static struct samsung_fimc_driverdata fimc_drvdata_s5pv310 = { -+static struct samsung_fimc_driverdata fimc_drvdata_exynos4 = { - .variant = { -- [0] = &fimc0_variant_s5pv310, -- [1] = &fimc0_variant_s5pv310, -- [2] = &fimc0_variant_s5pv310, -- [3] = &fimc2_variant_s5pv310, -+ [0] = &fimc0_variant_exynos4, -+ [1] = &fimc0_variant_exynos4, -+ [2] = &fimc0_variant_exynos4, -+ [3] = &fimc2_variant_exynos4, - }, - .num_entities = 4, - .lclk_frequency = 166000000UL, -@@ -1893,8 +1913,8 @@ static struct platform_device_id fimc_driver_ids[] = { - .name = "s5pv210-fimc", - .driver_data = (unsigned long)&fimc_drvdata_s5pv210, - }, { -- .name = "s5pv310-fimc", -- .driver_data = (unsigned long)&fimc_drvdata_s5pv310, -+ .name = "exynos4-fimc", -+ .driver_data = (unsigned long)&fimc_drvdata_exynos4, - }, - {}, - }; -diff --git a/drivers/media/video/sh_mobile_ceu_camera.c b/drivers/media/video/sh_mobile_ceu_camera.c -index 3fe54bf..134e86b 100644 ---- a/drivers/media/video/sh_mobile_ceu_camera.c -+++ b/drivers/media/video/sh_mobile_ceu_camera.c -@@ -922,7 +922,7 @@ static int sh_mobile_ceu_get_formats(struct soc_camera_device *icd, unsigned int - /* Try 2560x1920, 1280x960, 640x480, 320x240 */ - mf.width = 2560 >> shift; - mf.height = 1920 >> shift; -- ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, -+ ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, - s_mbus_fmt, &mf); - if (ret < 0) - return ret; -@@ -1224,7 +1224,7 @@ static int client_s_fmt(struct soc_camera_device *icd, - struct v4l2_cropcap cap; - int ret; - -- ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, -+ ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, - s_mbus_fmt, mf); - if (ret < 0) - return ret; -@@ -1254,7 +1254,7 @@ static int client_s_fmt(struct soc_camera_device *icd, - tmp_h = min(2 * tmp_h, max_height); - mf->width = tmp_w; - mf->height = tmp_h; -- ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, -+ ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, - s_mbus_fmt, mf); - dev_geo(dev, "Camera scaled to %ux%u\n", - mf->width, mf->height); -@@ -1658,7 +1658,7 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd, - mf.code = xlate->code; - mf.colorspace = pix->colorspace; - -- ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, try_mbus_fmt, &mf); -+ ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, try_mbus_fmt, &mf); - if (ret < 0) - return ret; - -@@ -1682,7 +1682,7 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd, - */ - mf.width = 2560; - mf.height = 1920; -- ret = v4l2_device_call_until_err(sd->v4l2_dev, 0, video, -+ ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, - try_mbus_fmt, &mf); - if (ret < 0) { - /* Shouldn't actually happen... */ -diff --git a/drivers/media/video/sh_mobile_csi2.c b/drivers/media/video/sh_mobile_csi2.c -index dd1b81b..98b8748 100644 ---- a/drivers/media/video/sh_mobile_csi2.c -+++ b/drivers/media/video/sh_mobile_csi2.c -@@ -38,6 +38,8 @@ struct sh_csi2 { - void __iomem *base; - struct platform_device *pdev; - struct sh_csi2_client_config *client; -+ unsigned long (*query_bus_param)(struct soc_camera_device *); -+ int (*set_bus_param)(struct soc_camera_device *, unsigned long); - }; - - static int sh_csi2_try_fmt(struct v4l2_subdev *sd, -@@ -208,6 +210,7 @@ static int sh_csi2_notify(struct notifier_block *nb, - case BUS_NOTIFY_BOUND_DRIVER: - snprintf(priv->subdev.name, V4L2_SUBDEV_NAME_SIZE, "%s%s", - dev_name(v4l2_dev->dev), ".mipi-csi"); -+ priv->subdev.grp_id = (long)icd; - ret = v4l2_device_register_subdev(v4l2_dev, &priv->subdev); - dev_dbg(dev, "%s(%p): ret(register_subdev) = %d\n", __func__, priv, ret); - if (ret < 0) -@@ -215,6 +218,8 @@ static int sh_csi2_notify(struct notifier_block *nb, - - priv->client = pdata->clients + i; - -+ priv->set_bus_param = icd->ops->set_bus_param; -+ priv->query_bus_param = icd->ops->query_bus_param; - icd->ops->set_bus_param = sh_csi2_set_bus_param; - icd->ops->query_bus_param = sh_csi2_query_bus_param; - -@@ -226,8 +231,10 @@ static int sh_csi2_notify(struct notifier_block *nb, - priv->client = NULL; - - /* Driver is about to be unbound */ -- icd->ops->set_bus_param = NULL; -- icd->ops->query_bus_param = NULL; -+ icd->ops->set_bus_param = priv->set_bus_param; -+ icd->ops->query_bus_param = priv->query_bus_param; -+ priv->set_bus_param = NULL; -+ priv->query_bus_param = NULL; - - v4l2_device_unregister_subdev(&priv->subdev); - -diff --git a/drivers/media/video/soc_camera.c b/drivers/media/video/soc_camera.c -index 4628448..3973f9a 100644 ---- a/drivers/media/video/soc_camera.c -+++ b/drivers/media/video/soc_camera.c -@@ -996,10 +996,11 @@ static void soc_camera_free_i2c(struct soc_camera_device *icd) - { - struct i2c_client *client = - to_i2c_client(to_soc_camera_control(icd)); -+ struct i2c_adapter *adap = client->adapter; - dev_set_drvdata(&icd->dev, NULL); - v4l2_device_unregister_subdev(i2c_get_clientdata(client)); - i2c_unregister_device(client); -- i2c_put_adapter(client->adapter); -+ i2c_put_adapter(adap); - } - #else - #define soc_camera_init_i2c(icd, icl) (-ENODEV) -@@ -1071,6 +1072,9 @@ static int soc_camera_probe(struct device *dev) - } - } - -+ sd = soc_camera_to_subdev(icd); -+ sd->grp_id = (long)icd; -+ - /* At this point client .probe() should have run already */ - ret = soc_camera_init_user_formats(icd); - if (ret < 0) -@@ -1092,7 +1096,6 @@ static int soc_camera_probe(struct device *dev) - goto evidstart; - - /* Try to improve our guess of a reasonable window format */ -- sd = soc_camera_to_subdev(icd); - if (!v4l2_subdev_call(sd, video, g_mbus_fmt, &mf)) { - icd->user_width = mf.width; - icd->user_height = mf.height; -diff --git a/drivers/media/video/v4l2-dev.c b/drivers/media/video/v4l2-dev.c -index 498e674..6dc7196 100644 ---- a/drivers/media/video/v4l2-dev.c -+++ b/drivers/media/video/v4l2-dev.c -@@ -389,7 +389,8 @@ static int v4l2_open(struct inode *inode, struct file *filp) - video_get(vdev); - mutex_unlock(&videodev_lock); - #if defined(CONFIG_MEDIA_CONTROLLER) -- if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) { -+ if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && -+ vdev->vfl_type != VFL_TYPE_SUBDEV) { - entity = media_entity_get(&vdev->entity); - if (!entity) { - ret = -EBUSY; -@@ -415,7 +416,8 @@ err: - /* decrease the refcount in case of an error */ - if (ret) { - #if defined(CONFIG_MEDIA_CONTROLLER) -- if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) -+ if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && -+ vdev->vfl_type != VFL_TYPE_SUBDEV) - media_entity_put(entity); - #endif - video_put(vdev); -@@ -437,7 +439,8 @@ static int v4l2_release(struct inode *inode, struct file *filp) - mutex_unlock(vdev->lock); - } - #if defined(CONFIG_MEDIA_CONTROLLER) -- if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) -+ if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && -+ vdev->vfl_type != VFL_TYPE_SUBDEV) - media_entity_put(&vdev->entity); - #endif - /* decrease the refcount unconditionally since the release() -@@ -686,7 +689,8 @@ int __video_register_device(struct video_device *vdev, int type, int nr, - - #if defined(CONFIG_MEDIA_CONTROLLER) - /* Part 5: Register the entity. */ -- if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) { -+ if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && -+ vdev->vfl_type != VFL_TYPE_SUBDEV) { - vdev->entity.type = MEDIA_ENT_T_DEVNODE_V4L; - vdev->entity.name = vdev->name; - vdev->entity.v4l.major = VIDEO_MAJOR; -@@ -733,7 +737,8 @@ void video_unregister_device(struct video_device *vdev) - return; - - #if defined(CONFIG_MEDIA_CONTROLLER) -- if (vdev->v4l2_dev && vdev->v4l2_dev->mdev) -+ if (vdev->v4l2_dev && vdev->v4l2_dev->mdev && -+ vdev->vfl_type != VFL_TYPE_SUBDEV) - media_device_unregister_entity(&vdev->entity); - #endif - -diff --git a/drivers/media/video/videobuf2-core.c b/drivers/media/video/videobuf2-core.c -index 6698c77..6ba1461 100644 ---- a/drivers/media/video/videobuf2-core.c -+++ b/drivers/media/video/videobuf2-core.c -@@ -37,6 +37,9 @@ module_param(debug, int, 0644); - #define call_qop(q, op, args...) \ - (((q)->ops->op) ? ((q)->ops->op(args)) : 0) - -+#define V4L2_BUFFER_STATE_FLAGS (V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_QUEUED | \ -+ V4L2_BUF_FLAG_DONE | V4L2_BUF_FLAG_ERROR) -+ - /** - * __vb2_buf_mem_alloc() - allocate video memory for the given buffer - */ -@@ -51,7 +54,7 @@ static int __vb2_buf_mem_alloc(struct vb2_buffer *vb, - for (plane = 0; plane < vb->num_planes; ++plane) { - mem_priv = call_memop(q, plane, alloc, q->alloc_ctx[plane], - plane_sizes[plane]); -- if (!mem_priv) -+ if (IS_ERR_OR_NULL(mem_priv)) - goto free; - - /* Associate allocator private data with this plane */ -@@ -284,7 +287,7 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b) - struct vb2_queue *q = vb->vb2_queue; - int ret = 0; - -- /* Copy back data such as timestamp, input, etc. */ -+ /* Copy back data such as timestamp, flags, input, etc. */ - memcpy(b, &vb->v4l2_buf, offsetof(struct v4l2_buffer, m)); - b->input = vb->v4l2_buf.input; - b->reserved = vb->v4l2_buf.reserved; -@@ -313,7 +316,10 @@ static int __fill_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b) - b->m.userptr = vb->v4l2_planes[0].m.userptr; - } - -- b->flags = 0; -+ /* -+ * Clear any buffer state related flags. -+ */ -+ b->flags &= ~V4L2_BUFFER_STATE_FLAGS; - - switch (vb->state) { - case VB2_BUF_STATE_QUEUED: -@@ -519,6 +525,7 @@ int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req) - num_buffers = min_t(unsigned int, req->count, VIDEO_MAX_FRAME); - memset(plane_sizes, 0, sizeof(plane_sizes)); - memset(q->alloc_ctx, 0, sizeof(q->alloc_ctx)); -+ q->memory = req->memory; - - /* - * Ask the driver how many buffers and planes per buffer it requires. -@@ -560,8 +567,6 @@ int vb2_reqbufs(struct vb2_queue *q, struct v4l2_requestbuffers *req) - ret = num_buffers; - } - -- q->memory = req->memory; -- - /* - * Return the number of successfully allocated buffers - * to the userspace. -@@ -715,6 +720,8 @@ static int __fill_vb2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b, - - vb->v4l2_buf.field = b->field; - vb->v4l2_buf.timestamp = b->timestamp; -+ vb->v4l2_buf.input = b->input; -+ vb->v4l2_buf.flags = b->flags & ~V4L2_BUFFER_STATE_FLAGS; - - return 0; - } -diff --git a/drivers/media/video/videobuf2-dma-contig.c b/drivers/media/video/videobuf2-dma-contig.c -index 58205d5..a790a5f 100644 ---- a/drivers/media/video/videobuf2-dma-contig.c -+++ b/drivers/media/video/videobuf2-dma-contig.c -@@ -46,7 +46,7 @@ static void *vb2_dma_contig_alloc(void *alloc_ctx, unsigned long size) - GFP_KERNEL); - if (!buf->vaddr) { - dev_err(conf->dev, "dma_alloc_coherent of size %ld failed\n", -- buf->size); -+ size); - kfree(buf); - return ERR_PTR(-ENOMEM); - } -diff --git a/drivers/mtd/nand/diskonchip.c b/drivers/mtd/nand/diskonchip.c -index 96c0b34..657b9f4 100644 ---- a/drivers/mtd/nand/diskonchip.c -+++ b/drivers/mtd/nand/diskonchip.c -@@ -400,7 +400,7 @@ static uint16_t __init doc200x_ident_chip(struct mtd_info *mtd, int nr) - doc200x_hwcontrol(mtd, 0, NAND_CTRL_ALE | NAND_CTRL_CHANGE); - doc200x_hwcontrol(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE); - -- /* We can't' use dev_ready here, but at least we wait for the -+ /* We can't use dev_ready here, but at least we wait for the - * command to complete - */ - udelay(50); -diff --git a/drivers/net/amd8111e.c b/drivers/net/amd8111e.c -index 88495c4..241b185 100644 ---- a/drivers/net/amd8111e.c -+++ b/drivers/net/amd8111e.c -@@ -106,7 +106,7 @@ MODULE_DESCRIPTION ("AMD8111 based 10/100 Ethernet Controller. Driver Version "M - MODULE_LICENSE("GPL"); - MODULE_DEVICE_TABLE(pci, amd8111e_pci_tbl); - module_param_array(speed_duplex, int, NULL, 0); --MODULE_PARM_DESC(speed_duplex, "Set device speed and duplex modes, 0: Auto Negotitate, 1: 10Mbps Half Duplex, 2: 10Mbps Full Duplex, 3: 100Mbps Half Duplex, 4: 100Mbps Full Duplex"); -+MODULE_PARM_DESC(speed_duplex, "Set device speed and duplex modes, 0: Auto Negotiate, 1: 10Mbps Half Duplex, 2: 10Mbps Full Duplex, 3: 100Mbps Half Duplex, 4: 100Mbps Full Duplex"); - module_param_array(coalesce, bool, NULL, 0); - MODULE_PARM_DESC(coalesce, "Enable or Disable interrupt coalescing, 1: Enable, 0: Disable"); - module_param_array(dynamic_ipg, bool, NULL, 0); -diff --git a/drivers/net/atl1c/atl1c.h b/drivers/net/atl1c/atl1c.h -index 7cb375e..925929d 100644 ---- a/drivers/net/atl1c/atl1c.h -+++ b/drivers/net/atl1c/atl1c.h -@@ -566,9 +566,9 @@ struct atl1c_adapter { - #define __AT_TESTING 0x0001 - #define __AT_RESETTING 0x0002 - #define __AT_DOWN 0x0003 -- u8 work_event; --#define ATL1C_WORK_EVENT_RESET 0x01 --#define ATL1C_WORK_EVENT_LINK_CHANGE 0x02 -+ unsigned long work_event; -+#define ATL1C_WORK_EVENT_RESET 0 -+#define ATL1C_WORK_EVENT_LINK_CHANGE 1 - u32 msg_enable; - - bool have_msi; -diff --git a/drivers/net/atl1c/atl1c_main.c b/drivers/net/atl1c/atl1c_main.c -index 7d9d506..a6e1c36 100644 ---- a/drivers/net/atl1c/atl1c_main.c -+++ b/drivers/net/atl1c/atl1c_main.c -@@ -325,7 +325,7 @@ static void atl1c_link_chg_event(struct atl1c_adapter *adapter) - } - } - -- adapter->work_event |= ATL1C_WORK_EVENT_LINK_CHANGE; -+ set_bit(ATL1C_WORK_EVENT_LINK_CHANGE, &adapter->work_event); - schedule_work(&adapter->common_task); - } - -@@ -337,20 +337,16 @@ static void atl1c_common_task(struct work_struct *work) - adapter = container_of(work, struct atl1c_adapter, common_task); - netdev = adapter->netdev; - -- if (adapter->work_event & ATL1C_WORK_EVENT_RESET) { -- adapter->work_event &= ~ATL1C_WORK_EVENT_RESET; -+ if (test_and_clear_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event)) { - netif_device_detach(netdev); - atl1c_down(adapter); - atl1c_up(adapter); - netif_device_attach(netdev); -- return; - } - -- if (adapter->work_event & ATL1C_WORK_EVENT_LINK_CHANGE) { -- adapter->work_event &= ~ATL1C_WORK_EVENT_LINK_CHANGE; -+ if (test_and_clear_bit(ATL1C_WORK_EVENT_LINK_CHANGE, -+ &adapter->work_event)) - atl1c_check_link_status(adapter); -- } -- return; - } - - -@@ -369,7 +365,7 @@ static void atl1c_tx_timeout(struct net_device *netdev) - struct atl1c_adapter *adapter = netdev_priv(netdev); - - /* Do the reset outside of interrupt context */ -- adapter->work_event |= ATL1C_WORK_EVENT_RESET; -+ set_bit(ATL1C_WORK_EVENT_RESET, &adapter->work_event); - schedule_work(&adapter->common_task); - } - -diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c -index 7cb5a11..02a0443 100644 ---- a/drivers/net/benet/be_main.c -+++ b/drivers/net/benet/be_main.c -@@ -1873,6 +1873,7 @@ static void be_worker(struct work_struct *work) - be_detect_dump_ue(adapter); - - reschedule: -+ adapter->work_counter++; - schedule_delayed_work(&adapter->work, msecs_to_jiffies(1000)); - } - -diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c -index 8e6d618..d8383a9 100644 ---- a/drivers/net/bnx2.c -+++ b/drivers/net/bnx2.c -@@ -8413,6 +8413,8 @@ bnx2_remove_one(struct pci_dev *pdev) - - unregister_netdev(dev); - -+ del_timer_sync(&bp->timer); -+ - if (bp->mips_firmware) - release_firmware(bp->mips_firmware); - if (bp->rv2p_firmware) -diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c -index e83ac6d..16581df 100644 ---- a/drivers/net/bnx2x/bnx2x_cmn.c -+++ b/drivers/net/bnx2x/bnx2x_cmn.c -@@ -2019,15 +2019,23 @@ static inline void bnx2x_set_pbd_gso(struct sk_buff *skb, - static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb, - u32 *parsing_data, u32 xmit_type) - { -- *parsing_data |= ((tcp_hdrlen(skb)/4) << -- ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) & -- ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW; -+ *parsing_data |= -+ ((((u8 *)skb_transport_header(skb) - skb->data) >> 1) << -+ ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) & -+ ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W; - -- *parsing_data |= ((((u8 *)tcp_hdr(skb) - skb->data) / 2) << -- ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) & -- ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W; -+ if (xmit_type & XMIT_CSUM_TCP) { -+ *parsing_data |= ((tcp_hdrlen(skb) / 4) << -+ ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) & -+ ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW; - -- return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data; -+ return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data; -+ } else -+ /* We support checksum offload for TCP and UDP only. -+ * No need to pass the UDP header length - it's a constant. -+ */ -+ return skb_transport_header(skb) + -+ sizeof(struct udphdr) - skb->data; - } - - /** -@@ -2043,7 +2051,7 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb, - struct eth_tx_parse_bd_e1x *pbd, - u32 xmit_type) - { -- u8 hlen = (skb_network_header(skb) - skb->data) / 2; -+ u8 hlen = (skb_network_header(skb) - skb->data) >> 1; - - /* for now NS flag is not used in Linux */ - pbd->global_data = -@@ -2051,9 +2059,15 @@ static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb, - ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT)); - - pbd->ip_hlen_w = (skb_transport_header(skb) - -- skb_network_header(skb)) / 2; -+ skb_network_header(skb)) >> 1; - -- hlen += pbd->ip_hlen_w + tcp_hdrlen(skb) / 2; -+ hlen += pbd->ip_hlen_w; -+ -+ /* We support checksum offload for TCP and UDP only */ -+ if (xmit_type & XMIT_CSUM_TCP) -+ hlen += tcp_hdrlen(skb) / 2; -+ else -+ hlen += sizeof(struct udphdr) / 2; - - pbd->total_hlen_w = cpu_to_le16(hlen); - hlen = hlen*2; -diff --git a/drivers/net/bonding/bond_3ad.c b/drivers/net/bonding/bond_3ad.c -index 494bf96..31912f1 100644 ---- a/drivers/net/bonding/bond_3ad.c -+++ b/drivers/net/bonding/bond_3ad.c -@@ -1482,8 +1482,11 @@ static struct aggregator *ad_agg_selection_test(struct aggregator *best, - - static int agg_device_up(const struct aggregator *agg) - { -- return (netif_running(agg->slave->dev) && -- netif_carrier_ok(agg->slave->dev)); -+ struct port *port = agg->lag_ports; -+ if (!port) -+ return 0; -+ return (netif_running(port->slave->dev) && -+ netif_carrier_ok(port->slave->dev)); - } - - /** -diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c -index f75d314..53c0f04 100644 ---- a/drivers/net/ehea/ehea_main.c -+++ b/drivers/net/ehea/ehea_main.c -@@ -3040,11 +3040,14 @@ static void ehea_rereg_mrs(void) - - if (dev->flags & IFF_UP) { - mutex_lock(&port->port_lock); -- port_napi_enable(port); - ret = ehea_restart_qps(dev); -- check_sqs(port); -- if (!ret) -+ if (!ret) { -+ check_sqs(port); -+ port_napi_enable(port); - netif_wake_queue(dev); -+ } else { -+ netdev_err(dev, "Unable to restart QPS\n"); -+ } - mutex_unlock(&port->port_lock); - } - } -diff --git a/drivers/net/fs_enet/mac-fec.c b/drivers/net/fs_enet/mac-fec.c -index 61035fc..b9fbc83 100644 ---- a/drivers/net/fs_enet/mac-fec.c -+++ b/drivers/net/fs_enet/mac-fec.c -@@ -226,8 +226,8 @@ static void set_multicast_finish(struct net_device *dev) - } - - FC(fecp, r_cntrl, FEC_RCNTRL_PROM); -- FW(fecp, hash_table_high, fep->fec.hthi); -- FW(fecp, hash_table_low, fep->fec.htlo); -+ FW(fecp, grp_hash_table_high, fep->fec.hthi); -+ FW(fecp, grp_hash_table_low, fep->fec.htlo); - } - - static void set_multicast_list(struct net_device *dev) -@@ -273,8 +273,8 @@ static void restart(struct net_device *dev) - /* - * Reset all multicast. - */ -- FW(fecp, hash_table_high, fep->fec.hthi); -- FW(fecp, hash_table_low, fep->fec.htlo); -+ FW(fecp, grp_hash_table_high, fep->fec.hthi); -+ FW(fecp, grp_hash_table_low, fep->fec.htlo); - - /* - * Set maximum receive buffer size. -diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c -index a316619..9bd7746 100644 ---- a/drivers/net/ftmac100.c -+++ b/drivers/net/ftmac100.c -@@ -139,11 +139,11 @@ static int ftmac100_reset(struct ftmac100 *priv) - * that hardware reset completed (what the f*ck). - * We still need to wait for a while. - */ -- usleep_range(500, 1000); -+ udelay(500); - return 0; - } - -- usleep_range(1000, 10000); -+ udelay(1000); - } - - netdev_err(netdev, "software reset failed\n"); -@@ -772,7 +772,7 @@ static int ftmac100_mdio_read(struct net_device *netdev, int phy_id, int reg) - if ((phycr & FTMAC100_PHYCR_MIIRD) == 0) - return phycr & FTMAC100_PHYCR_MIIRDATA; - -- usleep_range(100, 1000); -+ udelay(100); - } - - netdev_err(netdev, "mdio read timed out\n"); -@@ -801,7 +801,7 @@ static void ftmac100_mdio_write(struct net_device *netdev, int phy_id, int reg, - if ((phycr & FTMAC100_PHYCR_MIIWR) == 0) - return; - -- usleep_range(100, 1000); -+ udelay(100); - } - - netdev_err(netdev, "mdio write timed out\n"); -diff --git a/drivers/net/mii.c b/drivers/net/mii.c -index 0a6c6a2..d4fc00b 100644 ---- a/drivers/net/mii.c -+++ b/drivers/net/mii.c -@@ -49,6 +49,10 @@ static u32 mii_get_an(struct mii_if_info *mii, u16 addr) - result |= ADVERTISED_100baseT_Half; - if (advert & ADVERTISE_100FULL) - result |= ADVERTISED_100baseT_Full; -+ if (advert & ADVERTISE_PAUSE_CAP) -+ result |= ADVERTISED_Pause; -+ if (advert & ADVERTISE_PAUSE_ASYM) -+ result |= ADVERTISED_Asym_Pause; - - return result; - } -diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c -index dfb67eb..eb41e44 100644 ---- a/drivers/net/netconsole.c -+++ b/drivers/net/netconsole.c -@@ -671,6 +671,7 @@ static int netconsole_netdev_event(struct notifier_block *this, - goto done; - - spin_lock_irqsave(&target_list_lock, flags); -+restart: - list_for_each_entry(nt, &target_list, list) { - netconsole_target_get(nt); - if (nt->np.dev == dev) { -@@ -683,9 +684,16 @@ static int netconsole_netdev_event(struct notifier_block *this, - * rtnl_lock already held - */ - if (nt->np.dev) { -+ spin_unlock_irqrestore( -+ &target_list_lock, -+ flags); - __netpoll_cleanup(&nt->np); -+ spin_lock_irqsave(&target_list_lock, -+ flags); - dev_put(nt->np.dev); - nt->np.dev = NULL; -+ netconsole_target_put(nt); -+ goto restart; - } - /* Fall through */ - case NETDEV_GOING_DOWN: -diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c -index 493b0de..397c368 100644 ---- a/drivers/net/r8169.c -+++ b/drivers/net/r8169.c -@@ -170,6 +170,16 @@ static const struct { - }; - #undef _R - -+static const struct rtl_firmware_info { -+ int mac_version; -+ const char *fw_name; -+} rtl_firmware_infos[] = { -+ { .mac_version = RTL_GIGA_MAC_VER_25, .fw_name = FIRMWARE_8168D_1 }, -+ { .mac_version = RTL_GIGA_MAC_VER_26, .fw_name = FIRMWARE_8168D_2 }, -+ { .mac_version = RTL_GIGA_MAC_VER_29, .fw_name = FIRMWARE_8105E_1 }, -+ { .mac_version = RTL_GIGA_MAC_VER_30, .fw_name = FIRMWARE_8105E_1 } -+}; -+ - enum cfg_version { - RTL_CFG_0 = 0x00, - RTL_CFG_1, -@@ -565,6 +575,7 @@ struct rtl8169_private { - u32 saved_wolopts; - - const struct firmware *fw; -+#define RTL_FIRMWARE_UNKNOWN ERR_PTR(-EAGAIN); - }; - - MODULE_AUTHOR("Realtek and the Linux r8169 crew "); -@@ -1789,25 +1800,26 @@ rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw) - - static void rtl_release_firmware(struct rtl8169_private *tp) - { -- release_firmware(tp->fw); -- tp->fw = NULL; -+ if (!IS_ERR_OR_NULL(tp->fw)) -+ release_firmware(tp->fw); -+ tp->fw = RTL_FIRMWARE_UNKNOWN; - } - --static int rtl_apply_firmware(struct rtl8169_private *tp, const char *fw_name) -+static void rtl_apply_firmware(struct rtl8169_private *tp) - { -- const struct firmware **fw = &tp->fw; -- int rc = !*fw; -- -- if (rc) { -- rc = request_firmware(fw, fw_name, &tp->pci_dev->dev); -- if (rc < 0) -- goto out; -- } -+ const struct firmware *fw = tp->fw; - - /* TODO: release firmware once rtl_phy_write_fw signals failures. */ -- rtl_phy_write_fw(tp, *fw); --out: -- return rc; -+ if (!IS_ERR_OR_NULL(fw)) -+ rtl_phy_write_fw(tp, fw); -+} -+ -+static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val) -+{ -+ if (rtl_readphy(tp, reg) != val) -+ netif_warn(tp, hw, tp->dev, "chipset not ready for firmware\n"); -+ else -+ rtl_apply_firmware(tp); - } - - static void rtl8169s_hw_phy_config(struct rtl8169_private *tp) -@@ -2246,10 +2258,8 @@ static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp) - - rtl_writephy(tp, 0x1f, 0x0005); - rtl_writephy(tp, 0x05, 0x001b); -- if ((rtl_readphy(tp, 0x06) != 0xbf00) || -- (rtl_apply_firmware(tp, FIRMWARE_8168D_1) < 0)) { -- netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); -- } -+ -+ rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xbf00); - - rtl_writephy(tp, 0x1f, 0x0000); - } -@@ -2351,10 +2361,8 @@ static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp) - - rtl_writephy(tp, 0x1f, 0x0005); - rtl_writephy(tp, 0x05, 0x001b); -- if ((rtl_readphy(tp, 0x06) != 0xb300) || -- (rtl_apply_firmware(tp, FIRMWARE_8168D_2) < 0)) { -- netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); -- } -+ -+ rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xb300); - - rtl_writephy(tp, 0x1f, 0x0000); - } -@@ -2474,8 +2482,7 @@ static void rtl8105e_hw_phy_config(struct rtl8169_private *tp) - rtl_writephy(tp, 0x18, 0x0310); - msleep(100); - -- if (rtl_apply_firmware(tp, FIRMWARE_8105E_1) < 0) -- netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); -+ rtl_apply_firmware(tp); - - rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); - } -@@ -3237,6 +3244,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) - tp->timer.data = (unsigned long) dev; - tp->timer.function = rtl8169_phy_timer; - -+ tp->fw = RTL_FIRMWARE_UNKNOWN; -+ - rc = register_netdev(dev); - if (rc < 0) - goto err_out_msi_4; -@@ -3288,10 +3297,10 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev) - - cancel_delayed_work_sync(&tp->task); - -- rtl_release_firmware(tp); -- - unregister_netdev(dev); - -+ rtl_release_firmware(tp); -+ - if (pci_dev_run_wake(pdev)) - pm_runtime_get_noresume(&pdev->dev); - -@@ -3303,6 +3312,37 @@ static void __devexit rtl8169_remove_one(struct pci_dev *pdev) - pci_set_drvdata(pdev, NULL); - } - -+static void rtl_request_firmware(struct rtl8169_private *tp) -+{ -+ int i; -+ -+ /* Return early if the firmware is already loaded / cached. */ -+ if (!IS_ERR(tp->fw)) -+ goto out; -+ -+ for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) { -+ const struct rtl_firmware_info *info = rtl_firmware_infos + i; -+ -+ if (info->mac_version == tp->mac_version) { -+ const char *name = info->fw_name; -+ int rc; -+ -+ rc = request_firmware(&tp->fw, name, &tp->pci_dev->dev); -+ if (rc < 0) { -+ netif_warn(tp, ifup, tp->dev, "unable to load " -+ "firmware patch %s (%d)\n", name, rc); -+ goto out_disable_request_firmware; -+ } -+ goto out; -+ } -+ } -+ -+out_disable_request_firmware: -+ tp->fw = NULL; -+out: -+ return; -+} -+ - static int rtl8169_open(struct net_device *dev) - { - struct rtl8169_private *tp = netdev_priv(dev); -@@ -3334,11 +3374,13 @@ static int rtl8169_open(struct net_device *dev) - - smp_mb(); - -+ rtl_request_firmware(tp); -+ - retval = request_irq(dev->irq, rtl8169_interrupt, - (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED, - dev->name, dev); - if (retval < 0) -- goto err_release_ring_2; -+ goto err_release_fw_2; - - napi_enable(&tp->napi); - -@@ -3359,7 +3401,8 @@ static int rtl8169_open(struct net_device *dev) - out: - return retval; - --err_release_ring_2: -+err_release_fw_2: -+ rtl_release_firmware(tp); - rtl8169_rx_clear(tp); - err_free_rx_1: - dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, -diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c -index b8c5f35..7a5daef 100644 ---- a/drivers/net/tg3.c -+++ b/drivers/net/tg3.c -@@ -12327,8 +12327,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) - if (val & VCPU_CFGSHDW_ASPM_DBNC) - tp->tg3_flags |= TG3_FLAG_ASPM_WORKAROUND; - if ((val & VCPU_CFGSHDW_WOL_ENABLE) && -- (val & VCPU_CFGSHDW_WOL_MAGPKT)) -+ (val & VCPU_CFGSHDW_WOL_MAGPKT)) { - tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; -+ device_set_wakeup_enable(&tp->pdev->dev, true); -+ } - goto done; - } - -@@ -12461,8 +12463,10 @@ static void __devinit tg3_get_eeprom_hw_cfg(struct tg3 *tp) - tp->tg3_flags &= ~TG3_FLAG_WOL_CAP; - - if ((tp->tg3_flags & TG3_FLAG_WOL_CAP) && -- (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) -+ (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) { - tp->tg3_flags |= TG3_FLAG_WOL_ENABLE; -+ device_set_wakeup_enable(&tp->pdev->dev, true); -+ } - - if (cfg2 & (1 << 17)) - tp->phy_flags |= TG3_PHYFLG_CAPACITIVE_COUPLING; -diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c -index 341f705..a301479 100644 ---- a/drivers/net/usb/cdc_ether.c -+++ b/drivers/net/usb/cdc_ether.c -@@ -460,7 +460,7 @@ static const struct driver_info cdc_info = { - .manage_power = cdc_manage_power, - }; - --static const struct driver_info mbm_info = { -+static const struct driver_info wwan_info = { - .description = "Mobile Broadband Network Device", - .flags = FLAG_WWAN, - .bind = usbnet_cdc_bind, -@@ -471,6 +471,7 @@ static const struct driver_info mbm_info = { - - /*-------------------------------------------------------------------------*/ - -+#define HUAWEI_VENDOR_ID 0x12D1 - - static const struct usb_device_id products [] = { - /* -@@ -587,8 +588,17 @@ static const struct usb_device_id products [] = { - }, { - USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM, - USB_CDC_PROTO_NONE), -- .driver_info = (unsigned long)&mbm_info, -+ .driver_info = (unsigned long)&wwan_info, - -+}, { -+ /* Various Huawei modems with a network port like the UMG1831 */ -+ .match_flags = USB_DEVICE_ID_MATCH_VENDOR -+ | USB_DEVICE_ID_MATCH_INT_INFO, -+ .idVendor = HUAWEI_VENDOR_ID, -+ .bInterfaceClass = USB_CLASS_COMM, -+ .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, -+ .bInterfaceProtocol = 255, -+ .driver_info = (unsigned long)&wwan_info, - }, - { }, // END - }; -diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c -index 967371f..1033ef6 100644 ---- a/drivers/net/usb/cdc_ncm.c -+++ b/drivers/net/usb/cdc_ncm.c -@@ -54,13 +54,13 @@ - #include - #include - --#define DRIVER_VERSION "7-Feb-2011" -+#define DRIVER_VERSION "23-Apr-2011" - - /* CDC NCM subclass 3.2.1 */ - #define USB_CDC_NCM_NDP16_LENGTH_MIN 0x10 - - /* Maximum NTB length */ --#define CDC_NCM_NTB_MAX_SIZE_TX 16384 /* bytes */ -+#define CDC_NCM_NTB_MAX_SIZE_TX (16384 + 4) /* bytes, must be short terminated */ - #define CDC_NCM_NTB_MAX_SIZE_RX 16384 /* bytes */ - - /* Minimum value for MaxDatagramSize, ch. 6.2.9 */ -diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c -index 47a6c87..48d4efd 100644 ---- a/drivers/net/usb/smsc95xx.c -+++ b/drivers/net/usb/smsc95xx.c -@@ -730,7 +730,7 @@ static int smsc95xx_phy_initialize(struct usbnet *dev) - msleep(10); - bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR); - timeout++; -- } while ((bmcr & MII_BMCR) && (timeout < 100)); -+ } while ((bmcr & BMCR_RESET) && (timeout < 100)); - - if (timeout >= 100) { - netdev_warn(dev->net, "timeout on PHY Reset"); -diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c -index 069c1cf..009bba3 100644 ---- a/drivers/net/usb/usbnet.c -+++ b/drivers/net/usb/usbnet.c -@@ -736,6 +736,7 @@ int usbnet_open (struct net_device *net) - } - } - -+ set_bit(EVENT_DEV_OPEN, &dev->flags); - netif_start_queue (net); - netif_info(dev, ifup, dev->net, - "open: enable queueing (rx %d, tx %d) mtu %d %s framing\n", -@@ -1259,6 +1260,9 @@ void usbnet_disconnect (struct usb_interface *intf) - if (dev->driver_info->unbind) - dev->driver_info->unbind (dev, intf); - -+ usb_kill_urb(dev->interrupt); -+ usb_free_urb(dev->interrupt); -+ - free_netdev(net); - usb_put_dev (xdev); - } -@@ -1498,6 +1502,10 @@ int usbnet_resume (struct usb_interface *intf) - int retval; - - if (!--dev->suspend_count) { -+ /* resume interrupt URBs */ -+ if (dev->interrupt && test_bit(EVENT_DEV_OPEN, &dev->flags)) -+ usb_submit_urb(dev->interrupt, GFP_NOIO); -+ - spin_lock_irq(&dev->txq.lock); - while ((res = usb_get_from_anchor(&dev->deferred))) { - -diff --git a/drivers/net/veth.c b/drivers/net/veth.c -index 2de9b90..3b99f64 100644 ---- a/drivers/net/veth.c -+++ b/drivers/net/veth.c -@@ -403,6 +403,17 @@ static int veth_newlink(struct net *src_net, struct net_device *dev, - if (tb[IFLA_ADDRESS] == NULL) - random_ether_addr(dev->dev_addr); - -+ if (tb[IFLA_IFNAME]) -+ nla_strlcpy(dev->name, tb[IFLA_IFNAME], IFNAMSIZ); -+ else -+ snprintf(dev->name, IFNAMSIZ, DRV_NAME "%%d"); -+ -+ if (strchr(dev->name, '%')) { -+ err = dev_alloc_name(dev, dev->name); -+ if (err < 0) -+ goto err_alloc_name; -+ } -+ - err = register_netdevice(dev); - if (err < 0) - goto err_register_dev; -@@ -422,6 +433,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev, - - err_register_dev: - /* nothing to do */ -+err_alloc_name: - err_configure_peer: - unregister_netdevice(peer); - return err; -diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c -index dcd19bc..b29c80d 100644 ---- a/drivers/net/wireless/ath/ath9k/recv.c -+++ b/drivers/net/wireless/ath/ath9k/recv.c -@@ -506,7 +506,7 @@ bool ath_stoprecv(struct ath_softc *sc) - "confusing the DMA engine when we start RX up\n"); - ATH_DBG_WARN_ON_ONCE(!stopped); - } -- return stopped || reset; -+ return stopped && !reset; - } - - void ath_flushrecv(struct ath_softc *sc) -diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c -index d59b016..5af40d9 100644 ---- a/drivers/net/wireless/b43/main.c -+++ b/drivers/net/wireless/b43/main.c -@@ -72,6 +72,7 @@ MODULE_FIRMWARE("b43/ucode11.fw"); - MODULE_FIRMWARE("b43/ucode13.fw"); - MODULE_FIRMWARE("b43/ucode14.fw"); - MODULE_FIRMWARE("b43/ucode15.fw"); -+MODULE_FIRMWARE("b43/ucode16_mimo.fw"); - MODULE_FIRMWARE("b43/ucode5.fw"); - MODULE_FIRMWARE("b43/ucode9.fw"); - -diff --git a/drivers/net/wireless/iwlegacy/iwl-4965-tx.c b/drivers/net/wireless/iwlegacy/iwl-4965-tx.c -index 5c40502..79ac081 100644 ---- a/drivers/net/wireless/iwlegacy/iwl-4965-tx.c -+++ b/drivers/net/wireless/iwlegacy/iwl-4965-tx.c -@@ -316,12 +316,18 @@ int iwl4965_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) - - hdr_len = ieee80211_hdrlen(fc); - -- /* Find index into station table for destination station */ -- sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta); -- if (sta_id == IWL_INVALID_STATION) { -- IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", -- hdr->addr1); -- goto drop_unlock; -+ /* For management frames use broadcast id to do not break aggregation */ -+ if (!ieee80211_is_data(fc)) -+ sta_id = ctx->bcast_sta_id; -+ else { -+ /* Find index into station table for destination station */ -+ sta_id = iwl_legacy_sta_id_or_broadcast(priv, ctx, info->control.sta); -+ -+ if (sta_id == IWL_INVALID_STATION) { -+ IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", -+ hdr->addr1); -+ goto drop_unlock; -+ } - } - - IWL_DEBUG_TX(priv, "station Id %d\n", sta_id); -@@ -1127,12 +1133,16 @@ int iwl4965_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index) - q->read_ptr = iwl_legacy_queue_inc_wrap(q->read_ptr, q->n_bd)) { - - tx_info = &txq->txb[txq->q.read_ptr]; -- iwl4965_tx_status(priv, tx_info, -- txq_id >= IWL4965_FIRST_AMPDU_QUEUE); -+ -+ if (WARN_ON_ONCE(tx_info->skb == NULL)) -+ continue; - - hdr = (struct ieee80211_hdr *)tx_info->skb->data; -- if (hdr && ieee80211_is_data_qos(hdr->frame_control)) -+ if (ieee80211_is_data_qos(hdr->frame_control)) - nfreed++; -+ -+ iwl4965_tx_status(priv, tx_info, -+ txq_id >= IWL4965_FIRST_AMPDU_QUEUE); - tx_info->skb = NULL; - - priv->cfg->ops->lib->txq_free_tfd(priv, txq); -diff --git a/drivers/net/wireless/iwlegacy/iwl-led.c b/drivers/net/wireless/iwlegacy/iwl-led.c -index 15eb8b7..bda0d61 100644 ---- a/drivers/net/wireless/iwlegacy/iwl-led.c -+++ b/drivers/net/wireless/iwlegacy/iwl-led.c -@@ -48,8 +48,21 @@ module_param(led_mode, int, S_IRUGO); - MODULE_PARM_DESC(led_mode, "0=system default, " - "1=On(RF On)/Off(RF Off), 2=blinking"); - -+/* Throughput OFF time(ms) ON time (ms) -+ * >300 25 25 -+ * >200 to 300 40 40 -+ * >100 to 200 55 55 -+ * >70 to 100 65 65 -+ * >50 to 70 75 75 -+ * >20 to 50 85 85 -+ * >10 to 20 95 95 -+ * >5 to 10 110 110 -+ * >1 to 5 130 130 -+ * >0 to 1 167 167 -+ * <=0 SOLID ON -+ */ - static const struct ieee80211_tpt_blink iwl_blink[] = { -- { .throughput = 0 * 1024 - 1, .blink_time = 334 }, -+ { .throughput = 0, .blink_time = 334 }, - { .throughput = 1 * 1024 - 1, .blink_time = 260 }, - { .throughput = 5 * 1024 - 1, .blink_time = 220 }, - { .throughput = 10 * 1024 - 1, .blink_time = 190 }, -@@ -101,6 +114,11 @@ static int iwl_legacy_led_cmd(struct iwl_priv *priv, - if (priv->blink_on == on && priv->blink_off == off) - return 0; - -+ if (off == 0) { -+ /* led is SOLID_ON */ -+ on = IWL_LED_SOLID; -+ } -+ - IWL_DEBUG_LED(priv, "Led blink time compensation=%u\n", - priv->cfg->base_params->led_compensation); - led_cmd.on = iwl_legacy_blink_compensation(priv, on, -diff --git a/drivers/net/wireless/iwlegacy/iwl4965-base.c b/drivers/net/wireless/iwlegacy/iwl4965-base.c -index d484c36..a62fe24 100644 ---- a/drivers/net/wireless/iwlegacy/iwl4965-base.c -+++ b/drivers/net/wireless/iwlegacy/iwl4965-base.c -@@ -2984,15 +2984,15 @@ static void iwl4965_bg_txpower_work(struct work_struct *work) - struct iwl_priv *priv = container_of(work, struct iwl_priv, - txpower_work); - -+ mutex_lock(&priv->mutex); -+ - /* If a scan happened to start before we got here - * then just return; the statistics notification will - * kick off another scheduled work to compensate for - * any temperature delta we missed here. */ - if (test_bit(STATUS_EXIT_PENDING, &priv->status) || - test_bit(STATUS_SCANNING, &priv->status)) -- return; -- -- mutex_lock(&priv->mutex); -+ goto out; - - /* Regardless of if we are associated, we must reconfigure the - * TX power since frames can be sent on non-radar channels while -@@ -3002,7 +3002,7 @@ static void iwl4965_bg_txpower_work(struct work_struct *work) - /* Update last_temperature to keep is_calib_needed from running - * when it isn't needed... */ - priv->last_temperature = priv->temperature; -- -+out: - mutex_unlock(&priv->mutex); - } - -diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c -index dfdbea6..fbbde07 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c -+++ b/drivers/net/wireless/iwlwifi/iwl-agn-rxon.c -@@ -335,7 +335,6 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed) - struct ieee80211_channel *channel = conf->channel; - const struct iwl_channel_info *ch_info; - int ret = 0; -- bool ht_changed[NUM_IWL_RXON_CTX] = {}; - - IWL_DEBUG_MAC80211(priv, "changed %#x", changed); - -@@ -383,10 +382,8 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed) - - for_each_context(priv, ctx) { - /* Configure HT40 channels */ -- if (ctx->ht.enabled != conf_is_ht(conf)) { -+ if (ctx->ht.enabled != conf_is_ht(conf)) - ctx->ht.enabled = conf_is_ht(conf); -- ht_changed[ctx->ctxid] = true; -- } - - if (ctx->ht.enabled) { - if (conf_is_ht40_minus(conf)) { -@@ -455,8 +452,6 @@ int iwlagn_mac_config(struct ieee80211_hw *hw, u32 changed) - if (!memcmp(&ctx->staging, &ctx->active, sizeof(ctx->staging))) - continue; - iwlagn_commit_rxon(priv, ctx); -- if (ht_changed[ctx->ctxid]) -- iwlagn_update_qos(priv, ctx); - } - out: - mutex_unlock(&priv->mutex); -diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c -index a709d05..0712b67 100644 ---- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c -+++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c -@@ -568,12 +568,17 @@ int iwlagn_tx_skb(struct iwl_priv *priv, struct sk_buff *skb) - - hdr_len = ieee80211_hdrlen(fc); - -- /* Find index into station table for destination station */ -- sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta); -- if (sta_id == IWL_INVALID_STATION) { -- IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", -- hdr->addr1); -- goto drop_unlock; -+ /* For management frames use broadcast id to do not break aggregation */ -+ if (!ieee80211_is_data(fc)) -+ sta_id = ctx->bcast_sta_id; -+ else { -+ /* Find index into station table for destination station */ -+ sta_id = iwl_sta_id_or_broadcast(priv, ctx, info->control.sta); -+ if (sta_id == IWL_INVALID_STATION) { -+ IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n", -+ hdr->addr1); -+ goto drop_unlock; -+ } - } - - IWL_DEBUG_TX(priv, "station Id %d\n", sta_id); -@@ -1224,12 +1229,16 @@ int iwlagn_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index) - q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd)) { - - tx_info = &txq->txb[txq->q.read_ptr]; -- iwlagn_tx_status(priv, tx_info, -- txq_id >= IWLAGN_FIRST_AMPDU_QUEUE); -+ -+ if (WARN_ON_ONCE(tx_info->skb == NULL)) -+ continue; - - hdr = (struct ieee80211_hdr *)tx_info->skb->data; -- if (hdr && ieee80211_is_data_qos(hdr->frame_control)) -+ if (ieee80211_is_data_qos(hdr->frame_control)) - nfreed++; -+ -+ iwlagn_tx_status(priv, tx_info, -+ txq_id >= IWLAGN_FIRST_AMPDU_QUEUE); - tx_info->skb = NULL; - - if (priv->cfg->ops->lib->txq_inval_byte_cnt_tbl) -diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c -index fe77e82..e8c19de 100644 ---- a/drivers/pcmcia/pcmcia_resource.c -+++ b/drivers/pcmcia/pcmcia_resource.c -@@ -173,7 +173,7 @@ static int pcmcia_access_config(struct pcmcia_device *p_dev, - c = p_dev->function_config; - - if (!(c->state & CONFIG_LOCKED)) { -- dev_dbg(&p_dev->dev, "Configuration isn't't locked\n"); -+ dev_dbg(&p_dev->dev, "Configuration isn't locked\n"); - mutex_unlock(&s->ops_mutex); - return -EACCES; - } -diff --git a/drivers/rtc/rtc-max8925.c b/drivers/rtc/rtc-max8925.c -index 174036d..20494b5 100644 ---- a/drivers/rtc/rtc-max8925.c -+++ b/drivers/rtc/rtc-max8925.c -@@ -257,6 +257,8 @@ static int __devinit max8925_rtc_probe(struct platform_device *pdev) - goto out_irq; - } - -+ dev_set_drvdata(&pdev->dev, info); -+ - info->rtc_dev = rtc_device_register("max8925-rtc", &pdev->dev, - &max8925_rtc_ops, THIS_MODULE); - ret = PTR_ERR(info->rtc_dev); -@@ -265,7 +267,6 @@ static int __devinit max8925_rtc_probe(struct platform_device *pdev) - goto out_rtc; - } - -- dev_set_drvdata(&pdev->dev, info); - platform_set_drvdata(pdev, info); - - return 0; -diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c -index 29143ed..85dddb1 100644 ---- a/drivers/s390/block/dasd_diag.c -+++ b/drivers/s390/block/dasd_diag.c -@@ -239,7 +239,6 @@ static void dasd_ext_handler(unsigned int ext_int_code, - addr_t ip; - int rc; - -- kstat_cpu(smp_processor_id()).irqs[EXTINT_DSD]++; - switch (ext_int_code >> 24) { - case DASD_DIAG_CODE_31BIT: - ip = (addr_t) param32; -@@ -250,6 +249,7 @@ static void dasd_ext_handler(unsigned int ext_int_code, - default: - return; - } -+ kstat_cpu(smp_processor_id()).irqs[EXTINT_DSD]++; - if (!ip) { /* no intparm: unsolicited interrupt */ - DBF_EVENT(DBF_NOTICE, "%s", "caught unsolicited " - "interrupt"); -diff --git a/drivers/s390/kvm/kvm_virtio.c b/drivers/s390/kvm/kvm_virtio.c -index 414427d..607998f 100644 ---- a/drivers/s390/kvm/kvm_virtio.c -+++ b/drivers/s390/kvm/kvm_virtio.c -@@ -381,10 +381,10 @@ static void kvm_extint_handler(unsigned int ext_int_code, - u16 subcode; - u32 param; - -- kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++; - subcode = ext_int_code >> 16; - if ((subcode & 0xff00) != VIRTIO_SUBCODE_64) - return; -+ kstat_cpu(smp_processor_id()).irqs[EXTINT_VRT]++; - - /* The LSB might be overloaded, we have to mask it */ - vq = (struct virtqueue *)(param64 & ~1UL); -diff --git a/drivers/scsi/device_handler/scsi_dh.c b/drivers/scsi/device_handler/scsi_dh.c -index 564e6ec..0119b81 100644 ---- a/drivers/scsi/device_handler/scsi_dh.c -+++ b/drivers/scsi/device_handler/scsi_dh.c -@@ -394,12 +394,14 @@ int scsi_dh_activate(struct request_queue *q, activate_complete fn, void *data) - unsigned long flags; - struct scsi_device *sdev; - struct scsi_device_handler *scsi_dh = NULL; -+ struct device *dev = NULL; - - spin_lock_irqsave(q->queue_lock, flags); - sdev = q->queuedata; - if (sdev && sdev->scsi_dh_data) - scsi_dh = sdev->scsi_dh_data->scsi_dh; -- if (!scsi_dh || !get_device(&sdev->sdev_gendev) || -+ dev = get_device(&sdev->sdev_gendev); -+ if (!scsi_dh || !dev || - sdev->sdev_state == SDEV_CANCEL || - sdev->sdev_state == SDEV_DEL) - err = SCSI_DH_NOSYS; -@@ -410,12 +412,13 @@ int scsi_dh_activate(struct request_queue *q, activate_complete fn, void *data) - if (err) { - if (fn) - fn(data, err); -- return err; -+ goto out; - } - - if (scsi_dh->activate) - err = scsi_dh->activate(sdev, fn, data); -- put_device(&sdev->sdev_gendev); -+out: -+ put_device(dev); - return err; - } - EXPORT_SYMBOL_GPL(scsi_dh_activate); -diff --git a/drivers/scsi/mpt2sas/mpt2sas_ctl.c b/drivers/scsi/mpt2sas/mpt2sas_ctl.c -index 1c6d2b4..d72f1f2 100644 ---- a/drivers/scsi/mpt2sas/mpt2sas_ctl.c -+++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c -@@ -688,6 +688,13 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc, - goto out; - } - -+ /* Check for overflow and wraparound */ -+ if (karg.data_sge_offset * 4 > ioc->request_sz || -+ karg.data_sge_offset > (UINT_MAX / 4)) { -+ ret = -EINVAL; -+ goto out; -+ } -+ - /* copy in request message frame from user */ - if (copy_from_user(mpi_request, mf, karg.data_sge_offset*4)) { - printk(KERN_ERR "failure at %s:%d/%s()!\n", __FILE__, __LINE__, -@@ -1963,7 +1970,7 @@ _ctl_diag_read_buffer(void __user *arg, enum block_state state) - Mpi2DiagBufferPostReply_t *mpi_reply; - int rc, i; - u8 buffer_type; -- unsigned long timeleft; -+ unsigned long timeleft, request_size, copy_size; - u16 smid; - u16 ioc_status; - u8 issue_reset = 0; -@@ -1999,6 +2006,8 @@ _ctl_diag_read_buffer(void __user *arg, enum block_state state) - return -ENOMEM; - } - -+ request_size = ioc->diag_buffer_sz[buffer_type]; -+ - if ((karg.starting_offset % 4) || (karg.bytes_to_read % 4)) { - printk(MPT2SAS_ERR_FMT "%s: either the starting_offset " - "or bytes_to_read are not 4 byte aligned\n", ioc->name, -@@ -2006,13 +2015,23 @@ _ctl_diag_read_buffer(void __user *arg, enum block_state state) - return -EINVAL; - } - -+ if (karg.starting_offset > request_size) -+ return -EINVAL; -+ - diag_data = (void *)(request_data + karg.starting_offset); - dctlprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: diag_buffer(%p), " - "offset(%d), sz(%d)\n", ioc->name, __func__, - diag_data, karg.starting_offset, karg.bytes_to_read)); - -+ /* Truncate data on requests that are too large */ -+ if ((diag_data + karg.bytes_to_read < diag_data) || -+ (diag_data + karg.bytes_to_read > request_data + request_size)) -+ copy_size = request_size - karg.starting_offset; -+ else -+ copy_size = karg.bytes_to_read; -+ - if (copy_to_user((void __user *)uarg->diagnostic_data, -- diag_data, karg.bytes_to_read)) { -+ diag_data, copy_size)) { - printk(MPT2SAS_ERR_FMT "%s: Unable to write " - "mpt_diag_read_buffer_t data @ %p\n", ioc->name, - __func__, diag_data); -diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c -index 96d5ad0..7f636b1 100644 ---- a/drivers/scsi/pmcraid.c -+++ b/drivers/scsi/pmcraid.c -@@ -3814,6 +3814,9 @@ static long pmcraid_ioctl_passthrough( - rc = -EFAULT; - goto out_free_buffer; - } -+ } else if (request_size < 0) { -+ rc = -EINVAL; -+ goto out_free_buffer; - } - - /* check if we have any additional command parameters */ -diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c -index e44ff64..e639125 100644 ---- a/drivers/scsi/scsi_sysfs.c -+++ b/drivers/scsi/scsi_sysfs.c -@@ -322,14 +322,8 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work) - kfree(evt); - } - -- if (sdev->request_queue) { -- sdev->request_queue->queuedata = NULL; -- /* user context needed to free queue */ -- scsi_free_queue(sdev->request_queue); -- /* temporary expedient, try to catch use of queue lock -- * after free of sdev */ -- sdev->request_queue = NULL; -- } -+ /* NULL queue means the device can't be used */ -+ sdev->request_queue = NULL; - - scsi_target_reap(scsi_target(sdev)); - -@@ -937,6 +931,12 @@ void __scsi_remove_device(struct scsi_device *sdev) - if (sdev->host->hostt->slave_destroy) - sdev->host->hostt->slave_destroy(sdev); - transport_destroy_device(dev); -+ -+ /* cause the request function to reject all I/O requests */ -+ sdev->request_queue->queuedata = NULL; -+ -+ /* Freeing the queue signals to block that we're done */ -+ scsi_free_queue(sdev->request_queue); - put_device(dev); - } - -diff --git a/drivers/staging/rt2860/common/cmm_data_pci.c b/drivers/staging/rt2860/common/cmm_data_pci.c -index bef0bbd..f01a51c 100644 ---- a/drivers/staging/rt2860/common/cmm_data_pci.c -+++ b/drivers/staging/rt2860/common/cmm_data_pci.c -@@ -444,7 +444,7 @@ int RTMPCheckRxError(struct rt_rtmp_adapter *pAd, - return (NDIS_STATUS_FAILURE); - } - } -- /* Drop not U2M frames, can't's drop here because we will drop beacon in this case */ -+ /* Drop not U2M frames, can't drop here because we will drop beacon in this case */ - /* I am kind of doubting the U2M bit operation */ - /* if (pRxD->U2M == 0) */ - /* return(NDIS_STATUS_FAILURE); */ -diff --git a/drivers/staging/rt2860/common/cmm_data_usb.c b/drivers/staging/rt2860/common/cmm_data_usb.c -index 5637857..83a62fa 100644 ---- a/drivers/staging/rt2860/common/cmm_data_usb.c -+++ b/drivers/staging/rt2860/common/cmm_data_usb.c -@@ -860,7 +860,7 @@ int RTMPCheckRxError(struct rt_rtmp_adapter *pAd, - DBGPRINT_RAW(RT_DEBUG_ERROR, ("received packet too long\n")); - return NDIS_STATUS_FAILURE; - } -- /* Drop not U2M frames, can't's drop here because we will drop beacon in this case */ -+ /* Drop not U2M frames, can't drop here because we will drop beacon in this case */ - /* I am kind of doubting the U2M bit operation */ - /* if (pRxD->U2M == 0) */ - /* return(NDIS_STATUS_FAILURE); */ -diff --git a/drivers/staging/spectra/ffsport.c b/drivers/staging/spectra/ffsport.c -index 20dae73..506547b 100644 ---- a/drivers/staging/spectra/ffsport.c -+++ b/drivers/staging/spectra/ffsport.c -@@ -653,7 +653,7 @@ static int SBD_setup_device(struct spectra_nand_dev *dev, int which) - } - dev->queue->queuedata = dev; - -- /* As Linux block layer does't support >4KB hardware sector, */ -+ /* As Linux block layer doesn't support >4KB hardware sector, */ - /* Here we force report 512 byte hardware sector size to Kernel */ - blk_queue_logical_block_size(dev->queue, 512); - -diff --git a/drivers/staging/tidspbridge/dynload/cload.c b/drivers/staging/tidspbridge/dynload/cload.c -index 5cecd23..fe1ef0a 100644 ---- a/drivers/staging/tidspbridge/dynload/cload.c -+++ b/drivers/staging/tidspbridge/dynload/cload.c -@@ -718,7 +718,7 @@ static void dload_symbols(struct dload_state *dlthis) - * as a temporary for .dllview record construction. - * Allocate storage for the whole table. Add 1 to the section count - * in case a trampoline section is auto-generated as well as the -- * size of the trampoline section name so DLLView does't get lost. -+ * size of the trampoline section name so DLLView doesn't get lost. - */ - - siz = sym_count * sizeof(struct local_symbol); -diff --git a/drivers/staging/tty/specialix.c b/drivers/staging/tty/specialix.c -index cb24c6d..5c3598e 100644 ---- a/drivers/staging/tty/specialix.c -+++ b/drivers/staging/tty/specialix.c -@@ -978,7 +978,7 @@ static void sx_change_speed(struct specialix_board *bp, - spin_lock_irqsave(&bp->lock, flags); - sx_out(bp, CD186x_CAR, port_No(port)); - -- /* The Specialix board does't implement the RTS lines. -+ /* The Specialix board doesn't implement the RTS lines. - They are used to set the IRQ level. Don't touch them. */ - if (sx_crtscts(tty)) - port->MSVR = MSVR_DTR | (sx_in(bp, CD186x_MSVR) & MSVR_RTS); -diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h -index 2e61fe1..8f4b81d 100644 ---- a/fs/btrfs/ctree.h -+++ b/fs/btrfs/ctree.h -@@ -718,7 +718,7 @@ struct btrfs_space_info { - u64 total_bytes; /* total bytes in the space, - this doesn't take mirrors into account */ - u64 bytes_used; /* total bytes used, -- this does't take mirrors into account */ -+ this doesn't take mirrors into account */ - u64 bytes_pinned; /* total bytes pinned, will be freed when the - transaction finishes */ - u64 bytes_reserved; /* total bytes the allocator has reserved for -diff --git a/fs/file.c b/fs/file.c -index 0be3447..4c6992d 100644 ---- a/fs/file.c -+++ b/fs/file.c -@@ -9,6 +9,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -39,14 +40,17 @@ int sysctl_nr_open_max = 1024 * 1024; /* raised later */ - */ - static DEFINE_PER_CPU(struct fdtable_defer, fdtable_defer_list); - --static inline void *alloc_fdmem(unsigned int size) -+static void *alloc_fdmem(unsigned int size) - { -- void *data; -- -- data = kmalloc(size, GFP_KERNEL|__GFP_NOWARN); -- if (data != NULL) -- return data; -- -+ /* -+ * Very large allocations can stress page reclaim, so fall back to -+ * vmalloc() if the allocation size will be considered "large" by the VM. -+ */ -+ if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) { -+ void *data = kmalloc(size, GFP_KERNEL|__GFP_NOWARN); -+ if (data != NULL) -+ return data; -+ } - return vmalloc(size); - } - -diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c -index 89fc160..1f063ba 100644 ---- a/fs/nfs/namespace.c -+++ b/fs/nfs/namespace.c -@@ -119,7 +119,7 @@ Elong: - } - - #ifdef CONFIG_NFS_V4 --static rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors, struct inode *inode) -+static rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors) - { - struct gss_api_mech *mech; - struct xdr_netobj oid; -@@ -166,7 +166,7 @@ static int nfs_negotiate_security(const struct dentry *parent, - } - flavors = page_address(page); - ret = secinfo(parent->d_inode, &dentry->d_name, flavors); -- *flavor = nfs_find_best_sec(flavors, dentry->d_inode); -+ *flavor = nfs_find_best_sec(flavors); - put_page(page); - } - -diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h -index e1c261d..c4a6983 100644 ---- a/fs/nfs/nfs4_fs.h -+++ b/fs/nfs/nfs4_fs.h -@@ -47,6 +47,7 @@ enum nfs4_client_state { - NFS4CLNT_LAYOUTRECALL, - NFS4CLNT_SESSION_RESET, - NFS4CLNT_RECALL_SLOT, -+ NFS4CLNT_LEASE_CONFIRM, - }; - - enum nfs4_session_state { -diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c -index 9bf41ea..69c0f3c 100644 ---- a/fs/nfs/nfs4proc.c -+++ b/fs/nfs/nfs4proc.c -@@ -46,6 +46,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -443,8 +444,8 @@ static int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res * - if (res->sr_status == 1) - res->sr_status = NFS_OK; - -- /* -ERESTARTSYS can result in skipping nfs41_sequence_setup */ -- if (!res->sr_slot) -+ /* don't increment the sequence number if the task wasn't sent */ -+ if (!RPC_WAS_SENT(task)) - goto out; - - /* Check the SEQUENCE operation status */ -@@ -2185,9 +2186,14 @@ static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, - struct nfs4_exception exception = { }; - int err; - do { -- err = nfs4_handle_exception(server, -- _nfs4_lookup_root(server, fhandle, info), -- &exception); -+ err = _nfs4_lookup_root(server, fhandle, info); -+ switch (err) { -+ case 0: -+ case -NFS4ERR_WRONGSEC: -+ break; -+ default: -+ err = nfs4_handle_exception(server, err, &exception); -+ } - } while (exception.retry); - return err; - } -@@ -2208,25 +2214,47 @@ out: - return ret; - } - --/* -- * get the file handle for the "/" directory on the server -- */ --static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, -+static int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle, - struct nfs_fsinfo *info) - { - int i, len, status = 0; -- rpc_authflavor_t flav_array[NFS_MAX_SECFLAVORS + 2]; -+ rpc_authflavor_t flav_array[NFS_MAX_SECFLAVORS]; - -- flav_array[0] = RPC_AUTH_UNIX; -- len = gss_mech_list_pseudoflavors(&flav_array[1]); -- flav_array[1+len] = RPC_AUTH_NULL; -- len += 2; -+ len = gss_mech_list_pseudoflavors(&flav_array[0]); -+ flav_array[len] = RPC_AUTH_NULL; -+ len += 1; - - for (i = 0; i < len; i++) { - status = nfs4_lookup_root_sec(server, fhandle, info, flav_array[i]); -- if (status != -EPERM) -- break; -+ if (status == -NFS4ERR_WRONGSEC || status == -EACCES) -+ continue; -+ break; - } -+ /* -+ * -EACCESS could mean that the user doesn't have correct permissions -+ * to access the mount. It could also mean that we tried to mount -+ * with a gss auth flavor, but rpc.gssd isn't running. Either way, -+ * existing mount programs don't handle -EACCES very well so it should -+ * be mapped to -EPERM instead. -+ */ -+ if (status == -EACCES) -+ status = -EPERM; -+ return status; -+} -+ -+/* -+ * get the file handle for the "/" directory on the server -+ */ -+static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle, -+ struct nfs_fsinfo *info) -+{ -+ int status = nfs4_lookup_root(server, fhandle, info); -+ if ((status == -NFS4ERR_WRONGSEC) && !(server->flags & NFS_MOUNT_SECFLAVOUR)) -+ /* -+ * A status of -NFS4ERR_WRONGSEC will be mapped to -EPERM -+ * by nfs4_map_errors() as this function exits. -+ */ -+ status = nfs4_find_root_sec(server, fhandle, info); - if (status == 0) - status = nfs4_server_capabilities(server, fhandle); - if (status == 0) -@@ -3723,21 +3751,20 @@ int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, - sizeof(setclientid.sc_uaddr), "%s.%u.%u", - clp->cl_ipaddr, port >> 8, port & 255); - -- status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); -+ status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); - if (status != -NFS4ERR_CLID_INUSE) - break; -- if (signalled()) -+ if (loop != 0) { -+ ++clp->cl_id_uniquifier; - break; -- if (loop++ & 1) -- ssleep(clp->cl_lease_time / HZ + 1); -- else -- if (++clp->cl_id_uniquifier == 0) -- break; -+ } -+ ++loop; -+ ssleep(clp->cl_lease_time / HZ + 1); - } - return status; - } - --static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp, -+int nfs4_proc_setclientid_confirm(struct nfs_client *clp, - struct nfs4_setclientid_res *arg, - struct rpc_cred *cred) - { -@@ -3752,7 +3779,7 @@ static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp, - int status; - - now = jiffies; -- status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); -+ status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); - if (status == 0) { - spin_lock(&clp->cl_lock); - clp->cl_lease_time = fsinfo.lease_time * HZ; -@@ -3762,26 +3789,6 @@ static int _nfs4_proc_setclientid_confirm(struct nfs_client *clp, - return status; - } - --int nfs4_proc_setclientid_confirm(struct nfs_client *clp, -- struct nfs4_setclientid_res *arg, -- struct rpc_cred *cred) --{ -- long timeout = 0; -- int err; -- do { -- err = _nfs4_proc_setclientid_confirm(clp, arg, cred); -- switch (err) { -- case 0: -- return err; -- case -NFS4ERR_RESOURCE: -- /* The IBM lawyers misread another document! */ -- case -NFS4ERR_DELAY: -- err = nfs4_delay(clp->cl_rpcclient, &timeout); -- } -- } while (err == 0); -- return err; --} -- - struct nfs4_delegreturndata { - struct nfs4_delegreturnargs args; - struct nfs4_delegreturnres res; -@@ -4786,7 +4793,7 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred) - init_utsname()->domainname, - clp->cl_rpcclient->cl_auth->au_flavor); - -- status = rpc_call_sync(clp->cl_rpcclient, &msg, 0); -+ status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); - if (!status) - status = nfs4_check_cl_exchange_flags(clp->cl_exchange_flags); - dprintk("<-- %s status= %d\n", __func__, status); -@@ -4869,7 +4876,8 @@ int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo) - .rpc_client = clp->cl_rpcclient, - .rpc_message = &msg, - .callback_ops = &nfs4_get_lease_time_ops, -- .callback_data = &data -+ .callback_data = &data, -+ .flags = RPC_TASK_TIMEOUT, - }; - int status; - -@@ -5171,7 +5179,7 @@ static int _nfs4_proc_create_session(struct nfs_client *clp) - nfs4_init_channel_attrs(&args); - args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN); - -- status = rpc_call_sync(session->clp->cl_rpcclient, &msg, 0); -+ status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); - - if (!status) - /* Verify the session's negotiated channel_attrs values */ -@@ -5194,20 +5202,10 @@ int nfs4_proc_create_session(struct nfs_client *clp) - int status; - unsigned *ptr; - struct nfs4_session *session = clp->cl_session; -- long timeout = 0; -- int err; - - dprintk("--> %s clp=%p session=%p\n", __func__, clp, session); - -- do { -- status = _nfs4_proc_create_session(clp); -- if (status == -NFS4ERR_DELAY) { -- err = nfs4_delay(clp->cl_rpcclient, &timeout); -- if (err) -- status = err; -- } -- } while (status == -NFS4ERR_DELAY); -- -+ status = _nfs4_proc_create_session(clp); - if (status) - goto out; - -@@ -5248,7 +5246,7 @@ int nfs4_proc_destroy_session(struct nfs4_session *session) - msg.rpc_argp = session; - msg.rpc_resp = NULL; - msg.rpc_cred = NULL; -- status = rpc_call_sync(session->clp->cl_rpcclient, &msg, 0); -+ status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); - - if (status) - printk(KERN_WARNING -diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c -index a6804f7..036f5ad 100644 ---- a/fs/nfs/nfs4state.c -+++ b/fs/nfs/nfs4state.c -@@ -64,10 +64,15 @@ static LIST_HEAD(nfs4_clientid_list); - - int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred) - { -- struct nfs4_setclientid_res clid; -+ struct nfs4_setclientid_res clid = { -+ .clientid = clp->cl_clientid, -+ .confirm = clp->cl_confirm, -+ }; - unsigned short port; - int status; - -+ if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state)) -+ goto do_confirm; - port = nfs_callback_tcpport; - if (clp->cl_addr.ss_family == AF_INET6) - port = nfs_callback_tcpport6; -@@ -75,10 +80,14 @@ int nfs4_init_clientid(struct nfs_client *clp, struct rpc_cred *cred) - status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid); - if (status != 0) - goto out; -+ clp->cl_clientid = clid.clientid; -+ clp->cl_confirm = clid.confirm; -+ set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); -+do_confirm: - status = nfs4_proc_setclientid_confirm(clp, &clid, cred); - if (status != 0) - goto out; -- clp->cl_clientid = clid.clientid; -+ clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); - nfs4_schedule_state_renewal(clp); - out: - return status; -@@ -230,13 +239,18 @@ int nfs41_init_clientid(struct nfs_client *clp, struct rpc_cred *cred) - { - int status; - -+ if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state)) -+ goto do_confirm; - nfs4_begin_drain_session(clp); - status = nfs4_proc_exchange_id(clp, cred); - if (status != 0) - goto out; -+ set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); -+do_confirm: - status = nfs4_proc_create_session(clp); - if (status != 0) - goto out; -+ clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); - nfs41_setup_state_renewal(clp); - nfs_mark_client_ready(clp, NFS_CS_READY); - out: -@@ -1584,20 +1598,23 @@ static int nfs4_recall_slot(struct nfs_client *clp) { return 0; } - */ - static void nfs4_set_lease_expired(struct nfs_client *clp, int status) - { -- if (nfs4_has_session(clp)) { -- switch (status) { -- case -NFS4ERR_DELAY: -- case -NFS4ERR_CLID_INUSE: -- case -EAGAIN: -- break; -+ switch (status) { -+ case -NFS4ERR_CLID_INUSE: -+ case -NFS4ERR_STALE_CLIENTID: -+ clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); -+ break; -+ case -NFS4ERR_DELAY: -+ case -ETIMEDOUT: -+ case -EAGAIN: -+ ssleep(1); -+ break; - -- case -EKEYEXPIRED: -- nfs4_warn_keyexpired(clp->cl_hostname); -- case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery -- * in nfs4_exchange_id */ -- default: -- return; -- } -+ case -EKEYEXPIRED: -+ nfs4_warn_keyexpired(clp->cl_hostname); -+ case -NFS4ERR_NOT_SAME: /* FixMe: implement recovery -+ * in nfs4_exchange_id */ -+ default: -+ return; - } - set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); - } -@@ -1607,7 +1624,7 @@ static void nfs4_state_manager(struct nfs_client *clp) - int status = 0; - - /* Ensure exclusive access to NFSv4 state */ -- for(;;) { -+ do { - if (test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) { - /* We're going to have to re-establish a clientid */ - status = nfs4_reclaim_lease(clp); -@@ -1691,7 +1708,7 @@ static void nfs4_state_manager(struct nfs_client *clp) - break; - if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0) - break; -- } -+ } while (atomic_read(&clp->cl_count) > 1); - return; - out_error: - printk(KERN_WARNING "Error: state manager failed on NFSv4 server %s" -diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c -index dddfb57..c3ccd2c 100644 ---- a/fs/nfs/nfs4xdr.c -+++ b/fs/nfs/nfs4xdr.c -@@ -1452,26 +1452,25 @@ static void encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args, - - static void encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg *readdir, struct rpc_rqst *req, struct compound_hdr *hdr) - { -- uint32_t attrs[2] = {0, 0}; -+ uint32_t attrs[2] = { -+ FATTR4_WORD0_RDATTR_ERROR, -+ FATTR4_WORD1_MOUNTED_ON_FILEID, -+ }; - uint32_t dircount = readdir->count >> 1; - __be32 *p; - - if (readdir->plus) { - attrs[0] |= FATTR4_WORD0_TYPE|FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE| -- FATTR4_WORD0_FSID|FATTR4_WORD0_FILEHANDLE; -+ FATTR4_WORD0_FSID|FATTR4_WORD0_FILEHANDLE|FATTR4_WORD0_FILEID; - attrs[1] |= FATTR4_WORD1_MODE|FATTR4_WORD1_NUMLINKS|FATTR4_WORD1_OWNER| - FATTR4_WORD1_OWNER_GROUP|FATTR4_WORD1_RAWDEV| - FATTR4_WORD1_SPACE_USED|FATTR4_WORD1_TIME_ACCESS| - FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY; - dircount >>= 1; - } -- attrs[0] |= FATTR4_WORD0_RDATTR_ERROR|FATTR4_WORD0_FILEID; -- attrs[1] |= FATTR4_WORD1_MOUNTED_ON_FILEID; -- /* Switch to mounted_on_fileid if the server supports it */ -- if (readdir->bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID) -- attrs[0] &= ~FATTR4_WORD0_FILEID; -- else -- attrs[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID; -+ /* Use mounted_on_fileid only if the server supports it */ -+ if (!(readdir->bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)) -+ attrs[0] |= FATTR4_WORD0_FILEID; - - p = reserve_space(xdr, 12+NFS4_VERIFIER_SIZE+20); - *p++ = cpu_to_be32(OP_READDIR); -@@ -3140,7 +3139,7 @@ static int decode_attr_mounted_on_fileid(struct xdr_stream *xdr, uint32_t *bitma - goto out_overflow; - xdr_decode_hyper(p, fileid); - bitmap[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID; -- ret = NFS_ATTR_FATTR_FILEID; -+ ret = NFS_ATTR_FATTR_MOUNTED_ON_FILEID; - } - dprintk("%s: fileid=%Lu\n", __func__, (unsigned long long)*fileid); - return ret; -@@ -4002,7 +4001,6 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap, - { - int status; - umode_t fmode = 0; -- uint64_t fileid; - uint32_t type; - - status = decode_attr_type(xdr, bitmap, &type); -@@ -4101,13 +4099,10 @@ static int decode_getfattr_attrs(struct xdr_stream *xdr, uint32_t *bitmap, - goto xdr_error; - fattr->valid |= status; - -- status = decode_attr_mounted_on_fileid(xdr, bitmap, &fileid); -+ status = decode_attr_mounted_on_fileid(xdr, bitmap, &fattr->mounted_on_fileid); - if (status < 0) - goto xdr_error; -- if (status != 0 && !(fattr->valid & status)) { -- fattr->fileid = fileid; -- fattr->valid |= status; -- } -+ fattr->valid |= status; - - xdr_error: - dprintk("%s: xdr returned %d\n", __func__, -status); -@@ -4838,17 +4833,21 @@ static int decode_secinfo(struct xdr_stream *xdr, struct nfs4_secinfo_res *res) - struct nfs4_secinfo_flavor *sec_flavor; - int status; - __be32 *p; -- int i; -+ int i, num_flavors; - - status = decode_op_hdr(xdr, OP_SECINFO); -+ if (status) -+ goto out; - p = xdr_inline_decode(xdr, 4); - if (unlikely(!p)) - goto out_overflow; -- res->flavors->num_flavors = be32_to_cpup(p); - -- for (i = 0; i < res->flavors->num_flavors; i++) { -+ res->flavors->num_flavors = 0; -+ num_flavors = be32_to_cpup(p); -+ -+ for (i = 0; i < num_flavors; i++) { - sec_flavor = &res->flavors->flavors[i]; -- if ((char *)&sec_flavor[1] - (char *)res > PAGE_SIZE) -+ if ((char *)&sec_flavor[1] - (char *)res->flavors > PAGE_SIZE) - break; - - p = xdr_inline_decode(xdr, 4); -@@ -4857,13 +4856,15 @@ static int decode_secinfo(struct xdr_stream *xdr, struct nfs4_secinfo_res *res) - sec_flavor->flavor = be32_to_cpup(p); - - if (sec_flavor->flavor == RPC_AUTH_GSS) { -- if (decode_secinfo_gss(xdr, sec_flavor)) -- break; -+ status = decode_secinfo_gss(xdr, sec_flavor); -+ if (status) -+ goto out; - } -+ res->flavors->num_flavors++; - } - -- return 0; -- -+out: -+ return status; - out_overflow: - print_overflow_msg(__func__, xdr); - return -EIO; -@@ -6408,7 +6409,9 @@ int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, - if (decode_getfattr_attrs(xdr, bitmap, entry->fattr, entry->fh, - entry->server, 1) < 0) - goto out_overflow; -- if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID) -+ if (entry->fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) -+ entry->ino = entry->fattr->mounted_on_fileid; -+ else if (entry->fattr->valid & NFS_ATTR_FATTR_FILEID) - entry->ino = entry->fattr->fileid; - - entry->d_type = DT_UNKNOWN; -diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c -index d9ab972..ff681ab 100644 ---- a/fs/nfs/pnfs.c -+++ b/fs/nfs/pnfs.c -@@ -1004,6 +1004,7 @@ pnfs_set_layoutcommit(struct nfs_write_data *wdata) - { - struct nfs_inode *nfsi = NFS_I(wdata->inode); - loff_t end_pos = wdata->args.offset + wdata->res.count; -+ bool mark_as_dirty = false; - - spin_lock(&nfsi->vfs_inode.i_lock); - if (!test_and_set_bit(NFS_INO_LAYOUTCOMMIT, &nfsi->flags)) { -@@ -1011,13 +1012,18 @@ pnfs_set_layoutcommit(struct nfs_write_data *wdata) - get_lseg(wdata->lseg); - wdata->lseg->pls_lc_cred = - get_rpccred(wdata->args.context->state->owner->so_cred); -- mark_inode_dirty_sync(wdata->inode); -+ mark_as_dirty = true; - dprintk("%s: Set layoutcommit for inode %lu ", - __func__, wdata->inode->i_ino); - } - if (end_pos > wdata->lseg->pls_end_pos) - wdata->lseg->pls_end_pos = end_pos; - spin_unlock(&nfsi->vfs_inode.i_lock); -+ -+ /* if pnfs_layoutcommit_inode() runs between inode locks, the next one -+ * will be a noop because NFS_INO_LAYOUTCOMMIT will not be set */ -+ if (mark_as_dirty) -+ mark_inode_dirty_sync(wdata->inode); - } - EXPORT_SYMBOL_GPL(pnfs_set_layoutcommit); - -diff --git a/fs/nfs/super.c b/fs/nfs/super.c -index 2b8e9a5..e288f06 100644 ---- a/fs/nfs/super.c -+++ b/fs/nfs/super.c -@@ -1004,6 +1004,7 @@ static int nfs_parse_security_flavors(char *value, - return 0; - } - -+ mnt->flags |= NFS_MOUNT_SECFLAVOUR; - mnt->auth_flavor_len = 1; - return 1; - } -@@ -1976,6 +1977,15 @@ nfs_remount(struct super_block *sb, int *flags, char *raw_data) - if (error < 0) - goto out; - -+ /* -+ * noac is a special case. It implies -o sync, but that's not -+ * necessarily reflected in the mtab options. do_remount_sb -+ * will clear MS_SYNCHRONOUS if -o sync wasn't specified in the -+ * remount options, so we have to explicitly reset it. -+ */ -+ if (data->flags & NFS_MOUNT_NOAC) -+ *flags |= MS_SYNCHRONOUS; -+ - /* compare new mount options with old ones */ - error = nfs_compare_remount_data(nfss, data); - out: -@@ -2235,8 +2245,7 @@ static struct dentry *nfs_fs_mount(struct file_system_type *fs_type, - if (!s->s_root) { - /* initial superblock/root creation */ - nfs_fill_super(s, data); -- nfs_fscache_get_super_cookie( -- s, data ? data->fscache_uniq : NULL, NULL); -+ nfs_fscache_get_super_cookie(s, data->fscache_uniq, NULL); - } - - mntroot = nfs_get_root(s, mntfh, dev_name); -diff --git a/fs/nfs/write.c b/fs/nfs/write.c -index e4cbc11..3bd5d7e 100644 ---- a/fs/nfs/write.c -+++ b/fs/nfs/write.c -@@ -680,7 +680,6 @@ static int nfs_writepage_setup(struct nfs_open_context *ctx, struct page *page, - req = nfs_setup_write_request(ctx, page, offset, count); - if (IS_ERR(req)) - return PTR_ERR(req); -- nfs_mark_request_dirty(req); - /* Update file length */ - nfs_grow_file(page, offset, count); - nfs_mark_uptodate(page, req->wb_pgbase, req->wb_bytes); -@@ -1418,8 +1417,7 @@ static void nfs_commit_done(struct rpc_task *task, void *calldata) - task->tk_pid, task->tk_status); - - /* Call the NFS version-specific code */ -- if (NFS_PROTO(data->inode)->commit_done(task, data) != 0) -- return; -+ NFS_PROTO(data->inode)->commit_done(task, data); - } - - void nfs_commit_release_pages(struct nfs_write_data *data) -diff --git a/fs/ocfs2/ocfs2_fs.h b/fs/ocfs2/ocfs2_fs.h -index b68f87a..938387a 100644 ---- a/fs/ocfs2/ocfs2_fs.h -+++ b/fs/ocfs2/ocfs2_fs.h -@@ -1019,7 +1019,7 @@ struct ocfs2_xattr_entry { - __le16 xe_name_offset; /* byte offset from the 1st entry in the - local xattr storage(inode, xattr block or - xattr bucket). */ -- __u8 xe_name_len; /* xattr name len, does't include prefix. */ -+ __u8 xe_name_len; /* xattr name len, doesn't include prefix. */ - __u8 xe_type; /* the low 7 bits indicate the name prefix - * type and the highest bit indicates whether - * the EA is stored in the local storage. */ -diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c -index 4d0cb12..40fa780 100644 ---- a/fs/ubifs/log.c -+++ b/fs/ubifs/log.c -@@ -175,26 +175,6 @@ void ubifs_add_bud(struct ubifs_info *c, struct ubifs_bud *bud) - } - - /** -- * ubifs_create_buds_lists - create journal head buds lists for remount rw. -- * @c: UBIFS file-system description object -- */ --void ubifs_create_buds_lists(struct ubifs_info *c) --{ -- struct rb_node *p; -- -- spin_lock(&c->buds_lock); -- p = rb_first(&c->buds); -- while (p) { -- struct ubifs_bud *bud = rb_entry(p, struct ubifs_bud, rb); -- struct ubifs_jhead *jhead = &c->jheads[bud->jhead]; -- -- list_add_tail(&bud->list, &jhead->buds_list); -- p = rb_next(p); -- } -- spin_unlock(&c->buds_lock); --} -- --/** - * ubifs_add_bud_to_log - add a new bud to the log. - * @c: UBIFS file-system description object - * @jhead: journal head the bud belongs to -diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c -index eed0fcf..d3d6d36 100644 ---- a/fs/ubifs/replay.c -+++ b/fs/ubifs/replay.c -@@ -59,6 +59,7 @@ enum { - * @new_size: truncation new size - * @free: amount of free space in a bud - * @dirty: amount of dirty space in a bud from padding and deletion nodes -+ * @jhead: journal head number of the bud - * - * UBIFS journal replay must compare node sequence numbers, which means it must - * build a tree of node information to insert into the TNC. -@@ -80,6 +81,7 @@ struct replay_entry { - struct { - int free; - int dirty; -+ int jhead; - }; - }; - }; -@@ -159,6 +161,11 @@ static int set_bud_lprops(struct ubifs_info *c, struct replay_entry *r) - err = PTR_ERR(lp); - goto out; - } -+ -+ /* Make sure the journal head points to the latest bud */ -+ err = ubifs_wbuf_seek_nolock(&c->jheads[r->jhead].wbuf, r->lnum, -+ c->leb_size - r->free, UBI_SHORTTERM); -+ - out: - ubifs_release_lprops(c); - return err; -@@ -627,10 +634,6 @@ static int replay_bud(struct ubifs_info *c, int lnum, int offs, int jhead, - ubifs_assert(sleb->endpt - offs >= used); - ubifs_assert(sleb->endpt % c->min_io_size == 0); - -- if (sleb->endpt + c->min_io_size <= c->leb_size && !c->ro_mount) -- err = ubifs_wbuf_seek_nolock(&c->jheads[jhead].wbuf, lnum, -- sleb->endpt, UBI_SHORTTERM); -- - *dirty = sleb->endpt - offs - used; - *free = c->leb_size - sleb->endpt; - -@@ -653,12 +656,14 @@ out_dump: - * @sqnum: sequence number - * @free: amount of free space in bud - * @dirty: amount of dirty space from padding and deletion nodes -+ * @jhead: journal head number for the bud - * - * This function inserts a reference node to the replay tree and returns zero - * in case of success or a negative error code in case of failure. - */ - static int insert_ref_node(struct ubifs_info *c, int lnum, int offs, -- unsigned long long sqnum, int free, int dirty) -+ unsigned long long sqnum, int free, int dirty, -+ int jhead) - { - struct rb_node **p = &c->replay_tree.rb_node, *parent = NULL; - struct replay_entry *r; -@@ -688,6 +693,7 @@ static int insert_ref_node(struct ubifs_info *c, int lnum, int offs, - r->flags = REPLAY_REF; - r->free = free; - r->dirty = dirty; -+ r->jhead = jhead; - - rb_link_node(&r->rb, parent, p); - rb_insert_color(&r->rb, &c->replay_tree); -@@ -712,7 +718,7 @@ static int replay_buds(struct ubifs_info *c) - if (err) - return err; - err = insert_ref_node(c, b->bud->lnum, b->bud->start, b->sqnum, -- free, dirty); -+ free, dirty, b->bud->jhead); - if (err) - return err; - } -diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c -index be6c7b0..04ad07f 100644 ---- a/fs/ubifs/super.c -+++ b/fs/ubifs/super.c -@@ -1257,12 +1257,12 @@ static int mount_ubifs(struct ubifs_info *c) - goto out_free; - } - -+ err = alloc_wbufs(c); -+ if (err) -+ goto out_cbuf; -+ - sprintf(c->bgt_name, BGT_NAME_PATTERN, c->vi.ubi_num, c->vi.vol_id); - if (!c->ro_mount) { -- err = alloc_wbufs(c); -- if (err) -- goto out_cbuf; -- - /* Create background thread */ - c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name); - if (IS_ERR(c->bgt)) { -@@ -1631,12 +1631,6 @@ static int ubifs_remount_rw(struct ubifs_info *c) - if (err) - goto out; - -- err = alloc_wbufs(c); -- if (err) -- goto out; -- -- ubifs_create_buds_lists(c); -- - /* Create background thread */ - c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name); - if (IS_ERR(c->bgt)) { -@@ -1744,7 +1738,6 @@ static void ubifs_remount_ro(struct ubifs_info *c) - if (err) - ubifs_ro_mode(c, err); - -- free_wbufs(c); - vfree(c->orph_buf); - c->orph_buf = NULL; - kfree(c->write_reserve_buf); -diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h -index f22e7fe..ade09d7 100644 ---- a/include/drm/drm_fb_helper.h -+++ b/include/drm/drm_fb_helper.h -@@ -118,6 +118,7 @@ int drm_fb_helper_setcolreg(unsigned regno, - unsigned transp, - struct fb_info *info); - -+bool drm_fb_helper_restore_fbdev_mode(struct drm_fb_helper *fb_helper); - void drm_fb_helper_restore(void); - void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper, - uint32_t fb_width, uint32_t fb_height); -diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h -index 3bce1a4..7aa5ddd 100644 ---- a/include/drm/radeon_drm.h -+++ b/include/drm/radeon_drm.h -@@ -909,6 +909,7 @@ struct drm_radeon_cs { - #define RADEON_INFO_WANT_CMASK 0x08 /* get access to CMASK on r300 */ - #define RADEON_INFO_CLOCK_CRYSTAL_FREQ 0x09 /* clock crystal frequency */ - #define RADEON_INFO_NUM_BACKENDS 0x0a /* DB/backends for r600+ - need for OQ */ -+#define RADEON_INFO_NUM_TILE_PIPES 0x0b /* tile pipes for r600+ */ - - struct drm_radeon_info { - uint32_t request; -diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h -index df29c8f..8847c8c 100644 ---- a/include/linux/huge_mm.h -+++ b/include/linux/huge_mm.h -@@ -117,7 +117,7 @@ static inline void vma_adjust_trans_huge(struct vm_area_struct *vma, - unsigned long end, - long adjust_next) - { -- if (!vma->anon_vma || vma->vm_ops || vma->vm_file) -+ if (!vma->anon_vma || vma->vm_ops) - return; - __vma_adjust_trans_huge(vma, start, end, adjust_next); - } -diff --git a/include/linux/mm.h b/include/linux/mm.h -index 692dbae..2348db2 100644 ---- a/include/linux/mm.h -+++ b/include/linux/mm.h -@@ -137,7 +137,8 @@ extern unsigned int kobjsize(const void *objp); - #define VM_RandomReadHint(v) ((v)->vm_flags & VM_RAND_READ) - - /* -- * special vmas that are non-mergable, non-mlock()able -+ * Special vmas that are non-mergable, non-mlock()able. -+ * Note: mm/huge_memory.c VM_NO_THP depends on this definition. - */ - #define VM_SPECIAL (VM_IO | VM_DONTEXPAND | VM_RESERVED | VM_PFNMAP) - -diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h -index 216cea5..87694ca 100644 ---- a/include/linux/nfs_fs_sb.h -+++ b/include/linux/nfs_fs_sb.h -@@ -47,6 +47,7 @@ struct nfs_client { - - #ifdef CONFIG_NFS_V4 - u64 cl_clientid; /* constant */ -+ nfs4_verifier cl_confirm; /* Clientid verifier */ - unsigned long cl_state; - - spinlock_t cl_lock; -diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h -index 78b101e..890dce2 100644 ---- a/include/linux/nfs_xdr.h -+++ b/include/linux/nfs_xdr.h -@@ -50,6 +50,7 @@ struct nfs_fattr { - } du; - struct nfs_fsid fsid; - __u64 fileid; -+ __u64 mounted_on_fileid; - struct timespec atime; - struct timespec mtime; - struct timespec ctime; -@@ -83,6 +84,7 @@ struct nfs_fattr { - #define NFS_ATTR_FATTR_PRECHANGE (1U << 18) - #define NFS_ATTR_FATTR_V4_REFERRAL (1U << 19) /* NFSv4 referral */ - #define NFS_ATTR_FATTR_MOUNTPOINT (1U << 20) /* Treat as mountpoint */ -+#define NFS_ATTR_FATTR_MOUNTED_ON_FILEID (1U << 21) - - #define NFS_ATTR_FATTR (NFS_ATTR_FATTR_TYPE \ - | NFS_ATTR_FATTR_MODE \ -diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h -index 4e2c915..8abe8d7 100644 ---- a/include/linux/pci_ids.h -+++ b/include/linux/pci_ids.h -@@ -2477,15 +2477,12 @@ - #define PCI_DEVICE_ID_INTEL_82840_HB 0x1a21 - #define PCI_DEVICE_ID_INTEL_82845_HB 0x1a30 - #define PCI_DEVICE_ID_INTEL_IOAT 0x1a38 --#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 - #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN 0x1c41 - #define PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX 0x1c5f --#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 - #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_0 0x1d40 - #define PCI_DEVICE_ID_INTEL_PATSBURG_LPC_1 0x1d41 - #define PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MIN 0x2310 - #define PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MAX 0x231f --#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 - #define PCI_DEVICE_ID_INTEL_82801AA_0 0x2410 - #define PCI_DEVICE_ID_INTEL_82801AA_1 0x2411 - #define PCI_DEVICE_ID_INTEL_82801AA_3 0x2413 -@@ -2696,7 +2693,6 @@ - #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 - #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MIN 0x3b00 - #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_LPC_MAX 0x3b1f --#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 - #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f - #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 - #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 -diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h -index d81db80..f73c482 100644 ---- a/include/linux/sunrpc/sched.h -+++ b/include/linux/sunrpc/sched.h -@@ -127,13 +127,16 @@ struct rpc_task_setup { - #define RPC_TASK_KILLED 0x0100 /* task was killed */ - #define RPC_TASK_SOFT 0x0200 /* Use soft timeouts */ - #define RPC_TASK_SOFTCONN 0x0400 /* Fail if can't connect */ -+#define RPC_TASK_SENT 0x0800 /* message was sent */ -+#define RPC_TASK_TIMEOUT 0x1000 /* fail with ETIMEDOUT on timeout */ - - #define RPC_IS_ASYNC(t) ((t)->tk_flags & RPC_TASK_ASYNC) - #define RPC_IS_SWAPPER(t) ((t)->tk_flags & RPC_TASK_SWAPPER) - #define RPC_DO_ROOTOVERRIDE(t) ((t)->tk_flags & RPC_TASK_ROOTCREDS) - #define RPC_ASSASSINATED(t) ((t)->tk_flags & RPC_TASK_KILLED) --#define RPC_IS_SOFT(t) ((t)->tk_flags & RPC_TASK_SOFT) -+#define RPC_IS_SOFT(t) ((t)->tk_flags & (RPC_TASK_SOFT|RPC_TASK_TIMEOUT)) - #define RPC_IS_SOFTCONN(t) ((t)->tk_flags & RPC_TASK_SOFTCONN) -+#define RPC_WAS_SENT(t) ((t)->tk_flags & RPC_TASK_SENT) - - #define RPC_TASK_RUNNING 0 - #define RPC_TASK_QUEUED 1 -diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h -index 0e18550..605b0aa 100644 ---- a/include/linux/usb/usbnet.h -+++ b/include/linux/usb/usbnet.h -@@ -68,6 +68,7 @@ struct usbnet { - # define EVENT_RX_PAUSED 5 - # define EVENT_DEV_WAKING 6 - # define EVENT_DEV_ASLEEP 7 -+# define EVENT_DEV_OPEN 8 - }; - - static inline struct usb_driver *driver_of(struct usb_interface *intf) -diff --git a/include/linux/v4l2-mediabus.h b/include/linux/v4l2-mediabus.h -index 7054a7a..de5c159 100644 ---- a/include/linux/v4l2-mediabus.h -+++ b/include/linux/v4l2-mediabus.h -@@ -47,7 +47,7 @@ enum v4l2_mbus_pixelcode { - V4L2_MBUS_FMT_RGB565_2X8_BE = 0x1007, - V4L2_MBUS_FMT_RGB565_2X8_LE = 0x1008, - -- /* YUV (including grey) - next is 0x2013 */ -+ /* YUV (including grey) - next is 0x2014 */ - V4L2_MBUS_FMT_Y8_1X8 = 0x2001, - V4L2_MBUS_FMT_UYVY8_1_5X8 = 0x2002, - V4L2_MBUS_FMT_VYUY8_1_5X8 = 0x2003, -@@ -60,6 +60,7 @@ enum v4l2_mbus_pixelcode { - V4L2_MBUS_FMT_Y10_1X10 = 0x200a, - V4L2_MBUS_FMT_YUYV10_2X10 = 0x200b, - V4L2_MBUS_FMT_YVYU10_2X10 = 0x200c, -+ V4L2_MBUS_FMT_Y12_1X12 = 0x2013, - V4L2_MBUS_FMT_UYVY8_1X16 = 0x200f, - V4L2_MBUS_FMT_VYUY8_1X16 = 0x2010, - V4L2_MBUS_FMT_YUYV8_1X16 = 0x2011, -@@ -67,9 +68,11 @@ enum v4l2_mbus_pixelcode { - V4L2_MBUS_FMT_YUYV10_1X20 = 0x200d, - V4L2_MBUS_FMT_YVYU10_1X20 = 0x200e, - -- /* Bayer - next is 0x3013 */ -+ /* Bayer - next is 0x3015 */ - V4L2_MBUS_FMT_SBGGR8_1X8 = 0x3001, -+ V4L2_MBUS_FMT_SGBRG8_1X8 = 0x3013, - V4L2_MBUS_FMT_SGRBG8_1X8 = 0x3002, -+ V4L2_MBUS_FMT_SRGGB8_1X8 = 0x3014, - V4L2_MBUS_FMT_SBGGR10_DPCM8_1X8 = 0x300b, - V4L2_MBUS_FMT_SGBRG10_DPCM8_1X8 = 0x300c, - V4L2_MBUS_FMT_SGRBG10_DPCM8_1X8 = 0x3009, -diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h -index aa6c393..be82c8e 100644 ---- a/include/linux/videodev2.h -+++ b/include/linux/videodev2.h -@@ -308,6 +308,7 @@ struct v4l2_pix_format { - #define V4L2_PIX_FMT_Y4 v4l2_fourcc('Y', '0', '4', ' ') /* 4 Greyscale */ - #define V4L2_PIX_FMT_Y6 v4l2_fourcc('Y', '0', '6', ' ') /* 6 Greyscale */ - #define V4L2_PIX_FMT_Y10 v4l2_fourcc('Y', '1', '0', ' ') /* 10 Greyscale */ -+#define V4L2_PIX_FMT_Y12 v4l2_fourcc('Y', '1', '2', ' ') /* 12 Greyscale */ - #define V4L2_PIX_FMT_Y16 v4l2_fourcc('Y', '1', '6', ' ') /* 16 Greyscale */ - - /* Palette formats */ -diff --git a/include/media/v4l2-device.h b/include/media/v4l2-device.h -index bd102cf..d61febf 100644 ---- a/include/media/v4l2-device.h -+++ b/include/media/v4l2-device.h -@@ -163,7 +163,7 @@ v4l2_device_register_subdev_nodes(struct v4l2_device *v4l2_dev); - ({ \ - struct v4l2_subdev *__sd; \ - __v4l2_device_call_subdevs_until_err_p(v4l2_dev, __sd, cond, o, \ -- f, args...); \ -+ f , ##args); \ - }) - - /* Call the specified callback for all subdevs matching grp_id (if 0, then -diff --git a/init/Kconfig b/init/Kconfig -index 7a71e0a..d886b1e 100644 ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -1226,6 +1226,7 @@ config SLAB - per cpu and per node queues. - - config SLUB -+ depends on BROKEN || NUMA || !DISCONTIGMEM - bool "SLUB (Unqueued Allocator)" - help - SLUB is a slab allocator that minimizes cache line usage -diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c -index 9017478..87fdb3f 100644 ---- a/kernel/hrtimer.c -+++ b/kernel/hrtimer.c -@@ -81,7 +81,11 @@ DEFINE_PER_CPU(struct hrtimer_cpu_base, hrtimer_bases) = - } - }; - --static int hrtimer_clock_to_base_table[MAX_CLOCKS]; -+static int hrtimer_clock_to_base_table[MAX_CLOCKS] = { -+ [CLOCK_REALTIME] = HRTIMER_BASE_REALTIME, -+ [CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC, -+ [CLOCK_BOOTTIME] = HRTIMER_BASE_BOOTTIME, -+}; - - static inline int hrtimer_clockid_to_base(clockid_t clock_id) - { -@@ -1722,10 +1726,6 @@ static struct notifier_block __cpuinitdata hrtimers_nb = { - - void __init hrtimers_init(void) - { -- hrtimer_clock_to_base_table[CLOCK_REALTIME] = HRTIMER_BASE_REALTIME; -- hrtimer_clock_to_base_table[CLOCK_MONOTONIC] = HRTIMER_BASE_MONOTONIC; -- hrtimer_clock_to_base_table[CLOCK_BOOTTIME] = HRTIMER_BASE_BOOTTIME; -- - hrtimer_cpu_notify(&hrtimers_nb, (unsigned long)CPU_UP_PREPARE, - (void *)(long)smp_processor_id()); - register_cpu_notifier(&hrtimers_nb); -diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig -index 61d7d59f..2ad39e5 100644 ---- a/kernel/trace/Kconfig -+++ b/kernel/trace/Kconfig -@@ -141,7 +141,7 @@ if FTRACE - config FUNCTION_TRACER - bool "Kernel Function Tracer" - depends on HAVE_FUNCTION_TRACER -- select FRAME_POINTER if !ARM_UNWIND && !S390 -+ select FRAME_POINTER if !ARM_UNWIND && !S390 && !MICROBLAZE - select KALLSYMS - select GENERIC_TRACER - select CONTEXT_SWITCH_TRACER -diff --git a/kernel/watchdog.c b/kernel/watchdog.c -index 140dce7..14733d4 100644 ---- a/kernel/watchdog.c -+++ b/kernel/watchdog.c -@@ -430,9 +430,12 @@ static int watchdog_enable(int cpu) - p = kthread_create(watchdog, (void *)(unsigned long)cpu, "watchdog/%d", cpu); - if (IS_ERR(p)) { - printk(KERN_ERR "softlockup watchdog for %i failed\n", cpu); -- if (!err) -+ if (!err) { - /* if hardlockup hasn't already set this */ - err = PTR_ERR(p); -+ /* and disable the perf event */ -+ watchdog_nmi_disable(cpu); -+ } - goto out; - } - kthread_bind(p, cpu); -diff --git a/kernel/workqueue.c b/kernel/workqueue.c -index 8859a41..e3378e8 100644 ---- a/kernel/workqueue.c -+++ b/kernel/workqueue.c -@@ -1291,8 +1291,14 @@ __acquires(&gcwq->lock) - return true; - spin_unlock_irq(&gcwq->lock); - -- /* CPU has come up in between, retry migration */ -+ /* -+ * We've raced with CPU hot[un]plug. Give it a breather -+ * and retry migration. cond_resched() is required here; -+ * otherwise, we might deadlock against cpu_stop trying to -+ * bring down the CPU on non-preemptive kernel. -+ */ - cpu_relax(); -+ cond_resched(); - } - } - -diff --git a/lib/xz/xz_dec_lzma2.c b/lib/xz/xz_dec_lzma2.c -index ea5fa4f..a6cdc96 100644 ---- a/lib/xz/xz_dec_lzma2.c -+++ b/lib/xz/xz_dec_lzma2.c -@@ -969,6 +969,9 @@ XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s, - */ - tmp = b->in[b->in_pos++]; - -+ if (tmp == 0x00) -+ return XZ_STREAM_END; -+ - if (tmp >= 0xE0 || tmp == 0x01) { - s->lzma2.need_props = true; - s->lzma2.need_dict_reset = false; -@@ -1001,9 +1004,6 @@ XZ_EXTERN enum xz_ret xz_dec_lzma2_run(struct xz_dec_lzma2 *s, - lzma_reset(s); - } - } else { -- if (tmp == 0x00) -- return XZ_STREAM_END; -- - if (tmp > 0x02) - return XZ_DATA_ERROR; - -diff --git a/mm/huge_memory.c b/mm/huge_memory.c -index 470dcda..83326ad 100644 ---- a/mm/huge_memory.c -+++ b/mm/huge_memory.c -@@ -1408,6 +1408,9 @@ out: - return ret; - } - -+#define VM_NO_THP (VM_SPECIAL|VM_INSERTPAGE|VM_MIXEDMAP|VM_SAO| \ -+ VM_HUGETLB|VM_SHARED|VM_MAYSHARE) -+ - int hugepage_madvise(struct vm_area_struct *vma, - unsigned long *vm_flags, int advice) - { -@@ -1416,11 +1419,7 @@ int hugepage_madvise(struct vm_area_struct *vma, - /* - * Be somewhat over-protective like KSM for now! - */ -- if (*vm_flags & (VM_HUGEPAGE | -- VM_SHARED | VM_MAYSHARE | -- VM_PFNMAP | VM_IO | VM_DONTEXPAND | -- VM_RESERVED | VM_HUGETLB | VM_INSERTPAGE | -- VM_MIXEDMAP | VM_SAO)) -+ if (*vm_flags & (VM_HUGEPAGE | VM_NO_THP)) - return -EINVAL; - *vm_flags &= ~VM_NOHUGEPAGE; - *vm_flags |= VM_HUGEPAGE; -@@ -1436,11 +1435,7 @@ int hugepage_madvise(struct vm_area_struct *vma, - /* - * Be somewhat over-protective like KSM for now! - */ -- if (*vm_flags & (VM_NOHUGEPAGE | -- VM_SHARED | VM_MAYSHARE | -- VM_PFNMAP | VM_IO | VM_DONTEXPAND | -- VM_RESERVED | VM_HUGETLB | VM_INSERTPAGE | -- VM_MIXEDMAP | VM_SAO)) -+ if (*vm_flags & (VM_NOHUGEPAGE | VM_NO_THP)) - return -EINVAL; - *vm_flags &= ~VM_HUGEPAGE; - *vm_flags |= VM_NOHUGEPAGE; -@@ -1574,10 +1569,14 @@ int khugepaged_enter_vma_merge(struct vm_area_struct *vma) - * page fault if needed. - */ - return 0; -- if (vma->vm_file || vma->vm_ops) -+ if (vma->vm_ops) - /* khugepaged not yet working on file or special mappings */ - return 0; -- VM_BUG_ON(is_linear_pfn_mapping(vma) || is_pfn_mapping(vma)); -+ /* -+ * If is_pfn_mapping() is true is_learn_pfn_mapping() must be -+ * true too, verify it here. -+ */ -+ VM_BUG_ON(is_linear_pfn_mapping(vma) || vma->vm_flags & VM_NO_THP); - hstart = (vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK; - hend = vma->vm_end & HPAGE_PMD_MASK; - if (hstart < hend) -@@ -1828,12 +1827,15 @@ static void collapse_huge_page(struct mm_struct *mm, - (vma->vm_flags & VM_NOHUGEPAGE)) - goto out; - -- /* VM_PFNMAP vmas may have vm_ops null but vm_file set */ -- if (!vma->anon_vma || vma->vm_ops || vma->vm_file) -+ if (!vma->anon_vma || vma->vm_ops) - goto out; - if (is_vma_temporary_stack(vma)) - goto out; -- VM_BUG_ON(is_linear_pfn_mapping(vma) || is_pfn_mapping(vma)); -+ /* -+ * If is_pfn_mapping() is true is_learn_pfn_mapping() must be -+ * true too, verify it here. -+ */ -+ VM_BUG_ON(is_linear_pfn_mapping(vma) || vma->vm_flags & VM_NO_THP); - - pgd = pgd_offset(mm, address); - if (!pgd_present(*pgd)) -@@ -2066,13 +2068,16 @@ static unsigned int khugepaged_scan_mm_slot(unsigned int pages, - progress++; - continue; - } -- /* VM_PFNMAP vmas may have vm_ops null but vm_file set */ -- if (!vma->anon_vma || vma->vm_ops || vma->vm_file) -+ if (!vma->anon_vma || vma->vm_ops) - goto skip; - if (is_vma_temporary_stack(vma)) - goto skip; -- -- VM_BUG_ON(is_linear_pfn_mapping(vma) || is_pfn_mapping(vma)); -+ /* -+ * If is_pfn_mapping() is true is_learn_pfn_mapping() -+ * must be true too, verify it here. -+ */ -+ VM_BUG_ON(is_linear_pfn_mapping(vma) || -+ vma->vm_flags & VM_NO_THP); - - hstart = (vma->vm_start + ~HPAGE_PMD_MASK) & HPAGE_PMD_MASK; - hend = vma->vm_end & HPAGE_PMD_MASK; -diff --git a/mm/memory.c b/mm/memory.c -index ce22a25..607098d4 100644 ---- a/mm/memory.c -+++ b/mm/memory.c -@@ -3396,7 +3396,7 @@ int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, - * run pte_offset_map on the pmd, if an huge pmd could - * materialize from under us from a different thread. - */ -- if (unlikely(__pte_alloc(mm, vma, pmd, address))) -+ if (unlikely(pmd_none(*pmd)) && __pte_alloc(mm, vma, pmd, address)) - return VM_FAULT_OOM; - /* if an huge pmd materialized from under us just retry later */ - if (unlikely(pmd_trans_huge(*pmd))) -diff --git a/mm/oom_kill.c b/mm/oom_kill.c -index 83fb72c1..f52e85c 100644 ---- a/mm/oom_kill.c -+++ b/mm/oom_kill.c -@@ -172,10 +172,13 @@ unsigned int oom_badness(struct task_struct *p, struct mem_cgroup *mem, - - /* - * The baseline for the badness score is the proportion of RAM that each -- * task's rss and swap space use. -+ * task's rss, pagetable and swap space use. - */ -- points = (get_mm_rss(p->mm) + get_mm_counter(p->mm, MM_SWAPENTS)) * 1000 / -- totalpages; -+ points = get_mm_rss(p->mm) + p->mm->nr_ptes; -+ points += get_mm_counter(p->mm, MM_SWAPENTS); -+ -+ points *= 1000; -+ points /= totalpages; - task_unlock(p); - - /* -diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c -index c83f618..b5a8afc 100644 ---- a/net/bluetooth/hci_core.c -+++ b/net/bluetooth/hci_core.c -@@ -587,10 +587,8 @@ static int hci_dev_do_close(struct hci_dev *hdev) - hci_req_cancel(hdev, ENODEV); - hci_req_lock(hdev); - -- /* Stop timer, it might be running */ -- del_timer_sync(&hdev->cmd_timer); -- - if (!test_and_clear_bit(HCI_UP, &hdev->flags)) { -+ del_timer_sync(&hdev->cmd_timer); - hci_req_unlock(hdev); - return 0; - } -@@ -629,6 +627,7 @@ static int hci_dev_do_close(struct hci_dev *hdev) - - /* Drop last sent command */ - if (hdev->sent_cmd) { -+ del_timer_sync(&hdev->cmd_timer); - kfree_skb(hdev->sent_cmd); - hdev->sent_cmd = NULL; - } -diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c -index cebe7588..b257015 100644 ---- a/net/bluetooth/hci_event.c -+++ b/net/bluetooth/hci_event.c -@@ -2387,8 +2387,6 @@ static inline void hci_io_capa_reply_evt(struct hci_dev *hdev, struct sk_buff *s - if (!conn) - goto unlock; - -- hci_conn_hold(conn); -- - conn->remote_cap = ev->capability; - conn->remote_oob = ev->oob_data; - conn->remote_auth = ev->authentication; -diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c -index ca27f3a..2c8dd44 100644 ---- a/net/bluetooth/l2cap_core.c -+++ b/net/bluetooth/l2cap_core.c -@@ -1051,6 +1051,7 @@ static void l2cap_retransmit_one_frame(struct sock *sk, u8 tx_seq) - tx_skb = skb_clone(skb, GFP_ATOMIC); - bt_cb(skb)->retries++; - control = get_unaligned_le16(tx_skb->data + L2CAP_HDR_SIZE); -+ control &= L2CAP_CTRL_SAR; - - if (pi->conn_state & L2CAP_CONN_SEND_FBIT) { - control |= L2CAP_CTRL_FINAL; -diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c -index 42fdffd..94954c7 100644 ---- a/net/bluetooth/sco.c -+++ b/net/bluetooth/sco.c -@@ -369,6 +369,15 @@ static void __sco_sock_close(struct sock *sk) - - case BT_CONNECTED: - case BT_CONFIG: -+ if (sco_pi(sk)->conn) { -+ sk->sk_state = BT_DISCONN; -+ sco_sock_set_timer(sk, SCO_DISCONN_TIMEOUT); -+ hci_conn_put(sco_pi(sk)->conn->hcon); -+ sco_pi(sk)->conn = NULL; -+ } else -+ sco_chan_del(sk, ECONNRESET); -+ break; -+ - case BT_CONNECT: - case BT_DISCONN: - sco_chan_del(sk, ECONNRESET); -diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c -index e216079..0c7bada 100644 ---- a/net/bridge/br_input.c -+++ b/net/bridge/br_input.c -@@ -164,7 +164,7 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb) - goto drop; - - /* If STP is turned off, then forward */ -- if (p->br->stp_enabled == BR_NO_STP) -+ if (p->br->stp_enabled == BR_NO_STP && dest[5] == 0) - goto forward; - - if (NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_IN, skb, skb->dev, -diff --git a/net/can/bcm.c b/net/can/bcm.c -index 57b1aed..8a6a05e 100644 ---- a/net/can/bcm.c -+++ b/net/can/bcm.c -@@ -1427,9 +1427,14 @@ static int bcm_init(struct sock *sk) - static int bcm_release(struct socket *sock) - { - struct sock *sk = sock->sk; -- struct bcm_sock *bo = bcm_sk(sk); -+ struct bcm_sock *bo; - struct bcm_op *op, *next; - -+ if (sk == NULL) -+ return 0; -+ -+ bo = bcm_sk(sk); -+ - /* remove bcm_ops, timer, rx_unregister(), etc. */ - - unregister_netdevice_notifier(&bo->notifier); -diff --git a/net/can/raw.c b/net/can/raw.c -index 649acfa..0eb39a7 100644 ---- a/net/can/raw.c -+++ b/net/can/raw.c -@@ -305,7 +305,12 @@ static int raw_init(struct sock *sk) - static int raw_release(struct socket *sock) - { - struct sock *sk = sock->sk; -- struct raw_sock *ro = raw_sk(sk); -+ struct raw_sock *ro; -+ -+ if (!sk) -+ return 0; -+ -+ ro = raw_sk(sk); - - unregister_netdevice_notifier(&ro->notifier); - -diff --git a/net/core/dev.c b/net/core/dev.c -index c2ac599..856b6ee 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -4773,7 +4773,7 @@ static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cm - * is never reached - */ - WARN_ON(1); -- err = -EINVAL; -+ err = -ENOTTY; - break; - - } -@@ -5041,7 +5041,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg) - /* Set the per device memory buffer space. - * Not applicable in our case */ - case SIOCSIFLINK: -- return -EINVAL; -+ return -ENOTTY; - - /* - * Unknown or private ioctl. -@@ -5062,7 +5062,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg) - /* Take care of Wireless Extensions */ - if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) - return wext_handle_ioctl(net, &ifr, cmd, arg); -- return -EINVAL; -+ return -ENOTTY; - } - } - -diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig -index 87bb5f4..c53ded2 100644 ---- a/net/dsa/Kconfig -+++ b/net/dsa/Kconfig -@@ -41,12 +41,12 @@ config NET_DSA_MV88E6XXX_NEED_PPU - default n - - config NET_DSA_MV88E6131 -- bool "Marvell 88E6095/6095F/6131 ethernet switch chip support" -+ bool "Marvell 88E6085/6095/6095F/6131 ethernet switch chip support" - select NET_DSA_MV88E6XXX - select NET_DSA_MV88E6XXX_NEED_PPU - select NET_DSA_TAG_DSA - ---help--- -- This enables support for the Marvell 88E6095/6095F/6131 -+ This enables support for the Marvell 88E6085/6095/6095F/6131 - ethernet switch chips. - - config NET_DSA_MV88E6123_61_65 -diff --git a/net/dsa/mv88e6131.c b/net/dsa/mv88e6131.c -index 3da4188..45f7411 100644 ---- a/net/dsa/mv88e6131.c -+++ b/net/dsa/mv88e6131.c -@@ -207,8 +207,15 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p) - * mode, but do not enable forwarding of unknown unicasts. - */ - val = 0x0433; -- if (p == dsa_upstream_port(ds)) -+ if (p == dsa_upstream_port(ds)) { - val |= 0x0104; -+ /* -+ * On 6085, unknown multicast forward is controlled -+ * here rather than in Port Control 2 register. -+ */ -+ if (ps->id == ID_6085) -+ val |= 0x0008; -+ } - if (ds->dsa_port_mask & (1 << p)) - val |= 0x0100; - REG_WRITE(addr, 0x04, val); -@@ -251,10 +258,19 @@ static int mv88e6131_setup_port(struct dsa_switch *ds, int p) - * If this is the upstream port for this switch, enable - * forwarding of unknown multicast addresses. - */ -- val = 0x0080 | dsa_upstream_port(ds); -- if (p == dsa_upstream_port(ds)) -- val |= 0x0040; -- REG_WRITE(addr, 0x08, val); -+ if (ps->id == ID_6085) -+ /* -+ * on 6085, bits 3:0 are reserved, bit 6 control ARP -+ * mirroring, and multicast forward is handled in -+ * Port Control register. -+ */ -+ REG_WRITE(addr, 0x08, 0x0080); -+ else { -+ val = 0x0080 | dsa_upstream_port(ds); -+ if (p == dsa_upstream_port(ds)) -+ val |= 0x0040; -+ REG_WRITE(addr, 0x08, val); -+ } - - /* - * Rate Control: disable ingress rate limiting. -diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c -index 5345b0b..cd9ca08 100644 ---- a/net/ipv4/devinet.c -+++ b/net/ipv4/devinet.c -@@ -1680,7 +1680,7 @@ static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf) - return; - - cnf->sysctl = NULL; -- unregister_sysctl_table(t->sysctl_header); -+ unregister_net_sysctl_table(t->sysctl_header); - kfree(t->dev_name); - kfree(t); - } -diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c -index e9013d6..5fe9b8b 100644 ---- a/net/ipv4/fib_trie.c -+++ b/net/ipv4/fib_trie.c -@@ -1978,9 +1978,6 @@ struct fib_table *fib_trie_table(u32 id) - t = (struct trie *) tb->tb_data; - memset(t, 0, sizeof(*t)); - -- if (id == RT_TABLE_LOCAL) -- pr_info("IPv4 FIB: Using LC-trie version %s\n", VERSION); -- - return tb; - } - -diff --git a/net/ipv4/route.c b/net/ipv4/route.c -index c1acf69..99e6e4b 100644 ---- a/net/ipv4/route.c -+++ b/net/ipv4/route.c -@@ -2690,6 +2690,12 @@ static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu) - { - } - -+static u32 *ipv4_rt_blackhole_cow_metrics(struct dst_entry *dst, -+ unsigned long old) -+{ -+ return NULL; -+} -+ - static struct dst_ops ipv4_dst_blackhole_ops = { - .family = AF_INET, - .protocol = cpu_to_be16(ETH_P_IP), -@@ -2698,6 +2704,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = { - .default_mtu = ipv4_blackhole_default_mtu, - .default_advmss = ipv4_default_advmss, - .update_pmtu = ipv4_rt_blackhole_update_pmtu, -+ .cow_metrics = ipv4_rt_blackhole_cow_metrics, - }; - - struct dst_entry *ipv4_blackhole_route(struct net *net, struct dst_entry *dst_orig) -diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c -index 1493534..a7bda07 100644 ---- a/net/ipv6/addrconf.c -+++ b/net/ipv6/addrconf.c -@@ -4537,7 +4537,7 @@ static void __addrconf_sysctl_unregister(struct ipv6_devconf *p) - - t = p->sysctl; - p->sysctl = NULL; -- unregister_sysctl_table(t->sysctl_header); -+ unregister_net_sysctl_table(t->sysctl_header); - kfree(t->dev_name); - kfree(t); - } -diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c -index 5aa8ec8..59dccfb 100644 ---- a/net/ipv6/esp6.c -+++ b/net/ipv6/esp6.c -@@ -371,7 +371,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb) - iv = esp_tmp_iv(aead, tmp, seqhilen); - req = esp_tmp_req(aead, iv); - asg = esp_req_sg(aead, req); -- sg = asg + 1; -+ sg = asg + sglists; - - skb->ip_summed = CHECKSUM_NONE; - -diff --git a/net/ipv6/route.c b/net/ipv6/route.c -index 843406f..fd0eec6 100644 ---- a/net/ipv6/route.c -+++ b/net/ipv6/route.c -@@ -153,6 +153,12 @@ static void ip6_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu) - { - } - -+static u32 *ip6_rt_blackhole_cow_metrics(struct dst_entry *dst, -+ unsigned long old) -+{ -+ return NULL; -+} -+ - static struct dst_ops ip6_dst_blackhole_ops = { - .family = AF_INET6, - .protocol = cpu_to_be16(ETH_P_IPV6), -@@ -161,6 +167,7 @@ static struct dst_ops ip6_dst_blackhole_ops = { - .default_mtu = ip6_blackhole_default_mtu, - .default_advmss = ip6_default_advmss, - .update_pmtu = ip6_rt_blackhole_update_pmtu, -+ .cow_metrics = ip6_rt_blackhole_cow_metrics, - }; - - static const u32 ip6_template_metrics[RTAX_MAX] = { -@@ -2012,7 +2019,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, - rt->dst.output = ip6_output; - rt->rt6i_dev = net->loopback_dev; - rt->rt6i_idev = idev; -- dst_metric_set(&rt->dst, RTAX_HOPLIMIT, -1); - rt->dst.obsolete = -1; - - rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP; -diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c -index 15c3774..9e305d74 100644 ---- a/net/ipv6/udp.c -+++ b/net/ipv6/udp.c -@@ -1335,7 +1335,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, u32 features) - skb->ip_summed = CHECKSUM_NONE; - - /* Check if there is enough headroom to insert fragment header. */ -- if ((skb_headroom(skb) < frag_hdr_sz) && -+ if ((skb_mac_header(skb) < skb->head + frag_hdr_sz) && - pskb_expand_head(skb, frag_hdr_sz, 0, GFP_ATOMIC)) - goto out; - -diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c -index fce9bd3..5c04f3e 100644 ---- a/net/l2tp/l2tp_ip.c -+++ b/net/l2tp/l2tp_ip.c -@@ -667,7 +667,7 @@ MODULE_AUTHOR("James Chapman "); - MODULE_DESCRIPTION("L2TP over IP"); - MODULE_VERSION("1.0"); - --/* Use the value of SOCK_DGRAM (2) directory, because __stringify does't like -+/* Use the value of SOCK_DGRAM (2) directory, because __stringify doesn't like - * enums - */ - MODULE_ALIAS_NET_PF_PROTO_TYPE(PF_INET, 2, IPPROTO_L2TP); -diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c -index 3342135..4404973 100644 ---- a/net/mac80211/cfg.c -+++ b/net/mac80211/cfg.c -@@ -1504,6 +1504,8 @@ int __ieee80211_request_smps(struct ieee80211_sub_if_data *sdata, - enum ieee80211_smps_mode old_req; - int err; - -+ lockdep_assert_held(&sdata->u.mgd.mtx); -+ - old_req = sdata->u.mgd.req_smps; - sdata->u.mgd.req_smps = smps_mode; - -diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c -index dacace6..9ea7c0d 100644 ---- a/net/mac80211/debugfs_netdev.c -+++ b/net/mac80211/debugfs_netdev.c -@@ -177,9 +177,9 @@ static int ieee80211_set_smps(struct ieee80211_sub_if_data *sdata, - if (sdata->vif.type != NL80211_IFTYPE_STATION) - return -EOPNOTSUPP; - -- mutex_lock(&local->iflist_mtx); -+ mutex_lock(&sdata->u.mgd.mtx); - err = __ieee80211_request_smps(sdata, smps_mode); -- mutex_unlock(&local->iflist_mtx); -+ mutex_unlock(&sdata->u.mgd.mtx); - - return err; - } -diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c -index dff27d5..61b1f5a 100644 ---- a/net/sctp/ulpevent.c -+++ b/net/sctp/ulpevent.c -@@ -554,7 +554,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_send_failed( - memcpy(&ssf->ssf_info, &chunk->sinfo, sizeof(struct sctp_sndrcvinfo)); - - /* Per TSVWG discussion with Randy. Allow the application to -- * resemble a fragmented message. -+ * reassemble a fragmented message. - */ - ssf->ssf_info.sinfo_flags = chunk->chunk_hdr->flags; - -diff --git a/net/sunrpc/Kconfig b/net/sunrpc/Kconfig -index 8873fd8..b2198e6 100644 ---- a/net/sunrpc/Kconfig -+++ b/net/sunrpc/Kconfig -@@ -18,14 +18,13 @@ config SUNRPC_XPRT_RDMA - If unsure, say N. - - config RPCSEC_GSS_KRB5 -- tristate -+ tristate "Secure RPC: Kerberos V mechanism" - depends on SUNRPC && CRYPTO -- prompt "Secure RPC: Kerberos V mechanism" if !(NFS_V4 || NFSD_V4) -+ depends on CRYPTO_MD5 && CRYPTO_DES && CRYPTO_CBC && CRYPTO_CTS -+ depends on CRYPTO_ECB && CRYPTO_HMAC && CRYPTO_SHA1 && CRYPTO_AES -+ depends on CRYPTO_ARC4 - default y - select SUNRPC_GSS -- select CRYPTO_MD5 -- select CRYPTO_DES -- select CRYPTO_CBC - help - Choose Y here to enable Secure RPC using the Kerberos version 5 - GSS-API mechanism (RFC 1964). -diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c -index f3914d0..339ba64 100644 ---- a/net/sunrpc/auth_gss/auth_gss.c -+++ b/net/sunrpc/auth_gss/auth_gss.c -@@ -520,7 +520,7 @@ gss_refresh_upcall(struct rpc_task *task) - warn_gssd(); - task->tk_timeout = 15*HZ; - rpc_sleep_on(&pipe_version_rpc_waitqueue, task, NULL); -- return 0; -+ return -EAGAIN; - } - if (IS_ERR(gss_msg)) { - err = PTR_ERR(gss_msg); -@@ -563,10 +563,12 @@ retry: - if (PTR_ERR(gss_msg) == -EAGAIN) { - err = wait_event_interruptible_timeout(pipe_version_waitqueue, - pipe_version >= 0, 15*HZ); -+ if (pipe_version < 0) { -+ warn_gssd(); -+ err = -EACCES; -+ } - if (err) - goto out; -- if (pipe_version < 0) -- warn_gssd(); - goto retry; - } - if (IS_ERR(gss_msg)) { -diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c -index e7a96e4..8d83f9d 100644 ---- a/net/sunrpc/clnt.c -+++ b/net/sunrpc/clnt.c -@@ -1508,7 +1508,10 @@ call_timeout(struct rpc_task *task) - if (clnt->cl_chatty) - printk(KERN_NOTICE "%s: server %s not responding, timed out\n", - clnt->cl_protname, clnt->cl_server); -- rpc_exit(task, -EIO); -+ if (task->tk_flags & RPC_TASK_TIMEOUT) -+ rpc_exit(task, -ETIMEDOUT); -+ else -+ rpc_exit(task, -EIO); - return; - } - -diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c -index 9494c37..ce5eb68 100644 ---- a/net/sunrpc/xprt.c -+++ b/net/sunrpc/xprt.c -@@ -906,6 +906,7 @@ void xprt_transmit(struct rpc_task *task) - } - - dprintk("RPC: %5u xmit complete\n", task->tk_pid); -+ task->tk_flags |= RPC_TASK_SENT; - spin_lock_bh(&xprt->transport_lock); - - xprt->ops->set_retrans_timeout(task); -diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c -index 3a43a83..b1d75be 100644 ---- a/net/unix/af_unix.c -+++ b/net/unix/af_unix.c -@@ -524,6 +524,8 @@ static int unix_dgram_connect(struct socket *, struct sockaddr *, - int, int); - static int unix_seqpacket_sendmsg(struct kiocb *, struct socket *, - struct msghdr *, size_t); -+static int unix_seqpacket_recvmsg(struct kiocb *, struct socket *, -+ struct msghdr *, size_t, int); - - static const struct proto_ops unix_stream_ops = { - .family = PF_UNIX, -@@ -583,7 +585,7 @@ static const struct proto_ops unix_seqpacket_ops = { - .setsockopt = sock_no_setsockopt, - .getsockopt = sock_no_getsockopt, - .sendmsg = unix_seqpacket_sendmsg, -- .recvmsg = unix_dgram_recvmsg, -+ .recvmsg = unix_seqpacket_recvmsg, - .mmap = sock_no_mmap, - .sendpage = sock_no_sendpage, - }; -@@ -1699,6 +1701,18 @@ static int unix_seqpacket_sendmsg(struct kiocb *kiocb, struct socket *sock, - return unix_dgram_sendmsg(kiocb, sock, msg, len); - } - -+static int unix_seqpacket_recvmsg(struct kiocb *iocb, struct socket *sock, -+ struct msghdr *msg, size_t size, -+ int flags) -+{ -+ struct sock *sk = sock->sk; -+ -+ if (sk->sk_state != TCP_ESTABLISHED) -+ return -ENOTCONN; -+ -+ return unix_dgram_recvmsg(iocb, sock, msg, size, flags); -+} -+ - static void unix_copy_addr(struct msghdr *msg, struct sock *sk) - { - struct unix_sock *u = unix_sk(sk); -diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c -index f218385..e8a7814 100644 ---- a/net/xfrm/xfrm_replay.c -+++ b/net/xfrm/xfrm_replay.c -@@ -532,7 +532,7 @@ int xfrm_init_replay(struct xfrm_state *x) - - if (replay_esn) { - if (replay_esn->replay_window > -- replay_esn->bmp_len * sizeof(__u32)) -+ replay_esn->bmp_len * sizeof(__u32) * 8) - return -EINVAL; - - if ((x->props.flags & XFRM_STATE_ESN) && x->replay_esn) -diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c -index 5d1d60d..c658cb3 100644 ---- a/net/xfrm/xfrm_user.c -+++ b/net/xfrm/xfrm_user.c -@@ -124,6 +124,9 @@ static inline int verify_replay(struct xfrm_usersa_info *p, - { - struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL]; - -+ if ((p->flags & XFRM_STATE_ESN) && !rt) -+ return -EINVAL; -+ - if (!rt) - return 0; - -diff --git a/sound/aoa/codecs/tas.c b/sound/aoa/codecs/tas.c -index 58804c7..fd2188c 100644 ---- a/sound/aoa/codecs/tas.c -+++ b/sound/aoa/codecs/tas.c -@@ -170,7 +170,7 @@ static void tas_set_volume(struct tas *tas) - /* analysing the volume and mixer tables shows - * that they are similar enough when we shift - * the mixer table down by 4 bits. The error -- * is minuscule, in just one item the error -+ * is miniscule, in just one item the error - * is 1, at a value of 0x07f17b (mixer table - * value is 0x07f17a) */ - tmp = tas_gaintable[left]; -diff --git a/sound/pci/au88x0/au88x0_pcm.c b/sound/pci/au88x0/au88x0_pcm.c -index 33f0ba5..62e9591 100644 ---- a/sound/pci/au88x0/au88x0_pcm.c -+++ b/sound/pci/au88x0/au88x0_pcm.c -@@ -44,10 +44,10 @@ static struct snd_pcm_hardware snd_vortex_playback_hw_adb = { - .channels_min = 1, - .channels_max = 2, - .buffer_bytes_max = 0x10000, -- .period_bytes_min = 0x1, -+ .period_bytes_min = 0x20, - .period_bytes_max = 0x1000, - .periods_min = 2, -- .periods_max = 32, -+ .periods_max = 1024, - }; - - #ifndef CHIP_AU8820 -@@ -140,6 +140,9 @@ static int snd_vortex_pcm_open(struct snd_pcm_substream *substream) - SNDRV_PCM_HW_PARAM_PERIOD_BYTES)) < 0) - return err; - -+ snd_pcm_hw_constraint_step(runtime, 0, -+ SNDRV_PCM_HW_PARAM_BUFFER_BYTES, 64); -+ - if (VORTEX_PCM_TYPE(substream->pcm) != VORTEX_PCM_WT) { - #ifndef CHIP_AU8820 - if (VORTEX_PCM_TYPE(substream->pcm) == VORTEX_PCM_A3D) { -diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c -index d3bd2c1..c82979a 100644 ---- a/sound/pci/hda/patch_realtek.c -+++ b/sound/pci/hda/patch_realtek.c -@@ -1704,11 +1704,11 @@ static void alc_apply_fixup(struct hda_codec *codec, int action) - codec->chip_name, fix->type); - break; - } -- if (!fix[id].chained) -+ if (!fix->chained) - break; - if (++depth > 10) - break; -- id = fix[id].chain_id; -+ id = fix->chain_id; - } - } - -@@ -5645,6 +5645,7 @@ static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids, - static struct snd_pci_quirk beep_white_list[] = { - SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), - SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1), -+ SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1), - SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1), - {} - }; -@@ -9863,6 +9864,7 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = { - SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD), - SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL), - SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch), -+ SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG), - - SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG), - SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG), -@@ -10699,7 +10701,6 @@ enum { - PINFIX_LENOVO_Y530, - PINFIX_PB_M5210, - PINFIX_ACER_ASPIRE_7736, -- PINFIX_GIGABYTE_880GM, - }; - - static const struct alc_fixup alc882_fixups[] = { -@@ -10731,13 +10732,6 @@ static const struct alc_fixup alc882_fixups[] = { - .type = ALC_FIXUP_SKU, - .v.sku = ALC_FIXUP_SKU_IGNORE, - }, -- [PINFIX_GIGABYTE_880GM] = { -- .type = ALC_FIXUP_PINS, -- .v.pins = (const struct alc_pincfg[]) { -- { 0x14, 0x1114410 }, /* set as speaker */ -- { } -- } -- }, - }; - - static struct snd_pci_quirk alc882_fixup_tbl[] = { -@@ -10745,7 +10739,6 @@ static struct snd_pci_quirk alc882_fixup_tbl[] = { - SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", PINFIX_LENOVO_Y530), - SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX), - SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", PINFIX_ACER_ASPIRE_7736), -- SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte", PINFIX_GIGABYTE_880GM), - {} - }; - -@@ -18805,6 +18798,8 @@ static struct snd_pci_quirk alc662_cfg_tbl[] = { - ALC662_3ST_6ch_DIG), - SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO), - SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10), -+ SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L", -+ ALC662_3ST_6ch_DIG), - SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13), - SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG), - SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA), -@@ -19478,7 +19473,7 @@ enum { - ALC662_FIXUP_IDEAPAD, - ALC272_FIXUP_MARIO, - ALC662_FIXUP_CZC_P10T, -- ALC662_FIXUP_GIGABYTE, -+ ALC662_FIXUP_SKU_IGNORE, - }; - - static const struct alc_fixup alc662_fixups[] = { -@@ -19507,20 +19502,17 @@ static const struct alc_fixup alc662_fixups[] = { - {} - } - }, -- [ALC662_FIXUP_GIGABYTE] = { -- .type = ALC_FIXUP_PINS, -- .v.pins = (const struct alc_pincfg[]) { -- { 0x14, 0x1114410 }, /* set as speaker */ -- { } -- } -+ [ALC662_FIXUP_SKU_IGNORE] = { -+ .type = ALC_FIXUP_SKU, -+ .v.sku = ALC_FIXUP_SKU_IGNORE, - }, - }; - - static struct snd_pci_quirk alc662_fixup_tbl[] = { - SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE), -+ SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE), - SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE), - SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD), -- SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte", ALC662_FIXUP_GIGABYTE), - SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD), - SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD), - SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T), -diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c -index 1371b57..0997031 100644 ---- a/sound/pci/hda/patch_via.c -+++ b/sound/pci/hda/patch_via.c -@@ -1292,14 +1292,18 @@ static void notify_aa_path_ctls(struct hda_codec *codec) - { - int i; - struct snd_ctl_elem_id id; -- const char *labels[] = {"Mic", "Front Mic", "Line"}; -+ const char *labels[] = {"Mic", "Front Mic", "Line", "Rear Mic"}; -+ struct snd_kcontrol *ctl; - - memset(&id, 0, sizeof(id)); - id.iface = SNDRV_CTL_ELEM_IFACE_MIXER; - for (i = 0; i < ARRAY_SIZE(labels); i++) { - sprintf(id.name, "%s Playback Volume", labels[i]); -- snd_ctl_notify(codec->bus->card, SNDRV_CTL_EVENT_MASK_VALUE, -- &id); -+ ctl = snd_hda_find_mixer_ctl(codec, id.name); -+ if (ctl) -+ snd_ctl_notify(codec->bus->card, -+ SNDRV_CTL_EVENT_MASK_VALUE, -+ &ctl->id); - } - } - -diff --git a/sound/usb/format.c b/sound/usb/format.c -index 5b792d2..f079b5e 100644 ---- a/sound/usb/format.c -+++ b/sound/usb/format.c -@@ -176,9 +176,11 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof - if (!rate) - continue; - /* C-Media CM6501 mislabels its 96 kHz altsetting */ -+ /* Terratec Aureon 7.1 USB C-Media 6206, too */ - if (rate == 48000 && nr_rates == 1 && - (chip->usb_id == USB_ID(0x0d8c, 0x0201) || -- chip->usb_id == USB_ID(0x0d8c, 0x0102)) && -+ chip->usb_id == USB_ID(0x0d8c, 0x0102) || -+ chip->usb_id == USB_ID(0x0ccd, 0x00b1)) && - fp->altsetting == 5 && fp->maxpacksize == 392) - rate = 96000; - /* Creative VF0470 Live Cam reports 16 kHz instead of 8kHz */ -diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c -index ec07e62..1b94ec3 100644 ---- a/sound/usb/quirks.c -+++ b/sound/usb/quirks.c -@@ -533,6 +533,7 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev, - - case USB_ID(0x0d8c, 0x0102): - /* C-Media CM6206 / CM106-Like Sound Device */ -+ case USB_ID(0x0ccd, 0x00b1): /* Terratec Aureon 7.1 USB */ - return snd_usb_cm6206_boot_quirk(dev); - - case USB_ID(0x133e, 0x0815): diff --git a/packages/linux/patches/linux-2.6.39-rc5-000_crosscompile.patch b/packages/linux/patches/linux-2.6.39-rc6-000_crosscompile.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-000_crosscompile.patch rename to packages/linux/patches/linux-2.6.39-rc6-000_crosscompile.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-002_bash_only_feature.patch b/packages/linux/patches/linux-2.6.39-rc6-002_bash_only_feature.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-002_bash_only_feature.patch rename to packages/linux/patches/linux-2.6.39-rc6-002_bash_only_feature.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-003-no_dev_console.patch b/packages/linux/patches/linux-2.6.39-rc6-003-no_dev_console.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-003-no_dev_console.patch rename to packages/linux/patches/linux-2.6.39-rc6-003-no_dev_console.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-004_lower_undefined_mode_timeout.patch b/packages/linux/patches/linux-2.6.39-rc6-004_lower_undefined_mode_timeout.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-004_lower_undefined_mode_timeout.patch rename to packages/linux/patches/linux-2.6.39-rc6-004_lower_undefined_mode_timeout.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-005_kconfig_no_timestamp.patch b/packages/linux/patches/linux-2.6.39-rc6-005_kconfig_no_timestamp.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-005_kconfig_no_timestamp.patch rename to packages/linux/patches/linux-2.6.39-rc6-005_kconfig_no_timestamp.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-006_enable_utf8.patch b/packages/linux/patches/linux-2.6.39-rc6-006_enable_utf8.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-006_enable_utf8.patch rename to packages/linux/patches/linux-2.6.39-rc6-006_enable_utf8.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-007_die_floppy_die.patch b/packages/linux/patches/linux-2.6.39-rc6-007_die_floppy_die.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-007_die_floppy_die.patch rename to packages/linux/patches/linux-2.6.39-rc6-007_die_floppy_die.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-008-hda_intel_prealloc_4mb_dmabuffer.patch b/packages/linux/patches/linux-2.6.39-rc6-008-hda_intel_prealloc_4mb_dmabuffer.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-008-hda_intel_prealloc_4mb_dmabuffer.patch rename to packages/linux/patches/linux-2.6.39-rc6-008-hda_intel_prealloc_4mb_dmabuffer.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-009_disable_i8042_check_on_apple_mac.patch b/packages/linux/patches/linux-2.6.39-rc6-009_disable_i8042_check_on_apple_mac.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-009_disable_i8042_check_on_apple_mac.patch rename to packages/linux/patches/linux-2.6.39-rc6-009_disable_i8042_check_on_apple_mac.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-050_add_appleir_usb_driver.patch b/packages/linux/patches/linux-2.6.39-rc6-050_add_appleir_usb_driver.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-050_add_appleir_usb_driver.patch rename to packages/linux/patches/linux-2.6.39-rc6-050_add_appleir_usb_driver.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-052-aureal_remote_quirk-0.1.patch b/packages/linux/patches/linux-2.6.39-rc6-052-aureal_remote_quirk-0.1.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-052-aureal_remote_quirk-0.1.patch rename to packages/linux/patches/linux-2.6.39-rc6-052-aureal_remote_quirk-0.1.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-053_ati-remote_all_keys_and_keychange-0.1.patch b/packages/linux/patches/linux-2.6.39-rc6-053_ati-remote_all_keys_and_keychange-0.1.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-053_ati-remote_all_keys_and_keychange-0.1.patch rename to packages/linux/patches/linux-2.6.39-rc6-053_ati-remote_all_keys_and_keychange-0.1.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-054_nuvoton-cir-only-warn-about-unknown-chips.patch b/packages/linux/patches/linux-2.6.39-rc6-054_nuvoton-cir-only-warn-about-unknown-chips.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-054_nuvoton-cir-only-warn-about-unknown-chips.patch rename to packages/linux/patches/linux-2.6.39-rc6-054_nuvoton-cir-only-warn-about-unknown-chips.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-055_nuvoton-cir-enable-CIR-on-w83667hg-chip-variant.patch b/packages/linux/patches/linux-2.6.39-rc6-055_nuvoton-cir-enable-CIR-on-w83667hg-chip-variant.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-055_nuvoton-cir-enable-CIR-on-w83667hg-chip-variant.patch rename to packages/linux/patches/linux-2.6.39-rc6-055_nuvoton-cir-enable-CIR-on-w83667hg-chip-variant.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-056_mceusb_add_DELL_receiver-0.1.patch b/packages/linux/patches/linux-2.6.39-rc6-056_mceusb_add_DELL_receiver-0.1.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-056_mceusb_add_DELL_receiver-0.1.patch rename to packages/linux/patches/linux-2.6.39-rc6-056_mceusb_add_DELL_receiver-0.1.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-057_ite-resume-debug-0.1.patch b/packages/linux/patches/linux-2.6.39-rc6-057_ite-resume-debug-0.1.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-057_ite-resume-debug-0.1.patch rename to packages/linux/patches/linux-2.6.39-rc6-057_ite-resume-debug-0.1.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-071-silence_i915_agp-module-0.1.patch b/packages/linux/patches/linux-2.6.39-rc6-071-silence_i915_agp-module-0.1.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-071-silence_i915_agp-module-0.1.patch rename to packages/linux/patches/linux-2.6.39-rc6-071-silence_i915_agp-module-0.1.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-322-omap4_pandaboard_fix_dvi_support-0.1.patch b/packages/linux/patches/linux-2.6.39-rc6-322-omap4_pandaboard_fix_dvi_support-0.1.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-322-omap4_pandaboard_fix_dvi_support-0.1.patch rename to packages/linux/patches/linux-2.6.39-rc6-322-omap4_pandaboard_fix_dvi_support-0.1.patch diff --git a/packages/linux/patches/linux-2.6.39-rc5-716_mm-zero_swappiness.patch b/packages/linux/patches/linux-2.6.39-rc6-716_mm-zero_swappiness.patch similarity index 100% rename from packages/linux/patches/linux-2.6.39-rc5-716_mm-zero_swappiness.patch rename to packages/linux/patches/linux-2.6.39-rc6-716_mm-zero_swappiness.patch From a46a70a881e679dfb07494fbfeb5d2719f359e45 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Wed, 4 May 2011 16:35:45 +0200 Subject: [PATCH 9/9] lcdproc: install preconfigured config file Signed-off-by: Stephan Raue --- packages/sysutils/lcdproc/config/LCDd.conf | 1149 ++++++++++++++++++++ packages/sysutils/lcdproc/install | 2 +- 2 files changed, 1150 insertions(+), 1 deletion(-) create mode 100644 packages/sysutils/lcdproc/config/LCDd.conf diff --git a/packages/sysutils/lcdproc/config/LCDd.conf b/packages/sysutils/lcdproc/config/LCDd.conf new file mode 100644 index 0000000000..47d4764e1a --- /dev/null +++ b/packages/sysutils/lcdproc/config/LCDd.conf @@ -0,0 +1,1149 @@ +# LCDd.conf -- configuration file for the LCDproc server daemon LCDd +# +# This file contains the configuration for the LCDd server. +# +# The format is ini-file-like. It is divided into sections that start at +# markers that look like [section]. Comments are all line-based comments, +# and are lines that start with '#' or ';'. +# +# The server has a 'central' section named [server]. For the menu there is +# a section called [menu]. Further each driver has a section which +# defines how the driver acts. +# +# The drivers are activated by specifiying them in a driver= line in the +# server section, like: +# +# Driver=curses +# +# This tells LCDd to use the curses driver. +# The first driver that is loaded and is capable of output defines the +# size of the display. The default driver to use is curses. +# If the driver is specified using the -d command line option, +# the Driver= options in the config file are ignored. +# +# The drivers read their own options from the respective sections. + + + +## Server section with all kinds of settings for the LCDd server ## +[server] + +# Where can we find the driver modules ? +# IMPORTANT: Make sure to change this setting to reflect your +# specific setup! Otherwise LCDd won't be able to find +# the driver modules and will thus not be able to +# function properly. +# NOTE: Always place a slash as last character ! +DriverPath=/usr/lib/lcdproc/ + +# Tells the server to load the given drivers. Multiple lines can be given. +# The name of the driver is case sensitive and determines the section +# where to look for further configuration options of the specific driver +# as well as the name of the dynamic driver module to load at runtime. +# The latter one can be changed by giving af File= directive in the +# driver specific section. +# +# The following drivers are supported: +# bayrad, CFontz, CFontz633, CFontzPacket, curses, CwLnx, ea65, +# EyeboxOne, g15, glcdlib, glk, hd44780, icp_a106, imon, imonlcd, +# IOWarrior, irman, joy, lb216, lcdm001, lcterm, lirc, lis, MD8800, +# mdm166a, ms6931, mtc_s16209x, MtxOrb, mx5000, NoritakeVFD, picolcd, +# pyramid, sed1330, sed1520, serialPOS, serialVFD, shuttleVFD, sli, +# stv5730, svga, t6963, text, tyan, ula200, xosd +Driver=irtrans + +# Tells the driver to bind to the given interface +Bind=127.0.0.1 + +# Listen on this specified port; defaults to 13666. +Port=13666 + +# Sets the reporting level; defaults to 2 (warnings and errors only). +#ReportLevel=3 + +# Should we report to syslog instead of stderr ? [default: no; legal: yes, no] +#ReportToSyslog=yes + +# User to run as. LCDd will drop its root priviledges, if any, +# and run as this user instead. +User=nobody + +# The server will stay in the foreground if set to true. +Foreground=no + +# Hello message: each entry represents a display line; default: builtin +Hello=" Welcome to" +Hello=" OpenELEC" + +# GoodBye message: each entry represents a display line; default: builtin +#GoodBye="Thanks for using" +#GoodBye=" OpenELEC" + +# Sets the default time in seconds to displays a screen. +WaitTime=5 + +# If yes, the the serverscreen will be rotated as a usual info screen. If no, +# it will be a background screen, only visible when no other screens are +# active. The special value 'blank' is similar to no, but only a blank screen +# is displayed. [default: on; legal: on, off, blank] +ServerScreen=blank + +# Set master backlight setting. If set to 'open' a client may control the +# backlight for its own screens (only). [default: open; legal: off, open, on] +Backlight=open + +# Set master heartbeat setting. If set to 'open' a client may control the +# heartbeat for its own screens (only). [default: open; legal: off, open, on] +Heartbeat=open + +# set title scrolling speed [default: 10; legal: 0-10] +TitleSpeed=4 + +# The "...Key=" lines define what the server does with keypresses that +# don't go to any client. +# These are the defaults: +ToggleRotateKey=Enter +PrevScreenKey=Left +NextScreenKey=Right +#ScrollUpKey=Up +#ScrollDownKey=Down + +# If you have only 4 keys, you can choose to use this: +#ToggleRotateKey=Enter +#PrevScreenKey=Up +#NextScreenKey=Down + +# If you have only 3 keys, you can choose to use this: +#ToggleRotateKey=Enter +#PrevScreenKey=Up + + + +## The menu section. The menu is an internal LCDproc client. ## +[menu] +# You can configure what keys the menu should use. Note that the MenuKey +# will be reserved exclusively, the others work in shared mode. + +# The following works excellent with 4 keys or more. +MenuKey=Escape +EnterKey=Enter +UpKey=Up +DownKey=Down +# If you have 6 keys you may define these as well +#LeftKey=Left +#RightKey=Right + +# If you have only 3 keys, you could use something like this: +#MenuKey=Escape +#EnterKey=Enter +#DownKey=Down + + + +### Driver sections are below this line, in alphabetical order ### + + +## EMAC BayRAD driver ## +[bayrad] + +# Select the output device to use [default: /dev/lcd] +Device=/dev/lcd + +# Set the communication speed [default: 9600; legal: 1200, 2400, 9600, 19200] +Speed=9600 + + + +## CrystalFontz driver (for CF632 & CF634) ## +[CFontz] + +# Select the output device to use [default: /dev/lcd] +Device=/dev/ttyS0 +# Select the LCD size [default: 20x4] +Size=20x4 +# Set the initial contrast [default: 560; legal: 0 - 1000] +Contrast=350 +# Set the initial brightness [default: 1000; legal: 0 - 1000] +Brightness=1000 +# Set the initial off-brightness [default: 0; legal: 0 - 1000] +# This value is used when the display is normally +# switched off in case LCDd is inactive +OffBrightness=0 +# Set the communication speed [default: 9600; legal: 1200, 2400, 9600, 19200 or 115200] +Speed=9600 +# Set the firmware version (New means >= 2.0) [default: no; legal: yes, no] +NewFirmware=no +# Reinitialize the LCD's BIOS [default: no; legal: yes, no] +# normally you shouldn't need this +Reboot=no + + + +## CrystalFontz633 driver (for CF633 only) ## +[CFontz633] +# Note: Use of this driver is deprecated, please use CFontzPacket driver +# with Model=633 instead. + +# Select the output device to use [default: /dev/lcd] +Device=/dev/ttyS0 +# Select the LCD type (size) [default: 16x2] +Size=16x2 +# Set the initial contrast [default: 560; legal: 0 - 1000] +Contrast=350 +# Set the initial brightness [default: 1000; legal: 0 - 1000] +Brightness=1000 +# Set the initial off-brightness [default: 0; legal: 0 - 1000] +# This value is used when the display is normally +# switched off in case LCDd is inactive +OffBrightness=50 +# Set the communication speed [default: 9600; legal: 1200, 2400, 9600, 19200, 115200] +Speed=19200 +# Set the firmware version (New means >= 2.0) [default: no; legal: yes, no] +# Currently this flag is not in use, there is no such thing as NewFirmware. ;=) +#NewFirmware=no +# Reinitialize the LCD's BIOS [default: no; legal: yes, no] +# I want to reboot the LCD to make sure we start from a known state +Reboot=yes + + + +## CrystalFontz packet driver (for CFA533, CFA631, CFA633 & CFA635) ## +[CFontzPacket] + +# Select the LCD model [default: 633; legal: 533, 631, 633, 635] +Model=633 + +# Select the output device to use [default: /dev/lcd] +Device=/dev/ttyUSB0 + +# Set the initial contrast [default: 560; legal: 0 - 1000] +Contrast=350 + +# Set the initial brightness [default: 1000; legal: 0 - 1000] +Brightness=1000 + +# Set the initial off-brightness [default: 0; legal: 0 - 1000] +# This value is used when the display is normally +# switched off in case LCDd is inactive +OffBrightness=50 + +# Reinitialize the LCD's BIOS on driver start. [default: no; legal: yes, no] +Reboot=yes + +# Enable the USB flag if the device is connected to an USB port. For +# serial ports leave it disabled. [default: no; legal: yes, no] +#USB=yes + +# Very old 633 firmware versions do not support partial screen updates using +# 'Send Data to LCD' command (31). For those devices it may be necessary to +# enable this flag. [default: no; legal: yes, no] +#OldFirmware=yes + +# Override the LCD size known for the selected model. Usually setting this +# value should not be necessary. +#Size=20x4 + +# Override the default communication speed known for the selected model. +# [default: depending on model; legal: 19200, 115200] +#Speed=115200 + + + +## Curses driver ## +[curses] + +# color settings +# foreground color [default: blue] +Foreground=blue +# background color when "backlight" is off [default: cyan] +Background=cyan +# background color when "backlight" is on [default: red] +Backlight=red + +# display size [default: 20x4] +Size=20x4 + +# What position (X,Y) to start the left top corner at... +# Default: (7,7) +TopLeftX=7 +TopLeftY=7 + +# use ASC symbols for icons & bars [default: no; legal, yes, no] +UseACS=no + +# draw Border [default: yes; legal: yes, no] +DrawBorder=yes + + + +## Cwlinux driver ## +[CwLnx] + +# Select the LCD model [default: 12232; legal: 12232, 12832, 1602] +Model=12232 + +# Select the output device to use [default: /dev/lcd] +Device=/dev/ttyUSB0 + +# Select the LCD size [default: depending on model: 12232: 20x4, 12832: 21x4, 1602: 16x2] +Size=20x4 + +# Set the communication speed [default: 19200; legal: 9600, 19200] +Speed=19200 + +# Reinitialize the LCD's BIOS [default: no; legal: yes, no] +# normally you shouldn't need this +Reboot=no + +# If you have a keypad connected. Keypad layout is currently not +# configureable from the config file. +Keypad=yes + +# If you have a non-standard keypad you can associate any keystrings to keys. +# There are 6 input keys in the CwLnx hardware that generate characters +# from 'A' to 'F'. +# +# The following is the built-in default mapping hardcoded in the driver. +# You can leave those unchanged if you have a standard keypad. +# You can change it if you want to report other keystrings or have a non +# standard keypad. +# KeyMap_A=Up +# KeyMap_B=Down +# KeyMap_C=Left +# KeyMap_D=Right +# KeyMap_E=Enter +# KeyMap_F=Escape + +# keypad_test_mode permits to test keypad assignement +# Default value is no +#keypad_test_mode=yes + + + +## ea65 driver for the display in AOpen XC Cube AV EA65 media barebones ## +[ea65] + +# Device is fixed /dev/ttyS1 +# Width and Height are fixed 9x1 + +# As the VFD is self luminescent we don't have a backlight +# But we can use the backlight functions to control the front LEDs +# Brightness 0 to 299 -> LEDs off +# Brightness 300 to 699 -> LEDs half bright +# Brightness 700 to 1000 -> LEDs full bright +Brightness=500 +# OffBrightness is the the value used for the 'backlight off' state +OffBrightness=0 + + + +## EyeboxOne driver ## +[EyeboxOne] + +# Select the output device to use [default: /dev/ttyS1] +#Device=/dev/cua01 +Device=/dev/ttyS1 + +# Set the display size [default: 20x4] +Size=20x4 + +# Switch on the backlight? [default: yes] +Backlight=yes + +# Switch on the cursor? [default: no] +Cursor=no + +# Set the communication speed [default: 19200; legal: 1200, 2400, 9600, 19200] +Speed=19200 + +# Enter Key is a \r character, so it's hardcoded in the driver +LeftKey=D +RightKey=C +UpKey=A +DownKey=B +EscapeKey=P + +# You can find out which key of your display sends which +# character by setting keypad_test_mode to yes and running +# LCDd. LCDd will output all characters it receives. +# Afterwards you can modify the settings above and set +# keypad_set_mode to no again. +keypad_test_mode=no + + + +## g15 driver for Logitech G15 Keyboard LCDs ## +[g15] + +# Display size (currently unused) +size=20x5 + + + +## glcdlib meta driver for graphical LCDs ## +[glcdlib] + +## mandatory: + +# which graphical display supported by graphlcd-base to use [default: image] +# (see /etc/graphlcd.conf for possible drivers) +Driver=irtrans + +# no=use graphlcd bitmap fonts (they have only one size / font file) +# yes=use fonts supported by FreeType2 (needs Freetype2 support in libglcdprocdriver and its dependants) +UseFT2=yes + +# text resolution in fixed width characters [default: 16x4] +# (if it won't fit according to available physical pixel resolutioni +# and the minimum available font face size in pixels, then +# 'DebugBorder' will automatically be turned on) +TextResolution=20x4 + +# path to font file to use +FontFile=/usr/share/fonts/corefonts/courbd.ttf + +## these only apply if UseFT2=yes: + +# character encoding to use +CharEncoding=iso8859-2 + +# minumum size in pixels in which fonts should be rendered +MinFontFaceSize=7x12 + +## optional: +Brightness=50 # Brightness (in %) if applicable +Contrast=50 # Contrast (in %) if applicable +Backlight=no # Backlight if applicable +UpsideDown=no # flip image upside down +Invert=no # invert light/dark pixels +ShowDebugFrame=no # turns on/off 1 pixel thick debugging + # border whithin the usable text area, + # for setting up TextResolution and + # MinFontFaceSize (if using FT2); +ShowBigBorder=no # border around the unused area +ShowThinBorder=yes # border around the unused area +PixelShiftX=0 +PixelShiftY=2 + + + +## Matrix Orbital GLK driver ## +[glk] + +# select the serial device to use [default: /dev/lcd] +Device=/dev/lcd + +# set the initial contrast value [default: 560; legal: 0 - 1000] +Contrast=560 + +# set the serial port speed [default: 19200; legal: 9600, 19200, 38400] +Speed=19200 + + + +## Hitachi HD44780 driver ## +[hd44780] + +# Select what type of connection. See documentation for types. +ConnectionType=4bit + +# Port where the LPT is [ususal: 0x278, 0x378 and 0x3BC] +Port=0x378 + +# Device of the serial interface [default: /dev/lcd] +Device=/dev/ttyS0 + +# Bitrate of the serial port (0 for interface default) +Speed=0 + +# If you have a keypad connected. +# You may also need to configure the keypad layout further on in this file. +Keypad=no + +# Set the initial contrast (bwctusb and lcd2usb) [default: 500; legal: 0 - 1000] +Contrast=0 + +# Set brightness of the backlight (lcd2usb only) [default: 0; legal 0 - 1000] +#Brightness=1000 +#OffBrightness=0 + +# If you have a switchable backlight. +Backlight=no + +# If you have the additional output port ("bargraph") and you want to +# be able to control it with the lcdproc OUTPUT command +OutputPort=no + +# Specifies if the last line is pixel addressable or it controls an +# underline effect. [default: true (= pixel addressable); legal: yes, no] +#Lastline=true + +# Specifies the size of the LCD. +# In case of multiple combined displays, this should be the total size. +Size=20x4 + +# For multiple combined displays: how many lines does each display have. +# Vspan=2,2 means both displays have 2 lines. +#vspan=2,2 + +# If you have an HD66712, a KS0073 or an other 'almost HD44780-compatible', +# set this flag to get into extended mode (4-line linear). +#ExtendedMode=yes + +# In extended mode, on some controllers like the ST7036 (in 3 line mode) +# the next line in DDRAM won't start 0x20 higher. [default: 0x20] +#LineAddress=0x10 + +# Character map to to map ISO-8859-1 to the LCD's character set +# [default: hd44780_default; legal: hd44780_default, hd44780_euro, +# ea_ks0073, sed1278f_0b, hd44780_koi8_r ] +CharMap=hd44780_default + +# If your display is slow and cannot keep up with the flow of data from +# LCDd, garbage can appear on the LCDd. Set this delay factor to 2 or 4 +# to increase the delays. Default: 1. +#DelayMult=2 + +# Some displays (e.g. vdr-wakeup) need a message from the driver to that it +# is still alive. When set to a value bigger then null the character in the +# upper left corner is updated every seconds. Default: 0. +#KeepAliveDisplay=0 + +# If you experience occasional garbage on your display you can use this +# option as workaround. If set to a value bigger than null it forces a +# full screen refresh seconds. Default: 0. +#RefreshDisplay=5 + +# You can reduce the inserted delays by setting this to false. +# On fast PCs it is possible your LCD does not respond correctly. +# Default: true. +DelayBus=true + +# If you have a keypad you can assign keystrings to the keys. +# See documentation for used terms and how to wire it. +# For example to give directly connected key 4 the string "Enter", use: +# KeyDirect_4=Enter +# For matrix keys use the X and Y coordinates of the key: +# KeyMatrix_1_3=Enter +KeyMatrix_4_1=Enter +KeyMatrix_4_2=Up +KeyMatrix_4_3=Down +KeyMatrix_4_4=Escape + + + +## ICP A106 driver ## +[icp_a106] +Device=/dev/ttyS1 + + + +## Code Mercenaries IO-Warrior driver ## +[IOWarrior] + +# display dimensions +Size=20x4 + +# serial number [exactly as listed by usbview] +# (if not given, the 1st IOWarrior found gets used) +#SerialNumber=00000674 + +# If you have an HD66712, a KS0073 or an other 'almost HD44780-compatible', +# set this flag to get into extended mode (4-line linear). +#ExtendedMode=yes + +# Specifies if the last line is pixel addressable or it controls an +# underline effect. [default: true (= pixel addressable); legal: yes, no] +#Lastline=true + + + +## Soundgraph/Ahanix/Silverstone/Uneed/Accent iMON driver ## +[imon] + +# select the device to use +Device=/dev/lcd0 + +# display dimensions +Size=16x2 + + + +## Soundgraph iMON LCD ## +[imonlcd] +# Specify which iMon protocol should be used [legal: 0=15c2:ffdc device, +# 1=15c2:0038 device; default: 0] +Protocol=0 + +# Set the exit behavior [legal: 0=leave shutdown message, 1=show the big clock, +# 2=blank device; default: 1] +#OnExit=2 + +# Select the output device to use [default: /dev/lcd0] +Device=/dev/lcd0 + +# Select the displays contrast [default: 200; legal: 0-1000] +Contrast=200 + +# Specify the size of the display in pixels [default: 96x16] +#Size=96x16 + +# Set the backlight state [default: on; legal: on, off] +Backlight=open + +# Set the disc mode [legal: 0=spin the "slim" disc - two disc segments, +# 1=their complement spinning; default: 0] +#DiscMode=0 + + + +## IrMan driver ## +[IrMan] +# in case of trouble with IrMan, try the Lirc emulator for IrMan + +# Select the input device to use +#Device=/dev/irman + +# Select the configuration file to use +#Config=/etc/irman.cfg + + + +## IRtrans driver ## +[irtrans] + +# Does the device have a backlight? [default: no; legal: yes, no] +Backlight=open + +# IRTrans device to connect to [default: localhost] +#Hostname=localhost + +# display dimensions +Size=16x2 + + + +## Joystick driver ## +[joy] + +# Select the input device to use [default: /dev/js0] +Device=/dev/js0 + +# set the axis map +Map_Axis1neg=Left +Map_Axis1pos=Right +Map_Axis2neg=Up +Map_Axis2pos=Down + +# set the button map +Map_Button1=Enter +Map_Button2=Escape + + + +## LB216 driver ## +[lb216] + +# Select the output device to use [default: /dev/lcd] +Device=/dev/lcd + +# Set the initial brightness [default: 255; legal: 0 - 255] +Brightness=255 + +# Set the communication speed [default: 9600; legal: 2400, 9600] +Speed=9600 + +# Reinitialize the LCD's BIOS [default: no; legal: yes, no] +Reboot=no + + + +## LCDM001 driver ## +[lcdm001] + +Device=/dev/ttyS1 + +# keypad settings +# Keyname Function +# Normal context Menu context +# ------- -------------- ------------ +# PauseKey Pause/Continue Enter/select +# BackKey Back(Go to previous screen) Up/Left +# ForwardKey Forward(Go to next screen) Down/Right +# MainMenuKey Open main menu Exit/Cancel +PauseKey=LeftKey +BackKey=UpKey +ForwardKey=DownKey +MainMenuKey=RightKey + +# You can rearrange the settings here. +# If your device is broken, have a look at server/drivers/lcdm001.h + + + +## HNE LCTerm driver ## +[lcterm] +Device=/dev/ttyS1 +Size=16x2 + + + +## LIRC input driver ## +[lirc] + +# Specify an alternative location of the lircrc file [default: ~/.lircrc] +#lircrc=/etc/lircrc.lcdproc + +# Must be the same as in your lircrc +#prog=lcdd + + + +## LIS MCE 2005 driver ## +[lis] + +# Set the initial brightness [default: 1000; legal: 0 - 1000] +# 0-250 = 25%, 251-500 = 50%, 501-750 = 75%, 751-1000 = 100% +#Brightness=1000 + +# Columns by lines [default: 20x2] +#Size=20x2 + +# USB Vendor ID [default: 0x0403] +# Change only if testing a compatible device. +#VendorID=0x0403 + +# USB Product ID [default: 0x6001] +# Change only if testing a compatible device. +#ProductID=0x6001 + + + +##The driver for the VFD of the Medion MD8800 PC ## +[MD8800] +# device to use [default: /dev/ttyS1] +#Device=/dev/ttyS1 + +# display size [default: 16x2] +#Size=16x2 + +# Set the initial brightness [default: 1000; legal: 0 - 1000] +Brightness=1000 +# Set the initial off-brightness [default: 0; legal: 0 - 1000] +# This value is used when the display is normally +# switched off in case LCDd is inactive +OffBrightness=50 + + + +## Futuba MDM166A Display +[mdm166a] +# Show self-running clock after LCDd shutdown +# Possible values: [default: no; legal: no, small, big] +Clock=big +# Dimm display, no dimming gives full brightness [default: no, legal: yes, no] +Dimming=no +# Dimm display in case LCDd is inactive [default: no, legal: yes, no] +OffDimming=yes + + + +## MSI MS-6931 driver for displays in 1HU servers ## +[ms6931] + +# device to use [default: /dev/ttyS1] +Device=/dev/ttyS1 + +# display size [default: 16x2] +#Size=16x2 + + + +## MTC-S16209x driver ## +[mtc_s16209x] + +# Select the output device to use [default: /dev/lcd] +Device=/dev/lcd + +# Set the initial brightness [default: 255; legal: 0 - 255] +Brightness=255 + +# Reinitialize the LCD's BIOS [default: no; legal: yes, no] +Reboot=no + + + +## Matrix Orbital driver ## +[MtxOrb] + +# Select the output device to use [default: /dev/lcd] +Device=/dev/ttyS0 + +# Set the display size [default: 20x4] +Size=20x4 + +# Set the display type [default: lcd; legal: lcd, lkd, vfd, vkd] +Type=lkd + +# Set the initial contrast [default: 480] +# NOTE: The driver will ignore this if the display +# is a vfd or vkd as they don't have this feature +Contrast=480 + +# Some old displays do not have an adjustable backlight but only can +# switch the backlight on/off. If you experience randomly appearing block +# characters, try setting this to false. [default: yes; legal: yes, no] +hasAdjustableBacklight=no + +# Set the initial brightness [default: 1000; legal: 0 - 1000] +Brightness=1000 +# Set the initial off-brightness [default: 0; legal: 0 - 1000] +# This value is used when the display is normally +# switched off in case LCDd is inactive +OffBrightness=0 + +# Set the communication speed [default: 19200; legal: 1200, 2400, 9600, 19200] +Speed=19200 + +# The following table translates from MtxOrb key letters to logical key names. +# By default no keys are mapped, meaning the keypad is not used at all. +#KeyMap_A=Left +#KeyMap_B=Right +#KeyMap_C=Up +#KeyMap_D=Down +#KeyMap_E=Enter +#KeyMap_F=Escape +# See the [menu] section for an explanation of the key mappings + +# You can find out which key of your display sends which +# character by setting keypad_test_mode to yes and running +# LCDd. LCDd will output all characters it receives. +# Afterwards you can modify the settings above and set +# keypad_set_mode to no again. +keypad_test_mode=no + + + +## mx5000 driver for LCD display on the Logitech MX5000 keyboard ## +[mx5000] + +# Select the output device to use [default: /dev/hiddev0] +Device = /dev/hiddev0 +# Time to wait in ms after the refresh screen has been sent [default: 1000] +WaitAfterRefresh = 1000 + + + +## Noritake VFD driver ## +[NoritakeVFD] +# device where the VFD is. Usual values are /dev/ttyS0 and /dev/ttyS1 [default: /dev/lcd] +Device=/dev/ttyS0 +# Specifies the size of the LCD. +Size=20x4 +# Set the initial brightness [default: 1000; legal: 0 - 1000] +Brightness=1000 +# Set the initial off-brightness [default: 0; legal: 0 - 1000] +# This value is used when the display is normally +# switched off in case LCDd is inactive +OffBrightness=50 +# set the serial port speed [default: 9600, legal: 1200, 2400, 9600, 19200, 115200] +Speed=9600 +# Set serial data parity [default: 0 (None), legal: 0(=none), 1(=odd), 2(=even)] +Parity=0 +# re-initialize the VFD [default: no; legal: yes, no] +Reboot=no + + + +## Mini-box.com picoLCD (usblcd) driver ## +[picolcd] + +# KeyTimeout is the time that LCDd spends waiting for a key press before cycling +# through other duties. Higher values make LCDd use less CPU time and make +# key presses more detectable. Lower values make LCDd more responsive but a +# little prone to missing key presses. 500 (.5 second) is the default and a +# balanced value. +KeyTimeout=500 + +# Set the initial brightness [default: 1000; legal: 0 - 1000] +Brightness=1000 + +# Set the initial contrast [default: 1000; legal: 0 - 1000] +Contrast=1000 + +# Light the keys? i[default: on; legal: on, off] +Keylights=on + +# If Keylights is on, the you can unlight specific keys below: +# Key0 is the directional pad. Key1 - Key5 correspond to the F1 - F5 keys. +# There is no LED for the +/- keys. This is a handy way to indicate to users +# which keys are disabled. [default: on; legal: on, off] +Key0Light=on +Key1Light=on +Key2Light=on +Key3Light=on +Key4Light=on +Key5Light=on + +# Host name or IP address of the LIRC instance that is to receive IR codes +# If not set, or set to an empty value, IR support is disabled. +#LircHost=127.0.0.1 + +# UDP port on which LIRC is listening [default: 8765; legal: 1 - 65535] +LircPort=8765 + +# Threshold in jiffies of synthesized gap that triggers flushing the IR data to lirc +# [default: 100 (6.1ms); 0 to suppress] +LircFlushThreshold=100 + + + +## Pyramid LCD driver ## +[pyramid] + +# device to connect to [default: /dev/lcd] +Device=/dev/ttyUSB0 + + + +## Seiko Epson 1330 driver ## +[sed1330] + +# Port where the LPT is. Common values are 0x278, 0x378 and 0x3BC +Port=0x378 + +# Type of LCD module (legal: G321D, G121C, G242C, G191D, G2446, SP14Q002) +# Note: Currently only tested with G321D & SP14Q002. +Type=G321D + +# Width x Height of a character cell in pixels [legal: 6x7 - 8x16; default: 6x10] +CellSize=6x10 + +# Select what type of connection [legal: classic, bitshaker; default: classic] +ConnectionType=classic + + + +## Seiko Epson 1520 driver ## +[sed1520] + +# Port where the LPT is. Usual values are 0x278, 0x378 and 0x3BC +Port=0x378 + + + +## serial POS display driver ## +[serialPOS] + +# Device to use in serial modea [default: /dev/lcd] +Device=/dev/lcd + +# Specifies the size of the display in characters. [default: 16x2] +Size=16x2 + +# Set the communication protocol to use with the POS display. +# [default: AEDEX; legal: IEE, Epson, Emax, IBM, LogicControls, Ultimate] +Type=AEDEX + +# communication baud rate with the display [default: 9600; legal: 1200, 2400, 19200, 115200] +Speed=9600 + + + +## Serial VFD driver ## +## Drives various (see below) serial 5x7dot VFD's. ## +[serialVFD] + +# Specifies the displaytype.[default: 0] +# 0 NEC (FIPC8367 based) VFDs. +# 1 KD Rev 2.1. +# 2 Noritake VFDs (*). +# 3 Futaba VFDs +# 4 IEE S03601-95B +# 5 IEE S03601-96-080 (*) +# 6 Futaba NA202SD08FA (allmost IEE compatible) +# 7 Samsung 20S207DA4 and 20S207DA6 +# 8 Nixdorf BA6x / VT100 +# (* most should work, not testet yet.) +Type=0 + +# "no" if display connected serial, "yes" if connected parallel. [default: no(=serial)] +use_parallel=no + +# Number of Custom-Characters [default: displaytype dependent] +#Custom-Characters=0 + +# Portaddress where the LPT is. Used in parallelmode only. Usual values are 0x278, 0x378 and 0x3BC +Port=0x378 + +# Set parallel port timingdelay (us). Used in parallelmode only. [default: 2; legal: 0 - 255] +#PortWait=2 + +# Device to use in serial mode. Usual values are /dev/ttyS0 and /dev/ttyS1 +Device=/dev/ttyS1 + +# Specifies the size of the VFD. +Size=20x2 + +# Set the initial brightness [default: 1000; legal: 0 - 1000] +# (4 steps 0-250, 251-500, 501-750, 751-1000) +Brightness=1000 +# Set the initial off-brightness [default: 0; legal: 0 - 1000] +# This value is used when the display is normally +# switched off in case LCDd is inactive +# (4 steps 0-250, 251-500, 501-750, 751-1000) +OffBrightness=0 + +# set the serial port speed [default: 9600; legal: 1200, 2400, 9600, 19200, 115200] +Speed=9600 + +# enable ISO 8859 1 compatibility [default: yes; legal: yes, no] +#ISO_8859_1=yes + + + +## shuttleVFD driver ## +[shuttleVFD] +# No options + + + +## stv5730 driver ## +[stv5730] + +# Port the device is connected to [default: 0x378] +Port=0x378 + + +[SureElec] + +# Port the device is connected to (by default first USB serial port) +Device=/dev/ttyUSB0 + +# Edition level of the device (can be 1, 2 or 3) [default: 2] +#Edition=1 + +# set display size +# Note: The size can be obtained directly from device for edition 2 & 3. +#Size=16x2 + +# Set the initial contrast [default: 480; legal: 0 - 1000] +#Contrast=200 + +# Set the initial brightness [default: 480; legal: 1 - 1000] +#Brightness=480 + +# Set the initial off-brightness [default: 100; legal: 1 - 1000] +# This value is used when the display is normally +# switched off in case LCDd is inactive +#OffBrightness=100 + + +## SVGAlib driver ## +[svga] + +# svgalib mode to use [default: G320x240x256; legal: supported svgalib modes] +#Mode=G640x480x256 + +# set display size [default: 20x4] +Size=20x4 + +# Set the initial contrast [default: 500; legal: 0 - 1000] +# Can be set but does not change anything internally +Contrast=500 + +# Set the initial brightness [default: 1000; legal: 1 - 1000] +Brightness=1000 + +# Set the initial off-brightness [default: 500; legal: 1 - 1000] +# This value is used when the display is normally +# switched off in case LCDd is inactive +OffBrightness=500 + + + +## Text driver ## +[text] +# Set the display size [default: 20x4] +Size=20x4 + + + +## Toshiba T6963 driver ## +[t6963] + +# set display size [default: 20x6] +Size=20x6 + +# port to use [default: 0x378; legal: 0x200 - 0x400] +Port=0x378 + +# Is ECP mode on? [default: yes; legal: yes, no] +#ECPlpt=yes + +# Use graphics? [default: no; legal: yes, no] +#graphic=no + + + +## Tyan Barebones LCD driver (GS10 & GS12 series) ## +[tyan] + +# Select the output device to use [default: /dev/lcd] +Device=/dev/lcd + +# Set the communication speed [default: 9600; legal: 4800, 9600] +Speed=9600 + +# set display size [default: 16x2] +Size=16x2 + + + +## ELV ula200 driver ## +[ula200] + +# Select the LCD size [default: 20x4] +Size=20x4 + +# If you have a non standard keypad you can associate any keystrings to keys. +# There are 6 input key in the CwLnx hardware that generate characters +# from 'A' to 'F'. +# +# The following it the built-in default mapping hardcoded in the driver. +# You can leave those unchanged if you have a standard keypad. +# You can change it if you want to report other keystrings or have a non +# standard keypad. +# KeyMap_A=Up +# KeyMap_B=Down +# KeyMap_C=Left +# KeyMap_D=Right +# KeyMap_E=Enter +# KeyMap_F=Escape + + + +## Wirz SLI LCD driver ## +[sli] + +# Select the output device to use [default: /dev/lcd] +Device=/dev/lcd + +# Set the communication speed [default: 19200; legal: 1200, 2400, 9600, 19200, 38400, 57600, 115200] +Speed=19200 + + + +## OnScreen Display using libxosd ## +[xosd] + +# set display size [default: 20x4] +Size=20x4 + +# Offset in pixels from the top-left corner of the monitor [default: 0x0] +Offset=200x200 + +# X font to use, in XLFD format, as given by "xfontsel" +Font=-*-terminus-*-r-*-*-*-320-*-*-*-*-* + +# EOF diff --git a/packages/sysutils/lcdproc/install b/packages/sysutils/lcdproc/install index 1febb2e886..85e2ef9478 100755 --- a/packages/sysutils/lcdproc/install +++ b/packages/sysutils/lcdproc/install @@ -32,4 +32,4 @@ mkdir -p $INSTALL/usr/lib/lcdproc cp $PKG_BUILD/server/drivers/*.so $INSTALL/usr/lib/lcdproc mkdir -p $INSTALL/etc - cp $PKG_BUILD/LCDd.conf $INSTALL/etc + cp $PKG_DIR/config/LCDd.conf $INSTALL/etc