Annotation of /trunk/kernel26-alx/patches-2.6.33-r3/0106-2.6.33.7-all-fixes.patch
Parent Directory | Revision Log
Revision 1260 -
(hide annotations)
(download)
Wed Jan 26 11:54:32 2011 UTC (13 years, 8 months ago) by niro
File size: 159008 byte(s)
Wed Jan 26 11:54:32 2011 UTC (13 years, 8 months ago) by niro
File size: 159008 byte(s)
2.6.33-alx-r3: always enable kms support at runtime for xorg-server-1.9.x
1 | niro | 1260 | diff --git a/arch/arm/kernel/kprobes-decode.c b/arch/arm/kernel/kprobes-decode.c |
2 | index da1f949..8bccbfa 100644 | ||
3 | --- a/arch/arm/kernel/kprobes-decode.c | ||
4 | +++ b/arch/arm/kernel/kprobes-decode.c | ||
5 | @@ -583,13 +583,14 @@ static void __kprobes emulate_ldr(struct kprobe *p, struct pt_regs *regs) | ||
6 | { | ||
7 | insn_llret_3arg_fn_t *i_fn = (insn_llret_3arg_fn_t *)&p->ainsn.insn[0]; | ||
8 | kprobe_opcode_t insn = p->opcode; | ||
9 | + long ppc = (long)p->addr + 8; | ||
10 | union reg_pair fnr; | ||
11 | int rd = (insn >> 12) & 0xf; | ||
12 | int rn = (insn >> 16) & 0xf; | ||
13 | int rm = insn & 0xf; | ||
14 | long rdv; | ||
15 | - long rnv = regs->uregs[rn]; | ||
16 | - long rmv = regs->uregs[rm]; /* rm/rmv may be invalid, don't care. */ | ||
17 | + long rnv = (rn == 15) ? ppc : regs->uregs[rn]; | ||
18 | + long rmv = (rm == 15) ? ppc : regs->uregs[rm]; | ||
19 | long cpsr = regs->ARM_cpsr; | ||
20 | |||
21 | fnr.dr = insnslot_llret_3arg_rflags(rnv, 0, rmv, cpsr, i_fn); | ||
22 | diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c | ||
23 | index acafdbc..51c2d37 100644 | ||
24 | --- a/arch/arm/mach-omap2/board-rx51-peripherals.c | ||
25 | +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | ||
26 | @@ -147,6 +147,10 @@ static void __init rx51_add_gpio_keys(void) | ||
27 | #endif /* CONFIG_KEYBOARD_GPIO || CONFIG_KEYBOARD_GPIO_MODULE */ | ||
28 | |||
29 | static int board_keymap[] = { | ||
30 | + /* | ||
31 | + * Note that KEY(x, 8, KEY_XXX) entries represent "entrire row | ||
32 | + * connected to the ground" matrix state. | ||
33 | + */ | ||
34 | KEY(0, 0, KEY_Q), | ||
35 | KEY(0, 1, KEY_O), | ||
36 | KEY(0, 2, KEY_P), | ||
37 | @@ -154,6 +158,7 @@ static int board_keymap[] = { | ||
38 | KEY(0, 4, KEY_BACKSPACE), | ||
39 | KEY(0, 6, KEY_A), | ||
40 | KEY(0, 7, KEY_S), | ||
41 | + | ||
42 | KEY(1, 0, KEY_W), | ||
43 | KEY(1, 1, KEY_D), | ||
44 | KEY(1, 2, KEY_F), | ||
45 | @@ -162,6 +167,7 @@ static int board_keymap[] = { | ||
46 | KEY(1, 5, KEY_J), | ||
47 | KEY(1, 6, KEY_K), | ||
48 | KEY(1, 7, KEY_L), | ||
49 | + | ||
50 | KEY(2, 0, KEY_E), | ||
51 | KEY(2, 1, KEY_DOT), | ||
52 | KEY(2, 2, KEY_UP), | ||
53 | @@ -169,6 +175,8 @@ static int board_keymap[] = { | ||
54 | KEY(2, 5, KEY_Z), | ||
55 | KEY(2, 6, KEY_X), | ||
56 | KEY(2, 7, KEY_C), | ||
57 | + KEY(2, 8, KEY_F9), | ||
58 | + | ||
59 | KEY(3, 0, KEY_R), | ||
60 | KEY(3, 1, KEY_V), | ||
61 | KEY(3, 2, KEY_B), | ||
62 | @@ -177,20 +185,23 @@ static int board_keymap[] = { | ||
63 | KEY(3, 5, KEY_SPACE), | ||
64 | KEY(3, 6, KEY_SPACE), | ||
65 | KEY(3, 7, KEY_LEFT), | ||
66 | + | ||
67 | KEY(4, 0, KEY_T), | ||
68 | KEY(4, 1, KEY_DOWN), | ||
69 | KEY(4, 2, KEY_RIGHT), | ||
70 | KEY(4, 4, KEY_LEFTCTRL), | ||
71 | KEY(4, 5, KEY_RIGHTALT), | ||
72 | KEY(4, 6, KEY_LEFTSHIFT), | ||
73 | + KEY(4, 8, KEY_F10), | ||
74 | + | ||
75 | KEY(5, 0, KEY_Y), | ||
76 | + KEY(5, 8, KEY_F11), | ||
77 | + | ||
78 | KEY(6, 0, KEY_U), | ||
79 | + | ||
80 | KEY(7, 0, KEY_I), | ||
81 | KEY(7, 1, KEY_F7), | ||
82 | KEY(7, 2, KEY_F8), | ||
83 | - KEY(0xff, 2, KEY_F9), | ||
84 | - KEY(0xff, 4, KEY_F10), | ||
85 | - KEY(0xff, 5, KEY_F11), | ||
86 | }; | ||
87 | |||
88 | static struct matrix_keymap_data board_map_data = { | ||
89 | diff --git a/arch/arm/mach-realview/Kconfig b/arch/arm/mach-realview/Kconfig | ||
90 | index ee5e392..b4575ae 100644 | ||
91 | --- a/arch/arm/mach-realview/Kconfig | ||
92 | +++ b/arch/arm/mach-realview/Kconfig | ||
93 | @@ -18,6 +18,7 @@ config REALVIEW_EB_ARM11MP | ||
94 | bool "Support ARM11MPCore tile" | ||
95 | depends on MACH_REALVIEW_EB | ||
96 | select CPU_V6 | ||
97 | + select ARCH_HAS_BARRIERS if SMP | ||
98 | help | ||
99 | Enable support for the ARM11MPCore tile on the Realview platform. | ||
100 | |||
101 | @@ -35,6 +36,7 @@ config MACH_REALVIEW_PB11MP | ||
102 | select CPU_V6 | ||
103 | select ARM_GIC | ||
104 | select HAVE_PATA_PLATFORM | ||
105 | + select ARCH_HAS_BARRIERS if SMP | ||
106 | help | ||
107 | Include support for the ARM(R) RealView MPCore Platform Baseboard. | ||
108 | PB11MPCore is a platform with an on-board ARM11MPCore and has | ||
109 | diff --git a/arch/arm/mach-realview/include/mach/barriers.h b/arch/arm/mach-realview/include/mach/barriers.h | ||
110 | new file mode 100644 | ||
111 | index 0000000..0c5d749 | ||
112 | --- /dev/null | ||
113 | +++ b/arch/arm/mach-realview/include/mach/barriers.h | ||
114 | @@ -0,0 +1,8 @@ | ||
115 | +/* | ||
116 | + * Barriers redefined for RealView ARM11MPCore platforms with L220 cache | ||
117 | + * controller to work around hardware errata causing the outer_sync() | ||
118 | + * operation to deadlock the system. | ||
119 | + */ | ||
120 | +#define mb() dsb() | ||
121 | +#define rmb() dmb() | ||
122 | +#define wmb() mb() | ||
123 | diff --git a/arch/ia64/mm/tlb.c b/arch/ia64/mm/tlb.c | ||
124 | index f3de9d7..99c1364 100644 | ||
125 | --- a/arch/ia64/mm/tlb.c | ||
126 | +++ b/arch/ia64/mm/tlb.c | ||
127 | @@ -120,7 +120,7 @@ static inline void down_spin(struct spinaphore *ss) | ||
128 | ia64_invala(); | ||
129 | |||
130 | for (;;) { | ||
131 | - asm volatile ("ld4.c.nc %0=[%1]" : "=r"(serve) : "r"(&ss->serve) : "memory"); | ||
132 | + asm volatile ("ld8.c.nc %0=[%1]" : "=r"(serve) : "r"(&ss->serve) : "memory"); | ||
133 | if (time_before(t, serve)) | ||
134 | return; | ||
135 | cpu_relax(); | ||
136 | diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h | ||
137 | index f4ab313..b149c3c 100644 | ||
138 | --- a/arch/mips/include/asm/mipsregs.h | ||
139 | +++ b/arch/mips/include/asm/mipsregs.h | ||
140 | @@ -135,6 +135,12 @@ | ||
141 | #define FPU_CSR_COND7 0x80000000 /* $fcc7 */ | ||
142 | |||
143 | /* | ||
144 | + * Bits 18 - 20 of the FPU Status Register will be read as 0, | ||
145 | + * and should be written as zero. | ||
146 | + */ | ||
147 | +#define FPU_CSR_RSVD 0x001c0000 | ||
148 | + | ||
149 | +/* | ||
150 | * X the exception cause indicator | ||
151 | * E the exception enable | ||
152 | * S the sticky/flag bit | ||
153 | @@ -161,7 +167,8 @@ | ||
154 | #define FPU_CSR_UDF_S 0x00000008 | ||
155 | #define FPU_CSR_INE_S 0x00000004 | ||
156 | |||
157 | -/* rounding mode */ | ||
158 | +/* Bits 0 and 1 of FPU Status Register specify the rounding mode */ | ||
159 | +#define FPU_CSR_RM 0x00000003 | ||
160 | #define FPU_CSR_RN 0x0 /* nearest */ | ||
161 | #define FPU_CSR_RZ 0x1 /* towards zero */ | ||
162 | #define FPU_CSR_RU 0x2 /* towards +Infinity */ | ||
163 | diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c | ||
164 | index 8f2f8e9..f2338d1 100644 | ||
165 | --- a/arch/mips/math-emu/cp1emu.c | ||
166 | +++ b/arch/mips/math-emu/cp1emu.c | ||
167 | @@ -78,6 +78,9 @@ DEFINE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats); | ||
168 | #define FPCREG_RID 0 /* $0 = revision id */ | ||
169 | #define FPCREG_CSR 31 /* $31 = csr */ | ||
170 | |||
171 | +/* Determine rounding mode from the RM bits of the FCSR */ | ||
172 | +#define modeindex(v) ((v) & FPU_CSR_RM) | ||
173 | + | ||
174 | /* Convert Mips rounding mode (0..3) to IEEE library modes. */ | ||
175 | static const unsigned char ieee_rm[4] = { | ||
176 | [FPU_CSR_RN] = IEEE754_RN, | ||
177 | @@ -384,10 +387,14 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx) | ||
178 | (void *) (xcp->cp0_epc), | ||
179 | MIPSInst_RT(ir), value); | ||
180 | #endif | ||
181 | - value &= (FPU_CSR_FLUSH | FPU_CSR_ALL_E | FPU_CSR_ALL_S | 0x03); | ||
182 | - ctx->fcr31 &= ~(FPU_CSR_FLUSH | FPU_CSR_ALL_E | FPU_CSR_ALL_S | 0x03); | ||
183 | - /* convert to ieee library modes */ | ||
184 | - ctx->fcr31 |= (value & ~0x3) | ieee_rm[value & 0x3]; | ||
185 | + | ||
186 | + /* | ||
187 | + * Don't write reserved bits, | ||
188 | + * and convert to ieee library modes | ||
189 | + */ | ||
190 | + ctx->fcr31 = (value & | ||
191 | + ~(FPU_CSR_RSVD | FPU_CSR_RM)) | | ||
192 | + ieee_rm[modeindex(value)]; | ||
193 | } | ||
194 | if ((ctx->fcr31 >> 5) & ctx->fcr31 & FPU_CSR_ALL_E) { | ||
195 | return SIGFPE; | ||
196 | diff --git a/arch/powerpc/include/asm/cpm.h b/arch/powerpc/include/asm/cpm.h | ||
197 | index 0835eb9..e50323f 100644 | ||
198 | --- a/arch/powerpc/include/asm/cpm.h | ||
199 | +++ b/arch/powerpc/include/asm/cpm.h | ||
200 | @@ -7,6 +7,30 @@ | ||
201 | #include <linux/of.h> | ||
202 | |||
203 | /* | ||
204 | + * SPI Parameter RAM common to QE and CPM. | ||
205 | + */ | ||
206 | +struct spi_pram { | ||
207 | + __be16 rbase; /* Rx Buffer descriptor base address */ | ||
208 | + __be16 tbase; /* Tx Buffer descriptor base address */ | ||
209 | + u8 rfcr; /* Rx function code */ | ||
210 | + u8 tfcr; /* Tx function code */ | ||
211 | + __be16 mrblr; /* Max receive buffer length */ | ||
212 | + __be32 rstate; /* Internal */ | ||
213 | + __be32 rdp; /* Internal */ | ||
214 | + __be16 rbptr; /* Internal */ | ||
215 | + __be16 rbc; /* Internal */ | ||
216 | + __be32 rxtmp; /* Internal */ | ||
217 | + __be32 tstate; /* Internal */ | ||
218 | + __be32 tdp; /* Internal */ | ||
219 | + __be16 tbptr; /* Internal */ | ||
220 | + __be16 tbc; /* Internal */ | ||
221 | + __be32 txtmp; /* Internal */ | ||
222 | + __be32 res; /* Tx temp. */ | ||
223 | + __be16 rpbase; /* Relocation pointer (CPM1 only) */ | ||
224 | + __be16 res1; /* Reserved */ | ||
225 | +}; | ||
226 | + | ||
227 | +/* | ||
228 | * USB Controller pram common to QE and CPM. | ||
229 | */ | ||
230 | struct usb_ctlr { | ||
231 | diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c | ||
232 | index dee83b8..11b300a 100644 | ||
233 | --- a/arch/powerpc/kernel/irq.c | ||
234 | +++ b/arch/powerpc/kernel/irq.c | ||
235 | @@ -247,7 +247,10 @@ void fixup_irqs(cpumask_t map) | ||
236 | cpumask_t mask; | ||
237 | |||
238 | desc = irq_to_desc(irq); | ||
239 | - if (desc && desc->status & IRQ_PER_CPU) | ||
240 | + if (!desc) | ||
241 | + continue; | ||
242 | + | ||
243 | + if (desc->status & IRQ_PER_CPU) | ||
244 | continue; | ||
245 | |||
246 | cpumask_and(&mask, desc->affinity, &map); | ||
247 | diff --git a/arch/powerpc/sysdev/micropatch.c b/arch/powerpc/sysdev/micropatch.c | ||
248 | index d8d6028..6c56ae9 100644 | ||
249 | --- a/arch/powerpc/sysdev/micropatch.c | ||
250 | +++ b/arch/powerpc/sysdev/micropatch.c | ||
251 | @@ -16,6 +16,7 @@ | ||
252 | #include <asm/page.h> | ||
253 | #include <asm/pgtable.h> | ||
254 | #include <asm/8xx_immap.h> | ||
255 | +#include <asm/cpm.h> | ||
256 | #include <asm/cpm1.h> | ||
257 | |||
258 | /* | ||
259 | @@ -625,9 +626,14 @@ cpm_load_patch(cpm8xx_t *cp) | ||
260 | { | ||
261 | volatile uint *dp; /* Dual-ported RAM. */ | ||
262 | volatile cpm8xx_t *commproc; | ||
263 | +#if defined(CONFIG_I2C_SPI_UCODE_PATCH) || \ | ||
264 | + defined(CONFIG_I2C_SPI_SMC1_UCODE_PATCH) | ||
265 | volatile iic_t *iip; | ||
266 | - volatile spi_t *spp; | ||
267 | + volatile struct spi_pram *spp; | ||
268 | +#ifdef CONFIG_I2C_SPI_SMC1_UCODE_PATCH | ||
269 | volatile smc_uart_t *smp; | ||
270 | +#endif | ||
271 | +#endif | ||
272 | int i; | ||
273 | |||
274 | commproc = cp; | ||
275 | @@ -668,8 +674,8 @@ cpm_load_patch(cpm8xx_t *cp) | ||
276 | /* Put SPI above the IIC, also 32-byte aligned. | ||
277 | */ | ||
278 | i = (RPBASE + sizeof(iic_t) + 31) & ~31; | ||
279 | - spp = (spi_t *)&commproc->cp_dparam[PROFF_SPI]; | ||
280 | - spp->spi_rpbase = i; | ||
281 | + spp = (struct spi_pram *)&commproc->cp_dparam[PROFF_SPI]; | ||
282 | + spp->rpbase = i; | ||
283 | |||
284 | # if defined(CONFIG_I2C_SPI_UCODE_PATCH) | ||
285 | commproc->cp_cpmcr1 = 0x802a; | ||
286 | diff --git a/arch/sparc/include/asm/stat.h b/arch/sparc/include/asm/stat.h | ||
287 | index 39327d6..a232e9e 100644 | ||
288 | --- a/arch/sparc/include/asm/stat.h | ||
289 | +++ b/arch/sparc/include/asm/stat.h | ||
290 | @@ -53,8 +53,8 @@ struct stat { | ||
291 | ino_t st_ino; | ||
292 | mode_t st_mode; | ||
293 | short st_nlink; | ||
294 | - uid16_t st_uid; | ||
295 | - gid16_t st_gid; | ||
296 | + unsigned short st_uid; | ||
297 | + unsigned short st_gid; | ||
298 | unsigned short st_rdev; | ||
299 | off_t st_size; | ||
300 | time_t st_atime; | ||
301 | diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h | ||
302 | index d86da72..5928fc0 100644 | ||
303 | --- a/arch/x86/include/asm/msr-index.h | ||
304 | +++ b/arch/x86/include/asm/msr-index.h | ||
305 | @@ -107,6 +107,7 @@ | ||
306 | #define MSR_AMD64_PATCH_LOADER 0xc0010020 | ||
307 | #define MSR_AMD64_OSVW_ID_LENGTH 0xc0010140 | ||
308 | #define MSR_AMD64_OSVW_STATUS 0xc0010141 | ||
309 | +#define MSR_AMD64_DC_CFG 0xc0011022 | ||
310 | #define MSR_AMD64_IBSFETCHCTL 0xc0011030 | ||
311 | #define MSR_AMD64_IBSFETCHLINAD 0xc0011031 | ||
312 | #define MSR_AMD64_IBSFETCHPHYSAD 0xc0011032 | ||
313 | diff --git a/arch/x86/include/asm/suspend_32.h b/arch/x86/include/asm/suspend_32.h | ||
314 | index 48dcfa6..fd921c3 100644 | ||
315 | --- a/arch/x86/include/asm/suspend_32.h | ||
316 | +++ b/arch/x86/include/asm/suspend_32.h | ||
317 | @@ -15,6 +15,8 @@ static inline int arch_prepare_suspend(void) { return 0; } | ||
318 | struct saved_context { | ||
319 | u16 es, fs, gs, ss; | ||
320 | unsigned long cr0, cr2, cr3, cr4; | ||
321 | + u64 misc_enable; | ||
322 | + bool misc_enable_saved; | ||
323 | struct desc_ptr gdt; | ||
324 | struct desc_ptr idt; | ||
325 | u16 ldt; | ||
326 | diff --git a/arch/x86/include/asm/suspend_64.h b/arch/x86/include/asm/suspend_64.h | ||
327 | index 06284f4..8d942af 100644 | ||
328 | --- a/arch/x86/include/asm/suspend_64.h | ||
329 | +++ b/arch/x86/include/asm/suspend_64.h | ||
330 | @@ -27,6 +27,8 @@ struct saved_context { | ||
331 | u16 ds, es, fs, gs, ss; | ||
332 | unsigned long gs_base, gs_kernel_base, fs_base; | ||
333 | unsigned long cr0, cr2, cr3, cr4, cr8; | ||
334 | + u64 misc_enable; | ||
335 | + bool misc_enable_saved; | ||
336 | unsigned long efer; | ||
337 | u16 gdt_pad; | ||
338 | u16 gdt_limit; | ||
339 | diff --git a/arch/x86/include/asm/system.h b/arch/x86/include/asm/system.h | ||
340 | index e04740f..2a19418 100644 | ||
341 | --- a/arch/x86/include/asm/system.h | ||
342 | +++ b/arch/x86/include/asm/system.h | ||
343 | @@ -451,7 +451,7 @@ void stop_this_cpu(void *dummy); | ||
344 | * | ||
345 | * (Could use an alternative three way for this if there was one.) | ||
346 | */ | ||
347 | -static inline void rdtsc_barrier(void) | ||
348 | +static __always_inline void rdtsc_barrier(void) | ||
349 | { | ||
350 | alternative(ASM_NOP3, "mfence", X86_FEATURE_MFENCE_RDTSC); | ||
351 | alternative(ASM_NOP3, "lfence", X86_FEATURE_LFENCE_RDTSC); | ||
352 | diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c | ||
353 | index 2e837f5..fb7a5f0 100644 | ||
354 | --- a/arch/x86/kernel/acpi/cstate.c | ||
355 | +++ b/arch/x86/kernel/acpi/cstate.c | ||
356 | @@ -145,6 +145,15 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu, | ||
357 | percpu_entry->states[cx->index].eax = cx->address; | ||
358 | percpu_entry->states[cx->index].ecx = MWAIT_ECX_INTERRUPT_BREAK; | ||
359 | } | ||
360 | + | ||
361 | + /* | ||
362 | + * For _CST FFH on Intel, if GAS.access_size bit 1 is cleared, | ||
363 | + * then we should skip checking BM_STS for this C-state. | ||
364 | + * ref: "Intel Processor Vendor-Specific ACPI Interface Specification" | ||
365 | + */ | ||
366 | + if ((c->x86_vendor == X86_VENDOR_INTEL) && !(reg->access_size & 0x2)) | ||
367 | + cx->bm_sts_skip = 1; | ||
368 | + | ||
369 | return retval; | ||
370 | } | ||
371 | EXPORT_SYMBOL_GPL(acpi_processor_ffh_cstate_probe); | ||
372 | diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c | ||
373 | index f996103..82e5086 100644 | ||
374 | --- a/arch/x86/kernel/acpi/sleep.c | ||
375 | +++ b/arch/x86/kernel/acpi/sleep.c | ||
376 | @@ -162,8 +162,6 @@ static int __init acpi_sleep_setup(char *str) | ||
377 | #endif | ||
378 | if (strncmp(str, "old_ordering", 12) == 0) | ||
379 | acpi_old_suspend_ordering(); | ||
380 | - if (strncmp(str, "sci_force_enable", 16) == 0) | ||
381 | - acpi_set_sci_en_on_resume(); | ||
382 | str = strchr(str, ','); | ||
383 | if (str != NULL) | ||
384 | str += strspn(str, ", \t"); | ||
385 | diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c | ||
386 | index d4df517..7718bb3 100644 | ||
387 | --- a/arch/x86/kernel/apic/apic.c | ||
388 | +++ b/arch/x86/kernel/apic/apic.c | ||
389 | @@ -920,7 +920,7 @@ void disable_local_APIC(void) | ||
390 | unsigned int value; | ||
391 | |||
392 | /* APIC hasn't been mapped yet */ | ||
393 | - if (!apic_phys) | ||
394 | + if (!x2apic_mode && !apic_phys) | ||
395 | return; | ||
396 | |||
397 | clear_local_APIC(); | ||
398 | diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c | ||
399 | index 773afc9..241c5b2 100644 | ||
400 | --- a/arch/x86/kernel/hpet.c | ||
401 | +++ b/arch/x86/kernel/hpet.c | ||
402 | @@ -958,7 +958,7 @@ fs_initcall(hpet_late_init); | ||
403 | |||
404 | void hpet_disable(void) | ||
405 | { | ||
406 | - if (is_hpet_capable()) { | ||
407 | + if (is_hpet_capable() && hpet_virt_address) { | ||
408 | unsigned int cfg = hpet_readl(HPET_CFG); | ||
409 | |||
410 | if (hpet_legacy_int_enabled) { | ||
411 | diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c | ||
412 | index 2bbde60..aa740fa 100644 | ||
413 | --- a/arch/x86/kernel/pci-calgary_64.c | ||
414 | +++ b/arch/x86/kernel/pci-calgary_64.c | ||
415 | @@ -103,11 +103,16 @@ int use_calgary __read_mostly = 0; | ||
416 | #define PMR_SOFTSTOPFAULT 0x40000000 | ||
417 | #define PMR_HARDSTOP 0x20000000 | ||
418 | |||
419 | -#define MAX_NUM_OF_PHBS 8 /* how many PHBs in total? */ | ||
420 | -#define MAX_NUM_CHASSIS 8 /* max number of chassis */ | ||
421 | -/* MAX_PHB_BUS_NUM is the maximal possible dev->bus->number */ | ||
422 | -#define MAX_PHB_BUS_NUM (MAX_NUM_OF_PHBS * MAX_NUM_CHASSIS * 2) | ||
423 | -#define PHBS_PER_CALGARY 4 | ||
424 | +/* | ||
425 | + * The maximum PHB bus number. | ||
426 | + * x3950M2 (rare): 8 chassis, 48 PHBs per chassis = 384 | ||
427 | + * x3950M2: 4 chassis, 48 PHBs per chassis = 192 | ||
428 | + * x3950 (PCIE): 8 chassis, 32 PHBs per chassis = 256 | ||
429 | + * x3950 (PCIX): 8 chassis, 16 PHBs per chassis = 128 | ||
430 | + */ | ||
431 | +#define MAX_PHB_BUS_NUM 256 | ||
432 | + | ||
433 | +#define PHBS_PER_CALGARY 4 | ||
434 | |||
435 | /* register offsets in Calgary's internal register space */ | ||
436 | static const unsigned long tar_offsets[] = { | ||
437 | @@ -1051,8 +1056,6 @@ static int __init calgary_init_one(struct pci_dev *dev) | ||
438 | struct iommu_table *tbl; | ||
439 | int ret; | ||
440 | |||
441 | - BUG_ON(dev->bus->number >= MAX_PHB_BUS_NUM); | ||
442 | - | ||
443 | bbar = busno_to_bbar(dev->bus->number); | ||
444 | ret = calgary_setup_tar(dev, bbar); | ||
445 | if (ret) | ||
446 | diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c | ||
447 | index 3339917..b1e85b0 100644 | ||
448 | --- a/arch/x86/kernel/traps.c | ||
449 | +++ b/arch/x86/kernel/traps.c | ||
450 | @@ -529,11 +529,20 @@ asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs) | ||
451 | dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) | ||
452 | { | ||
453 | struct task_struct *tsk = current; | ||
454 | + int user_icebp = 0; | ||
455 | unsigned long dr6; | ||
456 | int si_code; | ||
457 | |||
458 | get_debugreg(dr6, 6); | ||
459 | |||
460 | + /* | ||
461 | + * If dr6 has no reason to give us about the origin of this trap, | ||
462 | + * then it's very likely the result of an icebp/int01 trap. | ||
463 | + * User wants a sigtrap for that. | ||
464 | + */ | ||
465 | + if (!(dr6 & ~0xffff0ff0) && user_mode(regs)) | ||
466 | + user_icebp = 1; | ||
467 | + | ||
468 | /* Catch kmemcheck conditions first of all! */ | ||
469 | if ((dr6 & DR_STEP) && kmemcheck_trap(regs)) | ||
470 | return; | ||
471 | @@ -575,7 +584,7 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) | ||
472 | regs->flags &= ~X86_EFLAGS_TF; | ||
473 | } | ||
474 | si_code = get_si_code(tsk->thread.debugreg6); | ||
475 | - if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS)) | ||
476 | + if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS) || user_icebp) | ||
477 | send_sigtrap(tsk, regs, error_code, si_code); | ||
478 | preempt_conditional_cli(regs); | ||
479 | |||
480 | diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c | ||
481 | index 8822021..ca7c528 100644 | ||
482 | --- a/arch/x86/kvm/mmu.c | ||
483 | +++ b/arch/x86/kvm/mmu.c | ||
484 | @@ -1849,6 +1849,9 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep, | ||
485 | |||
486 | spte |= PT_WRITABLE_MASK; | ||
487 | |||
488 | + if (!tdp_enabled && !(pte_access & ACC_WRITE_MASK)) | ||
489 | + spte &= ~PT_USER_MASK; | ||
490 | + | ||
491 | /* | ||
492 | * Optimization: for pte sync, if spte was writable the hash | ||
493 | * lookup is unnecessary (and expensive). Write protection | ||
494 | @@ -1904,6 +1907,8 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *sptep, | ||
495 | |||
496 | child = page_header(pte & PT64_BASE_ADDR_MASK); | ||
497 | mmu_page_remove_parent_pte(child, sptep); | ||
498 | + __set_spte(sptep, shadow_trap_nonpresent_pte); | ||
499 | + kvm_flush_remote_tlbs(vcpu->kvm); | ||
500 | } else if (pfn != spte_to_pfn(*sptep)) { | ||
501 | pgprintk("hfn old %lx new %lx\n", | ||
502 | spte_to_pfn(*sptep), pfn); | ||
503 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c | ||
504 | index a2f839c..8d128be 100644 | ||
505 | --- a/arch/x86/kvm/svm.c | ||
506 | +++ b/arch/x86/kvm/svm.c | ||
507 | @@ -27,6 +27,7 @@ | ||
508 | #include <linux/sched.h> | ||
509 | #include <linux/ftrace_event.h> | ||
510 | |||
511 | +#include <asm/tlbflush.h> | ||
512 | #include <asm/desc.h> | ||
513 | |||
514 | #include <asm/virtext.h> | ||
515 | @@ -54,6 +55,8 @@ MODULE_LICENSE("GPL"); | ||
516 | |||
517 | #define DEBUGCTL_RESERVED_BITS (~(0x3fULL)) | ||
518 | |||
519 | +static bool erratum_383_found __read_mostly; | ||
520 | + | ||
521 | static const u32 host_save_user_msrs[] = { | ||
522 | #ifdef CONFIG_X86_64 | ||
523 | MSR_STAR, MSR_LSTAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_KERNEL_GS_BASE, | ||
524 | @@ -297,6 +300,31 @@ static void skip_emulated_instruction(struct kvm_vcpu *vcpu) | ||
525 | svm_set_interrupt_shadow(vcpu, 0); | ||
526 | } | ||
527 | |||
528 | +static void svm_init_erratum_383(void) | ||
529 | +{ | ||
530 | + u32 low, high; | ||
531 | + int err; | ||
532 | + u64 val; | ||
533 | + | ||
534 | + /* Only Fam10h is affected */ | ||
535 | + if (boot_cpu_data.x86 != 0x10) | ||
536 | + return; | ||
537 | + | ||
538 | + /* Use _safe variants to not break nested virtualization */ | ||
539 | + val = native_read_msr_safe(MSR_AMD64_DC_CFG, &err); | ||
540 | + if (err) | ||
541 | + return; | ||
542 | + | ||
543 | + val |= (1ULL << 47); | ||
544 | + | ||
545 | + low = lower_32_bits(val); | ||
546 | + high = upper_32_bits(val); | ||
547 | + | ||
548 | + native_write_msr_safe(MSR_AMD64_DC_CFG, low, high); | ||
549 | + | ||
550 | + erratum_383_found = true; | ||
551 | +} | ||
552 | + | ||
553 | static int has_svm(void) | ||
554 | { | ||
555 | const char *msg; | ||
556 | @@ -352,6 +380,8 @@ static int svm_hardware_enable(void *garbage) | ||
557 | |||
558 | wrmsrl(MSR_VM_HSAVE_PA, page_to_pfn(sd->save_area) << PAGE_SHIFT); | ||
559 | |||
560 | + svm_init_erratum_383(); | ||
561 | + | ||
562 | return 0; | ||
563 | } | ||
564 | |||
565 | @@ -1255,8 +1285,59 @@ static int nm_interception(struct vcpu_svm *svm) | ||
566 | return 1; | ||
567 | } | ||
568 | |||
569 | -static int mc_interception(struct vcpu_svm *svm) | ||
570 | +static bool is_erratum_383(void) | ||
571 | { | ||
572 | + int err, i; | ||
573 | + u64 value; | ||
574 | + | ||
575 | + if (!erratum_383_found) | ||
576 | + return false; | ||
577 | + | ||
578 | + value = native_read_msr_safe(MSR_IA32_MC0_STATUS, &err); | ||
579 | + if (err) | ||
580 | + return false; | ||
581 | + | ||
582 | + /* Bit 62 may or may not be set for this mce */ | ||
583 | + value &= ~(1ULL << 62); | ||
584 | + | ||
585 | + if (value != 0xb600000000010015ULL) | ||
586 | + return false; | ||
587 | + | ||
588 | + /* Clear MCi_STATUS registers */ | ||
589 | + for (i = 0; i < 6; ++i) | ||
590 | + native_write_msr_safe(MSR_IA32_MCx_STATUS(i), 0, 0); | ||
591 | + | ||
592 | + value = native_read_msr_safe(MSR_IA32_MCG_STATUS, &err); | ||
593 | + if (!err) { | ||
594 | + u32 low, high; | ||
595 | + | ||
596 | + value &= ~(1ULL << 2); | ||
597 | + low = lower_32_bits(value); | ||
598 | + high = upper_32_bits(value); | ||
599 | + | ||
600 | + native_write_msr_safe(MSR_IA32_MCG_STATUS, low, high); | ||
601 | + } | ||
602 | + | ||
603 | + /* Flush tlb to evict multi-match entries */ | ||
604 | + __flush_tlb_all(); | ||
605 | + | ||
606 | + return true; | ||
607 | +} | ||
608 | + | ||
609 | +static void svm_handle_mce(struct vcpu_svm *svm) | ||
610 | +{ | ||
611 | + if (is_erratum_383()) { | ||
612 | + /* | ||
613 | + * Erratum 383 triggered. Guest state is corrupt so kill the | ||
614 | + * guest. | ||
615 | + */ | ||
616 | + pr_err("KVM: Guest triggered AMD Erratum 383\n"); | ||
617 | + | ||
618 | + set_bit(KVM_REQ_TRIPLE_FAULT, &svm->vcpu.requests); | ||
619 | + | ||
620 | + return; | ||
621 | + } | ||
622 | + | ||
623 | /* | ||
624 | * On an #MC intercept the MCE handler is not called automatically in | ||
625 | * the host. So do it by hand here. | ||
626 | @@ -1265,6 +1346,11 @@ static int mc_interception(struct vcpu_svm *svm) | ||
627 | "int $0x12\n"); | ||
628 | /* not sure if we ever come back to this point */ | ||
629 | |||
630 | + return; | ||
631 | +} | ||
632 | + | ||
633 | +static int mc_interception(struct vcpu_svm *svm) | ||
634 | +{ | ||
635 | return 1; | ||
636 | } | ||
637 | |||
638 | @@ -2820,6 +2906,14 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu) | ||
639 | vcpu->arch.regs_avail &= ~(1 << VCPU_EXREG_PDPTR); | ||
640 | vcpu->arch.regs_dirty &= ~(1 << VCPU_EXREG_PDPTR); | ||
641 | } | ||
642 | + | ||
643 | + /* | ||
644 | + * We need to handle MC intercepts here before the vcpu has a chance to | ||
645 | + * change the physical cpu | ||
646 | + */ | ||
647 | + if (unlikely(svm->vmcb->control.exit_code == | ||
648 | + SVM_EXIT_EXCP_BASE + MC_VECTOR)) | ||
649 | + svm_handle_mce(svm); | ||
650 | } | ||
651 | |||
652 | #undef R | ||
653 | diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c | ||
654 | index 0a979f3..1290ba5 100644 | ||
655 | --- a/arch/x86/power/cpu.c | ||
656 | +++ b/arch/x86/power/cpu.c | ||
657 | @@ -105,6 +105,8 @@ static void __save_processor_state(struct saved_context *ctxt) | ||
658 | ctxt->cr4 = read_cr4(); | ||
659 | ctxt->cr8 = read_cr8(); | ||
660 | #endif | ||
661 | + ctxt->misc_enable_saved = !rdmsrl_safe(MSR_IA32_MISC_ENABLE, | ||
662 | + &ctxt->misc_enable); | ||
663 | } | ||
664 | |||
665 | /* Needed by apm.c */ | ||
666 | @@ -152,6 +154,8 @@ static void fix_processor_context(void) | ||
667 | */ | ||
668 | static void __restore_processor_state(struct saved_context *ctxt) | ||
669 | { | ||
670 | + if (ctxt->misc_enable_saved) | ||
671 | + wrmsrl(MSR_IA32_MISC_ENABLE, ctxt->misc_enable); | ||
672 | /* | ||
673 | * control registers | ||
674 | */ | ||
675 | diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c | ||
676 | index d0f8146..7424bf9 100644 | ||
677 | --- a/block/cfq-iosched.c | ||
678 | +++ b/block/cfq-iosched.c | ||
679 | @@ -1934,6 +1934,15 @@ static void cfq_setup_merge(struct cfq_queue *cfqq, struct cfq_queue *new_cfqq) | ||
680 | int process_refs, new_process_refs; | ||
681 | struct cfq_queue *__cfqq; | ||
682 | |||
683 | + /* | ||
684 | + * If there are no process references on the new_cfqq, then it is | ||
685 | + * unsafe to follow the ->new_cfqq chain as other cfqq's in the | ||
686 | + * chain may have dropped their last reference (not just their | ||
687 | + * last process reference). | ||
688 | + */ | ||
689 | + if (!cfqq_process_refs(new_cfqq)) | ||
690 | + return; | ||
691 | + | ||
692 | /* Avoid a circular list and skip interim queue merges */ | ||
693 | while ((__cfqq = new_cfqq->new_cfqq)) { | ||
694 | if (__cfqq == cfqq) | ||
695 | @@ -1942,17 +1951,17 @@ static void cfq_setup_merge(struct cfq_queue *cfqq, struct cfq_queue *new_cfqq) | ||
696 | } | ||
697 | |||
698 | process_refs = cfqq_process_refs(cfqq); | ||
699 | + new_process_refs = cfqq_process_refs(new_cfqq); | ||
700 | /* | ||
701 | * If the process for the cfqq has gone away, there is no | ||
702 | * sense in merging the queues. | ||
703 | */ | ||
704 | - if (process_refs == 0) | ||
705 | + if (process_refs == 0 || new_process_refs == 0) | ||
706 | return; | ||
707 | |||
708 | /* | ||
709 | * Merge in the direction of the lesser amount of work. | ||
710 | */ | ||
711 | - new_process_refs = cfqq_process_refs(new_cfqq); | ||
712 | if (new_process_refs >= process_refs) { | ||
713 | cfqq->new_cfqq = new_cfqq; | ||
714 | atomic_add(process_refs, &new_cfqq->ref); | ||
715 | diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c | ||
716 | index cc978a8..64db828 100644 | ||
717 | --- a/drivers/acpi/processor_idle.c | ||
718 | +++ b/drivers/acpi/processor_idle.c | ||
719 | @@ -954,7 +954,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | ||
720 | if (acpi_idle_suspend) | ||
721 | return(acpi_idle_enter_c1(dev, state)); | ||
722 | |||
723 | - if (acpi_idle_bm_check()) { | ||
724 | + if (!cx->bm_sts_skip && acpi_idle_bm_check()) { | ||
725 | if (dev->safe_state) { | ||
726 | dev->last_state = dev->safe_state; | ||
727 | return dev->safe_state->enter(dev, dev->safe_state); | ||
728 | diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c | ||
729 | index 9ed9292..0458094 100644 | ||
730 | --- a/drivers/acpi/sleep.c | ||
731 | +++ b/drivers/acpi/sleep.c | ||
732 | @@ -80,22 +80,6 @@ static int acpi_sleep_prepare(u32 acpi_state) | ||
733 | |||
734 | #ifdef CONFIG_ACPI_SLEEP | ||
735 | static u32 acpi_target_sleep_state = ACPI_STATE_S0; | ||
736 | -/* | ||
737 | - * According to the ACPI specification the BIOS should make sure that ACPI is | ||
738 | - * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still, | ||
739 | - * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI | ||
740 | - * on such systems during resume. Unfortunately that doesn't help in | ||
741 | - * particularly pathological cases in which SCI_EN has to be set directly on | ||
742 | - * resume, although the specification states very clearly that this flag is | ||
743 | - * owned by the hardware. The set_sci_en_on_resume variable will be set in such | ||
744 | - * cases. | ||
745 | - */ | ||
746 | -static bool set_sci_en_on_resume; | ||
747 | - | ||
748 | -void __init acpi_set_sci_en_on_resume(void) | ||
749 | -{ | ||
750 | - set_sci_en_on_resume = true; | ||
751 | -} | ||
752 | |||
753 | /* | ||
754 | * ACPI 1.0 wants us to execute _PTS before suspending devices, so we allow the | ||
755 | @@ -253,11 +237,8 @@ static int acpi_suspend_enter(suspend_state_t pm_state) | ||
756 | break; | ||
757 | } | ||
758 | |||
759 | - /* If ACPI is not enabled by the BIOS, we need to enable it here. */ | ||
760 | - if (set_sci_en_on_resume) | ||
761 | - acpi_write_bit_register(ACPI_BITREG_SCI_ENABLE, 1); | ||
762 | - else | ||
763 | - acpi_enable(); | ||
764 | + /* This violates the spec but is required for bug compatibility. */ | ||
765 | + acpi_write_bit_register(ACPI_BITREG_SCI_ENABLE, 1); | ||
766 | |||
767 | /* Reprogram control registers and execute _BFS */ | ||
768 | acpi_leave_sleep_state_prep(acpi_state); | ||
769 | @@ -346,12 +327,6 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d) | ||
770 | return 0; | ||
771 | } | ||
772 | |||
773 | -static int __init init_set_sci_en_on_resume(const struct dmi_system_id *d) | ||
774 | -{ | ||
775 | - set_sci_en_on_resume = true; | ||
776 | - return 0; | ||
777 | -} | ||
778 | - | ||
779 | static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | ||
780 | { | ||
781 | .callback = init_old_suspend_ordering, | ||
782 | @@ -370,22 +345,6 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | ||
783 | }, | ||
784 | }, | ||
785 | { | ||
786 | - .callback = init_set_sci_en_on_resume, | ||
787 | - .ident = "Apple MacBook 1,1", | ||
788 | - .matches = { | ||
789 | - DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), | ||
790 | - DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), | ||
791 | - }, | ||
792 | - }, | ||
793 | - { | ||
794 | - .callback = init_set_sci_en_on_resume, | ||
795 | - .ident = "Apple MacMini 1,1", | ||
796 | - .matches = { | ||
797 | - DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), | ||
798 | - DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"), | ||
799 | - }, | ||
800 | - }, | ||
801 | - { | ||
802 | .callback = init_old_suspend_ordering, | ||
803 | .ident = "Asus Pundit P1-AH2 (M2N8L motherboard)", | ||
804 | .matches = { | ||
805 | @@ -394,94 +353,6 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | ||
806 | }, | ||
807 | }, | ||
808 | { | ||
809 | - .callback = init_set_sci_en_on_resume, | ||
810 | - .ident = "Toshiba Satellite L300", | ||
811 | - .matches = { | ||
812 | - DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
813 | - DMI_MATCH(DMI_PRODUCT_NAME, "Satellite L300"), | ||
814 | - }, | ||
815 | - }, | ||
816 | - { | ||
817 | - .callback = init_set_sci_en_on_resume, | ||
818 | - .ident = "Hewlett-Packard HP G7000 Notebook PC", | ||
819 | - .matches = { | ||
820 | - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
821 | - DMI_MATCH(DMI_PRODUCT_NAME, "HP G7000 Notebook PC"), | ||
822 | - }, | ||
823 | - }, | ||
824 | - { | ||
825 | - .callback = init_set_sci_en_on_resume, | ||
826 | - .ident = "Hewlett-Packard HP Pavilion dv3 Notebook PC", | ||
827 | - .matches = { | ||
828 | - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
829 | - DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv3 Notebook PC"), | ||
830 | - }, | ||
831 | - }, | ||
832 | - { | ||
833 | - .callback = init_set_sci_en_on_resume, | ||
834 | - .ident = "Hewlett-Packard Pavilion dv4", | ||
835 | - .matches = { | ||
836 | - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
837 | - DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv4"), | ||
838 | - }, | ||
839 | - }, | ||
840 | - { | ||
841 | - .callback = init_set_sci_en_on_resume, | ||
842 | - .ident = "Hewlett-Packard Pavilion dv7", | ||
843 | - .matches = { | ||
844 | - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
845 | - DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv7"), | ||
846 | - }, | ||
847 | - }, | ||
848 | - { | ||
849 | - .callback = init_set_sci_en_on_resume, | ||
850 | - .ident = "Hewlett-Packard Compaq Presario C700 Notebook PC", | ||
851 | - .matches = { | ||
852 | - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
853 | - DMI_MATCH(DMI_PRODUCT_NAME, "Compaq Presario C700 Notebook PC"), | ||
854 | - }, | ||
855 | - }, | ||
856 | - { | ||
857 | - .callback = init_set_sci_en_on_resume, | ||
858 | - .ident = "Hewlett-Packard Compaq Presario CQ40 Notebook PC", | ||
859 | - .matches = { | ||
860 | - DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
861 | - DMI_MATCH(DMI_PRODUCT_NAME, "Compaq Presario CQ40 Notebook PC"), | ||
862 | - }, | ||
863 | - }, | ||
864 | - { | ||
865 | - .callback = init_set_sci_en_on_resume, | ||
866 | - .ident = "Lenovo ThinkPad T410", | ||
867 | - .matches = { | ||
868 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
869 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T410"), | ||
870 | - }, | ||
871 | - }, | ||
872 | - { | ||
873 | - .callback = init_set_sci_en_on_resume, | ||
874 | - .ident = "Lenovo ThinkPad T510", | ||
875 | - .matches = { | ||
876 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
877 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T510"), | ||
878 | - }, | ||
879 | - }, | ||
880 | - { | ||
881 | - .callback = init_set_sci_en_on_resume, | ||
882 | - .ident = "Lenovo ThinkPad W510", | ||
883 | - .matches = { | ||
884 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
885 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W510"), | ||
886 | - }, | ||
887 | - }, | ||
888 | - { | ||
889 | - .callback = init_set_sci_en_on_resume, | ||
890 | - .ident = "Lenovo ThinkPad X201[s]", | ||
891 | - .matches = { | ||
892 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), | ||
893 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201"), | ||
894 | - }, | ||
895 | - }, | ||
896 | - { | ||
897 | .callback = init_old_suspend_ordering, | ||
898 | .ident = "Panasonic CF51-2L", | ||
899 | .matches = { | ||
900 | @@ -490,30 +361,6 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { | ||
901 | DMI_MATCH(DMI_BOARD_NAME, "CF51-2L"), | ||
902 | }, | ||
903 | }, | ||
904 | - { | ||
905 | - .callback = init_set_sci_en_on_resume, | ||
906 | - .ident = "Dell Studio 1558", | ||
907 | - .matches = { | ||
908 | - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
909 | - DMI_MATCH(DMI_PRODUCT_NAME, "Studio 1558"), | ||
910 | - }, | ||
911 | - }, | ||
912 | - { | ||
913 | - .callback = init_set_sci_en_on_resume, | ||
914 | - .ident = "Dell Studio 1557", | ||
915 | - .matches = { | ||
916 | - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
917 | - DMI_MATCH(DMI_PRODUCT_NAME, "Studio 1557"), | ||
918 | - }, | ||
919 | - }, | ||
920 | - { | ||
921 | - .callback = init_set_sci_en_on_resume, | ||
922 | - .ident = "Dell Studio 1555", | ||
923 | - .matches = { | ||
924 | - DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), | ||
925 | - DMI_MATCH(DMI_PRODUCT_NAME, "Studio 1555"), | ||
926 | - }, | ||
927 | - }, | ||
928 | {}, | ||
929 | }; | ||
930 | #endif /* CONFIG_SUSPEND */ | ||
931 | diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c | ||
932 | index 462200d..9c6747c 100644 | ||
933 | --- a/drivers/ata/ahci.c | ||
934 | +++ b/drivers/ata/ahci.c | ||
935 | @@ -3037,6 +3037,16 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
936 | if (pdev->vendor == PCI_VENDOR_ID_MARVELL && !marvell_enable) | ||
937 | return -ENODEV; | ||
938 | |||
939 | + /* | ||
940 | + * For some reason, MCP89 on MacBook 7,1 doesn't work with | ||
941 | + * ahci, use ata_generic instead. | ||
942 | + */ | ||
943 | + if (pdev->vendor == PCI_VENDOR_ID_NVIDIA && | ||
944 | + pdev->device == PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA && | ||
945 | + pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE && | ||
946 | + pdev->subsystem_device == 0xcb89) | ||
947 | + return -ENODEV; | ||
948 | + | ||
949 | /* Promise's PDC42819 is a SAS/SATA controller that has an AHCI mode. | ||
950 | * At the moment, we can only use the AHCI mode. Let the users know | ||
951 | * that for SAS drives they're out of luck. | ||
952 | diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c | ||
953 | index 12e26c3..151eb43 100644 | ||
954 | --- a/drivers/ata/ata_generic.c | ||
955 | +++ b/drivers/ata/ata_generic.c | ||
956 | @@ -168,6 +168,12 @@ static struct pci_device_id ata_generic[] = { | ||
957 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C561), }, | ||
958 | { PCI_DEVICE(PCI_VENDOR_ID_OPTI, PCI_DEVICE_ID_OPTI_82C558), }, | ||
959 | { PCI_DEVICE(PCI_VENDOR_ID_CENATEK,PCI_DEVICE_ID_CENATEK_IDE), }, | ||
960 | + /* | ||
961 | + * For some reason, MCP89 on MacBook 7,1 doesn't work with | ||
962 | + * ahci, use ata_generic instead. | ||
963 | + */ | ||
964 | + { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA, | ||
965 | + PCI_VENDOR_ID_APPLE, 0xcb89, }, | ||
966 | #if !defined(CONFIG_PATA_TOSHIBA) && !defined(CONFIG_PATA_TOSHIBA_MODULE) | ||
967 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_1), }, | ||
968 | { PCI_DEVICE(PCI_VENDOR_ID_TOSHIBA,PCI_DEVICE_ID_TOSHIBA_PICCOLO_2), }, | ||
969 | diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c | ||
970 | index a950241..ff911ae 100644 | ||
971 | --- a/drivers/base/firmware_class.c | ||
972 | +++ b/drivers/base/firmware_class.c | ||
973 | @@ -125,6 +125,17 @@ static ssize_t firmware_loading_show(struct device *dev, | ||
974 | return sprintf(buf, "%d\n", loading); | ||
975 | } | ||
976 | |||
977 | +static void firmware_free_data(const struct firmware *fw) | ||
978 | +{ | ||
979 | + int i; | ||
980 | + vunmap(fw->data); | ||
981 | + if (fw->pages) { | ||
982 | + for (i = 0; i < PFN_UP(fw->size); i++) | ||
983 | + __free_page(fw->pages[i]); | ||
984 | + kfree(fw->pages); | ||
985 | + } | ||
986 | +} | ||
987 | + | ||
988 | /* Some architectures don't have PAGE_KERNEL_RO */ | ||
989 | #ifndef PAGE_KERNEL_RO | ||
990 | #define PAGE_KERNEL_RO PAGE_KERNEL | ||
991 | @@ -157,21 +168,21 @@ static ssize_t firmware_loading_store(struct device *dev, | ||
992 | mutex_unlock(&fw_lock); | ||
993 | break; | ||
994 | } | ||
995 | - vfree(fw_priv->fw->data); | ||
996 | - fw_priv->fw->data = NULL; | ||
997 | + firmware_free_data(fw_priv->fw); | ||
998 | + memset(fw_priv->fw, 0, sizeof(struct firmware)); | ||
999 | + /* If the pages are not owned by 'struct firmware' */ | ||
1000 | for (i = 0; i < fw_priv->nr_pages; i++) | ||
1001 | __free_page(fw_priv->pages[i]); | ||
1002 | kfree(fw_priv->pages); | ||
1003 | fw_priv->pages = NULL; | ||
1004 | fw_priv->page_array_size = 0; | ||
1005 | fw_priv->nr_pages = 0; | ||
1006 | - fw_priv->fw->size = 0; | ||
1007 | set_bit(FW_STATUS_LOADING, &fw_priv->status); | ||
1008 | mutex_unlock(&fw_lock); | ||
1009 | break; | ||
1010 | case 0: | ||
1011 | if (test_bit(FW_STATUS_LOADING, &fw_priv->status)) { | ||
1012 | - vfree(fw_priv->fw->data); | ||
1013 | + vunmap(fw_priv->fw->data); | ||
1014 | fw_priv->fw->data = vmap(fw_priv->pages, | ||
1015 | fw_priv->nr_pages, | ||
1016 | 0, PAGE_KERNEL_RO); | ||
1017 | @@ -179,7 +190,10 @@ static ssize_t firmware_loading_store(struct device *dev, | ||
1018 | dev_err(dev, "%s: vmap() failed\n", __func__); | ||
1019 | goto err; | ||
1020 | } | ||
1021 | - /* Pages will be freed by vfree() */ | ||
1022 | + /* Pages are now owned by 'struct firmware' */ | ||
1023 | + fw_priv->fw->pages = fw_priv->pages; | ||
1024 | + fw_priv->pages = NULL; | ||
1025 | + | ||
1026 | fw_priv->page_array_size = 0; | ||
1027 | fw_priv->nr_pages = 0; | ||
1028 | complete(&fw_priv->completion); | ||
1029 | @@ -572,7 +586,7 @@ release_firmware(const struct firmware *fw) | ||
1030 | if (fw->data == builtin->data) | ||
1031 | goto free_fw; | ||
1032 | } | ||
1033 | - vfree(fw->data); | ||
1034 | + firmware_free_data(fw); | ||
1035 | free_fw: | ||
1036 | kfree(fw); | ||
1037 | } | ||
1038 | diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c | ||
1039 | index fd50ead..93f56d6 100644 | ||
1040 | --- a/drivers/char/agp/amd64-agp.c | ||
1041 | +++ b/drivers/char/agp/amd64-agp.c | ||
1042 | @@ -499,6 +499,10 @@ static int __devinit agp_amd64_probe(struct pci_dev *pdev, | ||
1043 | u8 cap_ptr; | ||
1044 | int err; | ||
1045 | |||
1046 | + /* The Highlander principle */ | ||
1047 | + if (agp_bridges_found) | ||
1048 | + return -ENODEV; | ||
1049 | + | ||
1050 | cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP); | ||
1051 | if (!cap_ptr) | ||
1052 | return -ENODEV; | ||
1053 | @@ -562,6 +566,8 @@ static void __devexit agp_amd64_remove(struct pci_dev *pdev) | ||
1054 | amd64_aperture_sizes[bridge->aperture_size_idx].size); | ||
1055 | agp_remove_bridge(bridge); | ||
1056 | agp_put_bridge(bridge); | ||
1057 | + | ||
1058 | + agp_bridges_found--; | ||
1059 | } | ||
1060 | |||
1061 | #ifdef CONFIG_PM | ||
1062 | @@ -709,6 +715,11 @@ static struct pci_device_id agp_amd64_pci_table[] = { | ||
1063 | |||
1064 | MODULE_DEVICE_TABLE(pci, agp_amd64_pci_table); | ||
1065 | |||
1066 | +static DEFINE_PCI_DEVICE_TABLE(agp_amd64_pci_promisc_table) = { | ||
1067 | + { PCI_DEVICE_CLASS(0, 0) }, | ||
1068 | + { } | ||
1069 | +}; | ||
1070 | + | ||
1071 | static struct pci_driver agp_amd64_pci_driver = { | ||
1072 | .name = "agpgart-amd64", | ||
1073 | .id_table = agp_amd64_pci_table, | ||
1074 | @@ -734,7 +745,6 @@ int __init agp_amd64_init(void) | ||
1075 | return err; | ||
1076 | |||
1077 | if (agp_bridges_found == 0) { | ||
1078 | - struct pci_dev *dev; | ||
1079 | if (!agp_try_unsupported && !agp_try_unsupported_boot) { | ||
1080 | printk(KERN_INFO PFX "No supported AGP bridge found.\n"); | ||
1081 | #ifdef MODULE | ||
1082 | @@ -750,17 +760,10 @@ int __init agp_amd64_init(void) | ||
1083 | return -ENODEV; | ||
1084 | |||
1085 | /* Look for any AGP bridge */ | ||
1086 | - dev = NULL; | ||
1087 | - err = -ENODEV; | ||
1088 | - for_each_pci_dev(dev) { | ||
1089 | - if (!pci_find_capability(dev, PCI_CAP_ID_AGP)) | ||
1090 | - continue; | ||
1091 | - /* Only one bridge supported right now */ | ||
1092 | - if (agp_amd64_probe(dev, NULL) == 0) { | ||
1093 | - err = 0; | ||
1094 | - break; | ||
1095 | - } | ||
1096 | - } | ||
1097 | + agp_amd64_pci_driver.id_table = agp_amd64_pci_promisc_table; | ||
1098 | + err = driver_attach(&agp_amd64_pci_driver.driver); | ||
1099 | + if (err == 0 && agp_bridges_found == 0) | ||
1100 | + err = -ENODEV; | ||
1101 | } | ||
1102 | return err; | ||
1103 | } | ||
1104 | diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h | ||
1105 | index 8e00b4d..792868d 100644 | ||
1106 | --- a/drivers/char/tpm/tpm.h | ||
1107 | +++ b/drivers/char/tpm/tpm.h | ||
1108 | @@ -224,6 +224,7 @@ struct tpm_readpubek_params_out { | ||
1109 | u8 algorithm[4]; | ||
1110 | u8 encscheme[2]; | ||
1111 | u8 sigscheme[2]; | ||
1112 | + __be32 paramsize; | ||
1113 | u8 parameters[12]; /*assuming RSA*/ | ||
1114 | __be32 keysize; | ||
1115 | u8 modulus[256]; | ||
1116 | diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c | ||
1117 | index 2405f17..ca15c04 100644 | ||
1118 | --- a/drivers/char/tpm/tpm_tis.c | ||
1119 | +++ b/drivers/char/tpm/tpm_tis.c | ||
1120 | @@ -622,7 +622,14 @@ static int tpm_tis_pnp_suspend(struct pnp_dev *dev, pm_message_t msg) | ||
1121 | |||
1122 | static int tpm_tis_pnp_resume(struct pnp_dev *dev) | ||
1123 | { | ||
1124 | - return tpm_pm_resume(&dev->dev); | ||
1125 | + struct tpm_chip *chip = pnp_get_drvdata(dev); | ||
1126 | + int ret; | ||
1127 | + | ||
1128 | + ret = tpm_pm_resume(&dev->dev); | ||
1129 | + if (!ret) | ||
1130 | + tpm_continue_selftest(chip); | ||
1131 | + | ||
1132 | + return ret; | ||
1133 | } | ||
1134 | |||
1135 | static struct pnp_device_id tpm_pnp_tbl[] __devinitdata = { | ||
1136 | diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c | ||
1137 | index 67bc2ec..295dc63 100644 | ||
1138 | --- a/drivers/cpufreq/cpufreq.c | ||
1139 | +++ b/drivers/cpufreq/cpufreq.c | ||
1140 | @@ -1765,17 +1765,8 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, | ||
1141 | dprintk("governor switch\n"); | ||
1142 | |||
1143 | /* end old governor */ | ||
1144 | - if (data->governor) { | ||
1145 | - /* | ||
1146 | - * Need to release the rwsem around governor | ||
1147 | - * stop due to lock dependency between | ||
1148 | - * cancel_delayed_work_sync and the read lock | ||
1149 | - * taken in the delayed work handler. | ||
1150 | - */ | ||
1151 | - unlock_policy_rwsem_write(data->cpu); | ||
1152 | + if (data->governor) | ||
1153 | __cpufreq_governor(data, CPUFREQ_GOV_STOP); | ||
1154 | - lock_policy_rwsem_write(data->cpu); | ||
1155 | - } | ||
1156 | |||
1157 | /* start new governor */ | ||
1158 | data->governor = policy->governor; | ||
1159 | diff --git a/drivers/edac/Kconfig b/drivers/edac/Kconfig | ||
1160 | index 55c9c59..d3b21a5 100644 | ||
1161 | --- a/drivers/edac/Kconfig | ||
1162 | +++ b/drivers/edac/Kconfig | ||
1163 | @@ -196,7 +196,7 @@ config EDAC_I5100 | ||
1164 | |||
1165 | config EDAC_MPC85XX | ||
1166 | tristate "Freescale MPC83xx / MPC85xx" | ||
1167 | - depends on EDAC_MM_EDAC && FSL_SOC && (PPC_83xx || MPC85xx) | ||
1168 | + depends on EDAC_MM_EDAC && FSL_SOC && (PPC_83xx || PPC_85xx) | ||
1169 | help | ||
1170 | Support for error detection and correction on the Freescale | ||
1171 | MPC8349, MPC8560, MPC8540, MPC8548 | ||
1172 | diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c | ||
1173 | index 3391e67..72904c8 100644 | ||
1174 | --- a/drivers/edac/amd64_edac.c | ||
1175 | +++ b/drivers/edac/amd64_edac.c | ||
1176 | @@ -1958,20 +1958,20 @@ static int get_channel_from_ecc_syndrome(struct mem_ctl_info *mci, u16 syndrome) | ||
1177 | u32 value = 0; | ||
1178 | int err_sym = 0; | ||
1179 | |||
1180 | - amd64_read_pci_cfg(pvt->misc_f3_ctl, 0x180, &value); | ||
1181 | + if (boot_cpu_data.x86 == 0x10) { | ||
1182 | |||
1183 | - /* F3x180[EccSymbolSize]=1, x8 symbols */ | ||
1184 | - if (boot_cpu_data.x86 == 0x10 && | ||
1185 | - boot_cpu_data.x86_model > 7 && | ||
1186 | - value & BIT(25)) { | ||
1187 | - err_sym = decode_syndrome(syndrome, x8_vectors, | ||
1188 | - ARRAY_SIZE(x8_vectors), 8); | ||
1189 | - return map_err_sym_to_channel(err_sym, 8); | ||
1190 | - } else { | ||
1191 | - err_sym = decode_syndrome(syndrome, x4_vectors, | ||
1192 | - ARRAY_SIZE(x4_vectors), 4); | ||
1193 | - return map_err_sym_to_channel(err_sym, 4); | ||
1194 | + amd64_read_pci_cfg(pvt->misc_f3_ctl, 0x180, &value); | ||
1195 | + | ||
1196 | + /* F3x180[EccSymbolSize]=1 => x8 symbols */ | ||
1197 | + if (boot_cpu_data.x86_model > 7 && | ||
1198 | + value & BIT(25)) { | ||
1199 | + err_sym = decode_syndrome(syndrome, x8_vectors, | ||
1200 | + ARRAY_SIZE(x8_vectors), 8); | ||
1201 | + return map_err_sym_to_channel(err_sym, 8); | ||
1202 | + } | ||
1203 | } | ||
1204 | + err_sym = decode_syndrome(syndrome, x4_vectors, ARRAY_SIZE(x4_vectors), 4); | ||
1205 | + return map_err_sym_to_channel(err_sym, 4); | ||
1206 | } | ||
1207 | |||
1208 | /* | ||
1209 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c | ||
1210 | index 930664c..73bd7f4 100644 | ||
1211 | --- a/drivers/gpu/drm/i915/i915_drv.c | ||
1212 | +++ b/drivers/gpu/drm/i915/i915_drv.c | ||
1213 | @@ -328,6 +328,7 @@ int i965_reset(struct drm_device *dev, u8 flags) | ||
1214 | } | ||
1215 | } else { | ||
1216 | DRM_ERROR("Error occurred. Don't know how to reset this chip.\n"); | ||
1217 | + mutex_unlock(&dev->struct_mutex); | ||
1218 | return -ENODEV; | ||
1219 | } | ||
1220 | |||
1221 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c | ||
1222 | index 4a44de4..8a41c4e 100644 | ||
1223 | --- a/drivers/gpu/drm/i915/i915_gem.c | ||
1224 | +++ b/drivers/gpu/drm/i915/i915_gem.c | ||
1225 | @@ -2288,8 +2288,9 @@ i915_gem_object_get_pages(struct drm_gem_object *obj, | ||
1226 | mapping = inode->i_mapping; | ||
1227 | for (i = 0; i < page_count; i++) { | ||
1228 | page = read_cache_page_gfp(mapping, i, | ||
1229 | - mapping_gfp_mask (mapping) | | ||
1230 | + GFP_HIGHUSER | | ||
1231 | __GFP_COLD | | ||
1232 | + __GFP_RECLAIMABLE | | ||
1233 | gfpmask); | ||
1234 | if (IS_ERR(page)) | ||
1235 | goto err_pages; | ||
1236 | @@ -4998,6 +4999,16 @@ i915_gem_load(struct drm_device *dev) | ||
1237 | list_add(&dev_priv->mm.shrink_list, &shrink_list); | ||
1238 | spin_unlock(&shrink_list_lock); | ||
1239 | |||
1240 | + /* On GEN3 we really need to make sure the ARB C3 LP bit is set */ | ||
1241 | + if (IS_GEN3(dev)) { | ||
1242 | + u32 tmp = I915_READ(MI_ARB_STATE); | ||
1243 | + if (!(tmp & MI_ARB_C3_LP_WRITE_ENABLE)) { | ||
1244 | + /* arb state is a masked write, so set bit + bit in mask */ | ||
1245 | + tmp = MI_ARB_C3_LP_WRITE_ENABLE | (MI_ARB_C3_LP_WRITE_ENABLE << MI_ARB_MASK_SHIFT); | ||
1246 | + I915_WRITE(MI_ARB_STATE, tmp); | ||
1247 | + } | ||
1248 | + } | ||
1249 | + | ||
1250 | /* Old X drivers will take 0-2 for front, back, depth buffers */ | ||
1251 | dev_priv->fence_reg_start = 3; | ||
1252 | |||
1253 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h | ||
1254 | index 30a2322..635d349 100644 | ||
1255 | --- a/drivers/gpu/drm/i915/i915_reg.h | ||
1256 | +++ b/drivers/gpu/drm/i915/i915_reg.h | ||
1257 | @@ -326,6 +326,70 @@ | ||
1258 | #define LM_BURST_LENGTH 0x00000700 | ||
1259 | #define LM_FIFO_WATERMARK 0x0000001F | ||
1260 | #define MI_ARB_STATE 0x020e4 /* 915+ only */ | ||
1261 | +#define MI_ARB_MASK_SHIFT 16 /* shift for enable bits */ | ||
1262 | + | ||
1263 | +/* Make render/texture TLB fetches lower priorty than associated data | ||
1264 | + * fetches. This is not turned on by default | ||
1265 | + */ | ||
1266 | +#define MI_ARB_RENDER_TLB_LOW_PRIORITY (1 << 15) | ||
1267 | + | ||
1268 | +/* Isoch request wait on GTT enable (Display A/B/C streams). | ||
1269 | + * Make isoch requests stall on the TLB update. May cause | ||
1270 | + * display underruns (test mode only) | ||
1271 | + */ | ||
1272 | +#define MI_ARB_ISOCH_WAIT_GTT (1 << 14) | ||
1273 | + | ||
1274 | +/* Block grant count for isoch requests when block count is | ||
1275 | + * set to a finite value. | ||
1276 | + */ | ||
1277 | +#define MI_ARB_BLOCK_GRANT_MASK (3 << 12) | ||
1278 | +#define MI_ARB_BLOCK_GRANT_8 (0 << 12) /* for 3 display planes */ | ||
1279 | +#define MI_ARB_BLOCK_GRANT_4 (1 << 12) /* for 2 display planes */ | ||
1280 | +#define MI_ARB_BLOCK_GRANT_2 (2 << 12) /* for 1 display plane */ | ||
1281 | +#define MI_ARB_BLOCK_GRANT_0 (3 << 12) /* don't use */ | ||
1282 | + | ||
1283 | +/* Enable render writes to complete in C2/C3/C4 power states. | ||
1284 | + * If this isn't enabled, render writes are prevented in low | ||
1285 | + * power states. That seems bad to me. | ||
1286 | + */ | ||
1287 | +#define MI_ARB_C3_LP_WRITE_ENABLE (1 << 11) | ||
1288 | + | ||
1289 | +/* This acknowledges an async flip immediately instead | ||
1290 | + * of waiting for 2TLB fetches. | ||
1291 | + */ | ||
1292 | +#define MI_ARB_ASYNC_FLIP_ACK_IMMEDIATE (1 << 10) | ||
1293 | + | ||
1294 | +/* Enables non-sequential data reads through arbiter | ||
1295 | + */ | ||
1296 | +#define MI_ARB_DUAL_DATA_PHASE_DISABLE (1 << 9) | ||
1297 | + | ||
1298 | +/* Disable FSB snooping of cacheable write cycles from binner/render | ||
1299 | + * command stream | ||
1300 | + */ | ||
1301 | +#define MI_ARB_CACHE_SNOOP_DISABLE (1 << 8) | ||
1302 | + | ||
1303 | +/* Arbiter time slice for non-isoch streams */ | ||
1304 | +#define MI_ARB_TIME_SLICE_MASK (7 << 5) | ||
1305 | +#define MI_ARB_TIME_SLICE_1 (0 << 5) | ||
1306 | +#define MI_ARB_TIME_SLICE_2 (1 << 5) | ||
1307 | +#define MI_ARB_TIME_SLICE_4 (2 << 5) | ||
1308 | +#define MI_ARB_TIME_SLICE_6 (3 << 5) | ||
1309 | +#define MI_ARB_TIME_SLICE_8 (4 << 5) | ||
1310 | +#define MI_ARB_TIME_SLICE_10 (5 << 5) | ||
1311 | +#define MI_ARB_TIME_SLICE_14 (6 << 5) | ||
1312 | +#define MI_ARB_TIME_SLICE_16 (7 << 5) | ||
1313 | + | ||
1314 | +/* Low priority grace period page size */ | ||
1315 | +#define MI_ARB_LOW_PRIORITY_GRACE_4KB (0 << 4) /* default */ | ||
1316 | +#define MI_ARB_LOW_PRIORITY_GRACE_8KB (1 << 4) | ||
1317 | + | ||
1318 | +/* Disable display A/B trickle feed */ | ||
1319 | +#define MI_ARB_DISPLAY_TRICKLE_FEED_DISABLE (1 << 2) | ||
1320 | + | ||
1321 | +/* Set display plane priority */ | ||
1322 | +#define MI_ARB_DISPLAY_PRIORITY_A_B (0 << 0) /* display A > display B */ | ||
1323 | +#define MI_ARB_DISPLAY_PRIORITY_B_A (1 << 0) /* display B > display A */ | ||
1324 | + | ||
1325 | #define CACHE_MODE_0 0x02120 /* 915+ only */ | ||
1326 | #define CM0_MASK_SHIFT 16 | ||
1327 | #define CM0_IZ_OPT_DISABLE (1<<6) | ||
1328 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | ||
1329 | index 3f00902..d63173a 100644 | ||
1330 | --- a/drivers/gpu/drm/i915/intel_display.c | ||
1331 | +++ b/drivers/gpu/drm/i915/intel_display.c | ||
1332 | @@ -879,8 +879,8 @@ intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, | ||
1333 | intel_clock_t clock; | ||
1334 | int max_n; | ||
1335 | bool found; | ||
1336 | - /* approximately equals target * 0.00488 */ | ||
1337 | - int err_most = (target >> 8) + (target >> 10); | ||
1338 | + /* approximately equals target * 0.00585 */ | ||
1339 | + int err_most = (target >> 8) + (target >> 9); | ||
1340 | found = false; | ||
1341 | |||
1342 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { | ||
1343 | diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c | ||
1344 | index c0d4650..3ecd236 100644 | ||
1345 | --- a/drivers/gpu/drm/radeon/r100.c | ||
1346 | +++ b/drivers/gpu/drm/radeon/r100.c | ||
1347 | @@ -1384,6 +1384,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | ||
1348 | case RADEON_TXFORMAT_RGB332: | ||
1349 | case RADEON_TXFORMAT_Y8: | ||
1350 | track->textures[i].cpp = 1; | ||
1351 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1352 | break; | ||
1353 | case RADEON_TXFORMAT_AI88: | ||
1354 | case RADEON_TXFORMAT_ARGB1555: | ||
1355 | @@ -1395,12 +1396,14 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | ||
1356 | case RADEON_TXFORMAT_LDUDV655: | ||
1357 | case RADEON_TXFORMAT_DUDV88: | ||
1358 | track->textures[i].cpp = 2; | ||
1359 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1360 | break; | ||
1361 | case RADEON_TXFORMAT_ARGB8888: | ||
1362 | case RADEON_TXFORMAT_RGBA8888: | ||
1363 | case RADEON_TXFORMAT_SHADOW32: | ||
1364 | case RADEON_TXFORMAT_LDUDUV8888: | ||
1365 | track->textures[i].cpp = 4; | ||
1366 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1367 | break; | ||
1368 | case RADEON_TXFORMAT_DXT1: | ||
1369 | track->textures[i].cpp = 1; | ||
1370 | @@ -2750,33 +2753,6 @@ static inline void r100_cs_track_texture_print(struct r100_cs_track_texture *t) | ||
1371 | DRM_ERROR("compress format %d\n", t->compress_format); | ||
1372 | } | ||
1373 | |||
1374 | -static int r100_cs_track_cube(struct radeon_device *rdev, | ||
1375 | - struct r100_cs_track *track, unsigned idx) | ||
1376 | -{ | ||
1377 | - unsigned face, w, h; | ||
1378 | - struct radeon_bo *cube_robj; | ||
1379 | - unsigned long size; | ||
1380 | - | ||
1381 | - for (face = 0; face < 5; face++) { | ||
1382 | - cube_robj = track->textures[idx].cube_info[face].robj; | ||
1383 | - w = track->textures[idx].cube_info[face].width; | ||
1384 | - h = track->textures[idx].cube_info[face].height; | ||
1385 | - | ||
1386 | - size = w * h; | ||
1387 | - size *= track->textures[idx].cpp; | ||
1388 | - | ||
1389 | - size += track->textures[idx].cube_info[face].offset; | ||
1390 | - | ||
1391 | - if (size > radeon_bo_size(cube_robj)) { | ||
1392 | - DRM_ERROR("Cube texture offset greater than object size %lu %lu\n", | ||
1393 | - size, radeon_bo_size(cube_robj)); | ||
1394 | - r100_cs_track_texture_print(&track->textures[idx]); | ||
1395 | - return -1; | ||
1396 | - } | ||
1397 | - } | ||
1398 | - return 0; | ||
1399 | -} | ||
1400 | - | ||
1401 | static int r100_track_compress_size(int compress_format, int w, int h) | ||
1402 | { | ||
1403 | int block_width, block_height, block_bytes; | ||
1404 | @@ -2807,6 +2783,37 @@ static int r100_track_compress_size(int compress_format, int w, int h) | ||
1405 | return sz; | ||
1406 | } | ||
1407 | |||
1408 | +static int r100_cs_track_cube(struct radeon_device *rdev, | ||
1409 | + struct r100_cs_track *track, unsigned idx) | ||
1410 | +{ | ||
1411 | + unsigned face, w, h; | ||
1412 | + struct radeon_bo *cube_robj; | ||
1413 | + unsigned long size; | ||
1414 | + unsigned compress_format = track->textures[idx].compress_format; | ||
1415 | + | ||
1416 | + for (face = 0; face < 5; face++) { | ||
1417 | + cube_robj = track->textures[idx].cube_info[face].robj; | ||
1418 | + w = track->textures[idx].cube_info[face].width; | ||
1419 | + h = track->textures[idx].cube_info[face].height; | ||
1420 | + | ||
1421 | + if (compress_format) { | ||
1422 | + size = r100_track_compress_size(compress_format, w, h); | ||
1423 | + } else | ||
1424 | + size = w * h; | ||
1425 | + size *= track->textures[idx].cpp; | ||
1426 | + | ||
1427 | + size += track->textures[idx].cube_info[face].offset; | ||
1428 | + | ||
1429 | + if (size > radeon_bo_size(cube_robj)) { | ||
1430 | + DRM_ERROR("Cube texture offset greater than object size %lu %lu\n", | ||
1431 | + size, radeon_bo_size(cube_robj)); | ||
1432 | + r100_cs_track_texture_print(&track->textures[idx]); | ||
1433 | + return -1; | ||
1434 | + } | ||
1435 | + } | ||
1436 | + return 0; | ||
1437 | +} | ||
1438 | + | ||
1439 | static int r100_cs_track_texture_check(struct radeon_device *rdev, | ||
1440 | struct r100_cs_track *track) | ||
1441 | { | ||
1442 | diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c | ||
1443 | index ff1e0cd..f890fd3 100644 | ||
1444 | --- a/drivers/gpu/drm/radeon/r200.c | ||
1445 | +++ b/drivers/gpu/drm/radeon/r200.c | ||
1446 | @@ -368,6 +368,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | ||
1447 | /* 2D, 3D, CUBE */ | ||
1448 | switch (tmp) { | ||
1449 | case 0: | ||
1450 | + case 3: | ||
1451 | + case 4: | ||
1452 | case 5: | ||
1453 | case 6: | ||
1454 | case 7: | ||
1455 | @@ -403,6 +405,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | ||
1456 | case R200_TXFORMAT_RGB332: | ||
1457 | case R200_TXFORMAT_Y8: | ||
1458 | track->textures[i].cpp = 1; | ||
1459 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1460 | break; | ||
1461 | case R200_TXFORMAT_AI88: | ||
1462 | case R200_TXFORMAT_ARGB1555: | ||
1463 | @@ -414,6 +417,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | ||
1464 | case R200_TXFORMAT_DVDU88: | ||
1465 | case R200_TXFORMAT_AVYU4444: | ||
1466 | track->textures[i].cpp = 2; | ||
1467 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1468 | break; | ||
1469 | case R200_TXFORMAT_ARGB8888: | ||
1470 | case R200_TXFORMAT_RGBA8888: | ||
1471 | @@ -421,6 +425,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | ||
1472 | case R200_TXFORMAT_BGR111110: | ||
1473 | case R200_TXFORMAT_LDVDU8888: | ||
1474 | track->textures[i].cpp = 4; | ||
1475 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1476 | break; | ||
1477 | case R200_TXFORMAT_DXT1: | ||
1478 | track->textures[i].cpp = 1; | ||
1479 | diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c | ||
1480 | index 5bdfaf2..7e9868d 100644 | ||
1481 | --- a/drivers/gpu/drm/radeon/r300.c | ||
1482 | +++ b/drivers/gpu/drm/radeon/r300.c | ||
1483 | @@ -870,6 +870,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | ||
1484 | case R300_TX_FORMAT_Y4X4: | ||
1485 | case R300_TX_FORMAT_Z3Y3X2: | ||
1486 | track->textures[i].cpp = 1; | ||
1487 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1488 | break; | ||
1489 | case R300_TX_FORMAT_X16: | ||
1490 | case R300_TX_FORMAT_Y8X8: | ||
1491 | @@ -881,6 +882,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | ||
1492 | case R300_TX_FORMAT_B8G8_B8G8: | ||
1493 | case R300_TX_FORMAT_G8R8_G8B8: | ||
1494 | track->textures[i].cpp = 2; | ||
1495 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1496 | break; | ||
1497 | case R300_TX_FORMAT_Y16X16: | ||
1498 | case R300_TX_FORMAT_Z11Y11X10: | ||
1499 | @@ -891,14 +893,17 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | ||
1500 | case R300_TX_FORMAT_FL_I32: | ||
1501 | case 0x1e: | ||
1502 | track->textures[i].cpp = 4; | ||
1503 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1504 | break; | ||
1505 | case R300_TX_FORMAT_W16Z16Y16X16: | ||
1506 | case R300_TX_FORMAT_FL_R16G16B16A16: | ||
1507 | case R300_TX_FORMAT_FL_I32A32: | ||
1508 | track->textures[i].cpp = 8; | ||
1509 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1510 | break; | ||
1511 | case R300_TX_FORMAT_FL_R32G32B32A32: | ||
1512 | track->textures[i].cpp = 16; | ||
1513 | + track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
1514 | break; | ||
1515 | case R300_TX_FORMAT_DXT1: | ||
1516 | track->textures[i].cpp = 1; | ||
1517 | diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c | ||
1518 | index ff02664..e249933 100644 | ||
1519 | --- a/drivers/gpu/drm/radeon/radeon_atombios.c | ||
1520 | +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | ||
1521 | @@ -268,6 +268,15 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, | ||
1522 | } | ||
1523 | } | ||
1524 | |||
1525 | + /* ASUS HD 3600 board lists the DVI port as HDMI */ | ||
1526 | + if ((dev->pdev->device == 0x9598) && | ||
1527 | + (dev->pdev->subsystem_vendor == 0x1043) && | ||
1528 | + (dev->pdev->subsystem_device == 0x01e4)) { | ||
1529 | + if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) { | ||
1530 | + *connector_type = DRM_MODE_CONNECTOR_DVII; | ||
1531 | + } | ||
1532 | + } | ||
1533 | + | ||
1534 | /* ASUS HD 3450 board lists the DVI port as HDMI */ | ||
1535 | if ((dev->pdev->device == 0x95C5) && | ||
1536 | (dev->pdev->subsystem_vendor == 0x1043) && | ||
1537 | @@ -977,8 +986,15 @@ bool radeon_atombios_sideport_present(struct radeon_device *rdev) | ||
1538 | if (igp_info) { | ||
1539 | switch (crev) { | ||
1540 | case 1: | ||
1541 | - if (igp_info->info.ucMemoryType & 0xf0) | ||
1542 | - return true; | ||
1543 | + /* AMD IGPS */ | ||
1544 | + if ((rdev->family == CHIP_RS690) || | ||
1545 | + (rdev->family == CHIP_RS740)) { | ||
1546 | + if (igp_info->info.ulBootUpMemoryClock) | ||
1547 | + return true; | ||
1548 | + } else { | ||
1549 | + if (igp_info->info.ucMemoryType & 0xf0) | ||
1550 | + return true; | ||
1551 | + } | ||
1552 | break; | ||
1553 | case 2: | ||
1554 | if (igp_info->info_2.ucMemoryType & 0x0f) | ||
1555 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
1556 | index 2bdfbcd..c263f8e 100644 | ||
1557 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c | ||
1558 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
1559 | @@ -779,30 +779,27 @@ static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connect | ||
1560 | } else | ||
1561 | ret = connector_status_connected; | ||
1562 | |||
1563 | - /* multiple connectors on the same encoder with the same ddc line | ||
1564 | - * This tends to be HDMI and DVI on the same encoder with the | ||
1565 | - * same ddc line. If the edid says HDMI, consider the HDMI port | ||
1566 | - * connected and the DVI port disconnected. If the edid doesn't | ||
1567 | - * say HDMI, vice versa. | ||
1568 | + /* This gets complicated. We have boards with VGA + HDMI with a | ||
1569 | + * shared DDC line and we have boards with DVI-D + HDMI with a shared | ||
1570 | + * DDC line. The latter is more complex because with DVI<->HDMI adapters | ||
1571 | + * you don't really know what's connected to which port as both are digital. | ||
1572 | */ | ||
1573 | if (radeon_connector->shared_ddc && (ret == connector_status_connected)) { | ||
1574 | struct drm_device *dev = connector->dev; | ||
1575 | + struct radeon_device *rdev = dev->dev_private; | ||
1576 | struct drm_connector *list_connector; | ||
1577 | struct radeon_connector *list_radeon_connector; | ||
1578 | list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) { | ||
1579 | if (connector == list_connector) | ||
1580 | continue; | ||
1581 | list_radeon_connector = to_radeon_connector(list_connector); | ||
1582 | - if (radeon_connector->devices == list_radeon_connector->devices) { | ||
1583 | - if (drm_detect_hdmi_monitor(radeon_connector->edid)) { | ||
1584 | - if (connector->connector_type == DRM_MODE_CONNECTOR_DVID) { | ||
1585 | - kfree(radeon_connector->edid); | ||
1586 | - radeon_connector->edid = NULL; | ||
1587 | - ret = connector_status_disconnected; | ||
1588 | - } | ||
1589 | - } else { | ||
1590 | - if ((connector->connector_type == DRM_MODE_CONNECTOR_HDMIA) || | ||
1591 | - (connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)) { | ||
1592 | + if (list_radeon_connector->shared_ddc && | ||
1593 | + (list_radeon_connector->ddc_bus->rec.i2c_id == | ||
1594 | + radeon_connector->ddc_bus->rec.i2c_id)) { | ||
1595 | + /* cases where both connectors are digital */ | ||
1596 | + if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) { | ||
1597 | + /* hpd is our only option in this case */ | ||
1598 | + if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { | ||
1599 | kfree(radeon_connector->edid); | ||
1600 | radeon_connector->edid = NULL; | ||
1601 | ret = connector_status_disconnected; | ||
1602 | diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | ||
1603 | index 38e45e2..5c2672f 100644 | ||
1604 | --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | ||
1605 | +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | ||
1606 | @@ -108,6 +108,7 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) | ||
1607 | udelay(panel_pwr_delay * 1000); | ||
1608 | WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); | ||
1609 | WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl); | ||
1610 | + udelay(panel_pwr_delay * 1000); | ||
1611 | break; | ||
1612 | } | ||
1613 | |||
1614 | diff --git a/drivers/gpu/drm/radeon/radeon_legacy_tv.c b/drivers/gpu/drm/radeon/radeon_legacy_tv.c | ||
1615 | index f2ed27c..0320403 100644 | ||
1616 | --- a/drivers/gpu/drm/radeon/radeon_legacy_tv.c | ||
1617 | +++ b/drivers/gpu/drm/radeon/radeon_legacy_tv.c | ||
1618 | @@ -642,8 +642,8 @@ void radeon_legacy_tv_mode_set(struct drm_encoder *encoder, | ||
1619 | } | ||
1620 | flicker_removal = (tmp + 500) / 1000; | ||
1621 | |||
1622 | - if (flicker_removal < 2) | ||
1623 | - flicker_removal = 2; | ||
1624 | + if (flicker_removal < 3) | ||
1625 | + flicker_removal = 3; | ||
1626 | for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) { | ||
1627 | if (flicker_removal == SLOPE_limit[i]) | ||
1628 | break; | ||
1629 | diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c | ||
1630 | index cb4290a..5852191 100644 | ||
1631 | --- a/drivers/hwmon/coretemp.c | ||
1632 | +++ b/drivers/hwmon/coretemp.c | ||
1633 | @@ -53,6 +53,7 @@ struct coretemp_data { | ||
1634 | struct mutex update_lock; | ||
1635 | const char *name; | ||
1636 | u32 id; | ||
1637 | + u16 core_id; | ||
1638 | char valid; /* zero until following fields are valid */ | ||
1639 | unsigned long last_updated; /* in jiffies */ | ||
1640 | int temp; | ||
1641 | @@ -75,7 +76,7 @@ static ssize_t show_name(struct device *dev, struct device_attribute | ||
1642 | if (attr->index == SHOW_NAME) | ||
1643 | ret = sprintf(buf, "%s\n", data->name); | ||
1644 | else /* show label */ | ||
1645 | - ret = sprintf(buf, "Core %d\n", data->id); | ||
1646 | + ret = sprintf(buf, "Core %d\n", data->core_id); | ||
1647 | return ret; | ||
1648 | } | ||
1649 | |||
1650 | @@ -255,6 +256,9 @@ static int __devinit coretemp_probe(struct platform_device *pdev) | ||
1651 | } | ||
1652 | |||
1653 | data->id = pdev->id; | ||
1654 | +#ifdef CONFIG_SMP | ||
1655 | + data->core_id = c->cpu_core_id; | ||
1656 | +#endif | ||
1657 | data->name = "coretemp"; | ||
1658 | mutex_init(&data->update_lock); | ||
1659 | |||
1660 | @@ -352,6 +356,10 @@ struct pdev_entry { | ||
1661 | struct list_head list; | ||
1662 | struct platform_device *pdev; | ||
1663 | unsigned int cpu; | ||
1664 | +#ifdef CONFIG_SMP | ||
1665 | + u16 phys_proc_id; | ||
1666 | + u16 cpu_core_id; | ||
1667 | +#endif | ||
1668 | }; | ||
1669 | |||
1670 | static LIST_HEAD(pdev_list); | ||
1671 | @@ -362,6 +370,22 @@ static int __cpuinit coretemp_device_add(unsigned int cpu) | ||
1672 | int err; | ||
1673 | struct platform_device *pdev; | ||
1674 | struct pdev_entry *pdev_entry; | ||
1675 | +#ifdef CONFIG_SMP | ||
1676 | + struct cpuinfo_x86 *c = &cpu_data(cpu); | ||
1677 | +#endif | ||
1678 | + | ||
1679 | + mutex_lock(&pdev_list_mutex); | ||
1680 | + | ||
1681 | +#ifdef CONFIG_SMP | ||
1682 | + /* Skip second HT entry of each core */ | ||
1683 | + list_for_each_entry(pdev_entry, &pdev_list, list) { | ||
1684 | + if (c->phys_proc_id == pdev_entry->phys_proc_id && | ||
1685 | + c->cpu_core_id == pdev_entry->cpu_core_id) { | ||
1686 | + err = 0; /* Not an error */ | ||
1687 | + goto exit; | ||
1688 | + } | ||
1689 | + } | ||
1690 | +#endif | ||
1691 | |||
1692 | pdev = platform_device_alloc(DRVNAME, cpu); | ||
1693 | if (!pdev) { | ||
1694 | @@ -385,7 +409,10 @@ static int __cpuinit coretemp_device_add(unsigned int cpu) | ||
1695 | |||
1696 | pdev_entry->pdev = pdev; | ||
1697 | pdev_entry->cpu = cpu; | ||
1698 | - mutex_lock(&pdev_list_mutex); | ||
1699 | +#ifdef CONFIG_SMP | ||
1700 | + pdev_entry->phys_proc_id = c->phys_proc_id; | ||
1701 | + pdev_entry->cpu_core_id = c->cpu_core_id; | ||
1702 | +#endif | ||
1703 | list_add_tail(&pdev_entry->list, &pdev_list); | ||
1704 | mutex_unlock(&pdev_list_mutex); | ||
1705 | |||
1706 | @@ -396,6 +423,7 @@ exit_device_free: | ||
1707 | exit_device_put: | ||
1708 | platform_device_put(pdev); | ||
1709 | exit: | ||
1710 | + mutex_unlock(&pdev_list_mutex); | ||
1711 | return err; | ||
1712 | } | ||
1713 | |||
1714 | diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c | ||
1715 | index 0ffe84d..ec7e8a0 100644 | ||
1716 | --- a/drivers/hwmon/it87.c | ||
1717 | +++ b/drivers/hwmon/it87.c | ||
1718 | @@ -80,6 +80,13 @@ superio_inb(int reg) | ||
1719 | return inb(VAL); | ||
1720 | } | ||
1721 | |||
1722 | +static inline void | ||
1723 | +superio_outb(int reg, int val) | ||
1724 | +{ | ||
1725 | + outb(reg, REG); | ||
1726 | + outb(val, VAL); | ||
1727 | +} | ||
1728 | + | ||
1729 | static int superio_inw(int reg) | ||
1730 | { | ||
1731 | int val; | ||
1732 | @@ -1064,6 +1071,21 @@ static int __init it87_find(unsigned short *address, | ||
1733 | sio_data->vid_value = superio_inb(IT87_SIO_VID_REG); | ||
1734 | |||
1735 | reg = superio_inb(IT87_SIO_PINX2_REG); | ||
1736 | + /* | ||
1737 | + * The IT8720F has no VIN7 pin, so VCCH should always be | ||
1738 | + * routed internally to VIN7 with an internal divider. | ||
1739 | + * Curiously, there still is a configuration bit to control | ||
1740 | + * this, which means it can be set incorrectly. And even | ||
1741 | + * more curiously, many boards out there are improperly | ||
1742 | + * configured, even though the IT8720F datasheet claims | ||
1743 | + * that the internal routing of VCCH to VIN7 is the default | ||
1744 | + * setting. So we force the internal routing in this case. | ||
1745 | + */ | ||
1746 | + if (sio_data->type == it8720 && !(reg & (1 << 1))) { | ||
1747 | + reg |= (1 << 1); | ||
1748 | + superio_outb(IT87_SIO_PINX2_REG, reg); | ||
1749 | + pr_notice("it87: Routing internal VCCH to in7\n"); | ||
1750 | + } | ||
1751 | if (reg & (1 << 0)) | ||
1752 | pr_info("it87: in3 is VCC (+5V)\n"); | ||
1753 | if (reg & (1 << 1)) | ||
1754 | diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c | ||
1755 | index 099a213..da5a240 100644 | ||
1756 | --- a/drivers/hwmon/k10temp.c | ||
1757 | +++ b/drivers/hwmon/k10temp.c | ||
1758 | @@ -112,11 +112,21 @@ static bool __devinit has_erratum_319(struct pci_dev *pdev) | ||
1759 | if (pkg_type != CPUID_PKGTYPE_AM2R2_AM3) | ||
1760 | return false; | ||
1761 | |||
1762 | - /* Differentiate between AM2+ (bad) and AM3 (good) */ | ||
1763 | + /* DDR3 memory implies socket AM3, which is good */ | ||
1764 | pci_bus_read_config_dword(pdev->bus, | ||
1765 | PCI_DEVFN(PCI_SLOT(pdev->devfn), 2), | ||
1766 | REG_DCT0_CONFIG_HIGH, ®_dram_cfg); | ||
1767 | - return !(reg_dram_cfg & DDR3_MODE); | ||
1768 | + if (reg_dram_cfg & DDR3_MODE) | ||
1769 | + return false; | ||
1770 | + | ||
1771 | + /* | ||
1772 | + * Unfortunately it is possible to run a socket AM3 CPU with DDR2 | ||
1773 | + * memory. We blacklist all the cores which do exist in socket AM2+ | ||
1774 | + * format. It still isn't perfect, as RB-C2 cores exist in both AM2+ | ||
1775 | + * and AM3 formats, but that's the best we can do. | ||
1776 | + */ | ||
1777 | + return boot_cpu_data.x86_model < 4 || | ||
1778 | + (boot_cpu_data.x86_model == 4 && boot_cpu_data.x86_mask <= 2); | ||
1779 | } | ||
1780 | |||
1781 | static int __devinit k10temp_probe(struct pci_dev *pdev, | ||
1782 | diff --git a/drivers/hwmon/k8temp.c b/drivers/hwmon/k8temp.c | ||
1783 | index 0ceb6d6..8bdf80d 100644 | ||
1784 | --- a/drivers/hwmon/k8temp.c | ||
1785 | +++ b/drivers/hwmon/k8temp.c | ||
1786 | @@ -120,7 +120,7 @@ static ssize_t show_temp(struct device *dev, | ||
1787 | int temp; | ||
1788 | struct k8temp_data *data = k8temp_update_device(dev); | ||
1789 | |||
1790 | - if (data->swap_core_select) | ||
1791 | + if (data->swap_core_select && (data->sensorsp & SEL_CORE)) | ||
1792 | core = core ? 0 : 1; | ||
1793 | |||
1794 | temp = TEMP_FROM_REG(data->temp[core][place]) + data->temp_offset; | ||
1795 | @@ -180,11 +180,13 @@ static int __devinit k8temp_probe(struct pci_dev *pdev, | ||
1796 | } | ||
1797 | |||
1798 | if ((model >= 0x69) && | ||
1799 | - !(model == 0xc1 || model == 0x6c || model == 0x7c)) { | ||
1800 | + !(model == 0xc1 || model == 0x6c || model == 0x7c || | ||
1801 | + model == 0x6b || model == 0x6f || model == 0x7f)) { | ||
1802 | /* | ||
1803 | - * RevG desktop CPUs (i.e. no socket S1G1 parts) | ||
1804 | - * need additional offset, otherwise reported | ||
1805 | - * temperature is below ambient temperature | ||
1806 | + * RevG desktop CPUs (i.e. no socket S1G1 or | ||
1807 | + * ASB1 parts) need additional offset, | ||
1808 | + * otherwise reported temperature is below | ||
1809 | + * ambient temperature | ||
1810 | */ | ||
1811 | data->temp_offset = 21000; | ||
1812 | } | ||
1813 | diff --git a/drivers/ide/cmd640.c b/drivers/ide/cmd640.c | ||
1814 | index 1a32d62..a9c3313 100644 | ||
1815 | --- a/drivers/ide/cmd640.c | ||
1816 | +++ b/drivers/ide/cmd640.c | ||
1817 | @@ -632,12 +632,10 @@ static void cmd640_init_dev(ide_drive_t *drive) | ||
1818 | |||
1819 | static int cmd640_test_irq(ide_hwif_t *hwif) | ||
1820 | { | ||
1821 | - struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
1822 | int irq_reg = hwif->channel ? ARTTIM23 : CFR; | ||
1823 | - u8 irq_stat, irq_mask = hwif->channel ? ARTTIM23_IDE23INTR : | ||
1824 | + u8 irq_mask = hwif->channel ? ARTTIM23_IDE23INTR : | ||
1825 | CFR_IDE01INTR; | ||
1826 | - | ||
1827 | - pci_read_config_byte(dev, irq_reg, &irq_stat); | ||
1828 | + u8 irq_stat = get_cmd640_reg(irq_reg); | ||
1829 | |||
1830 | return (irq_stat & irq_mask) ? 1 : 0; | ||
1831 | } | ||
1832 | diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c | ||
1833 | index cc8633c..67fb735 100644 | ||
1834 | --- a/drivers/ide/ide-taskfile.c | ||
1835 | +++ b/drivers/ide/ide-taskfile.c | ||
1836 | @@ -428,13 +428,11 @@ int ide_raw_taskfile(ide_drive_t *drive, struct ide_cmd *cmd, u8 *buf, | ||
1837 | { | ||
1838 | struct request *rq; | ||
1839 | int error; | ||
1840 | + int rw = !(cmd->tf_flags & IDE_TFLAG_WRITE) ? READ : WRITE; | ||
1841 | |||
1842 | - rq = blk_get_request(drive->queue, READ, __GFP_WAIT); | ||
1843 | + rq = blk_get_request(drive->queue, rw, __GFP_WAIT); | ||
1844 | rq->cmd_type = REQ_TYPE_ATA_TASKFILE; | ||
1845 | |||
1846 | - if (cmd->tf_flags & IDE_TFLAG_WRITE) | ||
1847 | - rq->cmd_flags |= REQ_RW; | ||
1848 | - | ||
1849 | /* | ||
1850 | * (ks) We transfer currently only whole sectors. | ||
1851 | * This is suffient for now. But, it would be great, | ||
1852 | diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c | ||
1853 | index df3eb8c..b4b2257 100644 | ||
1854 | --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c | ||
1855 | +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | ||
1856 | @@ -1163,7 +1163,7 @@ static ssize_t create_child(struct device *dev, | ||
1857 | |||
1858 | return ret ? ret : count; | ||
1859 | } | ||
1860 | -static DEVICE_ATTR(create_child, S_IWUGO, NULL, create_child); | ||
1861 | +static DEVICE_ATTR(create_child, S_IWUSR, NULL, create_child); | ||
1862 | |||
1863 | static ssize_t delete_child(struct device *dev, | ||
1864 | struct device_attribute *attr, | ||
1865 | @@ -1183,7 +1183,7 @@ static ssize_t delete_child(struct device *dev, | ||
1866 | return ret ? ret : count; | ||
1867 | |||
1868 | } | ||
1869 | -static DEVICE_ATTR(delete_child, S_IWUGO, NULL, delete_child); | ||
1870 | +static DEVICE_ATTR(delete_child, S_IWUSR, NULL, delete_child); | ||
1871 | |||
1872 | int ipoib_add_pkey_attr(struct net_device *dev) | ||
1873 | { | ||
1874 | diff --git a/drivers/input/keyboard/twl4030_keypad.c b/drivers/input/keyboard/twl4030_keypad.c | ||
1875 | index 21d6184..7fa439b 100644 | ||
1876 | --- a/drivers/input/keyboard/twl4030_keypad.c | ||
1877 | +++ b/drivers/input/keyboard/twl4030_keypad.c | ||
1878 | @@ -50,8 +50,12 @@ | ||
1879 | */ | ||
1880 | #define TWL4030_MAX_ROWS 8 /* TWL4030 hard limit */ | ||
1881 | #define TWL4030_MAX_COLS 8 | ||
1882 | -#define TWL4030_ROW_SHIFT 3 | ||
1883 | -#define TWL4030_KEYMAP_SIZE (TWL4030_MAX_ROWS * TWL4030_MAX_COLS) | ||
1884 | +/* | ||
1885 | + * Note that we add space for an extra column so that we can handle | ||
1886 | + * row lines connected to the gnd (see twl4030_col_xlate()). | ||
1887 | + */ | ||
1888 | +#define TWL4030_ROW_SHIFT 4 | ||
1889 | +#define TWL4030_KEYMAP_SIZE (TWL4030_MAX_ROWS << TWL4030_ROW_SHIFT) | ||
1890 | |||
1891 | struct twl4030_keypad { | ||
1892 | unsigned short keymap[TWL4030_KEYMAP_SIZE]; | ||
1893 | @@ -181,7 +185,7 @@ static int twl4030_read_kp_matrix_state(struct twl4030_keypad *kp, u16 *state) | ||
1894 | return ret; | ||
1895 | } | ||
1896 | |||
1897 | -static int twl4030_is_in_ghost_state(struct twl4030_keypad *kp, u16 *key_state) | ||
1898 | +static bool twl4030_is_in_ghost_state(struct twl4030_keypad *kp, u16 *key_state) | ||
1899 | { | ||
1900 | int i; | ||
1901 | u16 check = 0; | ||
1902 | @@ -190,12 +194,12 @@ static int twl4030_is_in_ghost_state(struct twl4030_keypad *kp, u16 *key_state) | ||
1903 | u16 col = key_state[i]; | ||
1904 | |||
1905 | if ((col & check) && hweight16(col) > 1) | ||
1906 | - return 1; | ||
1907 | + return true; | ||
1908 | |||
1909 | check |= col; | ||
1910 | } | ||
1911 | |||
1912 | - return 0; | ||
1913 | + return false; | ||
1914 | } | ||
1915 | |||
1916 | static void twl4030_kp_scan(struct twl4030_keypad *kp, bool release_all) | ||
1917 | @@ -224,7 +228,8 @@ static void twl4030_kp_scan(struct twl4030_keypad *kp, bool release_all) | ||
1918 | if (!changed) | ||
1919 | continue; | ||
1920 | |||
1921 | - for (col = 0; col < kp->n_cols; col++) { | ||
1922 | + /* Extra column handles "all gnd" rows */ | ||
1923 | + for (col = 0; col < kp->n_cols + 1; col++) { | ||
1924 | int code; | ||
1925 | |||
1926 | if (!(changed & (1 << col))) | ||
1927 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h | ||
1928 | index 525b9b9..ba09e4d 100644 | ||
1929 | --- a/drivers/input/serio/i8042-x86ia64io.h | ||
1930 | +++ b/drivers/input/serio/i8042-x86ia64io.h | ||
1931 | @@ -166,6 +166,13 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { | ||
1932 | }, | ||
1933 | }, | ||
1934 | { | ||
1935 | + /* Gigabyte Spring Peak - defines wrong chassis type */ | ||
1936 | + .matches = { | ||
1937 | + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
1938 | + DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"), | ||
1939 | + }, | ||
1940 | + }, | ||
1941 | + { | ||
1942 | .matches = { | ||
1943 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | ||
1944 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"), | ||
1945 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c | ||
1946 | index 5fb1ad6..da90f45 100644 | ||
1947 | --- a/drivers/md/raid10.c | ||
1948 | +++ b/drivers/md/raid10.c | ||
1949 | @@ -1486,14 +1486,14 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | ||
1950 | int sectors = r10_bio->sectors; | ||
1951 | mdk_rdev_t*rdev; | ||
1952 | int max_read_errors = atomic_read(&mddev->max_corr_read_errors); | ||
1953 | + int d = r10_bio->devs[r10_bio->read_slot].devnum; | ||
1954 | |||
1955 | rcu_read_lock(); | ||
1956 | - { | ||
1957 | - int d = r10_bio->devs[r10_bio->read_slot].devnum; | ||
1958 | + rdev = rcu_dereference(conf->mirrors[d].rdev); | ||
1959 | + if (rdev) { /* If rdev is not NULL */ | ||
1960 | char b[BDEVNAME_SIZE]; | ||
1961 | int cur_read_error_count = 0; | ||
1962 | |||
1963 | - rdev = rcu_dereference(conf->mirrors[d].rdev); | ||
1964 | bdevname(rdev->bdev, b); | ||
1965 | |||
1966 | if (test_bit(Faulty, &rdev->flags)) { | ||
1967 | @@ -1533,7 +1533,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | ||
1968 | |||
1969 | rcu_read_lock(); | ||
1970 | do { | ||
1971 | - int d = r10_bio->devs[sl].devnum; | ||
1972 | + d = r10_bio->devs[sl].devnum; | ||
1973 | rdev = rcu_dereference(conf->mirrors[d].rdev); | ||
1974 | if (rdev && | ||
1975 | test_bit(In_sync, &rdev->flags)) { | ||
1976 | @@ -1567,7 +1567,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | ||
1977 | rcu_read_lock(); | ||
1978 | while (sl != r10_bio->read_slot) { | ||
1979 | char b[BDEVNAME_SIZE]; | ||
1980 | - int d; | ||
1981 | + | ||
1982 | if (sl==0) | ||
1983 | sl = conf->copies; | ||
1984 | sl--; | ||
1985 | @@ -1603,7 +1603,7 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio) | ||
1986 | } | ||
1987 | sl = start; | ||
1988 | while (sl != r10_bio->read_slot) { | ||
1989 | - int d; | ||
1990 | + | ||
1991 | if (sl==0) | ||
1992 | sl = conf->copies; | ||
1993 | sl--; | ||
1994 | diff --git a/drivers/media/dvb/dvb-core/dvb_net.c b/drivers/media/dvb/dvb-core/dvb_net.c | ||
1995 | index b11533f..00ddf92 100644 | ||
1996 | --- a/drivers/media/dvb/dvb-core/dvb_net.c | ||
1997 | +++ b/drivers/media/dvb/dvb-core/dvb_net.c | ||
1998 | @@ -350,6 +350,7 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) | ||
1999 | const u8 *ts, *ts_end, *from_where = NULL; | ||
2000 | u8 ts_remain = 0, how_much = 0, new_ts = 1; | ||
2001 | struct ethhdr *ethh = NULL; | ||
2002 | + bool error = false; | ||
2003 | |||
2004 | #ifdef ULE_DEBUG | ||
2005 | /* The code inside ULE_DEBUG keeps a history of the last 100 TS cells processed. */ | ||
2006 | @@ -459,10 +460,16 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) | ||
2007 | |||
2008 | /* Drop partly decoded SNDU, reset state, resync on PUSI. */ | ||
2009 | if (priv->ule_skb) { | ||
2010 | - dev_kfree_skb( priv->ule_skb ); | ||
2011 | + error = true; | ||
2012 | + dev_kfree_skb(priv->ule_skb); | ||
2013 | + } | ||
2014 | + | ||
2015 | + if (error || priv->ule_sndu_remain) { | ||
2016 | dev->stats.rx_errors++; | ||
2017 | dev->stats.rx_frame_errors++; | ||
2018 | + error = false; | ||
2019 | } | ||
2020 | + | ||
2021 | reset_ule(priv); | ||
2022 | priv->need_pusi = 1; | ||
2023 | continue; | ||
2024 | @@ -534,6 +541,7 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) | ||
2025 | from_where += 2; | ||
2026 | } | ||
2027 | |||
2028 | + priv->ule_sndu_remain = priv->ule_sndu_len + 2; | ||
2029 | /* | ||
2030 | * State of current TS: | ||
2031 | * ts_remain (remaining bytes in the current TS cell) | ||
2032 | @@ -543,6 +551,7 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) | ||
2033 | */ | ||
2034 | switch (ts_remain) { | ||
2035 | case 1: | ||
2036 | + priv->ule_sndu_remain--; | ||
2037 | priv->ule_sndu_type = from_where[0] << 8; | ||
2038 | priv->ule_sndu_type_1 = 1; /* first byte of ule_type is set. */ | ||
2039 | ts_remain -= 1; from_where += 1; | ||
2040 | @@ -556,6 +565,7 @@ static void dvb_net_ule( struct net_device *dev, const u8 *buf, size_t buf_len ) | ||
2041 | default: /* complete ULE header is present in current TS. */ | ||
2042 | /* Extract ULE type field. */ | ||
2043 | if (priv->ule_sndu_type_1) { | ||
2044 | + priv->ule_sndu_type_1 = 0; | ||
2045 | priv->ule_sndu_type |= from_where[0]; | ||
2046 | from_where += 1; /* points to payload start. */ | ||
2047 | ts_remain -= 1; | ||
2048 | diff --git a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig | ||
2049 | index d8d4214..32a7ec6 100644 | ||
2050 | --- a/drivers/media/dvb/ttpci/Kconfig | ||
2051 | +++ b/drivers/media/dvb/ttpci/Kconfig | ||
2052 | @@ -68,13 +68,14 @@ config DVB_BUDGET | ||
2053 | select DVB_VES1820 if !DVB_FE_CUSTOMISE | ||
2054 | select DVB_L64781 if !DVB_FE_CUSTOMISE | ||
2055 | select DVB_TDA8083 if !DVB_FE_CUSTOMISE | ||
2056 | - select DVB_TDA10021 if !DVB_FE_CUSTOMISE | ||
2057 | - select DVB_TDA10023 if !DVB_FE_CUSTOMISE | ||
2058 | select DVB_S5H1420 if !DVB_FE_CUSTOMISE | ||
2059 | select DVB_TDA10086 if !DVB_FE_CUSTOMISE | ||
2060 | select DVB_TDA826X if !DVB_FE_CUSTOMISE | ||
2061 | select DVB_LNBP21 if !DVB_FE_CUSTOMISE | ||
2062 | select DVB_TDA1004X if !DVB_FE_CUSTOMISE | ||
2063 | + select DVB_ISL6423 if !DVB_FE_CUSTOMISE | ||
2064 | + select DVB_STV090x if !DVB_FE_CUSTOMISE | ||
2065 | + select DVB_STV6110x if !DVB_FE_CUSTOMISE | ||
2066 | help | ||
2067 | Support for simple SAA7146 based DVB cards (so called Budget- | ||
2068 | or Nova-PCI cards) without onboard MPEG2 decoder, and without | ||
2069 | diff --git a/drivers/media/video/cx23885/cx23885-i2c.c b/drivers/media/video/cx23885/cx23885-i2c.c | ||
2070 | index 4172cb3..d4746e0 100644 | ||
2071 | --- a/drivers/media/video/cx23885/cx23885-i2c.c | ||
2072 | +++ b/drivers/media/video/cx23885/cx23885-i2c.c | ||
2073 | @@ -365,7 +365,17 @@ int cx23885_i2c_register(struct cx23885_i2c *bus) | ||
2074 | |||
2075 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
2076 | strlcpy(info.type, "ir_video", I2C_NAME_SIZE); | ||
2077 | - i2c_new_probed_device(&bus->i2c_adap, &info, addr_list); | ||
2078 | + /* | ||
2079 | + * We can't call i2c_new_probed_device() because it uses | ||
2080 | + * quick writes for probing and the IR receiver device only | ||
2081 | + * replies to reads. | ||
2082 | + */ | ||
2083 | + if (i2c_smbus_xfer(&bus->i2c_adap, addr_list[0], 0, | ||
2084 | + I2C_SMBUS_READ, 0, I2C_SMBUS_QUICK, | ||
2085 | + NULL) >= 0) { | ||
2086 | + info.addr = addr_list[0]; | ||
2087 | + i2c_new_device(&bus->i2c_adap, &info); | ||
2088 | + } | ||
2089 | } | ||
2090 | |||
2091 | return bus->i2c_rc; | ||
2092 | diff --git a/drivers/media/video/cx88/cx88-i2c.c b/drivers/media/video/cx88/cx88-i2c.c | ||
2093 | index ee1ca39..fb39f11 100644 | ||
2094 | --- a/drivers/media/video/cx88/cx88-i2c.c | ||
2095 | +++ b/drivers/media/video/cx88/cx88-i2c.c | ||
2096 | @@ -188,10 +188,24 @@ int cx88_i2c_init(struct cx88_core *core, struct pci_dev *pci) | ||
2097 | 0x18, 0x6b, 0x71, | ||
2098 | I2C_CLIENT_END | ||
2099 | }; | ||
2100 | + const unsigned short *addrp; | ||
2101 | |||
2102 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
2103 | strlcpy(info.type, "ir_video", I2C_NAME_SIZE); | ||
2104 | - i2c_new_probed_device(&core->i2c_adap, &info, addr_list); | ||
2105 | + /* | ||
2106 | + * We can't call i2c_new_probed_device() because it uses | ||
2107 | + * quick writes for probing and at least some R receiver | ||
2108 | + * devices only reply to reads. | ||
2109 | + */ | ||
2110 | + for (addrp = addr_list; *addrp != I2C_CLIENT_END; addrp++) { | ||
2111 | + if (i2c_smbus_xfer(&core->i2c_adap, *addrp, 0, | ||
2112 | + I2C_SMBUS_READ, 0, | ||
2113 | + I2C_SMBUS_QUICK, NULL) >= 0) { | ||
2114 | + info.addr = *addrp; | ||
2115 | + i2c_new_device(&core->i2c_adap, &info); | ||
2116 | + break; | ||
2117 | + } | ||
2118 | + } | ||
2119 | } | ||
2120 | return core->i2c_rc; | ||
2121 | } | ||
2122 | diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c | ||
2123 | index 391cccc..b42e845 100644 | ||
2124 | --- a/drivers/media/video/uvc/uvc_driver.c | ||
2125 | +++ b/drivers/media/video/uvc/uvc_driver.c | ||
2126 | @@ -59,6 +59,11 @@ static struct uvc_format_desc uvc_fmts[] = { | ||
2127 | .fcc = V4L2_PIX_FMT_YUYV, | ||
2128 | }, | ||
2129 | { | ||
2130 | + .name = "YUV 4:2:2 (YUYV)", | ||
2131 | + .guid = UVC_GUID_FORMAT_YUY2_ISIGHT, | ||
2132 | + .fcc = V4L2_PIX_FMT_YUYV, | ||
2133 | + }, | ||
2134 | + { | ||
2135 | .name = "YUV 4:2:0 (NV12)", | ||
2136 | .guid = UVC_GUID_FORMAT_NV12, | ||
2137 | .fcc = V4L2_PIX_FMT_NV12, | ||
2138 | @@ -84,11 +89,16 @@ static struct uvc_format_desc uvc_fmts[] = { | ||
2139 | .fcc = V4L2_PIX_FMT_UYVY, | ||
2140 | }, | ||
2141 | { | ||
2142 | - .name = "Greyscale", | ||
2143 | + .name = "Greyscale (8-bit)", | ||
2144 | .guid = UVC_GUID_FORMAT_Y800, | ||
2145 | .fcc = V4L2_PIX_FMT_GREY, | ||
2146 | }, | ||
2147 | { | ||
2148 | + .name = "Greyscale (16-bit)", | ||
2149 | + .guid = UVC_GUID_FORMAT_Y16, | ||
2150 | + .fcc = V4L2_PIX_FMT_Y16, | ||
2151 | + }, | ||
2152 | + { | ||
2153 | .name = "RGB Bayer", | ||
2154 | .guid = UVC_GUID_FORMAT_BY8, | ||
2155 | .fcc = V4L2_PIX_FMT_SBGGR8, | ||
2156 | @@ -2059,6 +2069,15 @@ static struct usb_device_id uvc_ids[] = { | ||
2157 | .bInterfaceSubClass = 1, | ||
2158 | .bInterfaceProtocol = 0, | ||
2159 | .driver_info = UVC_QUIRK_STREAM_NO_FID }, | ||
2160 | + /* Syntek (Packard Bell EasyNote MX52 */ | ||
2161 | + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
2162 | + | USB_DEVICE_ID_MATCH_INT_INFO, | ||
2163 | + .idVendor = 0x174f, | ||
2164 | + .idProduct = 0x8a12, | ||
2165 | + .bInterfaceClass = USB_CLASS_VIDEO, | ||
2166 | + .bInterfaceSubClass = 1, | ||
2167 | + .bInterfaceProtocol = 0, | ||
2168 | + .driver_info = UVC_QUIRK_STREAM_NO_FID }, | ||
2169 | /* Syntek (Asus F9SG) */ | ||
2170 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
2171 | | USB_DEVICE_ID_MATCH_INT_INFO, | ||
2172 | @@ -2123,6 +2142,15 @@ static struct usb_device_id uvc_ids[] = { | ||
2173 | .bInterfaceSubClass = 1, | ||
2174 | .bInterfaceProtocol = 0, | ||
2175 | .driver_info = UVC_QUIRK_PROBE_MINMAX }, | ||
2176 | + /* Arkmicro unbranded */ | ||
2177 | + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
2178 | + | USB_DEVICE_ID_MATCH_INT_INFO, | ||
2179 | + .idVendor = 0x18ec, | ||
2180 | + .idProduct = 0x3290, | ||
2181 | + .bInterfaceClass = USB_CLASS_VIDEO, | ||
2182 | + .bInterfaceSubClass = 1, | ||
2183 | + .bInterfaceProtocol = 0, | ||
2184 | + .driver_info = UVC_QUIRK_PROBE_DEF }, | ||
2185 | /* Bodelin ProScopeHR */ | ||
2186 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | ||
2187 | | USB_DEVICE_ID_MATCH_DEV_HI | ||
2188 | diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h | ||
2189 | index 2337585..b6f6f38 100644 | ||
2190 | --- a/drivers/media/video/uvc/uvcvideo.h | ||
2191 | +++ b/drivers/media/video/uvc/uvcvideo.h | ||
2192 | @@ -113,6 +113,9 @@ struct uvc_xu_control { | ||
2193 | #define UVC_GUID_FORMAT_YUY2 \ | ||
2194 | { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \ | ||
2195 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
2196 | +#define UVC_GUID_FORMAT_YUY2_ISIGHT \ | ||
2197 | + { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \ | ||
2198 | + 0x80, 0x00, 0x00, 0x00, 0x00, 0x38, 0x9b, 0x71} | ||
2199 | #define UVC_GUID_FORMAT_NV12 \ | ||
2200 | { 'N', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ | ||
2201 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
2202 | @@ -128,11 +131,13 @@ struct uvc_xu_control { | ||
2203 | #define UVC_GUID_FORMAT_Y800 \ | ||
2204 | { 'Y', '8', '0', '0', 0x00, 0x00, 0x10, 0x00, \ | ||
2205 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
2206 | +#define UVC_GUID_FORMAT_Y16 \ | ||
2207 | + { 'Y', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \ | ||
2208 | + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
2209 | #define UVC_GUID_FORMAT_BY8 \ | ||
2210 | { 'B', 'Y', '8', ' ', 0x00, 0x00, 0x10, 0x00, \ | ||
2211 | 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} | ||
2212 | |||
2213 | - | ||
2214 | /* ------------------------------------------------------------------------ | ||
2215 | * Driver specific constants. | ||
2216 | */ | ||
2217 | diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c | ||
2218 | index 50997d2..676cd0c 100644 | ||
2219 | --- a/drivers/mmc/host/sdhci-s3c.c | ||
2220 | +++ b/drivers/mmc/host/sdhci-s3c.c | ||
2221 | @@ -372,6 +372,26 @@ static int __devinit sdhci_s3c_probe(struct platform_device *pdev) | ||
2222 | |||
2223 | static int __devexit sdhci_s3c_remove(struct platform_device *pdev) | ||
2224 | { | ||
2225 | + struct sdhci_host *host = platform_get_drvdata(pdev); | ||
2226 | + struct sdhci_s3c *sc = sdhci_priv(host); | ||
2227 | + int ptr; | ||
2228 | + | ||
2229 | + sdhci_remove_host(host, 1); | ||
2230 | + | ||
2231 | + for (ptr = 0; ptr < 3; ptr++) { | ||
2232 | + clk_disable(sc->clk_bus[ptr]); | ||
2233 | + clk_put(sc->clk_bus[ptr]); | ||
2234 | + } | ||
2235 | + clk_disable(sc->clk_io); | ||
2236 | + clk_put(sc->clk_io); | ||
2237 | + | ||
2238 | + iounmap(host->ioaddr); | ||
2239 | + release_resource(sc->ioarea); | ||
2240 | + kfree(sc->ioarea); | ||
2241 | + | ||
2242 | + sdhci_free_host(host); | ||
2243 | + platform_set_drvdata(pdev, NULL); | ||
2244 | + | ||
2245 | return 0; | ||
2246 | } | ||
2247 | |||
2248 | diff --git a/drivers/net/3c503.c b/drivers/net/3c503.c | ||
2249 | index 66e0323..b74a0ea 100644 | ||
2250 | --- a/drivers/net/3c503.c | ||
2251 | +++ b/drivers/net/3c503.c | ||
2252 | @@ -380,6 +380,12 @@ out: | ||
2253 | return retval; | ||
2254 | } | ||
2255 | |||
2256 | +static irqreturn_t el2_probe_interrupt(int irq, void *seen) | ||
2257 | +{ | ||
2258 | + *(bool *)seen = true; | ||
2259 | + return IRQ_HANDLED; | ||
2260 | +} | ||
2261 | + | ||
2262 | static int | ||
2263 | el2_open(struct net_device *dev) | ||
2264 | { | ||
2265 | @@ -391,23 +397,35 @@ el2_open(struct net_device *dev) | ||
2266 | |||
2267 | outb(EGACFR_NORM, E33G_GACFR); /* Enable RAM and interrupts. */ | ||
2268 | do { | ||
2269 | - retval = request_irq(*irqp, NULL, 0, "bogus", dev); | ||
2270 | - if (retval >= 0) { | ||
2271 | + bool seen; | ||
2272 | + | ||
2273 | + retval = request_irq(*irqp, el2_probe_interrupt, 0, | ||
2274 | + dev->name, &seen); | ||
2275 | + if (retval == -EBUSY) | ||
2276 | + continue; | ||
2277 | + if (retval < 0) | ||
2278 | + goto err_disable; | ||
2279 | + | ||
2280 | /* Twinkle the interrupt, and check if it's seen. */ | ||
2281 | - unsigned long cookie = probe_irq_on(); | ||
2282 | + seen = false; | ||
2283 | + smp_wmb(); | ||
2284 | outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR); | ||
2285 | outb_p(0x00, E33G_IDCFR); | ||
2286 | - if (*irqp == probe_irq_off(cookie) && /* It's a good IRQ line! */ | ||
2287 | - ((retval = request_irq(dev->irq = *irqp, | ||
2288 | - eip_interrupt, 0, | ||
2289 | - dev->name, dev)) == 0)) | ||
2290 | - break; | ||
2291 | - } else { | ||
2292 | - if (retval != -EBUSY) | ||
2293 | - return retval; | ||
2294 | - } | ||
2295 | + msleep(1); | ||
2296 | + free_irq(*irqp, el2_probe_interrupt); | ||
2297 | + if (!seen) | ||
2298 | + continue; | ||
2299 | + | ||
2300 | + retval = request_irq(dev->irq = *irqp, eip_interrupt, 0, | ||
2301 | + dev->name, dev); | ||
2302 | + if (retval == -EBUSY) | ||
2303 | + continue; | ||
2304 | + if (retval < 0) | ||
2305 | + goto err_disable; | ||
2306 | } while (*++irqp); | ||
2307 | + | ||
2308 | if (*irqp == 0) { | ||
2309 | + err_disable: | ||
2310 | outb(EGACFR_IRQOFF, E33G_GACFR); /* disable interrupts. */ | ||
2311 | return -EAGAIN; | ||
2312 | } | ||
2313 | diff --git a/drivers/net/cpmac.c b/drivers/net/cpmac.c | ||
2314 | index 8d0be26..6e739bb 100644 | ||
2315 | --- a/drivers/net/cpmac.c | ||
2316 | +++ b/drivers/net/cpmac.c | ||
2317 | @@ -1174,7 +1174,8 @@ static int __devinit cpmac_probe(struct platform_device *pdev) | ||
2318 | if (netif_msg_drv(priv)) | ||
2319 | printk(KERN_ERR "%s: Could not attach to PHY\n", | ||
2320 | dev->name); | ||
2321 | - return PTR_ERR(priv->phy); | ||
2322 | + rc = PTR_ERR(priv->phy); | ||
2323 | + goto fail; | ||
2324 | } | ||
2325 | |||
2326 | if ((rc = register_netdev(dev))) { | ||
2327 | diff --git a/drivers/net/cxgb3/ael1002.c b/drivers/net/cxgb3/ael1002.c | ||
2328 | index 5248f9e..35cd367 100644 | ||
2329 | --- a/drivers/net/cxgb3/ael1002.c | ||
2330 | +++ b/drivers/net/cxgb3/ael1002.c | ||
2331 | @@ -934,7 +934,7 @@ static struct cphy_ops xaui_direct_ops = { | ||
2332 | int t3_xaui_direct_phy_prep(struct cphy *phy, struct adapter *adapter, | ||
2333 | int phy_addr, const struct mdio_ops *mdio_ops) | ||
2334 | { | ||
2335 | - cphy_init(phy, adapter, MDIO_PRTAD_NONE, &xaui_direct_ops, mdio_ops, | ||
2336 | + cphy_init(phy, adapter, phy_addr, &xaui_direct_ops, mdio_ops, | ||
2337 | SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_TP, | ||
2338 | "10GBASE-CX4"); | ||
2339 | return 0; | ||
2340 | diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c | ||
2341 | index b377300..55cab1d 100644 | ||
2342 | --- a/drivers/net/dm9000.c | ||
2343 | +++ b/drivers/net/dm9000.c | ||
2344 | @@ -475,17 +475,13 @@ static uint32_t dm9000_get_rx_csum(struct net_device *dev) | ||
2345 | return dm->rx_csum; | ||
2346 | } | ||
2347 | |||
2348 | -static int dm9000_set_rx_csum(struct net_device *dev, uint32_t data) | ||
2349 | +static int dm9000_set_rx_csum_unlocked(struct net_device *dev, uint32_t data) | ||
2350 | { | ||
2351 | board_info_t *dm = to_dm9000_board(dev); | ||
2352 | - unsigned long flags; | ||
2353 | |||
2354 | if (dm->can_csum) { | ||
2355 | dm->rx_csum = data; | ||
2356 | - | ||
2357 | - spin_lock_irqsave(&dm->lock, flags); | ||
2358 | iow(dm, DM9000_RCSR, dm->rx_csum ? RCSR_CSUM : 0); | ||
2359 | - spin_unlock_irqrestore(&dm->lock, flags); | ||
2360 | |||
2361 | return 0; | ||
2362 | } | ||
2363 | @@ -493,6 +489,19 @@ static int dm9000_set_rx_csum(struct net_device *dev, uint32_t data) | ||
2364 | return -EOPNOTSUPP; | ||
2365 | } | ||
2366 | |||
2367 | +static int dm9000_set_rx_csum(struct net_device *dev, uint32_t data) | ||
2368 | +{ | ||
2369 | + board_info_t *dm = to_dm9000_board(dev); | ||
2370 | + unsigned long flags; | ||
2371 | + int ret; | ||
2372 | + | ||
2373 | + spin_lock_irqsave(&dm->lock, flags); | ||
2374 | + ret = dm9000_set_rx_csum_unlocked(dev, data); | ||
2375 | + spin_unlock_irqrestore(&dm->lock, flags); | ||
2376 | + | ||
2377 | + return ret; | ||
2378 | +} | ||
2379 | + | ||
2380 | static int dm9000_set_tx_csum(struct net_device *dev, uint32_t data) | ||
2381 | { | ||
2382 | board_info_t *dm = to_dm9000_board(dev); | ||
2383 | @@ -721,7 +730,7 @@ static unsigned char dm9000_type_to_char(enum dm9000_type type) | ||
2384 | * Set DM9000 multicast address | ||
2385 | */ | ||
2386 | static void | ||
2387 | -dm9000_hash_table(struct net_device *dev) | ||
2388 | +dm9000_hash_table_unlocked(struct net_device *dev) | ||
2389 | { | ||
2390 | board_info_t *db = netdev_priv(dev); | ||
2391 | struct dev_mc_list *mcptr = dev->mc_list; | ||
2392 | @@ -730,12 +739,9 @@ dm9000_hash_table(struct net_device *dev) | ||
2393 | u32 hash_val; | ||
2394 | u16 hash_table[4]; | ||
2395 | u8 rcr = RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN; | ||
2396 | - unsigned long flags; | ||
2397 | |||
2398 | dm9000_dbg(db, 1, "entering %s\n", __func__); | ||
2399 | |||
2400 | - spin_lock_irqsave(&db->lock, flags); | ||
2401 | - | ||
2402 | for (i = 0, oft = DM9000_PAR; i < 6; i++, oft++) | ||
2403 | iow(db, oft, dev->dev_addr[i]); | ||
2404 | |||
2405 | @@ -765,6 +771,16 @@ dm9000_hash_table(struct net_device *dev) | ||
2406 | } | ||
2407 | |||
2408 | iow(db, DM9000_RCR, rcr); | ||
2409 | +} | ||
2410 | + | ||
2411 | +static void | ||
2412 | +dm9000_hash_table(struct net_device *dev) | ||
2413 | +{ | ||
2414 | + board_info_t *db = netdev_priv(dev); | ||
2415 | + unsigned long flags; | ||
2416 | + | ||
2417 | + spin_lock_irqsave(&db->lock, flags); | ||
2418 | + dm9000_hash_table_unlocked(dev); | ||
2419 | spin_unlock_irqrestore(&db->lock, flags); | ||
2420 | } | ||
2421 | |||
2422 | @@ -784,7 +800,7 @@ dm9000_init_dm9000(struct net_device *dev) | ||
2423 | db->io_mode = ior(db, DM9000_ISR) >> 6; /* ISR bit7:6 keeps I/O mode */ | ||
2424 | |||
2425 | /* Checksum mode */ | ||
2426 | - dm9000_set_rx_csum(dev, db->rx_csum); | ||
2427 | + dm9000_set_rx_csum_unlocked(dev, db->rx_csum); | ||
2428 | |||
2429 | /* GPIO0 on pre-activate PHY */ | ||
2430 | iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */ | ||
2431 | @@ -811,7 +827,7 @@ dm9000_init_dm9000(struct net_device *dev) | ||
2432 | iow(db, DM9000_ISR, ISR_CLR_STATUS); /* Clear interrupt status */ | ||
2433 | |||
2434 | /* Set address filter table */ | ||
2435 | - dm9000_hash_table(dev); | ||
2436 | + dm9000_hash_table_unlocked(dev); | ||
2437 | |||
2438 | imr = IMR_PAR | IMR_PTM | IMR_PRM; | ||
2439 | if (db->type != TYPE_DM9000E) | ||
2440 | diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c | ||
2441 | index 3c34048..a7b5a82 100644 | ||
2442 | --- a/drivers/net/forcedeth.c | ||
2443 | +++ b/drivers/net/forcedeth.c | ||
2444 | @@ -5900,7 +5900,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i | ||
2445 | /* Limit the number of tx's outstanding for hw bug */ | ||
2446 | if (id->driver_data & DEV_NEED_TX_LIMIT) { | ||
2447 | np->tx_limit = 1; | ||
2448 | - if ((id->driver_data & DEV_NEED_TX_LIMIT2) && | ||
2449 | + if (((id->driver_data & DEV_NEED_TX_LIMIT2) == DEV_NEED_TX_LIMIT2) && | ||
2450 | pci_dev->revision >= 0xA2) | ||
2451 | np->tx_limit = 0; | ||
2452 | } | ||
2453 | diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c | ||
2454 | index 787befc..69f84c8 100644 | ||
2455 | --- a/drivers/net/r8169.c | ||
2456 | +++ b/drivers/net/r8169.c | ||
2457 | @@ -557,6 +557,11 @@ static void mdio_write(void __iomem *ioaddr, int reg_addr, int value) | ||
2458 | break; | ||
2459 | udelay(25); | ||
2460 | } | ||
2461 | + /* | ||
2462 | + * According to hardware specs a 20us delay is required after write | ||
2463 | + * complete indication, but before sending next command. | ||
2464 | + */ | ||
2465 | + udelay(20); | ||
2466 | } | ||
2467 | |||
2468 | static int mdio_read(void __iomem *ioaddr, int reg_addr) | ||
2469 | @@ -576,6 +581,12 @@ static int mdio_read(void __iomem *ioaddr, int reg_addr) | ||
2470 | } | ||
2471 | udelay(25); | ||
2472 | } | ||
2473 | + /* | ||
2474 | + * According to hardware specs a 20us delay is required after read | ||
2475 | + * complete indication, but before sending next command. | ||
2476 | + */ | ||
2477 | + udelay(20); | ||
2478 | + | ||
2479 | return value; | ||
2480 | } | ||
2481 | |||
2482 | diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c | ||
2483 | index 67249c3..5520f16 100644 | ||
2484 | --- a/drivers/net/sky2.c | ||
2485 | +++ b/drivers/net/sky2.c | ||
2486 | @@ -716,11 +716,24 @@ static void sky2_phy_power_down(struct sky2_hw *hw, unsigned port) | ||
2487 | sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); | ||
2488 | } | ||
2489 | |||
2490 | +/* Enable Rx/Tx */ | ||
2491 | +static void sky2_enable_rx_tx(struct sky2_port *sky2) | ||
2492 | +{ | ||
2493 | + struct sky2_hw *hw = sky2->hw; | ||
2494 | + unsigned port = sky2->port; | ||
2495 | + u16 reg; | ||
2496 | + | ||
2497 | + reg = gma_read16(hw, port, GM_GP_CTRL); | ||
2498 | + reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA; | ||
2499 | + gma_write16(hw, port, GM_GP_CTRL, reg); | ||
2500 | +} | ||
2501 | + | ||
2502 | /* Force a renegotiation */ | ||
2503 | static void sky2_phy_reinit(struct sky2_port *sky2) | ||
2504 | { | ||
2505 | spin_lock_bh(&sky2->phy_lock); | ||
2506 | sky2_phy_init(sky2->hw, sky2->port); | ||
2507 | + sky2_enable_rx_tx(sky2); | ||
2508 | spin_unlock_bh(&sky2->phy_lock); | ||
2509 | } | ||
2510 | |||
2511 | @@ -1971,7 +1984,6 @@ static void sky2_link_up(struct sky2_port *sky2) | ||
2512 | { | ||
2513 | struct sky2_hw *hw = sky2->hw; | ||
2514 | unsigned port = sky2->port; | ||
2515 | - u16 reg; | ||
2516 | static const char *fc_name[] = { | ||
2517 | [FC_NONE] = "none", | ||
2518 | [FC_TX] = "tx", | ||
2519 | @@ -1979,10 +1991,7 @@ static void sky2_link_up(struct sky2_port *sky2) | ||
2520 | [FC_BOTH] = "both", | ||
2521 | }; | ||
2522 | |||
2523 | - /* enable Rx/Tx */ | ||
2524 | - reg = gma_read16(hw, port, GM_GP_CTRL); | ||
2525 | - reg |= GM_GPCR_RX_ENA | GM_GPCR_TX_ENA; | ||
2526 | - gma_write16(hw, port, GM_GP_CTRL, reg); | ||
2527 | + sky2_enable_rx_tx(sky2); | ||
2528 | |||
2529 | gm_phy_write(hw, port, PHY_MARV_INT_MASK, PHY_M_DEF_MSK); | ||
2530 | |||
2531 | diff --git a/drivers/net/usb/pegasus.h b/drivers/net/usb/pegasus.h | ||
2532 | index 5d02f02..7d07037 100644 | ||
2533 | --- a/drivers/net/usb/pegasus.h | ||
2534 | +++ b/drivers/net/usb/pegasus.h | ||
2535 | @@ -254,7 +254,7 @@ PEGASUS_DEV( "IO DATA USB ET/TX", VENDOR_IODATA, 0x0904, | ||
2536 | DEFAULT_GPIO_RESET ) | ||
2537 | PEGASUS_DEV( "IO DATA USB ET/TX-S", VENDOR_IODATA, 0x0913, | ||
2538 | DEFAULT_GPIO_RESET | PEGASUS_II ) | ||
2539 | -PEGASUS_DEV( "IO DATA USB ETX-US2", VENDOR_IODATA, 0x092a, | ||
2540 | +PEGASUS_DEV( "IO DATA USB ETX-US2", VENDOR_IODATA, 0x093a, | ||
2541 | DEFAULT_GPIO_RESET | PEGASUS_II ) | ||
2542 | PEGASUS_DEV( "Kingston KNU101TX Ethernet", VENDOR_KINGSTON, 0x000a, | ||
2543 | DEFAULT_GPIO_RESET) | ||
2544 | diff --git a/drivers/net/veth.c b/drivers/net/veth.c | ||
2545 | index 3a15de5..baf0b51 100644 | ||
2546 | --- a/drivers/net/veth.c | ||
2547 | +++ b/drivers/net/veth.c | ||
2548 | @@ -186,7 +186,6 @@ tx_drop: | ||
2549 | return NETDEV_TX_OK; | ||
2550 | |||
2551 | rx_drop: | ||
2552 | - kfree_skb(skb); | ||
2553 | rcv_stats->rx_dropped++; | ||
2554 | return NETDEV_TX_OK; | ||
2555 | } | ||
2556 | diff --git a/drivers/net/wireless/ath/ath5k/attach.c b/drivers/net/wireless/ath/ath5k/attach.c | ||
2557 | index 4228444..6b00074 100644 | ||
2558 | --- a/drivers/net/wireless/ath/ath5k/attach.c | ||
2559 | +++ b/drivers/net/wireless/ath/ath5k/attach.c | ||
2560 | @@ -123,6 +123,7 @@ int ath5k_hw_attach(struct ath5k_softc *sc) | ||
2561 | ah->ah_cw_min = AR5K_TUNE_CWMIN; | ||
2562 | ah->ah_limit_tx_retries = AR5K_INIT_TX_RETRY; | ||
2563 | ah->ah_software_retry = false; | ||
2564 | + ah->ah_current_channel = &sc->channels[0]; | ||
2565 | |||
2566 | /* | ||
2567 | * Find the mac version | ||
2568 | diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c | ||
2569 | index d377809..e6e9587 100644 | ||
2570 | --- a/drivers/net/wireless/ath/ath5k/base.c | ||
2571 | +++ b/drivers/net/wireless/ath/ath5k/base.c | ||
2572 | @@ -1851,11 +1851,6 @@ ath5k_tasklet_rx(unsigned long data) | ||
2573 | return; | ||
2574 | } | ||
2575 | |||
2576 | - if (unlikely(rs.rs_more)) { | ||
2577 | - ATH5K_WARN(sc, "unsupported jumbo\n"); | ||
2578 | - goto next; | ||
2579 | - } | ||
2580 | - | ||
2581 | if (unlikely(rs.rs_status)) { | ||
2582 | if (rs.rs_status & AR5K_RXERR_PHY) | ||
2583 | goto next; | ||
2584 | @@ -1885,6 +1880,8 @@ ath5k_tasklet_rx(unsigned long data) | ||
2585 | sc->opmode != NL80211_IFTYPE_MONITOR) | ||
2586 | goto next; | ||
2587 | } | ||
2588 | + if (unlikely(rs.rs_more)) | ||
2589 | + goto next; | ||
2590 | accept: | ||
2591 | next_skb = ath5k_rx_skb_alloc(sc, &next_skb_addr); | ||
2592 | |||
2593 | diff --git a/drivers/net/wireless/ath/ath9k/initvals.h b/drivers/net/wireless/ath/ath9k/initvals.h | ||
2594 | index 8a3bf3a..7203f00 100644 | ||
2595 | --- a/drivers/net/wireless/ath/ath9k/initvals.h | ||
2596 | +++ b/drivers/net/wireless/ath/ath9k/initvals.h | ||
2597 | @@ -246,7 +246,7 @@ static const u32 ar5416Common[][2] = { | ||
2598 | { 0x00008258, 0x00000000 }, | ||
2599 | { 0x0000825c, 0x400000ff }, | ||
2600 | { 0x00008260, 0x00080922 }, | ||
2601 | - { 0x00008264, 0xa8000010 }, | ||
2602 | + { 0x00008264, 0x88000010 }, | ||
2603 | { 0x00008270, 0x00000000 }, | ||
2604 | { 0x00008274, 0x40000000 }, | ||
2605 | { 0x00008278, 0x003e4180 }, | ||
2606 | @@ -2766,7 +2766,7 @@ static const u32 ar9280Common_9280_2[][2] = { | ||
2607 | { 0x00008258, 0x00000000 }, | ||
2608 | { 0x0000825c, 0x400000ff }, | ||
2609 | { 0x00008260, 0x00080922 }, | ||
2610 | - { 0x00008264, 0xa8a00010 }, | ||
2611 | + { 0x00008264, 0x88a00010 }, | ||
2612 | { 0x00008270, 0x00000000 }, | ||
2613 | { 0x00008274, 0x40000000 }, | ||
2614 | { 0x00008278, 0x003e4180 }, | ||
2615 | @@ -3936,7 +3936,7 @@ static const u_int32_t ar9285Common_9285[][2] = { | ||
2616 | { 0x00008258, 0x00000000 }, | ||
2617 | { 0x0000825c, 0x400000ff }, | ||
2618 | { 0x00008260, 0x00080922 }, | ||
2619 | - { 0x00008264, 0xa8a00010 }, | ||
2620 | + { 0x00008264, 0x88a00010 }, | ||
2621 | { 0x00008270, 0x00000000 }, | ||
2622 | { 0x00008274, 0x40000000 }, | ||
2623 | { 0x00008278, 0x003e4180 }, | ||
2624 | @@ -5073,7 +5073,7 @@ static const u_int32_t ar9287Common_9287_1_0[][2] = { | ||
2625 | { 0x00008258, 0x00000000 }, | ||
2626 | { 0x0000825c, 0x400000ff }, | ||
2627 | { 0x00008260, 0x00080922 }, | ||
2628 | - { 0x00008264, 0xa8a00010 }, | ||
2629 | + { 0x00008264, 0x88a00010 }, | ||
2630 | { 0x00008270, 0x00000000 }, | ||
2631 | { 0x00008274, 0x40000000 }, | ||
2632 | { 0x00008278, 0x003e4180 }, | ||
2633 | diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c | ||
2634 | index c9640a3..b2db902 100644 | ||
2635 | --- a/drivers/net/wireless/hostap/hostap_cs.c | ||
2636 | +++ b/drivers/net/wireless/hostap/hostap_cs.c | ||
2637 | @@ -602,6 +602,7 @@ static int prism2_config(struct pcmcia_device *link) | ||
2638 | local_info_t *local; | ||
2639 | int ret = 1; | ||
2640 | struct hostap_cs_priv *hw_priv; | ||
2641 | + unsigned long flags; | ||
2642 | |||
2643 | PDEBUG(DEBUG_FLOW, "prism2_config()\n"); | ||
2644 | |||
2645 | @@ -636,6 +637,12 @@ static int prism2_config(struct pcmcia_device *link) | ||
2646 | link->dev_node = &hw_priv->node; | ||
2647 | |||
2648 | /* | ||
2649 | + * Make sure the IRQ handler cannot proceed until at least | ||
2650 | + * dev->base_addr is initialized. | ||
2651 | + */ | ||
2652 | + spin_lock_irqsave(&local->irq_init_lock, flags); | ||
2653 | + | ||
2654 | + /* | ||
2655 | * Allocate an interrupt line. Note that this does not assign a | ||
2656 | * handler to the interrupt, unless the 'Handler' member of the | ||
2657 | * irq structure is initialized. | ||
2658 | @@ -645,7 +652,7 @@ static int prism2_config(struct pcmcia_device *link) | ||
2659 | link->irq.Handler = prism2_interrupt; | ||
2660 | ret = pcmcia_request_irq(link, &link->irq); | ||
2661 | if (ret) | ||
2662 | - goto failed; | ||
2663 | + goto failed_unlock; | ||
2664 | } | ||
2665 | |||
2666 | /* | ||
2667 | @@ -655,11 +662,13 @@ static int prism2_config(struct pcmcia_device *link) | ||
2668 | */ | ||
2669 | ret = pcmcia_request_configuration(link, &link->conf); | ||
2670 | if (ret) | ||
2671 | - goto failed; | ||
2672 | + goto failed_unlock; | ||
2673 | |||
2674 | dev->irq = link->irq.AssignedIRQ; | ||
2675 | dev->base_addr = link->io.BasePort1; | ||
2676 | |||
2677 | + spin_unlock_irqrestore(&local->irq_init_lock, flags); | ||
2678 | + | ||
2679 | /* Finally, report what we've done */ | ||
2680 | printk(KERN_INFO "%s: index 0x%02x: ", | ||
2681 | dev_info, link->conf.ConfigIndex); | ||
2682 | @@ -688,6 +697,8 @@ static int prism2_config(struct pcmcia_device *link) | ||
2683 | } | ||
2684 | return ret; | ||
2685 | |||
2686 | + failed_unlock: | ||
2687 | + spin_unlock_irqrestore(&local->irq_init_lock, flags); | ||
2688 | failed: | ||
2689 | kfree(hw_priv); | ||
2690 | prism2_release((u_long)link); | ||
2691 | diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c | ||
2692 | index ff9b5c8..2f999fc 100644 | ||
2693 | --- a/drivers/net/wireless/hostap/hostap_hw.c | ||
2694 | +++ b/drivers/net/wireless/hostap/hostap_hw.c | ||
2695 | @@ -2621,6 +2621,18 @@ static irqreturn_t prism2_interrupt(int irq, void *dev_id) | ||
2696 | iface = netdev_priv(dev); | ||
2697 | local = iface->local; | ||
2698 | |||
2699 | + /* Detect early interrupt before driver is fully configued */ | ||
2700 | + spin_lock(&local->irq_init_lock); | ||
2701 | + if (!dev->base_addr) { | ||
2702 | + if (net_ratelimit()) { | ||
2703 | + printk(KERN_DEBUG "%s: Interrupt, but dev not configured\n", | ||
2704 | + dev->name); | ||
2705 | + } | ||
2706 | + spin_unlock(&local->irq_init_lock); | ||
2707 | + return IRQ_HANDLED; | ||
2708 | + } | ||
2709 | + spin_unlock(&local->irq_init_lock); | ||
2710 | + | ||
2711 | prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0); | ||
2712 | |||
2713 | if (local->func->card_present && !local->func->card_present(local)) { | ||
2714 | @@ -3138,6 +3150,7 @@ prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx, | ||
2715 | spin_lock_init(&local->cmdlock); | ||
2716 | spin_lock_init(&local->baplock); | ||
2717 | spin_lock_init(&local->lock); | ||
2718 | + spin_lock_init(&local->irq_init_lock); | ||
2719 | mutex_init(&local->rid_bap_mtx); | ||
2720 | |||
2721 | if (card_idx < 0 || card_idx >= MAX_PARM_DEVICES) | ||
2722 | diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h | ||
2723 | index 3d23891..1ba33be 100644 | ||
2724 | --- a/drivers/net/wireless/hostap/hostap_wlan.h | ||
2725 | +++ b/drivers/net/wireless/hostap/hostap_wlan.h | ||
2726 | @@ -654,7 +654,7 @@ struct local_info { | ||
2727 | rwlock_t iface_lock; /* hostap_interfaces read lock; use write lock | ||
2728 | * when removing entries from the list. | ||
2729 | * TX and RX paths can use read lock. */ | ||
2730 | - spinlock_t cmdlock, baplock, lock; | ||
2731 | + spinlock_t cmdlock, baplock, lock, irq_init_lock; | ||
2732 | struct mutex rid_bap_mtx; | ||
2733 | u16 infofid; /* MAC buffer id for info frame */ | ||
2734 | /* txfid, intransmitfid, next_txtid, and next_alloc are protected by | ||
2735 | diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c | ||
2736 | index 8f1b850..8bc2105 100644 | ||
2737 | --- a/drivers/net/wireless/iwlwifi/iwl-scan.c | ||
2738 | +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | ||
2739 | @@ -812,6 +812,7 @@ void iwl_bg_abort_scan(struct work_struct *work) | ||
2740 | |||
2741 | mutex_lock(&priv->mutex); | ||
2742 | |||
2743 | + cancel_delayed_work_sync(&priv->scan_check); | ||
2744 | set_bit(STATUS_SCAN_ABORTING, &priv->status); | ||
2745 | iwl_send_scan_abort(priv); | ||
2746 | |||
2747 | diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c | ||
2748 | index e0ce039..2f53121 100644 | ||
2749 | --- a/drivers/net/wireless/iwlwifi/iwl-tx.c | ||
2750 | +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | ||
2751 | @@ -1553,6 +1553,11 @@ void iwl_rx_reply_compressed_ba(struct iwl_priv *priv, | ||
2752 | sta_id = ba_resp->sta_id; | ||
2753 | tid = ba_resp->tid; | ||
2754 | agg = &priv->stations[sta_id].tid[tid].agg; | ||
2755 | + if (unlikely(agg->txq_id != scd_flow)) { | ||
2756 | + IWL_ERR(priv, "BA scd_flow %d does not match txq_id %d\n", | ||
2757 | + scd_flow, agg->txq_id); | ||
2758 | + return; | ||
2759 | + } | ||
2760 | |||
2761 | /* Find index just before block-ack window */ | ||
2762 | index = iwl_queue_dec_wrap(ba_resp_scd_ssn & 0xff, txq->q.n_bd); | ||
2763 | diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c | ||
2764 | index 7a73f62..33206a9 100644 | ||
2765 | --- a/drivers/net/wireless/libertas/if_sdio.c | ||
2766 | +++ b/drivers/net/wireless/libertas/if_sdio.c | ||
2767 | @@ -34,6 +34,8 @@ | ||
2768 | #include <linux/mmc/card.h> | ||
2769 | #include <linux/mmc/sdio_func.h> | ||
2770 | #include <linux/mmc/sdio_ids.h> | ||
2771 | +#include <linux/mmc/sdio.h> | ||
2772 | +#include <linux/mmc/host.h> | ||
2773 | |||
2774 | #include "host.h" | ||
2775 | #include "decl.h" | ||
2776 | @@ -942,6 +944,7 @@ static int if_sdio_probe(struct sdio_func *func, | ||
2777 | int ret, i; | ||
2778 | unsigned int model; | ||
2779 | struct if_sdio_packet *packet; | ||
2780 | + struct mmc_host *host = func->card->host; | ||
2781 | |||
2782 | lbs_deb_enter(LBS_DEB_SDIO); | ||
2783 | |||
2784 | @@ -1022,6 +1025,25 @@ static int if_sdio_probe(struct sdio_func *func, | ||
2785 | if (ret) | ||
2786 | goto disable; | ||
2787 | |||
2788 | + /* For 1-bit transfers to the 8686 model, we need to enable the | ||
2789 | + * interrupt flag in the CCCR register. Set the MMC_QUIRK_LENIENT_FN0 | ||
2790 | + * bit to allow access to non-vendor registers. */ | ||
2791 | + if ((card->model == IF_SDIO_MODEL_8686) && | ||
2792 | + (host->caps & MMC_CAP_SDIO_IRQ) && | ||
2793 | + (host->ios.bus_width == MMC_BUS_WIDTH_1)) { | ||
2794 | + u8 reg; | ||
2795 | + | ||
2796 | + func->card->quirks |= MMC_QUIRK_LENIENT_FN0; | ||
2797 | + reg = sdio_f0_readb(func, SDIO_CCCR_IF, &ret); | ||
2798 | + if (ret) | ||
2799 | + goto release_int; | ||
2800 | + | ||
2801 | + reg |= SDIO_BUS_ECSI; | ||
2802 | + sdio_f0_writeb(func, reg, SDIO_CCCR_IF, &ret); | ||
2803 | + if (ret) | ||
2804 | + goto release_int; | ||
2805 | + } | ||
2806 | + | ||
2807 | card->ioport = sdio_readb(func, IF_SDIO_IOPORT, &ret); | ||
2808 | if (ret) | ||
2809 | goto release_int; | ||
2810 | diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c | ||
2811 | index 41d33cd..7ff033e 100644 | ||
2812 | --- a/drivers/net/wireless/p54/p54pci.c | ||
2813 | +++ b/drivers/net/wireless/p54/p54pci.c | ||
2814 | @@ -40,6 +40,8 @@ static struct pci_device_id p54p_table[] __devinitdata = { | ||
2815 | { PCI_DEVICE(0x1260, 0x3877) }, | ||
2816 | /* Intersil PRISM Javelin/Xbow Wireless LAN adapter */ | ||
2817 | { PCI_DEVICE(0x1260, 0x3886) }, | ||
2818 | + /* Intersil PRISM Xbow Wireless LAN adapter (Symbol AP-300) */ | ||
2819 | + { PCI_DEVICE(0x1260, 0xffff) }, | ||
2820 | { }, | ||
2821 | }; | ||
2822 | |||
2823 | diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c | ||
2824 | index c4ec5c1..a01bbe2 100644 | ||
2825 | --- a/drivers/rtc/rtc-ds1307.c | ||
2826 | +++ b/drivers/rtc/rtc-ds1307.c | ||
2827 | @@ -775,7 +775,7 @@ static int __devinit ds1307_probe(struct i2c_client *client, | ||
2828 | |||
2829 | read_rtc: | ||
2830 | /* read RTC registers */ | ||
2831 | - tmp = ds1307->read_block_data(ds1307->client, 0, 8, buf); | ||
2832 | + tmp = ds1307->read_block_data(ds1307->client, ds1307->offset, 8, buf); | ||
2833 | if (tmp != 8) { | ||
2834 | pr_debug("read error %d\n", tmp); | ||
2835 | err = -EIO; | ||
2836 | @@ -860,7 +860,7 @@ read_rtc: | ||
2837 | if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM) | ||
2838 | tmp += 12; | ||
2839 | i2c_smbus_write_byte_data(client, | ||
2840 | - DS1307_REG_HOUR, | ||
2841 | + ds1307->offset + DS1307_REG_HOUR, | ||
2842 | bin2bcd(tmp)); | ||
2843 | } | ||
2844 | |||
2845 | diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c | ||
2846 | index 9c0c911..1a5bf57 100644 | ||
2847 | --- a/drivers/scsi/aacraid/commctrl.c | ||
2848 | +++ b/drivers/scsi/aacraid/commctrl.c | ||
2849 | @@ -655,9 +655,9 @@ static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg) | ||
2850 | /* Does this really need to be GFP_DMA? */ | ||
2851 | p = kmalloc(usg->sg[i].count,GFP_KERNEL|__GFP_DMA); | ||
2852 | if(!p) { | ||
2853 | - kfree (usg); | ||
2854 | - dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n", | ||
2855 | + dprintk((KERN_DEBUG "aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n", | ||
2856 | usg->sg[i].count,i,usg->count)); | ||
2857 | + kfree(usg); | ||
2858 | rcode = -ENOMEM; | ||
2859 | goto cleanup; | ||
2860 | } | ||
2861 | diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c | ||
2862 | index 300cea7..7feb902 100644 | ||
2863 | --- a/drivers/serial/cpm_uart/cpm_uart_core.c | ||
2864 | +++ b/drivers/serial/cpm_uart/cpm_uart_core.c | ||
2865 | @@ -930,6 +930,83 @@ static void cpm_uart_config_port(struct uart_port *port, int flags) | ||
2866 | } | ||
2867 | } | ||
2868 | |||
2869 | +#if defined(CONFIG_CONSOLE_POLL) || defined(CONFIG_SERIAL_CPM_CONSOLE) | ||
2870 | +/* | ||
2871 | + * Write a string to the serial port | ||
2872 | + * Note that this is called with interrupts already disabled | ||
2873 | + */ | ||
2874 | +static void cpm_uart_early_write(struct uart_cpm_port *pinfo, | ||
2875 | + const char *string, u_int count) | ||
2876 | +{ | ||
2877 | + unsigned int i; | ||
2878 | + cbd_t __iomem *bdp, *bdbase; | ||
2879 | + unsigned char *cpm_outp_addr; | ||
2880 | + | ||
2881 | + /* Get the address of the host memory buffer. | ||
2882 | + */ | ||
2883 | + bdp = pinfo->tx_cur; | ||
2884 | + bdbase = pinfo->tx_bd_base; | ||
2885 | + | ||
2886 | + /* | ||
2887 | + * Now, do each character. This is not as bad as it looks | ||
2888 | + * since this is a holding FIFO and not a transmitting FIFO. | ||
2889 | + * We could add the complexity of filling the entire transmit | ||
2890 | + * buffer, but we would just wait longer between accesses...... | ||
2891 | + */ | ||
2892 | + for (i = 0; i < count; i++, string++) { | ||
2893 | + /* Wait for transmitter fifo to empty. | ||
2894 | + * Ready indicates output is ready, and xmt is doing | ||
2895 | + * that, not that it is ready for us to send. | ||
2896 | + */ | ||
2897 | + while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
2898 | + ; | ||
2899 | + | ||
2900 | + /* Send the character out. | ||
2901 | + * If the buffer address is in the CPM DPRAM, don't | ||
2902 | + * convert it. | ||
2903 | + */ | ||
2904 | + cpm_outp_addr = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), | ||
2905 | + pinfo); | ||
2906 | + *cpm_outp_addr = *string; | ||
2907 | + | ||
2908 | + out_be16(&bdp->cbd_datlen, 1); | ||
2909 | + setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
2910 | + | ||
2911 | + if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
2912 | + bdp = bdbase; | ||
2913 | + else | ||
2914 | + bdp++; | ||
2915 | + | ||
2916 | + /* if a LF, also do CR... */ | ||
2917 | + if (*string == 10) { | ||
2918 | + while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
2919 | + ; | ||
2920 | + | ||
2921 | + cpm_outp_addr = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), | ||
2922 | + pinfo); | ||
2923 | + *cpm_outp_addr = 13; | ||
2924 | + | ||
2925 | + out_be16(&bdp->cbd_datlen, 1); | ||
2926 | + setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
2927 | + | ||
2928 | + if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
2929 | + bdp = bdbase; | ||
2930 | + else | ||
2931 | + bdp++; | ||
2932 | + } | ||
2933 | + } | ||
2934 | + | ||
2935 | + /* | ||
2936 | + * Finally, Wait for transmitter & holding register to empty | ||
2937 | + * and restore the IER | ||
2938 | + */ | ||
2939 | + while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
2940 | + ; | ||
2941 | + | ||
2942 | + pinfo->tx_cur = bdp; | ||
2943 | +} | ||
2944 | +#endif | ||
2945 | + | ||
2946 | #ifdef CONFIG_CONSOLE_POLL | ||
2947 | /* Serial polling routines for writing and reading from the uart while | ||
2948 | * in an interrupt or debug context. | ||
2949 | @@ -999,7 +1076,7 @@ static void cpm_put_poll_char(struct uart_port *port, | ||
2950 | static char ch[2]; | ||
2951 | |||
2952 | ch[0] = (char)c; | ||
2953 | - cpm_uart_early_write(pinfo->port.line, ch, 1); | ||
2954 | + cpm_uart_early_write(pinfo, ch, 1); | ||
2955 | } | ||
2956 | #endif /* CONFIG_CONSOLE_POLL */ | ||
2957 | |||
2958 | @@ -1130,9 +1207,6 @@ static void cpm_uart_console_write(struct console *co, const char *s, | ||
2959 | u_int count) | ||
2960 | { | ||
2961 | struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index]; | ||
2962 | - unsigned int i; | ||
2963 | - cbd_t __iomem *bdp, *bdbase; | ||
2964 | - unsigned char *cp; | ||
2965 | unsigned long flags; | ||
2966 | int nolock = oops_in_progress; | ||
2967 | |||
2968 | @@ -1142,66 +1216,7 @@ static void cpm_uart_console_write(struct console *co, const char *s, | ||
2969 | spin_lock_irqsave(&pinfo->port.lock, flags); | ||
2970 | } | ||
2971 | |||
2972 | - /* Get the address of the host memory buffer. | ||
2973 | - */ | ||
2974 | - bdp = pinfo->tx_cur; | ||
2975 | - bdbase = pinfo->tx_bd_base; | ||
2976 | - | ||
2977 | - /* | ||
2978 | - * Now, do each character. This is not as bad as it looks | ||
2979 | - * since this is a holding FIFO and not a transmitting FIFO. | ||
2980 | - * We could add the complexity of filling the entire transmit | ||
2981 | - * buffer, but we would just wait longer between accesses...... | ||
2982 | - */ | ||
2983 | - for (i = 0; i < count; i++, s++) { | ||
2984 | - /* Wait for transmitter fifo to empty. | ||
2985 | - * Ready indicates output is ready, and xmt is doing | ||
2986 | - * that, not that it is ready for us to send. | ||
2987 | - */ | ||
2988 | - while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
2989 | - ; | ||
2990 | - | ||
2991 | - /* Send the character out. | ||
2992 | - * If the buffer address is in the CPM DPRAM, don't | ||
2993 | - * convert it. | ||
2994 | - */ | ||
2995 | - cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo); | ||
2996 | - *cp = *s; | ||
2997 | - | ||
2998 | - out_be16(&bdp->cbd_datlen, 1); | ||
2999 | - setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
3000 | - | ||
3001 | - if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
3002 | - bdp = bdbase; | ||
3003 | - else | ||
3004 | - bdp++; | ||
3005 | - | ||
3006 | - /* if a LF, also do CR... */ | ||
3007 | - if (*s == 10) { | ||
3008 | - while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
3009 | - ; | ||
3010 | - | ||
3011 | - cp = cpm2cpu_addr(in_be32(&bdp->cbd_bufaddr), pinfo); | ||
3012 | - *cp = 13; | ||
3013 | - | ||
3014 | - out_be16(&bdp->cbd_datlen, 1); | ||
3015 | - setbits16(&bdp->cbd_sc, BD_SC_READY); | ||
3016 | - | ||
3017 | - if (in_be16(&bdp->cbd_sc) & BD_SC_WRAP) | ||
3018 | - bdp = bdbase; | ||
3019 | - else | ||
3020 | - bdp++; | ||
3021 | - } | ||
3022 | - } | ||
3023 | - | ||
3024 | - /* | ||
3025 | - * Finally, Wait for transmitter & holding register to empty | ||
3026 | - * and restore the IER | ||
3027 | - */ | ||
3028 | - while ((in_be16(&bdp->cbd_sc) & BD_SC_READY) != 0) | ||
3029 | - ; | ||
3030 | - | ||
3031 | - pinfo->tx_cur = bdp; | ||
3032 | + cpm_uart_early_write(pinfo, s, count); | ||
3033 | |||
3034 | if (unlikely(nolock)) { | ||
3035 | local_irq_restore(flags); | ||
3036 | diff --git a/drivers/spi/spi_mpc8xxx.c b/drivers/spi/spi_mpc8xxx.c | ||
3037 | index 1fb2a6e..3fc4103 100644 | ||
3038 | --- a/drivers/spi/spi_mpc8xxx.c | ||
3039 | +++ b/drivers/spi/spi_mpc8xxx.c | ||
3040 | @@ -65,28 +65,6 @@ struct mpc8xxx_spi_reg { | ||
3041 | __be32 receive; | ||
3042 | }; | ||
3043 | |||
3044 | -/* SPI Parameter RAM */ | ||
3045 | -struct spi_pram { | ||
3046 | - __be16 rbase; /* Rx Buffer descriptor base address */ | ||
3047 | - __be16 tbase; /* Tx Buffer descriptor base address */ | ||
3048 | - u8 rfcr; /* Rx function code */ | ||
3049 | - u8 tfcr; /* Tx function code */ | ||
3050 | - __be16 mrblr; /* Max receive buffer length */ | ||
3051 | - __be32 rstate; /* Internal */ | ||
3052 | - __be32 rdp; /* Internal */ | ||
3053 | - __be16 rbptr; /* Internal */ | ||
3054 | - __be16 rbc; /* Internal */ | ||
3055 | - __be32 rxtmp; /* Internal */ | ||
3056 | - __be32 tstate; /* Internal */ | ||
3057 | - __be32 tdp; /* Internal */ | ||
3058 | - __be16 tbptr; /* Internal */ | ||
3059 | - __be16 tbc; /* Internal */ | ||
3060 | - __be32 txtmp; /* Internal */ | ||
3061 | - __be32 res; /* Tx temp. */ | ||
3062 | - __be16 rpbase; /* Relocation pointer (CPM1 only) */ | ||
3063 | - __be16 res1; /* Reserved */ | ||
3064 | -}; | ||
3065 | - | ||
3066 | /* SPI Controller mode register definitions */ | ||
3067 | #define SPMODE_LOOP (1 << 30) | ||
3068 | #define SPMODE_CI_INACTIVEHIGH (1 << 29) | ||
3069 | diff --git a/drivers/ssb/driver_chipcommon.c b/drivers/ssb/driver_chipcommon.c | ||
3070 | index 9681536..bbf1cb2 100644 | ||
3071 | --- a/drivers/ssb/driver_chipcommon.c | ||
3072 | +++ b/drivers/ssb/driver_chipcommon.c | ||
3073 | @@ -233,6 +233,9 @@ void ssb_chipcommon_init(struct ssb_chipcommon *cc) | ||
3074 | { | ||
3075 | if (!cc->dev) | ||
3076 | return; /* We don't have a ChipCommon */ | ||
3077 | + if (cc->dev->id.revision >= 11) | ||
3078 | + cc->status = chipco_read32(cc, SSB_CHIPCO_CHIPSTAT); | ||
3079 | + ssb_dprintk(KERN_INFO PFX "chipcommon status is 0x%x\n", cc->status); | ||
3080 | ssb_pmu_init(cc); | ||
3081 | chipco_powercontrol_init(cc); | ||
3082 | ssb_chipco_set_clockmode(cc, SSB_CLKMODE_FAST); | ||
3083 | diff --git a/drivers/ssb/driver_chipcommon_pmu.c b/drivers/ssb/driver_chipcommon_pmu.c | ||
3084 | index 64abd11..8e194d5 100644 | ||
3085 | --- a/drivers/ssb/driver_chipcommon_pmu.c | ||
3086 | +++ b/drivers/ssb/driver_chipcommon_pmu.c | ||
3087 | @@ -495,9 +495,9 @@ static void ssb_pmu_resources_init(struct ssb_chipcommon *cc) | ||
3088 | chipco_write32(cc, SSB_CHIPCO_PMU_MAXRES_MSK, max_msk); | ||
3089 | } | ||
3090 | |||
3091 | +/* http://bcm-v4.sipsolutions.net/802.11/SSB/PmuInit */ | ||
3092 | void ssb_pmu_init(struct ssb_chipcommon *cc) | ||
3093 | { | ||
3094 | - struct ssb_bus *bus = cc->dev->bus; | ||
3095 | u32 pmucap; | ||
3096 | |||
3097 | if (!(cc->capabilities & SSB_CHIPCO_CAP_PMU)) | ||
3098 | @@ -509,15 +509,12 @@ void ssb_pmu_init(struct ssb_chipcommon *cc) | ||
3099 | ssb_dprintk(KERN_DEBUG PFX "Found rev %u PMU (capabilities 0x%08X)\n", | ||
3100 | cc->pmu.rev, pmucap); | ||
3101 | |||
3102 | - if (cc->pmu.rev >= 1) { | ||
3103 | - if ((bus->chip_id == 0x4325) && (bus->chip_rev < 2)) { | ||
3104 | - chipco_mask32(cc, SSB_CHIPCO_PMU_CTL, | ||
3105 | - ~SSB_CHIPCO_PMU_CTL_NOILPONW); | ||
3106 | - } else { | ||
3107 | - chipco_set32(cc, SSB_CHIPCO_PMU_CTL, | ||
3108 | - SSB_CHIPCO_PMU_CTL_NOILPONW); | ||
3109 | - } | ||
3110 | - } | ||
3111 | + if (cc->pmu.rev == 1) | ||
3112 | + chipco_mask32(cc, SSB_CHIPCO_PMU_CTL, | ||
3113 | + ~SSB_CHIPCO_PMU_CTL_NOILPONW); | ||
3114 | + else | ||
3115 | + chipco_set32(cc, SSB_CHIPCO_PMU_CTL, | ||
3116 | + SSB_CHIPCO_PMU_CTL_NOILPONW); | ||
3117 | ssb_pmu_pll_init(cc); | ||
3118 | ssb_pmu_resources_init(cc); | ||
3119 | } | ||
3120 | diff --git a/drivers/ssb/pci.c b/drivers/ssb/pci.c | ||
3121 | index 9e50896..17a1781 100644 | ||
3122 | --- a/drivers/ssb/pci.c | ||
3123 | +++ b/drivers/ssb/pci.c | ||
3124 | @@ -22,6 +22,7 @@ | ||
3125 | |||
3126 | #include "ssb_private.h" | ||
3127 | |||
3128 | +bool ssb_is_sprom_available(struct ssb_bus *bus); | ||
3129 | |||
3130 | /* Define the following to 1 to enable a printk on each coreswitch. */ | ||
3131 | #define SSB_VERBOSE_PCICORESWITCH_DEBUG 0 | ||
3132 | @@ -167,7 +168,7 @@ err_pci: | ||
3133 | } | ||
3134 | |||
3135 | /* Get the word-offset for a SSB_SPROM_XXX define. */ | ||
3136 | -#define SPOFF(offset) (((offset) - SSB_SPROM_BASE) / sizeof(u16)) | ||
3137 | +#define SPOFF(offset) ((offset) / sizeof(u16)) | ||
3138 | /* Helper to extract some _offset, which is one of the SSB_SPROM_XXX defines. */ | ||
3139 | #define SPEX16(_outvar, _offset, _mask, _shift) \ | ||
3140 | out->_outvar = ((in[SPOFF(_offset)] & (_mask)) >> (_shift)) | ||
3141 | @@ -252,8 +253,13 @@ static int sprom_do_read(struct ssb_bus *bus, u16 *sprom) | ||
3142 | { | ||
3143 | int i; | ||
3144 | |||
3145 | + /* Check if SPROM can be read */ | ||
3146 | + if (ioread16(bus->mmio + bus->sprom_offset) == 0xFFFF) { | ||
3147 | + ssb_printk(KERN_ERR PFX "Unable to read SPROM\n"); | ||
3148 | + return -ENODEV; | ||
3149 | + } | ||
3150 | for (i = 0; i < bus->sprom_size; i++) | ||
3151 | - sprom[i] = ioread16(bus->mmio + SSB_SPROM_BASE + (i * 2)); | ||
3152 | + sprom[i] = ioread16(bus->mmio + bus->sprom_offset + (i * 2)); | ||
3153 | |||
3154 | return 0; | ||
3155 | } | ||
3156 | @@ -284,7 +290,7 @@ static int sprom_do_write(struct ssb_bus *bus, const u16 *sprom) | ||
3157 | ssb_printk("75%%"); | ||
3158 | else if (i % 2) | ||
3159 | ssb_printk("."); | ||
3160 | - writew(sprom[i], bus->mmio + SSB_SPROM_BASE + (i * 2)); | ||
3161 | + writew(sprom[i], bus->mmio + bus->sprom_offset + (i * 2)); | ||
3162 | mmiowb(); | ||
3163 | msleep(20); | ||
3164 | } | ||
3165 | @@ -620,21 +626,49 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus, | ||
3166 | int err = -ENOMEM; | ||
3167 | u16 *buf; | ||
3168 | |||
3169 | + if (!ssb_is_sprom_available(bus)) { | ||
3170 | + ssb_printk(KERN_ERR PFX "No SPROM available!\n"); | ||
3171 | + return -ENODEV; | ||
3172 | + } | ||
3173 | + if (bus->chipco.dev) { /* can be unavailible! */ | ||
3174 | + /* | ||
3175 | + * get SPROM offset: SSB_SPROM_BASE1 except for | ||
3176 | + * chipcommon rev >= 31 or chip ID is 0x4312 and | ||
3177 | + * chipcommon status & 3 == 2 | ||
3178 | + */ | ||
3179 | + if (bus->chipco.dev->id.revision >= 31) | ||
3180 | + bus->sprom_offset = SSB_SPROM_BASE31; | ||
3181 | + else if (bus->chip_id == 0x4312 && | ||
3182 | + (bus->chipco.status & 0x03) == 2) | ||
3183 | + bus->sprom_offset = SSB_SPROM_BASE31; | ||
3184 | + else | ||
3185 | + bus->sprom_offset = SSB_SPROM_BASE1; | ||
3186 | + } else { | ||
3187 | + bus->sprom_offset = SSB_SPROM_BASE1; | ||
3188 | + } | ||
3189 | + ssb_dprintk(KERN_INFO PFX "SPROM offset is 0x%x\n", bus->sprom_offset); | ||
3190 | + | ||
3191 | buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL); | ||
3192 | if (!buf) | ||
3193 | goto out; | ||
3194 | bus->sprom_size = SSB_SPROMSIZE_WORDS_R123; | ||
3195 | - sprom_do_read(bus, buf); | ||
3196 | + err = sprom_do_read(bus, buf); | ||
3197 | + if (err) | ||
3198 | + goto out_free; | ||
3199 | err = sprom_check_crc(buf, bus->sprom_size); | ||
3200 | if (err) { | ||
3201 | /* try for a 440 byte SPROM - revision 4 and higher */ | ||
3202 | kfree(buf); | ||
3203 | buf = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16), | ||
3204 | GFP_KERNEL); | ||
3205 | - if (!buf) | ||
3206 | + if (!buf) { | ||
3207 | + err = -ENOMEM; | ||
3208 | goto out; | ||
3209 | + } | ||
3210 | bus->sprom_size = SSB_SPROMSIZE_WORDS_R4; | ||
3211 | - sprom_do_read(bus, buf); | ||
3212 | + err = sprom_do_read(bus, buf); | ||
3213 | + if (err) | ||
3214 | + goto out_free; | ||
3215 | err = sprom_check_crc(buf, bus->sprom_size); | ||
3216 | if (err) { | ||
3217 | /* All CRC attempts failed. | ||
3218 | diff --git a/drivers/ssb/sprom.c b/drivers/ssb/sprom.c | ||
3219 | index d0e6762..7249f26 100644 | ||
3220 | --- a/drivers/ssb/sprom.c | ||
3221 | +++ b/drivers/ssb/sprom.c | ||
3222 | @@ -175,3 +175,18 @@ const struct ssb_sprom *ssb_get_fallback_sprom(void) | ||
3223 | { | ||
3224 | return fallback_sprom; | ||
3225 | } | ||
3226 | + | ||
3227 | +/* http://bcm-v4.sipsolutions.net/802.11/IsSpromAvailable */ | ||
3228 | +bool ssb_is_sprom_available(struct ssb_bus *bus) | ||
3229 | +{ | ||
3230 | + /* status register only exists on chipcomon rev >= 11 and we need check | ||
3231 | + for >= 31 only */ | ||
3232 | + /* this routine differs from specs as we do not access SPROM directly | ||
3233 | + on PCMCIA */ | ||
3234 | + if (bus->bustype == SSB_BUSTYPE_PCI && | ||
3235 | + bus->chipco.dev && /* can be unavailible! */ | ||
3236 | + bus->chipco.dev->id.revision >= 31) | ||
3237 | + return bus->chipco.capabilities & SSB_CHIPCO_CAP_SPROM; | ||
3238 | + | ||
3239 | + return true; | ||
3240 | +} | ||
3241 | diff --git a/drivers/staging/rtl8192su/r8192U_core.c b/drivers/staging/rtl8192su/r8192U_core.c | ||
3242 | index 55337c8..8ff9fed 100644 | ||
3243 | --- a/drivers/staging/rtl8192su/r8192U_core.c | ||
3244 | +++ b/drivers/staging/rtl8192su/r8192U_core.c | ||
3245 | @@ -118,6 +118,7 @@ static struct usb_device_id rtl8192_usb_id_tbl[] = { | ||
3246 | {USB_DEVICE(0x07aa, 0x0043)}, | ||
3247 | /* Belkin */ | ||
3248 | {USB_DEVICE(0x050d, 0x805E)}, | ||
3249 | + {USB_DEVICE(0x050d, 0x815F)}, /* Belkin F5D8053 v6 */ | ||
3250 | /* Sitecom */ | ||
3251 | {USB_DEVICE(0x0df6, 0x0031)}, | ||
3252 | {USB_DEVICE(0x0df6, 0x004b)}, /* WL-349 */ | ||
3253 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c | ||
3254 | index d9d0bf5..ce99d8b 100644 | ||
3255 | --- a/drivers/usb/core/driver.c | ||
3256 | +++ b/drivers/usb/core/driver.c | ||
3257 | @@ -1790,9 +1790,6 @@ int usb_external_resume_device(struct usb_device *udev, pm_message_t msg) | ||
3258 | |||
3259 | static void choose_wakeup(struct usb_device *udev, pm_message_t msg) | ||
3260 | { | ||
3261 | - int w, i; | ||
3262 | - struct usb_interface *intf; | ||
3263 | - | ||
3264 | /* Remote wakeup is needed only when we actually go to sleep. | ||
3265 | * For things like FREEZE and QUIESCE, if the device is already | ||
3266 | * autosuspended then its current wakeup setting is okay. | ||
3267 | @@ -1802,18 +1799,10 @@ static void choose_wakeup(struct usb_device *udev, pm_message_t msg) | ||
3268 | return; | ||
3269 | } | ||
3270 | |||
3271 | - /* If remote wakeup is permitted, see whether any interface drivers | ||
3272 | + /* Allow remote wakeup if it is enabled, even if no interface drivers | ||
3273 | * actually want it. | ||
3274 | */ | ||
3275 | - w = 0; | ||
3276 | - if (device_may_wakeup(&udev->dev) && udev->actconfig) { | ||
3277 | - for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { | ||
3278 | - intf = udev->actconfig->interface[i]; | ||
3279 | - w |= intf->needs_remote_wakeup; | ||
3280 | - } | ||
3281 | - } | ||
3282 | - | ||
3283 | - udev->do_remote_wakeup = w; | ||
3284 | + udev->do_remote_wakeup = device_may_wakeup(&udev->dev); | ||
3285 | } | ||
3286 | |||
3287 | int usb_suspend(struct device *dev, pm_message_t msg) | ||
3288 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c | ||
3289 | index ab93918..a61f160 100644 | ||
3290 | --- a/drivers/usb/core/quirks.c | ||
3291 | +++ b/drivers/usb/core/quirks.c | ||
3292 | @@ -41,6 +41,10 @@ static const struct usb_device_id usb_quirk_list[] = { | ||
3293 | /* Philips PSC805 audio device */ | ||
3294 | { USB_DEVICE(0x0471, 0x0155), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
3295 | |||
3296 | + /* Artisman Watchdog Dongle */ | ||
3297 | + { USB_DEVICE(0x04b4, 0x0526), .driver_info = | ||
3298 | + USB_QUIRK_CONFIG_INTF_STRINGS }, | ||
3299 | + | ||
3300 | /* Roland SC-8820 */ | ||
3301 | { USB_DEVICE(0x0582, 0x0007), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
3302 | |||
3303 | @@ -64,6 +68,9 @@ static const struct usb_device_id usb_quirk_list[] = { | ||
3304 | /* X-Rite/Gretag-Macbeth Eye-One Pro display colorimeter */ | ||
3305 | { USB_DEVICE(0x0971, 0x2000), .driver_info = USB_QUIRK_NO_SET_INTF }, | ||
3306 | |||
3307 | + /* Broadcom BCM92035DGROM BT dongle */ | ||
3308 | + { USB_DEVICE(0x0a5c, 0x2021), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
3309 | + | ||
3310 | /* Action Semiconductor flash disk */ | ||
3311 | { USB_DEVICE(0x10d6, 0x2200), .driver_info = | ||
3312 | USB_QUIRK_STRING_FETCH_255 }, | ||
3313 | diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c | ||
3314 | index adf8260..9e5f9f1 100644 | ||
3315 | --- a/drivers/usb/gadget/u_serial.c | ||
3316 | +++ b/drivers/usb/gadget/u_serial.c | ||
3317 | @@ -535,17 +535,11 @@ recycle: | ||
3318 | list_move(&req->list, &port->read_pool); | ||
3319 | } | ||
3320 | |||
3321 | - /* Push from tty to ldisc; this is immediate with low_latency, and | ||
3322 | - * may trigger callbacks to this driver ... so drop the spinlock. | ||
3323 | + /* Push from tty to ldisc; without low_latency set this is handled by | ||
3324 | + * a workqueue, so we won't get callbacks and can hold port_lock | ||
3325 | */ | ||
3326 | if (tty && do_push) { | ||
3327 | - spin_unlock_irq(&port->port_lock); | ||
3328 | tty_flip_buffer_push(tty); | ||
3329 | - wake_up_interruptible(&tty->read_wait); | ||
3330 | - spin_lock_irq(&port->port_lock); | ||
3331 | - | ||
3332 | - /* tty may have been closed */ | ||
3333 | - tty = port->port_tty; | ||
3334 | } | ||
3335 | |||
3336 | |||
3337 | @@ -783,11 +777,6 @@ static int gs_open(struct tty_struct *tty, struct file *file) | ||
3338 | port->open_count = 1; | ||
3339 | port->openclose = false; | ||
3340 | |||
3341 | - /* low_latency means ldiscs work in tasklet context, without | ||
3342 | - * needing a workqueue schedule ... easier to keep up. | ||
3343 | - */ | ||
3344 | - tty->low_latency = 1; | ||
3345 | - | ||
3346 | /* if connected, start the I/O stream */ | ||
3347 | if (port->port_usb) { | ||
3348 | struct gserial *gser = port->port_usb; | ||
3349 | @@ -1194,6 +1183,7 @@ void gserial_cleanup(void) | ||
3350 | n_ports = 0; | ||
3351 | |||
3352 | tty_unregister_driver(gs_tty_driver); | ||
3353 | + put_tty_driver(gs_tty_driver); | ||
3354 | gs_tty_driver = NULL; | ||
3355 | |||
3356 | pr_debug("%s: cleaned up ttyGS* support\n", __func__); | ||
3357 | diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c | ||
3358 | index 35c56f4..798b407 100644 | ||
3359 | --- a/drivers/usb/host/ehci-mxc.c | ||
3360 | +++ b/drivers/usb/host/ehci-mxc.c | ||
3361 | @@ -207,10 +207,17 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) | ||
3362 | /* Initialize the transceiver */ | ||
3363 | if (pdata->otg) { | ||
3364 | pdata->otg->io_priv = hcd->regs + ULPI_VIEWPORT_OFFSET; | ||
3365 | - if (otg_init(pdata->otg) != 0) | ||
3366 | - dev_err(dev, "unable to init transceiver\n"); | ||
3367 | - else if (otg_set_vbus(pdata->otg, 1) != 0) | ||
3368 | + ret = otg_init(pdata->otg); | ||
3369 | + if (ret) { | ||
3370 | + dev_err(dev, "unable to init transceiver, probably missing\n"); | ||
3371 | + ret = -ENODEV; | ||
3372 | + goto err_add; | ||
3373 | + } | ||
3374 | + ret = otg_set_vbus(pdata->otg, 1); | ||
3375 | + if (ret) { | ||
3376 | dev_err(dev, "unable to enable vbus on transceiver\n"); | ||
3377 | + goto err_add; | ||
3378 | + } | ||
3379 | } | ||
3380 | |||
3381 | priv->hcd = hcd; | ||
3382 | diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c | ||
3383 | index 8b37a4b..be41ec3 100644 | ||
3384 | --- a/drivers/usb/misc/sisusbvga/sisusb.c | ||
3385 | +++ b/drivers/usb/misc/sisusbvga/sisusb.c | ||
3386 | @@ -2435,7 +2435,8 @@ sisusb_open(struct inode *inode, struct file *file) | ||
3387 | } | ||
3388 | |||
3389 | if (!sisusb->devinit) { | ||
3390 | - if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH) { | ||
3391 | + if (sisusb->sisusb_dev->speed == USB_SPEED_HIGH || | ||
3392 | + sisusb->sisusb_dev->speed == USB_SPEED_SUPER) { | ||
3393 | if (sisusb_init_gfxdevice(sisusb, 0)) { | ||
3394 | mutex_unlock(&sisusb->lock); | ||
3395 | dev_err(&sisusb->sisusb_dev->dev, "Failed to initialize device\n"); | ||
3396 | @@ -3167,7 +3168,7 @@ static int sisusb_probe(struct usb_interface *intf, | ||
3397 | |||
3398 | sisusb->present = 1; | ||
3399 | |||
3400 | - if (dev->speed == USB_SPEED_HIGH) { | ||
3401 | + if (dev->speed == USB_SPEED_HIGH || dev->speed == USB_SPEED_SUPER) { | ||
3402 | int initscreen = 1; | ||
3403 | #ifdef INCL_SISUSB_CON | ||
3404 | if (sisusb_first_vc > 0 && | ||
3405 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
3406 | index 8c19ad5..bc11d0c 100644 | ||
3407 | --- a/drivers/usb/serial/ftdi_sio.c | ||
3408 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
3409 | @@ -697,6 +697,7 @@ static struct usb_device_id id_table_combined [] = { | ||
3410 | { USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID), | ||
3411 | .driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk }, | ||
3412 | { USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) }, | ||
3413 | + { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) }, | ||
3414 | { USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) }, | ||
3415 | { USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) }, | ||
3416 | { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, | ||
3417 | @@ -743,6 +744,14 @@ static struct usb_device_id id_table_combined [] = { | ||
3418 | { USB_DEVICE(FTDI_VID, MJSG_SR_RADIO_PID) }, | ||
3419 | { USB_DEVICE(FTDI_VID, MJSG_HD_RADIO_PID) }, | ||
3420 | { USB_DEVICE(FTDI_VID, MJSG_XM_RADIO_PID) }, | ||
3421 | + { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_ST_PID), | ||
3422 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
3423 | + { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SLITE_PID), | ||
3424 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
3425 | + { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH2_PID), | ||
3426 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
3427 | + { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID), | ||
3428 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
3429 | { }, /* Optional parameter entry */ | ||
3430 | { } /* Terminating entry */ | ||
3431 | }; | ||
3432 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
3433 | index 8f9e805..ffdcec7 100644 | ||
3434 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
3435 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
3436 | @@ -703,6 +703,12 @@ | ||
3437 | #define TELLDUS_TELLSTICK_PID 0x0C30 /* RF control dongle 433 MHz using FT232RL */ | ||
3438 | |||
3439 | /* | ||
3440 | + * RT Systems programming cables for various ham radios | ||
3441 | + */ | ||
3442 | +#define RTSYSTEMS_VID 0x2100 /* Vendor ID */ | ||
3443 | +#define RTSYSTEMS_SERIAL_VX7_PID 0x9e52 /* Serial converter for VX-7 Radios using FT232RL */ | ||
3444 | + | ||
3445 | +/* | ||
3446 | * Bayer Ascensia Contour blood glucose meter USB-converter cable. | ||
3447 | * http://winglucofacts.com/cables/ | ||
3448 | */ | ||
3449 | @@ -1024,3 +1030,12 @@ | ||
3450 | #define MJSG_SR_RADIO_PID 0x9379 | ||
3451 | #define MJSG_XM_RADIO_PID 0x937A | ||
3452 | #define MJSG_HD_RADIO_PID 0x937C | ||
3453 | + | ||
3454 | +/* | ||
3455 | + * Xverve Signalyzer tools (http://www.signalyzer.com/) | ||
3456 | + */ | ||
3457 | +#define XVERVE_SIGNALYZER_ST_PID 0xBCA0 | ||
3458 | +#define XVERVE_SIGNALYZER_SLITE_PID 0xBCA1 | ||
3459 | +#define XVERVE_SIGNALYZER_SH2_PID 0xBCA2 | ||
3460 | +#define XVERVE_SIGNALYZER_SH4_PID 0xBCA4 | ||
3461 | + | ||
3462 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
3463 | index 64b50f6..c5def6d 100644 | ||
3464 | --- a/drivers/usb/serial/option.c | ||
3465 | +++ b/drivers/usb/serial/option.c | ||
3466 | @@ -226,6 +226,7 @@ static int option_resume(struct usb_serial *serial); | ||
3467 | #define AMOI_PRODUCT_H01 0x0800 | ||
3468 | #define AMOI_PRODUCT_H01A 0x7002 | ||
3469 | #define AMOI_PRODUCT_H02 0x0802 | ||
3470 | +#define AMOI_PRODUCT_SKYPEPHONE_S2 0x0407 | ||
3471 | |||
3472 | #define DELL_VENDOR_ID 0x413C | ||
3473 | |||
3474 | @@ -316,6 +317,7 @@ static int option_resume(struct usb_serial *serial); | ||
3475 | #define QISDA_PRODUCT_H21_4512 0x4512 | ||
3476 | #define QISDA_PRODUCT_H21_4523 0x4523 | ||
3477 | #define QISDA_PRODUCT_H20_4515 0x4515 | ||
3478 | +#define QISDA_PRODUCT_H20_4518 0x4518 | ||
3479 | #define QISDA_PRODUCT_H20_4519 0x4519 | ||
3480 | |||
3481 | /* TLAYTECH PRODUCTS */ | ||
3482 | @@ -503,6 +505,7 @@ static struct usb_device_id option_ids[] = { | ||
3483 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) }, | ||
3484 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) }, | ||
3485 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) }, | ||
3486 | + { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_SKYPEPHONE_S2) }, | ||
3487 | |||
3488 | { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */ | ||
3489 | { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5500_MINICARD) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */ | ||
3490 | @@ -836,6 +839,7 @@ static struct usb_device_id option_ids[] = { | ||
3491 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4512) }, | ||
3492 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H21_4523) }, | ||
3493 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4515) }, | ||
3494 | + { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4518) }, | ||
3495 | { USB_DEVICE(QISDA_VENDOR_ID, QISDA_PRODUCT_H20_4519) }, | ||
3496 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_G450) }, | ||
3497 | { USB_DEVICE(TOSHIBA_VENDOR_ID, TOSHIBA_PRODUCT_HSDPA_MINICARD ) }, /* Toshiba 3G HSDPA == Novatel Expedite EU870D MiniCard */ | ||
3498 | diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c | ||
3499 | index a442989..6435b26 100644 | ||
3500 | --- a/drivers/usb/serial/sierra.c | ||
3501 | +++ b/drivers/usb/serial/sierra.c | ||
3502 | @@ -244,6 +244,7 @@ static struct usb_device_id id_table [] = { | ||
3503 | { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */ | ||
3504 | { USB_DEVICE(0x1199, 0x0112) }, /* Sierra Wireless AirCard 580 */ | ||
3505 | { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless USB Dongle 595U */ | ||
3506 | + { USB_DEVICE(0x1199, 0x0301) }, /* Sierra Wireless USB Dongle 250U */ | ||
3507 | /* Sierra Wireless C597 */ | ||
3508 | { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x0023, 0xFF, 0xFF, 0xFF) }, | ||
3509 | /* Sierra Wireless T598 */ | ||
3510 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c | ||
3511 | index 2c6ee6a..0bc5776 100644 | ||
3512 | --- a/fs/btrfs/ioctl.c | ||
3513 | +++ b/fs/btrfs/ioctl.c | ||
3514 | @@ -952,7 +952,7 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | ||
3515 | */ | ||
3516 | |||
3517 | /* the destination must be opened for writing */ | ||
3518 | - if (!(file->f_mode & FMODE_WRITE)) | ||
3519 | + if (!(file->f_mode & FMODE_WRITE) || (file->f_flags & O_APPEND)) | ||
3520 | return -EINVAL; | ||
3521 | |||
3522 | ret = mnt_want_write(file->f_path.mnt); | ||
3523 | @@ -1005,7 +1005,7 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | ||
3524 | |||
3525 | /* determine range to clone */ | ||
3526 | ret = -EINVAL; | ||
3527 | - if (off >= src->i_size || off + len > src->i_size) | ||
3528 | + if (off + len > src->i_size || off + len < off) | ||
3529 | goto out_unlock; | ||
3530 | if (len == 0) | ||
3531 | olen = len = src->i_size - off; | ||
3532 | diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c | ||
3533 | index 8c6a036..7fb871a 100644 | ||
3534 | --- a/fs/cifs/cifsfs.c | ||
3535 | +++ b/fs/cifs/cifsfs.c | ||
3536 | @@ -1034,7 +1034,7 @@ init_cifs(void) | ||
3537 | goto out_unregister_filesystem; | ||
3538 | #endif | ||
3539 | #ifdef CONFIG_CIFS_DFS_UPCALL | ||
3540 | - rc = register_key_type(&key_type_dns_resolver); | ||
3541 | + rc = cifs_init_dns_resolver(); | ||
3542 | if (rc) | ||
3543 | goto out_unregister_key_type; | ||
3544 | #endif | ||
3545 | @@ -1046,7 +1046,7 @@ init_cifs(void) | ||
3546 | |||
3547 | out_unregister_resolver_key: | ||
3548 | #ifdef CONFIG_CIFS_DFS_UPCALL | ||
3549 | - unregister_key_type(&key_type_dns_resolver); | ||
3550 | + cifs_exit_dns_resolver(); | ||
3551 | out_unregister_key_type: | ||
3552 | #endif | ||
3553 | #ifdef CONFIG_CIFS_UPCALL | ||
3554 | @@ -1072,7 +1072,7 @@ exit_cifs(void) | ||
3555 | cifs_proc_clean(); | ||
3556 | #ifdef CONFIG_CIFS_DFS_UPCALL | ||
3557 | cifs_dfs_release_automount_timer(); | ||
3558 | - unregister_key_type(&key_type_dns_resolver); | ||
3559 | + cifs_exit_dns_resolver(); | ||
3560 | #endif | ||
3561 | #ifdef CONFIG_CIFS_UPCALL | ||
3562 | unregister_key_type(&cifs_spnego_key_type); | ||
3563 | diff --git a/fs/cifs/dns_resolve.c b/fs/cifs/dns_resolve.c | ||
3564 | index 8794814..16f31c1 100644 | ||
3565 | --- a/fs/cifs/dns_resolve.c | ||
3566 | +++ b/fs/cifs/dns_resolve.c | ||
3567 | @@ -23,12 +23,16 @@ | ||
3568 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
3569 | */ | ||
3570 | |||
3571 | +#include <linux/keyctl.h> | ||
3572 | +#include <linux/key-type.h> | ||
3573 | #include <keys/user-type.h> | ||
3574 | #include "dns_resolve.h" | ||
3575 | #include "cifsglob.h" | ||
3576 | #include "cifsproto.h" | ||
3577 | #include "cifs_debug.h" | ||
3578 | |||
3579 | +static const struct cred *dns_resolver_cache; | ||
3580 | + | ||
3581 | /* Checks if supplied name is IP address | ||
3582 | * returns: | ||
3583 | * 1 - name is IP | ||
3584 | @@ -93,6 +97,7 @@ struct key_type key_type_dns_resolver = { | ||
3585 | int | ||
3586 | dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) | ||
3587 | { | ||
3588 | + const struct cred *saved_cred; | ||
3589 | int rc = -EAGAIN; | ||
3590 | struct key *rkey = ERR_PTR(-EAGAIN); | ||
3591 | char *name; | ||
3592 | @@ -132,8 +137,15 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr) | ||
3593 | goto skip_upcall; | ||
3594 | } | ||
3595 | |||
3596 | + saved_cred = override_creds(dns_resolver_cache); | ||
3597 | rkey = request_key(&key_type_dns_resolver, name, ""); | ||
3598 | + revert_creds(saved_cred); | ||
3599 | if (!IS_ERR(rkey)) { | ||
3600 | + if (!(rkey->perm & KEY_USR_VIEW)) { | ||
3601 | + down_read(&rkey->sem); | ||
3602 | + rkey->perm |= KEY_USR_VIEW; | ||
3603 | + up_read(&rkey->sem); | ||
3604 | + } | ||
3605 | len = rkey->type_data.x[0]; | ||
3606 | data = rkey->payload.data; | ||
3607 | } else { | ||
3608 | @@ -164,4 +176,61 @@ out: | ||
3609 | return rc; | ||
3610 | } | ||
3611 | |||
3612 | +int __init cifs_init_dns_resolver(void) | ||
3613 | +{ | ||
3614 | + struct cred *cred; | ||
3615 | + struct key *keyring; | ||
3616 | + int ret; | ||
3617 | + | ||
3618 | + printk(KERN_NOTICE "Registering the %s key type\n", | ||
3619 | + key_type_dns_resolver.name); | ||
3620 | + | ||
3621 | + /* create an override credential set with a special thread keyring in | ||
3622 | + * which DNS requests are cached | ||
3623 | + * | ||
3624 | + * this is used to prevent malicious redirections from being installed | ||
3625 | + * with add_key(). | ||
3626 | + */ | ||
3627 | + cred = prepare_kernel_cred(NULL); | ||
3628 | + if (!cred) | ||
3629 | + return -ENOMEM; | ||
3630 | + | ||
3631 | + keyring = key_alloc(&key_type_keyring, ".dns_resolver", 0, 0, cred, | ||
3632 | + (KEY_POS_ALL & ~KEY_POS_SETATTR) | | ||
3633 | + KEY_USR_VIEW | KEY_USR_READ, | ||
3634 | + KEY_ALLOC_NOT_IN_QUOTA); | ||
3635 | + if (IS_ERR(keyring)) { | ||
3636 | + ret = PTR_ERR(keyring); | ||
3637 | + goto failed_put_cred; | ||
3638 | + } | ||
3639 | + | ||
3640 | + ret = key_instantiate_and_link(keyring, NULL, 0, NULL, NULL); | ||
3641 | + if (ret < 0) | ||
3642 | + goto failed_put_key; | ||
3643 | + | ||
3644 | + ret = register_key_type(&key_type_dns_resolver); | ||
3645 | + if (ret < 0) | ||
3646 | + goto failed_put_key; | ||
3647 | + | ||
3648 | + /* instruct request_key() to use this special keyring as a cache for | ||
3649 | + * the results it looks up */ | ||
3650 | + cred->thread_keyring = keyring; | ||
3651 | + cred->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING; | ||
3652 | + dns_resolver_cache = cred; | ||
3653 | + return 0; | ||
3654 | + | ||
3655 | +failed_put_key: | ||
3656 | + key_put(keyring); | ||
3657 | +failed_put_cred: | ||
3658 | + put_cred(cred); | ||
3659 | + return ret; | ||
3660 | +} | ||
3661 | |||
3662 | +void __exit cifs_exit_dns_resolver(void) | ||
3663 | +{ | ||
3664 | + key_revoke(dns_resolver_cache->thread_keyring); | ||
3665 | + unregister_key_type(&key_type_dns_resolver); | ||
3666 | + put_cred(dns_resolver_cache); | ||
3667 | + printk(KERN_NOTICE "Unregistered %s key type\n", | ||
3668 | + key_type_dns_resolver.name); | ||
3669 | +} | ||
3670 | diff --git a/fs/cifs/dns_resolve.h b/fs/cifs/dns_resolve.h | ||
3671 | index 966e928..26b9eaa 100644 | ||
3672 | --- a/fs/cifs/dns_resolve.h | ||
3673 | +++ b/fs/cifs/dns_resolve.h | ||
3674 | @@ -24,8 +24,8 @@ | ||
3675 | #define _DNS_RESOLVE_H | ||
3676 | |||
3677 | #ifdef __KERNEL__ | ||
3678 | -#include <linux/key-type.h> | ||
3679 | -extern struct key_type key_type_dns_resolver; | ||
3680 | +extern int __init cifs_init_dns_resolver(void); | ||
3681 | +extern void __exit cifs_exit_dns_resolver(void); | ||
3682 | extern int dns_resolve_server_name_to_ip(const char *unc, char **ip_addr); | ||
3683 | #endif /* KERNEL */ | ||
3684 | |||
3685 | diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c | ||
3686 | index 7ec8555..91be319 100644 | ||
3687 | --- a/fs/cifs/inode.c | ||
3688 | +++ b/fs/cifs/inode.c | ||
3689 | @@ -1284,6 +1284,10 @@ cifs_do_rename(int xid, struct dentry *from_dentry, const char *fromPath, | ||
3690 | if (rc == 0 || rc != -ETXTBSY) | ||
3691 | return rc; | ||
3692 | |||
3693 | + /* open-file renames don't work across directories */ | ||
3694 | + if (to_dentry->d_parent != from_dentry->d_parent) | ||
3695 | + return rc; | ||
3696 | + | ||
3697 | /* open the file to be renamed -- we need DELETE perms */ | ||
3698 | rc = CIFSSMBOpen(xid, pTcon, fromPath, FILE_OPEN, DELETE, | ||
3699 | CREATE_NOT_DIR, &srcfid, &oplock, NULL, | ||
3700 | diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c | ||
3701 | index aaa9c1c..7ca42eb 100644 | ||
3702 | --- a/fs/cifs/sess.c | ||
3703 | +++ b/fs/cifs/sess.c | ||
3704 | @@ -722,15 +722,7 @@ ssetup_ntlmssp_authenticate: | ||
3705 | |||
3706 | /* calculate session key */ | ||
3707 | setup_ntlmv2_rsp(ses, v2_sess_key, nls_cp); | ||
3708 | - if (first_time) /* should this be moved into common code | ||
3709 | - with similar ntlmv2 path? */ | ||
3710 | - /* cifs_calculate_ntlmv2_mac_key(ses->server->mac_signing_key, | ||
3711 | - response BB FIXME, v2_sess_key); */ | ||
3712 | - | ||
3713 | - /* copy session key */ | ||
3714 | - | ||
3715 | - /* memcpy(bcc_ptr, (char *)ntlm_session_key,LM2_SESS_KEY_SIZE); | ||
3716 | - bcc_ptr += LM2_SESS_KEY_SIZE; */ | ||
3717 | + /* FIXME: calculate MAC key */ | ||
3718 | memcpy(bcc_ptr, (char *)v2_sess_key, | ||
3719 | sizeof(struct ntlmv2_resp)); | ||
3720 | bcc_ptr += sizeof(struct ntlmv2_resp); | ||
3721 | diff --git a/fs/ecryptfs/messaging.c b/fs/ecryptfs/messaging.c | ||
3722 | index f1c17e8..3dfe7ce 100644 | ||
3723 | --- a/fs/ecryptfs/messaging.c | ||
3724 | +++ b/fs/ecryptfs/messaging.c | ||
3725 | @@ -30,9 +30,9 @@ static struct mutex ecryptfs_msg_ctx_lists_mux; | ||
3726 | |||
3727 | static struct hlist_head *ecryptfs_daemon_hash; | ||
3728 | struct mutex ecryptfs_daemon_hash_mux; | ||
3729 | -static int ecryptfs_hash_buckets; | ||
3730 | +static int ecryptfs_hash_bits; | ||
3731 | #define ecryptfs_uid_hash(uid) \ | ||
3732 | - hash_long((unsigned long)uid, ecryptfs_hash_buckets) | ||
3733 | + hash_long((unsigned long)uid, ecryptfs_hash_bits) | ||
3734 | |||
3735 | static u32 ecryptfs_msg_counter; | ||
3736 | static struct ecryptfs_msg_ctx *ecryptfs_msg_ctx_arr; | ||
3737 | @@ -485,18 +485,19 @@ int ecryptfs_init_messaging(void) | ||
3738 | } | ||
3739 | mutex_init(&ecryptfs_daemon_hash_mux); | ||
3740 | mutex_lock(&ecryptfs_daemon_hash_mux); | ||
3741 | - ecryptfs_hash_buckets = 1; | ||
3742 | - while (ecryptfs_number_of_users >> ecryptfs_hash_buckets) | ||
3743 | - ecryptfs_hash_buckets++; | ||
3744 | + ecryptfs_hash_bits = 1; | ||
3745 | + while (ecryptfs_number_of_users >> ecryptfs_hash_bits) | ||
3746 | + ecryptfs_hash_bits++; | ||
3747 | ecryptfs_daemon_hash = kmalloc((sizeof(struct hlist_head) | ||
3748 | - * ecryptfs_hash_buckets), GFP_KERNEL); | ||
3749 | + * (1 << ecryptfs_hash_bits)), | ||
3750 | + GFP_KERNEL); | ||
3751 | if (!ecryptfs_daemon_hash) { | ||
3752 | rc = -ENOMEM; | ||
3753 | printk(KERN_ERR "%s: Failed to allocate memory\n", __func__); | ||
3754 | mutex_unlock(&ecryptfs_daemon_hash_mux); | ||
3755 | goto out; | ||
3756 | } | ||
3757 | - for (i = 0; i < ecryptfs_hash_buckets; i++) | ||
3758 | + for (i = 0; i < (1 << ecryptfs_hash_bits); i++) | ||
3759 | INIT_HLIST_HEAD(&ecryptfs_daemon_hash[i]); | ||
3760 | mutex_unlock(&ecryptfs_daemon_hash_mux); | ||
3761 | ecryptfs_msg_ctx_arr = kmalloc((sizeof(struct ecryptfs_msg_ctx) | ||
3762 | @@ -553,7 +554,7 @@ void ecryptfs_release_messaging(void) | ||
3763 | int i; | ||
3764 | |||
3765 | mutex_lock(&ecryptfs_daemon_hash_mux); | ||
3766 | - for (i = 0; i < ecryptfs_hash_buckets; i++) { | ||
3767 | + for (i = 0; i < (1 << ecryptfs_hash_bits); i++) { | ||
3768 | int rc; | ||
3769 | |||
3770 | hlist_for_each_entry(daemon, elem, | ||
3771 | diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c | ||
3772 | index 5cd5184..d741e0e 100644 | ||
3773 | --- a/fs/nfs/nfs4xdr.c | ||
3774 | +++ b/fs/nfs/nfs4xdr.c | ||
3775 | @@ -863,8 +863,8 @@ static void encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const | ||
3776 | bmval1 |= FATTR4_WORD1_TIME_ACCESS_SET; | ||
3777 | *p++ = cpu_to_be32(NFS4_SET_TO_CLIENT_TIME); | ||
3778 | *p++ = cpu_to_be32(0); | ||
3779 | - *p++ = cpu_to_be32(iap->ia_mtime.tv_sec); | ||
3780 | - *p++ = cpu_to_be32(iap->ia_mtime.tv_nsec); | ||
3781 | + *p++ = cpu_to_be32(iap->ia_atime.tv_sec); | ||
3782 | + *p++ = cpu_to_be32(iap->ia_atime.tv_nsec); | ||
3783 | } | ||
3784 | else if (iap->ia_valid & ATTR_ATIME) { | ||
3785 | bmval1 |= FATTR4_WORD1_TIME_ACCESS_SET; | ||
3786 | diff --git a/fs/nfs/super.c b/fs/nfs/super.c | ||
3787 | index f1afee4..912e61f 100644 | ||
3788 | --- a/fs/nfs/super.c | ||
3789 | +++ b/fs/nfs/super.c | ||
3790 | @@ -565,6 +565,22 @@ static void nfs_show_mountd_options(struct seq_file *m, struct nfs_server *nfss, | ||
3791 | nfs_show_mountd_netid(m, nfss, showdefaults); | ||
3792 | } | ||
3793 | |||
3794 | +#ifdef CONFIG_NFS_V4 | ||
3795 | +static void nfs_show_nfsv4_options(struct seq_file *m, struct nfs_server *nfss, | ||
3796 | + int showdefaults) | ||
3797 | +{ | ||
3798 | + struct nfs_client *clp = nfss->nfs_client; | ||
3799 | + | ||
3800 | + seq_printf(m, ",clientaddr=%s", clp->cl_ipaddr); | ||
3801 | + seq_printf(m, ",minorversion=%u", clp->cl_minorversion); | ||
3802 | +} | ||
3803 | +#else | ||
3804 | +static void nfs_show_nfsv4_options(struct seq_file *m, struct nfs_server *nfss, | ||
3805 | + int showdefaults) | ||
3806 | +{ | ||
3807 | +} | ||
3808 | +#endif | ||
3809 | + | ||
3810 | /* | ||
3811 | * Describe the mount options in force on this server representation | ||
3812 | */ | ||
3813 | @@ -626,11 +642,9 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss, | ||
3814 | |||
3815 | if (version != 4) | ||
3816 | nfs_show_mountd_options(m, nfss, showdefaults); | ||
3817 | + else | ||
3818 | + nfs_show_nfsv4_options(m, nfss, showdefaults); | ||
3819 | |||
3820 | -#ifdef CONFIG_NFS_V4 | ||
3821 | - if (clp->rpc_ops->version == 4) | ||
3822 | - seq_printf(m, ",clientaddr=%s", clp->cl_ipaddr); | ||
3823 | -#endif | ||
3824 | if (nfss->options & NFS_OPTION_FSCACHE) | ||
3825 | seq_printf(m, ",fsc"); | ||
3826 | } | ||
3827 | diff --git a/include/acpi/processor.h b/include/acpi/processor.h | ||
3828 | index 0ea5ef4..dcd0cb0 100644 | ||
3829 | --- a/include/acpi/processor.h | ||
3830 | +++ b/include/acpi/processor.h | ||
3831 | @@ -48,7 +48,7 @@ struct acpi_power_register { | ||
3832 | u8 space_id; | ||
3833 | u8 bit_width; | ||
3834 | u8 bit_offset; | ||
3835 | - u8 reserved; | ||
3836 | + u8 access_size; | ||
3837 | u64 address; | ||
3838 | } __attribute__ ((packed)); | ||
3839 | |||
3840 | @@ -74,6 +74,7 @@ struct acpi_processor_cx { | ||
3841 | u32 power; | ||
3842 | u32 usage; | ||
3843 | u64 time; | ||
3844 | + u8 bm_sts_skip; | ||
3845 | struct acpi_processor_cx_policy promotion; | ||
3846 | struct acpi_processor_cx_policy demotion; | ||
3847 | char desc[ACPI_CX_DESC_LEN]; | ||
3848 | diff --git a/include/linux/acpi.h b/include/linux/acpi.h | ||
3849 | index b926afe..87ca491 100644 | ||
3850 | --- a/include/linux/acpi.h | ||
3851 | +++ b/include/linux/acpi.h | ||
3852 | @@ -251,7 +251,6 @@ int acpi_check_mem_region(resource_size_t start, resource_size_t n, | ||
3853 | void __init acpi_no_s4_hw_signature(void); | ||
3854 | void __init acpi_old_suspend_ordering(void); | ||
3855 | void __init acpi_s4_no_nvs(void); | ||
3856 | -void __init acpi_set_sci_en_on_resume(void); | ||
3857 | #endif /* CONFIG_PM_SLEEP */ | ||
3858 | |||
3859 | struct acpi_osc_context { | ||
3860 | diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h | ||
3861 | index ef4a2d8..03c52fa 100644 | ||
3862 | --- a/include/linux/ethtool.h | ||
3863 | +++ b/include/linux/ethtool.h | ||
3864 | @@ -358,6 +358,8 @@ struct ethtool_rxnfc { | ||
3865 | __u32 flow_type; | ||
3866 | /* The rx flow hash value or the rule DB size */ | ||
3867 | __u64 data; | ||
3868 | + /* The following fields are not valid and must not be used for | ||
3869 | + * the ETHTOOL_{G,X}RXFH commands. */ | ||
3870 | struct ethtool_rx_flow_spec fs; | ||
3871 | __u32 rule_cnt; | ||
3872 | __u32 rule_locs[0]; | ||
3873 | diff --git a/include/linux/fb.h b/include/linux/fb.h | ||
3874 | index 369767b..74d67ca 100644 | ||
3875 | --- a/include/linux/fb.h | ||
3876 | +++ b/include/linux/fb.h | ||
3877 | @@ -785,8 +785,6 @@ struct fb_tile_ops { | ||
3878 | #define FBINFO_MISC_USEREVENT 0x10000 /* event request | ||
3879 | from userspace */ | ||
3880 | #define FBINFO_MISC_TILEBLITTING 0x20000 /* use tile blitting */ | ||
3881 | -#define FBINFO_MISC_FIRMWARE 0x40000 /* a replaceable firmware | ||
3882 | - inited framebuffer */ | ||
3883 | |||
3884 | /* A driver may set this flag to indicate that it does want a set_par to be | ||
3885 | * called every time when fbcon_switch is executed. The advantage is that with | ||
3886 | @@ -800,6 +798,8 @@ struct fb_tile_ops { | ||
3887 | */ | ||
3888 | #define FBINFO_MISC_ALWAYS_SETPAR 0x40000 | ||
3889 | |||
3890 | +/* where the fb is a firmware driver, and can be replaced with a proper one */ | ||
3891 | +#define FBINFO_MISC_FIRMWARE 0x80000 | ||
3892 | /* | ||
3893 | * Host and GPU endianness differ. | ||
3894 | */ | ||
3895 | diff --git a/include/linux/firmware.h b/include/linux/firmware.h | ||
3896 | index 043811f..53d1e6c 100644 | ||
3897 | --- a/include/linux/firmware.h | ||
3898 | +++ b/include/linux/firmware.h | ||
3899 | @@ -12,6 +12,7 @@ | ||
3900 | struct firmware { | ||
3901 | size_t size; | ||
3902 | const u8 *data; | ||
3903 | + struct page **pages; | ||
3904 | }; | ||
3905 | |||
3906 | struct device; | ||
3907 | diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h | ||
3908 | index 163c840..047e449 100644 | ||
3909 | --- a/include/linux/ieee80211.h | ||
3910 | +++ b/include/linux/ieee80211.h | ||
3911 | @@ -1137,6 +1137,8 @@ enum ieee80211_category { | ||
3912 | WLAN_CATEGORY_SA_QUERY = 8, | ||
3913 | WLAN_CATEGORY_PROTECTED_DUAL_OF_ACTION = 9, | ||
3914 | WLAN_CATEGORY_WMM = 17, | ||
3915 | + WLAN_CATEGORY_MESH_PLINK = 30, /* Pending ANA approval */ | ||
3916 | + WLAN_CATEGORY_MESH_PATH_SEL = 32, /* Pending ANA approval */ | ||
3917 | WLAN_CATEGORY_VENDOR_SPECIFIC_PROTECTED = 126, | ||
3918 | WLAN_CATEGORY_VENDOR_SPECIFIC = 127, | ||
3919 | }; | ||
3920 | diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h | ||
3921 | index 47ba464..118f029 100644 | ||
3922 | --- a/include/linux/mmc/sdio.h | ||
3923 | +++ b/include/linux/mmc/sdio.h | ||
3924 | @@ -94,6 +94,8 @@ | ||
3925 | |||
3926 | #define SDIO_BUS_WIDTH_1BIT 0x00 | ||
3927 | #define SDIO_BUS_WIDTH_4BIT 0x02 | ||
3928 | +#define SDIO_BUS_ECSI 0x20 /* Enable continuous SPI interrupt */ | ||
3929 | +#define SDIO_BUS_SCSI 0x40 /* Support continuous SPI interrupt */ | ||
3930 | |||
3931 | #define SDIO_BUS_CD_DISABLE 0x80 /* disable pull-up on DAT3 (pin 1) */ | ||
3932 | |||
3933 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h | ||
3934 | index be29806..f0bcfbc 100644 | ||
3935 | --- a/include/linux/pci_ids.h | ||
3936 | +++ b/include/linux/pci_ids.h | ||
3937 | @@ -1262,6 +1262,7 @@ | ||
3938 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759 | ||
3939 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS 0x07D8 | ||
3940 | #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS 0x0AA2 | ||
3941 | +#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA 0x0D85 | ||
3942 | |||
3943 | #define PCI_VENDOR_ID_IMS 0x10e0 | ||
3944 | #define PCI_DEVICE_ID_IMS_TT128 0x9128 | ||
3945 | diff --git a/include/linux/ssb/ssb.h b/include/linux/ssb/ssb.h | ||
3946 | index 24f9885..732ba9a 100644 | ||
3947 | --- a/include/linux/ssb/ssb.h | ||
3948 | +++ b/include/linux/ssb/ssb.h | ||
3949 | @@ -306,6 +306,7 @@ struct ssb_bus { | ||
3950 | u16 chip_id; | ||
3951 | u16 chip_rev; | ||
3952 | u16 sprom_size; /* number of words in sprom */ | ||
3953 | + u16 sprom_offset; | ||
3954 | u8 chip_package; | ||
3955 | |||
3956 | /* List of devices (cores) on the backplane. */ | ||
3957 | diff --git a/include/linux/ssb/ssb_driver_chipcommon.h b/include/linux/ssb/ssb_driver_chipcommon.h | ||
3958 | index 4e27acf..7600f38 100644 | ||
3959 | --- a/include/linux/ssb/ssb_driver_chipcommon.h | ||
3960 | +++ b/include/linux/ssb/ssb_driver_chipcommon.h | ||
3961 | @@ -46,6 +46,7 @@ | ||
3962 | #define SSB_PLLTYPE_7 0x00038000 /* 25Mhz, 4 dividers */ | ||
3963 | #define SSB_CHIPCO_CAP_PCTL 0x00040000 /* Power Control */ | ||
3964 | #define SSB_CHIPCO_CAP_OTPS 0x00380000 /* OTP size */ | ||
3965 | +#define SSB_CHIPCO_CAP_SPROM 0x40000000 /* SPROM present */ | ||
3966 | #define SSB_CHIPCO_CAP_OTPS_SHIFT 19 | ||
3967 | #define SSB_CHIPCO_CAP_OTPS_BASE 5 | ||
3968 | #define SSB_CHIPCO_CAP_JTAGM 0x00400000 /* JTAG master present */ | ||
3969 | @@ -564,6 +565,7 @@ struct ssb_chipcommon_pmu { | ||
3970 | struct ssb_chipcommon { | ||
3971 | struct ssb_device *dev; | ||
3972 | u32 capabilities; | ||
3973 | + u32 status; | ||
3974 | /* Fast Powerup Delay constant */ | ||
3975 | u16 fast_pwrup_delay; | ||
3976 | struct ssb_chipcommon_pmu pmu; | ||
3977 | diff --git a/include/linux/ssb/ssb_regs.h b/include/linux/ssb/ssb_regs.h | ||
3978 | index 9ae9082..b8be23c 100644 | ||
3979 | --- a/include/linux/ssb/ssb_regs.h | ||
3980 | +++ b/include/linux/ssb/ssb_regs.h | ||
3981 | @@ -170,7 +170,8 @@ | ||
3982 | #define SSB_SPROMSIZE_WORDS_R4 220 | ||
3983 | #define SSB_SPROMSIZE_BYTES_R123 (SSB_SPROMSIZE_WORDS_R123 * sizeof(u16)) | ||
3984 | #define SSB_SPROMSIZE_BYTES_R4 (SSB_SPROMSIZE_WORDS_R4 * sizeof(u16)) | ||
3985 | -#define SSB_SPROM_BASE 0x1000 | ||
3986 | +#define SSB_SPROM_BASE1 0x1000 | ||
3987 | +#define SSB_SPROM_BASE31 0x0800 | ||
3988 | #define SSB_SPROM_REVISION 0x107E | ||
3989 | #define SSB_SPROM_REVISION_REV 0x00FF /* SPROM Revision number */ | ||
3990 | #define SSB_SPROM_REVISION_CRC 0xFF00 /* SPROM CRC8 value */ | ||
3991 | diff --git a/include/math-emu/op-common.h b/include/math-emu/op-common.h | ||
3992 | index f456534..3e2576d 100644 | ||
3993 | --- a/include/math-emu/op-common.h | ||
3994 | +++ b/include/math-emu/op-common.h | ||
3995 | @@ -799,7 +799,7 @@ do { \ | ||
3996 | X##_e -= (_FP_W_TYPE_SIZE - rsize); \ | ||
3997 | X##_e = rsize - X##_e - 1; \ | ||
3998 | \ | ||
3999 | - if (_FP_FRACBITS_##fs < rsize && _FP_WFRACBITS_##fs < X##_e) \ | ||
4000 | + if (_FP_FRACBITS_##fs < rsize && _FP_WFRACBITS_##fs <= X##_e) \ | ||
4001 | __FP_FRAC_SRS_1(ur_, (X##_e - _FP_WFRACBITS_##fs + 1), rsize);\ | ||
4002 | _FP_FRAC_DISASSEMBLE_##wc(X, ur_, rsize); \ | ||
4003 | if ((_FP_WFRACBITS_##fs - X##_e - 1) > 0) \ | ||
4004 | diff --git a/include/net/sock.h b/include/net/sock.h | ||
4005 | index 86f2da1b..e45305d 100644 | ||
4006 | --- a/include/net/sock.h | ||
4007 | +++ b/include/net/sock.h | ||
4008 | @@ -1130,12 +1130,7 @@ static inline void sk_tx_queue_clear(struct sock *sk) | ||
4009 | |||
4010 | static inline int sk_tx_queue_get(const struct sock *sk) | ||
4011 | { | ||
4012 | - return sk->sk_tx_queue_mapping; | ||
4013 | -} | ||
4014 | - | ||
4015 | -static inline bool sk_tx_queue_recorded(const struct sock *sk) | ||
4016 | -{ | ||
4017 | - return (sk && sk->sk_tx_queue_mapping >= 0); | ||
4018 | + return sk ? sk->sk_tx_queue_mapping : -1; | ||
4019 | } | ||
4020 | |||
4021 | static inline void sk_set_socket(struct sock *sk, struct socket *sock) | ||
4022 | diff --git a/kernel/futex.c b/kernel/futex.c | ||
4023 | index e7a35f1..6a3a5fa 100644 | ||
4024 | --- a/kernel/futex.c | ||
4025 | +++ b/kernel/futex.c | ||
4026 | @@ -429,20 +429,11 @@ static void free_pi_state(struct futex_pi_state *pi_state) | ||
4027 | static struct task_struct * futex_find_get_task(pid_t pid) | ||
4028 | { | ||
4029 | struct task_struct *p; | ||
4030 | - const struct cred *cred = current_cred(), *pcred; | ||
4031 | |||
4032 | rcu_read_lock(); | ||
4033 | p = find_task_by_vpid(pid); | ||
4034 | - if (!p) { | ||
4035 | - p = ERR_PTR(-ESRCH); | ||
4036 | - } else { | ||
4037 | - pcred = __task_cred(p); | ||
4038 | - if (cred->euid != pcred->euid && | ||
4039 | - cred->euid != pcred->uid) | ||
4040 | - p = ERR_PTR(-ESRCH); | ||
4041 | - else | ||
4042 | - get_task_struct(p); | ||
4043 | - } | ||
4044 | + if (p) | ||
4045 | + get_task_struct(p); | ||
4046 | |||
4047 | rcu_read_unlock(); | ||
4048 | |||
4049 | @@ -564,8 +555,8 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, | ||
4050 | if (!pid) | ||
4051 | return -ESRCH; | ||
4052 | p = futex_find_get_task(pid); | ||
4053 | - if (IS_ERR(p)) | ||
4054 | - return PTR_ERR(p); | ||
4055 | + if (!p) | ||
4056 | + return -ESRCH; | ||
4057 | |||
4058 | /* | ||
4059 | * We need to look at the task state flags to figure out, | ||
4060 | diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c | ||
4061 | index 0b23ff7..918c618 100644 | ||
4062 | --- a/kernel/irq/manage.c | ||
4063 | +++ b/kernel/irq/manage.c | ||
4064 | @@ -436,6 +436,9 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | ||
4065 | /* note that IRQF_TRIGGER_MASK == IRQ_TYPE_SENSE_MASK */ | ||
4066 | desc->status &= ~(IRQ_LEVEL | IRQ_TYPE_SENSE_MASK); | ||
4067 | desc->status |= flags; | ||
4068 | + | ||
4069 | + if (chip != desc->chip) | ||
4070 | + irq_chip_set_defaults(desc->chip); | ||
4071 | } | ||
4072 | |||
4073 | return ret; | ||
4074 | diff --git a/kernel/module.c b/kernel/module.c | ||
4075 | index 5b6ce39..3d1df51 100644 | ||
4076 | --- a/kernel/module.c | ||
4077 | +++ b/kernel/module.c | ||
4078 | @@ -720,7 +720,6 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user, | ||
4079 | mutex_lock(&module_mutex); | ||
4080 | /* Store the name of the last unloaded module for diagnostic purposes */ | ||
4081 | strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module)); | ||
4082 | - ddebug_remove_module(mod->name); | ||
4083 | free_module(mod); | ||
4084 | |||
4085 | out: | ||
4086 | @@ -1383,6 +1382,9 @@ static void free_module(struct module *mod) | ||
4087 | remove_sect_attrs(mod); | ||
4088 | mod_kobject_remove(mod); | ||
4089 | |||
4090 | + /* Remove dynamic debug info */ | ||
4091 | + ddebug_remove_module(mod->name); | ||
4092 | + | ||
4093 | /* Arch-specific cleanup. */ | ||
4094 | module_arch_cleanup(mod); | ||
4095 | |||
4096 | diff --git a/kernel/sched.c b/kernel/sched.c | ||
4097 | index da19c1e..12b9e73 100644 | ||
4098 | --- a/kernel/sched.c | ||
4099 | +++ b/kernel/sched.c | ||
4100 | @@ -1259,6 +1259,12 @@ static void sched_avg_update(struct rq *rq) | ||
4101 | s64 period = sched_avg_period(); | ||
4102 | |||
4103 | while ((s64)(rq->clock - rq->age_stamp) > period) { | ||
4104 | + /* | ||
4105 | + * Inline assembly required to prevent the compiler | ||
4106 | + * optimising this loop into a divmod call. | ||
4107 | + * See __iter_div_u64_rem() for another example of this. | ||
4108 | + */ | ||
4109 | + asm("" : "+rm" (rq->age_stamp)); | ||
4110 | rq->age_stamp += period; | ||
4111 | rq->rt_avg /= 2; | ||
4112 | } | ||
4113 | @@ -1713,9 +1719,6 @@ static void update_shares_locked(struct rq *rq, struct sched_domain *sd) | ||
4114 | |||
4115 | static void update_h_load(long cpu) | ||
4116 | { | ||
4117 | - if (root_task_group_empty()) | ||
4118 | - return; | ||
4119 | - | ||
4120 | walk_tg_tree(tg_load_down, tg_nop, (void *)cpu); | ||
4121 | } | ||
4122 | |||
4123 | diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c | ||
4124 | index 3b8e038..900431c 100644 | ||
4125 | --- a/net/bridge/br_fdb.c | ||
4126 | +++ b/net/bridge/br_fdb.c | ||
4127 | @@ -127,7 +127,7 @@ void br_fdb_cleanup(unsigned long _data) | ||
4128 | { | ||
4129 | struct net_bridge *br = (struct net_bridge *)_data; | ||
4130 | unsigned long delay = hold_time(br); | ||
4131 | - unsigned long next_timer = jiffies + br->forward_delay; | ||
4132 | + unsigned long next_timer = jiffies + br->ageing_time; | ||
4133 | int i; | ||
4134 | |||
4135 | spin_lock_bh(&br->hash_lock); | ||
4136 | @@ -148,9 +148,7 @@ void br_fdb_cleanup(unsigned long _data) | ||
4137 | } | ||
4138 | spin_unlock_bh(&br->hash_lock); | ||
4139 | |||
4140 | - /* Add HZ/4 to ensure we round the jiffies upwards to be after the next | ||
4141 | - * timer, otherwise we might round down and will have no-op run. */ | ||
4142 | - mod_timer(&br->gc_timer, round_jiffies(next_timer + HZ/4)); | ||
4143 | + mod_timer(&br->gc_timer, round_jiffies_up(next_timer)); | ||
4144 | } | ||
4145 | |||
4146 | /* Completely flush all dynamic entries in forwarding database.*/ | ||
4147 | diff --git a/net/core/dev.c b/net/core/dev.c | ||
4148 | index f51f940..7eb7c1d 100644 | ||
4149 | --- a/net/core/dev.c | ||
4150 | +++ b/net/core/dev.c | ||
4151 | @@ -1428,7 +1428,7 @@ static inline void net_timestamp(struct sk_buff *skb) | ||
4152 | * | ||
4153 | * return values: | ||
4154 | * NET_RX_SUCCESS (no congestion) | ||
4155 | - * NET_RX_DROP (packet was dropped) | ||
4156 | + * NET_RX_DROP (packet was dropped, but freed) | ||
4157 | * | ||
4158 | * dev_forward_skb can be used for injecting an skb from the | ||
4159 | * start_xmit function of one device into the receive queue | ||
4160 | @@ -1442,11 +1442,11 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | ||
4161 | { | ||
4162 | skb_orphan(skb); | ||
4163 | |||
4164 | - if (!(dev->flags & IFF_UP)) | ||
4165 | - return NET_RX_DROP; | ||
4166 | - | ||
4167 | - if (skb->len > (dev->mtu + dev->hard_header_len)) | ||
4168 | + if (!(dev->flags & IFF_UP) || | ||
4169 | + (skb->len > (dev->mtu + dev->hard_header_len))) { | ||
4170 | + kfree_skb(skb); | ||
4171 | return NET_RX_DROP; | ||
4172 | + } | ||
4173 | |||
4174 | skb_dst_drop(skb); | ||
4175 | skb->tstamp.tv64 = 0; | ||
4176 | @@ -1915,12 +1915,11 @@ static inline u16 dev_cap_txqueue(struct net_device *dev, u16 queue_index) | ||
4177 | static struct netdev_queue *dev_pick_tx(struct net_device *dev, | ||
4178 | struct sk_buff *skb) | ||
4179 | { | ||
4180 | - u16 queue_index; | ||
4181 | + int queue_index; | ||
4182 | struct sock *sk = skb->sk; | ||
4183 | |||
4184 | - if (sk_tx_queue_recorded(sk)) { | ||
4185 | - queue_index = sk_tx_queue_get(sk); | ||
4186 | - } else { | ||
4187 | + queue_index = sk_tx_queue_get(sk); | ||
4188 | + if (queue_index < 0) { | ||
4189 | const struct net_device_ops *ops = dev->netdev_ops; | ||
4190 | |||
4191 | if (ops->ndo_select_queue) { | ||
4192 | diff --git a/net/core/ethtool.c b/net/core/ethtool.c | ||
4193 | index 236a998..ed2fb75 100644 | ||
4194 | --- a/net/core/ethtool.c | ||
4195 | +++ b/net/core/ethtool.c | ||
4196 | @@ -209,22 +209,34 @@ static int ethtool_get_drvinfo(struct net_device *dev, void __user *useraddr) | ||
4197 | return 0; | ||
4198 | } | ||
4199 | |||
4200 | -static int ethtool_set_rxnfc(struct net_device *dev, void __user *useraddr) | ||
4201 | +static int ethtool_set_rxnfc(struct net_device *dev, | ||
4202 | + u32 cmd, void __user *useraddr) | ||
4203 | { | ||
4204 | - struct ethtool_rxnfc cmd; | ||
4205 | + struct ethtool_rxnfc info; | ||
4206 | + size_t info_size = sizeof(info); | ||
4207 | |||
4208 | if (!dev->ethtool_ops->set_rxnfc) | ||
4209 | return -EOPNOTSUPP; | ||
4210 | |||
4211 | - if (copy_from_user(&cmd, useraddr, sizeof(cmd))) | ||
4212 | + /* struct ethtool_rxnfc was originally defined for | ||
4213 | + * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data | ||
4214 | + * members. User-space might still be using that | ||
4215 | + * definition. */ | ||
4216 | + if (cmd == ETHTOOL_SRXFH) | ||
4217 | + info_size = (offsetof(struct ethtool_rxnfc, data) + | ||
4218 | + sizeof(info.data)); | ||
4219 | + | ||
4220 | + if (copy_from_user(&info, useraddr, info_size)) | ||
4221 | return -EFAULT; | ||
4222 | |||
4223 | - return dev->ethtool_ops->set_rxnfc(dev, &cmd); | ||
4224 | + return dev->ethtool_ops->set_rxnfc(dev, &info); | ||
4225 | } | ||
4226 | |||
4227 | -static int ethtool_get_rxnfc(struct net_device *dev, void __user *useraddr) | ||
4228 | +static int ethtool_get_rxnfc(struct net_device *dev, | ||
4229 | + u32 cmd, void __user *useraddr) | ||
4230 | { | ||
4231 | struct ethtool_rxnfc info; | ||
4232 | + size_t info_size = sizeof(info); | ||
4233 | const struct ethtool_ops *ops = dev->ethtool_ops; | ||
4234 | int ret; | ||
4235 | void *rule_buf = NULL; | ||
4236 | @@ -232,13 +244,22 @@ static int ethtool_get_rxnfc(struct net_device *dev, void __user *useraddr) | ||
4237 | if (!ops->get_rxnfc) | ||
4238 | return -EOPNOTSUPP; | ||
4239 | |||
4240 | - if (copy_from_user(&info, useraddr, sizeof(info))) | ||
4241 | + /* struct ethtool_rxnfc was originally defined for | ||
4242 | + * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data | ||
4243 | + * members. User-space might still be using that | ||
4244 | + * definition. */ | ||
4245 | + if (cmd == ETHTOOL_GRXFH) | ||
4246 | + info_size = (offsetof(struct ethtool_rxnfc, data) + | ||
4247 | + sizeof(info.data)); | ||
4248 | + | ||
4249 | + if (copy_from_user(&info, useraddr, info_size)) | ||
4250 | return -EFAULT; | ||
4251 | |||
4252 | if (info.cmd == ETHTOOL_GRXCLSRLALL) { | ||
4253 | if (info.rule_cnt > 0) { | ||
4254 | - rule_buf = kmalloc(info.rule_cnt * sizeof(u32), | ||
4255 | - GFP_USER); | ||
4256 | + if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32)) | ||
4257 | + rule_buf = kmalloc(info.rule_cnt * sizeof(u32), | ||
4258 | + GFP_USER); | ||
4259 | if (!rule_buf) | ||
4260 | return -ENOMEM; | ||
4261 | } | ||
4262 | @@ -249,7 +270,7 @@ static int ethtool_get_rxnfc(struct net_device *dev, void __user *useraddr) | ||
4263 | goto err_out; | ||
4264 | |||
4265 | ret = -EFAULT; | ||
4266 | - if (copy_to_user(useraddr, &info, sizeof(info))) | ||
4267 | + if (copy_to_user(useraddr, &info, info_size)) | ||
4268 | goto err_out; | ||
4269 | |||
4270 | if (rule_buf) { | ||
4271 | @@ -1094,12 +1115,12 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) | ||
4272 | case ETHTOOL_GRXCLSRLCNT: | ||
4273 | case ETHTOOL_GRXCLSRULE: | ||
4274 | case ETHTOOL_GRXCLSRLALL: | ||
4275 | - rc = ethtool_get_rxnfc(dev, useraddr); | ||
4276 | + rc = ethtool_get_rxnfc(dev, ethcmd, useraddr); | ||
4277 | break; | ||
4278 | case ETHTOOL_SRXFH: | ||
4279 | case ETHTOOL_SRXCLSRLDEL: | ||
4280 | case ETHTOOL_SRXCLSRLINS: | ||
4281 | - rc = ethtool_set_rxnfc(dev, useraddr); | ||
4282 | + rc = ethtool_set_rxnfc(dev, ethcmd, useraddr); | ||
4283 | break; | ||
4284 | case ETHTOOL_GGRO: | ||
4285 | rc = ethtool_get_gro(dev, useraddr); | ||
4286 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c | ||
4287 | index f35377b..3fdffe0 100644 | ||
4288 | --- a/net/core/neighbour.c | ||
4289 | +++ b/net/core/neighbour.c | ||
4290 | @@ -945,7 +945,10 @@ static void neigh_update_hhs(struct neighbour *neigh) | ||
4291 | { | ||
4292 | struct hh_cache *hh; | ||
4293 | void (*update)(struct hh_cache*, const struct net_device*, const unsigned char *) | ||
4294 | - = neigh->dev->header_ops->cache_update; | ||
4295 | + = NULL; | ||
4296 | + | ||
4297 | + if (neigh->dev->header_ops) | ||
4298 | + update = neigh->dev->header_ops->cache_update; | ||
4299 | |||
4300 | if (update) { | ||
4301 | for (hh = neigh->hh; hh; hh = hh->hh_next) { | ||
4302 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c | ||
4303 | index 93c4e06..cad8e97 100644 | ||
4304 | --- a/net/core/skbuff.c | ||
4305 | +++ b/net/core/skbuff.c | ||
4306 | @@ -2729,6 +2729,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb) | ||
4307 | *NAPI_GRO_CB(nskb) = *NAPI_GRO_CB(p); | ||
4308 | skb_shinfo(nskb)->frag_list = p; | ||
4309 | skb_shinfo(nskb)->gso_size = pinfo->gso_size; | ||
4310 | + pinfo->gso_size = 0; | ||
4311 | skb_header_release(p); | ||
4312 | nskb->prev = p; | ||
4313 | |||
4314 | diff --git a/net/dccp/input.c b/net/dccp/input.c | ||
4315 | index 7648f31..071b64e 100644 | ||
4316 | --- a/net/dccp/input.c | ||
4317 | +++ b/net/dccp/input.c | ||
4318 | @@ -123,9 +123,9 @@ static int dccp_rcv_closereq(struct sock *sk, struct sk_buff *skb) | ||
4319 | return queued; | ||
4320 | } | ||
4321 | |||
4322 | -static u8 dccp_reset_code_convert(const u8 code) | ||
4323 | +static u16 dccp_reset_code_convert(const u8 code) | ||
4324 | { | ||
4325 | - const u8 error_code[] = { | ||
4326 | + const u16 error_code[] = { | ||
4327 | [DCCP_RESET_CODE_CLOSED] = 0, /* normal termination */ | ||
4328 | [DCCP_RESET_CODE_UNSPECIFIED] = 0, /* nothing known */ | ||
4329 | [DCCP_RESET_CODE_ABORTED] = ECONNRESET, | ||
4330 | @@ -147,7 +147,7 @@ static u8 dccp_reset_code_convert(const u8 code) | ||
4331 | |||
4332 | static void dccp_rcv_reset(struct sock *sk, struct sk_buff *skb) | ||
4333 | { | ||
4334 | - u8 err = dccp_reset_code_convert(dccp_hdr_reset(skb)->dccph_reset_code); | ||
4335 | + u16 err = dccp_reset_code_convert(dccp_hdr_reset(skb)->dccph_reset_code); | ||
4336 | |||
4337 | sk->sk_err = err; | ||
4338 | |||
4339 | diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c | ||
4340 | index c95cd93..d8d2bc6 100644 | ||
4341 | --- a/net/ipv4/arp.c | ||
4342 | +++ b/net/ipv4/arp.c | ||
4343 | @@ -619,13 +619,13 @@ struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip, | ||
4344 | #endif | ||
4345 | #endif | ||
4346 | |||
4347 | -#ifdef CONFIG_FDDI | ||
4348 | +#if defined(CONFIG_FDDI) || defined(CONFIG_FDDI_MODULE) | ||
4349 | case ARPHRD_FDDI: | ||
4350 | arp->ar_hrd = htons(ARPHRD_ETHER); | ||
4351 | arp->ar_pro = htons(ETH_P_IP); | ||
4352 | break; | ||
4353 | #endif | ||
4354 | -#ifdef CONFIG_TR | ||
4355 | +#if defined(CONFIG_TR) || defined(CONFIG_TR_MODULE) | ||
4356 | case ARPHRD_IEEE802_TR: | ||
4357 | arp->ar_hrd = htons(ARPHRD_IEEE802); | ||
4358 | arp->ar_pro = htons(ETH_P_IP); | ||
4359 | @@ -1005,7 +1005,7 @@ static int arp_req_set(struct net *net, struct arpreq *r, | ||
4360 | return -EINVAL; | ||
4361 | } | ||
4362 | switch (dev->type) { | ||
4363 | -#ifdef CONFIG_FDDI | ||
4364 | +#if defined(CONFIG_FDDI) || defined(CONFIG_FDDI_MODULE) | ||
4365 | case ARPHRD_FDDI: | ||
4366 | /* | ||
4367 | * According to RFC 1390, FDDI devices should accept ARP | ||
4368 | diff --git a/net/ipv4/syncookies.c b/net/ipv4/syncookies.c | ||
4369 | index 66fd80e..214a2f6 100644 | ||
4370 | --- a/net/ipv4/syncookies.c | ||
4371 | +++ b/net/ipv4/syncookies.c | ||
4372 | @@ -347,7 +347,7 @@ struct sock *cookie_v4_check(struct sock *sk, struct sk_buff *skb, | ||
4373 | { .sport = th->dest, | ||
4374 | .dport = th->source } } }; | ||
4375 | security_req_classify_flow(req, &fl); | ||
4376 | - if (ip_route_output_key(&init_net, &rt, &fl)) { | ||
4377 | + if (ip_route_output_key(sock_net(sk), &rt, &fl)) { | ||
4378 | reqsk_free(req); | ||
4379 | goto out; | ||
4380 | } | ||
4381 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
4382 | index dc26654..1d04fa0 100644 | ||
4383 | --- a/net/ipv4/tcp_output.c | ||
4384 | +++ b/net/ipv4/tcp_output.c | ||
4385 | @@ -659,7 +659,6 @@ static unsigned tcp_synack_options(struct sock *sk, | ||
4386 | u8 cookie_plus = (xvp != NULL && !xvp->cookie_out_never) ? | ||
4387 | xvp->cookie_plus : | ||
4388 | 0; | ||
4389 | - bool doing_ts = ireq->tstamp_ok; | ||
4390 | |||
4391 | #ifdef CONFIG_TCP_MD5SIG | ||
4392 | *md5 = tcp_rsk(req)->af_specific->md5_lookup(sk, req); | ||
4393 | @@ -672,7 +671,7 @@ static unsigned tcp_synack_options(struct sock *sk, | ||
4394 | * rather than TS in order to fit in better with old, | ||
4395 | * buggy kernels, but that was deemed to be unnecessary. | ||
4396 | */ | ||
4397 | - doing_ts &= !ireq->sack_ok; | ||
4398 | + ireq->tstamp_ok &= !ireq->sack_ok; | ||
4399 | } | ||
4400 | #else | ||
4401 | *md5 = NULL; | ||
4402 | @@ -687,7 +686,7 @@ static unsigned tcp_synack_options(struct sock *sk, | ||
4403 | opts->options |= OPTION_WSCALE; | ||
4404 | remaining -= TCPOLEN_WSCALE_ALIGNED; | ||
4405 | } | ||
4406 | - if (likely(doing_ts)) { | ||
4407 | + if (likely(ireq->tstamp_ok)) { | ||
4408 | opts->options |= OPTION_TS; | ||
4409 | opts->tsval = TCP_SKB_CB(skb)->when; | ||
4410 | opts->tsecr = req->ts_recent; | ||
4411 | @@ -695,7 +694,7 @@ static unsigned tcp_synack_options(struct sock *sk, | ||
4412 | } | ||
4413 | if (likely(ireq->sack_ok)) { | ||
4414 | opts->options |= OPTION_SACK_ADVERTISE; | ||
4415 | - if (unlikely(!doing_ts)) | ||
4416 | + if (unlikely(!ireq->tstamp_ok)) | ||
4417 | remaining -= TCPOLEN_SACKPERM_ALIGNED; | ||
4418 | } | ||
4419 | |||
4420 | @@ -703,7 +702,7 @@ static unsigned tcp_synack_options(struct sock *sk, | ||
4421 | * If the <SYN> options fit, the same options should fit now! | ||
4422 | */ | ||
4423 | if (*md5 == NULL && | ||
4424 | - doing_ts && | ||
4425 | + ireq->tstamp_ok && | ||
4426 | cookie_plus > TCPOLEN_COOKIE_BASE) { | ||
4427 | int need = cookie_plus; /* has TCPOLEN_COOKIE_BASE */ | ||
4428 | |||
4429 | @@ -2204,6 +2203,9 @@ void tcp_xmit_retransmit_queue(struct sock *sk) | ||
4430 | int mib_idx; | ||
4431 | int fwd_rexmitting = 0; | ||
4432 | |||
4433 | + if (!tp->packets_out) | ||
4434 | + return; | ||
4435 | + | ||
4436 | if (!tp->lost_out) | ||
4437 | tp->retransmit_high = tp->snd_una; | ||
4438 | |||
4439 | diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c | ||
4440 | index 12e69d3..3c11913 100644 | ||
4441 | --- a/net/ipv6/af_inet6.c | ||
4442 | +++ b/net/ipv6/af_inet6.c | ||
4443 | @@ -199,7 +199,7 @@ lookup_protocol: | ||
4444 | |||
4445 | inet_sk(sk)->pinet6 = np = inet6_sk_generic(sk); | ||
4446 | np->hop_limit = -1; | ||
4447 | - np->mcast_hops = -1; | ||
4448 | + np->mcast_hops = IPV6_DEFAULT_MCASTHOPS; | ||
4449 | np->mc_loop = 1; | ||
4450 | np->pmtudisc = IPV6_PMTUDISC_WANT; | ||
4451 | np->ipv6only = net->ipv6.sysctl.bindv6only; | ||
4452 | diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c | ||
4453 | index c458527..d6c3652 100644 | ||
4454 | --- a/net/ipv6/ndisc.c | ||
4455 | +++ b/net/ipv6/ndisc.c | ||
4456 | @@ -585,6 +585,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, | ||
4457 | src_addr = solicited_addr; | ||
4458 | if (ifp->flags & IFA_F_OPTIMISTIC) | ||
4459 | override = 0; | ||
4460 | + inc_opt |= ifp->idev->cnf.force_tllao; | ||
4461 | in6_ifa_put(ifp); | ||
4462 | } else { | ||
4463 | if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr, | ||
4464 | @@ -598,7 +599,6 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, | ||
4465 | icmp6h.icmp6_solicited = solicited; | ||
4466 | icmp6h.icmp6_override = override; | ||
4467 | |||
4468 | - inc_opt |= ifp->idev->cnf.force_tllao; | ||
4469 | __ndisc_send(dev, neigh, daddr, src_addr, | ||
4470 | &icmp6h, solicited_addr, | ||
4471 | inc_opt ? ND_OPT_TARGET_LL_ADDR : 0); | ||
4472 | diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c | ||
4473 | index 8311ca3..35ae554 100644 | ||
4474 | --- a/net/ipv6/netfilter/ip6t_REJECT.c | ||
4475 | +++ b/net/ipv6/netfilter/ip6t_REJECT.c | ||
4476 | @@ -95,9 +95,11 @@ static void send_reset(struct net *net, struct sk_buff *oldskb) | ||
4477 | fl.fl_ip_dport = otcph.source; | ||
4478 | security_skb_classify_flow(oldskb, &fl); | ||
4479 | dst = ip6_route_output(net, NULL, &fl); | ||
4480 | - if (dst == NULL) | ||
4481 | + if (dst == NULL || dst->error) { | ||
4482 | + dst_release(dst); | ||
4483 | return; | ||
4484 | - if (dst->error || xfrm_lookup(net, &dst, &fl, NULL, 0)) | ||
4485 | + } | ||
4486 | + if (xfrm_lookup(net, &dst, &fl, NULL, 0)) | ||
4487 | return; | ||
4488 | |||
4489 | hh_len = (dst->dev->hard_header_len + 15)&~15; | ||
4490 | diff --git a/net/llc/llc_sap.c b/net/llc/llc_sap.c | ||
4491 | index 008de1f..2facbe3 100644 | ||
4492 | --- a/net/llc/llc_sap.c | ||
4493 | +++ b/net/llc/llc_sap.c | ||
4494 | @@ -30,7 +30,7 @@ static int llc_mac_header_len(unsigned short devtype) | ||
4495 | case ARPHRD_ETHER: | ||
4496 | case ARPHRD_LOOPBACK: | ||
4497 | return sizeof(struct ethhdr); | ||
4498 | -#ifdef CONFIG_TR | ||
4499 | +#if defined(CONFIG_TR) || defined(CONFIG_TR_MODULE) | ||
4500 | case ARPHRD_IEEE802_TR: | ||
4501 | return sizeof(struct trh_hdr); | ||
4502 | #endif | ||
4503 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c | ||
4504 | index 1a209ac..ecc1e4f 100644 | ||
4505 | --- a/net/mac80211/mlme.c | ||
4506 | +++ b/net/mac80211/mlme.c | ||
4507 | @@ -270,12 +270,6 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata, | ||
4508 | if (wk->bss->wmm_used) | ||
4509 | wmm = 1; | ||
4510 | |||
4511 | - /* get all rates supported by the device and the AP as | ||
4512 | - * some APs don't like getting a superset of their rates | ||
4513 | - * in the association request (e.g. D-Link DAP 1353 in | ||
4514 | - * b-only mode) */ | ||
4515 | - rates_len = ieee80211_compatible_rates(wk->bss, sband, &rates); | ||
4516 | - | ||
4517 | if ((wk->bss->cbss.capability & WLAN_CAPABILITY_SPECTRUM_MGMT) && | ||
4518 | (local->hw.flags & IEEE80211_HW_SPECTRUM_MGMT)) | ||
4519 | capab |= WLAN_CAPABILITY_SPECTRUM_MGMT; | ||
4520 | @@ -310,6 +304,17 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata, | ||
4521 | *pos++ = wk->ssid_len; | ||
4522 | memcpy(pos, wk->ssid, wk->ssid_len); | ||
4523 | |||
4524 | + if (wk->bss->supp_rates_len) { | ||
4525 | + /* get all rates supported by the device and the AP as | ||
4526 | + * some APs don't like getting a superset of their rates | ||
4527 | + * in the association request (e.g. D-Link DAP 1353 in | ||
4528 | + * b-only mode) */ | ||
4529 | + rates_len = ieee80211_compatible_rates(wk->bss, sband, &rates); | ||
4530 | + } else { | ||
4531 | + rates = ~0; | ||
4532 | + rates_len = sband->n_bitrates; | ||
4533 | + } | ||
4534 | + | ||
4535 | /* add all rates which were marked to be used above */ | ||
4536 | supp_rates_len = rates_len; | ||
4537 | if (supp_rates_len > 8) | ||
4538 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c | ||
4539 | index 48d8fdf..701e63a 100644 | ||
4540 | --- a/net/mac80211/rx.c | ||
4541 | +++ b/net/mac80211/rx.c | ||
4542 | @@ -2023,6 +2023,11 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx) | ||
4543 | return RX_CONTINUE; | ||
4544 | } | ||
4545 | break; | ||
4546 | + case WLAN_CATEGORY_MESH_PLINK: | ||
4547 | + case WLAN_CATEGORY_MESH_PATH_SEL: | ||
4548 | + if (ieee80211_vif_is_mesh(&sdata->vif)) | ||
4549 | + return ieee80211_mesh_rx_mgmt(sdata, rx->skb); | ||
4550 | + break; | ||
4551 | default: | ||
4552 | /* do not process rejected action frames */ | ||
4553 | if (mgmt->u.action.category & 0x80) | ||
4554 | diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c | ||
4555 | index bc17cf7..697dc54 100644 | ||
4556 | --- a/net/mac80211/scan.c | ||
4557 | +++ b/net/mac80211/scan.c | ||
4558 | @@ -60,7 +60,7 @@ ieee80211_bss_info_update(struct ieee80211_local *local, | ||
4559 | bool beacon) | ||
4560 | { | ||
4561 | struct ieee80211_bss *bss; | ||
4562 | - int clen; | ||
4563 | + int clen, srlen; | ||
4564 | s32 signal = 0; | ||
4565 | |||
4566 | if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM) | ||
4567 | @@ -92,23 +92,24 @@ ieee80211_bss_info_update(struct ieee80211_local *local, | ||
4568 | if (bss->dtim_period == 0) | ||
4569 | bss->dtim_period = 1; | ||
4570 | |||
4571 | - bss->supp_rates_len = 0; | ||
4572 | + /* replace old supported rates if we get new values */ | ||
4573 | + srlen = 0; | ||
4574 | if (elems->supp_rates) { | ||
4575 | - clen = IEEE80211_MAX_SUPP_RATES - bss->supp_rates_len; | ||
4576 | + clen = IEEE80211_MAX_SUPP_RATES; | ||
4577 | if (clen > elems->supp_rates_len) | ||
4578 | clen = elems->supp_rates_len; | ||
4579 | - memcpy(&bss->supp_rates[bss->supp_rates_len], elems->supp_rates, | ||
4580 | - clen); | ||
4581 | - bss->supp_rates_len += clen; | ||
4582 | + memcpy(bss->supp_rates, elems->supp_rates, clen); | ||
4583 | + srlen += clen; | ||
4584 | } | ||
4585 | if (elems->ext_supp_rates) { | ||
4586 | - clen = IEEE80211_MAX_SUPP_RATES - bss->supp_rates_len; | ||
4587 | + clen = IEEE80211_MAX_SUPP_RATES - srlen; | ||
4588 | if (clen > elems->ext_supp_rates_len) | ||
4589 | clen = elems->ext_supp_rates_len; | ||
4590 | - memcpy(&bss->supp_rates[bss->supp_rates_len], | ||
4591 | - elems->ext_supp_rates, clen); | ||
4592 | - bss->supp_rates_len += clen; | ||
4593 | + memcpy(bss->supp_rates + srlen, elems->ext_supp_rates, clen); | ||
4594 | + srlen += clen; | ||
4595 | } | ||
4596 | + if (srlen) | ||
4597 | + bss->supp_rates_len = srlen; | ||
4598 | |||
4599 | bss->wmm_used = elems->wmm_param || elems->wmm_info; | ||
4600 | |||
4601 | diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c | ||
4602 | index 27c30cf..95682e5 100644 | ||
4603 | --- a/net/netfilter/ipvs/ip_vs_conn.c | ||
4604 | +++ b/net/netfilter/ipvs/ip_vs_conn.c | ||
4605 | @@ -146,6 +146,7 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp) | ||
4606 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); | ||
4607 | |||
4608 | ct_write_lock(hash); | ||
4609 | + spin_lock(&cp->lock); | ||
4610 | |||
4611 | if (!(cp->flags & IP_VS_CONN_F_HASHED)) { | ||
4612 | list_add(&cp->c_list, &ip_vs_conn_tab[hash]); | ||
4613 | @@ -158,6 +159,7 @@ static inline int ip_vs_conn_hash(struct ip_vs_conn *cp) | ||
4614 | ret = 0; | ||
4615 | } | ||
4616 | |||
4617 | + spin_unlock(&cp->lock); | ||
4618 | ct_write_unlock(hash); | ||
4619 | |||
4620 | return ret; | ||
4621 | @@ -177,6 +179,7 @@ static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp) | ||
4622 | hash = ip_vs_conn_hashkey(cp->af, cp->protocol, &cp->caddr, cp->cport); | ||
4623 | |||
4624 | ct_write_lock(hash); | ||
4625 | + spin_lock(&cp->lock); | ||
4626 | |||
4627 | if (cp->flags & IP_VS_CONN_F_HASHED) { | ||
4628 | list_del(&cp->c_list); | ||
4629 | @@ -186,6 +189,7 @@ static inline int ip_vs_conn_unhash(struct ip_vs_conn *cp) | ||
4630 | } else | ||
4631 | ret = 0; | ||
4632 | |||
4633 | + spin_unlock(&cp->lock); | ||
4634 | ct_write_unlock(hash); | ||
4635 | |||
4636 | return ret; | ||
4637 | diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c | ||
4638 | index 4df801d..2334279 100644 | ||
4639 | --- a/net/sunrpc/xprtsock.c | ||
4640 | +++ b/net/sunrpc/xprtsock.c | ||
4641 | @@ -224,7 +224,8 @@ struct sock_xprt { | ||
4642 | * State of TCP reply receive | ||
4643 | */ | ||
4644 | __be32 tcp_fraghdr, | ||
4645 | - tcp_xid; | ||
4646 | + tcp_xid, | ||
4647 | + tcp_calldir; | ||
4648 | |||
4649 | u32 tcp_offset, | ||
4650 | tcp_reclen; | ||
4651 | @@ -947,7 +948,7 @@ static inline void xs_tcp_read_calldir(struct sock_xprt *transport, | ||
4652 | { | ||
4653 | size_t len, used; | ||
4654 | u32 offset; | ||
4655 | - __be32 calldir; | ||
4656 | + char *p; | ||
4657 | |||
4658 | /* | ||
4659 | * We want transport->tcp_offset to be 8 at the end of this routine | ||
4660 | @@ -956,26 +957,33 @@ static inline void xs_tcp_read_calldir(struct sock_xprt *transport, | ||
4661 | * transport->tcp_offset is 4 (after having already read the xid). | ||
4662 | */ | ||
4663 | offset = transport->tcp_offset - sizeof(transport->tcp_xid); | ||
4664 | - len = sizeof(calldir) - offset; | ||
4665 | + len = sizeof(transport->tcp_calldir) - offset; | ||
4666 | dprintk("RPC: reading CALL/REPLY flag (%Zu bytes)\n", len); | ||
4667 | - used = xdr_skb_read_bits(desc, &calldir, len); | ||
4668 | + p = ((char *) &transport->tcp_calldir) + offset; | ||
4669 | + used = xdr_skb_read_bits(desc, p, len); | ||
4670 | transport->tcp_offset += used; | ||
4671 | if (used != len) | ||
4672 | return; | ||
4673 | transport->tcp_flags &= ~TCP_RCV_READ_CALLDIR; | ||
4674 | - transport->tcp_flags |= TCP_RCV_COPY_CALLDIR; | ||
4675 | - transport->tcp_flags |= TCP_RCV_COPY_DATA; | ||
4676 | /* | ||
4677 | * We don't yet have the XDR buffer, so we will write the calldir | ||
4678 | * out after we get the buffer from the 'struct rpc_rqst' | ||
4679 | */ | ||
4680 | - if (ntohl(calldir) == RPC_REPLY) | ||
4681 | + switch (ntohl(transport->tcp_calldir)) { | ||
4682 | + case RPC_REPLY: | ||
4683 | + transport->tcp_flags |= TCP_RCV_COPY_CALLDIR; | ||
4684 | + transport->tcp_flags |= TCP_RCV_COPY_DATA; | ||
4685 | transport->tcp_flags |= TCP_RPC_REPLY; | ||
4686 | - else | ||
4687 | + break; | ||
4688 | + case RPC_CALL: | ||
4689 | + transport->tcp_flags |= TCP_RCV_COPY_CALLDIR; | ||
4690 | + transport->tcp_flags |= TCP_RCV_COPY_DATA; | ||
4691 | transport->tcp_flags &= ~TCP_RPC_REPLY; | ||
4692 | - dprintk("RPC: reading %s CALL/REPLY flag %08x\n", | ||
4693 | - (transport->tcp_flags & TCP_RPC_REPLY) ? | ||
4694 | - "reply for" : "request with", calldir); | ||
4695 | + break; | ||
4696 | + default: | ||
4697 | + dprintk("RPC: invalid request message type\n"); | ||
4698 | + xprt_force_disconnect(&transport->xprt); | ||
4699 | + } | ||
4700 | xs_tcp_check_fraghdr(transport); | ||
4701 | } | ||
4702 | |||
4703 | @@ -995,12 +1003,10 @@ static inline void xs_tcp_read_common(struct rpc_xprt *xprt, | ||
4704 | /* | ||
4705 | * Save the RPC direction in the XDR buffer | ||
4706 | */ | ||
4707 | - __be32 calldir = transport->tcp_flags & TCP_RPC_REPLY ? | ||
4708 | - htonl(RPC_REPLY) : 0; | ||
4709 | - | ||
4710 | memcpy(rcvbuf->head[0].iov_base + transport->tcp_copied, | ||
4711 | - &calldir, sizeof(calldir)); | ||
4712 | - transport->tcp_copied += sizeof(calldir); | ||
4713 | + &transport->tcp_calldir, | ||
4714 | + sizeof(transport->tcp_calldir)); | ||
4715 | + transport->tcp_copied += sizeof(transport->tcp_calldir); | ||
4716 | transport->tcp_flags &= ~TCP_RCV_COPY_CALLDIR; | ||
4717 | } | ||
4718 | |||
4719 | diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c | ||
4720 | index 2092361..17c95a3 100644 | ||
4721 | --- a/scripts/mod/modpost.c | ||
4722 | +++ b/scripts/mod/modpost.c | ||
4723 | @@ -1318,7 +1318,7 @@ static unsigned int *reloc_location(struct elf_info *elf, | ||
4724 | int section = sechdr->sh_info; | ||
4725 | |||
4726 | return (void *)elf->hdr + sechdrs[section].sh_offset + | ||
4727 | - (r->r_offset - sechdrs[section].sh_addr); | ||
4728 | + r->r_offset - sechdrs[section].sh_addr; | ||
4729 | } | ||
4730 | |||
4731 | static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r) | ||
4732 | diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c | ||
4733 | index 1305f7c..641d7f0 100644 | ||
4734 | --- a/sound/pci/echoaudio/echoaudio.c | ||
4735 | +++ b/sound/pci/echoaudio/echoaudio.c | ||
4736 | @@ -1821,7 +1821,9 @@ static irqreturn_t snd_echo_interrupt(int irq, void *dev_id) | ||
4737 | /* The hardware doesn't tell us which substream caused the irq, | ||
4738 | thus we have to check all running substreams. */ | ||
4739 | for (ss = 0; ss < DSP_MAXPIPES; ss++) { | ||
4740 | - if ((substream = chip->substream[ss])) { | ||
4741 | + substream = chip->substream[ss]; | ||
4742 | + if (substream && ((struct audiopipe *)substream->runtime-> | ||
4743 | + private_data)->state == PIPE_STATE_STARTED) { | ||
4744 | period = pcm_pointer(substream) / | ||
4745 | substream->runtime->period_size; | ||
4746 | if (period != chip->last_period[ss]) { | ||
4747 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
4748 | index 187a467..dea03d9 100644 | ||
4749 | --- a/sound/pci/hda/patch_realtek.c | ||
4750 | +++ b/sound/pci/hda/patch_realtek.c | ||
4751 | @@ -9122,6 +9122,7 @@ static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = { | ||
4752 | SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24), | ||
4753 | SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91), | ||
4754 | SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5), | ||
4755 | + SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5), | ||
4756 | /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2, | ||
4757 | * so apparently no perfect solution yet | ||
4758 | */ | ||
4759 | diff --git a/sound/soc/codecs/wm8776.c b/sound/soc/codecs/wm8776.c | ||
4760 | index ab2c0da..ae54f7e 100644 | ||
4761 | --- a/sound/soc/codecs/wm8776.c | ||
4762 | +++ b/sound/soc/codecs/wm8776.c | ||
4763 | @@ -93,7 +93,6 @@ SOC_DAPM_SINGLE("Bypass Switch", WM8776_OUTMUX, 2, 1, 0), | ||
4764 | |||
4765 | static const struct snd_soc_dapm_widget wm8776_dapm_widgets[] = { | ||
4766 | SND_SOC_DAPM_INPUT("AUX"), | ||
4767 | -SND_SOC_DAPM_INPUT("AUX"), | ||
4768 | |||
4769 | SND_SOC_DAPM_INPUT("AIN1"), | ||
4770 | SND_SOC_DAPM_INPUT("AIN2"), | ||
4771 | diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h | ||
4772 | index ad4626d..1b7a389 100644 | ||
4773 | --- a/tools/perf/util/callchain.h | ||
4774 | +++ b/tools/perf/util/callchain.h | ||
4775 | @@ -48,6 +48,9 @@ static inline void callchain_init(struct callchain_node *node) | ||
4776 | INIT_LIST_HEAD(&node->brothers); | ||
4777 | INIT_LIST_HEAD(&node->children); | ||
4778 | INIT_LIST_HEAD(&node->val); | ||
4779 | + | ||
4780 | + node->parent = NULL; | ||
4781 | + node->hit = 0; | ||
4782 | } | ||
4783 | |||
4784 | static inline u64 cumul_hits(struct callchain_node *node) | ||
4785 | diff --git a/virt/kvm/ioapic.c b/virt/kvm/ioapic.c | ||
4786 | index 38a2d20..fc4a7e3 100644 | ||
4787 | --- a/virt/kvm/ioapic.c | ||
4788 | +++ b/virt/kvm/ioapic.c | ||
4789 | @@ -177,12 +177,13 @@ static int ioapic_deliver(struct kvm_ioapic *ioapic, int irq) | ||
4790 | |||
4791 | int kvm_ioapic_set_irq(struct kvm_ioapic *ioapic, int irq, int level) | ||
4792 | { | ||
4793 | - u32 old_irr = ioapic->irr; | ||
4794 | + u32 old_irr; | ||
4795 | u32 mask = 1 << irq; | ||
4796 | union kvm_ioapic_redirect_entry entry; | ||
4797 | int ret = 1; | ||
4798 | |||
4799 | mutex_lock(&ioapic->lock); | ||
4800 | + old_irr = ioapic->irr; | ||
4801 | if (irq >= 0 && irq < IOAPIC_NUM_PINS) { | ||
4802 | entry = ioapic->redirtbl[irq]; | ||
4803 | level ^= entry.fields.polarity; |