Annotation of /trunk/kernel-magellan/patches-3.7/0102-3.7.3-all-fixes.patch
Parent Directory | Revision Log
Revision 2049 -
(hide annotations)
(download)
Mon Jan 28 09:30:34 2013 UTC (11 years, 9 months ago) by niro
File size: 329182 byte(s)
Mon Jan 28 09:30:34 2013 UTC (11 years, 9 months ago) by niro
File size: 329182 byte(s)
-fixed patch
1 | niro | 2039 | diff --git a/Documentation/power/runtime_pm.txt b/Documentation/power/runtime_pm.txt |
2 | index 4abe83e..03591a7 100644 | ||
3 | --- a/Documentation/power/runtime_pm.txt | ||
4 | +++ b/Documentation/power/runtime_pm.txt | ||
5 | @@ -642,12 +642,13 @@ out the following operations: | ||
6 | * During system suspend it calls pm_runtime_get_noresume() and | ||
7 | pm_runtime_barrier() for every device right before executing the | ||
8 | subsystem-level .suspend() callback for it. In addition to that it calls | ||
9 | - pm_runtime_disable() for every device right after executing the | ||
10 | - subsystem-level .suspend() callback for it. | ||
11 | + __pm_runtime_disable() with 'false' as the second argument for every device | ||
12 | + right before executing the subsystem-level .suspend_late() callback for it. | ||
13 | |||
14 | * During system resume it calls pm_runtime_enable() and pm_runtime_put_sync() | ||
15 | - for every device right before and right after executing the subsystem-level | ||
16 | - .resume() callback for it, respectively. | ||
17 | + for every device right after executing the subsystem-level .resume_early() | ||
18 | + callback and right after executing the subsystem-level .resume() callback | ||
19 | + for it, respectively. | ||
20 | |||
21 | 7. Generic subsystem callbacks | ||
22 | |||
23 | niro | 2049 | diff --git a/Makefile b/Makefile |
24 | index 23807aa..51a9bda 100644 | ||
25 | --- a/Makefile | ||
26 | +++ b/Makefile | ||
27 | niro | 2039 | @@ -1021,11 +1021,14 @@ clean: rm-dirs := $(CLEAN_DIRS) |
28 | clean: rm-files := $(CLEAN_FILES) | ||
29 | clean-dirs := $(addprefix _clean_, . $(vmlinux-alldirs) Documentation samples) | ||
30 | |||
31 | -PHONY += $(clean-dirs) clean archclean | ||
32 | +PHONY += $(clean-dirs) clean archclean vmlinuxclean | ||
33 | $(clean-dirs): | ||
34 | $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@) | ||
35 | |||
36 | -clean: archclean | ||
37 | +vmlinuxclean: | ||
38 | + $(Q)$(CONFIG_SHELL) $(srctree)/scripts/link-vmlinux.sh clean | ||
39 | + | ||
40 | +clean: archclean vmlinuxclean | ||
41 | |||
42 | # mrproper - Delete all generated files, including .config | ||
43 | # | ||
44 | @@ -1252,7 +1255,6 @@ scripts: ; | ||
45 | endif # KBUILD_EXTMOD | ||
46 | |||
47 | clean: $(clean-dirs) | ||
48 | - $(Q)$(CONFIG_SHELL) $(srctree)/scripts/link-vmlinux.sh clean | ||
49 | $(call cmd,rmdirs) | ||
50 | $(call cmd,rmfiles) | ||
51 | @find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \ | ||
52 | diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c | ||
53 | index 96cd369..09e1790 100644 | ||
54 | --- a/arch/arm/mach-omap2/board-3430sdp.c | ||
55 | +++ b/arch/arm/mach-omap2/board-3430sdp.c | ||
56 | @@ -157,6 +157,7 @@ static struct omap_dss_device sdp3430_lcd_device = { | ||
57 | |||
58 | static struct tfp410_platform_data dvi_panel = { | ||
59 | .power_down_gpio = -1, | ||
60 | + .i2c_bus_num = -1, | ||
61 | }; | ||
62 | |||
63 | static struct omap_dss_device sdp3430_dvi_device = { | ||
64 | diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c | ||
65 | index e162897..f2a920a 100644 | ||
66 | --- a/arch/arm/mach-omap2/board-am3517evm.c | ||
67 | +++ b/arch/arm/mach-omap2/board-am3517evm.c | ||
68 | @@ -208,6 +208,7 @@ static struct omap_dss_device am3517_evm_tv_device = { | ||
69 | |||
70 | static struct tfp410_platform_data dvi_panel = { | ||
71 | .power_down_gpio = -1, | ||
72 | + .i2c_bus_num = -1, | ||
73 | }; | ||
74 | |||
75 | static struct omap_dss_device am3517_evm_dvi_device = { | ||
76 | diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c | ||
77 | index 376d26e..7ed0270 100644 | ||
78 | --- a/arch/arm/mach-omap2/board-cm-t35.c | ||
79 | +++ b/arch/arm/mach-omap2/board-cm-t35.c | ||
80 | @@ -243,6 +243,7 @@ static struct omap_dss_device cm_t35_lcd_device = { | ||
81 | |||
82 | static struct tfp410_platform_data dvi_panel = { | ||
83 | .power_down_gpio = CM_T35_DVI_EN_GPIO, | ||
84 | + .i2c_bus_num = -1, | ||
85 | }; | ||
86 | |||
87 | static struct omap_dss_device cm_t35_dvi_device = { | ||
88 | diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c | ||
89 | index 1fd161e..6f04f0f 100644 | ||
90 | --- a/arch/arm/mach-omap2/board-devkit8000.c | ||
91 | +++ b/arch/arm/mach-omap2/board-devkit8000.c | ||
92 | @@ -139,6 +139,7 @@ static struct omap_dss_device devkit8000_lcd_device = { | ||
93 | |||
94 | static struct tfp410_platform_data dvi_panel = { | ||
95 | .power_down_gpio = -1, | ||
96 | + .i2c_bus_num = 1, | ||
97 | }; | ||
98 | |||
99 | static struct omap_dss_device devkit8000_dvi_device = { | ||
100 | diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c | ||
101 | index b9b776b..5631eb9 100644 | ||
102 | --- a/arch/arm/mach-omap2/board-omap3evm.c | ||
103 | +++ b/arch/arm/mach-omap2/board-omap3evm.c | ||
104 | @@ -236,6 +236,7 @@ static struct omap_dss_device omap3_evm_tv_device = { | ||
105 | |||
106 | static struct tfp410_platform_data dvi_panel = { | ||
107 | .power_down_gpio = OMAP3EVM_DVI_PANEL_EN_GPIO, | ||
108 | + .i2c_bus_num = -1, | ||
109 | }; | ||
110 | |||
111 | static struct omap_dss_device omap3_evm_dvi_device = { | ||
112 | diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c | ||
113 | index 731235e..797be22 100644 | ||
114 | --- a/arch/arm/mach-omap2/board-omap3stalker.c | ||
115 | +++ b/arch/arm/mach-omap2/board-omap3stalker.c | ||
116 | @@ -119,6 +119,7 @@ static struct omap_dss_device omap3_stalker_tv_device = { | ||
117 | |||
118 | static struct tfp410_platform_data dvi_panel = { | ||
119 | .power_down_gpio = DSS_ENABLE_GPIO, | ||
120 | + .i2c_bus_num = -1, | ||
121 | }; | ||
122 | |||
123 | static struct omap_dss_device omap3_stalker_dvi_device = { | ||
124 | diff --git a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | ||
125 | index a611ad3..b6132aa 100644 | ||
126 | --- a/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | ||
127 | +++ b/arch/arm/mach-pxa/include/mach/mfp-pxa27x.h | ||
128 | @@ -463,6 +463,9 @@ | ||
129 | GPIO76_LCD_PCLK, \ | ||
130 | GPIO77_LCD_BIAS | ||
131 | |||
132 | +/* these enable a work-around for a hw bug in pxa27x during ac97 warm reset */ | ||
133 | +#define GPIO113_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO113, AF0, DEFAULT) | ||
134 | +#define GPIO95_AC97_nRESET_GPIO_HIGH MFP_CFG_OUT(GPIO95, AF0, DEFAULT) | ||
135 | |||
136 | extern int keypad_set_wake(unsigned int on); | ||
137 | #endif /* __ASM_ARCH_MFP_PXA27X_H */ | ||
138 | diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c | ||
139 | index 8047ee0..616cb87 100644 | ||
140 | --- a/arch/arm/mach-pxa/pxa27x.c | ||
141 | +++ b/arch/arm/mach-pxa/pxa27x.c | ||
142 | @@ -47,9 +47,9 @@ void pxa27x_clear_otgph(void) | ||
143 | EXPORT_SYMBOL(pxa27x_clear_otgph); | ||
144 | |||
145 | static unsigned long ac97_reset_config[] = { | ||
146 | - GPIO113_GPIO, | ||
147 | + GPIO113_AC97_nRESET_GPIO_HIGH, | ||
148 | GPIO113_AC97_nRESET, | ||
149 | - GPIO95_GPIO, | ||
150 | + GPIO95_AC97_nRESET_GPIO_HIGH, | ||
151 | GPIO95_AC97_nRESET, | ||
152 | }; | ||
153 | |||
154 | diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c | ||
155 | index e9a5fd7..69b17a9 100644 | ||
156 | --- a/arch/mips/kernel/process.c | ||
157 | +++ b/arch/mips/kernel/process.c | ||
158 | @@ -72,9 +72,7 @@ void __noreturn cpu_idle(void) | ||
159 | } | ||
160 | } | ||
161 | #ifdef CONFIG_HOTPLUG_CPU | ||
162 | - if (!cpu_online(cpu) && !cpu_isset(cpu, cpu_callin_map) && | ||
163 | - (system_state == SYSTEM_RUNNING || | ||
164 | - system_state == SYSTEM_BOOTING)) | ||
165 | + if (!cpu_online(cpu) && !cpu_isset(cpu, cpu_callin_map)) | ||
166 | play_dead(); | ||
167 | #endif | ||
168 | rcu_idle_exit(); | ||
169 | diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c | ||
170 | index 2833dcb..e7c383b 100644 | ||
171 | --- a/arch/mips/mm/tlbex.c | ||
172 | +++ b/arch/mips/mm/tlbex.c | ||
173 | @@ -952,13 +952,6 @@ build_get_pgde32(u32 **p, unsigned int tmp, unsigned int ptr) | ||
174 | #endif | ||
175 | uasm_i_mfc0(p, tmp, C0_BADVADDR); /* get faulting address */ | ||
176 | uasm_i_lw(p, ptr, uasm_rel_lo(pgdc), ptr); | ||
177 | - | ||
178 | - if (cpu_has_mips_r2) { | ||
179 | - uasm_i_ext(p, tmp, tmp, PGDIR_SHIFT, (32 - PGDIR_SHIFT)); | ||
180 | - uasm_i_ins(p, ptr, tmp, PGD_T_LOG2, (32 - PGDIR_SHIFT)); | ||
181 | - return; | ||
182 | - } | ||
183 | - | ||
184 | uasm_i_srl(p, tmp, tmp, PGDIR_SHIFT); /* get pgd only bits */ | ||
185 | uasm_i_sll(p, tmp, tmp, PGD_T_LOG2); | ||
186 | uasm_i_addu(p, ptr, ptr, tmp); /* add in pgd offset */ | ||
187 | @@ -994,15 +987,6 @@ static void __cpuinit build_adjust_context(u32 **p, unsigned int ctx) | ||
188 | |||
189 | static void __cpuinit build_get_ptep(u32 **p, unsigned int tmp, unsigned int ptr) | ||
190 | { | ||
191 | - if (cpu_has_mips_r2) { | ||
192 | - /* PTE ptr offset is obtained from BadVAddr */ | ||
193 | - UASM_i_MFC0(p, tmp, C0_BADVADDR); | ||
194 | - UASM_i_LW(p, ptr, 0, ptr); | ||
195 | - uasm_i_ext(p, tmp, tmp, PAGE_SHIFT+1, PGDIR_SHIFT-PAGE_SHIFT-1); | ||
196 | - uasm_i_ins(p, ptr, tmp, PTE_T_LOG2+1, PGDIR_SHIFT-PAGE_SHIFT-1); | ||
197 | - return; | ||
198 | - } | ||
199 | - | ||
200 | /* | ||
201 | * Bug workaround for the Nevada. It seems as if under certain | ||
202 | * circumstances the move from cp0_context might produce a | ||
203 | diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S | ||
204 | index 58bddee..9e07bd0 100644 | ||
205 | --- a/arch/powerpc/kernel/head_64.S | ||
206 | +++ b/arch/powerpc/kernel/head_64.S | ||
207 | @@ -422,7 +422,7 @@ _STATIC(__after_prom_start) | ||
208 | tovirt(r6,r6) /* on booke, we already run at PAGE_OFFSET */ | ||
209 | #endif | ||
210 | |||
211 | -#ifdef CONFIG_CRASH_DUMP | ||
212 | +#ifdef CONFIG_RELOCATABLE | ||
213 | /* | ||
214 | * Check if the kernel has to be running as relocatable kernel based on the | ||
215 | * variable __run_at_load, if it is set the kernel is treated as relocatable | ||
216 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c | ||
217 | index ce4cb77..ba48a88 100644 | ||
218 | --- a/arch/powerpc/kernel/time.c | ||
219 | +++ b/arch/powerpc/kernel/time.c | ||
220 | @@ -774,13 +774,8 @@ void update_vsyscall_old(struct timespec *wall_time, struct timespec *wtm, | ||
221 | |||
222 | void update_vsyscall_tz(void) | ||
223 | { | ||
224 | - /* Make userspace gettimeofday spin until we're done. */ | ||
225 | - ++vdso_data->tb_update_count; | ||
226 | - smp_mb(); | ||
227 | vdso_data->tz_minuteswest = sys_tz.tz_minuteswest; | ||
228 | vdso_data->tz_dsttime = sys_tz.tz_dsttime; | ||
229 | - smp_mb(); | ||
230 | - ++vdso_data->tb_update_count; | ||
231 | } | ||
232 | |||
233 | static void __init clocksource_init(void) | ||
234 | diff --git a/arch/powerpc/kvm/44x_emulate.c b/arch/powerpc/kvm/44x_emulate.c | ||
235 | index c8c6157..c39cd0b 100644 | ||
236 | --- a/arch/powerpc/kvm/44x_emulate.c | ||
237 | +++ b/arch/powerpc/kvm/44x_emulate.c | ||
238 | @@ -76,6 +76,7 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | ||
239 | run->dcr.dcrn = dcrn; | ||
240 | run->dcr.data = 0; | ||
241 | run->dcr.is_write = 0; | ||
242 | + vcpu->arch.dcr_is_write = 0; | ||
243 | vcpu->arch.io_gpr = rt; | ||
244 | vcpu->arch.dcr_needed = 1; | ||
245 | kvmppc_account_exit(vcpu, DCR_EXITS); | ||
246 | @@ -94,6 +95,7 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, | ||
247 | run->dcr.dcrn = dcrn; | ||
248 | run->dcr.data = kvmppc_get_gpr(vcpu, rs); | ||
249 | run->dcr.is_write = 1; | ||
250 | + vcpu->arch.dcr_is_write = 1; | ||
251 | vcpu->arch.dcr_needed = 1; | ||
252 | kvmppc_account_exit(vcpu, DCR_EXITS); | ||
253 | emulated = EMULATE_DO_DCR; | ||
254 | diff --git a/arch/powerpc/kvm/e500_tlb.c b/arch/powerpc/kvm/e500_tlb.c | ||
255 | index ff38b66..ea30a90 100644 | ||
256 | --- a/arch/powerpc/kvm/e500_tlb.c | ||
257 | +++ b/arch/powerpc/kvm/e500_tlb.c | ||
258 | @@ -1332,7 +1332,7 @@ int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500) | ||
259 | if (!vcpu_e500->gtlb_priv[1]) | ||
260 | goto err; | ||
261 | |||
262 | - vcpu_e500->g2h_tlb1_map = kzalloc(sizeof(unsigned int) * | ||
263 | + vcpu_e500->g2h_tlb1_map = kzalloc(sizeof(u64) * | ||
264 | vcpu_e500->gtlb_params[1].entries, | ||
265 | GFP_KERNEL); | ||
266 | if (!vcpu_e500->g2h_tlb1_map) | ||
267 | diff --git a/arch/powerpc/platforms/40x/ppc40x_simple.c b/arch/powerpc/platforms/40x/ppc40x_simple.c | ||
268 | index 969dddc..8f3920e 100644 | ||
269 | --- a/arch/powerpc/platforms/40x/ppc40x_simple.c | ||
270 | +++ b/arch/powerpc/platforms/40x/ppc40x_simple.c | ||
271 | @@ -57,7 +57,8 @@ static const char * const board[] __initconst = { | ||
272 | "amcc,makalu", | ||
273 | "apm,klondike", | ||
274 | "est,hotfoot", | ||
275 | - "plathome,obs600" | ||
276 | + "plathome,obs600", | ||
277 | + NULL | ||
278 | }; | ||
279 | |||
280 | static int __init ppc40x_probe(void) | ||
281 | diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S | ||
282 | index 07d8de3..19b6080 100644 | ||
283 | --- a/arch/s390/kernel/entry64.S | ||
284 | +++ b/arch/s390/kernel/entry64.S | ||
285 | @@ -80,14 +80,21 @@ _TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING) | ||
286 | #endif | ||
287 | .endm | ||
288 | |||
289 | - .macro HANDLE_SIE_INTERCEPT scratch | ||
290 | + .macro HANDLE_SIE_INTERCEPT scratch,pgmcheck | ||
291 | #if defined(CONFIG_KVM) || defined(CONFIG_KVM_MODULE) | ||
292 | tmhh %r8,0x0001 # interrupting from user ? | ||
293 | jnz .+42 | ||
294 | lgr \scratch,%r9 | ||
295 | slg \scratch,BASED(.Lsie_loop) | ||
296 | clg \scratch,BASED(.Lsie_length) | ||
297 | + .if \pgmcheck | ||
298 | + # Some program interrupts are suppressing (e.g. protection). | ||
299 | + # We must also check the instruction after SIE in that case. | ||
300 | + # do_protection_exception will rewind to rewind_pad | ||
301 | + jh .+22 | ||
302 | + .else | ||
303 | jhe .+22 | ||
304 | + .endif | ||
305 | lg %r9,BASED(.Lsie_loop) | ||
306 | SPP BASED(.Lhost_id) # set host id | ||
307 | #endif | ||
308 | @@ -391,7 +398,7 @@ ENTRY(pgm_check_handler) | ||
309 | lg %r12,__LC_THREAD_INFO | ||
310 | larl %r13,system_call | ||
311 | lmg %r8,%r9,__LC_PGM_OLD_PSW | ||
312 | - HANDLE_SIE_INTERCEPT %r14 | ||
313 | + HANDLE_SIE_INTERCEPT %r14,1 | ||
314 | tmhh %r8,0x0001 # test problem state bit | ||
315 | jnz 1f # -> fault in user space | ||
316 | tmhh %r8,0x4000 # PER bit set in old PSW ? | ||
317 | @@ -467,7 +474,7 @@ ENTRY(io_int_handler) | ||
318 | lg %r12,__LC_THREAD_INFO | ||
319 | larl %r13,system_call | ||
320 | lmg %r8,%r9,__LC_IO_OLD_PSW | ||
321 | - HANDLE_SIE_INTERCEPT %r14 | ||
322 | + HANDLE_SIE_INTERCEPT %r14,0 | ||
323 | SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_STACK,STACK_SHIFT | ||
324 | tmhh %r8,0x0001 # interrupting from user? | ||
325 | jz io_skip | ||
326 | @@ -613,7 +620,7 @@ ENTRY(ext_int_handler) | ||
327 | lg %r12,__LC_THREAD_INFO | ||
328 | larl %r13,system_call | ||
329 | lmg %r8,%r9,__LC_EXT_OLD_PSW | ||
330 | - HANDLE_SIE_INTERCEPT %r14 | ||
331 | + HANDLE_SIE_INTERCEPT %r14,0 | ||
332 | SWITCH_ASYNC __LC_SAVE_AREA_ASYNC,__LC_ASYNC_STACK,STACK_SHIFT | ||
333 | tmhh %r8,0x0001 # interrupting from user ? | ||
334 | jz ext_skip | ||
335 | @@ -661,7 +668,7 @@ ENTRY(mcck_int_handler) | ||
336 | lg %r12,__LC_THREAD_INFO | ||
337 | larl %r13,system_call | ||
338 | lmg %r8,%r9,__LC_MCK_OLD_PSW | ||
339 | - HANDLE_SIE_INTERCEPT %r14 | ||
340 | + HANDLE_SIE_INTERCEPT %r14,0 | ||
341 | tm __LC_MCCK_CODE,0x80 # system damage? | ||
342 | jo mcck_panic # yes -> rest of mcck code invalid | ||
343 | lghi %r14,__LC_CPU_TIMER_SAVE_AREA | ||
344 | @@ -960,6 +967,13 @@ ENTRY(sie64a) | ||
345 | stg %r3,__SF_EMPTY+8(%r15) # save guest register save area | ||
346 | xc __SF_EMPTY+16(8,%r15),__SF_EMPTY+16(%r15) # host id == 0 | ||
347 | lmg %r0,%r13,0(%r3) # load guest gprs 0-13 | ||
348 | +# some program checks are suppressing. C code (e.g. do_protection_exception) | ||
349 | +# will rewind the PSW by the ILC, which is 4 bytes in case of SIE. Other | ||
350 | +# instructions in the sie_loop should not cause program interrupts. So | ||
351 | +# lets use a nop (47 00 00 00) as a landing pad. | ||
352 | +# See also HANDLE_SIE_INTERCEPT | ||
353 | +rewind_pad: | ||
354 | + nop 0 | ||
355 | sie_loop: | ||
356 | lg %r14,__LC_THREAD_INFO # pointer thread_info struct | ||
357 | tm __TI_flags+7(%r14),_TIF_EXIT_SIE | ||
358 | @@ -999,6 +1013,7 @@ sie_fault: | ||
359 | .Lhost_id: | ||
360 | .quad 0 | ||
361 | |||
362 | + EX_TABLE(rewind_pad,sie_fault) | ||
363 | EX_TABLE(sie_loop,sie_fault) | ||
364 | #endif | ||
365 | |||
366 | diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c | ||
367 | index ecced9d..38883f0 100644 | ||
368 | --- a/arch/s390/kvm/kvm-s390.c | ||
369 | +++ b/arch/s390/kvm/kvm-s390.c | ||
370 | @@ -997,7 +997,7 @@ static int __init kvm_s390_init(void) | ||
371 | } | ||
372 | memcpy(facilities, S390_lowcore.stfle_fac_list, 16); | ||
373 | facilities[0] &= 0xff00fff3f47c0000ULL; | ||
374 | - facilities[1] &= 0x201c000000000000ULL; | ||
375 | + facilities[1] &= 0x001c000000000000ULL; | ||
376 | return 0; | ||
377 | } | ||
378 | |||
379 | diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c | ||
380 | index c441834..1b888e8 100644 | ||
381 | --- a/drivers/acpi/scan.c | ||
382 | +++ b/drivers/acpi/scan.c | ||
383 | @@ -859,8 +859,8 @@ acpi_bus_extract_wakeup_device_power_package(acpi_handle handle, | ||
384 | static void acpi_bus_set_run_wake_flags(struct acpi_device *device) | ||
385 | { | ||
386 | struct acpi_device_id button_device_ids[] = { | ||
387 | - {"PNP0C0D", 0}, | ||
388 | {"PNP0C0C", 0}, | ||
389 | + {"PNP0C0D", 0}, | ||
390 | {"PNP0C0E", 0}, | ||
391 | {"", 0}, | ||
392 | }; | ||
393 | @@ -872,6 +872,11 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device) | ||
394 | /* Power button, Lid switch always enable wakeup */ | ||
395 | if (!acpi_match_device_ids(device, button_device_ids)) { | ||
396 | device->wakeup.flags.run_wake = 1; | ||
397 | + if (!acpi_match_device_ids(device, &button_device_ids[1])) { | ||
398 | + /* Do not use Lid/sleep button for S5 wakeup */ | ||
399 | + if (device->wakeup.sleep_state == ACPI_STATE_S5) | ||
400 | + device->wakeup.sleep_state = ACPI_STATE_S4; | ||
401 | + } | ||
402 | device_set_wakeup_capable(&device->dev, true); | ||
403 | return; | ||
404 | } | ||
405 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
406 | index f46fbd3..586362e 100644 | ||
407 | --- a/drivers/ata/libata-core.c | ||
408 | +++ b/drivers/ata/libata-core.c | ||
409 | @@ -2560,6 +2560,7 @@ int ata_bus_probe(struct ata_port *ap) | ||
410 | * bus as we may be talking too fast. | ||
411 | */ | ||
412 | dev->pio_mode = XFER_PIO_0; | ||
413 | + dev->dma_mode = 0xff; | ||
414 | |||
415 | /* If the controller has a pio mode setup function | ||
416 | * then use it to set the chipset to rights. Don't | ||
417 | diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c | ||
418 | index e60437c..bf039b0 100644 | ||
419 | --- a/drivers/ata/libata-eh.c | ||
420 | +++ b/drivers/ata/libata-eh.c | ||
421 | @@ -2657,6 +2657,7 @@ int ata_eh_reset(struct ata_link *link, int classify, | ||
422 | * bus as we may be talking too fast. | ||
423 | */ | ||
424 | dev->pio_mode = XFER_PIO_0; | ||
425 | + dev->dma_mode = 0xff; | ||
426 | |||
427 | /* If the controller has a pio mode setup function | ||
428 | * then use it to set the chipset to rights. Don't | ||
429 | diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c | ||
430 | index a6df6a3..7c337e7 100644 | ||
431 | --- a/drivers/ata/libata-scsi.c | ||
432 | +++ b/drivers/ata/libata-scsi.c | ||
433 | @@ -309,7 +309,8 @@ ata_scsi_activity_show(struct device *dev, struct device_attribute *attr, | ||
434 | struct ata_port *ap = ata_shost_to_port(sdev->host); | ||
435 | struct ata_device *atadev = ata_scsi_find_dev(ap, sdev); | ||
436 | |||
437 | - if (ap->ops->sw_activity_show && (ap->flags & ATA_FLAG_SW_ACTIVITY)) | ||
438 | + if (atadev && ap->ops->sw_activity_show && | ||
439 | + (ap->flags & ATA_FLAG_SW_ACTIVITY)) | ||
440 | return ap->ops->sw_activity_show(atadev, buf); | ||
441 | return -EINVAL; | ||
442 | } | ||
443 | @@ -324,7 +325,8 @@ ata_scsi_activity_store(struct device *dev, struct device_attribute *attr, | ||
444 | enum sw_activity val; | ||
445 | int rc; | ||
446 | |||
447 | - if (ap->ops->sw_activity_store && (ap->flags & ATA_FLAG_SW_ACTIVITY)) { | ||
448 | + if (atadev && ap->ops->sw_activity_store && | ||
449 | + (ap->flags & ATA_FLAG_SW_ACTIVITY)) { | ||
450 | val = simple_strtoul(buf, NULL, 0); | ||
451 | switch (val) { | ||
452 | case OFF: case BLINK_ON: case BLINK_OFF: | ||
453 | diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c | ||
454 | index 489c817..fb0dd87 100644 | ||
455 | --- a/drivers/ata/sata_promise.c | ||
456 | +++ b/drivers/ata/sata_promise.c | ||
457 | @@ -147,6 +147,10 @@ struct pdc_port_priv { | ||
458 | dma_addr_t pkt_dma; | ||
459 | }; | ||
460 | |||
461 | +struct pdc_host_priv { | ||
462 | + spinlock_t hard_reset_lock; | ||
463 | +}; | ||
464 | + | ||
465 | static int pdc_sata_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val); | ||
466 | static int pdc_sata_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val); | ||
467 | static int pdc_ata_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | ||
468 | @@ -801,9 +805,10 @@ static void pdc_hard_reset_port(struct ata_port *ap) | ||
469 | void __iomem *host_mmio = ap->host->iomap[PDC_MMIO_BAR]; | ||
470 | void __iomem *pcictl_b1_mmio = host_mmio + PDC_PCI_CTL + 1; | ||
471 | unsigned int ata_no = pdc_ata_port_to_ata_no(ap); | ||
472 | + struct pdc_host_priv *hpriv = ap->host->private_data; | ||
473 | u8 tmp; | ||
474 | |||
475 | - spin_lock(&ap->host->lock); | ||
476 | + spin_lock(&hpriv->hard_reset_lock); | ||
477 | |||
478 | tmp = readb(pcictl_b1_mmio); | ||
479 | tmp &= ~(0x10 << ata_no); | ||
480 | @@ -814,7 +819,7 @@ static void pdc_hard_reset_port(struct ata_port *ap) | ||
481 | writeb(tmp, pcictl_b1_mmio); | ||
482 | readb(pcictl_b1_mmio); /* flush */ | ||
483 | |||
484 | - spin_unlock(&ap->host->lock); | ||
485 | + spin_unlock(&hpriv->hard_reset_lock); | ||
486 | } | ||
487 | |||
488 | static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class, | ||
489 | @@ -1182,6 +1187,7 @@ static int pdc_ata_init_one(struct pci_dev *pdev, | ||
490 | const struct ata_port_info *pi = &pdc_port_info[ent->driver_data]; | ||
491 | const struct ata_port_info *ppi[PDC_MAX_PORTS]; | ||
492 | struct ata_host *host; | ||
493 | + struct pdc_host_priv *hpriv; | ||
494 | void __iomem *host_mmio; | ||
495 | int n_ports, i, rc; | ||
496 | int is_sataii_tx4; | ||
497 | @@ -1218,6 +1224,11 @@ static int pdc_ata_init_one(struct pci_dev *pdev, | ||
498 | dev_err(&pdev->dev, "failed to allocate host\n"); | ||
499 | return -ENOMEM; | ||
500 | } | ||
501 | + hpriv = devm_kzalloc(&pdev->dev, sizeof *hpriv, GFP_KERNEL); | ||
502 | + if (!hpriv) | ||
503 | + return -ENOMEM; | ||
504 | + spin_lock_init(&hpriv->hard_reset_lock); | ||
505 | + host->private_data = hpriv; | ||
506 | host->iomap = pcim_iomap_table(pdev); | ||
507 | |||
508 | is_sataii_tx4 = pdc_is_sataii_tx4(pi->flags); | ||
509 | diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c | ||
510 | index a3c1404..2b7f77d 100644 | ||
511 | --- a/drivers/base/power/main.c | ||
512 | +++ b/drivers/base/power/main.c | ||
513 | @@ -513,6 +513,8 @@ static int device_resume_early(struct device *dev, pm_message_t state) | ||
514 | |||
515 | Out: | ||
516 | TRACE_RESUME(error); | ||
517 | + | ||
518 | + pm_runtime_enable(dev); | ||
519 | return error; | ||
520 | } | ||
521 | |||
522 | @@ -589,8 +591,6 @@ static int device_resume(struct device *dev, pm_message_t state, bool async) | ||
523 | if (!dev->power.is_suspended) | ||
524 | goto Unlock; | ||
525 | |||
526 | - pm_runtime_enable(dev); | ||
527 | - | ||
528 | if (dev->pm_domain) { | ||
529 | info = "power domain "; | ||
530 | callback = pm_op(&dev->pm_domain->ops, state); | ||
531 | @@ -930,6 +930,8 @@ static int device_suspend_late(struct device *dev, pm_message_t state) | ||
532 | pm_callback_t callback = NULL; | ||
533 | char *info = NULL; | ||
534 | |||
535 | + __pm_runtime_disable(dev, false); | ||
536 | + | ||
537 | if (dev->power.syscore) | ||
538 | return 0; | ||
539 | |||
540 | @@ -1133,11 +1135,8 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) | ||
541 | |||
542 | Complete: | ||
543 | complete_all(&dev->power.completion); | ||
544 | - | ||
545 | if (error) | ||
546 | async_error = error; | ||
547 | - else if (dev->power.is_suspended) | ||
548 | - __pm_runtime_disable(dev, false); | ||
549 | |||
550 | return error; | ||
551 | } | ||
552 | diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c | ||
553 | index bb1ff17..c394041 100644 | ||
554 | --- a/drivers/base/regmap/regmap-debugfs.c | ||
555 | +++ b/drivers/base/regmap/regmap-debugfs.c | ||
556 | @@ -90,7 +90,7 @@ static ssize_t regmap_map_read_file(struct file *file, char __user *user_buf, | ||
557 | /* If we're in the region the user is trying to read */ | ||
558 | if (p >= *ppos) { | ||
559 | /* ...but not beyond it */ | ||
560 | - if (buf_pos >= count - 1 - tot_len) | ||
561 | + if (buf_pos + 1 + tot_len >= count) | ||
562 | break; | ||
563 | |||
564 | /* Format the register */ | ||
565 | diff --git a/drivers/bcma/driver_mips.c b/drivers/bcma/driver_mips.c | ||
566 | index cc65b45..b4e83b8 100644 | ||
567 | --- a/drivers/bcma/driver_mips.c | ||
568 | +++ b/drivers/bcma/driver_mips.c | ||
569 | @@ -115,7 +115,7 @@ static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq) | ||
570 | bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) & | ||
571 | ~(1 << irqflag)); | ||
572 | else | ||
573 | - bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq), 0); | ||
574 | + bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(oldirq), 0); | ||
575 | |||
576 | /* assign the new one */ | ||
577 | if (irq == 0) { | ||
578 | diff --git a/drivers/block/aoe/aoeblk.c b/drivers/block/aoe/aoeblk.c | ||
579 | index 00dfc50..047baf0 100644 | ||
580 | --- a/drivers/block/aoe/aoeblk.c | ||
581 | +++ b/drivers/block/aoe/aoeblk.c | ||
582 | @@ -231,18 +231,12 @@ aoeblk_gdalloc(void *vp) | ||
583 | if (q == NULL) { | ||
584 | pr_err("aoe: cannot allocate block queue for %ld.%d\n", | ||
585 | d->aoemajor, d->aoeminor); | ||
586 | - mempool_destroy(mp); | ||
587 | - goto err_disk; | ||
588 | + goto err_mempool; | ||
589 | } | ||
590 | |||
591 | - d->blkq = blk_alloc_queue(GFP_KERNEL); | ||
592 | - if (!d->blkq) | ||
593 | - goto err_mempool; | ||
594 | - d->blkq->backing_dev_info.name = "aoe"; | ||
595 | - if (bdi_init(&d->blkq->backing_dev_info)) | ||
596 | - goto err_blkq; | ||
597 | spin_lock_irqsave(&d->lock, flags); | ||
598 | - blk_queue_max_hw_sectors(d->blkq, BLK_DEF_MAX_SECTORS); | ||
599 | + blk_queue_max_hw_sectors(q, BLK_DEF_MAX_SECTORS); | ||
600 | + q->backing_dev_info.name = "aoe"; | ||
601 | q->backing_dev_info.ra_pages = READ_AHEAD / PAGE_CACHE_SIZE; | ||
602 | d->bufpool = mp; | ||
603 | d->blkq = gd->queue = q; | ||
604 | @@ -265,11 +259,8 @@ aoeblk_gdalloc(void *vp) | ||
605 | aoedisk_add_sysfs(d); | ||
606 | return; | ||
607 | |||
608 | -err_blkq: | ||
609 | - blk_cleanup_queue(d->blkq); | ||
610 | - d->blkq = NULL; | ||
611 | err_mempool: | ||
612 | - mempool_destroy(d->bufpool); | ||
613 | + mempool_destroy(mp); | ||
614 | err_disk: | ||
615 | put_disk(gd); | ||
616 | err: | ||
617 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c | ||
618 | index bb3d9be..67de124 100644 | ||
619 | --- a/drivers/block/rbd.c | ||
620 | +++ b/drivers/block/rbd.c | ||
621 | @@ -61,7 +61,10 @@ | ||
622 | |||
623 | #define RBD_MINORS_PER_MAJOR 256 /* max minors per blkdev */ | ||
624 | |||
625 | -#define RBD_MAX_SNAP_NAME_LEN 32 | ||
626 | +#define RBD_SNAP_DEV_NAME_PREFIX "snap_" | ||
627 | +#define RBD_MAX_SNAP_NAME_LEN \ | ||
628 | + (NAME_MAX - (sizeof (RBD_SNAP_DEV_NAME_PREFIX) - 1)) | ||
629 | + | ||
630 | #define RBD_MAX_SNAP_COUNT 510 /* allows max snapc to fit in 4KB */ | ||
631 | #define RBD_MAX_OPT_LEN 1024 | ||
632 | |||
633 | @@ -204,6 +207,7 @@ struct rbd_device { | ||
634 | |||
635 | /* sysfs related */ | ||
636 | struct device dev; | ||
637 | + unsigned long open_count; | ||
638 | }; | ||
639 | |||
640 | static DEFINE_MUTEX(ctl_mutex); /* Serialize open/close/setup/teardown */ | ||
641 | @@ -218,7 +222,7 @@ static int rbd_dev_snaps_update(struct rbd_device *rbd_dev); | ||
642 | static int rbd_dev_snaps_register(struct rbd_device *rbd_dev); | ||
643 | |||
644 | static void rbd_dev_release(struct device *dev); | ||
645 | -static void __rbd_remove_snap_dev(struct rbd_snap *snap); | ||
646 | +static void rbd_remove_snap_dev(struct rbd_snap *snap); | ||
647 | |||
648 | static ssize_t rbd_add(struct bus_type *bus, const char *buf, | ||
649 | size_t count); | ||
650 | @@ -277,8 +281,11 @@ static int rbd_open(struct block_device *bdev, fmode_t mode) | ||
651 | if ((mode & FMODE_WRITE) && rbd_dev->mapping.read_only) | ||
652 | return -EROFS; | ||
653 | |||
654 | + mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); | ||
655 | rbd_get_dev(rbd_dev); | ||
656 | set_device_ro(bdev, rbd_dev->mapping.read_only); | ||
657 | + rbd_dev->open_count++; | ||
658 | + mutex_unlock(&ctl_mutex); | ||
659 | |||
660 | return 0; | ||
661 | } | ||
662 | @@ -287,7 +294,11 @@ static int rbd_release(struct gendisk *disk, fmode_t mode) | ||
663 | { | ||
664 | struct rbd_device *rbd_dev = disk->private_data; | ||
665 | |||
666 | + mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING); | ||
667 | + rbd_assert(rbd_dev->open_count > 0); | ||
668 | + rbd_dev->open_count--; | ||
669 | rbd_put_dev(rbd_dev); | ||
670 | + mutex_unlock(&ctl_mutex); | ||
671 | |||
672 | return 0; | ||
673 | } | ||
674 | @@ -388,7 +399,7 @@ enum { | ||
675 | static match_table_t rbd_opts_tokens = { | ||
676 | /* int args above */ | ||
677 | /* string args above */ | ||
678 | - {Opt_read_only, "mapping.read_only"}, | ||
679 | + {Opt_read_only, "read_only"}, | ||
680 | {Opt_read_only, "ro"}, /* Alternate spelling */ | ||
681 | {Opt_read_write, "read_write"}, | ||
682 | {Opt_read_write, "rw"}, /* Alternate spelling */ | ||
683 | @@ -695,13 +706,13 @@ static char *rbd_segment_name(struct rbd_device *rbd_dev, u64 offset) | ||
684 | u64 segment; | ||
685 | int ret; | ||
686 | |||
687 | - name = kmalloc(RBD_MAX_SEG_NAME_LEN + 1, GFP_NOIO); | ||
688 | + name = kmalloc(MAX_OBJ_NAME_SIZE + 1, GFP_NOIO); | ||
689 | if (!name) | ||
690 | return NULL; | ||
691 | segment = offset >> rbd_dev->header.obj_order; | ||
692 | - ret = snprintf(name, RBD_MAX_SEG_NAME_LEN, "%s.%012llx", | ||
693 | + ret = snprintf(name, MAX_OBJ_NAME_SIZE + 1, "%s.%012llx", | ||
694 | rbd_dev->header.object_prefix, segment); | ||
695 | - if (ret < 0 || ret >= RBD_MAX_SEG_NAME_LEN) { | ||
696 | + if (ret < 0 || ret > MAX_OBJ_NAME_SIZE) { | ||
697 | pr_err("error formatting segment name for #%llu (%d)\n", | ||
698 | segment, ret); | ||
699 | kfree(name); | ||
700 | @@ -1707,13 +1718,13 @@ static int rbd_read_header(struct rbd_device *rbd_dev, | ||
701 | return ret; | ||
702 | } | ||
703 | |||
704 | -static void __rbd_remove_all_snaps(struct rbd_device *rbd_dev) | ||
705 | +static void rbd_remove_all_snaps(struct rbd_device *rbd_dev) | ||
706 | { | ||
707 | struct rbd_snap *snap; | ||
708 | struct rbd_snap *next; | ||
709 | |||
710 | list_for_each_entry_safe(snap, next, &rbd_dev->snaps, node) | ||
711 | - __rbd_remove_snap_dev(snap); | ||
712 | + rbd_remove_snap_dev(snap); | ||
713 | } | ||
714 | |||
715 | /* | ||
716 | @@ -2057,7 +2068,7 @@ static bool rbd_snap_registered(struct rbd_snap *snap) | ||
717 | return ret; | ||
718 | } | ||
719 | |||
720 | -static void __rbd_remove_snap_dev(struct rbd_snap *snap) | ||
721 | +static void rbd_remove_snap_dev(struct rbd_snap *snap) | ||
722 | { | ||
723 | list_del(&snap->node); | ||
724 | if (device_is_registered(&snap->dev)) | ||
725 | @@ -2073,7 +2084,7 @@ static int rbd_register_snap_dev(struct rbd_snap *snap, | ||
726 | dev->type = &rbd_snap_device_type; | ||
727 | dev->parent = parent; | ||
728 | dev->release = rbd_snap_dev_release; | ||
729 | - dev_set_name(dev, "snap_%s", snap->name); | ||
730 | + dev_set_name(dev, "%s%s", RBD_SNAP_DEV_NAME_PREFIX, snap->name); | ||
731 | dout("%s: registering device for snapshot %s\n", __func__, snap->name); | ||
732 | |||
733 | ret = device_register(dev); | ||
734 | @@ -2189,6 +2200,7 @@ static int rbd_dev_v2_object_prefix(struct rbd_device *rbd_dev) | ||
735 | dout("%s: rbd_req_sync_exec returned %d\n", __func__, ret); | ||
736 | if (ret < 0) | ||
737 | goto out; | ||
738 | + ret = 0; /* rbd_req_sync_exec() can return positive */ | ||
739 | |||
740 | p = reply_buf; | ||
741 | rbd_dev->header.object_prefix = ceph_extract_encoded_string(&p, | ||
742 | @@ -2438,7 +2450,7 @@ static int rbd_dev_snaps_update(struct rbd_device *rbd_dev) | ||
743 | |||
744 | if (rbd_dev->mapping.snap_id == snap->id) | ||
745 | rbd_dev->mapping.snap_exists = false; | ||
746 | - __rbd_remove_snap_dev(snap); | ||
747 | + rbd_remove_snap_dev(snap); | ||
748 | dout("%ssnap id %llu has been removed\n", | ||
749 | rbd_dev->mapping.snap_id == snap->id ? | ||
750 | "mapped " : "", | ||
751 | @@ -2621,8 +2633,8 @@ static void rbd_dev_id_put(struct rbd_device *rbd_dev) | ||
752 | struct rbd_device *rbd_dev; | ||
753 | |||
754 | rbd_dev = list_entry(tmp, struct rbd_device, node); | ||
755 | - if (rbd_id > max_id) | ||
756 | - max_id = rbd_id; | ||
757 | + if (rbd_dev->dev_id > max_id) | ||
758 | + max_id = rbd_dev->dev_id; | ||
759 | } | ||
760 | spin_unlock(&rbd_dev_list_lock); | ||
761 | |||
762 | @@ -2765,8 +2777,13 @@ static char *rbd_add_parse_args(struct rbd_device *rbd_dev, | ||
763 | if (!rbd_dev->image_name) | ||
764 | goto out_err; | ||
765 | |||
766 | - /* Snapshot name is optional */ | ||
767 | + /* Snapshot name is optional; default is to use "head" */ | ||
768 | + | ||
769 | len = next_token(&buf); | ||
770 | + if (len > RBD_MAX_SNAP_NAME_LEN) { | ||
771 | + err_ptr = ERR_PTR(-ENAMETOOLONG); | ||
772 | + goto out_err; | ||
773 | + } | ||
774 | if (!len) { | ||
775 | buf = RBD_SNAP_HEAD_NAME; /* No snapshot supplied */ | ||
776 | len = sizeof (RBD_SNAP_HEAD_NAME) - 1; | ||
777 | @@ -2777,8 +2794,6 @@ static char *rbd_add_parse_args(struct rbd_device *rbd_dev, | ||
778 | memcpy(snap_name, buf, len); | ||
779 | *(snap_name + len) = '\0'; | ||
780 | |||
781 | -dout(" SNAP_NAME is <%s>, len is %zd\n", snap_name, len); | ||
782 | - | ||
783 | return snap_name; | ||
784 | |||
785 | out_err: | ||
786 | @@ -2841,6 +2856,7 @@ static int rbd_dev_image_id(struct rbd_device *rbd_dev) | ||
787 | dout("%s: rbd_req_sync_exec returned %d\n", __func__, ret); | ||
788 | if (ret < 0) | ||
789 | goto out; | ||
790 | + ret = 0; /* rbd_req_sync_exec() can return positive */ | ||
791 | |||
792 | p = response; | ||
793 | rbd_dev->image_id = ceph_extract_encoded_string(&p, | ||
794 | @@ -3045,11 +3061,11 @@ static ssize_t rbd_add(struct bus_type *bus, | ||
795 | /* no need to lock here, as rbd_dev is not registered yet */ | ||
796 | rc = rbd_dev_snaps_update(rbd_dev); | ||
797 | if (rc) | ||
798 | - goto err_out_header; | ||
799 | + goto err_out_probe; | ||
800 | |||
801 | rc = rbd_dev_set_mapping(rbd_dev, snap_name); | ||
802 | if (rc) | ||
803 | - goto err_out_header; | ||
804 | + goto err_out_snaps; | ||
805 | |||
806 | /* generate unique id: find highest unique id, add one */ | ||
807 | rbd_dev_id_get(rbd_dev); | ||
808 | @@ -3113,7 +3129,9 @@ err_out_blkdev: | ||
809 | unregister_blkdev(rbd_dev->major, rbd_dev->name); | ||
810 | err_out_id: | ||
811 | rbd_dev_id_put(rbd_dev); | ||
812 | -err_out_header: | ||
813 | +err_out_snaps: | ||
814 | + rbd_remove_all_snaps(rbd_dev); | ||
815 | +err_out_probe: | ||
816 | rbd_header_free(&rbd_dev->header); | ||
817 | err_out_client: | ||
818 | kfree(rbd_dev->header_name); | ||
819 | @@ -3211,7 +3229,12 @@ static ssize_t rbd_remove(struct bus_type *bus, | ||
820 | goto done; | ||
821 | } | ||
822 | |||
823 | - __rbd_remove_all_snaps(rbd_dev); | ||
824 | + if (rbd_dev->open_count) { | ||
825 | + ret = -EBUSY; | ||
826 | + goto done; | ||
827 | + } | ||
828 | + | ||
829 | + rbd_remove_all_snaps(rbd_dev); | ||
830 | rbd_bus_del_dev(rbd_dev); | ||
831 | |||
832 | done: | ||
833 | diff --git a/drivers/block/rbd_types.h b/drivers/block/rbd_types.h | ||
834 | index cbe77fa..49d77cb 100644 | ||
835 | --- a/drivers/block/rbd_types.h | ||
836 | +++ b/drivers/block/rbd_types.h | ||
837 | @@ -46,8 +46,6 @@ | ||
838 | #define RBD_MIN_OBJ_ORDER 16 | ||
839 | #define RBD_MAX_OBJ_ORDER 30 | ||
840 | |||
841 | -#define RBD_MAX_SEG_NAME_LEN 128 | ||
842 | - | ||
843 | #define RBD_COMP_NONE 0 | ||
844 | #define RBD_CRYPT_NONE 0 | ||
845 | |||
846 | diff --git a/drivers/cpuidle/coupled.c b/drivers/cpuidle/coupled.c | ||
847 | index 3265844..2a297f8 100644 | ||
848 | --- a/drivers/cpuidle/coupled.c | ||
849 | +++ b/drivers/cpuidle/coupled.c | ||
850 | @@ -209,7 +209,7 @@ inline int cpuidle_coupled_set_not_ready(struct cpuidle_coupled *coupled) | ||
851 | int all; | ||
852 | int ret; | ||
853 | |||
854 | - all = coupled->online_count || (coupled->online_count << WAITING_BITS); | ||
855 | + all = coupled->online_count | (coupled->online_count << WAITING_BITS); | ||
856 | ret = atomic_add_unless(&coupled->ready_waiting_counts, | ||
857 | -MAX_WAITING_CPUS, all); | ||
858 | |||
859 | diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c | ||
860 | index ed0bc07..fe4fa1c 100644 | ||
861 | --- a/drivers/edac/edac_mc_sysfs.c | ||
862 | +++ b/drivers/edac/edac_mc_sysfs.c | ||
863 | @@ -1145,7 +1145,7 @@ int __init edac_mc_sysfs_init(void) | ||
864 | |||
865 | void __exit edac_mc_sysfs_exit(void) | ||
866 | { | ||
867 | - put_device(mci_pdev); | ||
868 | device_del(mci_pdev); | ||
869 | + put_device(mci_pdev); | ||
870 | edac_put_sysfs_subsys(); | ||
871 | } | ||
872 | diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c | ||
873 | index 08c6749..638e1f7 100644 | ||
874 | --- a/drivers/firewire/net.c | ||
875 | +++ b/drivers/firewire/net.c | ||
876 | @@ -861,8 +861,8 @@ static void fwnet_receive_broadcast(struct fw_iso_context *context, | ||
877 | if (specifier_id == IANA_SPECIFIER_ID && ver == RFC2734_SW_VERSION) { | ||
878 | buf_ptr += 2; | ||
879 | length -= IEEE1394_GASP_HDR_SIZE; | ||
880 | - fwnet_incoming_packet(dev, buf_ptr, length, | ||
881 | - source_node_id, -1, true); | ||
882 | + fwnet_incoming_packet(dev, buf_ptr, length, source_node_id, | ||
883 | + context->card->generation, true); | ||
884 | } | ||
885 | |||
886 | packet.payload_length = dev->rcv_buffer_size; | ||
887 | @@ -958,7 +958,12 @@ static void fwnet_transmit_packet_done(struct fwnet_packet_task *ptask) | ||
888 | break; | ||
889 | } | ||
890 | |||
891 | - skb_pull(skb, ptask->max_payload); | ||
892 | + if (ptask->dest_node == IEEE1394_ALL_NODES) { | ||
893 | + skb_pull(skb, | ||
894 | + ptask->max_payload + IEEE1394_GASP_HDR_SIZE); | ||
895 | + } else { | ||
896 | + skb_pull(skb, ptask->max_payload); | ||
897 | + } | ||
898 | if (ptask->outstanding_pkts > 1) { | ||
899 | fwnet_make_sf_hdr(&ptask->hdr, RFC2374_HDR_INTFRAG, | ||
900 | dg_size, fg_off, datagram_label); | ||
901 | @@ -1062,7 +1067,7 @@ static int fwnet_send_packet(struct fwnet_packet_task *ptask) | ||
902 | smp_rmb(); | ||
903 | node_id = dev->card->node_id; | ||
904 | |||
905 | - p = skb_push(ptask->skb, 8); | ||
906 | + p = skb_push(ptask->skb, IEEE1394_GASP_HDR_SIZE); | ||
907 | put_unaligned_be32(node_id << 16 | IANA_SPECIFIER_ID >> 8, p); | ||
908 | put_unaligned_be32((IANA_SPECIFIER_ID & 0xff) << 24 | ||
909 | | RFC2734_SW_VERSION, &p[4]); | ||
910 | diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c | ||
911 | index 0761a03..665553c 100644 | ||
912 | --- a/drivers/gpu/drm/drm_mm.c | ||
913 | +++ b/drivers/gpu/drm/drm_mm.c | ||
914 | @@ -213,11 +213,13 @@ static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node, | ||
915 | |||
916 | BUG_ON(!hole_node->hole_follows || node->allocated); | ||
917 | |||
918 | - if (mm->color_adjust) | ||
919 | - mm->color_adjust(hole_node, color, &adj_start, &adj_end); | ||
920 | - | ||
921 | if (adj_start < start) | ||
922 | adj_start = start; | ||
923 | + if (adj_end > end) | ||
924 | + adj_end = end; | ||
925 | + | ||
926 | + if (mm->color_adjust) | ||
927 | + mm->color_adjust(hole_node, color, &adj_start, &adj_end); | ||
928 | |||
929 | if (alignment) { | ||
930 | unsigned tmp = adj_start % alignment; | ||
931 | @@ -489,7 +491,7 @@ void drm_mm_init_scan(struct drm_mm *mm, | ||
932 | mm->scan_size = size; | ||
933 | mm->scanned_blocks = 0; | ||
934 | mm->scan_hit_start = 0; | ||
935 | - mm->scan_hit_size = 0; | ||
936 | + mm->scan_hit_end = 0; | ||
937 | mm->scan_check_range = 0; | ||
938 | mm->prev_scanned_node = NULL; | ||
939 | } | ||
940 | @@ -516,7 +518,7 @@ void drm_mm_init_scan_with_range(struct drm_mm *mm, | ||
941 | mm->scan_size = size; | ||
942 | mm->scanned_blocks = 0; | ||
943 | mm->scan_hit_start = 0; | ||
944 | - mm->scan_hit_size = 0; | ||
945 | + mm->scan_hit_end = 0; | ||
946 | mm->scan_start = start; | ||
947 | mm->scan_end = end; | ||
948 | mm->scan_check_range = 1; | ||
949 | @@ -535,8 +537,7 @@ int drm_mm_scan_add_block(struct drm_mm_node *node) | ||
950 | struct drm_mm *mm = node->mm; | ||
951 | struct drm_mm_node *prev_node; | ||
952 | unsigned long hole_start, hole_end; | ||
953 | - unsigned long adj_start; | ||
954 | - unsigned long adj_end; | ||
955 | + unsigned long adj_start, adj_end; | ||
956 | |||
957 | mm->scanned_blocks++; | ||
958 | |||
959 | @@ -553,14 +554,8 @@ int drm_mm_scan_add_block(struct drm_mm_node *node) | ||
960 | node->node_list.next = &mm->prev_scanned_node->node_list; | ||
961 | mm->prev_scanned_node = node; | ||
962 | |||
963 | - hole_start = drm_mm_hole_node_start(prev_node); | ||
964 | - hole_end = drm_mm_hole_node_end(prev_node); | ||
965 | - | ||
966 | - adj_start = hole_start; | ||
967 | - adj_end = hole_end; | ||
968 | - | ||
969 | - if (mm->color_adjust) | ||
970 | - mm->color_adjust(prev_node, mm->scan_color, &adj_start, &adj_end); | ||
971 | + adj_start = hole_start = drm_mm_hole_node_start(prev_node); | ||
972 | + adj_end = hole_end = drm_mm_hole_node_end(prev_node); | ||
973 | |||
974 | if (mm->scan_check_range) { | ||
975 | if (adj_start < mm->scan_start) | ||
976 | @@ -569,11 +564,14 @@ int drm_mm_scan_add_block(struct drm_mm_node *node) | ||
977 | adj_end = mm->scan_end; | ||
978 | } | ||
979 | |||
980 | + if (mm->color_adjust) | ||
981 | + mm->color_adjust(prev_node, mm->scan_color, | ||
982 | + &adj_start, &adj_end); | ||
983 | + | ||
984 | if (check_free_hole(adj_start, adj_end, | ||
985 | mm->scan_size, mm->scan_alignment)) { | ||
986 | mm->scan_hit_start = hole_start; | ||
987 | - mm->scan_hit_size = hole_end; | ||
988 | - | ||
989 | + mm->scan_hit_end = hole_end; | ||
990 | return 1; | ||
991 | } | ||
992 | |||
993 | @@ -609,19 +607,10 @@ int drm_mm_scan_remove_block(struct drm_mm_node *node) | ||
994 | node_list); | ||
995 | |||
996 | prev_node->hole_follows = node->scanned_preceeds_hole; | ||
997 | - INIT_LIST_HEAD(&node->node_list); | ||
998 | list_add(&node->node_list, &prev_node->node_list); | ||
999 | |||
1000 | - /* Only need to check for containement because start&size for the | ||
1001 | - * complete resulting free block (not just the desired part) is | ||
1002 | - * stored. */ | ||
1003 | - if (node->start >= mm->scan_hit_start && | ||
1004 | - node->start + node->size | ||
1005 | - <= mm->scan_hit_start + mm->scan_hit_size) { | ||
1006 | - return 1; | ||
1007 | - } | ||
1008 | - | ||
1009 | - return 0; | ||
1010 | + return (drm_mm_hole_node_end(node) > mm->scan_hit_start && | ||
1011 | + node->start < mm->scan_hit_end); | ||
1012 | } | ||
1013 | EXPORT_SYMBOL(drm_mm_scan_remove_block); | ||
1014 | |||
1015 | diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | ||
1016 | index fae1f2e..f2b2f01 100644 | ||
1017 | --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | ||
1018 | +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | ||
1019 | @@ -210,7 +210,12 @@ struct drm_gem_object *exynos_dmabuf_prime_import(struct drm_device *drm_dev, | ||
1020 | |||
1021 | /* is it from our device? */ | ||
1022 | if (obj->dev == drm_dev) { | ||
1023 | + /* | ||
1024 | + * Importing dmabuf exported from out own gem increases | ||
1025 | + * refcount on gem itself instead of f_count of dmabuf. | ||
1026 | + */ | ||
1027 | drm_gem_object_reference(obj); | ||
1028 | + dma_buf_put(dma_buf); | ||
1029 | return obj; | ||
1030 | } | ||
1031 | } | ||
1032 | diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c | ||
1033 | index dde8b50..da21b11 100644 | ||
1034 | --- a/drivers/gpu/drm/i915/i915_debugfs.c | ||
1035 | +++ b/drivers/gpu/drm/i915/i915_debugfs.c | ||
1036 | @@ -317,7 +317,7 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data) | ||
1037 | seq_printf(m, "No flip due on pipe %c (plane %c)\n", | ||
1038 | pipe, plane); | ||
1039 | } else { | ||
1040 | - if (!work->pending) { | ||
1041 | + if (atomic_read(&work->pending) < INTEL_FLIP_COMPLETE) { | ||
1042 | seq_printf(m, "Flip queued on pipe %c (plane %c)\n", | ||
1043 | pipe, plane); | ||
1044 | } else { | ||
1045 | @@ -328,7 +328,7 @@ static int i915_gem_pageflip_info(struct seq_file *m, void *data) | ||
1046 | seq_printf(m, "Stall check enabled, "); | ||
1047 | else | ||
1048 | seq_printf(m, "Stall check waiting for page flip ioctl, "); | ||
1049 | - seq_printf(m, "%d prepares\n", work->pending); | ||
1050 | + seq_printf(m, "%d prepares\n", atomic_read(&work->pending)); | ||
1051 | |||
1052 | if (work->old_fb_obj) { | ||
1053 | struct drm_i915_gem_object *obj = work->old_fb_obj; | ||
1054 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c | ||
1055 | index 6770ee6..1f20ead 100644 | ||
1056 | --- a/drivers/gpu/drm/i915/i915_drv.c | ||
1057 | +++ b/drivers/gpu/drm/i915/i915_drv.c | ||
1058 | @@ -552,7 +552,7 @@ static int i915_drm_thaw(struct drm_device *dev) | ||
1059 | mutex_unlock(&dev->struct_mutex); | ||
1060 | |||
1061 | intel_modeset_init_hw(dev); | ||
1062 | - intel_modeset_setup_hw_state(dev); | ||
1063 | + intel_modeset_setup_hw_state(dev, false); | ||
1064 | drm_mode_config_reset(dev); | ||
1065 | drm_irq_install(dev); | ||
1066 | } | ||
1067 | diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h | ||
1068 | index f511fa2..92f1750 100644 | ||
1069 | --- a/drivers/gpu/drm/i915/i915_drv.h | ||
1070 | +++ b/drivers/gpu/drm/i915/i915_drv.h | ||
1071 | @@ -1595,7 +1595,8 @@ extern void intel_modeset_init(struct drm_device *dev); | ||
1072 | extern void intel_modeset_gem_init(struct drm_device *dev); | ||
1073 | extern void intel_modeset_cleanup(struct drm_device *dev); | ||
1074 | extern int intel_modeset_vga_set_state(struct drm_device *dev, bool state); | ||
1075 | -extern void intel_modeset_setup_hw_state(struct drm_device *dev); | ||
1076 | +extern void intel_modeset_setup_hw_state(struct drm_device *dev, | ||
1077 | + bool force_restore); | ||
1078 | extern bool intel_fbc_enabled(struct drm_device *dev); | ||
1079 | extern void intel_disable_fbc(struct drm_device *dev); | ||
1080 | extern bool ironlake_set_drps(struct drm_device *dev, u8 val); | ||
1081 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c | ||
1082 | index 9b285da..fe3a778 100644 | ||
1083 | --- a/drivers/gpu/drm/i915/i915_gem.c | ||
1084 | +++ b/drivers/gpu/drm/i915/i915_gem.c | ||
1085 | @@ -1718,7 +1718,8 @@ i915_gem_object_put_pages(struct drm_i915_gem_object *obj) | ||
1086 | } | ||
1087 | |||
1088 | static long | ||
1089 | -i915_gem_purge(struct drm_i915_private *dev_priv, long target) | ||
1090 | +__i915_gem_shrink(struct drm_i915_private *dev_priv, long target, | ||
1091 | + bool purgeable_only) | ||
1092 | { | ||
1093 | struct drm_i915_gem_object *obj, *next; | ||
1094 | long count = 0; | ||
1095 | @@ -1726,7 +1727,7 @@ i915_gem_purge(struct drm_i915_private *dev_priv, long target) | ||
1096 | list_for_each_entry_safe(obj, next, | ||
1097 | &dev_priv->mm.unbound_list, | ||
1098 | gtt_list) { | ||
1099 | - if (i915_gem_object_is_purgeable(obj) && | ||
1100 | + if ((i915_gem_object_is_purgeable(obj) || !purgeable_only) && | ||
1101 | i915_gem_object_put_pages(obj) == 0) { | ||
1102 | count += obj->base.size >> PAGE_SHIFT; | ||
1103 | if (count >= target) | ||
1104 | @@ -1737,7 +1738,7 @@ i915_gem_purge(struct drm_i915_private *dev_priv, long target) | ||
1105 | list_for_each_entry_safe(obj, next, | ||
1106 | &dev_priv->mm.inactive_list, | ||
1107 | mm_list) { | ||
1108 | - if (i915_gem_object_is_purgeable(obj) && | ||
1109 | + if ((i915_gem_object_is_purgeable(obj) || !purgeable_only) && | ||
1110 | i915_gem_object_unbind(obj) == 0 && | ||
1111 | i915_gem_object_put_pages(obj) == 0) { | ||
1112 | count += obj->base.size >> PAGE_SHIFT; | ||
1113 | @@ -1749,6 +1750,12 @@ i915_gem_purge(struct drm_i915_private *dev_priv, long target) | ||
1114 | return count; | ||
1115 | } | ||
1116 | |||
1117 | +static long | ||
1118 | +i915_gem_purge(struct drm_i915_private *dev_priv, long target) | ||
1119 | +{ | ||
1120 | + return __i915_gem_shrink(dev_priv, target, true); | ||
1121 | +} | ||
1122 | + | ||
1123 | static void | ||
1124 | i915_gem_shrink_all(struct drm_i915_private *dev_priv) | ||
1125 | { | ||
1126 | @@ -3511,14 +3518,15 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data, | ||
1127 | goto out; | ||
1128 | } | ||
1129 | |||
1130 | - obj->user_pin_count++; | ||
1131 | - obj->pin_filp = file; | ||
1132 | - if (obj->user_pin_count == 1) { | ||
1133 | + if (obj->user_pin_count == 0) { | ||
1134 | ret = i915_gem_object_pin(obj, args->alignment, true, false); | ||
1135 | if (ret) | ||
1136 | goto out; | ||
1137 | } | ||
1138 | |||
1139 | + obj->user_pin_count++; | ||
1140 | + obj->pin_filp = file; | ||
1141 | + | ||
1142 | /* XXX - flush the CPU caches for pinned objects | ||
1143 | * as the X server doesn't manage domains yet | ||
1144 | */ | ||
1145 | @@ -4425,6 +4433,9 @@ i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc) | ||
1146 | if (nr_to_scan) { | ||
1147 | nr_to_scan -= i915_gem_purge(dev_priv, nr_to_scan); | ||
1148 | if (nr_to_scan > 0) | ||
1149 | + nr_to_scan -= __i915_gem_shrink(dev_priv, nr_to_scan, | ||
1150 | + false); | ||
1151 | + if (nr_to_scan > 0) | ||
1152 | i915_gem_shrink_all(dev_priv); | ||
1153 | } | ||
1154 | |||
1155 | @@ -4432,7 +4443,7 @@ i915_gem_inactive_shrink(struct shrinker *shrinker, struct shrink_control *sc) | ||
1156 | list_for_each_entry(obj, &dev_priv->mm.unbound_list, gtt_list) | ||
1157 | if (obj->pages_pin_count == 0) | ||
1158 | cnt += obj->base.size >> PAGE_SHIFT; | ||
1159 | - list_for_each_entry(obj, &dev_priv->mm.bound_list, gtt_list) | ||
1160 | + list_for_each_entry(obj, &dev_priv->mm.inactive_list, gtt_list) | ||
1161 | if (obj->pin_count == 0 && obj->pages_pin_count == 0) | ||
1162 | cnt += obj->base.size >> PAGE_SHIFT; | ||
1163 | |||
1164 | diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c | ||
1165 | index 773ef77..abeaafe 100644 | ||
1166 | --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c | ||
1167 | +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c | ||
1168 | @@ -226,7 +226,7 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev, | ||
1169 | { | ||
1170 | struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); | ||
1171 | |||
1172 | - return dma_buf_export(obj, &i915_dmabuf_ops, obj->base.size, 0600); | ||
1173 | + return dma_buf_export(obj, &i915_dmabuf_ops, obj->base.size, flags); | ||
1174 | } | ||
1175 | |||
1176 | static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj) | ||
1177 | @@ -266,7 +266,12 @@ struct drm_gem_object *i915_gem_prime_import(struct drm_device *dev, | ||
1178 | obj = dma_buf->priv; | ||
1179 | /* is it from our device? */ | ||
1180 | if (obj->base.dev == dev) { | ||
1181 | + /* | ||
1182 | + * Importing dmabuf exported from out own gem increases | ||
1183 | + * refcount on gem itself instead of f_count of dmabuf. | ||
1184 | + */ | ||
1185 | drm_gem_object_reference(&obj->base); | ||
1186 | + dma_buf_put(dma_buf); | ||
1187 | return &obj->base; | ||
1188 | } | ||
1189 | } | ||
1190 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c | ||
1191 | index 32e1bda..dc29ace 100644 | ||
1192 | --- a/drivers/gpu/drm/i915/i915_irq.c | ||
1193 | +++ b/drivers/gpu/drm/i915/i915_irq.c | ||
1194 | @@ -1464,7 +1464,9 @@ static void i915_pageflip_stall_check(struct drm_device *dev, int pipe) | ||
1195 | spin_lock_irqsave(&dev->event_lock, flags); | ||
1196 | work = intel_crtc->unpin_work; | ||
1197 | |||
1198 | - if (work == NULL || work->pending || !work->enable_stall_check) { | ||
1199 | + if (work == NULL || | ||
1200 | + atomic_read(&work->pending) >= INTEL_FLIP_COMPLETE || | ||
1201 | + !work->enable_stall_check) { | ||
1202 | /* Either the pending flip IRQ arrived, or we're too early. Don't check */ | ||
1203 | spin_unlock_irqrestore(&dev->event_lock, flags); | ||
1204 | return; | ||
1205 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h | ||
1206 | index a4162dd..09ae4b0 100644 | ||
1207 | --- a/drivers/gpu/drm/i915/i915_reg.h | ||
1208 | +++ b/drivers/gpu/drm/i915/i915_reg.h | ||
1209 | @@ -3315,6 +3315,8 @@ | ||
1210 | #define _PFA_CTL_1 0x68080 | ||
1211 | #define _PFB_CTL_1 0x68880 | ||
1212 | #define PF_ENABLE (1<<31) | ||
1213 | +#define PF_PIPE_SEL_MASK_IVB (3<<29) | ||
1214 | +#define PF_PIPE_SEL_IVB(pipe) ((pipe)<<29) | ||
1215 | #define PF_FILTER_MASK (3<<23) | ||
1216 | #define PF_FILTER_PROGRAMMED (0<<23) | ||
1217 | #define PF_FILTER_MED_3x3 (1<<23) | ||
1218 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | ||
1219 | index b426d44..4d3c7c6 100644 | ||
1220 | --- a/drivers/gpu/drm/i915/intel_display.c | ||
1221 | +++ b/drivers/gpu/drm/i915/intel_display.c | ||
1222 | @@ -2302,18 +2302,6 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc) | ||
1223 | FDI_FE_ERRC_ENABLE); | ||
1224 | } | ||
1225 | |||
1226 | -static void cpt_phase_pointer_enable(struct drm_device *dev, int pipe) | ||
1227 | -{ | ||
1228 | - struct drm_i915_private *dev_priv = dev->dev_private; | ||
1229 | - u32 flags = I915_READ(SOUTH_CHICKEN1); | ||
1230 | - | ||
1231 | - flags |= FDI_PHASE_SYNC_OVR(pipe); | ||
1232 | - I915_WRITE(SOUTH_CHICKEN1, flags); /* once to unlock... */ | ||
1233 | - flags |= FDI_PHASE_SYNC_EN(pipe); | ||
1234 | - I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to enable */ | ||
1235 | - POSTING_READ(SOUTH_CHICKEN1); | ||
1236 | -} | ||
1237 | - | ||
1238 | /* The FDI link training functions for ILK/Ibexpeak. */ | ||
1239 | static void ironlake_fdi_link_train(struct drm_crtc *crtc) | ||
1240 | { | ||
1241 | @@ -2464,9 +2452,6 @@ static void gen6_fdi_link_train(struct drm_crtc *crtc) | ||
1242 | POSTING_READ(reg); | ||
1243 | udelay(150); | ||
1244 | |||
1245 | - if (HAS_PCH_CPT(dev)) | ||
1246 | - cpt_phase_pointer_enable(dev, pipe); | ||
1247 | - | ||
1248 | for (i = 0; i < 4; i++) { | ||
1249 | reg = FDI_TX_CTL(pipe); | ||
1250 | temp = I915_READ(reg); | ||
1251 | @@ -2593,9 +2578,6 @@ static void ivb_manual_fdi_link_train(struct drm_crtc *crtc) | ||
1252 | POSTING_READ(reg); | ||
1253 | udelay(150); | ||
1254 | |||
1255 | - if (HAS_PCH_CPT(dev)) | ||
1256 | - cpt_phase_pointer_enable(dev, pipe); | ||
1257 | - | ||
1258 | for (i = 0; i < 4; i++) { | ||
1259 | reg = FDI_TX_CTL(pipe); | ||
1260 | temp = I915_READ(reg); | ||
1261 | @@ -2737,17 +2719,6 @@ static void ironlake_fdi_pll_disable(struct intel_crtc *intel_crtc) | ||
1262 | udelay(100); | ||
1263 | } | ||
1264 | |||
1265 | -static void cpt_phase_pointer_disable(struct drm_device *dev, int pipe) | ||
1266 | -{ | ||
1267 | - struct drm_i915_private *dev_priv = dev->dev_private; | ||
1268 | - u32 flags = I915_READ(SOUTH_CHICKEN1); | ||
1269 | - | ||
1270 | - flags &= ~(FDI_PHASE_SYNC_EN(pipe)); | ||
1271 | - I915_WRITE(SOUTH_CHICKEN1, flags); /* once to disable... */ | ||
1272 | - flags &= ~(FDI_PHASE_SYNC_OVR(pipe)); | ||
1273 | - I915_WRITE(SOUTH_CHICKEN1, flags); /* then again to lock */ | ||
1274 | - POSTING_READ(SOUTH_CHICKEN1); | ||
1275 | -} | ||
1276 | static void ironlake_fdi_disable(struct drm_crtc *crtc) | ||
1277 | { | ||
1278 | struct drm_device *dev = crtc->dev; | ||
1279 | @@ -2777,8 +2748,6 @@ static void ironlake_fdi_disable(struct drm_crtc *crtc) | ||
1280 | I915_WRITE(FDI_RX_CHICKEN(pipe), | ||
1281 | I915_READ(FDI_RX_CHICKEN(pipe) & | ||
1282 | ~FDI_RX_PHASE_SYNC_POINTER_EN)); | ||
1283 | - } else if (HAS_PCH_CPT(dev)) { | ||
1284 | - cpt_phase_pointer_disable(dev, pipe); | ||
1285 | } | ||
1286 | |||
1287 | /* still set train pattern 1 */ | ||
1288 | @@ -3225,7 +3194,11 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc) | ||
1289 | * as some pre-programmed values are broken, | ||
1290 | * e.g. x201. | ||
1291 | */ | ||
1292 | - I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3); | ||
1293 | + if (IS_IVYBRIDGE(dev)) | ||
1294 | + I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3 | | ||
1295 | + PF_PIPE_SEL_IVB(pipe)); | ||
1296 | + else | ||
1297 | + I915_WRITE(PF_CTL(pipe), PF_ENABLE | PF_FILTER_MED_3x3); | ||
1298 | I915_WRITE(PF_WIN_POS(pipe), dev_priv->pch_pf_pos); | ||
1299 | I915_WRITE(PF_WIN_SZ(pipe), dev_priv->pch_pf_size); | ||
1300 | } | ||
1301 | @@ -6183,14 +6156,19 @@ static void intel_unpin_work_fn(struct work_struct *__work) | ||
1302 | { | ||
1303 | struct intel_unpin_work *work = | ||
1304 | container_of(__work, struct intel_unpin_work, work); | ||
1305 | + struct drm_device *dev = work->crtc->dev; | ||
1306 | |||
1307 | - mutex_lock(&work->dev->struct_mutex); | ||
1308 | + mutex_lock(&dev->struct_mutex); | ||
1309 | intel_unpin_fb_obj(work->old_fb_obj); | ||
1310 | drm_gem_object_unreference(&work->pending_flip_obj->base); | ||
1311 | drm_gem_object_unreference(&work->old_fb_obj->base); | ||
1312 | |||
1313 | - intel_update_fbc(work->dev); | ||
1314 | - mutex_unlock(&work->dev->struct_mutex); | ||
1315 | + intel_update_fbc(dev); | ||
1316 | + mutex_unlock(&dev->struct_mutex); | ||
1317 | + | ||
1318 | + BUG_ON(atomic_read(&to_intel_crtc(work->crtc)->unpin_work_count) == 0); | ||
1319 | + atomic_dec(&to_intel_crtc(work->crtc)->unpin_work_count); | ||
1320 | + | ||
1321 | kfree(work); | ||
1322 | } | ||
1323 | |||
1324 | @@ -6211,11 +6189,18 @@ static void do_intel_finish_page_flip(struct drm_device *dev, | ||
1325 | |||
1326 | spin_lock_irqsave(&dev->event_lock, flags); | ||
1327 | work = intel_crtc->unpin_work; | ||
1328 | - if (work == NULL || !work->pending) { | ||
1329 | + | ||
1330 | + /* Ensure we don't miss a work->pending update ... */ | ||
1331 | + smp_rmb(); | ||
1332 | + | ||
1333 | + if (work == NULL || atomic_read(&work->pending) < INTEL_FLIP_COMPLETE) { | ||
1334 | spin_unlock_irqrestore(&dev->event_lock, flags); | ||
1335 | return; | ||
1336 | } | ||
1337 | |||
1338 | + /* and that the unpin work is consistent wrt ->pending. */ | ||
1339 | + smp_rmb(); | ||
1340 | + | ||
1341 | intel_crtc->unpin_work = NULL; | ||
1342 | |||
1343 | if (work->event) { | ||
1344 | @@ -6238,9 +6223,9 @@ static void do_intel_finish_page_flip(struct drm_device *dev, | ||
1345 | |||
1346 | atomic_clear_mask(1 << intel_crtc->plane, | ||
1347 | &obj->pending_flip.counter); | ||
1348 | - | ||
1349 | wake_up(&dev_priv->pending_flip_queue); | ||
1350 | - schedule_work(&work->work); | ||
1351 | + | ||
1352 | + queue_work(dev_priv->wq, &work->work); | ||
1353 | |||
1354 | trace_i915_flip_complete(intel_crtc->plane, work->pending_flip_obj); | ||
1355 | } | ||
1356 | @@ -6268,16 +6253,25 @@ void intel_prepare_page_flip(struct drm_device *dev, int plane) | ||
1357 | to_intel_crtc(dev_priv->plane_to_crtc_mapping[plane]); | ||
1358 | unsigned long flags; | ||
1359 | |||
1360 | + /* NB: An MMIO update of the plane base pointer will also | ||
1361 | + * generate a page-flip completion irq, i.e. every modeset | ||
1362 | + * is also accompanied by a spurious intel_prepare_page_flip(). | ||
1363 | + */ | ||
1364 | spin_lock_irqsave(&dev->event_lock, flags); | ||
1365 | - if (intel_crtc->unpin_work) { | ||
1366 | - if ((++intel_crtc->unpin_work->pending) > 1) | ||
1367 | - DRM_ERROR("Prepared flip multiple times\n"); | ||
1368 | - } else { | ||
1369 | - DRM_DEBUG_DRIVER("preparing flip with no unpin work?\n"); | ||
1370 | - } | ||
1371 | + if (intel_crtc->unpin_work) | ||
1372 | + atomic_inc_not_zero(&intel_crtc->unpin_work->pending); | ||
1373 | spin_unlock_irqrestore(&dev->event_lock, flags); | ||
1374 | } | ||
1375 | |||
1376 | +inline static void intel_mark_page_flip_active(struct intel_crtc *intel_crtc) | ||
1377 | +{ | ||
1378 | + /* Ensure that the work item is consistent when activating it ... */ | ||
1379 | + smp_wmb(); | ||
1380 | + atomic_set(&intel_crtc->unpin_work->pending, INTEL_FLIP_PENDING); | ||
1381 | + /* and that it is marked active as soon as the irq could fire. */ | ||
1382 | + smp_wmb(); | ||
1383 | +} | ||
1384 | + | ||
1385 | static int intel_gen2_queue_flip(struct drm_device *dev, | ||
1386 | struct drm_crtc *crtc, | ||
1387 | struct drm_framebuffer *fb, | ||
1388 | @@ -6311,6 +6305,8 @@ static int intel_gen2_queue_flip(struct drm_device *dev, | ||
1389 | intel_ring_emit(ring, fb->pitches[0]); | ||
1390 | intel_ring_emit(ring, obj->gtt_offset + intel_crtc->dspaddr_offset); | ||
1391 | intel_ring_emit(ring, 0); /* aux display base address, unused */ | ||
1392 | + | ||
1393 | + intel_mark_page_flip_active(intel_crtc); | ||
1394 | intel_ring_advance(ring); | ||
1395 | return 0; | ||
1396 | |||
1397 | @@ -6351,6 +6347,7 @@ static int intel_gen3_queue_flip(struct drm_device *dev, | ||
1398 | intel_ring_emit(ring, obj->gtt_offset + intel_crtc->dspaddr_offset); | ||
1399 | intel_ring_emit(ring, MI_NOOP); | ||
1400 | |||
1401 | + intel_mark_page_flip_active(intel_crtc); | ||
1402 | intel_ring_advance(ring); | ||
1403 | return 0; | ||
1404 | |||
1405 | @@ -6397,6 +6394,8 @@ static int intel_gen4_queue_flip(struct drm_device *dev, | ||
1406 | pf = 0; | ||
1407 | pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; | ||
1408 | intel_ring_emit(ring, pf | pipesrc); | ||
1409 | + | ||
1410 | + intel_mark_page_flip_active(intel_crtc); | ||
1411 | intel_ring_advance(ring); | ||
1412 | return 0; | ||
1413 | |||
1414 | @@ -6439,6 +6438,8 @@ static int intel_gen6_queue_flip(struct drm_device *dev, | ||
1415 | pf = 0; | ||
1416 | pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff; | ||
1417 | intel_ring_emit(ring, pf | pipesrc); | ||
1418 | + | ||
1419 | + intel_mark_page_flip_active(intel_crtc); | ||
1420 | intel_ring_advance(ring); | ||
1421 | return 0; | ||
1422 | |||
1423 | @@ -6493,6 +6494,8 @@ static int intel_gen7_queue_flip(struct drm_device *dev, | ||
1424 | intel_ring_emit(ring, (fb->pitches[0] | obj->tiling_mode)); | ||
1425 | intel_ring_emit(ring, obj->gtt_offset + intel_crtc->dspaddr_offset); | ||
1426 | intel_ring_emit(ring, (MI_NOOP)); | ||
1427 | + | ||
1428 | + intel_mark_page_flip_active(intel_crtc); | ||
1429 | intel_ring_advance(ring); | ||
1430 | return 0; | ||
1431 | |||
1432 | @@ -6541,7 +6544,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | ||
1433 | return -ENOMEM; | ||
1434 | |||
1435 | work->event = event; | ||
1436 | - work->dev = crtc->dev; | ||
1437 | + work->crtc = crtc; | ||
1438 | intel_fb = to_intel_framebuffer(crtc->fb); | ||
1439 | work->old_fb_obj = intel_fb->obj; | ||
1440 | INIT_WORK(&work->work, intel_unpin_work_fn); | ||
1441 | @@ -6566,6 +6569,9 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | ||
1442 | intel_fb = to_intel_framebuffer(fb); | ||
1443 | obj = intel_fb->obj; | ||
1444 | |||
1445 | + if (atomic_read(&intel_crtc->unpin_work_count) >= 2) | ||
1446 | + flush_workqueue(dev_priv->wq); | ||
1447 | + | ||
1448 | ret = i915_mutex_lock_interruptible(dev); | ||
1449 | if (ret) | ||
1450 | goto cleanup; | ||
1451 | @@ -6584,6 +6590,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | ||
1452 | * the flip occurs and the object is no longer visible. | ||
1453 | */ | ||
1454 | atomic_add(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip); | ||
1455 | + atomic_inc(&intel_crtc->unpin_work_count); | ||
1456 | |||
1457 | ret = dev_priv->display.queue_flip(dev, crtc, fb, obj); | ||
1458 | if (ret) | ||
1459 | @@ -6598,6 +6605,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc, | ||
1460 | return 0; | ||
1461 | |||
1462 | cleanup_pending: | ||
1463 | + atomic_dec(&intel_crtc->unpin_work_count); | ||
1464 | atomic_sub(1 << intel_crtc->plane, &work->old_fb_obj->pending_flip); | ||
1465 | drm_gem_object_unreference(&work->old_fb_obj->base); | ||
1466 | drm_gem_object_unreference(&obj->base); | ||
1467 | @@ -7259,10 +7267,6 @@ intel_modeset_stage_output_state(struct drm_device *dev, | ||
1468 | DRM_DEBUG_KMS("encoder changed, full mode switch\n"); | ||
1469 | config->mode_changed = true; | ||
1470 | } | ||
1471 | - | ||
1472 | - /* Disable all disconnected encoders. */ | ||
1473 | - if (connector->base.status == connector_status_disconnected) | ||
1474 | - connector->new_encoder = NULL; | ||
1475 | } | ||
1476 | /* connector->new_encoder is now updated for all connectors. */ | ||
1477 | |||
1478 | @@ -8244,9 +8248,27 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder) | ||
1479 | * the crtc fixup. */ | ||
1480 | } | ||
1481 | |||
1482 | +static void i915_redisable_vga(struct drm_device *dev) | ||
1483 | +{ | ||
1484 | + struct drm_i915_private *dev_priv = dev->dev_private; | ||
1485 | + u32 vga_reg; | ||
1486 | + | ||
1487 | + if (HAS_PCH_SPLIT(dev)) | ||
1488 | + vga_reg = CPU_VGACNTRL; | ||
1489 | + else | ||
1490 | + vga_reg = VGACNTRL; | ||
1491 | + | ||
1492 | + if (I915_READ(vga_reg) != VGA_DISP_DISABLE) { | ||
1493 | + DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n"); | ||
1494 | + I915_WRITE(vga_reg, VGA_DISP_DISABLE); | ||
1495 | + POSTING_READ(vga_reg); | ||
1496 | + } | ||
1497 | +} | ||
1498 | + | ||
1499 | /* Scan out the current hw modeset state, sanitizes it and maps it into the drm | ||
1500 | * and i915 state tracking structures. */ | ||
1501 | -void intel_modeset_setup_hw_state(struct drm_device *dev) | ||
1502 | +void intel_modeset_setup_hw_state(struct drm_device *dev, | ||
1503 | + bool force_restore) | ||
1504 | { | ||
1505 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1506 | enum pipe pipe; | ||
1507 | @@ -8317,7 +8339,17 @@ void intel_modeset_setup_hw_state(struct drm_device *dev) | ||
1508 | intel_sanitize_crtc(crtc); | ||
1509 | } | ||
1510 | |||
1511 | - intel_modeset_update_staged_output_state(dev); | ||
1512 | + if (force_restore) { | ||
1513 | + for_each_pipe(pipe) { | ||
1514 | + crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]); | ||
1515 | + intel_set_mode(&crtc->base, &crtc->base.mode, | ||
1516 | + crtc->base.x, crtc->base.y, crtc->base.fb); | ||
1517 | + } | ||
1518 | + | ||
1519 | + i915_redisable_vga(dev); | ||
1520 | + } else { | ||
1521 | + intel_modeset_update_staged_output_state(dev); | ||
1522 | + } | ||
1523 | |||
1524 | intel_modeset_check_state(dev); | ||
1525 | } | ||
1526 | @@ -8328,7 +8360,7 @@ void intel_modeset_gem_init(struct drm_device *dev) | ||
1527 | |||
1528 | intel_setup_overlay(dev); | ||
1529 | |||
1530 | - intel_modeset_setup_hw_state(dev); | ||
1531 | + intel_modeset_setup_hw_state(dev, false); | ||
1532 | } | ||
1533 | |||
1534 | void intel_modeset_cleanup(struct drm_device *dev) | ||
1535 | diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h | ||
1536 | index fe71425..016e375 100644 | ||
1537 | --- a/drivers/gpu/drm/i915/intel_drv.h | ||
1538 | +++ b/drivers/gpu/drm/i915/intel_drv.h | ||
1539 | @@ -198,6 +198,8 @@ struct intel_crtc { | ||
1540 | struct intel_unpin_work *unpin_work; | ||
1541 | int fdi_lanes; | ||
1542 | |||
1543 | + atomic_t unpin_work_count; | ||
1544 | + | ||
1545 | /* Display surface base address adjustement for pageflips. Note that on | ||
1546 | * gen4+ this only adjusts up to a tile, offsets within a tile are | ||
1547 | * handled in the hw itself (with the TILEOFF register). */ | ||
1548 | @@ -380,11 +382,14 @@ intel_get_crtc_for_plane(struct drm_device *dev, int plane) | ||
1549 | |||
1550 | struct intel_unpin_work { | ||
1551 | struct work_struct work; | ||
1552 | - struct drm_device *dev; | ||
1553 | + struct drm_crtc *crtc; | ||
1554 | struct drm_i915_gem_object *old_fb_obj; | ||
1555 | struct drm_i915_gem_object *pending_flip_obj; | ||
1556 | struct drm_pending_vblank_event *event; | ||
1557 | - int pending; | ||
1558 | + atomic_t pending; | ||
1559 | +#define INTEL_FLIP_INACTIVE 0 | ||
1560 | +#define INTEL_FLIP_PENDING 1 | ||
1561 | +#define INTEL_FLIP_COMPLETE 2 | ||
1562 | bool enable_stall_check; | ||
1563 | }; | ||
1564 | |||
1565 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c | ||
1566 | index edba93b..d4d9a6f 100644 | ||
1567 | --- a/drivers/gpu/drm/i915/intel_lvds.c | ||
1568 | +++ b/drivers/gpu/drm/i915/intel_lvds.c | ||
1569 | @@ -526,7 +526,7 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val, | ||
1570 | dev_priv->modeset_on_lid = 0; | ||
1571 | |||
1572 | mutex_lock(&dev->mode_config.mutex); | ||
1573 | - intel_modeset_check_state(dev); | ||
1574 | + intel_modeset_setup_hw_state(dev, true); | ||
1575 | mutex_unlock(&dev->mode_config.mutex); | ||
1576 | |||
1577 | return NOTIFY_OK; | ||
1578 | @@ -763,14 +763,6 @@ static const struct dmi_system_id intel_no_lvds[] = { | ||
1579 | }, | ||
1580 | { | ||
1581 | .callback = intel_no_lvds_dmi_callback, | ||
1582 | - .ident = "ZOTAC ZBOXSD-ID12/ID13", | ||
1583 | - .matches = { | ||
1584 | - DMI_MATCH(DMI_BOARD_VENDOR, "ZOTAC"), | ||
1585 | - DMI_MATCH(DMI_BOARD_NAME, "ZBOXSD-ID12/ID13"), | ||
1586 | - }, | ||
1587 | - }, | ||
1588 | - { | ||
1589 | - .callback = intel_no_lvds_dmi_callback, | ||
1590 | .ident = "Gigabyte GA-D525TUD", | ||
1591 | .matches = { | ||
1592 | DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."), | ||
1593 | diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c | ||
1594 | index 442968f..eaaff3c 100644 | ||
1595 | --- a/drivers/gpu/drm/i915/intel_pm.c | ||
1596 | +++ b/drivers/gpu/drm/i915/intel_pm.c | ||
1597 | @@ -44,6 +44,14 @@ | ||
1598 | * i915.i915_enable_fbc parameter | ||
1599 | */ | ||
1600 | |||
1601 | +static bool intel_crtc_active(struct drm_crtc *crtc) | ||
1602 | +{ | ||
1603 | + /* Be paranoid as we can arrive here with only partial | ||
1604 | + * state retrieved from the hardware during setup. | ||
1605 | + */ | ||
1606 | + return to_intel_crtc(crtc)->active && crtc->fb && crtc->mode.clock; | ||
1607 | +} | ||
1608 | + | ||
1609 | static void i8xx_disable_fbc(struct drm_device *dev) | ||
1610 | { | ||
1611 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
1612 | @@ -405,9 +413,8 @@ void intel_update_fbc(struct drm_device *dev) | ||
1613 | * - going to an unsupported config (interlace, pixel multiply, etc.) | ||
1614 | */ | ||
1615 | list_for_each_entry(tmp_crtc, &dev->mode_config.crtc_list, head) { | ||
1616 | - if (tmp_crtc->enabled && | ||
1617 | - !to_intel_crtc(tmp_crtc)->primary_disabled && | ||
1618 | - tmp_crtc->fb) { | ||
1619 | + if (intel_crtc_active(tmp_crtc) && | ||
1620 | + !to_intel_crtc(tmp_crtc)->primary_disabled) { | ||
1621 | if (crtc) { | ||
1622 | DRM_DEBUG_KMS("more than one pipe active, disabling compression\n"); | ||
1623 | dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES; | ||
1624 | @@ -992,7 +999,7 @@ static struct drm_crtc *single_enabled_crtc(struct drm_device *dev) | ||
1625 | struct drm_crtc *crtc, *enabled = NULL; | ||
1626 | |||
1627 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | ||
1628 | - if (crtc->enabled && crtc->fb) { | ||
1629 | + if (intel_crtc_active(crtc)) { | ||
1630 | if (enabled) | ||
1631 | return NULL; | ||
1632 | enabled = crtc; | ||
1633 | @@ -1086,7 +1093,7 @@ static bool g4x_compute_wm0(struct drm_device *dev, | ||
1634 | int entries, tlb_miss; | ||
1635 | |||
1636 | crtc = intel_get_crtc_for_plane(dev, plane); | ||
1637 | - if (crtc->fb == NULL || !crtc->enabled) { | ||
1638 | + if (!intel_crtc_active(crtc)) { | ||
1639 | *cursor_wm = cursor->guard_size; | ||
1640 | *plane_wm = display->guard_size; | ||
1641 | return false; | ||
1642 | @@ -1215,7 +1222,7 @@ static bool vlv_compute_drain_latency(struct drm_device *dev, | ||
1643 | int entries; | ||
1644 | |||
1645 | crtc = intel_get_crtc_for_plane(dev, plane); | ||
1646 | - if (crtc->fb == NULL || !crtc->enabled) | ||
1647 | + if (!intel_crtc_active(crtc)) | ||
1648 | return false; | ||
1649 | |||
1650 | clock = crtc->mode.clock; /* VESA DOT Clock */ | ||
1651 | @@ -1478,7 +1485,7 @@ static void i9xx_update_wm(struct drm_device *dev) | ||
1652 | |||
1653 | fifo_size = dev_priv->display.get_fifo_size(dev, 1); | ||
1654 | crtc = intel_get_crtc_for_plane(dev, 1); | ||
1655 | - if (crtc->enabled && crtc->fb) { | ||
1656 | + if (intel_crtc_active(crtc)) { | ||
1657 | planeb_wm = intel_calculate_wm(crtc->mode.clock, | ||
1658 | wm_info, fifo_size, | ||
1659 | crtc->fb->bits_per_pixel / 8, | ||
1660 | @@ -1923,7 +1930,7 @@ sandybridge_compute_sprite_wm(struct drm_device *dev, int plane, | ||
1661 | int entries, tlb_miss; | ||
1662 | |||
1663 | crtc = intel_get_crtc_for_plane(dev, plane); | ||
1664 | - if (crtc->fb == NULL || !crtc->enabled) { | ||
1665 | + if (!intel_crtc_active(crtc)) { | ||
1666 | *sprite_wm = display->guard_size; | ||
1667 | return false; | ||
1668 | } | ||
1669 | diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/bios/pll.h b/drivers/gpu/drm/nouveau/core/include/subdev/bios/pll.h | ||
1670 | index c345097..b2f3d4d 100644 | ||
1671 | --- a/drivers/gpu/drm/nouveau/core/include/subdev/bios/pll.h | ||
1672 | +++ b/drivers/gpu/drm/nouveau/core/include/subdev/bios/pll.h | ||
1673 | @@ -38,6 +38,8 @@ enum nvbios_pll_type { | ||
1674 | PLL_UNK42 = 0x42, | ||
1675 | PLL_VPLL0 = 0x80, | ||
1676 | PLL_VPLL1 = 0x81, | ||
1677 | + PLL_VPLL2 = 0x82, | ||
1678 | + PLL_VPLL3 = 0x83, | ||
1679 | PLL_MAX = 0xff | ||
1680 | }; | ||
1681 | |||
1682 | diff --git a/drivers/gpu/drm/nouveau/core/subdev/clock/nvc0.c b/drivers/gpu/drm/nouveau/core/subdev/clock/nvc0.c | ||
1683 | index f6962c9..7c96262 100644 | ||
1684 | --- a/drivers/gpu/drm/nouveau/core/subdev/clock/nvc0.c | ||
1685 | +++ b/drivers/gpu/drm/nouveau/core/subdev/clock/nvc0.c | ||
1686 | @@ -52,6 +52,8 @@ nvc0_clock_pll_set(struct nouveau_clock *clk, u32 type, u32 freq) | ||
1687 | switch (info.type) { | ||
1688 | case PLL_VPLL0: | ||
1689 | case PLL_VPLL1: | ||
1690 | + case PLL_VPLL2: | ||
1691 | + case PLL_VPLL3: | ||
1692 | nv_mask(priv, info.reg + 0x0c, 0x00000000, 0x00000100); | ||
1693 | nv_wr32(priv, info.reg + 0x04, (P << 16) | (N << 8) | M); | ||
1694 | nv_wr32(priv, info.reg + 0x10, fN << 16); | ||
1695 | diff --git a/drivers/gpu/drm/nouveau/core/subdev/fb/nvc0.c b/drivers/gpu/drm/nouveau/core/subdev/fb/nvc0.c | ||
1696 | index 9f59f2b..73bedff 100644 | ||
1697 | --- a/drivers/gpu/drm/nouveau/core/subdev/fb/nvc0.c | ||
1698 | +++ b/drivers/gpu/drm/nouveau/core/subdev/fb/nvc0.c | ||
1699 | @@ -86,14 +86,14 @@ nvc0_fb_vram_new(struct nouveau_fb *pfb, u64 size, u32 align, u32 ncmin, | ||
1700 | mem->memtype = type; | ||
1701 | mem->size = size; | ||
1702 | |||
1703 | - mutex_lock(&mm->mutex); | ||
1704 | + mutex_lock(&pfb->base.mutex); | ||
1705 | do { | ||
1706 | if (back) | ||
1707 | ret = nouveau_mm_tail(mm, 1, size, ncmin, align, &r); | ||
1708 | else | ||
1709 | ret = nouveau_mm_head(mm, 1, size, ncmin, align, &r); | ||
1710 | if (ret) { | ||
1711 | - mutex_unlock(&mm->mutex); | ||
1712 | + mutex_unlock(&pfb->base.mutex); | ||
1713 | pfb->ram.put(pfb, &mem); | ||
1714 | return ret; | ||
1715 | } | ||
1716 | @@ -101,7 +101,7 @@ nvc0_fb_vram_new(struct nouveau_fb *pfb, u64 size, u32 align, u32 ncmin, | ||
1717 | list_add_tail(&r->rl_entry, &mem->regions); | ||
1718 | size -= r->length; | ||
1719 | } while (size); | ||
1720 | - mutex_unlock(&mm->mutex); | ||
1721 | + mutex_unlock(&pfb->base.mutex); | ||
1722 | |||
1723 | r = list_first_entry(&mem->regions, struct nouveau_mm_node, rl_entry); | ||
1724 | mem->offset = (u64)r->offset << 12; | ||
1725 | diff --git a/drivers/gpu/drm/nouveau/core/subdev/instmem/base.c b/drivers/gpu/drm/nouveau/core/subdev/instmem/base.c | ||
1726 | index 1188227..6565f3d 100644 | ||
1727 | --- a/drivers/gpu/drm/nouveau/core/subdev/instmem/base.c | ||
1728 | +++ b/drivers/gpu/drm/nouveau/core/subdev/instmem/base.c | ||
1729 | @@ -40,15 +40,21 @@ nouveau_instobj_create_(struct nouveau_object *parent, | ||
1730 | if (ret) | ||
1731 | return ret; | ||
1732 | |||
1733 | + mutex_lock(&imem->base.mutex); | ||
1734 | list_add(&iobj->head, &imem->list); | ||
1735 | + mutex_unlock(&imem->base.mutex); | ||
1736 | return 0; | ||
1737 | } | ||
1738 | |||
1739 | void | ||
1740 | nouveau_instobj_destroy(struct nouveau_instobj *iobj) | ||
1741 | { | ||
1742 | - if (iobj->head.prev) | ||
1743 | - list_del(&iobj->head); | ||
1744 | + struct nouveau_subdev *subdev = nv_subdev(iobj->base.engine); | ||
1745 | + | ||
1746 | + mutex_lock(&subdev->mutex); | ||
1747 | + list_del(&iobj->head); | ||
1748 | + mutex_unlock(&subdev->mutex); | ||
1749 | + | ||
1750 | return nouveau_object_destroy(&iobj->base); | ||
1751 | } | ||
1752 | |||
1753 | @@ -88,6 +94,8 @@ nouveau_instmem_init(struct nouveau_instmem *imem) | ||
1754 | if (ret) | ||
1755 | return ret; | ||
1756 | |||
1757 | + mutex_lock(&imem->base.mutex); | ||
1758 | + | ||
1759 | list_for_each_entry(iobj, &imem->list, head) { | ||
1760 | if (iobj->suspend) { | ||
1761 | for (i = 0; i < iobj->size; i += 4) | ||
1762 | @@ -97,6 +105,8 @@ nouveau_instmem_init(struct nouveau_instmem *imem) | ||
1763 | } | ||
1764 | } | ||
1765 | |||
1766 | + mutex_unlock(&imem->base.mutex); | ||
1767 | + | ||
1768 | return 0; | ||
1769 | } | ||
1770 | |||
1771 | @@ -104,17 +114,26 @@ int | ||
1772 | nouveau_instmem_fini(struct nouveau_instmem *imem, bool suspend) | ||
1773 | { | ||
1774 | struct nouveau_instobj *iobj; | ||
1775 | - int i; | ||
1776 | + int i, ret = 0; | ||
1777 | |||
1778 | if (suspend) { | ||
1779 | + mutex_lock(&imem->base.mutex); | ||
1780 | + | ||
1781 | list_for_each_entry(iobj, &imem->list, head) { | ||
1782 | iobj->suspend = vmalloc(iobj->size); | ||
1783 | - if (iobj->suspend) { | ||
1784 | - for (i = 0; i < iobj->size; i += 4) | ||
1785 | - iobj->suspend[i / 4] = nv_ro32(iobj, i); | ||
1786 | - } else | ||
1787 | - return -ENOMEM; | ||
1788 | + if (!iobj->suspend) { | ||
1789 | + ret = -ENOMEM; | ||
1790 | + break; | ||
1791 | + } | ||
1792 | + | ||
1793 | + for (i = 0; i < iobj->size; i += 4) | ||
1794 | + iobj->suspend[i / 4] = nv_ro32(iobj, i); | ||
1795 | } | ||
1796 | + | ||
1797 | + mutex_unlock(&imem->base.mutex); | ||
1798 | + | ||
1799 | + if (ret) | ||
1800 | + return ret; | ||
1801 | } | ||
1802 | |||
1803 | return nouveau_subdev_fini(&imem->base, suspend); | ||
1804 | diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c | ||
1805 | index 35ac57f..5f0e7ef 100644 | ||
1806 | --- a/drivers/gpu/drm/nouveau/nouveau_bo.c | ||
1807 | +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | ||
1808 | @@ -1279,7 +1279,7 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) | ||
1809 | if (drm->agp.stat == ENABLED) { | ||
1810 | mem->bus.offset = mem->start << PAGE_SHIFT; | ||
1811 | mem->bus.base = drm->agp.base; | ||
1812 | - mem->bus.is_iomem = true; | ||
1813 | + mem->bus.is_iomem = !dev->agp->cant_use_aperture; | ||
1814 | } | ||
1815 | #endif | ||
1816 | break; | ||
1817 | diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.h b/drivers/gpu/drm/nouveau/nouveau_fence.h | ||
1818 | index bedafd1..cdb83ac 100644 | ||
1819 | --- a/drivers/gpu/drm/nouveau/nouveau_fence.h | ||
1820 | +++ b/drivers/gpu/drm/nouveau/nouveau_fence.h | ||
1821 | @@ -60,6 +60,7 @@ u32 nv10_fence_read(struct nouveau_channel *); | ||
1822 | void nv10_fence_context_del(struct nouveau_channel *); | ||
1823 | void nv10_fence_destroy(struct nouveau_drm *); | ||
1824 | int nv10_fence_create(struct nouveau_drm *); | ||
1825 | +void nv17_fence_resume(struct nouveau_drm *drm); | ||
1826 | |||
1827 | int nv50_fence_create(struct nouveau_drm *); | ||
1828 | int nv84_fence_create(struct nouveau_drm *); | ||
1829 | diff --git a/drivers/gpu/drm/nouveau/nouveau_prime.c b/drivers/gpu/drm/nouveau/nouveau_prime.c | ||
1830 | index 366462c..4f604cd 100644 | ||
1831 | --- a/drivers/gpu/drm/nouveau/nouveau_prime.c | ||
1832 | +++ b/drivers/gpu/drm/nouveau/nouveau_prime.c | ||
1833 | @@ -197,6 +197,7 @@ struct drm_gem_object *nouveau_gem_prime_import(struct drm_device *dev, | ||
1834 | if (nvbo->gem) { | ||
1835 | if (nvbo->gem->dev == dev) { | ||
1836 | drm_gem_object_reference(nvbo->gem); | ||
1837 | + dma_buf_put(dma_buf); | ||
1838 | return nvbo->gem; | ||
1839 | } | ||
1840 | } | ||
1841 | diff --git a/drivers/gpu/drm/nouveau/nv04_dfp.c b/drivers/gpu/drm/nouveau/nv04_dfp.c | ||
1842 | index 184cdf8..39ffc07 100644 | ||
1843 | --- a/drivers/gpu/drm/nouveau/nv04_dfp.c | ||
1844 | +++ b/drivers/gpu/drm/nouveau/nv04_dfp.c | ||
1845 | @@ -505,7 +505,7 @@ static void nv04_dfp_update_backlight(struct drm_encoder *encoder, int mode) | ||
1846 | |||
1847 | static inline bool is_powersaving_dpms(int mode) | ||
1848 | { | ||
1849 | - return (mode != DRM_MODE_DPMS_ON); | ||
1850 | + return mode != DRM_MODE_DPMS_ON && mode != NV_DPMS_CLEARED; | ||
1851 | } | ||
1852 | |||
1853 | static void nv04_lvds_dpms(struct drm_encoder *encoder, int mode) | ||
1854 | diff --git a/drivers/gpu/drm/nouveau/nv10_fence.c b/drivers/gpu/drm/nouveau/nv10_fence.c | ||
1855 | index ce752bf..0b34d23 100644 | ||
1856 | --- a/drivers/gpu/drm/nouveau/nv10_fence.c | ||
1857 | +++ b/drivers/gpu/drm/nouveau/nv10_fence.c | ||
1858 | @@ -160,6 +160,13 @@ nv10_fence_destroy(struct nouveau_drm *drm) | ||
1859 | kfree(priv); | ||
1860 | } | ||
1861 | |||
1862 | +void nv17_fence_resume(struct nouveau_drm *drm) | ||
1863 | +{ | ||
1864 | + struct nv10_fence_priv *priv = drm->fence; | ||
1865 | + | ||
1866 | + nouveau_bo_wr32(priv->bo, 0, priv->sequence); | ||
1867 | +} | ||
1868 | + | ||
1869 | int | ||
1870 | nv10_fence_create(struct nouveau_drm *drm) | ||
1871 | { | ||
1872 | @@ -192,6 +199,7 @@ nv10_fence_create(struct nouveau_drm *drm) | ||
1873 | if (ret == 0) { | ||
1874 | nouveau_bo_wr32(priv->bo, 0x000, 0x00000000); | ||
1875 | priv->base.sync = nv17_fence_sync; | ||
1876 | + priv->base.resume = nv17_fence_resume; | ||
1877 | } | ||
1878 | } | ||
1879 | |||
1880 | diff --git a/drivers/gpu/drm/nouveau/nv50_fence.c b/drivers/gpu/drm/nouveau/nv50_fence.c | ||
1881 | index e0763ea..ecd22f5 100644 | ||
1882 | --- a/drivers/gpu/drm/nouveau/nv50_fence.c | ||
1883 | +++ b/drivers/gpu/drm/nouveau/nv50_fence.c | ||
1884 | @@ -119,6 +119,7 @@ nv50_fence_create(struct nouveau_drm *drm) | ||
1885 | if (ret == 0) { | ||
1886 | nouveau_bo_wr32(priv->bo, 0x000, 0x00000000); | ||
1887 | priv->base.sync = nv17_fence_sync; | ||
1888 | + priv->base.resume = nv17_fence_resume; | ||
1889 | } | ||
1890 | |||
1891 | if (ret) | ||
1892 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1893 | index 24d932f..9175615 100644 | ||
1894 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1895 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
1896 | @@ -561,6 +561,8 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | ||
1897 | /* use frac fb div on APUs */ | ||
1898 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)) | ||
1899 | radeon_crtc->pll_flags |= RADEON_PLL_USE_FRAC_FB_DIV; | ||
1900 | + if (ASIC_IS_DCE32(rdev) && mode->clock > 165000) | ||
1901 | + radeon_crtc->pll_flags |= RADEON_PLL_USE_FRAC_FB_DIV; | ||
1902 | } else { | ||
1903 | radeon_crtc->pll_flags |= RADEON_PLL_LEGACY; | ||
1904 | |||
1905 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
1906 | index 010bae1..4552d4a 100644 | ||
1907 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c | ||
1908 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
1909 | @@ -340,7 +340,7 @@ static bool radeon_atom_mode_fixup(struct drm_encoder *encoder, | ||
1910 | ((radeon_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) || | ||
1911 | (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE))) { | ||
1912 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
1913 | - radeon_dp_set_link_config(connector, mode); | ||
1914 | + radeon_dp_set_link_config(connector, adjusted_mode); | ||
1915 | } | ||
1916 | |||
1917 | return true; | ||
1918 | diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c | ||
1919 | index 219942c..18a5382 100644 | ||
1920 | --- a/drivers/gpu/drm/radeon/evergreen.c | ||
1921 | +++ b/drivers/gpu/drm/radeon/evergreen.c | ||
1922 | @@ -1821,7 +1821,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | ||
1923 | case CHIP_SUMO: | ||
1924 | rdev->config.evergreen.num_ses = 1; | ||
1925 | rdev->config.evergreen.max_pipes = 4; | ||
1926 | - rdev->config.evergreen.max_tile_pipes = 2; | ||
1927 | + rdev->config.evergreen.max_tile_pipes = 4; | ||
1928 | if (rdev->pdev->device == 0x9648) | ||
1929 | rdev->config.evergreen.max_simds = 3; | ||
1930 | else if ((rdev->pdev->device == 0x9647) || | ||
1931 | @@ -1844,7 +1844,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | ||
1932 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | ||
1933 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | ||
1934 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | ||
1935 | - gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN; | ||
1936 | + gb_addr_config = SUMO_GB_ADDR_CONFIG_GOLDEN; | ||
1937 | break; | ||
1938 | case CHIP_SUMO2: | ||
1939 | rdev->config.evergreen.num_ses = 1; | ||
1940 | @@ -1866,7 +1866,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | ||
1941 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | ||
1942 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | ||
1943 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | ||
1944 | - gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN; | ||
1945 | + gb_addr_config = SUMO2_GB_ADDR_CONFIG_GOLDEN; | ||
1946 | break; | ||
1947 | case CHIP_BARTS: | ||
1948 | rdev->config.evergreen.num_ses = 2; | ||
1949 | @@ -1914,7 +1914,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | ||
1950 | break; | ||
1951 | case CHIP_CAICOS: | ||
1952 | rdev->config.evergreen.num_ses = 1; | ||
1953 | - rdev->config.evergreen.max_pipes = 4; | ||
1954 | + rdev->config.evergreen.max_pipes = 2; | ||
1955 | rdev->config.evergreen.max_tile_pipes = 2; | ||
1956 | rdev->config.evergreen.max_simds = 2; | ||
1957 | rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses; | ||
1958 | @@ -3093,6 +3093,16 @@ restart_ih: | ||
1959 | break; | ||
1960 | } | ||
1961 | break; | ||
1962 | + case 146: | ||
1963 | + case 147: | ||
1964 | + dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data); | ||
1965 | + dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", | ||
1966 | + RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR)); | ||
1967 | + dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", | ||
1968 | + RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS)); | ||
1969 | + /* reset addr and status */ | ||
1970 | + WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1); | ||
1971 | + break; | ||
1972 | case 176: /* CP_INT in ring buffer */ | ||
1973 | case 177: /* CP_INT in IB1 */ | ||
1974 | case 178: /* CP_INT in IB2 */ | ||
1975 | diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c | ||
1976 | index c042e49..69ffae2 100644 | ||
1977 | --- a/drivers/gpu/drm/radeon/evergreen_cs.c | ||
1978 | +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | ||
1979 | @@ -2724,6 +2724,7 @@ static bool evergreen_vm_reg_valid(u32 reg) | ||
1980 | |||
1981 | /* check config regs */ | ||
1982 | switch (reg) { | ||
1983 | + case WAIT_UNTIL: | ||
1984 | case GRBM_GFX_INDEX: | ||
1985 | case CP_STRMOUT_CNTL: | ||
1986 | case CP_COHER_CNTL: | ||
1987 | diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h | ||
1988 | index 2bc0f6a..442732f 100644 | ||
1989 | --- a/drivers/gpu/drm/radeon/evergreend.h | ||
1990 | +++ b/drivers/gpu/drm/radeon/evergreend.h | ||
1991 | @@ -45,6 +45,8 @@ | ||
1992 | #define TURKS_GB_ADDR_CONFIG_GOLDEN 0x02010002 | ||
1993 | #define CEDAR_GB_ADDR_CONFIG_GOLDEN 0x02010001 | ||
1994 | #define CAICOS_GB_ADDR_CONFIG_GOLDEN 0x02010001 | ||
1995 | +#define SUMO_GB_ADDR_CONFIG_GOLDEN 0x02010002 | ||
1996 | +#define SUMO2_GB_ADDR_CONFIG_GOLDEN 0x02010002 | ||
1997 | |||
1998 | /* Registers */ | ||
1999 | |||
2000 | @@ -651,6 +653,7 @@ | ||
2001 | #define PAGE_TABLE_DEPTH(x) (((x) & 3) << 1) | ||
2002 | #define RANGE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 4) | ||
2003 | #define VM_CONTEXT1_CNTL 0x1414 | ||
2004 | +#define VM_CONTEXT1_CNTL2 0x1434 | ||
2005 | #define VM_CONTEXT0_PAGE_TABLE_BASE_ADDR 0x153C | ||
2006 | #define VM_CONTEXT0_PAGE_TABLE_END_ADDR 0x157C | ||
2007 | #define VM_CONTEXT0_PAGE_TABLE_START_ADDR 0x155C | ||
2008 | @@ -672,6 +675,8 @@ | ||
2009 | #define CACHE_UPDATE_MODE(x) ((x) << 6) | ||
2010 | #define VM_L2_STATUS 0x140C | ||
2011 | #define L2_BUSY (1 << 0) | ||
2012 | +#define VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x14FC | ||
2013 | +#define VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x14DC | ||
2014 | |||
2015 | #define WAIT_UNTIL 0x8040 | ||
2016 | |||
2017 | diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c | ||
2018 | index 81e6a56..30c18a6 100644 | ||
2019 | --- a/drivers/gpu/drm/radeon/ni.c | ||
2020 | +++ b/drivers/gpu/drm/radeon/ni.c | ||
2021 | @@ -784,10 +784,20 @@ static int cayman_pcie_gart_enable(struct radeon_device *rdev) | ||
2022 | /* enable context1-7 */ | ||
2023 | WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR, | ||
2024 | (u32)(rdev->dummy_page.addr >> 12)); | ||
2025 | - WREG32(VM_CONTEXT1_CNTL2, 0); | ||
2026 | - WREG32(VM_CONTEXT1_CNTL, 0); | ||
2027 | + WREG32(VM_CONTEXT1_CNTL2, 4); | ||
2028 | WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) | | ||
2029 | - RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); | ||
2030 | + RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2031 | + RANGE_PROTECTION_FAULT_ENABLE_DEFAULT | | ||
2032 | + DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2033 | + DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT | | ||
2034 | + PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2035 | + PDE0_PROTECTION_FAULT_ENABLE_DEFAULT | | ||
2036 | + VALID_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2037 | + VALID_PROTECTION_FAULT_ENABLE_DEFAULT | | ||
2038 | + READ_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2039 | + READ_PROTECTION_FAULT_ENABLE_DEFAULT | | ||
2040 | + WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2041 | + WRITE_PROTECTION_FAULT_ENABLE_DEFAULT); | ||
2042 | |||
2043 | cayman_pcie_gart_tlb_flush(rdev); | ||
2044 | DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", | ||
2045 | diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h | ||
2046 | index cbef681..f5e54a7 100644 | ||
2047 | --- a/drivers/gpu/drm/radeon/nid.h | ||
2048 | +++ b/drivers/gpu/drm/radeon/nid.h | ||
2049 | @@ -80,7 +80,18 @@ | ||
2050 | #define VM_CONTEXT0_CNTL 0x1410 | ||
2051 | #define ENABLE_CONTEXT (1 << 0) | ||
2052 | #define PAGE_TABLE_DEPTH(x) (((x) & 3) << 1) | ||
2053 | +#define RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 3) | ||
2054 | #define RANGE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 4) | ||
2055 | +#define DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 6) | ||
2056 | +#define DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 7) | ||
2057 | +#define PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 9) | ||
2058 | +#define PDE0_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 10) | ||
2059 | +#define VALID_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 12) | ||
2060 | +#define VALID_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 13) | ||
2061 | +#define READ_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 15) | ||
2062 | +#define READ_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 16) | ||
2063 | +#define WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 18) | ||
2064 | +#define WRITE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 19) | ||
2065 | #define VM_CONTEXT1_CNTL 0x1414 | ||
2066 | #define VM_CONTEXT0_CNTL2 0x1430 | ||
2067 | #define VM_CONTEXT1_CNTL2 0x1434 | ||
2068 | diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h | ||
2069 | index 8c42d54..b3f1459 100644 | ||
2070 | --- a/drivers/gpu/drm/radeon/radeon.h | ||
2071 | +++ b/drivers/gpu/drm/radeon/radeon.h | ||
2072 | @@ -220,12 +220,13 @@ struct radeon_fence { | ||
2073 | int radeon_fence_driver_start_ring(struct radeon_device *rdev, int ring); | ||
2074 | int radeon_fence_driver_init(struct radeon_device *rdev); | ||
2075 | void radeon_fence_driver_fini(struct radeon_device *rdev); | ||
2076 | +void radeon_fence_driver_force_completion(struct radeon_device *rdev); | ||
2077 | int radeon_fence_emit(struct radeon_device *rdev, struct radeon_fence **fence, int ring); | ||
2078 | void radeon_fence_process(struct radeon_device *rdev, int ring); | ||
2079 | bool radeon_fence_signaled(struct radeon_fence *fence); | ||
2080 | int radeon_fence_wait(struct radeon_fence *fence, bool interruptible); | ||
2081 | int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring); | ||
2082 | -void radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring); | ||
2083 | +int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring); | ||
2084 | int radeon_fence_wait_any(struct radeon_device *rdev, | ||
2085 | struct radeon_fence **fences, | ||
2086 | bool intr); | ||
2087 | diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c | ||
2088 | index 45b660b..ced9a81 100644 | ||
2089 | --- a/drivers/gpu/drm/radeon/radeon_combios.c | ||
2090 | +++ b/drivers/gpu/drm/radeon/radeon_combios.c | ||
2091 | @@ -1548,6 +1548,9 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | ||
2092 | of_machine_is_compatible("PowerBook6,7")) { | ||
2093 | /* ibook */ | ||
2094 | rdev->mode_info.connector_table = CT_IBOOK; | ||
2095 | + } else if (of_machine_is_compatible("PowerMac3,5")) { | ||
2096 | + /* PowerMac G4 Silver radeon 7500 */ | ||
2097 | + rdev->mode_info.connector_table = CT_MAC_G4_SILVER; | ||
2098 | } else if (of_machine_is_compatible("PowerMac4,4")) { | ||
2099 | /* emac */ | ||
2100 | rdev->mode_info.connector_table = CT_EMAC; | ||
2101 | @@ -2212,6 +2215,54 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | ||
2102 | CONNECTOR_OBJECT_ID_SVIDEO, | ||
2103 | &hpd); | ||
2104 | break; | ||
2105 | + case CT_MAC_G4_SILVER: | ||
2106 | + DRM_INFO("Connector Table: %d (mac g4 silver)\n", | ||
2107 | + rdev->mode_info.connector_table); | ||
2108 | + /* DVI-I - tv dac, int tmds */ | ||
2109 | + ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0); | ||
2110 | + hpd.hpd = RADEON_HPD_1; /* ??? */ | ||
2111 | + radeon_add_legacy_encoder(dev, | ||
2112 | + radeon_get_encoder_enum(dev, | ||
2113 | + ATOM_DEVICE_DFP1_SUPPORT, | ||
2114 | + 0), | ||
2115 | + ATOM_DEVICE_DFP1_SUPPORT); | ||
2116 | + radeon_add_legacy_encoder(dev, | ||
2117 | + radeon_get_encoder_enum(dev, | ||
2118 | + ATOM_DEVICE_CRT2_SUPPORT, | ||
2119 | + 2), | ||
2120 | + ATOM_DEVICE_CRT2_SUPPORT); | ||
2121 | + radeon_add_legacy_connector(dev, 0, | ||
2122 | + ATOM_DEVICE_DFP1_SUPPORT | | ||
2123 | + ATOM_DEVICE_CRT2_SUPPORT, | ||
2124 | + DRM_MODE_CONNECTOR_DVII, &ddc_i2c, | ||
2125 | + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, | ||
2126 | + &hpd); | ||
2127 | + /* VGA - primary dac */ | ||
2128 | + ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0); | ||
2129 | + hpd.hpd = RADEON_HPD_NONE; | ||
2130 | + radeon_add_legacy_encoder(dev, | ||
2131 | + radeon_get_encoder_enum(dev, | ||
2132 | + ATOM_DEVICE_CRT1_SUPPORT, | ||
2133 | + 1), | ||
2134 | + ATOM_DEVICE_CRT1_SUPPORT); | ||
2135 | + radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT1_SUPPORT, | ||
2136 | + DRM_MODE_CONNECTOR_VGA, &ddc_i2c, | ||
2137 | + CONNECTOR_OBJECT_ID_VGA, | ||
2138 | + &hpd); | ||
2139 | + /* TV - TV DAC */ | ||
2140 | + ddc_i2c.valid = false; | ||
2141 | + hpd.hpd = RADEON_HPD_NONE; | ||
2142 | + radeon_add_legacy_encoder(dev, | ||
2143 | + radeon_get_encoder_enum(dev, | ||
2144 | + ATOM_DEVICE_TV1_SUPPORT, | ||
2145 | + 2), | ||
2146 | + ATOM_DEVICE_TV1_SUPPORT); | ||
2147 | + radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, | ||
2148 | + DRM_MODE_CONNECTOR_SVIDEO, | ||
2149 | + &ddc_i2c, | ||
2150 | + CONNECTOR_OBJECT_ID_SVIDEO, | ||
2151 | + &hpd); | ||
2152 | + break; | ||
2153 | default: | ||
2154 | DRM_INFO("Connector table: %d (invalid)\n", | ||
2155 | rdev->mode_info.connector_table); | ||
2156 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
2157 | index b884c36..810268b 100644 | ||
2158 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c | ||
2159 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
2160 | @@ -741,7 +741,7 @@ radeon_vga_detect(struct drm_connector *connector, bool force) | ||
2161 | ret = connector_status_disconnected; | ||
2162 | |||
2163 | if (radeon_connector->ddc_bus) | ||
2164 | - dret = radeon_ddc_probe(radeon_connector); | ||
2165 | + dret = radeon_ddc_probe(radeon_connector, false); | ||
2166 | if (dret) { | ||
2167 | radeon_connector->detected_by_load = false; | ||
2168 | if (radeon_connector->edid) { | ||
2169 | @@ -947,7 +947,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | ||
2170 | return connector->status; | ||
2171 | |||
2172 | if (radeon_connector->ddc_bus) | ||
2173 | - dret = radeon_ddc_probe(radeon_connector); | ||
2174 | + dret = radeon_ddc_probe(radeon_connector, false); | ||
2175 | if (dret) { | ||
2176 | radeon_connector->detected_by_load = false; | ||
2177 | if (radeon_connector->edid) { | ||
2178 | @@ -1401,7 +1401,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | ||
2179 | if (encoder) { | ||
2180 | /* setup ddc on the bridge */ | ||
2181 | radeon_atom_ext_encoder_setup_ddc(encoder); | ||
2182 | - if (radeon_ddc_probe(radeon_connector)) /* try DDC */ | ||
2183 | + /* bridge chips are always aux */ | ||
2184 | + if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */ | ||
2185 | ret = connector_status_connected; | ||
2186 | else if (radeon_connector->dac_load_detect) { /* try load detection */ | ||
2187 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; | ||
2188 | @@ -1419,7 +1420,8 @@ radeon_dp_detect(struct drm_connector *connector, bool force) | ||
2189 | if (radeon_dp_getdpcd(radeon_connector)) | ||
2190 | ret = connector_status_connected; | ||
2191 | } else { | ||
2192 | - if (radeon_ddc_probe(radeon_connector)) | ||
2193 | + /* try non-aux ddc (DP to DVI/HMDI/etc. adapter) */ | ||
2194 | + if (radeon_ddc_probe(radeon_connector, false)) | ||
2195 | ret = connector_status_connected; | ||
2196 | } | ||
2197 | } | ||
2198 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c | ||
2199 | index e2f5f88..ad4c973 100644 | ||
2200 | --- a/drivers/gpu/drm/radeon/radeon_device.c | ||
2201 | +++ b/drivers/gpu/drm/radeon/radeon_device.c | ||
2202 | @@ -1163,6 +1163,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | ||
2203 | struct drm_crtc *crtc; | ||
2204 | struct drm_connector *connector; | ||
2205 | int i, r; | ||
2206 | + bool force_completion = false; | ||
2207 | |||
2208 | if (dev == NULL || dev->dev_private == NULL) { | ||
2209 | return -ENODEV; | ||
2210 | @@ -1205,8 +1206,16 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | ||
2211 | |||
2212 | mutex_lock(&rdev->ring_lock); | ||
2213 | /* wait for gpu to finish processing current batch */ | ||
2214 | - for (i = 0; i < RADEON_NUM_RINGS; i++) | ||
2215 | - radeon_fence_wait_empty_locked(rdev, i); | ||
2216 | + for (i = 0; i < RADEON_NUM_RINGS; i++) { | ||
2217 | + r = radeon_fence_wait_empty_locked(rdev, i); | ||
2218 | + if (r) { | ||
2219 | + /* delay GPU reset to resume */ | ||
2220 | + force_completion = true; | ||
2221 | + } | ||
2222 | + } | ||
2223 | + if (force_completion) { | ||
2224 | + radeon_fence_driver_force_completion(rdev); | ||
2225 | + } | ||
2226 | mutex_unlock(&rdev->ring_lock); | ||
2227 | |||
2228 | radeon_save_bios_scratch_regs(rdev); | ||
2229 | @@ -1337,7 +1346,6 @@ retry: | ||
2230 | } | ||
2231 | |||
2232 | radeon_restore_bios_scratch_regs(rdev); | ||
2233 | - drm_helper_resume_force_mode(rdev->ddev); | ||
2234 | |||
2235 | if (!r) { | ||
2236 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { | ||
2237 | @@ -1357,11 +1365,14 @@ retry: | ||
2238 | } | ||
2239 | } | ||
2240 | } else { | ||
2241 | + radeon_fence_driver_force_completion(rdev); | ||
2242 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { | ||
2243 | kfree(ring_data[i]); | ||
2244 | } | ||
2245 | } | ||
2246 | |||
2247 | + drm_helper_resume_force_mode(rdev->ddev); | ||
2248 | + | ||
2249 | ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched); | ||
2250 | if (r) { | ||
2251 | /* bad news, how to tell it to userspace ? */ | ||
2252 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c | ||
2253 | index bfa2a60..2bddddd 100644 | ||
2254 | --- a/drivers/gpu/drm/radeon/radeon_display.c | ||
2255 | +++ b/drivers/gpu/drm/radeon/radeon_display.c | ||
2256 | @@ -695,10 +695,15 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector) | ||
2257 | if (radeon_connector->router.ddc_valid) | ||
2258 | radeon_router_select_ddc_port(radeon_connector); | ||
2259 | |||
2260 | - if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || | ||
2261 | - (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) || | ||
2262 | - (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) != | ||
2263 | - ENCODER_OBJECT_ID_NONE)) { | ||
2264 | + if (radeon_connector_encoder_get_dp_bridge_encoder_id(&radeon_connector->base) != | ||
2265 | + ENCODER_OBJECT_ID_NONE) { | ||
2266 | + struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | ||
2267 | + | ||
2268 | + if (dig->dp_i2c_bus) | ||
2269 | + radeon_connector->edid = drm_get_edid(&radeon_connector->base, | ||
2270 | + &dig->dp_i2c_bus->adapter); | ||
2271 | + } else if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) || | ||
2272 | + (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) { | ||
2273 | struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | ||
2274 | |||
2275 | if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT || | ||
2276 | diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c | ||
2277 | index 22bd6c2..28c09b6 100644 | ||
2278 | --- a/drivers/gpu/drm/radeon/radeon_fence.c | ||
2279 | +++ b/drivers/gpu/drm/radeon/radeon_fence.c | ||
2280 | @@ -609,26 +609,20 @@ int radeon_fence_wait_next_locked(struct radeon_device *rdev, int ring) | ||
2281 | * Returns 0 if the fences have passed, error for all other cases. | ||
2282 | * Caller must hold ring lock. | ||
2283 | */ | ||
2284 | -void radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring) | ||
2285 | +int radeon_fence_wait_empty_locked(struct radeon_device *rdev, int ring) | ||
2286 | { | ||
2287 | uint64_t seq = rdev->fence_drv[ring].sync_seq[ring]; | ||
2288 | + int r; | ||
2289 | |||
2290 | - while(1) { | ||
2291 | - int r; | ||
2292 | - r = radeon_fence_wait_seq(rdev, seq, ring, false, false); | ||
2293 | + r = radeon_fence_wait_seq(rdev, seq, ring, false, false); | ||
2294 | + if (r) { | ||
2295 | if (r == -EDEADLK) { | ||
2296 | - mutex_unlock(&rdev->ring_lock); | ||
2297 | - r = radeon_gpu_reset(rdev); | ||
2298 | - mutex_lock(&rdev->ring_lock); | ||
2299 | - if (!r) | ||
2300 | - continue; | ||
2301 | - } | ||
2302 | - if (r) { | ||
2303 | - dev_err(rdev->dev, "error waiting for ring to become" | ||
2304 | - " idle (%d)\n", r); | ||
2305 | + return -EDEADLK; | ||
2306 | } | ||
2307 | - return; | ||
2308 | + dev_err(rdev->dev, "error waiting for ring[%d] to become idle (%d)\n", | ||
2309 | + ring, r); | ||
2310 | } | ||
2311 | + return 0; | ||
2312 | } | ||
2313 | |||
2314 | /** | ||
2315 | @@ -854,13 +848,17 @@ int radeon_fence_driver_init(struct radeon_device *rdev) | ||
2316 | */ | ||
2317 | void radeon_fence_driver_fini(struct radeon_device *rdev) | ||
2318 | { | ||
2319 | - int ring; | ||
2320 | + int ring, r; | ||
2321 | |||
2322 | mutex_lock(&rdev->ring_lock); | ||
2323 | for (ring = 0; ring < RADEON_NUM_RINGS; ring++) { | ||
2324 | if (!rdev->fence_drv[ring].initialized) | ||
2325 | continue; | ||
2326 | - radeon_fence_wait_empty_locked(rdev, ring); | ||
2327 | + r = radeon_fence_wait_empty_locked(rdev, ring); | ||
2328 | + if (r) { | ||
2329 | + /* no need to trigger GPU reset as we are unloading */ | ||
2330 | + radeon_fence_driver_force_completion(rdev); | ||
2331 | + } | ||
2332 | wake_up_all(&rdev->fence_queue); | ||
2333 | radeon_scratch_free(rdev, rdev->fence_drv[ring].scratch_reg); | ||
2334 | rdev->fence_drv[ring].initialized = false; | ||
2335 | @@ -868,6 +866,25 @@ void radeon_fence_driver_fini(struct radeon_device *rdev) | ||
2336 | mutex_unlock(&rdev->ring_lock); | ||
2337 | } | ||
2338 | |||
2339 | +/** | ||
2340 | + * radeon_fence_driver_force_completion - force all fence waiter to complete | ||
2341 | + * | ||
2342 | + * @rdev: radeon device pointer | ||
2343 | + * | ||
2344 | + * In case of GPU reset failure make sure no process keep waiting on fence | ||
2345 | + * that will never complete. | ||
2346 | + */ | ||
2347 | +void radeon_fence_driver_force_completion(struct radeon_device *rdev) | ||
2348 | +{ | ||
2349 | + int ring; | ||
2350 | + | ||
2351 | + for (ring = 0; ring < RADEON_NUM_RINGS; ring++) { | ||
2352 | + if (!rdev->fence_drv[ring].initialized) | ||
2353 | + continue; | ||
2354 | + radeon_fence_write(rdev, rdev->fence_drv[ring].sync_seq[ring], ring); | ||
2355 | + } | ||
2356 | +} | ||
2357 | + | ||
2358 | |||
2359 | /* | ||
2360 | * Fence debugfs | ||
2361 | diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c | ||
2362 | index c5bddd6..fc60b74 100644 | ||
2363 | --- a/drivers/gpu/drm/radeon/radeon_i2c.c | ||
2364 | +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | ||
2365 | @@ -39,7 +39,7 @@ extern u32 radeon_atom_hw_i2c_func(struct i2c_adapter *adap); | ||
2366 | * radeon_ddc_probe | ||
2367 | * | ||
2368 | */ | ||
2369 | -bool radeon_ddc_probe(struct radeon_connector *radeon_connector) | ||
2370 | +bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux) | ||
2371 | { | ||
2372 | u8 out = 0x0; | ||
2373 | u8 buf[8]; | ||
2374 | @@ -63,7 +63,13 @@ bool radeon_ddc_probe(struct radeon_connector *radeon_connector) | ||
2375 | if (radeon_connector->router.ddc_valid) | ||
2376 | radeon_router_select_ddc_port(radeon_connector); | ||
2377 | |||
2378 | - ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); | ||
2379 | + if (use_aux) { | ||
2380 | + struct radeon_connector_atom_dig *dig = radeon_connector->con_priv; | ||
2381 | + ret = i2c_transfer(&dig->dp_i2c_bus->adapter, msgs, 2); | ||
2382 | + } else { | ||
2383 | + ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2); | ||
2384 | + } | ||
2385 | + | ||
2386 | if (ret != 2) | ||
2387 | /* Couldn't find an accessible DDC on this connector */ | ||
2388 | return false; | ||
2389 | diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | ||
2390 | index f5ba224..62cd512 100644 | ||
2391 | --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | ||
2392 | +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | ||
2393 | @@ -640,6 +640,14 @@ static enum drm_connector_status radeon_legacy_primary_dac_detect(struct drm_enc | ||
2394 | enum drm_connector_status found = connector_status_disconnected; | ||
2395 | bool color = true; | ||
2396 | |||
2397 | + /* just don't bother on RN50 those chip are often connected to remoting | ||
2398 | + * console hw and often we get failure to load detect those. So to make | ||
2399 | + * everyone happy report the encoder as always connected. | ||
2400 | + */ | ||
2401 | + if (ASIC_IS_RN50(rdev)) { | ||
2402 | + return connector_status_connected; | ||
2403 | + } | ||
2404 | + | ||
2405 | /* save the regs we need */ | ||
2406 | vclk_ecp_cntl = RREG32_PLL(RADEON_VCLK_ECP_CNTL); | ||
2407 | crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); | ||
2408 | diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h | ||
2409 | index 92c5f47..a9c3f06 100644 | ||
2410 | --- a/drivers/gpu/drm/radeon/radeon_mode.h | ||
2411 | +++ b/drivers/gpu/drm/radeon/radeon_mode.h | ||
2412 | @@ -209,7 +209,8 @@ enum radeon_connector_table { | ||
2413 | CT_RN50_POWER, | ||
2414 | CT_MAC_X800, | ||
2415 | CT_MAC_G5_9600, | ||
2416 | - CT_SAM440EP | ||
2417 | + CT_SAM440EP, | ||
2418 | + CT_MAC_G4_SILVER | ||
2419 | }; | ||
2420 | |||
2421 | enum radeon_dvo_chip { | ||
2422 | @@ -558,7 +559,7 @@ extern void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c, | ||
2423 | u8 val); | ||
2424 | extern void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector); | ||
2425 | extern void radeon_router_select_cd_port(struct radeon_connector *radeon_connector); | ||
2426 | -extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector); | ||
2427 | +extern bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux); | ||
2428 | extern int radeon_ddc_get_modes(struct radeon_connector *radeon_connector); | ||
2429 | |||
2430 | extern struct drm_encoder *radeon_best_encoder(struct drm_connector *connector); | ||
2431 | diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c | ||
2432 | index aa14dbb..0bfa656 100644 | ||
2433 | --- a/drivers/gpu/drm/radeon/radeon_pm.c | ||
2434 | +++ b/drivers/gpu/drm/radeon/radeon_pm.c | ||
2435 | @@ -234,7 +234,7 @@ static void radeon_set_power_state(struct radeon_device *rdev) | ||
2436 | |||
2437 | static void radeon_pm_set_clocks(struct radeon_device *rdev) | ||
2438 | { | ||
2439 | - int i; | ||
2440 | + int i, r; | ||
2441 | |||
2442 | /* no need to take locks, etc. if nothing's going to change */ | ||
2443 | if ((rdev->pm.requested_clock_mode_index == rdev->pm.current_clock_mode_index) && | ||
2444 | @@ -248,8 +248,17 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev) | ||
2445 | /* wait for the rings to drain */ | ||
2446 | for (i = 0; i < RADEON_NUM_RINGS; i++) { | ||
2447 | struct radeon_ring *ring = &rdev->ring[i]; | ||
2448 | - if (ring->ready) | ||
2449 | - radeon_fence_wait_empty_locked(rdev, i); | ||
2450 | + if (!ring->ready) { | ||
2451 | + continue; | ||
2452 | + } | ||
2453 | + r = radeon_fence_wait_empty_locked(rdev, i); | ||
2454 | + if (r) { | ||
2455 | + /* needs a GPU reset dont reset here */ | ||
2456 | + mutex_unlock(&rdev->ring_lock); | ||
2457 | + up_write(&rdev->pm.mclk_lock); | ||
2458 | + mutex_unlock(&rdev->ddev->struct_mutex); | ||
2459 | + return; | ||
2460 | + } | ||
2461 | } | ||
2462 | |||
2463 | radeon_unmap_vram_bos(rdev); | ||
2464 | diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c | ||
2465 | index e095218..26c23bb 100644 | ||
2466 | --- a/drivers/gpu/drm/radeon/radeon_prime.c | ||
2467 | +++ b/drivers/gpu/drm/radeon/radeon_prime.c | ||
2468 | @@ -194,6 +194,7 @@ struct drm_gem_object *radeon_gem_prime_import(struct drm_device *dev, | ||
2469 | bo = dma_buf->priv; | ||
2470 | if (bo->gem_base.dev == dev) { | ||
2471 | drm_gem_object_reference(&bo->gem_base); | ||
2472 | + dma_buf_put(dma_buf); | ||
2473 | return &bo->gem_base; | ||
2474 | } | ||
2475 | } | ||
2476 | diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c | ||
2477 | index 4422d63..c4d9eb6 100644 | ||
2478 | --- a/drivers/gpu/drm/radeon/si.c | ||
2479 | +++ b/drivers/gpu/drm/radeon/si.c | ||
2480 | @@ -2426,9 +2426,20 @@ static int si_pcie_gart_enable(struct radeon_device *rdev) | ||
2481 | /* enable context1-15 */ | ||
2482 | WREG32(VM_CONTEXT1_PROTECTION_FAULT_DEFAULT_ADDR, | ||
2483 | (u32)(rdev->dummy_page.addr >> 12)); | ||
2484 | - WREG32(VM_CONTEXT1_CNTL2, 0); | ||
2485 | + WREG32(VM_CONTEXT1_CNTL2, 4); | ||
2486 | WREG32(VM_CONTEXT1_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(1) | | ||
2487 | - RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); | ||
2488 | + RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2489 | + RANGE_PROTECTION_FAULT_ENABLE_DEFAULT | | ||
2490 | + DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2491 | + DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT | | ||
2492 | + PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2493 | + PDE0_PROTECTION_FAULT_ENABLE_DEFAULT | | ||
2494 | + VALID_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2495 | + VALID_PROTECTION_FAULT_ENABLE_DEFAULT | | ||
2496 | + READ_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2497 | + READ_PROTECTION_FAULT_ENABLE_DEFAULT | | ||
2498 | + WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT | | ||
2499 | + WRITE_PROTECTION_FAULT_ENABLE_DEFAULT); | ||
2500 | |||
2501 | si_pcie_gart_tlb_flush(rdev); | ||
2502 | DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", | ||
2503 | @@ -3684,6 +3695,16 @@ restart_ih: | ||
2504 | break; | ||
2505 | } | ||
2506 | break; | ||
2507 | + case 146: | ||
2508 | + case 147: | ||
2509 | + dev_err(rdev->dev, "GPU fault detected: %d 0x%08x\n", src_id, src_data); | ||
2510 | + dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x%08X\n", | ||
2511 | + RREG32(VM_CONTEXT1_PROTECTION_FAULT_ADDR)); | ||
2512 | + dev_err(rdev->dev, " VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x%08X\n", | ||
2513 | + RREG32(VM_CONTEXT1_PROTECTION_FAULT_STATUS)); | ||
2514 | + /* reset addr and status */ | ||
2515 | + WREG32_P(VM_CONTEXT1_CNTL2, 1, ~1); | ||
2516 | + break; | ||
2517 | case 176: /* RINGID0 CP_INT */ | ||
2518 | radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX); | ||
2519 | break; | ||
2520 | diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h | ||
2521 | index a8871af..53b4d45 100644 | ||
2522 | --- a/drivers/gpu/drm/radeon/sid.h | ||
2523 | +++ b/drivers/gpu/drm/radeon/sid.h | ||
2524 | @@ -91,7 +91,18 @@ | ||
2525 | #define VM_CONTEXT0_CNTL 0x1410 | ||
2526 | #define ENABLE_CONTEXT (1 << 0) | ||
2527 | #define PAGE_TABLE_DEPTH(x) (((x) & 3) << 1) | ||
2528 | +#define RANGE_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 3) | ||
2529 | #define RANGE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 4) | ||
2530 | +#define DUMMY_PAGE_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 6) | ||
2531 | +#define DUMMY_PAGE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 7) | ||
2532 | +#define PDE0_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 9) | ||
2533 | +#define PDE0_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 10) | ||
2534 | +#define VALID_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 12) | ||
2535 | +#define VALID_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 13) | ||
2536 | +#define READ_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 15) | ||
2537 | +#define READ_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 16) | ||
2538 | +#define WRITE_PROTECTION_FAULT_ENABLE_INTERRUPT (1 << 18) | ||
2539 | +#define WRITE_PROTECTION_FAULT_ENABLE_DEFAULT (1 << 19) | ||
2540 | #define VM_CONTEXT1_CNTL 0x1414 | ||
2541 | #define VM_CONTEXT0_CNTL2 0x1430 | ||
2542 | #define VM_CONTEXT1_CNTL2 0x1434 | ||
2543 | @@ -104,6 +115,9 @@ | ||
2544 | #define VM_CONTEXT14_PAGE_TABLE_BASE_ADDR 0x1450 | ||
2545 | #define VM_CONTEXT15_PAGE_TABLE_BASE_ADDR 0x1454 | ||
2546 | |||
2547 | +#define VM_CONTEXT1_PROTECTION_FAULT_ADDR 0x14FC | ||
2548 | +#define VM_CONTEXT1_PROTECTION_FAULT_STATUS 0x14DC | ||
2549 | + | ||
2550 | #define VM_INVALIDATE_REQUEST 0x1478 | ||
2551 | #define VM_INVALIDATE_RESPONSE 0x147c | ||
2552 | |||
2553 | diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c | ||
2554 | index b3b2ced..6d7acf4 100644 | ||
2555 | --- a/drivers/gpu/drm/udl/udl_connector.c | ||
2556 | +++ b/drivers/gpu/drm/udl/udl_connector.c | ||
2557 | @@ -22,13 +22,17 @@ | ||
2558 | static u8 *udl_get_edid(struct udl_device *udl) | ||
2559 | { | ||
2560 | u8 *block; | ||
2561 | - char rbuf[3]; | ||
2562 | + char *rbuf; | ||
2563 | int ret, i; | ||
2564 | |||
2565 | block = kmalloc(EDID_LENGTH, GFP_KERNEL); | ||
2566 | if (block == NULL) | ||
2567 | return NULL; | ||
2568 | |||
2569 | + rbuf = kmalloc(2, GFP_KERNEL); | ||
2570 | + if (rbuf == NULL) | ||
2571 | + goto error; | ||
2572 | + | ||
2573 | for (i = 0; i < EDID_LENGTH; i++) { | ||
2574 | ret = usb_control_msg(udl->ddev->usbdev, | ||
2575 | usb_rcvctrlpipe(udl->ddev->usbdev, 0), (0x02), | ||
2576 | @@ -36,16 +40,17 @@ static u8 *udl_get_edid(struct udl_device *udl) | ||
2577 | HZ); | ||
2578 | if (ret < 1) { | ||
2579 | DRM_ERROR("Read EDID byte %d failed err %x\n", i, ret); | ||
2580 | - i--; | ||
2581 | goto error; | ||
2582 | } | ||
2583 | block[i] = rbuf[1]; | ||
2584 | } | ||
2585 | |||
2586 | + kfree(rbuf); | ||
2587 | return block; | ||
2588 | |||
2589 | error: | ||
2590 | kfree(block); | ||
2591 | + kfree(rbuf); | ||
2592 | return NULL; | ||
2593 | } | ||
2594 | |||
2595 | @@ -57,6 +62,14 @@ static int udl_get_modes(struct drm_connector *connector) | ||
2596 | |||
2597 | edid = (struct edid *)udl_get_edid(udl); | ||
2598 | |||
2599 | + /* | ||
2600 | + * We only read the main block, but if the monitor reports extension | ||
2601 | + * blocks then the drm edid code expects them to be present, so patch | ||
2602 | + * the extension count to 0. | ||
2603 | + */ | ||
2604 | + edid->checksum += edid->extensions; | ||
2605 | + edid->extensions = 0; | ||
2606 | + | ||
2607 | drm_mode_connector_update_edid_property(connector, edid); | ||
2608 | ret = drm_add_edid_modes(connector, edid); | ||
2609 | kfree(edid); | ||
2610 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | ||
2611 | index 9d7a428..1ef9a9e 100644 | ||
2612 | --- a/drivers/hid/hid-ids.h | ||
2613 | +++ b/drivers/hid/hid-ids.h | ||
2614 | @@ -696,6 +696,9 @@ | ||
2615 | #define USB_VENDOR_ID_SIGMA_MICRO 0x1c4f | ||
2616 | #define USB_DEVICE_ID_SIGMA_MICRO_KEYBOARD 0x0002 | ||
2617 | |||
2618 | +#define USB_VENDOR_ID_SIGMATEL 0x066F | ||
2619 | +#define USB_DEVICE_ID_SIGMATEL_STMP3780 0x3780 | ||
2620 | + | ||
2621 | #define USB_VENDOR_ID_SKYCABLE 0x1223 | ||
2622 | #define USB_DEVICE_ID_SKYCABLE_WIRELESS_PRESENTER 0x3F07 | ||
2623 | |||
2624 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c | ||
2625 | index 11c7932..0a1429f 100644 | ||
2626 | --- a/drivers/hid/usbhid/hid-quirks.c | ||
2627 | +++ b/drivers/hid/usbhid/hid-quirks.c | ||
2628 | @@ -79,6 +79,7 @@ static const struct hid_blacklist { | ||
2629 | { USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001, HID_QUIRK_NOGET }, | ||
2630 | { USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3008, HID_QUIRK_NOGET }, | ||
2631 | { USB_VENDOR_ID_SENNHEISER, USB_DEVICE_ID_SENNHEISER_BTD500USB, HID_QUIRK_NOGET }, | ||
2632 | + { USB_VENDOR_ID_SIGMATEL, USB_DEVICE_ID_SIGMATEL_STMP3780, HID_QUIRK_NOGET }, | ||
2633 | { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, | ||
2634 | { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_1, HID_QUIRK_NOGET }, | ||
2635 | { USB_VENDOR_ID_SYMBOL, USB_DEVICE_ID_SYMBOL_SCANNER_2, HID_QUIRK_NOGET }, | ||
2636 | diff --git a/drivers/hwmon/lm73.c b/drivers/hwmon/lm73.c | ||
2637 | index 8fa2632..7272176 100644 | ||
2638 | --- a/drivers/hwmon/lm73.c | ||
2639 | +++ b/drivers/hwmon/lm73.c | ||
2640 | @@ -49,6 +49,7 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da, | ||
2641 | struct i2c_client *client = to_i2c_client(dev); | ||
2642 | long temp; | ||
2643 | short value; | ||
2644 | + s32 err; | ||
2645 | |||
2646 | int status = kstrtol(buf, 10, &temp); | ||
2647 | if (status < 0) | ||
2648 | @@ -57,8 +58,8 @@ static ssize_t set_temp(struct device *dev, struct device_attribute *da, | ||
2649 | /* Write value */ | ||
2650 | value = (short) SENSORS_LIMIT(temp/250, (LM73_TEMP_MIN*4), | ||
2651 | (LM73_TEMP_MAX*4)) << 5; | ||
2652 | - i2c_smbus_write_word_swapped(client, attr->index, value); | ||
2653 | - return count; | ||
2654 | + err = i2c_smbus_write_word_swapped(client, attr->index, value); | ||
2655 | + return (err < 0) ? err : count; | ||
2656 | } | ||
2657 | |||
2658 | static ssize_t show_temp(struct device *dev, struct device_attribute *da, | ||
2659 | @@ -66,11 +67,16 @@ static ssize_t show_temp(struct device *dev, struct device_attribute *da, | ||
2660 | { | ||
2661 | struct sensor_device_attribute *attr = to_sensor_dev_attr(da); | ||
2662 | struct i2c_client *client = to_i2c_client(dev); | ||
2663 | + int temp; | ||
2664 | + | ||
2665 | + s32 err = i2c_smbus_read_word_swapped(client, attr->index); | ||
2666 | + if (err < 0) | ||
2667 | + return err; | ||
2668 | + | ||
2669 | /* use integer division instead of equivalent right shift to | ||
2670 | guarantee arithmetic shift and preserve the sign */ | ||
2671 | - int temp = ((s16) (i2c_smbus_read_word_swapped(client, | ||
2672 | - attr->index))*250) / 32; | ||
2673 | - return sprintf(buf, "%d\n", temp); | ||
2674 | + temp = (((s16) err) * 250) / 32; | ||
2675 | + return scnprintf(buf, PAGE_SIZE, "%d\n", temp); | ||
2676 | } | ||
2677 | |||
2678 | |||
2679 | diff --git a/drivers/infiniband/hw/mlx4/cm.c b/drivers/infiniband/hw/mlx4/cm.c | ||
2680 | index 80079e5..dbc99d4 100644 | ||
2681 | --- a/drivers/infiniband/hw/mlx4/cm.c | ||
2682 | +++ b/drivers/infiniband/hw/mlx4/cm.c | ||
2683 | @@ -268,15 +268,15 @@ static void schedule_delayed(struct ib_device *ibdev, struct id_map_entry *id) | ||
2684 | struct mlx4_ib_sriov *sriov = &to_mdev(ibdev)->sriov; | ||
2685 | unsigned long flags; | ||
2686 | |||
2687 | - spin_lock_irqsave(&sriov->going_down_lock, flags); | ||
2688 | spin_lock(&sriov->id_map_lock); | ||
2689 | + spin_lock_irqsave(&sriov->going_down_lock, flags); | ||
2690 | /*make sure that there is no schedule inside the scheduled work.*/ | ||
2691 | if (!sriov->is_going_down) { | ||
2692 | id->scheduled_delete = 1; | ||
2693 | schedule_delayed_work(&id->timeout, CM_CLEANUP_CACHE_TIMEOUT); | ||
2694 | } | ||
2695 | - spin_unlock(&sriov->id_map_lock); | ||
2696 | spin_unlock_irqrestore(&sriov->going_down_lock, flags); | ||
2697 | + spin_unlock(&sriov->id_map_lock); | ||
2698 | } | ||
2699 | |||
2700 | int mlx4_ib_multiplex_cm_handler(struct ib_device *ibdev, int port, int slave_id, | ||
2701 | diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h | ||
2702 | index 5cac29e..33cc589 100644 | ||
2703 | --- a/drivers/infiniband/hw/nes/nes.h | ||
2704 | +++ b/drivers/infiniband/hw/nes/nes.h | ||
2705 | @@ -532,6 +532,7 @@ void nes_iwarp_ce_handler(struct nes_device *, struct nes_hw_cq *); | ||
2706 | int nes_destroy_cqp(struct nes_device *); | ||
2707 | int nes_nic_cm_xmit(struct sk_buff *, struct net_device *); | ||
2708 | void nes_recheck_link_status(struct work_struct *work); | ||
2709 | +void nes_terminate_timeout(unsigned long context); | ||
2710 | |||
2711 | /* nes_nic.c */ | ||
2712 | struct net_device *nes_netdev_init(struct nes_device *, void __iomem *); | ||
2713 | diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c | ||
2714 | index fe7965e..67647e2 100644 | ||
2715 | --- a/drivers/infiniband/hw/nes/nes_hw.c | ||
2716 | +++ b/drivers/infiniband/hw/nes/nes_hw.c | ||
2717 | @@ -75,7 +75,6 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev, | ||
2718 | static void process_critical_error(struct nes_device *nesdev); | ||
2719 | static void nes_process_mac_intr(struct nes_device *nesdev, u32 mac_number); | ||
2720 | static unsigned int nes_reset_adapter_ne020(struct nes_device *nesdev, u8 *OneG_Mode); | ||
2721 | -static void nes_terminate_timeout(unsigned long context); | ||
2722 | static void nes_terminate_start_timer(struct nes_qp *nesqp); | ||
2723 | |||
2724 | #ifdef CONFIG_INFINIBAND_NES_DEBUG | ||
2725 | @@ -3520,7 +3519,7 @@ static void nes_terminate_received(struct nes_device *nesdev, | ||
2726 | } | ||
2727 | |||
2728 | /* Timeout routine in case terminate fails to complete */ | ||
2729 | -static void nes_terminate_timeout(unsigned long context) | ||
2730 | +void nes_terminate_timeout(unsigned long context) | ||
2731 | { | ||
2732 | struct nes_qp *nesqp = (struct nes_qp *)(unsigned long)context; | ||
2733 | |||
2734 | @@ -3530,11 +3529,7 @@ static void nes_terminate_timeout(unsigned long context) | ||
2735 | /* Set a timer in case hw cannot complete the terminate sequence */ | ||
2736 | static void nes_terminate_start_timer(struct nes_qp *nesqp) | ||
2737 | { | ||
2738 | - init_timer(&nesqp->terminate_timer); | ||
2739 | - nesqp->terminate_timer.function = nes_terminate_timeout; | ||
2740 | - nesqp->terminate_timer.expires = jiffies + HZ; | ||
2741 | - nesqp->terminate_timer.data = (unsigned long)nesqp; | ||
2742 | - add_timer(&nesqp->terminate_timer); | ||
2743 | + mod_timer(&nesqp->terminate_timer, (jiffies + HZ)); | ||
2744 | } | ||
2745 | |||
2746 | /** | ||
2747 | diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c | ||
2748 | index cd0ecb2..07e4fba 100644 | ||
2749 | --- a/drivers/infiniband/hw/nes/nes_verbs.c | ||
2750 | +++ b/drivers/infiniband/hw/nes/nes_verbs.c | ||
2751 | @@ -1404,6 +1404,9 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, | ||
2752 | } | ||
2753 | |||
2754 | nesqp->sig_all = (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR); | ||
2755 | + init_timer(&nesqp->terminate_timer); | ||
2756 | + nesqp->terminate_timer.function = nes_terminate_timeout; | ||
2757 | + nesqp->terminate_timer.data = (unsigned long)nesqp; | ||
2758 | |||
2759 | /* update the QP table */ | ||
2760 | nesdev->nesadapter->qp_table[nesqp->hwqp.qp_id-NES_FIRST_QPN] = nesqp; | ||
2761 | @@ -1413,7 +1416,6 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, | ||
2762 | return &nesqp->ibqp; | ||
2763 | } | ||
2764 | |||
2765 | - | ||
2766 | /** | ||
2767 | * nes_clean_cq | ||
2768 | */ | ||
2769 | @@ -2559,6 +2561,11 @@ static struct ib_mr *nes_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | ||
2770 | return ibmr; | ||
2771 | case IWNES_MEMREG_TYPE_QP: | ||
2772 | case IWNES_MEMREG_TYPE_CQ: | ||
2773 | + if (!region->length) { | ||
2774 | + nes_debug(NES_DBG_MR, "Unable to register zero length region for CQ\n"); | ||
2775 | + ib_umem_release(region); | ||
2776 | + return ERR_PTR(-EINVAL); | ||
2777 | + } | ||
2778 | nespbl = kzalloc(sizeof(*nespbl), GFP_KERNEL); | ||
2779 | if (!nespbl) { | ||
2780 | nes_debug(NES_DBG_MR, "Unable to allocate PBL\n"); | ||
2781 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c | ||
2782 | index 0badfa4..9476c1b 100644 | ||
2783 | --- a/drivers/iommu/intel-iommu.c | ||
2784 | +++ b/drivers/iommu/intel-iommu.c | ||
2785 | @@ -1827,10 +1827,17 @@ static int __domain_mapping(struct dmar_domain *domain, unsigned long iov_pfn, | ||
2786 | if (!pte) | ||
2787 | return -ENOMEM; | ||
2788 | /* It is large page*/ | ||
2789 | - if (largepage_lvl > 1) | ||
2790 | + if (largepage_lvl > 1) { | ||
2791 | pteval |= DMA_PTE_LARGE_PAGE; | ||
2792 | - else | ||
2793 | + /* Ensure that old small page tables are removed to make room | ||
2794 | + for superpage, if they exist. */ | ||
2795 | + dma_pte_clear_range(domain, iov_pfn, | ||
2796 | + iov_pfn + lvl_to_nr_pages(largepage_lvl) - 1); | ||
2797 | + dma_pte_free_pagetable(domain, iov_pfn, | ||
2798 | + iov_pfn + lvl_to_nr_pages(largepage_lvl) - 1); | ||
2799 | + } else { | ||
2800 | pteval &= ~(uint64_t)DMA_PTE_LARGE_PAGE; | ||
2801 | + } | ||
2802 | |||
2803 | } | ||
2804 | /* We don't need lock here, nobody else | ||
2805 | diff --git a/drivers/md/dm-bio-prison.c b/drivers/md/dm-bio-prison.c | ||
2806 | index e4e8415..aefb78e 100644 | ||
2807 | --- a/drivers/md/dm-bio-prison.c | ||
2808 | +++ b/drivers/md/dm-bio-prison.c | ||
2809 | @@ -208,31 +208,6 @@ void dm_cell_release(struct dm_bio_prison_cell *cell, struct bio_list *bios) | ||
2810 | EXPORT_SYMBOL_GPL(dm_cell_release); | ||
2811 | |||
2812 | /* | ||
2813 | - * There are a couple of places where we put a bio into a cell briefly | ||
2814 | - * before taking it out again. In these situations we know that no other | ||
2815 | - * bio may be in the cell. This function releases the cell, and also does | ||
2816 | - * a sanity check. | ||
2817 | - */ | ||
2818 | -static void __cell_release_singleton(struct dm_bio_prison_cell *cell, struct bio *bio) | ||
2819 | -{ | ||
2820 | - BUG_ON(cell->holder != bio); | ||
2821 | - BUG_ON(!bio_list_empty(&cell->bios)); | ||
2822 | - | ||
2823 | - __cell_release(cell, NULL); | ||
2824 | -} | ||
2825 | - | ||
2826 | -void dm_cell_release_singleton(struct dm_bio_prison_cell *cell, struct bio *bio) | ||
2827 | -{ | ||
2828 | - unsigned long flags; | ||
2829 | - struct dm_bio_prison *prison = cell->prison; | ||
2830 | - | ||
2831 | - spin_lock_irqsave(&prison->lock, flags); | ||
2832 | - __cell_release_singleton(cell, bio); | ||
2833 | - spin_unlock_irqrestore(&prison->lock, flags); | ||
2834 | -} | ||
2835 | -EXPORT_SYMBOL_GPL(dm_cell_release_singleton); | ||
2836 | - | ||
2837 | -/* | ||
2838 | * Sometimes we don't want the holder, just the additional bios. | ||
2839 | */ | ||
2840 | static void __cell_release_no_holder(struct dm_bio_prison_cell *cell, struct bio_list *inmates) | ||
2841 | diff --git a/drivers/md/dm-bio-prison.h b/drivers/md/dm-bio-prison.h | ||
2842 | index 4e0ac37..53d1a7a 100644 | ||
2843 | --- a/drivers/md/dm-bio-prison.h | ||
2844 | +++ b/drivers/md/dm-bio-prison.h | ||
2845 | @@ -44,7 +44,6 @@ int dm_bio_detain(struct dm_bio_prison *prison, struct dm_cell_key *key, | ||
2846 | struct bio *inmate, struct dm_bio_prison_cell **ref); | ||
2847 | |||
2848 | void dm_cell_release(struct dm_bio_prison_cell *cell, struct bio_list *bios); | ||
2849 | -void dm_cell_release_singleton(struct dm_bio_prison_cell *cell, struct bio *bio); // FIXME: bio arg not needed | ||
2850 | void dm_cell_release_no_holder(struct dm_bio_prison_cell *cell, struct bio_list *inmates); | ||
2851 | void dm_cell_error(struct dm_bio_prison_cell *cell); | ||
2852 | |||
2853 | diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c | ||
2854 | index afd9598..a651d52 100644 | ||
2855 | --- a/drivers/md/dm-ioctl.c | ||
2856 | +++ b/drivers/md/dm-ioctl.c | ||
2857 | @@ -1566,6 +1566,14 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl **param) | ||
2858 | if (copy_from_user(dmi, user, tmp.data_size)) | ||
2859 | goto bad; | ||
2860 | |||
2861 | + /* | ||
2862 | + * Abort if something changed the ioctl data while it was being copied. | ||
2863 | + */ | ||
2864 | + if (dmi->data_size != tmp.data_size) { | ||
2865 | + DMERR("rejecting ioctl: data size modified while processing parameters"); | ||
2866 | + goto bad; | ||
2867 | + } | ||
2868 | + | ||
2869 | /* Wipe the user buffer so we do not return it to userspace */ | ||
2870 | if (secure_data && clear_user(user, tmp.data_size)) | ||
2871 | goto bad; | ||
2872 | diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c | ||
2873 | index 100368e..fa29557 100644 | ||
2874 | --- a/drivers/md/dm-table.c | ||
2875 | +++ b/drivers/md/dm-table.c | ||
2876 | @@ -1445,6 +1445,8 @@ void dm_table_set_restrictions(struct dm_table *t, struct request_queue *q, | ||
2877 | else | ||
2878 | queue_flag_clear_unlocked(QUEUE_FLAG_NONROT, q); | ||
2879 | |||
2880 | + q->limits.max_write_same_sectors = 0; | ||
2881 | + | ||
2882 | dm_table_set_integrity(t); | ||
2883 | |||
2884 | /* | ||
2885 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c | ||
2886 | index 058acf3..41c9e81 100644 | ||
2887 | --- a/drivers/md/dm-thin.c | ||
2888 | +++ b/drivers/md/dm-thin.c | ||
2889 | @@ -368,6 +368,17 @@ static int bio_triggers_commit(struct thin_c *tc, struct bio *bio) | ||
2890 | dm_thin_changed_this_transaction(tc->td); | ||
2891 | } | ||
2892 | |||
2893 | +static void inc_all_io_entry(struct pool *pool, struct bio *bio) | ||
2894 | +{ | ||
2895 | + struct dm_thin_endio_hook *h; | ||
2896 | + | ||
2897 | + if (bio->bi_rw & REQ_DISCARD) | ||
2898 | + return; | ||
2899 | + | ||
2900 | + h = dm_get_mapinfo(bio)->ptr; | ||
2901 | + h->all_io_entry = dm_deferred_entry_inc(pool->all_io_ds); | ||
2902 | +} | ||
2903 | + | ||
2904 | static void issue(struct thin_c *tc, struct bio *bio) | ||
2905 | { | ||
2906 | struct pool *pool = tc->pool; | ||
2907 | @@ -513,8 +524,7 @@ static void cell_defer(struct thin_c *tc, struct dm_bio_prison_cell *cell, | ||
2908 | } | ||
2909 | |||
2910 | /* | ||
2911 | - * Same as cell_defer above, except it omits one particular detainee, | ||
2912 | - * a write bio that covers the block and has already been processed. | ||
2913 | + * Same as cell_defer except it omits the original holder of the cell. | ||
2914 | */ | ||
2915 | static void cell_defer_except(struct thin_c *tc, struct dm_bio_prison_cell *cell) | ||
2916 | { | ||
2917 | @@ -597,13 +607,15 @@ static void process_prepared_discard_passdown(struct dm_thin_new_mapping *m) | ||
2918 | { | ||
2919 | struct thin_c *tc = m->tc; | ||
2920 | |||
2921 | + inc_all_io_entry(tc->pool, m->bio); | ||
2922 | + cell_defer_except(tc, m->cell); | ||
2923 | + cell_defer_except(tc, m->cell2); | ||
2924 | + | ||
2925 | if (m->pass_discard) | ||
2926 | remap_and_issue(tc, m->bio, m->data_block); | ||
2927 | else | ||
2928 | bio_endio(m->bio, 0); | ||
2929 | |||
2930 | - cell_defer_except(tc, m->cell); | ||
2931 | - cell_defer_except(tc, m->cell2); | ||
2932 | mempool_free(m, tc->pool->mapping_pool); | ||
2933 | } | ||
2934 | |||
2935 | @@ -711,6 +723,7 @@ static void schedule_copy(struct thin_c *tc, dm_block_t virt_block, | ||
2936 | h->overwrite_mapping = m; | ||
2937 | m->bio = bio; | ||
2938 | save_and_set_endio(bio, &m->saved_bi_end_io, overwrite_endio); | ||
2939 | + inc_all_io_entry(pool, bio); | ||
2940 | remap_and_issue(tc, bio, data_dest); | ||
2941 | } else { | ||
2942 | struct dm_io_region from, to; | ||
2943 | @@ -780,6 +793,7 @@ static void schedule_zero(struct thin_c *tc, dm_block_t virt_block, | ||
2944 | h->overwrite_mapping = m; | ||
2945 | m->bio = bio; | ||
2946 | save_and_set_endio(bio, &m->saved_bi_end_io, overwrite_endio); | ||
2947 | + inc_all_io_entry(pool, bio); | ||
2948 | remap_and_issue(tc, bio, data_block); | ||
2949 | } else { | ||
2950 | int r; | ||
2951 | @@ -936,7 +950,7 @@ static void process_discard(struct thin_c *tc, struct bio *bio) | ||
2952 | */ | ||
2953 | build_data_key(tc->td, lookup_result.block, &key2); | ||
2954 | if (dm_bio_detain(tc->pool->prison, &key2, bio, &cell2)) { | ||
2955 | - dm_cell_release_singleton(cell, bio); | ||
2956 | + cell_defer_except(tc, cell); | ||
2957 | break; | ||
2958 | } | ||
2959 | |||
2960 | @@ -962,13 +976,15 @@ static void process_discard(struct thin_c *tc, struct bio *bio) | ||
2961 | wake_worker(pool); | ||
2962 | } | ||
2963 | } else { | ||
2964 | + inc_all_io_entry(pool, bio); | ||
2965 | + cell_defer_except(tc, cell); | ||
2966 | + cell_defer_except(tc, cell2); | ||
2967 | + | ||
2968 | /* | ||
2969 | * The DM core makes sure that the discard doesn't span | ||
2970 | * a block boundary. So we submit the discard of a | ||
2971 | * partial block appropriately. | ||
2972 | */ | ||
2973 | - dm_cell_release_singleton(cell, bio); | ||
2974 | - dm_cell_release_singleton(cell2, bio); | ||
2975 | if ((!lookup_result.shared) && pool->pf.discard_passdown) | ||
2976 | remap_and_issue(tc, bio, lookup_result.block); | ||
2977 | else | ||
2978 | @@ -980,13 +996,13 @@ static void process_discard(struct thin_c *tc, struct bio *bio) | ||
2979 | /* | ||
2980 | * It isn't provisioned, just forget it. | ||
2981 | */ | ||
2982 | - dm_cell_release_singleton(cell, bio); | ||
2983 | + cell_defer_except(tc, cell); | ||
2984 | bio_endio(bio, 0); | ||
2985 | break; | ||
2986 | |||
2987 | default: | ||
2988 | DMERR("discard: find block unexpectedly returned %d", r); | ||
2989 | - dm_cell_release_singleton(cell, bio); | ||
2990 | + cell_defer_except(tc, cell); | ||
2991 | bio_io_error(bio); | ||
2992 | break; | ||
2993 | } | ||
2994 | @@ -1040,8 +1056,9 @@ static void process_shared_bio(struct thin_c *tc, struct bio *bio, | ||
2995 | struct dm_thin_endio_hook *h = dm_get_mapinfo(bio)->ptr; | ||
2996 | |||
2997 | h->shared_read_entry = dm_deferred_entry_inc(pool->shared_read_ds); | ||
2998 | + inc_all_io_entry(pool, bio); | ||
2999 | + cell_defer_except(tc, cell); | ||
3000 | |||
3001 | - dm_cell_release_singleton(cell, bio); | ||
3002 | remap_and_issue(tc, bio, lookup_result->block); | ||
3003 | } | ||
3004 | } | ||
3005 | @@ -1056,7 +1073,9 @@ static void provision_block(struct thin_c *tc, struct bio *bio, dm_block_t block | ||
3006 | * Remap empty bios (flushes) immediately, without provisioning. | ||
3007 | */ | ||
3008 | if (!bio->bi_size) { | ||
3009 | - dm_cell_release_singleton(cell, bio); | ||
3010 | + inc_all_io_entry(tc->pool, bio); | ||
3011 | + cell_defer_except(tc, cell); | ||
3012 | + | ||
3013 | remap_and_issue(tc, bio, 0); | ||
3014 | return; | ||
3015 | } | ||
3016 | @@ -1066,7 +1085,7 @@ static void provision_block(struct thin_c *tc, struct bio *bio, dm_block_t block | ||
3017 | */ | ||
3018 | if (bio_data_dir(bio) == READ) { | ||
3019 | zero_fill_bio(bio); | ||
3020 | - dm_cell_release_singleton(cell, bio); | ||
3021 | + cell_defer_except(tc, cell); | ||
3022 | bio_endio(bio, 0); | ||
3023 | return; | ||
3024 | } | ||
3025 | @@ -1111,26 +1130,22 @@ static void process_bio(struct thin_c *tc, struct bio *bio) | ||
3026 | r = dm_thin_find_block(tc->td, block, 1, &lookup_result); | ||
3027 | switch (r) { | ||
3028 | case 0: | ||
3029 | - /* | ||
3030 | - * We can release this cell now. This thread is the only | ||
3031 | - * one that puts bios into a cell, and we know there were | ||
3032 | - * no preceding bios. | ||
3033 | - */ | ||
3034 | - /* | ||
3035 | - * TODO: this will probably have to change when discard goes | ||
3036 | - * back in. | ||
3037 | - */ | ||
3038 | - dm_cell_release_singleton(cell, bio); | ||
3039 | - | ||
3040 | - if (lookup_result.shared) | ||
3041 | + if (lookup_result.shared) { | ||
3042 | process_shared_bio(tc, bio, block, &lookup_result); | ||
3043 | - else | ||
3044 | + cell_defer_except(tc, cell); | ||
3045 | + } else { | ||
3046 | + inc_all_io_entry(tc->pool, bio); | ||
3047 | + cell_defer_except(tc, cell); | ||
3048 | + | ||
3049 | remap_and_issue(tc, bio, lookup_result.block); | ||
3050 | + } | ||
3051 | break; | ||
3052 | |||
3053 | case -ENODATA: | ||
3054 | if (bio_data_dir(bio) == READ && tc->origin_dev) { | ||
3055 | - dm_cell_release_singleton(cell, bio); | ||
3056 | + inc_all_io_entry(tc->pool, bio); | ||
3057 | + cell_defer_except(tc, cell); | ||
3058 | + | ||
3059 | remap_to_origin_and_issue(tc, bio); | ||
3060 | } else | ||
3061 | provision_block(tc, bio, block, cell); | ||
3062 | @@ -1138,7 +1153,7 @@ static void process_bio(struct thin_c *tc, struct bio *bio) | ||
3063 | |||
3064 | default: | ||
3065 | DMERR("dm_thin_find_block() failed, error = %d", r); | ||
3066 | - dm_cell_release_singleton(cell, bio); | ||
3067 | + cell_defer_except(tc, cell); | ||
3068 | bio_io_error(bio); | ||
3069 | break; | ||
3070 | } | ||
3071 | @@ -1156,8 +1171,10 @@ static void process_bio_read_only(struct thin_c *tc, struct bio *bio) | ||
3072 | case 0: | ||
3073 | if (lookup_result.shared && (rw == WRITE) && bio->bi_size) | ||
3074 | bio_io_error(bio); | ||
3075 | - else | ||
3076 | + else { | ||
3077 | + inc_all_io_entry(tc->pool, bio); | ||
3078 | remap_and_issue(tc, bio, lookup_result.block); | ||
3079 | + } | ||
3080 | break; | ||
3081 | |||
3082 | case -ENODATA: | ||
3083 | @@ -1167,6 +1184,7 @@ static void process_bio_read_only(struct thin_c *tc, struct bio *bio) | ||
3084 | } | ||
3085 | |||
3086 | if (tc->origin_dev) { | ||
3087 | + inc_all_io_entry(tc->pool, bio); | ||
3088 | remap_to_origin_and_issue(tc, bio); | ||
3089 | break; | ||
3090 | } | ||
3091 | @@ -1347,7 +1365,7 @@ static struct dm_thin_endio_hook *thin_hook_bio(struct thin_c *tc, struct bio *b | ||
3092 | |||
3093 | h->tc = tc; | ||
3094 | h->shared_read_entry = NULL; | ||
3095 | - h->all_io_entry = bio->bi_rw & REQ_DISCARD ? NULL : dm_deferred_entry_inc(pool->all_io_ds); | ||
3096 | + h->all_io_entry = NULL; | ||
3097 | h->overwrite_mapping = NULL; | ||
3098 | |||
3099 | return h; | ||
3100 | @@ -1364,6 +1382,8 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio, | ||
3101 | dm_block_t block = get_bio_block(tc, bio); | ||
3102 | struct dm_thin_device *td = tc->td; | ||
3103 | struct dm_thin_lookup_result result; | ||
3104 | + struct dm_bio_prison_cell *cell1, *cell2; | ||
3105 | + struct dm_cell_key key; | ||
3106 | |||
3107 | map_context->ptr = thin_hook_bio(tc, bio); | ||
3108 | |||
3109 | @@ -1400,12 +1420,25 @@ static int thin_bio_map(struct dm_target *ti, struct bio *bio, | ||
3110 | * shared flag will be set in their case. | ||
3111 | */ | ||
3112 | thin_defer_bio(tc, bio); | ||
3113 | - r = DM_MAPIO_SUBMITTED; | ||
3114 | - } else { | ||
3115 | - remap(tc, bio, result.block); | ||
3116 | - r = DM_MAPIO_REMAPPED; | ||
3117 | + return DM_MAPIO_SUBMITTED; | ||
3118 | } | ||
3119 | - break; | ||
3120 | + | ||
3121 | + build_virtual_key(tc->td, block, &key); | ||
3122 | + if (dm_bio_detain(tc->pool->prison, &key, bio, &cell1)) | ||
3123 | + return DM_MAPIO_SUBMITTED; | ||
3124 | + | ||
3125 | + build_data_key(tc->td, result.block, &key); | ||
3126 | + if (dm_bio_detain(tc->pool->prison, &key, bio, &cell2)) { | ||
3127 | + cell_defer_except(tc, cell1); | ||
3128 | + return DM_MAPIO_SUBMITTED; | ||
3129 | + } | ||
3130 | + | ||
3131 | + inc_all_io_entry(tc->pool, bio); | ||
3132 | + cell_defer_except(tc, cell2); | ||
3133 | + cell_defer_except(tc, cell1); | ||
3134 | + | ||
3135 | + remap(tc, bio, result.block); | ||
3136 | + return DM_MAPIO_REMAPPED; | ||
3137 | |||
3138 | case -ENODATA: | ||
3139 | if (get_pool_mode(tc->pool) == PM_READ_ONLY) { | ||
3140 | diff --git a/drivers/md/persistent-data/dm-btree-internal.h b/drivers/md/persistent-data/dm-btree-internal.h | ||
3141 | index 5709bfe..accbb05 100644 | ||
3142 | --- a/drivers/md/persistent-data/dm-btree-internal.h | ||
3143 | +++ b/drivers/md/persistent-data/dm-btree-internal.h | ||
3144 | @@ -36,13 +36,13 @@ struct node_header { | ||
3145 | __le32 padding; | ||
3146 | } __packed; | ||
3147 | |||
3148 | -struct node { | ||
3149 | +struct btree_node { | ||
3150 | struct node_header header; | ||
3151 | __le64 keys[0]; | ||
3152 | } __packed; | ||
3153 | |||
3154 | |||
3155 | -void inc_children(struct dm_transaction_manager *tm, struct node *n, | ||
3156 | +void inc_children(struct dm_transaction_manager *tm, struct btree_node *n, | ||
3157 | struct dm_btree_value_type *vt); | ||
3158 | |||
3159 | int new_block(struct dm_btree_info *info, struct dm_block **result); | ||
3160 | @@ -64,7 +64,7 @@ struct ro_spine { | ||
3161 | void init_ro_spine(struct ro_spine *s, struct dm_btree_info *info); | ||
3162 | int exit_ro_spine(struct ro_spine *s); | ||
3163 | int ro_step(struct ro_spine *s, dm_block_t new_child); | ||
3164 | -struct node *ro_node(struct ro_spine *s); | ||
3165 | +struct btree_node *ro_node(struct ro_spine *s); | ||
3166 | |||
3167 | struct shadow_spine { | ||
3168 | struct dm_btree_info *info; | ||
3169 | @@ -98,17 +98,17 @@ int shadow_root(struct shadow_spine *s); | ||
3170 | /* | ||
3171 | * Some inlines. | ||
3172 | */ | ||
3173 | -static inline __le64 *key_ptr(struct node *n, uint32_t index) | ||
3174 | +static inline __le64 *key_ptr(struct btree_node *n, uint32_t index) | ||
3175 | { | ||
3176 | return n->keys + index; | ||
3177 | } | ||
3178 | |||
3179 | -static inline void *value_base(struct node *n) | ||
3180 | +static inline void *value_base(struct btree_node *n) | ||
3181 | { | ||
3182 | return &n->keys[le32_to_cpu(n->header.max_entries)]; | ||
3183 | } | ||
3184 | |||
3185 | -static inline void *value_ptr(struct node *n, uint32_t index) | ||
3186 | +static inline void *value_ptr(struct btree_node *n, uint32_t index) | ||
3187 | { | ||
3188 | uint32_t value_size = le32_to_cpu(n->header.value_size); | ||
3189 | return value_base(n) + (value_size * index); | ||
3190 | @@ -117,7 +117,7 @@ static inline void *value_ptr(struct node *n, uint32_t index) | ||
3191 | /* | ||
3192 | * Assumes the values are suitably-aligned and converts to core format. | ||
3193 | */ | ||
3194 | -static inline uint64_t value64(struct node *n, uint32_t index) | ||
3195 | +static inline uint64_t value64(struct btree_node *n, uint32_t index) | ||
3196 | { | ||
3197 | __le64 *values_le = value_base(n); | ||
3198 | |||
3199 | @@ -127,7 +127,7 @@ static inline uint64_t value64(struct node *n, uint32_t index) | ||
3200 | /* | ||
3201 | * Searching for a key within a single node. | ||
3202 | */ | ||
3203 | -int lower_bound(struct node *n, uint64_t key); | ||
3204 | +int lower_bound(struct btree_node *n, uint64_t key); | ||
3205 | |||
3206 | extern struct dm_block_validator btree_node_validator; | ||
3207 | |||
3208 | diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c | ||
3209 | index aa71e23..c4f2813 100644 | ||
3210 | --- a/drivers/md/persistent-data/dm-btree-remove.c | ||
3211 | +++ b/drivers/md/persistent-data/dm-btree-remove.c | ||
3212 | @@ -53,7 +53,7 @@ | ||
3213 | /* | ||
3214 | * Some little utilities for moving node data around. | ||
3215 | */ | ||
3216 | -static void node_shift(struct node *n, int shift) | ||
3217 | +static void node_shift(struct btree_node *n, int shift) | ||
3218 | { | ||
3219 | uint32_t nr_entries = le32_to_cpu(n->header.nr_entries); | ||
3220 | uint32_t value_size = le32_to_cpu(n->header.value_size); | ||
3221 | @@ -79,7 +79,7 @@ static void node_shift(struct node *n, int shift) | ||
3222 | } | ||
3223 | } | ||
3224 | |||
3225 | -static void node_copy(struct node *left, struct node *right, int shift) | ||
3226 | +static void node_copy(struct btree_node *left, struct btree_node *right, int shift) | ||
3227 | { | ||
3228 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
3229 | uint32_t value_size = le32_to_cpu(left->header.value_size); | ||
3230 | @@ -108,7 +108,7 @@ static void node_copy(struct node *left, struct node *right, int shift) | ||
3231 | /* | ||
3232 | * Delete a specific entry from a leaf node. | ||
3233 | */ | ||
3234 | -static void delete_at(struct node *n, unsigned index) | ||
3235 | +static void delete_at(struct btree_node *n, unsigned index) | ||
3236 | { | ||
3237 | unsigned nr_entries = le32_to_cpu(n->header.nr_entries); | ||
3238 | unsigned nr_to_copy = nr_entries - (index + 1); | ||
3239 | @@ -128,7 +128,7 @@ static void delete_at(struct node *n, unsigned index) | ||
3240 | n->header.nr_entries = cpu_to_le32(nr_entries - 1); | ||
3241 | } | ||
3242 | |||
3243 | -static unsigned merge_threshold(struct node *n) | ||
3244 | +static unsigned merge_threshold(struct btree_node *n) | ||
3245 | { | ||
3246 | return le32_to_cpu(n->header.max_entries) / 3; | ||
3247 | } | ||
3248 | @@ -136,7 +136,7 @@ static unsigned merge_threshold(struct node *n) | ||
3249 | struct child { | ||
3250 | unsigned index; | ||
3251 | struct dm_block *block; | ||
3252 | - struct node *n; | ||
3253 | + struct btree_node *n; | ||
3254 | }; | ||
3255 | |||
3256 | static struct dm_btree_value_type le64_type = { | ||
3257 | @@ -147,7 +147,7 @@ static struct dm_btree_value_type le64_type = { | ||
3258 | .equal = NULL | ||
3259 | }; | ||
3260 | |||
3261 | -static int init_child(struct dm_btree_info *info, struct node *parent, | ||
3262 | +static int init_child(struct dm_btree_info *info, struct btree_node *parent, | ||
3263 | unsigned index, struct child *result) | ||
3264 | { | ||
3265 | int r, inc; | ||
3266 | @@ -177,7 +177,7 @@ static int exit_child(struct dm_btree_info *info, struct child *c) | ||
3267 | return dm_tm_unlock(info->tm, c->block); | ||
3268 | } | ||
3269 | |||
3270 | -static void shift(struct node *left, struct node *right, int count) | ||
3271 | +static void shift(struct btree_node *left, struct btree_node *right, int count) | ||
3272 | { | ||
3273 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
3274 | uint32_t nr_right = le32_to_cpu(right->header.nr_entries); | ||
3275 | @@ -203,11 +203,11 @@ static void shift(struct node *left, struct node *right, int count) | ||
3276 | right->header.nr_entries = cpu_to_le32(nr_right + count); | ||
3277 | } | ||
3278 | |||
3279 | -static void __rebalance2(struct dm_btree_info *info, struct node *parent, | ||
3280 | +static void __rebalance2(struct dm_btree_info *info, struct btree_node *parent, | ||
3281 | struct child *l, struct child *r) | ||
3282 | { | ||
3283 | - struct node *left = l->n; | ||
3284 | - struct node *right = r->n; | ||
3285 | + struct btree_node *left = l->n; | ||
3286 | + struct btree_node *right = r->n; | ||
3287 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
3288 | uint32_t nr_right = le32_to_cpu(right->header.nr_entries); | ||
3289 | unsigned threshold = 2 * merge_threshold(left) + 1; | ||
3290 | @@ -239,7 +239,7 @@ static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, | ||
3291 | unsigned left_index) | ||
3292 | { | ||
3293 | int r; | ||
3294 | - struct node *parent; | ||
3295 | + struct btree_node *parent; | ||
3296 | struct child left, right; | ||
3297 | |||
3298 | parent = dm_block_data(shadow_current(s)); | ||
3299 | @@ -270,9 +270,9 @@ static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, | ||
3300 | * in right, then rebalance2. This wastes some cpu, but I want something | ||
3301 | * simple atm. | ||
3302 | */ | ||
3303 | -static void delete_center_node(struct dm_btree_info *info, struct node *parent, | ||
3304 | +static void delete_center_node(struct dm_btree_info *info, struct btree_node *parent, | ||
3305 | struct child *l, struct child *c, struct child *r, | ||
3306 | - struct node *left, struct node *center, struct node *right, | ||
3307 | + struct btree_node *left, struct btree_node *center, struct btree_node *right, | ||
3308 | uint32_t nr_left, uint32_t nr_center, uint32_t nr_right) | ||
3309 | { | ||
3310 | uint32_t max_entries = le32_to_cpu(left->header.max_entries); | ||
3311 | @@ -301,9 +301,9 @@ static void delete_center_node(struct dm_btree_info *info, struct node *parent, | ||
3312 | /* | ||
3313 | * Redistributes entries among 3 sibling nodes. | ||
3314 | */ | ||
3315 | -static void redistribute3(struct dm_btree_info *info, struct node *parent, | ||
3316 | +static void redistribute3(struct dm_btree_info *info, struct btree_node *parent, | ||
3317 | struct child *l, struct child *c, struct child *r, | ||
3318 | - struct node *left, struct node *center, struct node *right, | ||
3319 | + struct btree_node *left, struct btree_node *center, struct btree_node *right, | ||
3320 | uint32_t nr_left, uint32_t nr_center, uint32_t nr_right) | ||
3321 | { | ||
3322 | int s; | ||
3323 | @@ -343,12 +343,12 @@ static void redistribute3(struct dm_btree_info *info, struct node *parent, | ||
3324 | *key_ptr(parent, r->index) = right->keys[0]; | ||
3325 | } | ||
3326 | |||
3327 | -static void __rebalance3(struct dm_btree_info *info, struct node *parent, | ||
3328 | +static void __rebalance3(struct dm_btree_info *info, struct btree_node *parent, | ||
3329 | struct child *l, struct child *c, struct child *r) | ||
3330 | { | ||
3331 | - struct node *left = l->n; | ||
3332 | - struct node *center = c->n; | ||
3333 | - struct node *right = r->n; | ||
3334 | + struct btree_node *left = l->n; | ||
3335 | + struct btree_node *center = c->n; | ||
3336 | + struct btree_node *right = r->n; | ||
3337 | |||
3338 | uint32_t nr_left = le32_to_cpu(left->header.nr_entries); | ||
3339 | uint32_t nr_center = le32_to_cpu(center->header.nr_entries); | ||
3340 | @@ -371,7 +371,7 @@ static int rebalance3(struct shadow_spine *s, struct dm_btree_info *info, | ||
3341 | unsigned left_index) | ||
3342 | { | ||
3343 | int r; | ||
3344 | - struct node *parent = dm_block_data(shadow_current(s)); | ||
3345 | + struct btree_node *parent = dm_block_data(shadow_current(s)); | ||
3346 | struct child left, center, right; | ||
3347 | |||
3348 | /* | ||
3349 | @@ -421,7 +421,7 @@ static int get_nr_entries(struct dm_transaction_manager *tm, | ||
3350 | { | ||
3351 | int r; | ||
3352 | struct dm_block *block; | ||
3353 | - struct node *n; | ||
3354 | + struct btree_node *n; | ||
3355 | |||
3356 | r = dm_tm_read_lock(tm, b, &btree_node_validator, &block); | ||
3357 | if (r) | ||
3358 | @@ -438,7 +438,7 @@ static int rebalance_children(struct shadow_spine *s, | ||
3359 | { | ||
3360 | int i, r, has_left_sibling, has_right_sibling; | ||
3361 | uint32_t child_entries; | ||
3362 | - struct node *n; | ||
3363 | + struct btree_node *n; | ||
3364 | |||
3365 | n = dm_block_data(shadow_current(s)); | ||
3366 | |||
3367 | @@ -483,7 +483,7 @@ static int rebalance_children(struct shadow_spine *s, | ||
3368 | return r; | ||
3369 | } | ||
3370 | |||
3371 | -static int do_leaf(struct node *n, uint64_t key, unsigned *index) | ||
3372 | +static int do_leaf(struct btree_node *n, uint64_t key, unsigned *index) | ||
3373 | { | ||
3374 | int i = lower_bound(n, key); | ||
3375 | |||
3376 | @@ -506,7 +506,7 @@ static int remove_raw(struct shadow_spine *s, struct dm_btree_info *info, | ||
3377 | uint64_t key, unsigned *index) | ||
3378 | { | ||
3379 | int i = *index, r; | ||
3380 | - struct node *n; | ||
3381 | + struct btree_node *n; | ||
3382 | |||
3383 | for (;;) { | ||
3384 | r = shadow_step(s, root, vt); | ||
3385 | @@ -556,7 +556,7 @@ int dm_btree_remove(struct dm_btree_info *info, dm_block_t root, | ||
3386 | unsigned level, last_level = info->levels - 1; | ||
3387 | int index = 0, r = 0; | ||
3388 | struct shadow_spine spine; | ||
3389 | - struct node *n; | ||
3390 | + struct btree_node *n; | ||
3391 | |||
3392 | init_shadow_spine(&spine, info); | ||
3393 | for (level = 0; level < info->levels; level++) { | ||
3394 | diff --git a/drivers/md/persistent-data/dm-btree-spine.c b/drivers/md/persistent-data/dm-btree-spine.c | ||
3395 | index d9a7912..2f0805c 100644 | ||
3396 | --- a/drivers/md/persistent-data/dm-btree-spine.c | ||
3397 | +++ b/drivers/md/persistent-data/dm-btree-spine.c | ||
3398 | @@ -23,7 +23,7 @@ static void node_prepare_for_write(struct dm_block_validator *v, | ||
3399 | struct dm_block *b, | ||
3400 | size_t block_size) | ||
3401 | { | ||
3402 | - struct node *n = dm_block_data(b); | ||
3403 | + struct btree_node *n = dm_block_data(b); | ||
3404 | struct node_header *h = &n->header; | ||
3405 | |||
3406 | h->blocknr = cpu_to_le64(dm_block_location(b)); | ||
3407 | @@ -38,7 +38,7 @@ static int node_check(struct dm_block_validator *v, | ||
3408 | struct dm_block *b, | ||
3409 | size_t block_size) | ||
3410 | { | ||
3411 | - struct node *n = dm_block_data(b); | ||
3412 | + struct btree_node *n = dm_block_data(b); | ||
3413 | struct node_header *h = &n->header; | ||
3414 | size_t value_size; | ||
3415 | __le32 csum_disk; | ||
3416 | @@ -164,7 +164,7 @@ int ro_step(struct ro_spine *s, dm_block_t new_child) | ||
3417 | return r; | ||
3418 | } | ||
3419 | |||
3420 | -struct node *ro_node(struct ro_spine *s) | ||
3421 | +struct btree_node *ro_node(struct ro_spine *s) | ||
3422 | { | ||
3423 | struct dm_block *block; | ||
3424 | |||
3425 | diff --git a/drivers/md/persistent-data/dm-btree.c b/drivers/md/persistent-data/dm-btree.c | ||
3426 | index d12b2cc..371f3d4 100644 | ||
3427 | --- a/drivers/md/persistent-data/dm-btree.c | ||
3428 | +++ b/drivers/md/persistent-data/dm-btree.c | ||
3429 | @@ -38,7 +38,7 @@ static void array_insert(void *base, size_t elt_size, unsigned nr_elts, | ||
3430 | /*----------------------------------------------------------------*/ | ||
3431 | |||
3432 | /* makes the assumption that no two keys are the same. */ | ||
3433 | -static int bsearch(struct node *n, uint64_t key, int want_hi) | ||
3434 | +static int bsearch(struct btree_node *n, uint64_t key, int want_hi) | ||
3435 | { | ||
3436 | int lo = -1, hi = le32_to_cpu(n->header.nr_entries); | ||
3437 | |||
3438 | @@ -58,12 +58,12 @@ static int bsearch(struct node *n, uint64_t key, int want_hi) | ||
3439 | return want_hi ? hi : lo; | ||
3440 | } | ||
3441 | |||
3442 | -int lower_bound(struct node *n, uint64_t key) | ||
3443 | +int lower_bound(struct btree_node *n, uint64_t key) | ||
3444 | { | ||
3445 | return bsearch(n, key, 0); | ||
3446 | } | ||
3447 | |||
3448 | -void inc_children(struct dm_transaction_manager *tm, struct node *n, | ||
3449 | +void inc_children(struct dm_transaction_manager *tm, struct btree_node *n, | ||
3450 | struct dm_btree_value_type *vt) | ||
3451 | { | ||
3452 | unsigned i; | ||
3453 | @@ -77,7 +77,7 @@ void inc_children(struct dm_transaction_manager *tm, struct node *n, | ||
3454 | vt->inc(vt->context, value_ptr(n, i)); | ||
3455 | } | ||
3456 | |||
3457 | -static int insert_at(size_t value_size, struct node *node, unsigned index, | ||
3458 | +static int insert_at(size_t value_size, struct btree_node *node, unsigned index, | ||
3459 | uint64_t key, void *value) | ||
3460 | __dm_written_to_disk(value) | ||
3461 | { | ||
3462 | @@ -122,7 +122,7 @@ int dm_btree_empty(struct dm_btree_info *info, dm_block_t *root) | ||
3463 | { | ||
3464 | int r; | ||
3465 | struct dm_block *b; | ||
3466 | - struct node *n; | ||
3467 | + struct btree_node *n; | ||
3468 | size_t block_size; | ||
3469 | uint32_t max_entries; | ||
3470 | |||
3471 | @@ -154,7 +154,7 @@ EXPORT_SYMBOL_GPL(dm_btree_empty); | ||
3472 | #define MAX_SPINE_DEPTH 64 | ||
3473 | struct frame { | ||
3474 | struct dm_block *b; | ||
3475 | - struct node *n; | ||
3476 | + struct btree_node *n; | ||
3477 | unsigned level; | ||
3478 | unsigned nr_children; | ||
3479 | unsigned current_child; | ||
3480 | @@ -295,7 +295,7 @@ EXPORT_SYMBOL_GPL(dm_btree_del); | ||
3481 | /*----------------------------------------------------------------*/ | ||
3482 | |||
3483 | static int btree_lookup_raw(struct ro_spine *s, dm_block_t block, uint64_t key, | ||
3484 | - int (*search_fn)(struct node *, uint64_t), | ||
3485 | + int (*search_fn)(struct btree_node *, uint64_t), | ||
3486 | uint64_t *result_key, void *v, size_t value_size) | ||
3487 | { | ||
3488 | int i, r; | ||
3489 | @@ -406,7 +406,7 @@ static int btree_split_sibling(struct shadow_spine *s, dm_block_t root, | ||
3490 | size_t size; | ||
3491 | unsigned nr_left, nr_right; | ||
3492 | struct dm_block *left, *right, *parent; | ||
3493 | - struct node *ln, *rn, *pn; | ||
3494 | + struct btree_node *ln, *rn, *pn; | ||
3495 | __le64 location; | ||
3496 | |||
3497 | left = shadow_current(s); | ||
3498 | @@ -491,7 +491,7 @@ static int btree_split_beneath(struct shadow_spine *s, uint64_t key) | ||
3499 | size_t size; | ||
3500 | unsigned nr_left, nr_right; | ||
3501 | struct dm_block *left, *right, *new_parent; | ||
3502 | - struct node *pn, *ln, *rn; | ||
3503 | + struct btree_node *pn, *ln, *rn; | ||
3504 | __le64 val; | ||
3505 | |||
3506 | new_parent = shadow_current(s); | ||
3507 | @@ -576,7 +576,7 @@ static int btree_insert_raw(struct shadow_spine *s, dm_block_t root, | ||
3508 | uint64_t key, unsigned *index) | ||
3509 | { | ||
3510 | int r, i = *index, top = 1; | ||
3511 | - struct node *node; | ||
3512 | + struct btree_node *node; | ||
3513 | |||
3514 | for (;;) { | ||
3515 | r = shadow_step(s, root, vt); | ||
3516 | @@ -643,7 +643,7 @@ static int insert(struct dm_btree_info *info, dm_block_t root, | ||
3517 | unsigned level, index = -1, last_level = info->levels - 1; | ||
3518 | dm_block_t block = root; | ||
3519 | struct shadow_spine spine; | ||
3520 | - struct node *n; | ||
3521 | + struct btree_node *n; | ||
3522 | struct dm_btree_value_type le64_type; | ||
3523 | |||
3524 | le64_type.context = NULL; | ||
3525 | diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c | ||
3526 | index f8b7771..7604f4e 100644 | ||
3527 | --- a/drivers/mfd/mfd-core.c | ||
3528 | +++ b/drivers/mfd/mfd-core.c | ||
3529 | @@ -21,6 +21,10 @@ | ||
3530 | #include <linux/irqdomain.h> | ||
3531 | #include <linux/of.h> | ||
3532 | |||
3533 | +static struct device_type mfd_dev_type = { | ||
3534 | + .name = "mfd_device", | ||
3535 | +}; | ||
3536 | + | ||
3537 | int mfd_cell_enable(struct platform_device *pdev) | ||
3538 | { | ||
3539 | const struct mfd_cell *cell = mfd_get_cell(pdev); | ||
3540 | @@ -91,6 +95,7 @@ static int mfd_add_device(struct device *parent, int id, | ||
3541 | goto fail_device; | ||
3542 | |||
3543 | pdev->dev.parent = parent; | ||
3544 | + pdev->dev.type = &mfd_dev_type; | ||
3545 | |||
3546 | if (parent->of_node && cell->of_compatible) { | ||
3547 | for_each_child_of_node(parent->of_node, np) { | ||
3548 | @@ -204,10 +209,16 @@ EXPORT_SYMBOL(mfd_add_devices); | ||
3549 | |||
3550 | static int mfd_remove_devices_fn(struct device *dev, void *c) | ||
3551 | { | ||
3552 | - struct platform_device *pdev = to_platform_device(dev); | ||
3553 | - const struct mfd_cell *cell = mfd_get_cell(pdev); | ||
3554 | + struct platform_device *pdev; | ||
3555 | + const struct mfd_cell *cell; | ||
3556 | atomic_t **usage_count = c; | ||
3557 | |||
3558 | + if (dev->type != &mfd_dev_type) | ||
3559 | + return 0; | ||
3560 | + | ||
3561 | + pdev = to_platform_device(dev); | ||
3562 | + cell = mfd_get_cell(pdev); | ||
3563 | + | ||
3564 | /* find the base address of usage_count pointers (for freeing) */ | ||
3565 | if (!*usage_count || (cell->usage_count < *usage_count)) | ||
3566 | *usage_count = cell->usage_count; | ||
3567 | diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c | ||
3568 | index 8fefc96..f1ac288 100644 | ||
3569 | --- a/drivers/mfd/wm8994-core.c | ||
3570 | +++ b/drivers/mfd/wm8994-core.c | ||
3571 | @@ -557,6 +557,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq) | ||
3572 | case 1: | ||
3573 | case 2: | ||
3574 | case 3: | ||
3575 | + case 4: | ||
3576 | regmap_patch = wm1811_reva_patch; | ||
3577 | patch_regs = ARRAY_SIZE(wm1811_reva_patch); | ||
3578 | break; | ||
3579 | diff --git a/drivers/mtd/nand/cs553x_nand.c b/drivers/mtd/nand/cs553x_nand.c | ||
3580 | index adb6c3e..2cdeab8 100644 | ||
3581 | --- a/drivers/mtd/nand/cs553x_nand.c | ||
3582 | +++ b/drivers/mtd/nand/cs553x_nand.c | ||
3583 | @@ -237,6 +237,7 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr) | ||
3584 | this->ecc.hwctl = cs_enable_hwecc; | ||
3585 | this->ecc.calculate = cs_calculate_ecc; | ||
3586 | this->ecc.correct = nand_correct_data; | ||
3587 | + this->ecc.strength = 1; | ||
3588 | |||
3589 | /* Enable the following for a flash based bad block table */ | ||
3590 | this->bbt_options = NAND_BBT_USE_FLASH; | ||
3591 | @@ -247,8 +248,6 @@ static int __init cs553x_init_one(int cs, int mmio, unsigned long adr) | ||
3592 | goto out_ior; | ||
3593 | } | ||
3594 | |||
3595 | - this->ecc.strength = 1; | ||
3596 | - | ||
3597 | new_mtd->name = kasprintf(GFP_KERNEL, "cs553x_nand_cs%d", cs); | ||
3598 | |||
3599 | cs553x_mtd[cs] = new_mtd; | ||
3600 | diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c | ||
3601 | index 3502acc..84f0526 100644 | ||
3602 | --- a/drivers/mtd/nand/gpmi-nand/gpmi-lib.c | ||
3603 | +++ b/drivers/mtd/nand/gpmi-nand/gpmi-lib.c | ||
3604 | @@ -166,6 +166,15 @@ int gpmi_init(struct gpmi_nand_data *this) | ||
3605 | if (ret) | ||
3606 | goto err_out; | ||
3607 | |||
3608 | + /* | ||
3609 | + * Reset BCH here, too. We got failures otherwise :( | ||
3610 | + * See later BCH reset for explanation of MX23 handling | ||
3611 | + */ | ||
3612 | + ret = gpmi_reset_block(r->bch_regs, GPMI_IS_MX23(this)); | ||
3613 | + if (ret) | ||
3614 | + goto err_out; | ||
3615 | + | ||
3616 | + | ||
3617 | /* Choose NAND mode. */ | ||
3618 | writel(BM_GPMI_CTRL1_GPMI_MODE, r->gpmi_regs + HW_GPMI_CTRL1_CLR); | ||
3619 | |||
3620 | diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
3621 | index 3d1899f..c4c80f6 100644 | ||
3622 | --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
3623 | +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | ||
3624 | @@ -1498,6 +1498,7 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd, | ||
3625 | u32 reply; | ||
3626 | u8 is_going_down = 0; | ||
3627 | int i; | ||
3628 | + unsigned long flags; | ||
3629 | |||
3630 | slave_state[slave].comm_toggle ^= 1; | ||
3631 | reply = (u32) slave_state[slave].comm_toggle << 31; | ||
3632 | @@ -1576,12 +1577,12 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd, | ||
3633 | mlx4_warn(dev, "Bad comm cmd:%d from slave:%d\n", cmd, slave); | ||
3634 | goto reset_slave; | ||
3635 | } | ||
3636 | - spin_lock(&priv->mfunc.master.slave_state_lock); | ||
3637 | + spin_lock_irqsave(&priv->mfunc.master.slave_state_lock, flags); | ||
3638 | if (!slave_state[slave].is_slave_going_down) | ||
3639 | slave_state[slave].last_cmd = cmd; | ||
3640 | else | ||
3641 | is_going_down = 1; | ||
3642 | - spin_unlock(&priv->mfunc.master.slave_state_lock); | ||
3643 | + spin_unlock_irqrestore(&priv->mfunc.master.slave_state_lock, flags); | ||
3644 | if (is_going_down) { | ||
3645 | mlx4_warn(dev, "Slave is going down aborting command(%d)" | ||
3646 | " executing from slave:%d\n", | ||
3647 | @@ -1597,10 +1598,10 @@ static void mlx4_master_do_cmd(struct mlx4_dev *dev, int slave, u8 cmd, | ||
3648 | reset_slave: | ||
3649 | /* cleanup any slave resources */ | ||
3650 | mlx4_delete_all_resources_for_slave(dev, slave); | ||
3651 | - spin_lock(&priv->mfunc.master.slave_state_lock); | ||
3652 | + spin_lock_irqsave(&priv->mfunc.master.slave_state_lock, flags); | ||
3653 | if (!slave_state[slave].is_slave_going_down) | ||
3654 | slave_state[slave].last_cmd = MLX4_COMM_CMD_RESET; | ||
3655 | - spin_unlock(&priv->mfunc.master.slave_state_lock); | ||
3656 | + spin_unlock_irqrestore(&priv->mfunc.master.slave_state_lock, flags); | ||
3657 | /*with slave in the middle of flr, no need to clean resources again.*/ | ||
3658 | inform_slave_state: | ||
3659 | memset(&slave_state[slave].event_eq, 0, | ||
3660 | diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c | ||
3661 | index b84a88b..cda430b 100644 | ||
3662 | --- a/drivers/net/ethernet/mellanox/mlx4/eq.c | ||
3663 | +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c | ||
3664 | @@ -401,6 +401,7 @@ void mlx4_master_handle_slave_flr(struct work_struct *work) | ||
3665 | struct mlx4_slave_state *slave_state = priv->mfunc.master.slave_state; | ||
3666 | int i; | ||
3667 | int err; | ||
3668 | + unsigned long flags; | ||
3669 | |||
3670 | mlx4_dbg(dev, "mlx4_handle_slave_flr\n"); | ||
3671 | |||
3672 | @@ -412,10 +413,10 @@ void mlx4_master_handle_slave_flr(struct work_struct *work) | ||
3673 | |||
3674 | mlx4_delete_all_resources_for_slave(dev, i); | ||
3675 | /*return the slave to running mode*/ | ||
3676 | - spin_lock(&priv->mfunc.master.slave_state_lock); | ||
3677 | + spin_lock_irqsave(&priv->mfunc.master.slave_state_lock, flags); | ||
3678 | slave_state[i].last_cmd = MLX4_COMM_CMD_RESET; | ||
3679 | slave_state[i].is_slave_going_down = 0; | ||
3680 | - spin_unlock(&priv->mfunc.master.slave_state_lock); | ||
3681 | + spin_unlock_irqrestore(&priv->mfunc.master.slave_state_lock, flags); | ||
3682 | /*notify the FW:*/ | ||
3683 | err = mlx4_cmd(dev, 0, i, 0, MLX4_CMD_INFORM_FLR_DONE, | ||
3684 | MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED); | ||
3685 | @@ -440,6 +441,7 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) | ||
3686 | u8 update_slave_state; | ||
3687 | int i; | ||
3688 | enum slave_port_gen_event gen_event; | ||
3689 | + unsigned long flags; | ||
3690 | |||
3691 | while ((eqe = next_eqe_sw(eq))) { | ||
3692 | /* | ||
3693 | @@ -647,13 +649,13 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) | ||
3694 | } else | ||
3695 | update_slave_state = 1; | ||
3696 | |||
3697 | - spin_lock(&priv->mfunc.master.slave_state_lock); | ||
3698 | + spin_lock_irqsave(&priv->mfunc.master.slave_state_lock, flags); | ||
3699 | if (update_slave_state) { | ||
3700 | priv->mfunc.master.slave_state[flr_slave].active = false; | ||
3701 | priv->mfunc.master.slave_state[flr_slave].last_cmd = MLX4_COMM_CMD_FLR; | ||
3702 | priv->mfunc.master.slave_state[flr_slave].is_slave_going_down = 1; | ||
3703 | } | ||
3704 | - spin_unlock(&priv->mfunc.master.slave_state_lock); | ||
3705 | + spin_unlock_irqrestore(&priv->mfunc.master.slave_state_lock, flags); | ||
3706 | queue_work(priv->mfunc.master.comm_wq, | ||
3707 | &priv->mfunc.master.slave_flr_event_work); | ||
3708 | break; | ||
3709 | diff --git a/drivers/net/wimax/i2400m/i2400m-usb.h b/drivers/net/wimax/i2400m/i2400m-usb.h | ||
3710 | index 6650fde..9f1e947 100644 | ||
3711 | --- a/drivers/net/wimax/i2400m/i2400m-usb.h | ||
3712 | +++ b/drivers/net/wimax/i2400m/i2400m-usb.h | ||
3713 | @@ -152,6 +152,9 @@ enum { | ||
3714 | /* Device IDs */ | ||
3715 | USB_DEVICE_ID_I6050 = 0x0186, | ||
3716 | USB_DEVICE_ID_I6050_2 = 0x0188, | ||
3717 | + USB_DEVICE_ID_I6150 = 0x07d6, | ||
3718 | + USB_DEVICE_ID_I6150_2 = 0x07d7, | ||
3719 | + USB_DEVICE_ID_I6150_3 = 0x07d9, | ||
3720 | USB_DEVICE_ID_I6250 = 0x0187, | ||
3721 | }; | ||
3722 | |||
3723 | diff --git a/drivers/net/wimax/i2400m/usb.c b/drivers/net/wimax/i2400m/usb.c | ||
3724 | index 713d033..080f363 100644 | ||
3725 | --- a/drivers/net/wimax/i2400m/usb.c | ||
3726 | +++ b/drivers/net/wimax/i2400m/usb.c | ||
3727 | @@ -510,6 +510,9 @@ int i2400mu_probe(struct usb_interface *iface, | ||
3728 | switch (id->idProduct) { | ||
3729 | case USB_DEVICE_ID_I6050: | ||
3730 | case USB_DEVICE_ID_I6050_2: | ||
3731 | + case USB_DEVICE_ID_I6150: | ||
3732 | + case USB_DEVICE_ID_I6150_2: | ||
3733 | + case USB_DEVICE_ID_I6150_3: | ||
3734 | case USB_DEVICE_ID_I6250: | ||
3735 | i2400mu->i6050 = 1; | ||
3736 | break; | ||
3737 | @@ -759,6 +762,9 @@ static | ||
3738 | struct usb_device_id i2400mu_id_table[] = { | ||
3739 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6050) }, | ||
3740 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6050_2) }, | ||
3741 | + { USB_DEVICE(0x8087, USB_DEVICE_ID_I6150) }, | ||
3742 | + { USB_DEVICE(0x8087, USB_DEVICE_ID_I6150_2) }, | ||
3743 | + { USB_DEVICE(0x8087, USB_DEVICE_ID_I6150_3) }, | ||
3744 | { USB_DEVICE(0x8086, USB_DEVICE_ID_I6250) }, | ||
3745 | { USB_DEVICE(0x8086, 0x0181) }, | ||
3746 | { USB_DEVICE(0x8086, 0x1403) }, | ||
3747 | diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c | ||
3748 | index 9f31cfa..a4ee253 100644 | ||
3749 | --- a/drivers/net/wireless/ath/ath5k/base.c | ||
3750 | +++ b/drivers/net/wireless/ath/ath5k/base.c | ||
3751 | @@ -848,7 +848,7 @@ ath5k_txbuf_free_skb(struct ath5k_hw *ah, struct ath5k_buf *bf) | ||
3752 | return; | ||
3753 | dma_unmap_single(ah->dev, bf->skbaddr, bf->skb->len, | ||
3754 | DMA_TO_DEVICE); | ||
3755 | - dev_kfree_skb_any(bf->skb); | ||
3756 | + ieee80211_free_txskb(ah->hw, bf->skb); | ||
3757 | bf->skb = NULL; | ||
3758 | bf->skbaddr = 0; | ||
3759 | bf->desc->ds_data = 0; | ||
3760 | @@ -1575,7 +1575,7 @@ ath5k_tx_queue(struct ieee80211_hw *hw, struct sk_buff *skb, | ||
3761 | return; | ||
3762 | |||
3763 | drop_packet: | ||
3764 | - dev_kfree_skb_any(skb); | ||
3765 | + ieee80211_free_txskb(hw, skb); | ||
3766 | } | ||
3767 | |||
3768 | static void | ||
3769 | diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c | ||
3770 | index 7a28538..c1369ff 100644 | ||
3771 | --- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c | ||
3772 | +++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c | ||
3773 | @@ -62,7 +62,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, | ||
3774 | u16 qnum = skb_get_queue_mapping(skb); | ||
3775 | |||
3776 | if (WARN_ON(qnum >= ah->ah_capabilities.cap_queues.q_tx_num)) { | ||
3777 | - dev_kfree_skb_any(skb); | ||
3778 | + ieee80211_free_txskb(hw, skb); | ||
3779 | return; | ||
3780 | } | ||
3781 | |||
3782 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h | ||
3783 | index 6f7cf49..262e1e0 100644 | ||
3784 | --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h | ||
3785 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h | ||
3786 | @@ -534,98 +534,98 @@ static const u32 ar9300_2p2_baseband_core[][2] = { | ||
3787 | |||
3788 | static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = { | ||
3789 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | ||
3790 | - {0x0000a2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, | ||
3791 | - {0x0000a2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, | ||
3792 | - {0x0000a2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, | ||
3793 | + {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, | ||
3794 | + {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, | ||
3795 | + {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, | ||
3796 | {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, | ||
3797 | - {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, | ||
3798 | - {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3799 | - {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, | ||
3800 | - {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004}, | ||
3801 | - {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, | ||
3802 | - {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202}, | ||
3803 | - {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400}, | ||
3804 | - {0x0000a518, 0x21002220, 0x21002220, 0x16000402, 0x16000402}, | ||
3805 | - {0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404}, | ||
3806 | - {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603}, | ||
3807 | - {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02}, | ||
3808 | - {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04}, | ||
3809 | - {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20}, | ||
3810 | - {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20}, | ||
3811 | - {0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22}, | ||
3812 | - {0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24}, | ||
3813 | - {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640}, | ||
3814 | - {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660}, | ||
3815 | - {0x0000a544, 0x52022470, 0x52022470, 0x3f001861, 0x3f001861}, | ||
3816 | - {0x0000a548, 0x55022490, 0x55022490, 0x43001a81, 0x43001a81}, | ||
3817 | - {0x0000a54c, 0x59022492, 0x59022492, 0x47001a83, 0x47001a83}, | ||
3818 | - {0x0000a550, 0x5d022692, 0x5d022692, 0x4a001c84, 0x4a001c84}, | ||
3819 | - {0x0000a554, 0x61022892, 0x61022892, 0x4e001ce3, 0x4e001ce3}, | ||
3820 | - {0x0000a558, 0x65024890, 0x65024890, 0x52001ce5, 0x52001ce5}, | ||
3821 | - {0x0000a55c, 0x69024892, 0x69024892, 0x56001ce9, 0x56001ce9}, | ||
3822 | - {0x0000a560, 0x6e024c92, 0x6e024c92, 0x5a001ceb, 0x5a001ceb}, | ||
3823 | - {0x0000a564, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
3824 | - {0x0000a568, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
3825 | - {0x0000a56c, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
3826 | - {0x0000a570, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
3827 | - {0x0000a574, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
3828 | - {0x0000a578, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
3829 | - {0x0000a57c, 0x74026e92, 0x74026e92, 0x5d001eec, 0x5d001eec}, | ||
3830 | - {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, | ||
3831 | - {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002}, | ||
3832 | - {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004}, | ||
3833 | - {0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200}, | ||
3834 | - {0x0000a590, 0x16800220, 0x16800220, 0x0f800202, 0x0f800202}, | ||
3835 | - {0x0000a594, 0x1c800223, 0x1c800223, 0x12800400, 0x12800400}, | ||
3836 | - {0x0000a598, 0x21802220, 0x21802220, 0x16800402, 0x16800402}, | ||
3837 | - {0x0000a59c, 0x27802223, 0x27802223, 0x19800404, 0x19800404}, | ||
3838 | - {0x0000a5a0, 0x2b822220, 0x2b822220, 0x1c800603, 0x1c800603}, | ||
3839 | - {0x0000a5a4, 0x2f822222, 0x2f822222, 0x21800a02, 0x21800a02}, | ||
3840 | - {0x0000a5a8, 0x34822225, 0x34822225, 0x25800a04, 0x25800a04}, | ||
3841 | - {0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x28800a20, 0x28800a20}, | ||
3842 | - {0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x2c800e20, 0x2c800e20}, | ||
3843 | - {0x0000a5b4, 0x4282242a, 0x4282242a, 0x30800e22, 0x30800e22}, | ||
3844 | - {0x0000a5b8, 0x4782244a, 0x4782244a, 0x34800e24, 0x34800e24}, | ||
3845 | - {0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x38801640, 0x38801640}, | ||
3846 | - {0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x3c801660, 0x3c801660}, | ||
3847 | - {0x0000a5c4, 0x52822470, 0x52822470, 0x3f801861, 0x3f801861}, | ||
3848 | - {0x0000a5c8, 0x55822490, 0x55822490, 0x43801a81, 0x43801a81}, | ||
3849 | - {0x0000a5cc, 0x59822492, 0x59822492, 0x47801a83, 0x47801a83}, | ||
3850 | - {0x0000a5d0, 0x5d822692, 0x5d822692, 0x4a801c84, 0x4a801c84}, | ||
3851 | - {0x0000a5d4, 0x61822892, 0x61822892, 0x4e801ce3, 0x4e801ce3}, | ||
3852 | - {0x0000a5d8, 0x65824890, 0x65824890, 0x52801ce5, 0x52801ce5}, | ||
3853 | - {0x0000a5dc, 0x69824892, 0x69824892, 0x56801ce9, 0x56801ce9}, | ||
3854 | - {0x0000a5e0, 0x6e824c92, 0x6e824c92, 0x5a801ceb, 0x5a801ceb}, | ||
3855 | - {0x0000a5e4, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3856 | - {0x0000a5e8, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3857 | - {0x0000a5ec, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3858 | - {0x0000a5f0, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3859 | - {0x0000a5f4, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3860 | - {0x0000a5f8, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3861 | - {0x0000a5fc, 0x74826e92, 0x74826e92, 0x5d801eec, 0x5d801eec}, | ||
3862 | + {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9}, | ||
3863 | + {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000}, | ||
3864 | + {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002}, | ||
3865 | + {0x0000a508, 0x09002421, 0x09002421, 0x08000004, 0x08000004}, | ||
3866 | + {0x0000a50c, 0x0d002621, 0x0d002621, 0x0b000200, 0x0b000200}, | ||
3867 | + {0x0000a510, 0x13004620, 0x13004620, 0x0f000202, 0x0f000202}, | ||
3868 | + {0x0000a514, 0x19004a20, 0x19004a20, 0x11000400, 0x11000400}, | ||
3869 | + {0x0000a518, 0x1d004e20, 0x1d004e20, 0x15000402, 0x15000402}, | ||
3870 | + {0x0000a51c, 0x21005420, 0x21005420, 0x19000404, 0x19000404}, | ||
3871 | + {0x0000a520, 0x26005e20, 0x26005e20, 0x1b000603, 0x1b000603}, | ||
3872 | + {0x0000a524, 0x2b005e40, 0x2b005e40, 0x1f000a02, 0x1f000a02}, | ||
3873 | + {0x0000a528, 0x2f005e42, 0x2f005e42, 0x23000a04, 0x23000a04}, | ||
3874 | + {0x0000a52c, 0x33005e44, 0x33005e44, 0x26000a20, 0x26000a20}, | ||
3875 | + {0x0000a530, 0x38005e65, 0x38005e65, 0x2a000e20, 0x2a000e20}, | ||
3876 | + {0x0000a534, 0x3c005e69, 0x3c005e69, 0x2e000e22, 0x2e000e22}, | ||
3877 | + {0x0000a538, 0x40005e6b, 0x40005e6b, 0x31000e24, 0x31000e24}, | ||
3878 | + {0x0000a53c, 0x44005e6d, 0x44005e6d, 0x34001640, 0x34001640}, | ||
3879 | + {0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660}, | ||
3880 | + {0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861}, | ||
3881 | + {0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81}, | ||
3882 | + {0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83}, | ||
3883 | + {0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84}, | ||
3884 | + {0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3}, | ||
3885 | + {0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5}, | ||
3886 | + {0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x50001ce9, 0x50001ce9}, | ||
3887 | + {0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x54001ceb, 0x54001ceb}, | ||
3888 | + {0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3889 | + {0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3890 | + {0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3891 | + {0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3892 | + {0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3893 | + {0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3894 | + {0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec}, | ||
3895 | + {0x0000a580, 0x00802220, 0x00802220, 0x00800000, 0x00800000}, | ||
3896 | + {0x0000a584, 0x04802222, 0x04802222, 0x04800002, 0x04800002}, | ||
3897 | + {0x0000a588, 0x09802421, 0x09802421, 0x08800004, 0x08800004}, | ||
3898 | + {0x0000a58c, 0x0d802621, 0x0d802621, 0x0b800200, 0x0b800200}, | ||
3899 | + {0x0000a590, 0x13804620, 0x13804620, 0x0f800202, 0x0f800202}, | ||
3900 | + {0x0000a594, 0x19804a20, 0x19804a20, 0x11800400, 0x11800400}, | ||
3901 | + {0x0000a598, 0x1d804e20, 0x1d804e20, 0x15800402, 0x15800402}, | ||
3902 | + {0x0000a59c, 0x21805420, 0x21805420, 0x19800404, 0x19800404}, | ||
3903 | + {0x0000a5a0, 0x26805e20, 0x26805e20, 0x1b800603, 0x1b800603}, | ||
3904 | + {0x0000a5a4, 0x2b805e40, 0x2b805e40, 0x1f800a02, 0x1f800a02}, | ||
3905 | + {0x0000a5a8, 0x2f805e42, 0x2f805e42, 0x23800a04, 0x23800a04}, | ||
3906 | + {0x0000a5ac, 0x33805e44, 0x33805e44, 0x26800a20, 0x26800a20}, | ||
3907 | + {0x0000a5b0, 0x38805e65, 0x38805e65, 0x2a800e20, 0x2a800e20}, | ||
3908 | + {0x0000a5b4, 0x3c805e69, 0x3c805e69, 0x2e800e22, 0x2e800e22}, | ||
3909 | + {0x0000a5b8, 0x40805e6b, 0x40805e6b, 0x31800e24, 0x31800e24}, | ||
3910 | + {0x0000a5bc, 0x44805e6d, 0x44805e6d, 0x34801640, 0x34801640}, | ||
3911 | + {0x0000a5c0, 0x49805e72, 0x49805e72, 0x38801660, 0x38801660}, | ||
3912 | + {0x0000a5c4, 0x4e805eb2, 0x4e805eb2, 0x3b801861, 0x3b801861}, | ||
3913 | + {0x0000a5c8, 0x53805f12, 0x53805f12, 0x3e801a81, 0x3e801a81}, | ||
3914 | + {0x0000a5cc, 0x59825eb2, 0x59825eb2, 0x42801a83, 0x42801a83}, | ||
3915 | + {0x0000a5d0, 0x5e825f12, 0x5e825f12, 0x44801c84, 0x44801c84}, | ||
3916 | + {0x0000a5d4, 0x61827f12, 0x61827f12, 0x48801ce3, 0x48801ce3}, | ||
3917 | + {0x0000a5d8, 0x6782bf12, 0x6782bf12, 0x4c801ce5, 0x4c801ce5}, | ||
3918 | + {0x0000a5dc, 0x6b82bf14, 0x6b82bf14, 0x50801ce9, 0x50801ce9}, | ||
3919 | + {0x0000a5e0, 0x6f82bf16, 0x6f82bf16, 0x54801ceb, 0x54801ceb}, | ||
3920 | + {0x0000a5e4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3921 | + {0x0000a5e8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3922 | + {0x0000a5ec, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3923 | + {0x0000a5f0, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3924 | + {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3925 | + {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3926 | + {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec}, | ||
3927 | {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3928 | {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3929 | {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3930 | {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3931 | - {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
3932 | - {0x0000a614, 0x02004000, 0x02004000, 0x01404000, 0x01404000}, | ||
3933 | - {0x0000a618, 0x02004801, 0x02004801, 0x01404501, 0x01404501}, | ||
3934 | - {0x0000a61c, 0x02808a02, 0x02808a02, 0x02008501, 0x02008501}, | ||
3935 | - {0x0000a620, 0x0380ce03, 0x0380ce03, 0x0280ca03, 0x0280ca03}, | ||
3936 | - {0x0000a624, 0x04411104, 0x04411104, 0x03010c04, 0x03010c04}, | ||
3937 | - {0x0000a628, 0x04411104, 0x04411104, 0x04014c04, 0x04014c04}, | ||
3938 | - {0x0000a62c, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, | ||
3939 | - {0x0000a630, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, | ||
3940 | - {0x0000a634, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, | ||
3941 | - {0x0000a638, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, | ||
3942 | - {0x0000a63c, 0x04411104, 0x04411104, 0x04015005, 0x04015005}, | ||
3943 | - {0x0000b2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, | ||
3944 | - {0x0000b2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, | ||
3945 | - {0x0000b2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, | ||
3946 | + {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000}, | ||
3947 | + {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000}, | ||
3948 | + {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501}, | ||
3949 | + {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501}, | ||
3950 | + {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03}, | ||
3951 | + {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04}, | ||
3952 | + {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04}, | ||
3953 | + {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, | ||
3954 | + {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, | ||
3955 | + {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, | ||
3956 | + {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, | ||
3957 | + {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005}, | ||
3958 | + {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, | ||
3959 | + {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, | ||
3960 | + {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, | ||
3961 | {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, | ||
3962 | - {0x0000c2dc, 0x00033800, 0x00033800, 0x03aaa352, 0x03aaa352}, | ||
3963 | - {0x0000c2e0, 0x0003c000, 0x0003c000, 0x03ccc584, 0x03ccc584}, | ||
3964 | - {0x0000c2e4, 0x03fc0000, 0x03fc0000, 0x03f0f800, 0x03f0f800}, | ||
3965 | + {0x0000c2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352}, | ||
3966 | + {0x0000c2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584}, | ||
3967 | + {0x0000c2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800}, | ||
3968 | {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000}, | ||
3969 | {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | ||
3970 | {0x00016048, 0x66480001, 0x66480001, 0x66480001, 0x66480001}, | ||
3971 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h | ||
3972 | index 41b1a75..54ba42f 100644 | ||
3973 | --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h | ||
3974 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h | ||
3975 | @@ -68,13 +68,13 @@ | ||
3976 | #define AR9300_BASE_ADDR 0x3ff | ||
3977 | #define AR9300_BASE_ADDR_512 0x1ff | ||
3978 | |||
3979 | -#define AR9300_OTP_BASE 0x14000 | ||
3980 | -#define AR9300_OTP_STATUS 0x15f18 | ||
3981 | +#define AR9300_OTP_BASE (AR_SREV_9340(ah) ? 0x30000 : 0x14000) | ||
3982 | +#define AR9300_OTP_STATUS (AR_SREV_9340(ah) ? 0x30018 : 0x15f18) | ||
3983 | #define AR9300_OTP_STATUS_TYPE 0x7 | ||
3984 | #define AR9300_OTP_STATUS_VALID 0x4 | ||
3985 | #define AR9300_OTP_STATUS_ACCESS_BUSY 0x2 | ||
3986 | #define AR9300_OTP_STATUS_SM_BUSY 0x1 | ||
3987 | -#define AR9300_OTP_READ_DATA 0x15f1c | ||
3988 | +#define AR9300_OTP_READ_DATA (AR_SREV_9340(ah) ? 0x3001c : 0x15f1c) | ||
3989 | |||
3990 | enum targetPowerHTRates { | ||
3991 | HT_TARGET_RATE_0_8_16, | ||
3992 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c | ||
3993 | index 1a36fa2..226dd13 100644 | ||
3994 | --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c | ||
3995 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c | ||
3996 | @@ -219,10 +219,10 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah) | ||
3997 | |||
3998 | /* Awake -> Sleep Setting */ | ||
3999 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
4000 | - ar9462_pciephy_pll_on_clkreq_disable_L1_2p0); | ||
4001 | + ar9462_pciephy_clkreq_disable_L1_2p0); | ||
4002 | /* Sleep -> Awake Setting */ | ||
4003 | INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, | ||
4004 | - ar9462_pciephy_pll_on_clkreq_disable_L1_2p0); | ||
4005 | + ar9462_pciephy_clkreq_disable_L1_2p0); | ||
4006 | |||
4007 | /* Fast clock modal settings */ | ||
4008 | INIT_INI_ARRAY(&ah->iniModesFastClock, | ||
4009 | @@ -540,7 +540,7 @@ static void ar9003_rx_gain_table_mode0(struct ath_hw *ah) | ||
4010 | ar9340Common_rx_gain_table_1p0); | ||
4011 | else if (AR_SREV_9485_11(ah)) | ||
4012 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
4013 | - ar9485Common_wo_xlna_rx_gain_1_1); | ||
4014 | + ar9485_common_rx_gain_1_1); | ||
4015 | else if (AR_SREV_9550(ah)) { | ||
4016 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
4017 | ar955x_1p0_common_rx_gain_table); | ||
4018 | diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c | ||
4019 | index e5cceb0..bbd249d 100644 | ||
4020 | --- a/drivers/net/wireless/ath/ath9k/calib.c | ||
4021 | +++ b/drivers/net/wireless/ath/ath9k/calib.c | ||
4022 | @@ -69,6 +69,7 @@ s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan) | ||
4023 | |||
4024 | if (chan && chan->noisefloor) { | ||
4025 | s8 delta = chan->noisefloor - | ||
4026 | + ATH9K_NF_CAL_NOISE_THRESH - | ||
4027 | ath9k_hw_get_default_nf(ah, chan); | ||
4028 | if (delta > 0) | ||
4029 | noise += delta; | ||
4030 | diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h | ||
4031 | index 1060c19..60dcb6c 100644 | ||
4032 | --- a/drivers/net/wireless/ath/ath9k/calib.h | ||
4033 | +++ b/drivers/net/wireless/ath/ath9k/calib.h | ||
4034 | @@ -21,6 +21,9 @@ | ||
4035 | |||
4036 | #define AR_PHY_CCA_FILTERWINDOW_LENGTH 5 | ||
4037 | |||
4038 | +/* Internal noise floor can vary by about 6db depending on the frequency */ | ||
4039 | +#define ATH9K_NF_CAL_NOISE_THRESH 6 | ||
4040 | + | ||
4041 | #define NUM_NF_READINGS 6 | ||
4042 | #define ATH9K_NF_CAL_HIST_MAX 5 | ||
4043 | |||
4044 | diff --git a/drivers/net/wireless/ath/carl9170/fw.c b/drivers/net/wireless/ath/carl9170/fw.c | ||
4045 | index 24ac287..98f4010 100644 | ||
4046 | --- a/drivers/net/wireless/ath/carl9170/fw.c | ||
4047 | +++ b/drivers/net/wireless/ath/carl9170/fw.c | ||
4048 | @@ -341,8 +341,12 @@ static int carl9170_fw(struct ar9170 *ar, const __u8 *data, size_t len) | ||
4049 | if (SUPP(CARL9170FW_WLANTX_CAB)) { | ||
4050 | if_comb_types |= | ||
4051 | BIT(NL80211_IFTYPE_AP) | | ||
4052 | - BIT(NL80211_IFTYPE_MESH_POINT) | | ||
4053 | BIT(NL80211_IFTYPE_P2P_GO); | ||
4054 | + | ||
4055 | +#ifdef CONFIG_MAC80211_MESH | ||
4056 | + if_comb_types |= | ||
4057 | + BIT(NL80211_IFTYPE_MESH_POINT); | ||
4058 | +#endif /* CONFIG_MAC80211_MESH */ | ||
4059 | } | ||
4060 | } | ||
4061 | |||
4062 | diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h | ||
4063 | index b298e5d..10e288d 100644 | ||
4064 | --- a/drivers/net/wireless/b43/b43.h | ||
4065 | +++ b/drivers/net/wireless/b43/b43.h | ||
4066 | @@ -7,6 +7,7 @@ | ||
4067 | #include <linux/hw_random.h> | ||
4068 | #include <linux/bcma/bcma.h> | ||
4069 | #include <linux/ssb/ssb.h> | ||
4070 | +#include <linux/completion.h> | ||
4071 | #include <net/mac80211.h> | ||
4072 | |||
4073 | #include "debugfs.h" | ||
4074 | @@ -722,6 +723,10 @@ enum b43_firmware_file_type { | ||
4075 | struct b43_request_fw_context { | ||
4076 | /* The device we are requesting the fw for. */ | ||
4077 | struct b43_wldev *dev; | ||
4078 | + /* a completion event structure needed if this call is asynchronous */ | ||
4079 | + struct completion fw_load_complete; | ||
4080 | + /* a pointer to the firmware object */ | ||
4081 | + const struct firmware *blob; | ||
4082 | /* The type of firmware to request. */ | ||
4083 | enum b43_firmware_file_type req_type; | ||
4084 | /* Error messages for each firmware type. */ | ||
4085 | diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c | ||
4086 | index 2911e20..263667f 100644 | ||
4087 | --- a/drivers/net/wireless/b43/main.c | ||
4088 | +++ b/drivers/net/wireless/b43/main.c | ||
4089 | @@ -2088,11 +2088,18 @@ static void b43_print_fw_helptext(struct b43_wl *wl, bool error) | ||
4090 | b43warn(wl, text); | ||
4091 | } | ||
4092 | |||
4093 | +static void b43_fw_cb(const struct firmware *firmware, void *context) | ||
4094 | +{ | ||
4095 | + struct b43_request_fw_context *ctx = context; | ||
4096 | + | ||
4097 | + ctx->blob = firmware; | ||
4098 | + complete(&ctx->fw_load_complete); | ||
4099 | +} | ||
4100 | + | ||
4101 | int b43_do_request_fw(struct b43_request_fw_context *ctx, | ||
4102 | const char *name, | ||
4103 | - struct b43_firmware_file *fw) | ||
4104 | + struct b43_firmware_file *fw, bool async) | ||
4105 | { | ||
4106 | - const struct firmware *blob; | ||
4107 | struct b43_fw_header *hdr; | ||
4108 | u32 size; | ||
4109 | int err; | ||
4110 | @@ -2131,11 +2138,31 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx, | ||
4111 | B43_WARN_ON(1); | ||
4112 | return -ENOSYS; | ||
4113 | } | ||
4114 | - err = request_firmware(&blob, ctx->fwname, ctx->dev->dev->dev); | ||
4115 | + if (async) { | ||
4116 | + /* do this part asynchronously */ | ||
4117 | + init_completion(&ctx->fw_load_complete); | ||
4118 | + err = request_firmware_nowait(THIS_MODULE, 1, ctx->fwname, | ||
4119 | + ctx->dev->dev->dev, GFP_KERNEL, | ||
4120 | + ctx, b43_fw_cb); | ||
4121 | + if (err < 0) { | ||
4122 | + pr_err("Unable to load firmware\n"); | ||
4123 | + return err; | ||
4124 | + } | ||
4125 | + /* stall here until fw ready */ | ||
4126 | + wait_for_completion(&ctx->fw_load_complete); | ||
4127 | + if (ctx->blob) | ||
4128 | + goto fw_ready; | ||
4129 | + /* On some ARM systems, the async request will fail, but the next sync | ||
4130 | + * request works. For this reason, we dall through here | ||
4131 | + */ | ||
4132 | + } | ||
4133 | + err = request_firmware(&ctx->blob, ctx->fwname, | ||
4134 | + ctx->dev->dev->dev); | ||
4135 | if (err == -ENOENT) { | ||
4136 | snprintf(ctx->errors[ctx->req_type], | ||
4137 | sizeof(ctx->errors[ctx->req_type]), | ||
4138 | - "Firmware file \"%s\" not found\n", ctx->fwname); | ||
4139 | + "Firmware file \"%s\" not found\n", | ||
4140 | + ctx->fwname); | ||
4141 | return err; | ||
4142 | } else if (err) { | ||
4143 | snprintf(ctx->errors[ctx->req_type], | ||
4144 | @@ -2144,14 +2171,15 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx, | ||
4145 | ctx->fwname, err); | ||
4146 | return err; | ||
4147 | } | ||
4148 | - if (blob->size < sizeof(struct b43_fw_header)) | ||
4149 | +fw_ready: | ||
4150 | + if (ctx->blob->size < sizeof(struct b43_fw_header)) | ||
4151 | goto err_format; | ||
4152 | - hdr = (struct b43_fw_header *)(blob->data); | ||
4153 | + hdr = (struct b43_fw_header *)(ctx->blob->data); | ||
4154 | switch (hdr->type) { | ||
4155 | case B43_FW_TYPE_UCODE: | ||
4156 | case B43_FW_TYPE_PCM: | ||
4157 | size = be32_to_cpu(hdr->size); | ||
4158 | - if (size != blob->size - sizeof(struct b43_fw_header)) | ||
4159 | + if (size != ctx->blob->size - sizeof(struct b43_fw_header)) | ||
4160 | goto err_format; | ||
4161 | /* fallthrough */ | ||
4162 | case B43_FW_TYPE_IV: | ||
4163 | @@ -2162,7 +2190,7 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx, | ||
4164 | goto err_format; | ||
4165 | } | ||
4166 | |||
4167 | - fw->data = blob; | ||
4168 | + fw->data = ctx->blob; | ||
4169 | fw->filename = name; | ||
4170 | fw->type = ctx->req_type; | ||
4171 | |||
4172 | @@ -2172,7 +2200,7 @@ err_format: | ||
4173 | snprintf(ctx->errors[ctx->req_type], | ||
4174 | sizeof(ctx->errors[ctx->req_type]), | ||
4175 | "Firmware file \"%s\" format error.\n", ctx->fwname); | ||
4176 | - release_firmware(blob); | ||
4177 | + release_firmware(ctx->blob); | ||
4178 | |||
4179 | return -EPROTO; | ||
4180 | } | ||
4181 | @@ -2223,7 +2251,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx) | ||
4182 | goto err_no_ucode; | ||
4183 | } | ||
4184 | } | ||
4185 | - err = b43_do_request_fw(ctx, filename, &fw->ucode); | ||
4186 | + err = b43_do_request_fw(ctx, filename, &fw->ucode, true); | ||
4187 | if (err) | ||
4188 | goto err_load; | ||
4189 | |||
4190 | @@ -2235,7 +2263,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx) | ||
4191 | else | ||
4192 | goto err_no_pcm; | ||
4193 | fw->pcm_request_failed = false; | ||
4194 | - err = b43_do_request_fw(ctx, filename, &fw->pcm); | ||
4195 | + err = b43_do_request_fw(ctx, filename, &fw->pcm, false); | ||
4196 | if (err == -ENOENT) { | ||
4197 | /* We did not find a PCM file? Not fatal, but | ||
4198 | * core rev <= 10 must do without hwcrypto then. */ | ||
4199 | @@ -2296,7 +2324,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx) | ||
4200 | default: | ||
4201 | goto err_no_initvals; | ||
4202 | } | ||
4203 | - err = b43_do_request_fw(ctx, filename, &fw->initvals); | ||
4204 | + err = b43_do_request_fw(ctx, filename, &fw->initvals, false); | ||
4205 | if (err) | ||
4206 | goto err_load; | ||
4207 | |||
4208 | @@ -2355,7 +2383,7 @@ static int b43_try_request_fw(struct b43_request_fw_context *ctx) | ||
4209 | default: | ||
4210 | goto err_no_initvals; | ||
4211 | } | ||
4212 | - err = b43_do_request_fw(ctx, filename, &fw->initvals_band); | ||
4213 | + err = b43_do_request_fw(ctx, filename, &fw->initvals_band, false); | ||
4214 | if (err) | ||
4215 | goto err_load; | ||
4216 | |||
4217 | diff --git a/drivers/net/wireless/b43/main.h b/drivers/net/wireless/b43/main.h | ||
4218 | index 8c684cd..abac25e 100644 | ||
4219 | --- a/drivers/net/wireless/b43/main.h | ||
4220 | +++ b/drivers/net/wireless/b43/main.h | ||
4221 | @@ -137,9 +137,8 @@ void b43_mac_phy_clock_set(struct b43_wldev *dev, bool on); | ||
4222 | |||
4223 | |||
4224 | struct b43_request_fw_context; | ||
4225 | -int b43_do_request_fw(struct b43_request_fw_context *ctx, | ||
4226 | - const char *name, | ||
4227 | - struct b43_firmware_file *fw); | ||
4228 | +int b43_do_request_fw(struct b43_request_fw_context *ctx, const char *name, | ||
4229 | + struct b43_firmware_file *fw, bool async); | ||
4230 | void b43_do_release_fw(struct b43_firmware_file *fw); | ||
4231 | |||
4232 | #endif /* B43_MAIN_H_ */ | ||
4233 | diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | ||
4234 | index 481345c..0caa4c3 100644 | ||
4235 | --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | ||
4236 | +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | ||
4237 | @@ -3730,10 +3730,11 @@ brcmf_configure_wpaie(struct net_device *ndev, struct brcmf_vs_tlv *wpa_ie, | ||
4238 | |||
4239 | len = wpa_ie->len + TLV_HDR_LEN; | ||
4240 | data = (u8 *)wpa_ie; | ||
4241 | - offset = 0; | ||
4242 | + offset = TLV_HDR_LEN; | ||
4243 | if (!is_rsn_ie) | ||
4244 | offset += VS_IE_FIXED_HDR_LEN; | ||
4245 | - offset += WPA_IE_VERSION_LEN; | ||
4246 | + else | ||
4247 | + offset += WPA_IE_VERSION_LEN; | ||
4248 | |||
4249 | /* check for multicast cipher suite */ | ||
4250 | if (offset + WPA_IE_MIN_OUI_LEN > len) { | ||
4251 | diff --git a/drivers/net/wireless/iwlwifi/dvm/tx.c b/drivers/net/wireless/iwlwifi/dvm/tx.c | ||
4252 | index f5ca73a..aecf1ce 100644 | ||
4253 | --- a/drivers/net/wireless/iwlwifi/dvm/tx.c | ||
4254 | +++ b/drivers/net/wireless/iwlwifi/dvm/tx.c | ||
4255 | @@ -1100,29 +1100,6 @@ static void iwl_check_abort_status(struct iwl_priv *priv, | ||
4256 | } | ||
4257 | } | ||
4258 | |||
4259 | -static int iwl_reclaim(struct iwl_priv *priv, int sta_id, int tid, | ||
4260 | - int txq_id, int ssn, struct sk_buff_head *skbs) | ||
4261 | -{ | ||
4262 | - if (unlikely(txq_id >= IWLAGN_FIRST_AMPDU_QUEUE && | ||
4263 | - tid != IWL_TID_NON_QOS && | ||
4264 | - txq_id != priv->tid_data[sta_id][tid].agg.txq_id)) { | ||
4265 | - /* | ||
4266 | - * FIXME: this is a uCode bug which need to be addressed, | ||
4267 | - * log the information and return for now. | ||
4268 | - * Since it is can possibly happen very often and in order | ||
4269 | - * not to fill the syslog, don't use IWL_ERR or IWL_WARN | ||
4270 | - */ | ||
4271 | - IWL_DEBUG_TX_QUEUES(priv, | ||
4272 | - "Bad queue mapping txq_id=%d, agg_txq[sta:%d,tid:%d]=%d\n", | ||
4273 | - txq_id, sta_id, tid, | ||
4274 | - priv->tid_data[sta_id][tid].agg.txq_id); | ||
4275 | - return 1; | ||
4276 | - } | ||
4277 | - | ||
4278 | - iwl_trans_reclaim(priv->trans, txq_id, ssn, skbs); | ||
4279 | - return 0; | ||
4280 | -} | ||
4281 | - | ||
4282 | int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb, | ||
4283 | struct iwl_device_cmd *cmd) | ||
4284 | { | ||
4285 | @@ -1177,16 +1154,8 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb, | ||
4286 | next_reclaimed = ssn; | ||
4287 | } | ||
4288 | |||
4289 | - if (tid != IWL_TID_NON_QOS) { | ||
4290 | - priv->tid_data[sta_id][tid].next_reclaimed = | ||
4291 | - next_reclaimed; | ||
4292 | - IWL_DEBUG_TX_REPLY(priv, "Next reclaimed packet:%d\n", | ||
4293 | - next_reclaimed); | ||
4294 | - } | ||
4295 | + iwl_trans_reclaim(priv->trans, txq_id, ssn, &skbs); | ||
4296 | |||
4297 | - /*we can free until ssn % q.n_bd not inclusive */ | ||
4298 | - WARN_ON_ONCE(iwl_reclaim(priv, sta_id, tid, | ||
4299 | - txq_id, ssn, &skbs)); | ||
4300 | iwlagn_check_ratid_empty(priv, sta_id, tid); | ||
4301 | freed = 0; | ||
4302 | |||
4303 | @@ -1235,11 +1204,28 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb, | ||
4304 | if (!is_agg) | ||
4305 | iwlagn_non_agg_tx_status(priv, ctx, hdr->addr1); | ||
4306 | |||
4307 | + /* | ||
4308 | + * W/A for FW bug - the seq_ctl isn't updated when the | ||
4309 | + * queues are flushed. Fetch it from the packet itself | ||
4310 | + */ | ||
4311 | + if (!is_agg && status == TX_STATUS_FAIL_FIFO_FLUSHED) { | ||
4312 | + next_reclaimed = le16_to_cpu(hdr->seq_ctrl); | ||
4313 | + next_reclaimed = | ||
4314 | + SEQ_TO_SN(next_reclaimed + 0x10); | ||
4315 | + } | ||
4316 | + | ||
4317 | is_offchannel_skb = | ||
4318 | (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN); | ||
4319 | freed++; | ||
4320 | } | ||
4321 | |||
4322 | + if (tid != IWL_TID_NON_QOS) { | ||
4323 | + priv->tid_data[sta_id][tid].next_reclaimed = | ||
4324 | + next_reclaimed; | ||
4325 | + IWL_DEBUG_TX_REPLY(priv, "Next reclaimed packet:%d\n", | ||
4326 | + next_reclaimed); | ||
4327 | + } | ||
4328 | + | ||
4329 | WARN_ON(!is_agg && freed != 1); | ||
4330 | |||
4331 | /* | ||
4332 | @@ -1311,16 +1297,27 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv, | ||
4333 | return 0; | ||
4334 | } | ||
4335 | |||
4336 | + if (unlikely(scd_flow != agg->txq_id)) { | ||
4337 | + /* | ||
4338 | + * FIXME: this is a uCode bug which need to be addressed, | ||
4339 | + * log the information and return for now. | ||
4340 | + * Since it is can possibly happen very often and in order | ||
4341 | + * not to fill the syslog, don't use IWL_ERR or IWL_WARN | ||
4342 | + */ | ||
4343 | + IWL_DEBUG_TX_QUEUES(priv, | ||
4344 | + "Bad queue mapping txq_id=%d, agg_txq[sta:%d,tid:%d]=%d\n", | ||
4345 | + scd_flow, sta_id, tid, agg->txq_id); | ||
4346 | + spin_unlock(&priv->sta_lock); | ||
4347 | + return 0; | ||
4348 | + } | ||
4349 | + | ||
4350 | __skb_queue_head_init(&reclaimed_skbs); | ||
4351 | |||
4352 | /* Release all TFDs before the SSN, i.e. all TFDs in front of | ||
4353 | * block-ack window (we assume that they've been successfully | ||
4354 | * transmitted ... if not, it's too late anyway). */ | ||
4355 | - if (iwl_reclaim(priv, sta_id, tid, scd_flow, | ||
4356 | - ba_resp_scd_ssn, &reclaimed_skbs)) { | ||
4357 | - spin_unlock(&priv->sta_lock); | ||
4358 | - return 0; | ||
4359 | - } | ||
4360 | + iwl_trans_reclaim(priv->trans, scd_flow, ba_resp_scd_ssn, | ||
4361 | + &reclaimed_skbs); | ||
4362 | |||
4363 | IWL_DEBUG_TX_REPLY(priv, "REPLY_COMPRESSED_BA [%d] Received from %pM, " | ||
4364 | "sta_id = %d\n", | ||
4365 | diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c | ||
4366 | index bb69f8f..3654de2 100644 | ||
4367 | --- a/drivers/net/wireless/iwlwifi/pcie/rx.c | ||
4368 | +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c | ||
4369 | @@ -927,12 +927,20 @@ static irqreturn_t iwl_isr(int irq, void *data) | ||
4370 | * back-to-back ISRs and sporadic interrupts from our NIC. | ||
4371 | * If we have something to service, the tasklet will re-enable ints. | ||
4372 | * If we *don't* have something, we'll re-enable before leaving here. */ | ||
4373 | - inta_mask = iwl_read32(trans, CSR_INT_MASK); /* just for debug */ | ||
4374 | + inta_mask = iwl_read32(trans, CSR_INT_MASK); | ||
4375 | iwl_write32(trans, CSR_INT_MASK, 0x00000000); | ||
4376 | |||
4377 | /* Discover which interrupts are active/pending */ | ||
4378 | inta = iwl_read32(trans, CSR_INT); | ||
4379 | |||
4380 | + if (inta & (~inta_mask)) { | ||
4381 | + IWL_DEBUG_ISR(trans, | ||
4382 | + "We got a masked interrupt (0x%08x)...Ack and ignore\n", | ||
4383 | + inta & (~inta_mask)); | ||
4384 | + iwl_write32(trans, CSR_INT, inta & (~inta_mask)); | ||
4385 | + inta &= inta_mask; | ||
4386 | + } | ||
4387 | + | ||
4388 | /* Ignore interrupt if there's nothing in NIC to service. | ||
4389 | * This may be due to IRQ shared with another device, | ||
4390 | * or due to sporadic interrupts thrown from our NIC. */ | ||
4391 | @@ -963,6 +971,7 @@ static irqreturn_t iwl_isr(int irq, void *data) | ||
4392 | else if (test_bit(STATUS_INT_ENABLED, &trans_pcie->status) && | ||
4393 | !trans_pcie->inta) | ||
4394 | iwl_enable_interrupts(trans); | ||
4395 | + return IRQ_HANDLED; | ||
4396 | |||
4397 | none: | ||
4398 | /* re-enable interrupts here since we don't have anything to service. */ | ||
4399 | @@ -1015,7 +1024,7 @@ irqreturn_t iwl_isr_ict(int irq, void *data) | ||
4400 | * If we have something to service, the tasklet will re-enable ints. | ||
4401 | * If we *don't* have something, we'll re-enable before leaving here. | ||
4402 | */ | ||
4403 | - inta_mask = iwl_read32(trans, CSR_INT_MASK); /* just for debug */ | ||
4404 | + inta_mask = iwl_read32(trans, CSR_INT_MASK); | ||
4405 | iwl_write32(trans, CSR_INT_MASK, 0x00000000); | ||
4406 | |||
4407 | |||
4408 | diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c | ||
4409 | index 0c9f70b..786bc11 100644 | ||
4410 | --- a/drivers/net/wireless/mwifiex/sta_ioctl.c | ||
4411 | +++ b/drivers/net/wireless/mwifiex/sta_ioctl.c | ||
4412 | @@ -56,7 +56,6 @@ int mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist, | ||
4413 | */ | ||
4414 | int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter) | ||
4415 | { | ||
4416 | - bool cancel_flag = false; | ||
4417 | int status; | ||
4418 | struct cmd_ctrl_node *cmd_queued; | ||
4419 | |||
4420 | @@ -70,14 +69,11 @@ int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter) | ||
4421 | atomic_inc(&adapter->cmd_pending); | ||
4422 | |||
4423 | /* Wait for completion */ | ||
4424 | - wait_event_interruptible(adapter->cmd_wait_q.wait, | ||
4425 | - *(cmd_queued->condition)); | ||
4426 | - if (!*(cmd_queued->condition)) | ||
4427 | - cancel_flag = true; | ||
4428 | - | ||
4429 | - if (cancel_flag) { | ||
4430 | - mwifiex_cancel_pending_ioctl(adapter); | ||
4431 | - dev_dbg(adapter->dev, "cmd cancel\n"); | ||
4432 | + status = wait_event_interruptible(adapter->cmd_wait_q.wait, | ||
4433 | + *(cmd_queued->condition)); | ||
4434 | + if (status) { | ||
4435 | + dev_err(adapter->dev, "cmd_wait_q terminated: %d\n", status); | ||
4436 | + return status; | ||
4437 | } | ||
4438 | |||
4439 | status = adapter->cmd_wait_q.status; | ||
4440 | @@ -480,8 +476,11 @@ int mwifiex_enable_hs(struct mwifiex_adapter *adapter) | ||
4441 | return false; | ||
4442 | } | ||
4443 | |||
4444 | - wait_event_interruptible(adapter->hs_activate_wait_q, | ||
4445 | - adapter->hs_activate_wait_q_woken); | ||
4446 | + if (wait_event_interruptible(adapter->hs_activate_wait_q, | ||
4447 | + adapter->hs_activate_wait_q_woken)) { | ||
4448 | + dev_err(adapter->dev, "hs_activate_wait_q terminated\n"); | ||
4449 | + return false; | ||
4450 | + } | ||
4451 | |||
4452 | return true; | ||
4453 | } | ||
4454 | diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c | ||
4455 | index 59474ae..175a9b9 100644 | ||
4456 | --- a/drivers/net/wireless/rt2x00/rt2800lib.c | ||
4457 | +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | ||
4458 | @@ -5036,7 +5036,8 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | ||
4459 | IEEE80211_HW_SUPPORTS_PS | | ||
4460 | IEEE80211_HW_PS_NULLFUNC_STACK | | ||
4461 | IEEE80211_HW_AMPDU_AGGREGATION | | ||
4462 | - IEEE80211_HW_REPORTS_TX_ACK_STATUS; | ||
4463 | + IEEE80211_HW_REPORTS_TX_ACK_STATUS | | ||
4464 | + IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL; | ||
4465 | |||
4466 | /* | ||
4467 | * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING for USB devices | ||
4468 | diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c | ||
4469 | index 69097d1..ee38e4c 100644 | ||
4470 | --- a/drivers/net/wireless/rt2x00/rt2x00dev.c | ||
4471 | +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | ||
4472 | @@ -391,10 +391,9 @@ void rt2x00lib_txdone(struct queue_entry *entry, | ||
4473 | tx_info->flags |= IEEE80211_TX_STAT_AMPDU; | ||
4474 | tx_info->status.ampdu_len = 1; | ||
4475 | tx_info->status.ampdu_ack_len = success ? 1 : 0; | ||
4476 | - /* | ||
4477 | - * TODO: Need to tear down BA session here | ||
4478 | - * if not successful. | ||
4479 | - */ | ||
4480 | + | ||
4481 | + if (!success) | ||
4482 | + tx_info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK; | ||
4483 | } | ||
4484 | |||
4485 | if (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS) { | ||
4486 | @@ -1123,6 +1122,9 @@ static inline void rt2x00lib_set_if_combinations(struct rt2x00_dev *rt2x00dev) | ||
4487 | struct ieee80211_iface_limit *if_limit; | ||
4488 | struct ieee80211_iface_combination *if_combination; | ||
4489 | |||
4490 | + if (rt2x00dev->ops->max_ap_intf < 2) | ||
4491 | + return; | ||
4492 | + | ||
4493 | /* | ||
4494 | * Build up AP interface limits structure. | ||
4495 | */ | ||
4496 | diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c | ||
4497 | index fc24eb9..472c5c1 100644 | ||
4498 | --- a/drivers/net/xen-netfront.c | ||
4499 | +++ b/drivers/net/xen-netfront.c | ||
4500 | @@ -1015,29 +1015,10 @@ err: | ||
4501 | i = xennet_fill_frags(np, skb, &tmpq); | ||
4502 | |||
4503 | /* | ||
4504 | - * Truesize approximates the size of true data plus | ||
4505 | - * any supervisor overheads. Adding hypervisor | ||
4506 | - * overheads has been shown to significantly reduce | ||
4507 | - * achievable bandwidth with the default receive | ||
4508 | - * buffer size. It is therefore not wise to account | ||
4509 | - * for it here. | ||
4510 | - * | ||
4511 | - * After alloc_skb(RX_COPY_THRESHOLD), truesize is set | ||
4512 | - * to RX_COPY_THRESHOLD + the supervisor | ||
4513 | - * overheads. Here, we add the size of the data pulled | ||
4514 | - * in xennet_fill_frags(). | ||
4515 | - * | ||
4516 | - * We also adjust for any unused space in the main | ||
4517 | - * data area by subtracting (RX_COPY_THRESHOLD - | ||
4518 | - * len). This is especially important with drivers | ||
4519 | - * which split incoming packets into header and data, | ||
4520 | - * using only 66 bytes of the main data area (see the | ||
4521 | - * e1000 driver for example.) On such systems, | ||
4522 | - * without this last adjustement, our achievable | ||
4523 | - * receive throughout using the standard receive | ||
4524 | - * buffer size was cut by 25%(!!!). | ||
4525 | - */ | ||
4526 | - skb->truesize += skb->data_len - RX_COPY_THRESHOLD; | ||
4527 | + * Truesize is the actual allocation size, even if the | ||
4528 | + * allocation is only partially used. | ||
4529 | + */ | ||
4530 | + skb->truesize += PAGE_SIZE * skb_shinfo(skb)->nr_frags; | ||
4531 | skb->len += skb->data_len; | ||
4532 | |||
4533 | if (rx->flags & XEN_NETRXF_csum_blank) | ||
4534 | diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c | ||
4535 | index dd90d15..71623a2 100644 | ||
4536 | --- a/drivers/platform/x86/samsung-laptop.c | ||
4537 | +++ b/drivers/platform/x86/samsung-laptop.c | ||
4538 | @@ -1523,6 +1523,16 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = { | ||
4539 | }, | ||
4540 | .driver_data = &samsung_broken_acpi_video, | ||
4541 | }, | ||
4542 | + { | ||
4543 | + .callback = samsung_dmi_matched, | ||
4544 | + .ident = "N250P", | ||
4545 | + .matches = { | ||
4546 | + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
4547 | + DMI_MATCH(DMI_PRODUCT_NAME, "N250P"), | ||
4548 | + DMI_MATCH(DMI_BOARD_NAME, "N250P"), | ||
4549 | + }, | ||
4550 | + .driver_data = &samsung_broken_acpi_video, | ||
4551 | + }, | ||
4552 | { }, | ||
4553 | }; | ||
4554 | MODULE_DEVICE_TABLE(dmi, samsung_dmi_table); | ||
4555 | diff --git a/drivers/platform/x86/sony-laptop.c b/drivers/platform/x86/sony-laptop.c | ||
4556 | index daaddec..b8ad71f 100644 | ||
4557 | --- a/drivers/platform/x86/sony-laptop.c | ||
4558 | +++ b/drivers/platform/x86/sony-laptop.c | ||
4559 | @@ -786,28 +786,29 @@ static int sony_nc_int_call(acpi_handle handle, char *name, int *value, | ||
4560 | static int sony_nc_buffer_call(acpi_handle handle, char *name, u64 *value, | ||
4561 | void *buffer, size_t buflen) | ||
4562 | { | ||
4563 | + int ret = 0; | ||
4564 | size_t len = len; | ||
4565 | union acpi_object *object = __call_snc_method(handle, name, value); | ||
4566 | |||
4567 | if (!object) | ||
4568 | return -EINVAL; | ||
4569 | |||
4570 | - if (object->type == ACPI_TYPE_BUFFER) | ||
4571 | + if (object->type == ACPI_TYPE_BUFFER) { | ||
4572 | len = MIN(buflen, object->buffer.length); | ||
4573 | + memcpy(buffer, object->buffer.pointer, len); | ||
4574 | |||
4575 | - else if (object->type == ACPI_TYPE_INTEGER) | ||
4576 | + } else if (object->type == ACPI_TYPE_INTEGER) { | ||
4577 | len = MIN(buflen, sizeof(object->integer.value)); | ||
4578 | + memcpy(buffer, &object->integer.value, len); | ||
4579 | |||
4580 | - else { | ||
4581 | + } else { | ||
4582 | pr_warn("Invalid acpi_object: expected 0x%x got 0x%x\n", | ||
4583 | ACPI_TYPE_BUFFER, object->type); | ||
4584 | - kfree(object); | ||
4585 | - return -EINVAL; | ||
4586 | + ret = -EINVAL; | ||
4587 | } | ||
4588 | |||
4589 | - memcpy(buffer, object->buffer.pointer, len); | ||
4590 | kfree(object); | ||
4591 | - return 0; | ||
4592 | + return ret; | ||
4593 | } | ||
4594 | |||
4595 | struct sony_nc_handles { | ||
4596 | diff --git a/drivers/regulator/max8997.c b/drivers/regulator/max8997.c | ||
4597 | index e39a0c7..70cd467 100644 | ||
4598 | --- a/drivers/regulator/max8997.c | ||
4599 | +++ b/drivers/regulator/max8997.c | ||
4600 | @@ -69,26 +69,26 @@ struct voltage_map_desc { | ||
4601 | int step; | ||
4602 | }; | ||
4603 | |||
4604 | -/* Voltage maps in mV */ | ||
4605 | +/* Voltage maps in uV */ | ||
4606 | static const struct voltage_map_desc ldo_voltage_map_desc = { | ||
4607 | - .min = 800, .max = 3950, .step = 50, | ||
4608 | + .min = 800000, .max = 3950000, .step = 50000, | ||
4609 | }; /* LDO1 ~ 18, 21 all */ | ||
4610 | |||
4611 | static const struct voltage_map_desc buck1245_voltage_map_desc = { | ||
4612 | - .min = 650, .max = 2225, .step = 25, | ||
4613 | + .min = 650000, .max = 2225000, .step = 25000, | ||
4614 | }; /* Buck1, 2, 4, 5 */ | ||
4615 | |||
4616 | static const struct voltage_map_desc buck37_voltage_map_desc = { | ||
4617 | - .min = 750, .max = 3900, .step = 50, | ||
4618 | + .min = 750000, .max = 3900000, .step = 50000, | ||
4619 | }; /* Buck3, 7 */ | ||
4620 | |||
4621 | -/* current map in mA */ | ||
4622 | +/* current map in uA */ | ||
4623 | static const struct voltage_map_desc charger_current_map_desc = { | ||
4624 | - .min = 200, .max = 950, .step = 50, | ||
4625 | + .min = 200000, .max = 950000, .step = 50000, | ||
4626 | }; | ||
4627 | |||
4628 | static const struct voltage_map_desc topoff_current_map_desc = { | ||
4629 | - .min = 50, .max = 200, .step = 10, | ||
4630 | + .min = 50000, .max = 200000, .step = 10000, | ||
4631 | }; | ||
4632 | |||
4633 | static const struct voltage_map_desc *reg_voltage_map[] = { | ||
4634 | @@ -192,7 +192,7 @@ static int max8997_list_voltage(struct regulator_dev *rdev, | ||
4635 | if (val > desc->max) | ||
4636 | return -EINVAL; | ||
4637 | |||
4638 | - return val * 1000; | ||
4639 | + return val; | ||
4640 | } | ||
4641 | |||
4642 | static int max8997_get_enable_register(struct regulator_dev *rdev, | ||
4643 | @@ -483,7 +483,6 @@ static int max8997_set_voltage_ldobuck(struct regulator_dev *rdev, | ||
4644 | { | ||
4645 | struct max8997_data *max8997 = rdev_get_drvdata(rdev); | ||
4646 | struct i2c_client *i2c = max8997->iodev->i2c; | ||
4647 | - int min_vol = min_uV / 1000, max_vol = max_uV / 1000; | ||
4648 | const struct voltage_map_desc *desc; | ||
4649 | int rid = rdev_get_id(rdev); | ||
4650 | int i, reg, shift, mask, ret; | ||
4651 | @@ -507,7 +506,7 @@ static int max8997_set_voltage_ldobuck(struct regulator_dev *rdev, | ||
4652 | |||
4653 | desc = reg_voltage_map[rid]; | ||
4654 | |||
4655 | - i = max8997_get_voltage_proper_val(desc, min_vol, max_vol); | ||
4656 | + i = max8997_get_voltage_proper_val(desc, min_uV, max_uV); | ||
4657 | if (i < 0) | ||
4658 | return i; | ||
4659 | |||
4660 | @@ -555,7 +554,7 @@ static int max8997_set_voltage_ldobuck_time_sel(struct regulator_dev *rdev, | ||
4661 | case MAX8997_BUCK4: | ||
4662 | case MAX8997_BUCK5: | ||
4663 | return DIV_ROUND_UP(desc->step * (new_selector - old_selector), | ||
4664 | - max8997->ramp_delay); | ||
4665 | + max8997->ramp_delay * 1000); | ||
4666 | } | ||
4667 | |||
4668 | return 0; | ||
4669 | @@ -654,7 +653,6 @@ static int max8997_set_voltage_buck(struct regulator_dev *rdev, | ||
4670 | const struct voltage_map_desc *desc; | ||
4671 | int new_val, new_idx, damage, tmp_val, tmp_idx, tmp_dmg; | ||
4672 | bool gpio_dvs_mode = false; | ||
4673 | - int min_vol = min_uV / 1000, max_vol = max_uV / 1000; | ||
4674 | |||
4675 | if (rid < MAX8997_BUCK1 || rid > MAX8997_BUCK7) | ||
4676 | return -EINVAL; | ||
4677 | @@ -679,7 +677,7 @@ static int max8997_set_voltage_buck(struct regulator_dev *rdev, | ||
4678 | selector); | ||
4679 | |||
4680 | desc = reg_voltage_map[rid]; | ||
4681 | - new_val = max8997_get_voltage_proper_val(desc, min_vol, max_vol); | ||
4682 | + new_val = max8997_get_voltage_proper_val(desc, min_uV, max_uV); | ||
4683 | if (new_val < 0) | ||
4684 | return new_val; | ||
4685 | |||
4686 | @@ -977,8 +975,8 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | ||
4687 | max8997->buck1_vol[i] = ret = | ||
4688 | max8997_get_voltage_proper_val( | ||
4689 | &buck1245_voltage_map_desc, | ||
4690 | - pdata->buck1_voltage[i] / 1000, | ||
4691 | - pdata->buck1_voltage[i] / 1000 + | ||
4692 | + pdata->buck1_voltage[i], | ||
4693 | + pdata->buck1_voltage[i] + | ||
4694 | buck1245_voltage_map_desc.step); | ||
4695 | if (ret < 0) | ||
4696 | goto err_out; | ||
4697 | @@ -986,8 +984,8 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | ||
4698 | max8997->buck2_vol[i] = ret = | ||
4699 | max8997_get_voltage_proper_val( | ||
4700 | &buck1245_voltage_map_desc, | ||
4701 | - pdata->buck2_voltage[i] / 1000, | ||
4702 | - pdata->buck2_voltage[i] / 1000 + | ||
4703 | + pdata->buck2_voltage[i], | ||
4704 | + pdata->buck2_voltage[i] + | ||
4705 | buck1245_voltage_map_desc.step); | ||
4706 | if (ret < 0) | ||
4707 | goto err_out; | ||
4708 | @@ -995,8 +993,8 @@ static __devinit int max8997_pmic_probe(struct platform_device *pdev) | ||
4709 | max8997->buck5_vol[i] = ret = | ||
4710 | max8997_get_voltage_proper_val( | ||
4711 | &buck1245_voltage_map_desc, | ||
4712 | - pdata->buck5_voltage[i] / 1000, | ||
4713 | - pdata->buck5_voltage[i] / 1000 + | ||
4714 | + pdata->buck5_voltage[i], | ||
4715 | + pdata->buck5_voltage[i] + | ||
4716 | buck1245_voltage_map_desc.step); | ||
4717 | if (ret < 0) | ||
4718 | goto err_out; | ||
4719 | diff --git a/drivers/regulator/max8998.c b/drivers/regulator/max8998.c | ||
4720 | index 5dfa920..6a20019 100644 | ||
4721 | --- a/drivers/regulator/max8998.c | ||
4722 | +++ b/drivers/regulator/max8998.c | ||
4723 | @@ -51,39 +51,39 @@ struct voltage_map_desc { | ||
4724 | int step; | ||
4725 | }; | ||
4726 | |||
4727 | -/* Voltage maps */ | ||
4728 | +/* Voltage maps in uV*/ | ||
4729 | static const struct voltage_map_desc ldo23_voltage_map_desc = { | ||
4730 | - .min = 800, .step = 50, .max = 1300, | ||
4731 | + .min = 800000, .step = 50000, .max = 1300000, | ||
4732 | }; | ||
4733 | static const struct voltage_map_desc ldo456711_voltage_map_desc = { | ||
4734 | - .min = 1600, .step = 100, .max = 3600, | ||
4735 | + .min = 1600000, .step = 100000, .max = 3600000, | ||
4736 | }; | ||
4737 | static const struct voltage_map_desc ldo8_voltage_map_desc = { | ||
4738 | - .min = 3000, .step = 100, .max = 3600, | ||
4739 | + .min = 3000000, .step = 100000, .max = 3600000, | ||
4740 | }; | ||
4741 | static const struct voltage_map_desc ldo9_voltage_map_desc = { | ||
4742 | - .min = 2800, .step = 100, .max = 3100, | ||
4743 | + .min = 2800000, .step = 100000, .max = 3100000, | ||
4744 | }; | ||
4745 | static const struct voltage_map_desc ldo10_voltage_map_desc = { | ||
4746 | - .min = 950, .step = 50, .max = 1300, | ||
4747 | + .min = 95000, .step = 50000, .max = 1300000, | ||
4748 | }; | ||
4749 | static const struct voltage_map_desc ldo1213_voltage_map_desc = { | ||
4750 | - .min = 800, .step = 100, .max = 3300, | ||
4751 | + .min = 800000, .step = 100000, .max = 3300000, | ||
4752 | }; | ||
4753 | static const struct voltage_map_desc ldo1415_voltage_map_desc = { | ||
4754 | - .min = 1200, .step = 100, .max = 3300, | ||
4755 | + .min = 1200000, .step = 100000, .max = 3300000, | ||
4756 | }; | ||
4757 | static const struct voltage_map_desc ldo1617_voltage_map_desc = { | ||
4758 | - .min = 1600, .step = 100, .max = 3600, | ||
4759 | + .min = 1600000, .step = 100000, .max = 3600000, | ||
4760 | }; | ||
4761 | static const struct voltage_map_desc buck12_voltage_map_desc = { | ||
4762 | - .min = 750, .step = 25, .max = 1525, | ||
4763 | + .min = 750000, .step = 25000, .max = 1525000, | ||
4764 | }; | ||
4765 | static const struct voltage_map_desc buck3_voltage_map_desc = { | ||
4766 | - .min = 1600, .step = 100, .max = 3600, | ||
4767 | + .min = 1600000, .step = 100000, .max = 3600000, | ||
4768 | }; | ||
4769 | static const struct voltage_map_desc buck4_voltage_map_desc = { | ||
4770 | - .min = 800, .step = 100, .max = 2300, | ||
4771 | + .min = 800000, .step = 100000, .max = 2300000, | ||
4772 | }; | ||
4773 | |||
4774 | static const struct voltage_map_desc *ldo_voltage_map[] = { | ||
4775 | @@ -445,9 +445,9 @@ static int max8998_set_voltage_buck_time_sel(struct regulator_dev *rdev, | ||
4776 | if (max8998->iodev->type == TYPE_MAX8998 && !(val & MAX8998_ENRAMP)) | ||
4777 | return 0; | ||
4778 | |||
4779 | - difference = (new_selector - old_selector) * desc->step; | ||
4780 | + difference = (new_selector - old_selector) * desc->step / 1000; | ||
4781 | if (difference > 0) | ||
4782 | - return difference / ((val & 0x0f) + 1); | ||
4783 | + return DIV_ROUND_UP(difference, (val & 0x0f) + 1); | ||
4784 | |||
4785 | return 0; | ||
4786 | } | ||
4787 | @@ -702,7 +702,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev) | ||
4788 | i = 0; | ||
4789 | while (buck12_voltage_map_desc.min + | ||
4790 | buck12_voltage_map_desc.step*i | ||
4791 | - < (pdata->buck1_voltage1 / 1000)) | ||
4792 | + < pdata->buck1_voltage1) | ||
4793 | i++; | ||
4794 | max8998->buck1_vol[0] = i; | ||
4795 | ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE1, i); | ||
4796 | @@ -713,7 +713,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev) | ||
4797 | i = 0; | ||
4798 | while (buck12_voltage_map_desc.min + | ||
4799 | buck12_voltage_map_desc.step*i | ||
4800 | - < (pdata->buck1_voltage2 / 1000)) | ||
4801 | + < pdata->buck1_voltage2) | ||
4802 | i++; | ||
4803 | |||
4804 | max8998->buck1_vol[1] = i; | ||
4805 | @@ -725,7 +725,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev) | ||
4806 | i = 0; | ||
4807 | while (buck12_voltage_map_desc.min + | ||
4808 | buck12_voltage_map_desc.step*i | ||
4809 | - < (pdata->buck1_voltage3 / 1000)) | ||
4810 | + < pdata->buck1_voltage3) | ||
4811 | i++; | ||
4812 | |||
4813 | max8998->buck1_vol[2] = i; | ||
4814 | @@ -737,7 +737,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev) | ||
4815 | i = 0; | ||
4816 | while (buck12_voltage_map_desc.min + | ||
4817 | buck12_voltage_map_desc.step*i | ||
4818 | - < (pdata->buck1_voltage4 / 1000)) | ||
4819 | + < pdata->buck1_voltage4) | ||
4820 | i++; | ||
4821 | |||
4822 | max8998->buck1_vol[3] = i; | ||
4823 | @@ -763,7 +763,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev) | ||
4824 | i = 0; | ||
4825 | while (buck12_voltage_map_desc.min + | ||
4826 | buck12_voltage_map_desc.step*i | ||
4827 | - < (pdata->buck2_voltage1 / 1000)) | ||
4828 | + < pdata->buck2_voltage1) | ||
4829 | i++; | ||
4830 | max8998->buck2_vol[0] = i; | ||
4831 | ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE1, i); | ||
4832 | @@ -774,7 +774,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev) | ||
4833 | i = 0; | ||
4834 | while (buck12_voltage_map_desc.min + | ||
4835 | buck12_voltage_map_desc.step*i | ||
4836 | - < (pdata->buck2_voltage2 / 1000)) | ||
4837 | + < pdata->buck2_voltage2) | ||
4838 | i++; | ||
4839 | max8998->buck2_vol[1] = i; | ||
4840 | ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE2, i); | ||
4841 | @@ -792,8 +792,8 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev) | ||
4842 | int count = (desc->max - desc->min) / desc->step + 1; | ||
4843 | |||
4844 | regulators[index].n_voltages = count; | ||
4845 | - regulators[index].min_uV = desc->min * 1000; | ||
4846 | - regulators[index].uV_step = desc->step * 1000; | ||
4847 | + regulators[index].min_uV = desc->min; | ||
4848 | + regulators[index].uV_step = desc->step; | ||
4849 | } | ||
4850 | |||
4851 | config.dev = max8998->dev; | ||
4852 | diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c | ||
4853 | index 926f9c8..3fd1b88 100644 | ||
4854 | --- a/drivers/regulator/s2mps11.c | ||
4855 | +++ b/drivers/regulator/s2mps11.c | ||
4856 | @@ -269,16 +269,16 @@ static __devinit int s2mps11_pmic_probe(struct platform_device *pdev) | ||
4857 | |||
4858 | if (ramp_enable) { | ||
4859 | if (s2mps11->buck2_ramp) | ||
4860 | - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay2) >> 6; | ||
4861 | + ramp_reg |= get_ramp_delay(s2mps11->ramp_delay2) << 6; | ||
4862 | if (s2mps11->buck3_ramp || s2mps11->buck4_ramp) | ||
4863 | - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay34) >> 4; | ||
4864 | + ramp_reg |= get_ramp_delay(s2mps11->ramp_delay34) << 4; | ||
4865 | sec_reg_write(iodev, S2MPS11_REG_RAMP, ramp_reg | ramp_enable); | ||
4866 | } | ||
4867 | |||
4868 | ramp_reg &= 0x00; | ||
4869 | - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay5) >> 6; | ||
4870 | - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay16) >> 4; | ||
4871 | - ramp_reg |= get_ramp_delay(s2mps11->ramp_delay7810) >> 2; | ||
4872 | + ramp_reg |= get_ramp_delay(s2mps11->ramp_delay5) << 6; | ||
4873 | + ramp_reg |= get_ramp_delay(s2mps11->ramp_delay16) << 4; | ||
4874 | + ramp_reg |= get_ramp_delay(s2mps11->ramp_delay7810) << 2; | ||
4875 | ramp_reg |= get_ramp_delay(s2mps11->ramp_delay9); | ||
4876 | sec_reg_write(iodev, S2MPS11_REG_RAMP_BUCK, ramp_reg); | ||
4877 | |||
4878 | diff --git a/drivers/regulator/wm831x-dcdc.c b/drivers/regulator/wm831x-dcdc.c | ||
4879 | index 782c228..416fe0a 100644 | ||
4880 | --- a/drivers/regulator/wm831x-dcdc.c | ||
4881 | +++ b/drivers/regulator/wm831x-dcdc.c | ||
4882 | @@ -290,7 +290,7 @@ static int wm831x_buckv_set_voltage_sel(struct regulator_dev *rdev, | ||
4883 | if (vsel > dcdc->dvs_vsel) { | ||
4884 | ret = wm831x_set_bits(wm831x, dvs_reg, | ||
4885 | WM831X_DC1_DVS_VSEL_MASK, | ||
4886 | - dcdc->dvs_vsel); | ||
4887 | + vsel); | ||
4888 | if (ret == 0) | ||
4889 | dcdc->dvs_vsel = vsel; | ||
4890 | else | ||
4891 | diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c | ||
4892 | index 368368f..908d287 100644 | ||
4893 | --- a/drivers/s390/cio/device_pgid.c | ||
4894 | +++ b/drivers/s390/cio/device_pgid.c | ||
4895 | @@ -234,7 +234,7 @@ static int pgid_cmp(struct pgid *p1, struct pgid *p2) | ||
4896 | * Determine pathgroup state from PGID data. | ||
4897 | */ | ||
4898 | static void pgid_analyze(struct ccw_device *cdev, struct pgid **p, | ||
4899 | - int *mismatch, int *reserved, u8 *reset) | ||
4900 | + int *mismatch, u8 *reserved, u8 *reset) | ||
4901 | { | ||
4902 | struct pgid *pgid = &cdev->private->pgid[0]; | ||
4903 | struct pgid *first = NULL; | ||
4904 | @@ -248,7 +248,7 @@ static void pgid_analyze(struct ccw_device *cdev, struct pgid **p, | ||
4905 | if ((cdev->private->pgid_valid_mask & lpm) == 0) | ||
4906 | continue; | ||
4907 | if (pgid->inf.ps.state2 == SNID_STATE2_RESVD_ELSE) | ||
4908 | - *reserved = 1; | ||
4909 | + *reserved |= lpm; | ||
4910 | if (pgid_is_reset(pgid)) { | ||
4911 | *reset |= lpm; | ||
4912 | continue; | ||
4913 | @@ -316,14 +316,14 @@ static void snid_done(struct ccw_device *cdev, int rc) | ||
4914 | struct subchannel *sch = to_subchannel(cdev->dev.parent); | ||
4915 | struct pgid *pgid; | ||
4916 | int mismatch = 0; | ||
4917 | - int reserved = 0; | ||
4918 | + u8 reserved = 0; | ||
4919 | u8 reset = 0; | ||
4920 | u8 donepm; | ||
4921 | |||
4922 | if (rc) | ||
4923 | goto out; | ||
4924 | pgid_analyze(cdev, &pgid, &mismatch, &reserved, &reset); | ||
4925 | - if (reserved) | ||
4926 | + if (reserved == cdev->private->pgid_valid_mask) | ||
4927 | rc = -EUSERS; | ||
4928 | else if (mismatch) | ||
4929 | rc = -EOPNOTSUPP; | ||
4930 | @@ -336,7 +336,7 @@ static void snid_done(struct ccw_device *cdev, int rc) | ||
4931 | } | ||
4932 | out: | ||
4933 | CIO_MSG_EVENT(2, "snid: device 0.%x.%04x: rc=%d pvm=%02x vpm=%02x " | ||
4934 | - "todo=%02x mism=%d rsvd=%d reset=%02x\n", id->ssid, | ||
4935 | + "todo=%02x mism=%d rsvd=%02x reset=%02x\n", id->ssid, | ||
4936 | id->devno, rc, cdev->private->pgid_valid_mask, sch->vpm, | ||
4937 | cdev->private->pgid_todo_mask, mismatch, reserved, reset); | ||
4938 | switch (rc) { | ||
4939 | diff --git a/drivers/scsi/mvsas/mv_94xx.h b/drivers/scsi/mvsas/mv_94xx.h | ||
4940 | index 8f7eb4f..487aa6f 100644 | ||
4941 | --- a/drivers/scsi/mvsas/mv_94xx.h | ||
4942 | +++ b/drivers/scsi/mvsas/mv_94xx.h | ||
4943 | @@ -258,21 +258,11 @@ enum sas_sata_phy_regs { | ||
4944 | #define SPI_ADDR_VLD_94XX (1U << 1) | ||
4945 | #define SPI_CTRL_SpiStart_94XX (1U << 0) | ||
4946 | |||
4947 | -#define mv_ffc(x) ffz(x) | ||
4948 | - | ||
4949 | static inline int | ||
4950 | mv_ffc64(u64 v) | ||
4951 | { | ||
4952 | - int i; | ||
4953 | - i = mv_ffc((u32)v); | ||
4954 | - if (i >= 0) | ||
4955 | - return i; | ||
4956 | - i = mv_ffc((u32)(v>>32)); | ||
4957 | - | ||
4958 | - if (i != 0) | ||
4959 | - return 32 + i; | ||
4960 | - | ||
4961 | - return -1; | ||
4962 | + u64 x = ~v; | ||
4963 | + return x ? __ffs64(x) : -1; | ||
4964 | } | ||
4965 | |||
4966 | #define r_reg_set_enable(i) \ | ||
4967 | diff --git a/drivers/scsi/mvsas/mv_sas.h b/drivers/scsi/mvsas/mv_sas.h | ||
4968 | index c04a4f5..da24955 100644 | ||
4969 | --- a/drivers/scsi/mvsas/mv_sas.h | ||
4970 | +++ b/drivers/scsi/mvsas/mv_sas.h | ||
4971 | @@ -69,7 +69,7 @@ extern struct kmem_cache *mvs_task_list_cache; | ||
4972 | #define DEV_IS_EXPANDER(type) \ | ||
4973 | ((type == EDGE_DEV) || (type == FANOUT_DEV)) | ||
4974 | |||
4975 | -#define bit(n) ((u32)1 << n) | ||
4976 | +#define bit(n) ((u64)1 << n) | ||
4977 | |||
4978 | #define for_each_phy(__lseq_mask, __mc, __lseq) \ | ||
4979 | for ((__mc) = (__lseq_mask), (__lseq) = 0; \ | ||
4980 | diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c | ||
4981 | index 1c28215..83d7984 100644 | ||
4982 | --- a/drivers/scsi/qla2xxx/qla_attr.c | ||
4983 | +++ b/drivers/scsi/qla2xxx/qla_attr.c | ||
4984 | @@ -1615,8 +1615,7 @@ qla2x00_terminate_rport_io(struct fc_rport *rport) | ||
4985 | * At this point all fcport's software-states are cleared. Perform any | ||
4986 | * final cleanup of firmware resources (PCBs and XCBs). | ||
4987 | */ | ||
4988 | - if (fcport->loop_id != FC_NO_LOOP_ID && | ||
4989 | - !test_bit(UNLOADING, &fcport->vha->dpc_flags)) { | ||
4990 | + if (fcport->loop_id != FC_NO_LOOP_ID) { | ||
4991 | if (IS_FWI2_CAPABLE(fcport->vha->hw)) | ||
4992 | fcport->vha->hw->isp_ops->fabric_logout(fcport->vha, | ||
4993 | fcport->loop_id, fcport->d_id.b.domain, | ||
4994 | diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c | ||
4995 | index 2f9bddd..9f34ded 100644 | ||
4996 | --- a/drivers/scsi/qla2xxx/qla_bsg.c | ||
4997 | +++ b/drivers/scsi/qla2xxx/qla_bsg.c | ||
4998 | @@ -219,7 +219,8 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job) | ||
4999 | break; | ||
5000 | } | ||
5001 | exit_fcp_prio_cfg: | ||
5002 | - bsg_job->job_done(bsg_job); | ||
5003 | + if (!ret) | ||
5004 | + bsg_job->job_done(bsg_job); | ||
5005 | return ret; | ||
5006 | } | ||
5007 | |||
5008 | @@ -741,9 +742,8 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | ||
5009 | if (qla81xx_get_port_config(vha, config)) { | ||
5010 | ql_log(ql_log_warn, vha, 0x701f, | ||
5011 | "Get port config failed.\n"); | ||
5012 | - bsg_job->reply->result = (DID_ERROR << 16); | ||
5013 | rval = -EPERM; | ||
5014 | - goto done_free_dma_req; | ||
5015 | + goto done_free_dma_rsp; | ||
5016 | } | ||
5017 | |||
5018 | ql_dbg(ql_dbg_user, vha, 0x70c0, | ||
5019 | @@ -761,9 +761,8 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | ||
5020 | new_config, elreq.options); | ||
5021 | |||
5022 | if (rval) { | ||
5023 | - bsg_job->reply->result = (DID_ERROR << 16); | ||
5024 | rval = -EPERM; | ||
5025 | - goto done_free_dma_req; | ||
5026 | + goto done_free_dma_rsp; | ||
5027 | } | ||
5028 | |||
5029 | type = "FC_BSG_HST_VENDOR_LOOPBACK"; | ||
5030 | @@ -795,9 +794,8 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | ||
5031 | "MPI reset failed.\n"); | ||
5032 | } | ||
5033 | |||
5034 | - bsg_job->reply->result = (DID_ERROR << 16); | ||
5035 | rval = -EIO; | ||
5036 | - goto done_free_dma_req; | ||
5037 | + goto done_free_dma_rsp; | ||
5038 | } | ||
5039 | } else { | ||
5040 | type = "FC_BSG_HST_VENDOR_LOOPBACK"; | ||
5041 | @@ -812,34 +810,27 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | ||
5042 | ql_log(ql_log_warn, vha, 0x702c, | ||
5043 | "Vendor request %s failed.\n", type); | ||
5044 | |||
5045 | - fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | ||
5046 | - sizeof(struct fc_bsg_reply); | ||
5047 | - | ||
5048 | - memcpy(fw_sts_ptr, response, sizeof(response)); | ||
5049 | - fw_sts_ptr += sizeof(response); | ||
5050 | - *fw_sts_ptr = command_sent; | ||
5051 | rval = 0; | ||
5052 | bsg_job->reply->result = (DID_ERROR << 16); | ||
5053 | + bsg_job->reply->reply_payload_rcv_len = 0; | ||
5054 | } else { | ||
5055 | ql_dbg(ql_dbg_user, vha, 0x702d, | ||
5056 | "Vendor request %s completed.\n", type); | ||
5057 | - | ||
5058 | - bsg_job->reply_len = sizeof(struct fc_bsg_reply) + | ||
5059 | - sizeof(response) + sizeof(uint8_t); | ||
5060 | - bsg_job->reply->reply_payload_rcv_len = | ||
5061 | - bsg_job->reply_payload.payload_len; | ||
5062 | - fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | ||
5063 | - sizeof(struct fc_bsg_reply); | ||
5064 | - memcpy(fw_sts_ptr, response, sizeof(response)); | ||
5065 | - fw_sts_ptr += sizeof(response); | ||
5066 | - *fw_sts_ptr = command_sent; | ||
5067 | - bsg_job->reply->result = DID_OK; | ||
5068 | + bsg_job->reply->result = (DID_OK << 16); | ||
5069 | sg_copy_from_buffer(bsg_job->reply_payload.sg_list, | ||
5070 | bsg_job->reply_payload.sg_cnt, rsp_data, | ||
5071 | rsp_data_len); | ||
5072 | } | ||
5073 | - bsg_job->job_done(bsg_job); | ||
5074 | |||
5075 | + bsg_job->reply_len = sizeof(struct fc_bsg_reply) + | ||
5076 | + sizeof(response) + sizeof(uint8_t); | ||
5077 | + fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | ||
5078 | + sizeof(struct fc_bsg_reply); | ||
5079 | + memcpy(fw_sts_ptr, response, sizeof(response)); | ||
5080 | + fw_sts_ptr += sizeof(response); | ||
5081 | + *fw_sts_ptr = command_sent; | ||
5082 | + | ||
5083 | +done_free_dma_rsp: | ||
5084 | dma_free_coherent(&ha->pdev->dev, rsp_data_len, | ||
5085 | rsp_data, rsp_data_dma); | ||
5086 | done_free_dma_req: | ||
5087 | @@ -853,6 +844,8 @@ done_unmap_req_sg: | ||
5088 | dma_unmap_sg(&ha->pdev->dev, | ||
5089 | bsg_job->request_payload.sg_list, | ||
5090 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); | ||
5091 | + if (!rval) | ||
5092 | + bsg_job->job_done(bsg_job); | ||
5093 | return rval; | ||
5094 | } | ||
5095 | |||
5096 | @@ -877,16 +870,15 @@ qla84xx_reset(struct fc_bsg_job *bsg_job) | ||
5097 | if (rval) { | ||
5098 | ql_log(ql_log_warn, vha, 0x7030, | ||
5099 | "Vendor request 84xx reset failed.\n"); | ||
5100 | - rval = 0; | ||
5101 | - bsg_job->reply->result = (DID_ERROR << 16); | ||
5102 | + rval = (DID_ERROR << 16); | ||
5103 | |||
5104 | } else { | ||
5105 | ql_dbg(ql_dbg_user, vha, 0x7031, | ||
5106 | "Vendor request 84xx reset completed.\n"); | ||
5107 | bsg_job->reply->result = DID_OK; | ||
5108 | + bsg_job->job_done(bsg_job); | ||
5109 | } | ||
5110 | |||
5111 | - bsg_job->job_done(bsg_job); | ||
5112 | return rval; | ||
5113 | } | ||
5114 | |||
5115 | @@ -976,8 +968,7 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job) | ||
5116 | ql_log(ql_log_warn, vha, 0x7037, | ||
5117 | "Vendor request 84xx updatefw failed.\n"); | ||
5118 | |||
5119 | - rval = 0; | ||
5120 | - bsg_job->reply->result = (DID_ERROR << 16); | ||
5121 | + rval = (DID_ERROR << 16); | ||
5122 | } else { | ||
5123 | ql_dbg(ql_dbg_user, vha, 0x7038, | ||
5124 | "Vendor request 84xx updatefw completed.\n"); | ||
5125 | @@ -986,7 +977,6 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job) | ||
5126 | bsg_job->reply->result = DID_OK; | ||
5127 | } | ||
5128 | |||
5129 | - bsg_job->job_done(bsg_job); | ||
5130 | dma_pool_free(ha->s_dma_pool, mn, mn_dma); | ||
5131 | |||
5132 | done_free_fw_buf: | ||
5133 | @@ -996,6 +986,8 @@ done_unmap_sg: | ||
5134 | dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, | ||
5135 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); | ||
5136 | |||
5137 | + if (!rval) | ||
5138 | + bsg_job->job_done(bsg_job); | ||
5139 | return rval; | ||
5140 | } | ||
5141 | |||
5142 | @@ -1163,8 +1155,7 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job) | ||
5143 | ql_log(ql_log_warn, vha, 0x7043, | ||
5144 | "Vendor request 84xx mgmt failed.\n"); | ||
5145 | |||
5146 | - rval = 0; | ||
5147 | - bsg_job->reply->result = (DID_ERROR << 16); | ||
5148 | + rval = (DID_ERROR << 16); | ||
5149 | |||
5150 | } else { | ||
5151 | ql_dbg(ql_dbg_user, vha, 0x7044, | ||
5152 | @@ -1184,8 +1175,6 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job) | ||
5153 | } | ||
5154 | } | ||
5155 | |||
5156 | - bsg_job->job_done(bsg_job); | ||
5157 | - | ||
5158 | done_unmap_sg: | ||
5159 | if (mgmt_b) | ||
5160 | dma_free_coherent(&ha->pdev->dev, data_len, mgmt_b, mgmt_dma); | ||
5161 | @@ -1200,6 +1189,8 @@ done_unmap_sg: | ||
5162 | exit_mgmt: | ||
5163 | dma_pool_free(ha->s_dma_pool, mn, mn_dma); | ||
5164 | |||
5165 | + if (!rval) | ||
5166 | + bsg_job->job_done(bsg_job); | ||
5167 | return rval; | ||
5168 | } | ||
5169 | |||
5170 | @@ -1276,9 +1267,7 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job) | ||
5171 | fcport->port_name[3], fcport->port_name[4], | ||
5172 | fcport->port_name[5], fcport->port_name[6], | ||
5173 | fcport->port_name[7], rval, fcport->fp_speed, mb[0], mb[1]); | ||
5174 | - rval = 0; | ||
5175 | - bsg_job->reply->result = (DID_ERROR << 16); | ||
5176 | - | ||
5177 | + rval = (DID_ERROR << 16); | ||
5178 | } else { | ||
5179 | if (!port_param->mode) { | ||
5180 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + | ||
5181 | @@ -1292,9 +1281,9 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job) | ||
5182 | } | ||
5183 | |||
5184 | bsg_job->reply->result = DID_OK; | ||
5185 | + bsg_job->job_done(bsg_job); | ||
5186 | } | ||
5187 | |||
5188 | - bsg_job->job_done(bsg_job); | ||
5189 | return rval; | ||
5190 | } | ||
5191 | |||
5192 | @@ -1887,8 +1876,6 @@ qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job) | ||
5193 | return qla24xx_process_bidir_cmd(bsg_job); | ||
5194 | |||
5195 | default: | ||
5196 | - bsg_job->reply->result = (DID_ERROR << 16); | ||
5197 | - bsg_job->job_done(bsg_job); | ||
5198 | return -ENOSYS; | ||
5199 | } | ||
5200 | } | ||
5201 | @@ -1919,8 +1906,6 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job) | ||
5202 | ql_dbg(ql_dbg_user, vha, 0x709f, | ||
5203 | "BSG: ISP abort active/needed -- cmd=%d.\n", | ||
5204 | bsg_job->request->msgcode); | ||
5205 | - bsg_job->reply->result = (DID_ERROR << 16); | ||
5206 | - bsg_job->job_done(bsg_job); | ||
5207 | return -EBUSY; | ||
5208 | } | ||
5209 | |||
5210 | @@ -1943,7 +1928,6 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job) | ||
5211 | case FC_BSG_RPT_CT: | ||
5212 | default: | ||
5213 | ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n"); | ||
5214 | - bsg_job->reply->result = ret; | ||
5215 | break; | ||
5216 | } | ||
5217 | return ret; | ||
5218 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c | ||
5219 | index d501bf5..f4b1fc8 100644 | ||
5220 | --- a/drivers/scsi/qla2xxx/qla_os.c | ||
5221 | +++ b/drivers/scsi/qla2xxx/qla_os.c | ||
5222 | @@ -2755,6 +2755,7 @@ qla2x00_remove_one(struct pci_dev *pdev) | ||
5223 | |||
5224 | ha->flags.host_shutting_down = 1; | ||
5225 | |||
5226 | + set_bit(UNLOADING, &base_vha->dpc_flags); | ||
5227 | mutex_lock(&ha->vport_lock); | ||
5228 | while (ha->cur_vport_count) { | ||
5229 | struct Scsi_Host *scsi_host; | ||
5230 | @@ -2784,8 +2785,6 @@ qla2x00_remove_one(struct pci_dev *pdev) | ||
5231 | "Error while clearing DRV-Presence.\n"); | ||
5232 | } | ||
5233 | |||
5234 | - set_bit(UNLOADING, &base_vha->dpc_flags); | ||
5235 | - | ||
5236 | qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16); | ||
5237 | |||
5238 | qla2x00_dfs_remove(base_vha); | ||
5239 | @@ -4505,9 +4504,9 @@ qla2x00_do_dpc(void *data) | ||
5240 | "ISP abort end.\n"); | ||
5241 | } | ||
5242 | |||
5243 | - if (test_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags)) { | ||
5244 | + if (test_and_clear_bit(FCPORT_UPDATE_NEEDED, | ||
5245 | + &base_vha->dpc_flags)) { | ||
5246 | qla2x00_update_fcports(base_vha); | ||
5247 | - clear_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags); | ||
5248 | } | ||
5249 | |||
5250 | if (test_bit(SCR_PENDING, &base_vha->dpc_flags)) { | ||
5251 | diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c | ||
5252 | index 62aa558..661d33e 100644 | ||
5253 | --- a/drivers/scsi/qla2xxx/qla_target.c | ||
5254 | +++ b/drivers/scsi/qla2xxx/qla_target.c | ||
5255 | @@ -1264,8 +1264,27 @@ static int __qlt_24xx_handle_abts(struct scsi_qla_host *vha, | ||
5256 | struct abts_recv_from_24xx *abts, struct qla_tgt_sess *sess) | ||
5257 | { | ||
5258 | struct qla_hw_data *ha = vha->hw; | ||
5259 | + struct se_session *se_sess = sess->se_sess; | ||
5260 | struct qla_tgt_mgmt_cmd *mcmd; | ||
5261 | + struct se_cmd *se_cmd; | ||
5262 | + u32 lun = 0; | ||
5263 | int rc; | ||
5264 | + bool found_lun = false; | ||
5265 | + | ||
5266 | + spin_lock(&se_sess->sess_cmd_lock); | ||
5267 | + list_for_each_entry(se_cmd, &se_sess->sess_cmd_list, se_cmd_list) { | ||
5268 | + struct qla_tgt_cmd *cmd = | ||
5269 | + container_of(se_cmd, struct qla_tgt_cmd, se_cmd); | ||
5270 | + if (cmd->tag == abts->exchange_addr_to_abort) { | ||
5271 | + lun = cmd->unpacked_lun; | ||
5272 | + found_lun = true; | ||
5273 | + break; | ||
5274 | + } | ||
5275 | + } | ||
5276 | + spin_unlock(&se_sess->sess_cmd_lock); | ||
5277 | + | ||
5278 | + if (!found_lun) | ||
5279 | + return -ENOENT; | ||
5280 | |||
5281 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf00f, | ||
5282 | "qla_target(%d): task abort (tag=%d)\n", | ||
5283 | @@ -1283,7 +1302,7 @@ static int __qlt_24xx_handle_abts(struct scsi_qla_host *vha, | ||
5284 | mcmd->sess = sess; | ||
5285 | memcpy(&mcmd->orig_iocb.abts, abts, sizeof(mcmd->orig_iocb.abts)); | ||
5286 | |||
5287 | - rc = ha->tgt.tgt_ops->handle_tmr(mcmd, 0, TMR_ABORT_TASK, | ||
5288 | + rc = ha->tgt.tgt_ops->handle_tmr(mcmd, lun, TMR_ABORT_TASK, | ||
5289 | abts->exchange_addr_to_abort); | ||
5290 | if (rc != 0) { | ||
5291 | ql_dbg(ql_dbg_tgt_mgt, vha, 0xf052, | ||
5292 | diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c | ||
5293 | index ce5224c..931a7d9 100644 | ||
5294 | --- a/drivers/scsi/scsi_sysfs.c | ||
5295 | +++ b/drivers/scsi/scsi_sysfs.c | ||
5296 | @@ -247,11 +247,11 @@ show_shost_active_mode(struct device *dev, | ||
5297 | |||
5298 | static DEVICE_ATTR(active_mode, S_IRUGO | S_IWUSR, show_shost_active_mode, NULL); | ||
5299 | |||
5300 | -static int check_reset_type(char *str) | ||
5301 | +static int check_reset_type(const char *str) | ||
5302 | { | ||
5303 | - if (strncmp(str, "adapter", 10) == 0) | ||
5304 | + if (sysfs_streq(str, "adapter")) | ||
5305 | return SCSI_ADAPTER_RESET; | ||
5306 | - else if (strncmp(str, "firmware", 10) == 0) | ||
5307 | + else if (sysfs_streq(str, "firmware")) | ||
5308 | return SCSI_FIRMWARE_RESET; | ||
5309 | else | ||
5310 | return 0; | ||
5311 | @@ -264,12 +264,9 @@ store_host_reset(struct device *dev, struct device_attribute *attr, | ||
5312 | struct Scsi_Host *shost = class_to_shost(dev); | ||
5313 | struct scsi_host_template *sht = shost->hostt; | ||
5314 | int ret = -EINVAL; | ||
5315 | - char str[10]; | ||
5316 | int type; | ||
5317 | |||
5318 | - sscanf(buf, "%s", str); | ||
5319 | - type = check_reset_type(str); | ||
5320 | - | ||
5321 | + type = check_reset_type(buf); | ||
5322 | if (!type) | ||
5323 | goto exit_store_host_reset; | ||
5324 | |||
5325 | diff --git a/drivers/staging/comedi/Kconfig b/drivers/staging/comedi/Kconfig | ||
5326 | index 2093403..3464d14 100644 | ||
5327 | --- a/drivers/staging/comedi/Kconfig | ||
5328 | +++ b/drivers/staging/comedi/Kconfig | ||
5329 | @@ -444,6 +444,7 @@ config COMEDI_ADQ12B | ||
5330 | |||
5331 | config COMEDI_NI_AT_A2150 | ||
5332 | tristate "NI AT-A2150 ISA card support" | ||
5333 | + select COMEDI_FC | ||
5334 | depends on VIRT_TO_BUS | ||
5335 | ---help--- | ||
5336 | Enable support for National Instruments AT-A2150 cards | ||
5337 | diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c | ||
5338 | index c2a32cf..1ab8037 100644 | ||
5339 | --- a/drivers/staging/comedi/comedi_fops.c | ||
5340 | +++ b/drivers/staging/comedi/comedi_fops.c | ||
5341 | @@ -1546,6 +1546,9 @@ static long comedi_unlocked_ioctl(struct file *file, unsigned int cmd, | ||
5342 | if (cmd == COMEDI_DEVCONFIG) { | ||
5343 | rc = do_devconfig_ioctl(dev, | ||
5344 | (struct comedi_devconfig __user *)arg); | ||
5345 | + if (rc == 0) | ||
5346 | + /* Evade comedi_auto_unconfig(). */ | ||
5347 | + dev_file_info->hardware_device = NULL; | ||
5348 | goto done; | ||
5349 | } | ||
5350 | |||
5351 | diff --git a/drivers/staging/comedi/drivers/comedi_test.c b/drivers/staging/comedi/drivers/comedi_test.c | ||
5352 | index 7817def..ec7cf62 100644 | ||
5353 | --- a/drivers/staging/comedi/drivers/comedi_test.c | ||
5354 | +++ b/drivers/staging/comedi/drivers/comedi_test.c | ||
5355 | @@ -372,7 +372,7 @@ static int waveform_ai_cancel(struct comedi_device *dev, | ||
5356 | struct waveform_private *devpriv = dev->private; | ||
5357 | |||
5358 | devpriv->timer_running = 0; | ||
5359 | - del_timer(&devpriv->timer); | ||
5360 | + del_timer_sync(&devpriv->timer); | ||
5361 | return 0; | ||
5362 | } | ||
5363 | |||
5364 | diff --git a/drivers/staging/comedi/drivers/ni_pcimio.c b/drivers/staging/comedi/drivers/ni_pcimio.c | ||
5365 | index f284a90..f3f5478 100644 | ||
5366 | --- a/drivers/staging/comedi/drivers/ni_pcimio.c | ||
5367 | +++ b/drivers/staging/comedi/drivers/ni_pcimio.c | ||
5368 | @@ -963,7 +963,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
5369 | .ao_range_table = &range_ni_M_625x_ao, | ||
5370 | .reg_type = ni_reg_625x, | ||
5371 | .ao_unipolar = 0, | ||
5372 | - .ao_speed = 357, | ||
5373 | + .ao_speed = 350, | ||
5374 | .num_p0_dio_channels = 8, | ||
5375 | .caldac = {caldac_none}, | ||
5376 | .has_8255 = 0, | ||
5377 | @@ -982,7 +982,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
5378 | .ao_range_table = &range_ni_M_625x_ao, | ||
5379 | .reg_type = ni_reg_625x, | ||
5380 | .ao_unipolar = 0, | ||
5381 | - .ao_speed = 357, | ||
5382 | + .ao_speed = 350, | ||
5383 | .num_p0_dio_channels = 8, | ||
5384 | .caldac = {caldac_none}, | ||
5385 | .has_8255 = 0, | ||
5386 | @@ -1001,7 +1001,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
5387 | .ao_range_table = &range_ni_M_625x_ao, | ||
5388 | .reg_type = ni_reg_625x, | ||
5389 | .ao_unipolar = 0, | ||
5390 | - .ao_speed = 357, | ||
5391 | + .ao_speed = 350, | ||
5392 | .num_p0_dio_channels = 8, | ||
5393 | .caldac = {caldac_none}, | ||
5394 | .has_8255 = 0, | ||
5395 | @@ -1037,7 +1037,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
5396 | .ao_range_table = &range_ni_M_625x_ao, | ||
5397 | .reg_type = ni_reg_625x, | ||
5398 | .ao_unipolar = 0, | ||
5399 | - .ao_speed = 357, | ||
5400 | + .ao_speed = 350, | ||
5401 | .num_p0_dio_channels = 32, | ||
5402 | .caldac = {caldac_none}, | ||
5403 | .has_8255 = 0, | ||
5404 | @@ -1056,7 +1056,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
5405 | .ao_range_table = &range_ni_M_625x_ao, | ||
5406 | .reg_type = ni_reg_625x, | ||
5407 | .ao_unipolar = 0, | ||
5408 | - .ao_speed = 357, | ||
5409 | + .ao_speed = 350, | ||
5410 | .num_p0_dio_channels = 32, | ||
5411 | .caldac = {caldac_none}, | ||
5412 | .has_8255 = 0, | ||
5413 | @@ -1092,7 +1092,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
5414 | .ao_range_table = &range_ni_M_628x_ao, | ||
5415 | .reg_type = ni_reg_628x, | ||
5416 | .ao_unipolar = 1, | ||
5417 | - .ao_speed = 357, | ||
5418 | + .ao_speed = 350, | ||
5419 | .num_p0_dio_channels = 8, | ||
5420 | .caldac = {caldac_none}, | ||
5421 | .has_8255 = 0, | ||
5422 | @@ -1111,7 +1111,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
5423 | .ao_range_table = &range_ni_M_628x_ao, | ||
5424 | .reg_type = ni_reg_628x, | ||
5425 | .ao_unipolar = 1, | ||
5426 | - .ao_speed = 357, | ||
5427 | + .ao_speed = 350, | ||
5428 | .num_p0_dio_channels = 8, | ||
5429 | .caldac = {caldac_none}, | ||
5430 | .has_8255 = 0, | ||
5431 | @@ -1147,7 +1147,7 @@ static const struct ni_board_struct ni_boards[] = { | ||
5432 | .ao_range_table = &range_ni_M_628x_ao, | ||
5433 | .reg_type = ni_reg_628x, | ||
5434 | .ao_unipolar = 1, | ||
5435 | - .ao_speed = 357, | ||
5436 | + .ao_speed = 350, | ||
5437 | .num_p0_dio_channels = 32, | ||
5438 | .caldac = {caldac_none}, | ||
5439 | .has_8255 = 0, | ||
5440 | diff --git a/drivers/staging/omapdrm/omap_gem_dmabuf.c b/drivers/staging/omapdrm/omap_gem_dmabuf.c | ||
5441 | index c6f3ef6..784fa4d 100644 | ||
5442 | --- a/drivers/staging/omapdrm/omap_gem_dmabuf.c | ||
5443 | +++ b/drivers/staging/omapdrm/omap_gem_dmabuf.c | ||
5444 | @@ -207,7 +207,12 @@ struct drm_gem_object * omap_gem_prime_import(struct drm_device *dev, | ||
5445 | obj = buffer->priv; | ||
5446 | /* is it from our device? */ | ||
5447 | if (obj->dev == dev) { | ||
5448 | + /* | ||
5449 | + * Importing dmabuf exported from out own gem increases | ||
5450 | + * refcount on gem itself instead of f_count of dmabuf. | ||
5451 | + */ | ||
5452 | drm_gem_object_reference(obj); | ||
5453 | + dma_buf_put(buffer); | ||
5454 | return obj; | ||
5455 | } | ||
5456 | } | ||
5457 | diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c | ||
5458 | index 6b73843..a96cd06 100644 | ||
5459 | --- a/drivers/staging/rtl8712/usb_intf.c | ||
5460 | +++ b/drivers/staging/rtl8712/usb_intf.c | ||
5461 | @@ -63,6 +63,8 @@ static struct usb_device_id rtl871x_usb_id_tbl[] = { | ||
5462 | {USB_DEVICE(0x0B05, 0x1791)}, /* 11n mode disable */ | ||
5463 | /* Belkin */ | ||
5464 | {USB_DEVICE(0x050D, 0x945A)}, | ||
5465 | + /* ISY IWL - Belkin clone */ | ||
5466 | + {USB_DEVICE(0x050D, 0x11F1)}, | ||
5467 | /* Corega */ | ||
5468 | {USB_DEVICE(0x07AA, 0x0047)}, | ||
5469 | /* D-Link */ | ||
5470 | diff --git a/drivers/staging/speakup/synth.c b/drivers/staging/speakup/synth.c | ||
5471 | index df95337..7616f05 100644 | ||
5472 | --- a/drivers/staging/speakup/synth.c | ||
5473 | +++ b/drivers/staging/speakup/synth.c | ||
5474 | @@ -342,7 +342,7 @@ int synth_init(char *synth_name) | ||
5475 | |||
5476 | mutex_lock(&spk_mutex); | ||
5477 | /* First, check if we already have it loaded. */ | ||
5478 | - for (i = 0; synths[i] != NULL && i < MAXSYNTHS; i++) | ||
5479 | + for (i = 0; i < MAXSYNTHS && synths[i] != NULL; i++) | ||
5480 | if (strcmp(synths[i]->name, synth_name) == 0) | ||
5481 | synth = synths[i]; | ||
5482 | |||
5483 | @@ -423,7 +423,7 @@ int synth_add(struct spk_synth *in_synth) | ||
5484 | int i; | ||
5485 | int status = 0; | ||
5486 | mutex_lock(&spk_mutex); | ||
5487 | - for (i = 0; synths[i] != NULL && i < MAXSYNTHS; i++) | ||
5488 | + for (i = 0; i < MAXSYNTHS && synths[i] != NULL; i++) | ||
5489 | /* synth_remove() is responsible for rotating the array down */ | ||
5490 | if (in_synth == synths[i]) { | ||
5491 | mutex_unlock(&spk_mutex); | ||
5492 | diff --git a/drivers/staging/vt6656/dpc.c b/drivers/staging/vt6656/dpc.c | ||
5493 | index 28edf9e..16a229d 100644 | ||
5494 | --- a/drivers/staging/vt6656/dpc.c | ||
5495 | +++ b/drivers/staging/vt6656/dpc.c | ||
5496 | @@ -1238,7 +1238,7 @@ static BOOL s_bHandleRxEncryption ( | ||
5497 | |||
5498 | PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); // 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc | ||
5499 | *pdwRxTSC47_16 = cpu_to_le32(*(PDWORD)(pbyIV + 4)); | ||
5500 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %lx\n",*pdwRxTSC47_16); | ||
5501 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %x\n", *pdwRxTSC47_16); | ||
5502 | if (byDecMode == KEY_CTL_TKIP) { | ||
5503 | *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV+2), *pbyIV)); | ||
5504 | } else { | ||
5505 | @@ -1349,7 +1349,7 @@ static BOOL s_bHostWepRxEncryption ( | ||
5506 | |||
5507 | PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); // 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc | ||
5508 | *pdwRxTSC47_16 = cpu_to_le32(*(PDWORD)(pbyIV + 4)); | ||
5509 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %lx\n",*pdwRxTSC47_16); | ||
5510 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %x\n", *pdwRxTSC47_16); | ||
5511 | |||
5512 | if (byDecMode == KEY_CTL_TKIP) { | ||
5513 | *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV+2), *pbyIV)); | ||
5514 | diff --git a/drivers/staging/vt6656/key.c b/drivers/staging/vt6656/key.c | ||
5515 | index a61fcb9..bf24adb 100644 | ||
5516 | --- a/drivers/staging/vt6656/key.c | ||
5517 | +++ b/drivers/staging/vt6656/key.c | ||
5518 | @@ -223,7 +223,7 @@ BOOL KeybSetKey( | ||
5519 | PSKeyManagement pTable, | ||
5520 | PBYTE pbyBSSID, | ||
5521 | DWORD dwKeyIndex, | ||
5522 | - unsigned long uKeyLength, | ||
5523 | + u32 uKeyLength, | ||
5524 | PQWORD pKeyRSC, | ||
5525 | PBYTE pbyKey, | ||
5526 | BYTE byKeyDecMode | ||
5527 | @@ -235,7 +235,8 @@ BOOL KeybSetKey( | ||
5528 | PSKeyItem pKey; | ||
5529 | unsigned int uKeyIdx; | ||
5530 | |||
5531 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetKey: %lX\n", dwKeyIndex); | ||
5532 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO | ||
5533 | + "Enter KeybSetKey: %X\n", dwKeyIndex); | ||
5534 | |||
5535 | j = (MAX_KEY_TABLE-1); | ||
5536 | for (i=0;i<(MAX_KEY_TABLE-1);i++) { | ||
5537 | @@ -261,7 +262,9 @@ BOOL KeybSetKey( | ||
5538 | if ((dwKeyIndex & TRANSMIT_KEY) != 0) { | ||
5539 | // Group transmit key | ||
5540 | pTable->KeyTable[i].dwGTKeyIndex = dwKeyIndex; | ||
5541 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(R)[%lX]: %d\n", pTable->KeyTable[i].dwGTKeyIndex, i); | ||
5542 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO | ||
5543 | + "Group transmit key(R)[%X]: %d\n", | ||
5544 | + pTable->KeyTable[i].dwGTKeyIndex, i); | ||
5545 | } | ||
5546 | pTable->KeyTable[i].wKeyCtl &= 0xFF0F; // clear group key control filed | ||
5547 | pTable->KeyTable[i].wKeyCtl |= (byKeyDecMode << 4); | ||
5548 | @@ -302,9 +305,12 @@ BOOL KeybSetKey( | ||
5549 | } | ||
5550 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); | ||
5551 | |||
5552 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n ", pKey->dwTSC47_16); | ||
5553 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", pKey->wTSC15_0); | ||
5554 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n ", pKey->dwKeyIndex); | ||
5555 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %x\n ", | ||
5556 | + pKey->dwTSC47_16); | ||
5557 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", | ||
5558 | + pKey->wTSC15_0); | ||
5559 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %x\n ", | ||
5560 | + pKey->dwKeyIndex); | ||
5561 | |||
5562 | return (TRUE); | ||
5563 | } | ||
5564 | @@ -326,7 +332,9 @@ BOOL KeybSetKey( | ||
5565 | if ((dwKeyIndex & TRANSMIT_KEY) != 0) { | ||
5566 | // Group transmit key | ||
5567 | pTable->KeyTable[j].dwGTKeyIndex = dwKeyIndex; | ||
5568 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(N)[%lX]: %d\n", pTable->KeyTable[j].dwGTKeyIndex, j); | ||
5569 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO | ||
5570 | + "Group transmit key(N)[%X]: %d\n", | ||
5571 | + pTable->KeyTable[j].dwGTKeyIndex, j); | ||
5572 | } | ||
5573 | pTable->KeyTable[j].wKeyCtl &= 0xFF0F; // clear group key control filed | ||
5574 | pTable->KeyTable[j].wKeyCtl |= (byKeyDecMode << 4); | ||
5575 | @@ -367,9 +375,11 @@ BOOL KeybSetKey( | ||
5576 | } | ||
5577 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); | ||
5578 | |||
5579 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n ", pKey->dwTSC47_16); | ||
5580 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %x\n ", | ||
5581 | + pKey->dwTSC47_16); | ||
5582 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", pKey->wTSC15_0); | ||
5583 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n ", pKey->dwKeyIndex); | ||
5584 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %x\n ", | ||
5585 | + pKey->dwKeyIndex); | ||
5586 | |||
5587 | return (TRUE); | ||
5588 | } | ||
5589 | @@ -597,7 +607,8 @@ BOOL KeybGetTransmitKey(PSKeyManagement pTable, PBYTE pbyBSSID, DWORD dwKeyType, | ||
5590 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%x ", pTable->KeyTable[i].abyBSSID[ii]); | ||
5591 | } | ||
5592 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); | ||
5593 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"dwGTKeyIndex: %lX\n", pTable->KeyTable[i].dwGTKeyIndex); | ||
5594 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"dwGTKeyIndex: %X\n", | ||
5595 | + pTable->KeyTable[i].dwGTKeyIndex); | ||
5596 | |||
5597 | return (TRUE); | ||
5598 | } | ||
5599 | @@ -664,7 +675,7 @@ BOOL KeybSetDefaultKey( | ||
5600 | void *pDeviceHandler, | ||
5601 | PSKeyManagement pTable, | ||
5602 | DWORD dwKeyIndex, | ||
5603 | - unsigned long uKeyLength, | ||
5604 | + u32 uKeyLength, | ||
5605 | PQWORD pKeyRSC, | ||
5606 | PBYTE pbyKey, | ||
5607 | BYTE byKeyDecMode | ||
5608 | @@ -696,7 +707,10 @@ BOOL KeybSetDefaultKey( | ||
5609 | if ((dwKeyIndex & TRANSMIT_KEY) != 0) { | ||
5610 | // Group transmit key | ||
5611 | pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex = dwKeyIndex; | ||
5612 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(R)[%lX]: %d\n", pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex, MAX_KEY_TABLE-1); | ||
5613 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO | ||
5614 | + "Group transmit key(R)[%X]: %d\n", | ||
5615 | + pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex, | ||
5616 | + MAX_KEY_TABLE-1); | ||
5617 | |||
5618 | } | ||
5619 | pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl &= 0x7F00; // clear all key control filed | ||
5620 | @@ -747,9 +761,11 @@ BOOL KeybSetDefaultKey( | ||
5621 | } | ||
5622 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); | ||
5623 | |||
5624 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %lx\n", pKey->dwTSC47_16); | ||
5625 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %x\n", | ||
5626 | + pKey->dwTSC47_16); | ||
5627 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n", pKey->wTSC15_0); | ||
5628 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %lx\n", pKey->dwKeyIndex); | ||
5629 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %x\n", | ||
5630 | + pKey->dwKeyIndex); | ||
5631 | |||
5632 | return (TRUE); | ||
5633 | } | ||
5634 | @@ -775,7 +791,7 @@ BOOL KeybSetAllGroupKey( | ||
5635 | void *pDeviceHandler, | ||
5636 | PSKeyManagement pTable, | ||
5637 | DWORD dwKeyIndex, | ||
5638 | - unsigned long uKeyLength, | ||
5639 | + u32 uKeyLength, | ||
5640 | PQWORD pKeyRSC, | ||
5641 | PBYTE pbyKey, | ||
5642 | BYTE byKeyDecMode | ||
5643 | @@ -787,7 +803,8 @@ BOOL KeybSetAllGroupKey( | ||
5644 | PSKeyItem pKey; | ||
5645 | unsigned int uKeyIdx; | ||
5646 | |||
5647 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetAllGroupKey: %lX\n", dwKeyIndex); | ||
5648 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetAllGroupKey: %X\n", | ||
5649 | + dwKeyIndex); | ||
5650 | |||
5651 | |||
5652 | if ((dwKeyIndex & PAIRWISE_KEY) != 0) { // Pairwise key | ||
5653 | @@ -804,7 +821,9 @@ BOOL KeybSetAllGroupKey( | ||
5654 | if ((dwKeyIndex & TRANSMIT_KEY) != 0) { | ||
5655 | // Group transmit key | ||
5656 | pTable->KeyTable[i].dwGTKeyIndex = dwKeyIndex; | ||
5657 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Group transmit key(R)[%lX]: %d\n", pTable->KeyTable[i].dwGTKeyIndex, i); | ||
5658 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO | ||
5659 | + "Group transmit key(R)[%X]: %d\n", | ||
5660 | + pTable->KeyTable[i].dwGTKeyIndex, i); | ||
5661 | |||
5662 | } | ||
5663 | pTable->KeyTable[i].wKeyCtl &= 0xFF0F; // clear group key control filed | ||
5664 | diff --git a/drivers/staging/vt6656/key.h b/drivers/staging/vt6656/key.h | ||
5665 | index f749c7a..bd35d39 100644 | ||
5666 | --- a/drivers/staging/vt6656/key.h | ||
5667 | +++ b/drivers/staging/vt6656/key.h | ||
5668 | @@ -58,7 +58,7 @@ | ||
5669 | typedef struct tagSKeyItem | ||
5670 | { | ||
5671 | BOOL bKeyValid; | ||
5672 | - unsigned long uKeyLength; | ||
5673 | + u32 uKeyLength; | ||
5674 | BYTE abyKey[MAX_KEY_LEN]; | ||
5675 | QWORD KeyRSC; | ||
5676 | DWORD dwTSC47_16; | ||
5677 | @@ -107,7 +107,7 @@ BOOL KeybSetKey( | ||
5678 | PSKeyManagement pTable, | ||
5679 | PBYTE pbyBSSID, | ||
5680 | DWORD dwKeyIndex, | ||
5681 | - unsigned long uKeyLength, | ||
5682 | + u32 uKeyLength, | ||
5683 | PQWORD pKeyRSC, | ||
5684 | PBYTE pbyKey, | ||
5685 | BYTE byKeyDecMode | ||
5686 | @@ -146,7 +146,7 @@ BOOL KeybSetDefaultKey( | ||
5687 | void *pDeviceHandler, | ||
5688 | PSKeyManagement pTable, | ||
5689 | DWORD dwKeyIndex, | ||
5690 | - unsigned long uKeyLength, | ||
5691 | + u32 uKeyLength, | ||
5692 | PQWORD pKeyRSC, | ||
5693 | PBYTE pbyKey, | ||
5694 | BYTE byKeyDecMode | ||
5695 | @@ -156,7 +156,7 @@ BOOL KeybSetAllGroupKey( | ||
5696 | void *pDeviceHandler, | ||
5697 | PSKeyManagement pTable, | ||
5698 | DWORD dwKeyIndex, | ||
5699 | - unsigned long uKeyLength, | ||
5700 | + u32 uKeyLength, | ||
5701 | PQWORD pKeyRSC, | ||
5702 | PBYTE pbyKey, | ||
5703 | BYTE byKeyDecMode | ||
5704 | diff --git a/drivers/staging/vt6656/mac.c b/drivers/staging/vt6656/mac.c | ||
5705 | index af4a29d..8fddc7b 100644 | ||
5706 | --- a/drivers/staging/vt6656/mac.c | ||
5707 | +++ b/drivers/staging/vt6656/mac.c | ||
5708 | @@ -260,7 +260,8 @@ BYTE pbyData[24]; | ||
5709 | dwData1 <<= 16; | ||
5710 | dwData1 |= MAKEWORD(*(pbyAddr+4), *(pbyAddr+5)); | ||
5711 | |||
5712 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %lX, KeyCtl:%X\n", wOffset, dwData1, wKeyCtl); | ||
5713 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"1. wOffset: %d, Data: %X,"\ | ||
5714 | + " KeyCtl:%X\n", wOffset, dwData1, wKeyCtl); | ||
5715 | |||
5716 | //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset); | ||
5717 | //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData); | ||
5718 | @@ -277,7 +278,8 @@ BYTE pbyData[24]; | ||
5719 | dwData2 <<= 8; | ||
5720 | dwData2 |= *(pbyAddr+0); | ||
5721 | |||
5722 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %lX\n", wOffset, dwData2); | ||
5723 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"2. wOffset: %d, Data: %X\n", | ||
5724 | + wOffset, dwData2); | ||
5725 | |||
5726 | //VNSvOutPortW(dwIoBase + MAC_REG_MISCFFNDEX, wOffset); | ||
5727 | //VNSvOutPortD(dwIoBase + MAC_REG_MISCFFDATA, dwData); | ||
5728 | diff --git a/drivers/staging/vt6656/rf.c b/drivers/staging/vt6656/rf.c | ||
5729 | index 593cdc7..74c0598 100644 | ||
5730 | --- a/drivers/staging/vt6656/rf.c | ||
5731 | +++ b/drivers/staging/vt6656/rf.c | ||
5732 | @@ -769,6 +769,9 @@ BYTE byPwr = pDevice->byCCKPwr; | ||
5733 | return TRUE; | ||
5734 | } | ||
5735 | |||
5736 | + if (uCH == 0) | ||
5737 | + return -EINVAL; | ||
5738 | + | ||
5739 | switch (uRATE) { | ||
5740 | case RATE_1M: | ||
5741 | case RATE_2M: | ||
5742 | diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c | ||
5743 | index 3390838..5c154e3 100644 | ||
5744 | --- a/drivers/staging/vt6656/rxtx.c | ||
5745 | +++ b/drivers/staging/vt6656/rxtx.c | ||
5746 | @@ -375,7 +375,8 @@ s_vFillTxKey ( | ||
5747 | *(pbyIVHead+3) = (BYTE)(((pDevice->byKeyIndex << 6) & 0xc0) | 0x20); // 0x20 is ExtIV | ||
5748 | // Append IV&ExtIV after Mac Header | ||
5749 | *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16); | ||
5750 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %lx\n", *pdwExtIV); | ||
5751 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"vFillTxKey()---- pdwExtIV: %x\n", | ||
5752 | + *pdwExtIV); | ||
5753 | |||
5754 | } else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { | ||
5755 | pTransmitKey->wTSC15_0++; | ||
5756 | @@ -1751,7 +1752,8 @@ s_bPacketToWirelessUsb( | ||
5757 | MIC_vAppend((PBYTE)&(psEthHeader->abyDstAddr[0]), 12); | ||
5758 | dwMIC_Priority = 0; | ||
5759 | MIC_vAppend((PBYTE)&dwMIC_Priority, 4); | ||
5760 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1); | ||
5761 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %X, %X\n", | ||
5762 | + dwMICKey0, dwMICKey1); | ||
5763 | |||
5764 | /////////////////////////////////////////////////////////////////// | ||
5765 | |||
5766 | @@ -2633,7 +2635,8 @@ vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) { | ||
5767 | MIC_vAppend((PBYTE)&(sEthHeader.abyDstAddr[0]), 12); | ||
5768 | dwMIC_Priority = 0; | ||
5769 | MIC_vAppend((PBYTE)&dwMIC_Priority, 4); | ||
5770 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY: %lX, %lX\n", dwMICKey0, dwMICKey1); | ||
5771 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"DMA0_tx_8021:MIC KEY:"\ | ||
5772 | + " %X, %X\n", dwMICKey0, dwMICKey1); | ||
5773 | |||
5774 | uLength = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen; | ||
5775 | |||
5776 | @@ -2653,7 +2656,8 @@ vDMA0_tx_80211(PSDevice pDevice, struct sk_buff *skb) { | ||
5777 | |||
5778 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize); | ||
5779 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderSize, uPadding, cbIVlen); | ||
5780 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lx, %lx\n", *pdwMIC_L, *pdwMIC_R); | ||
5781 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%x, %x\n", | ||
5782 | + *pdwMIC_L, *pdwMIC_R); | ||
5783 | |||
5784 | } | ||
5785 | |||
5786 | @@ -3027,7 +3031,8 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb) | ||
5787 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n"); | ||
5788 | } | ||
5789 | else { | ||
5790 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex); | ||
5791 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%X]\n", | ||
5792 | + pTransmitKey->dwKeyIndex); | ||
5793 | bNeedEncryption = TRUE; | ||
5794 | } | ||
5795 | } | ||
5796 | @@ -3041,7 +3046,8 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb) | ||
5797 | if (pDevice->bEnableHostWEP) { | ||
5798 | if ((uNodeIndex != 0) && | ||
5799 | (pMgmt->sNodeDBTable[uNodeIndex].dwKeyIndex & PAIRWISE_KEY)) { | ||
5800 | - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%lX]\n", pTransmitKey->dwKeyIndex); | ||
5801 | + DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%X]\n", | ||
5802 | + pTransmitKey->dwKeyIndex); | ||
5803 | bNeedEncryption = TRUE; | ||
5804 | } | ||
5805 | } | ||
5806 | diff --git a/drivers/staging/vt6656/ttype.h b/drivers/staging/vt6656/ttype.h | ||
5807 | index 8e9450e..dfbf747 100644 | ||
5808 | --- a/drivers/staging/vt6656/ttype.h | ||
5809 | +++ b/drivers/staging/vt6656/ttype.h | ||
5810 | @@ -29,6 +29,8 @@ | ||
5811 | #ifndef __TTYPE_H__ | ||
5812 | #define __TTYPE_H__ | ||
5813 | |||
5814 | +#include <linux/types.h> | ||
5815 | + | ||
5816 | /******* Common definitions and typedefs ***********************************/ | ||
5817 | |||
5818 | typedef int BOOL; | ||
5819 | @@ -42,17 +44,17 @@ typedef int BOOL; | ||
5820 | |||
5821 | /****** Simple typedefs ***************************************************/ | ||
5822 | |||
5823 | -typedef unsigned char BYTE; // 8-bit | ||
5824 | -typedef unsigned short WORD; // 16-bit | ||
5825 | -typedef unsigned long DWORD; // 32-bit | ||
5826 | +typedef u8 BYTE; | ||
5827 | +typedef u16 WORD; | ||
5828 | +typedef u32 DWORD; | ||
5829 | |||
5830 | // QWORD is for those situation that we want | ||
5831 | // an 8-byte-aligned 8 byte long structure | ||
5832 | // which is NOT really a floating point number. | ||
5833 | typedef union tagUQuadWord { | ||
5834 | struct { | ||
5835 | - DWORD dwLowDword; | ||
5836 | - DWORD dwHighDword; | ||
5837 | + u32 dwLowDword; | ||
5838 | + u32 dwHighDword; | ||
5839 | } u; | ||
5840 | double DoNotUseThisField; | ||
5841 | } UQuadWord; | ||
5842 | @@ -60,8 +62,8 @@ typedef UQuadWord QWORD; // 64-bit | ||
5843 | |||
5844 | /****** Common pointer types ***********************************************/ | ||
5845 | |||
5846 | -typedef unsigned long ULONG_PTR; // 32-bit | ||
5847 | -typedef unsigned long DWORD_PTR; // 32-bit | ||
5848 | +typedef u32 ULONG_PTR; | ||
5849 | +typedef u32 DWORD_PTR; | ||
5850 | |||
5851 | // boolean pointer | ||
5852 | |||
5853 | diff --git a/drivers/staging/vt6656/wcmd.c b/drivers/staging/vt6656/wcmd.c | ||
5854 | index 586fbe1..b854d7e 100644 | ||
5855 | --- a/drivers/staging/vt6656/wcmd.c | ||
5856 | +++ b/drivers/staging/vt6656/wcmd.c | ||
5857 | @@ -316,17 +316,19 @@ s_MgrMakeProbeRequest( | ||
5858 | return pTxPacket; | ||
5859 | } | ||
5860 | |||
5861 | -void vCommandTimerWait(void *hDeviceContext, unsigned int MSecond) | ||
5862 | +void vCommandTimerWait(void *hDeviceContext, unsigned long MSecond) | ||
5863 | { | ||
5864 | - PSDevice pDevice = (PSDevice)hDeviceContext; | ||
5865 | + PSDevice pDevice = (PSDevice)hDeviceContext; | ||
5866 | |||
5867 | - init_timer(&pDevice->sTimerCommand); | ||
5868 | - pDevice->sTimerCommand.data = (unsigned long)pDevice; | ||
5869 | - pDevice->sTimerCommand.function = (TimerFunction)vRunCommand; | ||
5870 | - // RUN_AT :1 msec ~= (HZ/1024) | ||
5871 | - pDevice->sTimerCommand.expires = (unsigned int)RUN_AT((MSecond * HZ) >> 10); | ||
5872 | - add_timer(&pDevice->sTimerCommand); | ||
5873 | - return; | ||
5874 | + init_timer(&pDevice->sTimerCommand); | ||
5875 | + | ||
5876 | + pDevice->sTimerCommand.data = (unsigned long)pDevice; | ||
5877 | + pDevice->sTimerCommand.function = (TimerFunction)vRunCommand; | ||
5878 | + pDevice->sTimerCommand.expires = RUN_AT((MSecond * HZ) / 1000); | ||
5879 | + | ||
5880 | + add_timer(&pDevice->sTimerCommand); | ||
5881 | + | ||
5882 | + return; | ||
5883 | } | ||
5884 | |||
5885 | void vRunCommand(void *hDeviceContext) | ||
5886 | diff --git a/drivers/staging/vt6656/wpa2.h b/drivers/staging/vt6656/wpa2.h | ||
5887 | index 46c2959..c359252 100644 | ||
5888 | --- a/drivers/staging/vt6656/wpa2.h | ||
5889 | +++ b/drivers/staging/vt6656/wpa2.h | ||
5890 | @@ -45,8 +45,8 @@ typedef struct tagsPMKIDInfo { | ||
5891 | } PMKIDInfo, *PPMKIDInfo; | ||
5892 | |||
5893 | typedef struct tagSPMKIDCache { | ||
5894 | - unsigned long BSSIDInfoCount; | ||
5895 | - PMKIDInfo BSSIDInfo[MAX_PMKID_CACHE]; | ||
5896 | + u32 BSSIDInfoCount; | ||
5897 | + PMKIDInfo BSSIDInfo[MAX_PMKID_CACHE]; | ||
5898 | } SPMKIDCache, *PSPMKIDCache; | ||
5899 | |||
5900 | |||
5901 | diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c | ||
5902 | index 6edefde..f2a73bd 100644 | ||
5903 | --- a/drivers/staging/zram/zram_drv.c | ||
5904 | +++ b/drivers/staging/zram/zram_drv.c | ||
5905 | @@ -183,62 +183,25 @@ static inline int is_partial_io(struct bio_vec *bvec) | ||
5906 | return bvec->bv_len != PAGE_SIZE; | ||
5907 | } | ||
5908 | |||
5909 | -static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, | ||
5910 | - u32 index, int offset, struct bio *bio) | ||
5911 | +static int zram_decompress_page(struct zram *zram, char *mem, u32 index) | ||
5912 | { | ||
5913 | - int ret; | ||
5914 | - size_t clen; | ||
5915 | - struct page *page; | ||
5916 | - unsigned char *user_mem, *cmem, *uncmem = NULL; | ||
5917 | - | ||
5918 | - page = bvec->bv_page; | ||
5919 | - | ||
5920 | - if (zram_test_flag(zram, index, ZRAM_ZERO)) { | ||
5921 | - handle_zero_page(bvec); | ||
5922 | - return 0; | ||
5923 | - } | ||
5924 | + int ret = LZO_E_OK; | ||
5925 | + size_t clen = PAGE_SIZE; | ||
5926 | + unsigned char *cmem; | ||
5927 | + unsigned long handle = zram->table[index].handle; | ||
5928 | |||
5929 | - /* Requested page is not present in compressed area */ | ||
5930 | - if (unlikely(!zram->table[index].handle)) { | ||
5931 | - pr_debug("Read before write: sector=%lu, size=%u", | ||
5932 | - (ulong)(bio->bi_sector), bio->bi_size); | ||
5933 | - handle_zero_page(bvec); | ||
5934 | + if (!handle || zram_test_flag(zram, index, ZRAM_ZERO)) { | ||
5935 | + memset(mem, 0, PAGE_SIZE); | ||
5936 | return 0; | ||
5937 | } | ||
5938 | |||
5939 | - if (is_partial_io(bvec)) { | ||
5940 | - /* Use a temporary buffer to decompress the page */ | ||
5941 | - uncmem = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
5942 | - if (!uncmem) { | ||
5943 | - pr_info("Error allocating temp memory!\n"); | ||
5944 | - return -ENOMEM; | ||
5945 | - } | ||
5946 | - } | ||
5947 | - | ||
5948 | - user_mem = kmap_atomic(page); | ||
5949 | - if (!is_partial_io(bvec)) | ||
5950 | - uncmem = user_mem; | ||
5951 | - clen = PAGE_SIZE; | ||
5952 | - | ||
5953 | - cmem = zs_map_object(zram->mem_pool, zram->table[index].handle, | ||
5954 | - ZS_MM_RO); | ||
5955 | - | ||
5956 | - if (zram->table[index].size == PAGE_SIZE) { | ||
5957 | - memcpy(uncmem, cmem, PAGE_SIZE); | ||
5958 | - ret = LZO_E_OK; | ||
5959 | - } else { | ||
5960 | + cmem = zs_map_object(zram->mem_pool, handle, ZS_MM_RO); | ||
5961 | + if (zram->table[index].size == PAGE_SIZE) | ||
5962 | + memcpy(mem, cmem, PAGE_SIZE); | ||
5963 | + else | ||
5964 | ret = lzo1x_decompress_safe(cmem, zram->table[index].size, | ||
5965 | - uncmem, &clen); | ||
5966 | - } | ||
5967 | - | ||
5968 | - if (is_partial_io(bvec)) { | ||
5969 | - memcpy(user_mem + bvec->bv_offset, uncmem + offset, | ||
5970 | - bvec->bv_len); | ||
5971 | - kfree(uncmem); | ||
5972 | - } | ||
5973 | - | ||
5974 | - zs_unmap_object(zram->mem_pool, zram->table[index].handle); | ||
5975 | - kunmap_atomic(user_mem); | ||
5976 | + mem, &clen); | ||
5977 | + zs_unmap_object(zram->mem_pool, handle); | ||
5978 | |||
5979 | /* Should NEVER happen. Return bio error if it does. */ | ||
5980 | if (unlikely(ret != LZO_E_OK)) { | ||
5981 | @@ -247,42 +210,62 @@ static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, | ||
5982 | return ret; | ||
5983 | } | ||
5984 | |||
5985 | - flush_dcache_page(page); | ||
5986 | - | ||
5987 | return 0; | ||
5988 | } | ||
5989 | |||
5990 | -static int zram_read_before_write(struct zram *zram, char *mem, u32 index) | ||
5991 | +static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, | ||
5992 | + u32 index, int offset, struct bio *bio) | ||
5993 | { | ||
5994 | int ret; | ||
5995 | - size_t clen = PAGE_SIZE; | ||
5996 | - unsigned char *cmem; | ||
5997 | - unsigned long handle = zram->table[index].handle; | ||
5998 | + struct page *page; | ||
5999 | + unsigned char *user_mem, *uncmem = NULL; | ||
6000 | |||
6001 | - if (zram_test_flag(zram, index, ZRAM_ZERO) || !handle) { | ||
6002 | - memset(mem, 0, PAGE_SIZE); | ||
6003 | + page = bvec->bv_page; | ||
6004 | + | ||
6005 | + if (unlikely(!zram->table[index].handle) || | ||
6006 | + zram_test_flag(zram, index, ZRAM_ZERO)) { | ||
6007 | + handle_zero_page(bvec); | ||
6008 | return 0; | ||
6009 | } | ||
6010 | |||
6011 | - cmem = zs_map_object(zram->mem_pool, handle, ZS_MM_RO); | ||
6012 | - ret = lzo1x_decompress_safe(cmem, zram->table[index].size, | ||
6013 | - mem, &clen); | ||
6014 | - zs_unmap_object(zram->mem_pool, handle); | ||
6015 | + user_mem = kmap_atomic(page); | ||
6016 | + if (is_partial_io(bvec)) | ||
6017 | + /* Use a temporary buffer to decompress the page */ | ||
6018 | + uncmem = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
6019 | + else | ||
6020 | + uncmem = user_mem; | ||
6021 | + | ||
6022 | + if (!uncmem) { | ||
6023 | + pr_info("Unable to allocate temp memory\n"); | ||
6024 | + ret = -ENOMEM; | ||
6025 | + goto out_cleanup; | ||
6026 | + } | ||
6027 | |||
6028 | + ret = zram_decompress_page(zram, uncmem, index); | ||
6029 | /* Should NEVER happen. Return bio error if it does. */ | ||
6030 | if (unlikely(ret != LZO_E_OK)) { | ||
6031 | pr_err("Decompression failed! err=%d, page=%u\n", ret, index); | ||
6032 | zram_stat64_inc(zram, &zram->stats.failed_reads); | ||
6033 | - return ret; | ||
6034 | + goto out_cleanup; | ||
6035 | } | ||
6036 | |||
6037 | - return 0; | ||
6038 | + if (is_partial_io(bvec)) | ||
6039 | + memcpy(user_mem + bvec->bv_offset, uncmem + offset, | ||
6040 | + bvec->bv_len); | ||
6041 | + | ||
6042 | + flush_dcache_page(page); | ||
6043 | + ret = 0; | ||
6044 | +out_cleanup: | ||
6045 | + kunmap_atomic(user_mem); | ||
6046 | + if (is_partial_io(bvec)) | ||
6047 | + kfree(uncmem); | ||
6048 | + return ret; | ||
6049 | } | ||
6050 | |||
6051 | static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, | ||
6052 | int offset) | ||
6053 | { | ||
6054 | - int ret; | ||
6055 | + int ret = 0; | ||
6056 | size_t clen; | ||
6057 | unsigned long handle; | ||
6058 | struct page *page; | ||
6059 | @@ -302,11 +285,9 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, | ||
6060 | ret = -ENOMEM; | ||
6061 | goto out; | ||
6062 | } | ||
6063 | - ret = zram_read_before_write(zram, uncmem, index); | ||
6064 | - if (ret) { | ||
6065 | - kfree(uncmem); | ||
6066 | + ret = zram_decompress_page(zram, uncmem, index); | ||
6067 | + if (ret) | ||
6068 | goto out; | ||
6069 | - } | ||
6070 | } | ||
6071 | |||
6072 | /* | ||
6073 | @@ -319,16 +300,18 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, | ||
6074 | |||
6075 | user_mem = kmap_atomic(page); | ||
6076 | |||
6077 | - if (is_partial_io(bvec)) | ||
6078 | + if (is_partial_io(bvec)) { | ||
6079 | memcpy(uncmem + offset, user_mem + bvec->bv_offset, | ||
6080 | bvec->bv_len); | ||
6081 | - else | ||
6082 | + kunmap_atomic(user_mem); | ||
6083 | + user_mem = NULL; | ||
6084 | + } else { | ||
6085 | uncmem = user_mem; | ||
6086 | + } | ||
6087 | |||
6088 | if (page_zero_filled(uncmem)) { | ||
6089 | - kunmap_atomic(user_mem); | ||
6090 | - if (is_partial_io(bvec)) | ||
6091 | - kfree(uncmem); | ||
6092 | + if (!is_partial_io(bvec)) | ||
6093 | + kunmap_atomic(user_mem); | ||
6094 | zram_stat_inc(&zram->stats.pages_zero); | ||
6095 | zram_set_flag(zram, index, ZRAM_ZERO); | ||
6096 | ret = 0; | ||
6097 | @@ -338,9 +321,11 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, | ||
6098 | ret = lzo1x_1_compress(uncmem, PAGE_SIZE, src, &clen, | ||
6099 | zram->compress_workmem); | ||
6100 | |||
6101 | - kunmap_atomic(user_mem); | ||
6102 | - if (is_partial_io(bvec)) | ||
6103 | - kfree(uncmem); | ||
6104 | + if (!is_partial_io(bvec)) { | ||
6105 | + kunmap_atomic(user_mem); | ||
6106 | + user_mem = NULL; | ||
6107 | + uncmem = NULL; | ||
6108 | + } | ||
6109 | |||
6110 | if (unlikely(ret != LZO_E_OK)) { | ||
6111 | pr_err("Compression failed! err=%d\n", ret); | ||
6112 | @@ -349,8 +334,10 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, | ||
6113 | |||
6114 | if (unlikely(clen > max_zpage_size)) { | ||
6115 | zram_stat_inc(&zram->stats.bad_compress); | ||
6116 | - src = uncmem; | ||
6117 | clen = PAGE_SIZE; | ||
6118 | + src = NULL; | ||
6119 | + if (is_partial_io(bvec)) | ||
6120 | + src = uncmem; | ||
6121 | } | ||
6122 | |||
6123 | handle = zs_malloc(zram->mem_pool, clen); | ||
6124 | @@ -362,7 +349,11 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, | ||
6125 | } | ||
6126 | cmem = zs_map_object(zram->mem_pool, handle, ZS_MM_WO); | ||
6127 | |||
6128 | + if ((clen == PAGE_SIZE) && !is_partial_io(bvec)) | ||
6129 | + src = kmap_atomic(page); | ||
6130 | memcpy(cmem, src, clen); | ||
6131 | + if ((clen == PAGE_SIZE) && !is_partial_io(bvec)) | ||
6132 | + kunmap_atomic(src); | ||
6133 | |||
6134 | zs_unmap_object(zram->mem_pool, handle); | ||
6135 | |||
6136 | @@ -375,9 +366,10 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, | ||
6137 | if (clen <= PAGE_SIZE / 2) | ||
6138 | zram_stat_inc(&zram->stats.good_compress); | ||
6139 | |||
6140 | - return 0; | ||
6141 | - | ||
6142 | out: | ||
6143 | + if (is_partial_io(bvec)) | ||
6144 | + kfree(uncmem); | ||
6145 | + | ||
6146 | if (ret) | ||
6147 | zram_stat64_inc(zram, &zram->stats.failed_writes); | ||
6148 | return ret; | ||
6149 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c | ||
6150 | index 035c2c7..bb34855 100644 | ||
6151 | --- a/drivers/target/iscsi/iscsi_target.c | ||
6152 | +++ b/drivers/target/iscsi/iscsi_target.c | ||
6153 | @@ -735,7 +735,7 @@ static void iscsit_ack_from_expstatsn(struct iscsi_conn *conn, u32 exp_statsn) | ||
6154 | list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) { | ||
6155 | spin_lock(&cmd->istate_lock); | ||
6156 | if ((cmd->i_state == ISTATE_SENT_STATUS) && | ||
6157 | - (cmd->stat_sn < exp_statsn)) { | ||
6158 | + iscsi_sna_lt(cmd->stat_sn, exp_statsn)) { | ||
6159 | cmd->i_state = ISTATE_REMOVE; | ||
6160 | spin_unlock(&cmd->istate_lock); | ||
6161 | iscsit_add_cmd_to_immediate_queue(cmd, conn, | ||
6162 | @@ -2360,7 +2360,7 @@ static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) | ||
6163 | if (!conn_p) | ||
6164 | return; | ||
6165 | |||
6166 | - cmd = iscsit_allocate_cmd(conn_p, GFP_KERNEL); | ||
6167 | + cmd = iscsit_allocate_cmd(conn_p, GFP_ATOMIC); | ||
6168 | if (!cmd) { | ||
6169 | iscsit_dec_conn_usage_count(conn_p); | ||
6170 | return; | ||
6171 | diff --git a/drivers/target/iscsi/iscsi_target_erl2.c b/drivers/target/iscsi/iscsi_target_erl2.c | ||
6172 | index 17d8c20..ba6091b 100644 | ||
6173 | --- a/drivers/target/iscsi/iscsi_target_erl2.c | ||
6174 | +++ b/drivers/target/iscsi/iscsi_target_erl2.c | ||
6175 | @@ -372,7 +372,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) | ||
6176 | * made generic here. | ||
6177 | */ | ||
6178 | if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd && | ||
6179 | - (cmd->cmd_sn >= conn->sess->exp_cmd_sn)) { | ||
6180 | + iscsi_sna_gte(cmd->cmd_sn, conn->sess->exp_cmd_sn)) { | ||
6181 | list_del(&cmd->i_conn_node); | ||
6182 | spin_unlock_bh(&conn->cmd_lock); | ||
6183 | iscsit_free_cmd(cmd); | ||
6184 | diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c | ||
6185 | index f8dbec0..10b40bb 100644 | ||
6186 | --- a/drivers/target/iscsi/iscsi_target_login.c | ||
6187 | +++ b/drivers/target/iscsi/iscsi_target_login.c | ||
6188 | @@ -127,13 +127,13 @@ int iscsi_check_for_session_reinstatement(struct iscsi_conn *conn) | ||
6189 | |||
6190 | initiatorname_param = iscsi_find_param_from_key( | ||
6191 | INITIATORNAME, conn->param_list); | ||
6192 | - if (!initiatorname_param) | ||
6193 | - return -1; | ||
6194 | - | ||
6195 | sessiontype_param = iscsi_find_param_from_key( | ||
6196 | SESSIONTYPE, conn->param_list); | ||
6197 | - if (!sessiontype_param) | ||
6198 | + if (!initiatorname_param || !sessiontype_param) { | ||
6199 | + iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, | ||
6200 | + ISCSI_LOGIN_STATUS_MISSING_FIELDS); | ||
6201 | return -1; | ||
6202 | + } | ||
6203 | |||
6204 | sessiontype = (strncmp(sessiontype_param->value, NORMAL, 6)) ? 1 : 0; | ||
6205 | |||
6206 | diff --git a/drivers/target/iscsi/iscsi_target_nego.c b/drivers/target/iscsi/iscsi_target_nego.c | ||
6207 | index e9053a0..9d902ae 100644 | ||
6208 | --- a/drivers/target/iscsi/iscsi_target_nego.c | ||
6209 | +++ b/drivers/target/iscsi/iscsi_target_nego.c | ||
6210 | @@ -620,8 +620,11 @@ static int iscsi_target_handle_csg_one(struct iscsi_conn *conn, struct iscsi_log | ||
6211 | login->req_buf, | ||
6212 | payload_length, | ||
6213 | conn); | ||
6214 | - if (ret < 0) | ||
6215 | + if (ret < 0) { | ||
6216 | + iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, | ||
6217 | + ISCSI_LOGIN_STATUS_INIT_ERR); | ||
6218 | return -1; | ||
6219 | + } | ||
6220 | |||
6221 | if (login->first_request) | ||
6222 | if (iscsi_target_check_first_request(conn, login) < 0) | ||
6223 | @@ -636,8 +639,11 @@ static int iscsi_target_handle_csg_one(struct iscsi_conn *conn, struct iscsi_log | ||
6224 | login->rsp_buf, | ||
6225 | &login->rsp_length, | ||
6226 | conn->param_list); | ||
6227 | - if (ret < 0) | ||
6228 | + if (ret < 0) { | ||
6229 | + iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_INITIATOR_ERR, | ||
6230 | + ISCSI_LOGIN_STATUS_INIT_ERR); | ||
6231 | return -1; | ||
6232 | + } | ||
6233 | |||
6234 | if (!login->auth_complete && | ||
6235 | ISCSI_TPG_ATTRIB(ISCSI_TPG_C(conn))->authentication) { | ||
6236 | diff --git a/drivers/target/iscsi/iscsi_target_tmr.c b/drivers/target/iscsi/iscsi_target_tmr.c | ||
6237 | index 4a99820..9d4417a 100644 | ||
6238 | --- a/drivers/target/iscsi/iscsi_target_tmr.c | ||
6239 | +++ b/drivers/target/iscsi/iscsi_target_tmr.c | ||
6240 | @@ -50,8 +50,8 @@ u8 iscsit_tmr_abort_task( | ||
6241 | if (!ref_cmd) { | ||
6242 | pr_err("Unable to locate RefTaskTag: 0x%08x on CID:" | ||
6243 | " %hu.\n", hdr->rtt, conn->cid); | ||
6244 | - return (be32_to_cpu(hdr->refcmdsn) >= conn->sess->exp_cmd_sn && | ||
6245 | - be32_to_cpu(hdr->refcmdsn) <= conn->sess->max_cmd_sn) ? | ||
6246 | + return (iscsi_sna_gte(be32_to_cpu(hdr->refcmdsn), conn->sess->exp_cmd_sn) && | ||
6247 | + iscsi_sna_lte(be32_to_cpu(hdr->refcmdsn), conn->sess->max_cmd_sn)) ? | ||
6248 | ISCSI_TMF_RSP_COMPLETE : ISCSI_TMF_RSP_NO_TASK; | ||
6249 | } | ||
6250 | if (ref_cmd->cmd_sn != be32_to_cpu(hdr->refcmdsn)) { | ||
6251 | diff --git a/drivers/target/sbp/sbp_target.c b/drivers/target/sbp/sbp_target.c | ||
6252 | index 0d6d7c1..f9e1e8a 100644 | ||
6253 | --- a/drivers/target/sbp/sbp_target.c | ||
6254 | +++ b/drivers/target/sbp/sbp_target.c | ||
6255 | @@ -2207,20 +2207,23 @@ static struct se_portal_group *sbp_make_tpg( | ||
6256 | tport->mgt_agt = sbp_management_agent_register(tport); | ||
6257 | if (IS_ERR(tport->mgt_agt)) { | ||
6258 | ret = PTR_ERR(tport->mgt_agt); | ||
6259 | - kfree(tpg); | ||
6260 | - return ERR_PTR(ret); | ||
6261 | + goto out_free_tpg; | ||
6262 | } | ||
6263 | |||
6264 | ret = core_tpg_register(&sbp_fabric_configfs->tf_ops, wwn, | ||
6265 | &tpg->se_tpg, (void *)tpg, | ||
6266 | TRANSPORT_TPG_TYPE_NORMAL); | ||
6267 | - if (ret < 0) { | ||
6268 | - sbp_management_agent_unregister(tport->mgt_agt); | ||
6269 | - kfree(tpg); | ||
6270 | - return ERR_PTR(ret); | ||
6271 | - } | ||
6272 | + if (ret < 0) | ||
6273 | + goto out_unreg_mgt_agt; | ||
6274 | |||
6275 | return &tpg->se_tpg; | ||
6276 | + | ||
6277 | +out_unreg_mgt_agt: | ||
6278 | + sbp_management_agent_unregister(tport->mgt_agt); | ||
6279 | +out_free_tpg: | ||
6280 | + tport->tpg = NULL; | ||
6281 | + kfree(tpg); | ||
6282 | + return ERR_PTR(ret); | ||
6283 | } | ||
6284 | |||
6285 | static void sbp_drop_tpg(struct se_portal_group *se_tpg) | ||
6286 | diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c | ||
6287 | index 0360383..c639b42 100644 | ||
6288 | --- a/drivers/target/target_core_file.c | ||
6289 | +++ b/drivers/target/target_core_file.c | ||
6290 | @@ -260,7 +260,7 @@ static int fd_do_readv(struct se_cmd *cmd, struct scatterlist *sgl, | ||
6291 | |||
6292 | for_each_sg(sgl, sg, sgl_nents, i) { | ||
6293 | iov[i].iov_len = sg->length; | ||
6294 | - iov[i].iov_base = sg_virt(sg); | ||
6295 | + iov[i].iov_base = kmap(sg_page(sg)) + sg->offset; | ||
6296 | } | ||
6297 | |||
6298 | old_fs = get_fs(); | ||
6299 | @@ -268,6 +268,8 @@ static int fd_do_readv(struct se_cmd *cmd, struct scatterlist *sgl, | ||
6300 | ret = vfs_readv(fd, &iov[0], sgl_nents, &pos); | ||
6301 | set_fs(old_fs); | ||
6302 | |||
6303 | + for_each_sg(sgl, sg, sgl_nents, i) | ||
6304 | + kunmap(sg_page(sg)); | ||
6305 | kfree(iov); | ||
6306 | /* | ||
6307 | * Return zeros and GOOD status even if the READ did not return | ||
6308 | @@ -313,7 +315,7 @@ static int fd_do_writev(struct se_cmd *cmd, struct scatterlist *sgl, | ||
6309 | |||
6310 | for_each_sg(sgl, sg, sgl_nents, i) { | ||
6311 | iov[i].iov_len = sg->length; | ||
6312 | - iov[i].iov_base = sg_virt(sg); | ||
6313 | + iov[i].iov_base = kmap(sg_page(sg)) + sg->offset; | ||
6314 | } | ||
6315 | |||
6316 | old_fs = get_fs(); | ||
6317 | @@ -321,6 +323,9 @@ static int fd_do_writev(struct se_cmd *cmd, struct scatterlist *sgl, | ||
6318 | ret = vfs_writev(fd, &iov[0], sgl_nents, &pos); | ||
6319 | set_fs(old_fs); | ||
6320 | |||
6321 | + for_each_sg(sgl, sg, sgl_nents, i) | ||
6322 | + kunmap(sg_page(sg)); | ||
6323 | + | ||
6324 | kfree(iov); | ||
6325 | |||
6326 | if (ret < 0 || ret != cmd->data_length) { | ||
6327 | diff --git a/drivers/target/tcm_fc/tfc_sess.c b/drivers/target/tcm_fc/tfc_sess.c | ||
6328 | index 9585010..12d6fa2 100644 | ||
6329 | --- a/drivers/target/tcm_fc/tfc_sess.c | ||
6330 | +++ b/drivers/target/tcm_fc/tfc_sess.c | ||
6331 | @@ -430,7 +430,6 @@ static void ft_sess_rcu_free(struct rcu_head *rcu) | ||
6332 | { | ||
6333 | struct ft_sess *sess = container_of(rcu, struct ft_sess, rcu); | ||
6334 | |||
6335 | - transport_deregister_session(sess->se_sess); | ||
6336 | kfree(sess); | ||
6337 | } | ||
6338 | |||
6339 | @@ -438,6 +437,7 @@ static void ft_sess_free(struct kref *kref) | ||
6340 | { | ||
6341 | struct ft_sess *sess = container_of(kref, struct ft_sess, kref); | ||
6342 | |||
6343 | + transport_deregister_session(sess->se_sess); | ||
6344 | call_rcu(&sess->rcu, ft_sess_rcu_free); | ||
6345 | } | ||
6346 | |||
6347 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
6348 | index 8d809a8..2d92cce 100644 | ||
6349 | --- a/drivers/usb/class/cdc-acm.c | ||
6350 | +++ b/drivers/usb/class/cdc-acm.c | ||
6351 | @@ -1602,6 +1602,9 @@ static const struct usb_device_id acm_ids[] = { | ||
6352 | { USB_DEVICE(0x0572, 0x1340), /* Conexant CX93010-2x UCMxx */ | ||
6353 | .driver_info = NO_UNION_NORMAL, | ||
6354 | }, | ||
6355 | + { USB_DEVICE(0x05f9, 0x4002), /* PSC Scanning, Magellan 800i */ | ||
6356 | + .driver_info = NO_UNION_NORMAL, | ||
6357 | + }, | ||
6358 | { USB_DEVICE(0x1bbb, 0x0003), /* Alcatel OT-I650 */ | ||
6359 | .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */ | ||
6360 | }, | ||
6361 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
6362 | index 1af04bd..e6cc4e6 100644 | ||
6363 | --- a/drivers/usb/core/hub.c | ||
6364 | +++ b/drivers/usb/core/hub.c | ||
6365 | @@ -876,6 +876,60 @@ static int hub_hub_status(struct usb_hub *hub, | ||
6366 | return ret; | ||
6367 | } | ||
6368 | |||
6369 | +static int hub_set_port_link_state(struct usb_hub *hub, int port1, | ||
6370 | + unsigned int link_status) | ||
6371 | +{ | ||
6372 | + return set_port_feature(hub->hdev, | ||
6373 | + port1 | (link_status << 3), | ||
6374 | + USB_PORT_FEAT_LINK_STATE); | ||
6375 | +} | ||
6376 | + | ||
6377 | +/* | ||
6378 | + * If USB 3.0 ports are placed into the Disabled state, they will no longer | ||
6379 | + * detect any device connects or disconnects. This is generally not what the | ||
6380 | + * USB core wants, since it expects a disabled port to produce a port status | ||
6381 | + * change event when a new device connects. | ||
6382 | + * | ||
6383 | + * Instead, set the link state to Disabled, wait for the link to settle into | ||
6384 | + * that state, clear any change bits, and then put the port into the RxDetect | ||
6385 | + * state. | ||
6386 | + */ | ||
6387 | +static int hub_usb3_port_disable(struct usb_hub *hub, int port1) | ||
6388 | +{ | ||
6389 | + int ret; | ||
6390 | + int total_time; | ||
6391 | + u16 portchange, portstatus; | ||
6392 | + | ||
6393 | + if (!hub_is_superspeed(hub->hdev)) | ||
6394 | + return -EINVAL; | ||
6395 | + | ||
6396 | + ret = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_SS_DISABLED); | ||
6397 | + if (ret) { | ||
6398 | + dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | ||
6399 | + port1, ret); | ||
6400 | + return ret; | ||
6401 | + } | ||
6402 | + | ||
6403 | + /* Wait for the link to enter the disabled state. */ | ||
6404 | + for (total_time = 0; ; total_time += HUB_DEBOUNCE_STEP) { | ||
6405 | + ret = hub_port_status(hub, port1, &portstatus, &portchange); | ||
6406 | + if (ret < 0) | ||
6407 | + return ret; | ||
6408 | + | ||
6409 | + if ((portstatus & USB_PORT_STAT_LINK_STATE) == | ||
6410 | + USB_SS_PORT_LS_SS_DISABLED) | ||
6411 | + break; | ||
6412 | + if (total_time >= HUB_DEBOUNCE_TIMEOUT) | ||
6413 | + break; | ||
6414 | + msleep(HUB_DEBOUNCE_STEP); | ||
6415 | + } | ||
6416 | + if (total_time >= HUB_DEBOUNCE_TIMEOUT) | ||
6417 | + dev_warn(hub->intfdev, "Could not disable port %d after %d ms\n", | ||
6418 | + port1, total_time); | ||
6419 | + | ||
6420 | + return hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_RX_DETECT); | ||
6421 | +} | ||
6422 | + | ||
6423 | static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | ||
6424 | { | ||
6425 | struct usb_device *hdev = hub->hdev; | ||
6426 | @@ -884,8 +938,13 @@ static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | ||
6427 | if (hub->ports[port1 - 1]->child && set_state) | ||
6428 | usb_set_device_state(hub->ports[port1 - 1]->child, | ||
6429 | USB_STATE_NOTATTACHED); | ||
6430 | - if (!hub->error && !hub_is_superspeed(hub->hdev)) | ||
6431 | - ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); | ||
6432 | + if (!hub->error) { | ||
6433 | + if (hub_is_superspeed(hub->hdev)) | ||
6434 | + ret = hub_usb3_port_disable(hub, port1); | ||
6435 | + else | ||
6436 | + ret = clear_port_feature(hdev, port1, | ||
6437 | + USB_PORT_FEAT_ENABLE); | ||
6438 | + } | ||
6439 | if (ret) | ||
6440 | dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | ||
6441 | port1, ret); | ||
6442 | @@ -2401,7 +2460,7 @@ static unsigned hub_is_wusb(struct usb_hub *hub) | ||
6443 | #define HUB_SHORT_RESET_TIME 10 | ||
6444 | #define HUB_BH_RESET_TIME 50 | ||
6445 | #define HUB_LONG_RESET_TIME 200 | ||
6446 | -#define HUB_RESET_TIMEOUT 500 | ||
6447 | +#define HUB_RESET_TIMEOUT 800 | ||
6448 | |||
6449 | static int hub_port_reset(struct usb_hub *hub, int port1, | ||
6450 | struct usb_device *udev, unsigned int delay, bool warm); | ||
6451 | @@ -2436,6 +2495,10 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1, | ||
6452 | if (ret < 0) | ||
6453 | return ret; | ||
6454 | |||
6455 | + /* The port state is unknown until the reset completes. */ | ||
6456 | + if ((portstatus & USB_PORT_STAT_RESET)) | ||
6457 | + goto delay; | ||
6458 | + | ||
6459 | /* | ||
6460 | * Some buggy devices require a warm reset to be issued even | ||
6461 | * when the port appears not to be connected. | ||
6462 | @@ -2481,11 +2544,7 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1, | ||
6463 | if ((portchange & USB_PORT_STAT_C_CONNECTION)) | ||
6464 | return -ENOTCONN; | ||
6465 | |||
6466 | - /* if we`ve finished resetting, then break out of | ||
6467 | - * the loop | ||
6468 | - */ | ||
6469 | - if (!(portstatus & USB_PORT_STAT_RESET) && | ||
6470 | - (portstatus & USB_PORT_STAT_ENABLE)) { | ||
6471 | + if ((portstatus & USB_PORT_STAT_ENABLE)) { | ||
6472 | if (hub_is_wusb(hub)) | ||
6473 | udev->speed = USB_SPEED_WIRELESS; | ||
6474 | else if (hub_is_superspeed(hub->hdev)) | ||
6475 | @@ -2499,10 +2558,15 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1, | ||
6476 | return 0; | ||
6477 | } | ||
6478 | } else { | ||
6479 | - if (portchange & USB_PORT_STAT_C_BH_RESET) | ||
6480 | - return 0; | ||
6481 | + if (!(portstatus & USB_PORT_STAT_CONNECTION) || | ||
6482 | + hub_port_warm_reset_required(hub, | ||
6483 | + portstatus)) | ||
6484 | + return -ENOTCONN; | ||
6485 | + | ||
6486 | + return 0; | ||
6487 | } | ||
6488 | |||
6489 | +delay: | ||
6490 | /* switch to the long delay after two short delay failures */ | ||
6491 | if (delay_time >= 2 * HUB_SHORT_RESET_TIME) | ||
6492 | delay = HUB_LONG_RESET_TIME; | ||
6493 | @@ -2526,14 +2590,11 @@ static void hub_port_finish_reset(struct usb_hub *hub, int port1, | ||
6494 | msleep(10 + 40); | ||
6495 | update_devnum(udev, 0); | ||
6496 | hcd = bus_to_hcd(udev->bus); | ||
6497 | - if (hcd->driver->reset_device) { | ||
6498 | - *status = hcd->driver->reset_device(hcd, udev); | ||
6499 | - if (*status < 0) { | ||
6500 | - dev_err(&udev->dev, "Cannot reset " | ||
6501 | - "HCD device state\n"); | ||
6502 | - break; | ||
6503 | - } | ||
6504 | - } | ||
6505 | + /* The xHC may think the device is already reset, | ||
6506 | + * so ignore the status. | ||
6507 | + */ | ||
6508 | + if (hcd->driver->reset_device) | ||
6509 | + hcd->driver->reset_device(hcd, udev); | ||
6510 | } | ||
6511 | /* FALL THROUGH */ | ||
6512 | case -ENOTCONN: | ||
6513 | @@ -2541,16 +2602,16 @@ static void hub_port_finish_reset(struct usb_hub *hub, int port1, | ||
6514 | clear_port_feature(hub->hdev, | ||
6515 | port1, USB_PORT_FEAT_C_RESET); | ||
6516 | /* FIXME need disconnect() for NOTATTACHED device */ | ||
6517 | - if (warm) { | ||
6518 | + if (hub_is_superspeed(hub->hdev)) { | ||
6519 | clear_port_feature(hub->hdev, port1, | ||
6520 | USB_PORT_FEAT_C_BH_PORT_RESET); | ||
6521 | clear_port_feature(hub->hdev, port1, | ||
6522 | USB_PORT_FEAT_C_PORT_LINK_STATE); | ||
6523 | - } else { | ||
6524 | + } | ||
6525 | + if (!warm) | ||
6526 | usb_set_device_state(udev, *status | ||
6527 | ? USB_STATE_NOTATTACHED | ||
6528 | : USB_STATE_DEFAULT); | ||
6529 | - } | ||
6530 | break; | ||
6531 | } | ||
6532 | } | ||
6533 | @@ -2899,7 +2960,7 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | ||
6534 | static int finish_port_resume(struct usb_device *udev) | ||
6535 | { | ||
6536 | int status = 0; | ||
6537 | - u16 devstatus; | ||
6538 | + u16 devstatus = 0; | ||
6539 | |||
6540 | /* caller owns the udev device lock */ | ||
6541 | dev_dbg(&udev->dev, "%s\n", | ||
6542 | @@ -2944,7 +3005,13 @@ static int finish_port_resume(struct usb_device *udev) | ||
6543 | if (status) { | ||
6544 | dev_dbg(&udev->dev, "gone after usb resume? status %d\n", | ||
6545 | status); | ||
6546 | - } else if (udev->actconfig) { | ||
6547 | + /* | ||
6548 | + * There are a few quirky devices which violate the standard | ||
6549 | + * by claiming to have remote wakeup enabled after a reset, | ||
6550 | + * which crash if the feature is cleared, hence check for | ||
6551 | + * udev->reset_resume | ||
6552 | + */ | ||
6553 | + } else if (udev->actconfig && !udev->reset_resume) { | ||
6554 | le16_to_cpus(&devstatus); | ||
6555 | if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) { | ||
6556 | status = usb_control_msg(udev, | ||
6557 | @@ -4572,9 +4639,14 @@ static void hub_events(void) | ||
6558 | * SS.Inactive state. | ||
6559 | */ | ||
6560 | if (hub_port_warm_reset_required(hub, portstatus)) { | ||
6561 | + int status; | ||
6562 | + | ||
6563 | dev_dbg(hub_dev, "warm reset port %d\n", i); | ||
6564 | - hub_port_reset(hub, i, NULL, | ||
6565 | + status = hub_port_reset(hub, i, NULL, | ||
6566 | HUB_BH_RESET_TIME, true); | ||
6567 | + if (status < 0) | ||
6568 | + hub_port_disable(hub, i, 1); | ||
6569 | + connect_change = 0; | ||
6570 | } | ||
6571 | |||
6572 | if (connect_change) | ||
6573 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c | ||
6574 | index fdefd9c..3113c1d 100644 | ||
6575 | --- a/drivers/usb/core/quirks.c | ||
6576 | +++ b/drivers/usb/core/quirks.c | ||
6577 | @@ -43,6 +43,9 @@ static const struct usb_device_id usb_quirk_list[] = { | ||
6578 | /* Creative SB Audigy 2 NX */ | ||
6579 | { USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6580 | |||
6581 | + /* Microsoft LifeCam-VX700 v2.0 */ | ||
6582 | + { USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6583 | + | ||
6584 | /* Logitech Quickcam Fusion */ | ||
6585 | { USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
6586 | |||
6587 | diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c | ||
6588 | index 0f7541b..559b06c 100644 | ||
6589 | --- a/drivers/usb/gadget/dummy_hcd.c | ||
6590 | +++ b/drivers/usb/gadget/dummy_hcd.c | ||
6591 | @@ -126,10 +126,7 @@ static const char ep0name[] = "ep0"; | ||
6592 | static const char *const ep_name[] = { | ||
6593 | ep0name, /* everyone has ep0 */ | ||
6594 | |||
6595 | - /* act like a net2280: high speed, six configurable endpoints */ | ||
6596 | - "ep-a", "ep-b", "ep-c", "ep-d", "ep-e", "ep-f", | ||
6597 | - | ||
6598 | - /* or like pxa250: fifteen fixed function endpoints */ | ||
6599 | + /* act like a pxa250: fifteen fixed function endpoints */ | ||
6600 | "ep1in-bulk", "ep2out-bulk", "ep3in-iso", "ep4out-iso", "ep5in-int", | ||
6601 | "ep6in-bulk", "ep7out-bulk", "ep8in-iso", "ep9out-iso", "ep10in-int", | ||
6602 | "ep11in-bulk", "ep12out-bulk", "ep13in-iso", "ep14out-iso", | ||
6603 | @@ -137,6 +134,10 @@ static const char *const ep_name[] = { | ||
6604 | |||
6605 | /* or like sa1100: two fixed function endpoints */ | ||
6606 | "ep1out-bulk", "ep2in-bulk", | ||
6607 | + | ||
6608 | + /* and now some generic EPs so we have enough in multi config */ | ||
6609 | + "ep3out", "ep4in", "ep5out", "ep6out", "ep7in", "ep8out", "ep9in", | ||
6610 | + "ep10out", "ep11out", "ep12in", "ep13out", "ep14in", "ep15out", | ||
6611 | }; | ||
6612 | #define DUMMY_ENDPOINTS ARRAY_SIZE(ep_name) | ||
6613 | |||
6614 | diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c | ||
6615 | index f42b68e..d2ea004 100644 | ||
6616 | --- a/drivers/usb/host/ehci-pci.c | ||
6617 | +++ b/drivers/usb/host/ehci-pci.c | ||
6618 | @@ -192,6 +192,26 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | ||
6619 | break; | ||
6620 | } | ||
6621 | |||
6622 | + /* optional debug port, normally in the first BAR */ | ||
6623 | + temp = pci_find_capability(pdev, PCI_CAP_ID_DBG); | ||
6624 | + if (temp) { | ||
6625 | + pci_read_config_dword(pdev, temp, &temp); | ||
6626 | + temp >>= 16; | ||
6627 | + if (((temp >> 13) & 7) == 1) { | ||
6628 | + u32 hcs_params = ehci_readl(ehci, | ||
6629 | + &ehci->caps->hcs_params); | ||
6630 | + | ||
6631 | + temp &= 0x1fff; | ||
6632 | + ehci->debug = hcd->regs + temp; | ||
6633 | + temp = ehci_readl(ehci, &ehci->debug->control); | ||
6634 | + ehci_info(ehci, "debug port %d%s\n", | ||
6635 | + HCS_DEBUG_PORT(hcs_params), | ||
6636 | + (temp & DBGP_ENABLED) ? " IN USE" : ""); | ||
6637 | + if (!(temp & DBGP_ENABLED)) | ||
6638 | + ehci->debug = NULL; | ||
6639 | + } | ||
6640 | + } | ||
6641 | + | ||
6642 | retval = ehci_setup(hcd); | ||
6643 | if (retval) | ||
6644 | return retval; | ||
6645 | @@ -226,25 +246,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | ||
6646 | break; | ||
6647 | } | ||
6648 | |||
6649 | - /* optional debug port, normally in the first BAR */ | ||
6650 | - temp = pci_find_capability(pdev, 0x0a); | ||
6651 | - if (temp) { | ||
6652 | - pci_read_config_dword(pdev, temp, &temp); | ||
6653 | - temp >>= 16; | ||
6654 | - if ((temp & (3 << 13)) == (1 << 13)) { | ||
6655 | - temp &= 0x1fff; | ||
6656 | - ehci->debug = hcd->regs + temp; | ||
6657 | - temp = ehci_readl(ehci, &ehci->debug->control); | ||
6658 | - ehci_info(ehci, "debug port %d%s\n", | ||
6659 | - HCS_DEBUG_PORT(ehci->hcs_params), | ||
6660 | - (temp & DBGP_ENABLED) | ||
6661 | - ? " IN USE" | ||
6662 | - : ""); | ||
6663 | - if (!(temp & DBGP_ENABLED)) | ||
6664 | - ehci->debug = NULL; | ||
6665 | - } | ||
6666 | - } | ||
6667 | - | ||
6668 | /* at least the Genesys GL880S needs fixup here */ | ||
6669 | temp = HCS_N_CC(ehci->hcs_params) * HCS_N_PCC(ehci->hcs_params); | ||
6670 | temp &= 0x0f; | ||
6671 | diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c | ||
6672 | index a686cf4..6891442 100644 | ||
6673 | --- a/drivers/usb/host/xhci-hub.c | ||
6674 | +++ b/drivers/usb/host/xhci-hub.c | ||
6675 | @@ -761,12 +761,39 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | ||
6676 | break; | ||
6677 | case USB_PORT_FEAT_LINK_STATE: | ||
6678 | temp = xhci_readl(xhci, port_array[wIndex]); | ||
6679 | + | ||
6680 | + /* Disable port */ | ||
6681 | + if (link_state == USB_SS_PORT_LS_SS_DISABLED) { | ||
6682 | + xhci_dbg(xhci, "Disable port %d\n", wIndex); | ||
6683 | + temp = xhci_port_state_to_neutral(temp); | ||
6684 | + /* | ||
6685 | + * Clear all change bits, so that we get a new | ||
6686 | + * connection event. | ||
6687 | + */ | ||
6688 | + temp |= PORT_CSC | PORT_PEC | PORT_WRC | | ||
6689 | + PORT_OCC | PORT_RC | PORT_PLC | | ||
6690 | + PORT_CEC; | ||
6691 | + xhci_writel(xhci, temp | PORT_PE, | ||
6692 | + port_array[wIndex]); | ||
6693 | + temp = xhci_readl(xhci, port_array[wIndex]); | ||
6694 | + break; | ||
6695 | + } | ||
6696 | + | ||
6697 | + /* Put link in RxDetect (enable port) */ | ||
6698 | + if (link_state == USB_SS_PORT_LS_RX_DETECT) { | ||
6699 | + xhci_dbg(xhci, "Enable port %d\n", wIndex); | ||
6700 | + xhci_set_link_state(xhci, port_array, wIndex, | ||
6701 | + link_state); | ||
6702 | + temp = xhci_readl(xhci, port_array[wIndex]); | ||
6703 | + break; | ||
6704 | + } | ||
6705 | + | ||
6706 | /* Software should not attempt to set | ||
6707 | - * port link state above '5' (Rx.Detect) and the port | ||
6708 | + * port link state above '3' (U3) and the port | ||
6709 | * must be enabled. | ||
6710 | */ | ||
6711 | if ((temp & PORT_PE) == 0 || | ||
6712 | - (link_state > USB_SS_PORT_LS_RX_DETECT)) { | ||
6713 | + (link_state > USB_SS_PORT_LS_U3)) { | ||
6714 | xhci_warn(xhci, "Cannot set link state.\n"); | ||
6715 | goto error; | ||
6716 | } | ||
6717 | @@ -957,6 +984,7 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) | ||
6718 | int max_ports; | ||
6719 | __le32 __iomem **port_array; | ||
6720 | struct xhci_bus_state *bus_state; | ||
6721 | + bool reset_change = false; | ||
6722 | |||
6723 | max_ports = xhci_get_ports(hcd, &port_array); | ||
6724 | bus_state = &xhci->bus_state[hcd_index(hcd)]; | ||
6725 | @@ -988,6 +1016,12 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) | ||
6726 | buf[(i + 1) / 8] |= 1 << (i + 1) % 8; | ||
6727 | status = 1; | ||
6728 | } | ||
6729 | + if ((temp & PORT_RC)) | ||
6730 | + reset_change = true; | ||
6731 | + } | ||
6732 | + if (!status && !reset_change) { | ||
6733 | + xhci_dbg(xhci, "%s: stopping port polling.\n", __func__); | ||
6734 | + clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
6735 | } | ||
6736 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
6737 | return status ? retval : 0; | ||
6738 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c | ||
6739 | index fb51c70..35616ff 100644 | ||
6740 | --- a/drivers/usb/host/xhci-mem.c | ||
6741 | +++ b/drivers/usb/host/xhci-mem.c | ||
6742 | @@ -1250,6 +1250,8 @@ static unsigned int xhci_microframes_to_exponent(struct usb_device *udev, | ||
6743 | static unsigned int xhci_parse_microframe_interval(struct usb_device *udev, | ||
6744 | struct usb_host_endpoint *ep) | ||
6745 | { | ||
6746 | + if (ep->desc.bInterval == 0) | ||
6747 | + return 0; | ||
6748 | return xhci_microframes_to_exponent(udev, ep, | ||
6749 | ep->desc.bInterval, 0, 15); | ||
6750 | } | ||
6751 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
6752 | index 1189cf3..e80c49d 100644 | ||
6753 | --- a/drivers/usb/host/xhci-ring.c | ||
6754 | +++ b/drivers/usb/host/xhci-ring.c | ||
6755 | @@ -1725,6 +1725,15 @@ cleanup: | ||
6756 | if (bogus_port_status) | ||
6757 | return; | ||
6758 | |||
6759 | + /* | ||
6760 | + * xHCI port-status-change events occur when the "or" of all the | ||
6761 | + * status-change bits in the portsc register changes from 0 to 1. | ||
6762 | + * New status changes won't cause an event if any other change | ||
6763 | + * bits are still set. When an event occurs, switch over to | ||
6764 | + * polling to avoid losing status changes. | ||
6765 | + */ | ||
6766 | + xhci_dbg(xhci, "%s: starting port polling.\n", __func__); | ||
6767 | + set_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
6768 | spin_unlock(&xhci->lock); | ||
6769 | /* Pass this up to the core */ | ||
6770 | usb_hcd_poll_rh_status(hcd); | ||
6771 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
6772 | index 389829e..c9b886e 100644 | ||
6773 | --- a/drivers/usb/host/xhci.c | ||
6774 | +++ b/drivers/usb/host/xhci.c | ||
6775 | @@ -880,6 +880,11 @@ int xhci_suspend(struct xhci_hcd *xhci) | ||
6776 | struct usb_hcd *hcd = xhci_to_hcd(xhci); | ||
6777 | u32 command; | ||
6778 | |||
6779 | + /* Don't poll the roothubs on bus suspend. */ | ||
6780 | + xhci_dbg(xhci, "%s: stopping port polling.\n", __func__); | ||
6781 | + clear_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
6782 | + del_timer_sync(&hcd->rh_timer); | ||
6783 | + | ||
6784 | spin_lock_irq(&xhci->lock); | ||
6785 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | ||
6786 | clear_bit(HCD_FLAG_HW_ACCESSIBLE, &xhci->shared_hcd->flags); | ||
6787 | @@ -1064,6 +1069,11 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | ||
6788 | if (xhci->quirks & XHCI_COMP_MODE_QUIRK) | ||
6789 | compliance_mode_recovery_timer_init(xhci); | ||
6790 | |||
6791 | + /* Re-enable port polling. */ | ||
6792 | + xhci_dbg(xhci, "%s: starting port polling.\n", __func__); | ||
6793 | + set_bit(HCD_FLAG_POLL_RH, &hcd->flags); | ||
6794 | + usb_hcd_poll_rh_status(hcd); | ||
6795 | + | ||
6796 | return retval; | ||
6797 | } | ||
6798 | #endif /* CONFIG_PM */ | ||
6799 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c | ||
6800 | index bb56a0e..30e8551 100644 | ||
6801 | --- a/drivers/usb/musb/musb_core.c | ||
6802 | +++ b/drivers/usb/musb/musb_core.c | ||
6803 | @@ -2351,10 +2351,7 @@ static int __init musb_init(void) | ||
6804 | if (usb_disabled()) | ||
6805 | return 0; | ||
6806 | |||
6807 | - pr_info("%s: version " MUSB_VERSION ", " | ||
6808 | - "?dma?" | ||
6809 | - ", " | ||
6810 | - "otg (peripheral+host)", | ||
6811 | + pr_info("%s: version " MUSB_VERSION ", ?dma?, otg (peripheral+host)\n", | ||
6812 | musb_driver_name); | ||
6813 | return platform_driver_register(&musb_driver); | ||
6814 | } | ||
6815 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
6816 | index 2641d36..71e80ab 100644 | ||
6817 | --- a/drivers/usb/serial/ftdi_sio.c | ||
6818 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
6819 | @@ -876,6 +876,8 @@ static struct usb_device_id id_table_combined [] = { | ||
6820 | { USB_DEVICE(FTDI_VID, FTDI_DISTORTEC_JTAG_LOCK_PICK_PID), | ||
6821 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | ||
6822 | { USB_DEVICE(FTDI_VID, FTDI_LUMEL_PD12_PID) }, | ||
6823 | + /* Crucible Devices */ | ||
6824 | + { USB_DEVICE(FTDI_VID, FTDI_CT_COMET_PID) }, | ||
6825 | { }, /* Optional parameter entry */ | ||
6826 | { } /* Terminating entry */ | ||
6827 | }; | ||
6828 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h | ||
6829 | index 049b6e7..fa5d560 100644 | ||
6830 | --- a/drivers/usb/serial/ftdi_sio_ids.h | ||
6831 | +++ b/drivers/usb/serial/ftdi_sio_ids.h | ||
6832 | @@ -1259,3 +1259,9 @@ | ||
6833 | * ATI command output: Cinterion MC55i | ||
6834 | */ | ||
6835 | #define FTDI_CINTERION_MC55I_PID 0xA951 | ||
6836 | + | ||
6837 | +/* | ||
6838 | + * Product: Comet Caller ID decoder | ||
6839 | + * Manufacturer: Crucible Technologies | ||
6840 | + */ | ||
6841 | +#define FTDI_CT_COMET_PID 0x8e08 | ||
6842 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
6843 | index da36dc7..fd47369 100644 | ||
6844 | --- a/drivers/usb/serial/option.c | ||
6845 | +++ b/drivers/usb/serial/option.c | ||
6846 | @@ -289,6 +289,7 @@ static void option_instat_callback(struct urb *urb); | ||
6847 | #define ALCATEL_VENDOR_ID 0x1bbb | ||
6848 | #define ALCATEL_PRODUCT_X060S_X200 0x0000 | ||
6849 | #define ALCATEL_PRODUCT_X220_X500D 0x0017 | ||
6850 | +#define ALCATEL_PRODUCT_L100V 0x011e | ||
6851 | |||
6852 | #define PIRELLI_VENDOR_ID 0x1266 | ||
6853 | #define PIRELLI_PRODUCT_C100_1 0x1002 | ||
6854 | @@ -430,9 +431,12 @@ static void option_instat_callback(struct urb *urb); | ||
6855 | #define MEDIATEK_VENDOR_ID 0x0e8d | ||
6856 | #define MEDIATEK_PRODUCT_DC_1COM 0x00a0 | ||
6857 | #define MEDIATEK_PRODUCT_DC_4COM 0x00a5 | ||
6858 | +#define MEDIATEK_PRODUCT_DC_4COM2 0x00a7 | ||
6859 | #define MEDIATEK_PRODUCT_DC_5COM 0x00a4 | ||
6860 | #define MEDIATEK_PRODUCT_7208_1COM 0x7101 | ||
6861 | #define MEDIATEK_PRODUCT_7208_2COM 0x7102 | ||
6862 | +#define MEDIATEK_PRODUCT_7103_2COM 0x7103 | ||
6863 | +#define MEDIATEK_PRODUCT_7106_2COM 0x7106 | ||
6864 | #define MEDIATEK_PRODUCT_FP_1COM 0x0003 | ||
6865 | #define MEDIATEK_PRODUCT_FP_2COM 0x0023 | ||
6866 | #define MEDIATEK_PRODUCT_FPDC_1COM 0x0043 | ||
6867 | @@ -442,6 +446,10 @@ static void option_instat_callback(struct urb *urb); | ||
6868 | #define CELLIENT_VENDOR_ID 0x2692 | ||
6869 | #define CELLIENT_PRODUCT_MEN200 0x9005 | ||
6870 | |||
6871 | +/* Hyundai Petatel Inc. products */ | ||
6872 | +#define PETATEL_VENDOR_ID 0x1ff4 | ||
6873 | +#define PETATEL_PRODUCT_NP10T 0x600e | ||
6874 | + | ||
6875 | /* some devices interfaces need special handling due to a number of reasons */ | ||
6876 | enum option_blacklist_reason { | ||
6877 | OPTION_BLACKLIST_NONE = 0, | ||
6878 | @@ -924,7 +932,8 @@ static const struct usb_device_id option_ids[] = { | ||
6879 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */ | ||
6880 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
6881 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0265, 0xff, 0xff, 0xff) }, | ||
6882 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff) }, | ||
6883 | + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0284, 0xff, 0xff, 0xff), /* ZTE MF880 */ | ||
6884 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
6885 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0317, 0xff, 0xff, 0xff) }, | ||
6886 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), | ||
6887 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
6888 | @@ -1191,6 +1200,8 @@ static const struct usb_device_id option_ids[] = { | ||
6889 | .driver_info = (kernel_ulong_t)&alcatel_x200_blacklist | ||
6890 | }, | ||
6891 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X220_X500D) }, | ||
6892 | + { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L100V), | ||
6893 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
6894 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, | ||
6895 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, | ||
6896 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), | ||
6897 | @@ -1295,7 +1306,12 @@ static const struct usb_device_id option_ids[] = { | ||
6898 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_FP_2COM, 0x0a, 0x00, 0x00) }, | ||
6899 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_FPDC_1COM, 0x0a, 0x00, 0x00) }, | ||
6900 | { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_FPDC_2COM, 0x0a, 0x00, 0x00) }, | ||
6901 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_7103_2COM, 0xff, 0x00, 0x00) }, | ||
6902 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_7106_2COM, 0x02, 0x02, 0x01) }, | ||
6903 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x02, 0x01) }, | ||
6904 | + { USB_DEVICE_AND_INTERFACE_INFO(MEDIATEK_VENDOR_ID, MEDIATEK_PRODUCT_DC_4COM2, 0xff, 0x00, 0x00) }, | ||
6905 | { USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) }, | ||
6906 | + { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T) }, | ||
6907 | { } /* Terminating entry */ | ||
6908 | }; | ||
6909 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
6910 | diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c | ||
6911 | index 49619b4..f2a49ef 100644 | ||
6912 | --- a/drivers/video/mxsfb.c | ||
6913 | +++ b/drivers/video/mxsfb.c | ||
6914 | @@ -369,7 +369,8 @@ static void mxsfb_disable_controller(struct fb_info *fb_info) | ||
6915 | loop--; | ||
6916 | } | ||
6917 | |||
6918 | - writel(VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4 + REG_CLR); | ||
6919 | + reg = readl(host->base + LCDC_VDCTRL4); | ||
6920 | + writel(reg & ~VDCTRL4_SYNC_SIGNALS_ON, host->base + LCDC_VDCTRL4); | ||
6921 | |||
6922 | clk_disable_unprepare(host->clk); | ||
6923 | |||
6924 | diff --git a/fs/buffer.c b/fs/buffer.c | ||
6925 | index ec0aca8..20c0aae 100644 | ||
6926 | --- a/fs/buffer.c | ||
6927 | +++ b/fs/buffer.c | ||
6928 | @@ -2939,6 +2939,7 @@ static void guard_bh_eod(int rw, struct bio *bio, struct buffer_head *bh) | ||
6929 | void *kaddr = kmap_atomic(bh->b_page); | ||
6930 | memset(kaddr + bh_offset(bh) + bytes, 0, bh->b_size - bytes); | ||
6931 | kunmap_atomic(kaddr); | ||
6932 | + flush_dcache_page(bh->b_page); | ||
6933 | } | ||
6934 | } | ||
6935 | |||
6936 | diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c | ||
6937 | index 6690269..d7293d6 100644 | ||
6938 | --- a/fs/ceph/addr.c | ||
6939 | +++ b/fs/ceph/addr.c | ||
6940 | @@ -267,6 +267,14 @@ static void finish_read(struct ceph_osd_request *req, struct ceph_msg *msg) | ||
6941 | kfree(req->r_pages); | ||
6942 | } | ||
6943 | |||
6944 | +static void ceph_unlock_page_vector(struct page **pages, int num_pages) | ||
6945 | +{ | ||
6946 | + int i; | ||
6947 | + | ||
6948 | + for (i = 0; i < num_pages; i++) | ||
6949 | + unlock_page(pages[i]); | ||
6950 | +} | ||
6951 | + | ||
6952 | /* | ||
6953 | * start an async read(ahead) operation. return nr_pages we submitted | ||
6954 | * a read for on success, or negative error code. | ||
6955 | @@ -347,6 +355,7 @@ static int start_read(struct inode *inode, struct list_head *page_list, int max) | ||
6956 | return nr_pages; | ||
6957 | |||
6958 | out_pages: | ||
6959 | + ceph_unlock_page_vector(pages, nr_pages); | ||
6960 | ceph_release_page_vector(pages, nr_pages); | ||
6961 | out: | ||
6962 | ceph_osdc_put_request(req); | ||
6963 | diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c | ||
6964 | index 3251e9c..6be9bf7 100644 | ||
6965 | --- a/fs/ceph/caps.c | ||
6966 | +++ b/fs/ceph/caps.c | ||
6967 | @@ -1349,11 +1349,15 @@ int __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | ||
6968 | if (!ci->i_head_snapc) | ||
6969 | ci->i_head_snapc = ceph_get_snap_context( | ||
6970 | ci->i_snap_realm->cached_context); | ||
6971 | - dout(" inode %p now dirty snapc %p\n", &ci->vfs_inode, | ||
6972 | - ci->i_head_snapc); | ||
6973 | + dout(" inode %p now dirty snapc %p auth cap %p\n", | ||
6974 | + &ci->vfs_inode, ci->i_head_snapc, ci->i_auth_cap); | ||
6975 | BUG_ON(!list_empty(&ci->i_dirty_item)); | ||
6976 | spin_lock(&mdsc->cap_dirty_lock); | ||
6977 | - list_add(&ci->i_dirty_item, &mdsc->cap_dirty); | ||
6978 | + if (ci->i_auth_cap) | ||
6979 | + list_add(&ci->i_dirty_item, &mdsc->cap_dirty); | ||
6980 | + else | ||
6981 | + list_add(&ci->i_dirty_item, | ||
6982 | + &mdsc->cap_dirty_migrating); | ||
6983 | spin_unlock(&mdsc->cap_dirty_lock); | ||
6984 | if (ci->i_flushing_caps == 0) { | ||
6985 | ihold(inode); | ||
6986 | @@ -2388,7 +2392,7 @@ static void handle_cap_grant(struct inode *inode, struct ceph_mds_caps *grant, | ||
6987 | &atime); | ||
6988 | |||
6989 | /* max size increase? */ | ||
6990 | - if (max_size != ci->i_max_size) { | ||
6991 | + if (ci->i_auth_cap == cap && max_size != ci->i_max_size) { | ||
6992 | dout("max_size %lld -> %llu\n", ci->i_max_size, max_size); | ||
6993 | ci->i_max_size = max_size; | ||
6994 | if (max_size >= ci->i_wanted_max_size) { | ||
6995 | @@ -2745,6 +2749,7 @@ static void handle_cap_import(struct ceph_mds_client *mdsc, | ||
6996 | |||
6997 | /* make sure we re-request max_size, if necessary */ | ||
6998 | spin_lock(&ci->i_ceph_lock); | ||
6999 | + ci->i_wanted_max_size = 0; /* reset */ | ||
7000 | ci->i_requested_max_size = 0; | ||
7001 | spin_unlock(&ci->i_ceph_lock); | ||
7002 | } | ||
7003 | @@ -2840,8 +2845,6 @@ void ceph_handle_caps(struct ceph_mds_session *session, | ||
7004 | case CEPH_CAP_OP_IMPORT: | ||
7005 | handle_cap_import(mdsc, inode, h, session, | ||
7006 | snaptrace, snaptrace_len); | ||
7007 | - ceph_check_caps(ceph_inode(inode), 0, session); | ||
7008 | - goto done_unlocked; | ||
7009 | } | ||
7010 | |||
7011 | /* the rest require a cap */ | ||
7012 | @@ -2858,6 +2861,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, | ||
7013 | switch (op) { | ||
7014 | case CEPH_CAP_OP_REVOKE: | ||
7015 | case CEPH_CAP_OP_GRANT: | ||
7016 | + case CEPH_CAP_OP_IMPORT: | ||
7017 | handle_cap_grant(inode, h, session, cap, msg->middle); | ||
7018 | goto done_unlocked; | ||
7019 | |||
7020 | diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c | ||
7021 | index ba95eea..2971eaa 100644 | ||
7022 | --- a/fs/ceph/inode.c | ||
7023 | +++ b/fs/ceph/inode.c | ||
7024 | @@ -1466,7 +1466,7 @@ void __ceph_do_pending_vmtruncate(struct inode *inode) | ||
7025 | { | ||
7026 | struct ceph_inode_info *ci = ceph_inode(inode); | ||
7027 | u64 to; | ||
7028 | - int wrbuffer_refs, wake = 0; | ||
7029 | + int wrbuffer_refs, finish = 0; | ||
7030 | |||
7031 | retry: | ||
7032 | spin_lock(&ci->i_ceph_lock); | ||
7033 | @@ -1498,15 +1498,18 @@ retry: | ||
7034 | truncate_inode_pages(inode->i_mapping, to); | ||
7035 | |||
7036 | spin_lock(&ci->i_ceph_lock); | ||
7037 | - ci->i_truncate_pending--; | ||
7038 | - if (ci->i_truncate_pending == 0) | ||
7039 | - wake = 1; | ||
7040 | + if (to == ci->i_truncate_size) { | ||
7041 | + ci->i_truncate_pending = 0; | ||
7042 | + finish = 1; | ||
7043 | + } | ||
7044 | spin_unlock(&ci->i_ceph_lock); | ||
7045 | + if (!finish) | ||
7046 | + goto retry; | ||
7047 | |||
7048 | if (wrbuffer_refs == 0) | ||
7049 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); | ||
7050 | - if (wake) | ||
7051 | - wake_up_all(&ci->i_cap_wq); | ||
7052 | + | ||
7053 | + wake_up_all(&ci->i_cap_wq); | ||
7054 | } | ||
7055 | |||
7056 | |||
7057 | diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c | ||
7058 | index 1bcf712..0d9864f 100644 | ||
7059 | --- a/fs/ceph/mds_client.c | ||
7060 | +++ b/fs/ceph/mds_client.c | ||
7061 | @@ -1876,9 +1876,14 @@ finish: | ||
7062 | static void __wake_requests(struct ceph_mds_client *mdsc, | ||
7063 | struct list_head *head) | ||
7064 | { | ||
7065 | - struct ceph_mds_request *req, *nreq; | ||
7066 | + struct ceph_mds_request *req; | ||
7067 | + LIST_HEAD(tmp_list); | ||
7068 | + | ||
7069 | + list_splice_init(head, &tmp_list); | ||
7070 | |||
7071 | - list_for_each_entry_safe(req, nreq, head, r_wait) { | ||
7072 | + while (!list_empty(&tmp_list)) { | ||
7073 | + req = list_entry(tmp_list.next, | ||
7074 | + struct ceph_mds_request, r_wait); | ||
7075 | list_del_init(&req->r_wait); | ||
7076 | __do_request(mdsc, req); | ||
7077 | } | ||
7078 | diff --git a/fs/ceph/super.c b/fs/ceph/super.c | ||
7079 | index 2eb43f2..e079899 100644 | ||
7080 | --- a/fs/ceph/super.c | ||
7081 | +++ b/fs/ceph/super.c | ||
7082 | @@ -403,8 +403,6 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root) | ||
7083 | seq_printf(m, ",mount_timeout=%d", opt->mount_timeout); | ||
7084 | if (opt->osd_idle_ttl != CEPH_OSD_IDLE_TTL_DEFAULT) | ||
7085 | seq_printf(m, ",osd_idle_ttl=%d", opt->osd_idle_ttl); | ||
7086 | - if (opt->osd_timeout != CEPH_OSD_TIMEOUT_DEFAULT) | ||
7087 | - seq_printf(m, ",osdtimeout=%d", opt->osd_timeout); | ||
7088 | if (opt->osd_keepalive_timeout != CEPH_OSD_KEEPALIVE_DEFAULT) | ||
7089 | seq_printf(m, ",osdkeepalivetimeout=%d", | ||
7090 | opt->osd_keepalive_timeout); | ||
7091 | diff --git a/fs/eventpoll.c b/fs/eventpoll.c | ||
7092 | index cd96649..39573ee 100644 | ||
7093 | --- a/fs/eventpoll.c | ||
7094 | +++ b/fs/eventpoll.c | ||
7095 | @@ -1285,7 +1285,7 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_even | ||
7096 | * otherwise we might miss an event that happens between the | ||
7097 | * f_op->poll() call and the new event set registering. | ||
7098 | */ | ||
7099 | - epi->event.events = event->events; | ||
7100 | + epi->event.events = event->events; /* need barrier below */ | ||
7101 | pt._key = event->events; | ||
7102 | epi->event.data = event->data; /* protected by mtx */ | ||
7103 | if (epi->event.events & EPOLLWAKEUP) { | ||
7104 | @@ -1296,6 +1296,26 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_even | ||
7105 | } | ||
7106 | |||
7107 | /* | ||
7108 | + * The following barrier has two effects: | ||
7109 | + * | ||
7110 | + * 1) Flush epi changes above to other CPUs. This ensures | ||
7111 | + * we do not miss events from ep_poll_callback if an | ||
7112 | + * event occurs immediately after we call f_op->poll(). | ||
7113 | + * We need this because we did not take ep->lock while | ||
7114 | + * changing epi above (but ep_poll_callback does take | ||
7115 | + * ep->lock). | ||
7116 | + * | ||
7117 | + * 2) We also need to ensure we do not miss _past_ events | ||
7118 | + * when calling f_op->poll(). This barrier also | ||
7119 | + * pairs with the barrier in wq_has_sleeper (see | ||
7120 | + * comments for wq_has_sleeper). | ||
7121 | + * | ||
7122 | + * This barrier will now guarantee ep_poll_callback or f_op->poll | ||
7123 | + * (or both) will notice the readiness of an item. | ||
7124 | + */ | ||
7125 | + smp_mb(); | ||
7126 | + | ||
7127 | + /* | ||
7128 | * Get current event bits. We can safely use the file* here because | ||
7129 | * its usage count has been increased by the caller of this function. | ||
7130 | */ | ||
7131 | diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c | ||
7132 | index d3c5b88..e6e0d98 100644 | ||
7133 | --- a/fs/ext4/acl.c | ||
7134 | +++ b/fs/ext4/acl.c | ||
7135 | @@ -423,8 +423,10 @@ ext4_xattr_set_acl(struct dentry *dentry, const char *name, const void *value, | ||
7136 | |||
7137 | retry: | ||
7138 | handle = ext4_journal_start(inode, EXT4_DATA_TRANS_BLOCKS(inode->i_sb)); | ||
7139 | - if (IS_ERR(handle)) | ||
7140 | - return PTR_ERR(handle); | ||
7141 | + if (IS_ERR(handle)) { | ||
7142 | + error = PTR_ERR(handle); | ||
7143 | + goto release_and_out; | ||
7144 | + } | ||
7145 | error = ext4_set_acl(handle, inode, type, acl); | ||
7146 | ext4_journal_stop(handle); | ||
7147 | if (error == -ENOSPC && ext4_should_retry_alloc(inode->i_sb, &retries)) | ||
7148 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
7149 | index 7011ac9..19bb769 100644 | ||
7150 | --- a/fs/ext4/extents.c | ||
7151 | +++ b/fs/ext4/extents.c | ||
7152 | @@ -2190,13 +2190,14 @@ errout: | ||
7153 | * removes index from the index block. | ||
7154 | */ | ||
7155 | static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode, | ||
7156 | - struct ext4_ext_path *path) | ||
7157 | + struct ext4_ext_path *path, int depth) | ||
7158 | { | ||
7159 | int err; | ||
7160 | ext4_fsblk_t leaf; | ||
7161 | |||
7162 | /* free index block */ | ||
7163 | - path--; | ||
7164 | + depth--; | ||
7165 | + path = path + depth; | ||
7166 | leaf = ext4_idx_pblock(path->p_idx); | ||
7167 | if (unlikely(path->p_hdr->eh_entries == 0)) { | ||
7168 | EXT4_ERROR_INODE(inode, "path->p_hdr->eh_entries == 0"); | ||
7169 | @@ -2221,6 +2222,19 @@ static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode, | ||
7170 | |||
7171 | ext4_free_blocks(handle, inode, NULL, leaf, 1, | ||
7172 | EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET); | ||
7173 | + | ||
7174 | + while (--depth >= 0) { | ||
7175 | + if (path->p_idx != EXT_FIRST_INDEX(path->p_hdr)) | ||
7176 | + break; | ||
7177 | + path--; | ||
7178 | + err = ext4_ext_get_access(handle, inode, path); | ||
7179 | + if (err) | ||
7180 | + break; | ||
7181 | + path->p_idx->ei_block = (path+1)->p_idx->ei_block; | ||
7182 | + err = ext4_ext_dirty(handle, inode, path); | ||
7183 | + if (err) | ||
7184 | + break; | ||
7185 | + } | ||
7186 | return err; | ||
7187 | } | ||
7188 | |||
7189 | @@ -2557,7 +2571,7 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode, | ||
7190 | /* if this leaf is free, then we should | ||
7191 | * remove it from index block above */ | ||
7192 | if (err == 0 && eh->eh_entries == 0 && path[depth].p_bh != NULL) | ||
7193 | - err = ext4_ext_rm_idx(handle, inode, path + depth); | ||
7194 | + err = ext4_ext_rm_idx(handle, inode, path, depth); | ||
7195 | |||
7196 | out: | ||
7197 | return err; | ||
7198 | @@ -2760,7 +2774,7 @@ again: | ||
7199 | /* index is empty, remove it; | ||
7200 | * handle must be already prepared by the | ||
7201 | * truncatei_leaf() */ | ||
7202 | - err = ext4_ext_rm_idx(handle, inode, path + i); | ||
7203 | + err = ext4_ext_rm_idx(handle, inode, path, i); | ||
7204 | } | ||
7205 | /* root level has p_bh == NULL, brelse() eats this */ | ||
7206 | brelse(path[i].p_bh); | ||
7207 | diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c | ||
7208 | index 3a100e7..c7efa88 100644 | ||
7209 | --- a/fs/ext4/ialloc.c | ||
7210 | +++ b/fs/ext4/ialloc.c | ||
7211 | @@ -762,7 +762,6 @@ got: | ||
7212 | |||
7213 | BUFFER_TRACE(block_bitmap_bh, "dirty block bitmap"); | ||
7214 | err = ext4_handle_dirty_metadata(handle, NULL, block_bitmap_bh); | ||
7215 | - brelse(block_bitmap_bh); | ||
7216 | |||
7217 | /* recheck and clear flag under lock if we still need to */ | ||
7218 | ext4_lock_group(sb, group); | ||
7219 | @@ -775,6 +774,7 @@ got: | ||
7220 | ext4_group_desc_csum_set(sb, group, gdp); | ||
7221 | } | ||
7222 | ext4_unlock_group(sb, group); | ||
7223 | + brelse(block_bitmap_bh); | ||
7224 | |||
7225 | if (err) | ||
7226 | goto fail; | ||
7227 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
7228 | index 6d600a6..8fa23b4 100644 | ||
7229 | --- a/fs/ext4/namei.c | ||
7230 | +++ b/fs/ext4/namei.c | ||
7231 | @@ -725,7 +725,7 @@ dx_probe(const struct qstr *d_name, struct inode *dir, | ||
7232 | ext4_warning(dir->i_sb, "Node failed checksum"); | ||
7233 | brelse(bh); | ||
7234 | *err = ERR_BAD_DX_DIR; | ||
7235 | - goto fail; | ||
7236 | + goto fail2; | ||
7237 | } | ||
7238 | set_buffer_verified(bh); | ||
7239 | |||
7240 | @@ -2498,7 +2498,8 @@ int ext4_orphan_del(handle_t *handle, struct inode *inode) | ||
7241 | struct ext4_iloc iloc; | ||
7242 | int err = 0; | ||
7243 | |||
7244 | - if (!EXT4_SB(inode->i_sb)->s_journal) | ||
7245 | + if ((!EXT4_SB(inode->i_sb)->s_journal) && | ||
7246 | + !(EXT4_SB(inode->i_sb)->s_mount_state & EXT4_ORPHAN_FS)) | ||
7247 | return 0; | ||
7248 | |||
7249 | mutex_lock(&EXT4_SB(inode->i_sb)->s_orphan_lock); | ||
7250 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
7251 | index 80928f7..d59b351 100644 | ||
7252 | --- a/fs/ext4/super.c | ||
7253 | +++ b/fs/ext4/super.c | ||
7254 | @@ -1650,9 +1650,7 @@ static int parse_options(char *options, struct super_block *sb, | ||
7255 | unsigned int *journal_ioprio, | ||
7256 | int is_remount) | ||
7257 | { | ||
7258 | -#ifdef CONFIG_QUOTA | ||
7259 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
7260 | -#endif | ||
7261 | char *p; | ||
7262 | substring_t args[MAX_OPT_ARGS]; | ||
7263 | int token; | ||
7264 | @@ -1701,6 +1699,16 @@ static int parse_options(char *options, struct super_block *sb, | ||
7265 | } | ||
7266 | } | ||
7267 | #endif | ||
7268 | + if (test_opt(sb, DIOREAD_NOLOCK)) { | ||
7269 | + int blocksize = | ||
7270 | + BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size); | ||
7271 | + | ||
7272 | + if (blocksize < PAGE_CACHE_SIZE) { | ||
7273 | + ext4_msg(sb, KERN_ERR, "can't mount with " | ||
7274 | + "dioread_nolock if block size != PAGE_SIZE"); | ||
7275 | + return 0; | ||
7276 | + } | ||
7277 | + } | ||
7278 | return 1; | ||
7279 | } | ||
7280 | |||
7281 | @@ -2217,7 +2225,9 @@ static void ext4_orphan_cleanup(struct super_block *sb, | ||
7282 | __func__, inode->i_ino, inode->i_size); | ||
7283 | jbd_debug(2, "truncating inode %lu to %lld bytes\n", | ||
7284 | inode->i_ino, inode->i_size); | ||
7285 | + mutex_lock(&inode->i_mutex); | ||
7286 | ext4_truncate(inode); | ||
7287 | + mutex_unlock(&inode->i_mutex); | ||
7288 | nr_truncates++; | ||
7289 | } else { | ||
7290 | ext4_msg(sb, KERN_DEBUG, | ||
7291 | @@ -3446,15 +3456,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
7292 | clear_opt(sb, DELALLOC); | ||
7293 | } | ||
7294 | |||
7295 | - blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); | ||
7296 | - if (test_opt(sb, DIOREAD_NOLOCK)) { | ||
7297 | - if (blocksize < PAGE_SIZE) { | ||
7298 | - ext4_msg(sb, KERN_ERR, "can't mount with " | ||
7299 | - "dioread_nolock if block size != PAGE_SIZE"); | ||
7300 | - goto failed_mount; | ||
7301 | - } | ||
7302 | - } | ||
7303 | - | ||
7304 | sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | | ||
7305 | (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); | ||
7306 | |||
7307 | @@ -3496,6 +3497,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
7308 | if (!ext4_feature_set_ok(sb, (sb->s_flags & MS_RDONLY))) | ||
7309 | goto failed_mount; | ||
7310 | |||
7311 | + blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); | ||
7312 | if (blocksize < EXT4_MIN_BLOCK_SIZE || | ||
7313 | blocksize > EXT4_MAX_BLOCK_SIZE) { | ||
7314 | ext4_msg(sb, KERN_ERR, | ||
7315 | @@ -4729,7 +4731,7 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | ||
7316 | } | ||
7317 | |||
7318 | ext4_setup_system_zone(sb); | ||
7319 | - if (sbi->s_journal == NULL) | ||
7320 | + if (sbi->s_journal == NULL && !(old_sb_flags & MS_RDONLY)) | ||
7321 | ext4_commit_super(sb, 1); | ||
7322 | |||
7323 | #ifdef CONFIG_QUOTA | ||
7324 | diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c | ||
7325 | index a74ba46..6873d24 100644 | ||
7326 | --- a/fs/jbd2/transaction.c | ||
7327 | +++ b/fs/jbd2/transaction.c | ||
7328 | @@ -209,7 +209,8 @@ repeat: | ||
7329 | if (!new_transaction) | ||
7330 | goto alloc_transaction; | ||
7331 | write_lock(&journal->j_state_lock); | ||
7332 | - if (!journal->j_running_transaction) { | ||
7333 | + if (!journal->j_running_transaction && | ||
7334 | + !journal->j_barrier_count) { | ||
7335 | jbd2_get_transaction(journal, new_transaction); | ||
7336 | new_transaction = NULL; | ||
7337 | } | ||
7338 | diff --git a/fs/jffs2/nodemgmt.c b/fs/jffs2/nodemgmt.c | ||
7339 | index 0c96eb5..0331072 100644 | ||
7340 | --- a/fs/jffs2/nodemgmt.c | ||
7341 | +++ b/fs/jffs2/nodemgmt.c | ||
7342 | @@ -417,14 +417,16 @@ static int jffs2_do_reserve_space(struct jffs2_sb_info *c, uint32_t minsize, | ||
7343 | spin_unlock(&c->erase_completion_lock); | ||
7344 | |||
7345 | ret = jffs2_prealloc_raw_node_refs(c, jeb, 1); | ||
7346 | - if (ret) | ||
7347 | - return ret; | ||
7348 | + | ||
7349 | /* Just lock it again and continue. Nothing much can change because | ||
7350 | we hold c->alloc_sem anyway. In fact, it's not entirely clear why | ||
7351 | we hold c->erase_completion_lock in the majority of this function... | ||
7352 | but that's a question for another (more caffeine-rich) day. */ | ||
7353 | spin_lock(&c->erase_completion_lock); | ||
7354 | |||
7355 | + if (ret) | ||
7356 | + return ret; | ||
7357 | + | ||
7358 | waste = jeb->free_size; | ||
7359 | jffs2_link_node_ref(c, jeb, | ||
7360 | (jeb->offset + c->sector_size - waste) | REF_OBSOLETE, | ||
7361 | diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c | ||
7362 | index 1a4f6da..bdd840d 100644 | ||
7363 | --- a/fs/pstore/ram.c | ||
7364 | +++ b/fs/pstore/ram.c | ||
7365 | @@ -374,10 +374,14 @@ static int __devinit ramoops_probe(struct platform_device *pdev) | ||
7366 | goto fail_out; | ||
7367 | } | ||
7368 | |||
7369 | - pdata->mem_size = rounddown_pow_of_two(pdata->mem_size); | ||
7370 | - pdata->record_size = rounddown_pow_of_two(pdata->record_size); | ||
7371 | - pdata->console_size = rounddown_pow_of_two(pdata->console_size); | ||
7372 | - pdata->ftrace_size = rounddown_pow_of_two(pdata->ftrace_size); | ||
7373 | + if (!is_power_of_2(pdata->mem_size)) | ||
7374 | + pdata->mem_size = rounddown_pow_of_two(pdata->mem_size); | ||
7375 | + if (!is_power_of_2(pdata->record_size)) | ||
7376 | + pdata->record_size = rounddown_pow_of_two(pdata->record_size); | ||
7377 | + if (!is_power_of_2(pdata->console_size)) | ||
7378 | + pdata->console_size = rounddown_pow_of_two(pdata->console_size); | ||
7379 | + if (!is_power_of_2(pdata->ftrace_size)) | ||
7380 | + pdata->ftrace_size = rounddown_pow_of_two(pdata->ftrace_size); | ||
7381 | |||
7382 | cxt->dump_read_cnt = 0; | ||
7383 | cxt->size = pdata->mem_size; | ||
7384 | diff --git a/fs/udf/inode.c b/fs/udf/inode.c | ||
7385 | index df88b95..8266f2e 100644 | ||
7386 | --- a/fs/udf/inode.c | ||
7387 | +++ b/fs/udf/inode.c | ||
7388 | @@ -601,6 +601,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | ||
7389 | struct udf_inode_info *iinfo = UDF_I(inode); | ||
7390 | int goal = 0, pgoal = iinfo->i_location.logicalBlockNum; | ||
7391 | int lastblock = 0; | ||
7392 | + bool isBeyondEOF; | ||
7393 | |||
7394 | *err = 0; | ||
7395 | *new = 0; | ||
7396 | @@ -680,7 +681,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | ||
7397 | /* Are we beyond EOF? */ | ||
7398 | if (etype == -1) { | ||
7399 | int ret; | ||
7400 | - | ||
7401 | + isBeyondEOF = 1; | ||
7402 | if (count) { | ||
7403 | if (c) | ||
7404 | laarr[0] = laarr[1]; | ||
7405 | @@ -723,6 +724,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | ||
7406 | endnum = c + 1; | ||
7407 | lastblock = 1; | ||
7408 | } else { | ||
7409 | + isBeyondEOF = 0; | ||
7410 | endnum = startnum = ((count > 2) ? 2 : count); | ||
7411 | |||
7412 | /* if the current extent is in position 0, | ||
7413 | @@ -765,10 +767,13 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | ||
7414 | goal, err); | ||
7415 | if (!newblocknum) { | ||
7416 | brelse(prev_epos.bh); | ||
7417 | + brelse(cur_epos.bh); | ||
7418 | + brelse(next_epos.bh); | ||
7419 | *err = -ENOSPC; | ||
7420 | return 0; | ||
7421 | } | ||
7422 | - iinfo->i_lenExtents += inode->i_sb->s_blocksize; | ||
7423 | + if (isBeyondEOF) | ||
7424 | + iinfo->i_lenExtents += inode->i_sb->s_blocksize; | ||
7425 | } | ||
7426 | |||
7427 | /* if the extent the requsted block is located in contains multiple | ||
7428 | @@ -795,6 +800,8 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, | ||
7429 | udf_update_extents(inode, laarr, startnum, endnum, &prev_epos); | ||
7430 | |||
7431 | brelse(prev_epos.bh); | ||
7432 | + brelse(cur_epos.bh); | ||
7433 | + brelse(next_epos.bh); | ||
7434 | |||
7435 | newblock = udf_get_pblock(inode->i_sb, newblocknum, | ||
7436 | iinfo->i_location.partitionReferenceNum, 0); | ||
7437 | diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h | ||
7438 | index 06d7f79..a1b66b7 100644 | ||
7439 | --- a/include/drm/drm_mm.h | ||
7440 | +++ b/include/drm/drm_mm.h | ||
7441 | @@ -70,7 +70,7 @@ struct drm_mm { | ||
7442 | unsigned long scan_color; | ||
7443 | unsigned long scan_size; | ||
7444 | unsigned long scan_hit_start; | ||
7445 | - unsigned scan_hit_size; | ||
7446 | + unsigned long scan_hit_end; | ||
7447 | unsigned scanned_blocks; | ||
7448 | unsigned long scan_start; | ||
7449 | unsigned long scan_end; | ||
7450 | diff --git a/include/linux/audit.h b/include/linux/audit.h | ||
7451 | index bce729a..9d5104d 100644 | ||
7452 | --- a/include/linux/audit.h | ||
7453 | +++ b/include/linux/audit.h | ||
7454 | @@ -157,7 +157,8 @@ void audit_core_dumps(long signr); | ||
7455 | |||
7456 | static inline void audit_seccomp(unsigned long syscall, long signr, int code) | ||
7457 | { | ||
7458 | - if (unlikely(!audit_dummy_context())) | ||
7459 | + /* Force a record to be reported if a signal was delivered. */ | ||
7460 | + if (signr || unlikely(!audit_dummy_context())) | ||
7461 | __audit_seccomp(syscall, signr, code); | ||
7462 | } | ||
7463 | |||
7464 | diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h | ||
7465 | index 6470792..084d3c6 100644 | ||
7466 | --- a/include/linux/ceph/libceph.h | ||
7467 | +++ b/include/linux/ceph/libceph.h | ||
7468 | @@ -43,7 +43,6 @@ struct ceph_options { | ||
7469 | struct ceph_entity_addr my_addr; | ||
7470 | int mount_timeout; | ||
7471 | int osd_idle_ttl; | ||
7472 | - int osd_timeout; | ||
7473 | int osd_keepalive_timeout; | ||
7474 | |||
7475 | /* | ||
7476 | @@ -63,7 +62,6 @@ struct ceph_options { | ||
7477 | * defaults | ||
7478 | */ | ||
7479 | #define CEPH_MOUNT_TIMEOUT_DEFAULT 60 | ||
7480 | -#define CEPH_OSD_TIMEOUT_DEFAULT 60 /* seconds */ | ||
7481 | #define CEPH_OSD_KEEPALIVE_DEFAULT 5 | ||
7482 | #define CEPH_OSD_IDLE_TTL_DEFAULT 60 | ||
7483 | |||
7484 | diff --git a/include/linux/compaction.h b/include/linux/compaction.h | ||
7485 | index 6ecb6dc..cc7bdde 100644 | ||
7486 | --- a/include/linux/compaction.h | ||
7487 | +++ b/include/linux/compaction.h | ||
7488 | @@ -22,7 +22,7 @@ extern int sysctl_extfrag_handler(struct ctl_table *table, int write, | ||
7489 | extern int fragmentation_index(struct zone *zone, unsigned int order); | ||
7490 | extern unsigned long try_to_compact_pages(struct zonelist *zonelist, | ||
7491 | int order, gfp_t gfp_mask, nodemask_t *mask, | ||
7492 | - bool sync, bool *contended, struct page **page); | ||
7493 | + bool sync, bool *contended); | ||
7494 | extern int compact_pgdat(pg_data_t *pgdat, int order); | ||
7495 | extern void reset_isolation_suitable(pg_data_t *pgdat); | ||
7496 | extern unsigned long compaction_suitable(struct zone *zone, int order); | ||
7497 | @@ -75,7 +75,7 @@ static inline bool compaction_restarting(struct zone *zone, int order) | ||
7498 | #else | ||
7499 | static inline unsigned long try_to_compact_pages(struct zonelist *zonelist, | ||
7500 | int order, gfp_t gfp_mask, nodemask_t *nodemask, | ||
7501 | - bool sync, bool *contended, struct page **page) | ||
7502 | + bool sync, bool *contended) | ||
7503 | { | ||
7504 | return COMPACT_CONTINUE; | ||
7505 | } | ||
7506 | diff --git a/include/linux/mfd/da9055/core.h b/include/linux/mfd/da9055/core.h | ||
7507 | index c96ad68..956afa4 100644 | ||
7508 | --- a/include/linux/mfd/da9055/core.h | ||
7509 | +++ b/include/linux/mfd/da9055/core.h | ||
7510 | @@ -1,4 +1,4 @@ | ||
7511 | -/* | ||
7512 | +/* | ||
7513 | * da9055 declarations for DA9055 PMICs. | ||
7514 | * | ||
7515 | * Copyright(c) 2012 Dialog Semiconductor Ltd. | ||
7516 | diff --git a/include/linux/mfd/da9055/pdata.h b/include/linux/mfd/da9055/pdata.h | ||
7517 | index 147293b..b9b204e 100644 | ||
7518 | --- a/include/linux/mfd/da9055/pdata.h | ||
7519 | +++ b/include/linux/mfd/da9055/pdata.h | ||
7520 | @@ -1,4 +1,4 @@ | ||
7521 | -/* Copyright (C) 2012 Dialog Semiconductor Ltd. | ||
7522 | +/* Copyright (C) 2012 Dialog Semiconductor Ltd. | ||
7523 | * | ||
7524 | * This program is free software; you can redistribute it and/or modify | ||
7525 | * it under the terms of the GNU General Public License as published by | ||
7526 | diff --git a/include/linux/mfd/da9055/reg.h b/include/linux/mfd/da9055/reg.h | ||
7527 | index df237ee..2b592e0 100644 | ||
7528 | --- a/include/linux/mfd/da9055/reg.h | ||
7529 | +++ b/include/linux/mfd/da9055/reg.h | ||
7530 | @@ -1,4 +1,4 @@ | ||
7531 | -/* | ||
7532 | +/* | ||
7533 | * DA9055 declarations for DA9055 PMICs. | ||
7534 | * | ||
7535 | * Copyright(c) 2012 Dialog Semiconductor Ltd. | ||
7536 | diff --git a/include/linux/mm.h b/include/linux/mm.h | ||
7537 | index bcaab4e..280dae5 100644 | ||
7538 | --- a/include/linux/mm.h | ||
7539 | +++ b/include/linux/mm.h | ||
7540 | @@ -455,7 +455,6 @@ void put_pages_list(struct list_head *pages); | ||
7541 | |||
7542 | void split_page(struct page *page, unsigned int order); | ||
7543 | int split_free_page(struct page *page); | ||
7544 | -int capture_free_page(struct page *page, int alloc_order, int migratetype); | ||
7545 | |||
7546 | /* | ||
7547 | * Compound pages have a destructor function. Provide a | ||
7548 | diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h | ||
7549 | index f792794..5dc9ee4 100644 | ||
7550 | --- a/include/linux/sunrpc/cache.h | ||
7551 | +++ b/include/linux/sunrpc/cache.h | ||
7552 | @@ -217,6 +217,8 @@ extern int qword_get(char **bpp, char *dest, int bufsize); | ||
7553 | static inline int get_int(char **bpp, int *anint) | ||
7554 | { | ||
7555 | char buf[50]; | ||
7556 | + char *ep; | ||
7557 | + int rv; | ||
7558 | int len = qword_get(bpp, buf, sizeof(buf)); | ||
7559 | |||
7560 | if (len < 0) | ||
7561 | @@ -224,9 +226,11 @@ static inline int get_int(char **bpp, int *anint) | ||
7562 | if (len == 0) | ||
7563 | return -ENOENT; | ||
7564 | |||
7565 | - if (kstrtoint(buf, 0, anint)) | ||
7566 | + rv = simple_strtol(buf, &ep, 0); | ||
7567 | + if (*ep) | ||
7568 | return -EINVAL; | ||
7569 | |||
7570 | + *anint = rv; | ||
7571 | return 0; | ||
7572 | } | ||
7573 | |||
7574 | diff --git a/include/net/mac80211.h b/include/net/mac80211.h | ||
7575 | index 82558c8..d481cc6 100644 | ||
7576 | --- a/include/net/mac80211.h | ||
7577 | +++ b/include/net/mac80211.h | ||
7578 | @@ -1253,6 +1253,10 @@ struct ieee80211_tx_control { | ||
7579 | * @IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF: Use the P2P Device address for any | ||
7580 | * P2P Interface. This will be honoured even if more than one interface | ||
7581 | * is supported. | ||
7582 | + * | ||
7583 | + * @IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL: On this hardware TX BA session | ||
7584 | + * should be tear down once BAR frame will not be acked. | ||
7585 | + * | ||
7586 | */ | ||
7587 | enum ieee80211_hw_flags { | ||
7588 | IEEE80211_HW_HAS_RATE_CONTROL = 1<<0, | ||
7589 | @@ -1281,6 +1285,7 @@ enum ieee80211_hw_flags { | ||
7590 | IEEE80211_HW_TX_AMPDU_SETUP_IN_HW = 1<<23, | ||
7591 | IEEE80211_HW_SCAN_WHILE_IDLE = 1<<24, | ||
7592 | IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF = 1<<25, | ||
7593 | + IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL = 1<<26, | ||
7594 | }; | ||
7595 | |||
7596 | /** | ||
7597 | diff --git a/include/uapi/linux/audit.h b/include/uapi/linux/audit.h | ||
7598 | index 76352ac..09a2d94 100644 | ||
7599 | --- a/include/uapi/linux/audit.h | ||
7600 | +++ b/include/uapi/linux/audit.h | ||
7601 | @@ -106,6 +106,7 @@ | ||
7602 | #define AUDIT_MMAP 1323 /* Record showing descriptor and flags in mmap */ | ||
7603 | #define AUDIT_NETFILTER_PKT 1324 /* Packets traversing netfilter chains */ | ||
7604 | #define AUDIT_NETFILTER_CFG 1325 /* Netfilter chain modifications */ | ||
7605 | +#define AUDIT_SECCOMP 1326 /* Secure Computing event */ | ||
7606 | |||
7607 | #define AUDIT_AVC 1400 /* SE Linux avc denial or grant */ | ||
7608 | #define AUDIT_SELINUX_ERR 1401 /* Internal SE Linux Errors */ | ||
7609 | diff --git a/include/video/omap-panel-tfp410.h b/include/video/omap-panel-tfp410.h | ||
7610 | index 68c31d7..aef35e4 100644 | ||
7611 | --- a/include/video/omap-panel-tfp410.h | ||
7612 | +++ b/include/video/omap-panel-tfp410.h | ||
7613 | @@ -28,7 +28,7 @@ struct omap_dss_device; | ||
7614 | * @power_down_gpio: gpio number for PD pin (or -1 if not available) | ||
7615 | */ | ||
7616 | struct tfp410_platform_data { | ||
7617 | - u16 i2c_bus_num; | ||
7618 | + int i2c_bus_num; | ||
7619 | int power_down_gpio; | ||
7620 | }; | ||
7621 | |||
7622 | diff --git a/kernel/auditsc.c b/kernel/auditsc.c | ||
7623 | index 2f186ed..157e989 100644 | ||
7624 | --- a/kernel/auditsc.c | ||
7625 | +++ b/kernel/auditsc.c | ||
7626 | @@ -2735,7 +2735,7 @@ void __audit_mmap_fd(int fd, int flags) | ||
7627 | context->type = AUDIT_MMAP; | ||
7628 | } | ||
7629 | |||
7630 | -static void audit_log_abend(struct audit_buffer *ab, char *reason, long signr) | ||
7631 | +static void audit_log_task(struct audit_buffer *ab) | ||
7632 | { | ||
7633 | kuid_t auid, uid; | ||
7634 | kgid_t gid; | ||
7635 | @@ -2753,6 +2753,11 @@ static void audit_log_abend(struct audit_buffer *ab, char *reason, long signr) | ||
7636 | audit_log_task_context(ab); | ||
7637 | audit_log_format(ab, " pid=%d comm=", current->pid); | ||
7638 | audit_log_untrustedstring(ab, current->comm); | ||
7639 | +} | ||
7640 | + | ||
7641 | +static void audit_log_abend(struct audit_buffer *ab, char *reason, long signr) | ||
7642 | +{ | ||
7643 | + audit_log_task(ab); | ||
7644 | audit_log_format(ab, " reason="); | ||
7645 | audit_log_string(ab, reason); | ||
7646 | audit_log_format(ab, " sig=%ld", signr); | ||
7647 | @@ -2783,8 +2788,11 @@ void __audit_seccomp(unsigned long syscall, long signr, int code) | ||
7648 | { | ||
7649 | struct audit_buffer *ab; | ||
7650 | |||
7651 | - ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_ANOM_ABEND); | ||
7652 | - audit_log_abend(ab, "seccomp", signr); | ||
7653 | + ab = audit_log_start(NULL, GFP_KERNEL, AUDIT_SECCOMP); | ||
7654 | + if (unlikely(!ab)) | ||
7655 | + return; | ||
7656 | + audit_log_task(ab); | ||
7657 | + audit_log_format(ab, " sig=%ld", signr); | ||
7658 | audit_log_format(ab, " syscall=%ld", syscall); | ||
7659 | audit_log_format(ab, " compat=%d", is_compat_task()); | ||
7660 | audit_log_format(ab, " ip=0x%lx", KSTK_EIP(current)); | ||
7661 | diff --git a/kernel/watchdog.c b/kernel/watchdog.c | ||
7662 | index c8c21be..762081c 100644 | ||
7663 | --- a/kernel/watchdog.c | ||
7664 | +++ b/kernel/watchdog.c | ||
7665 | @@ -343,6 +343,10 @@ static void watchdog_enable(unsigned int cpu) | ||
7666 | { | ||
7667 | struct hrtimer *hrtimer = &__raw_get_cpu_var(watchdog_hrtimer); | ||
7668 | |||
7669 | + /* kick off the timer for the hardlockup detector */ | ||
7670 | + hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | ||
7671 | + hrtimer->function = watchdog_timer_fn; | ||
7672 | + | ||
7673 | if (!watchdog_enabled) { | ||
7674 | kthread_park(current); | ||
7675 | return; | ||
7676 | @@ -351,10 +355,6 @@ static void watchdog_enable(unsigned int cpu) | ||
7677 | /* Enable the perf event */ | ||
7678 | watchdog_nmi_enable(cpu); | ||
7679 | |||
7680 | - /* kick off the timer for the hardlockup detector */ | ||
7681 | - hrtimer_init(hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | ||
7682 | - hrtimer->function = watchdog_timer_fn; | ||
7683 | - | ||
7684 | /* done here because hrtimer_start can only pin to smp_processor_id() */ | ||
7685 | hrtimer_start(hrtimer, ns_to_ktime(get_sample_period()), | ||
7686 | HRTIMER_MODE_REL_PINNED); | ||
7687 | @@ -368,9 +368,6 @@ static void watchdog_disable(unsigned int cpu) | ||
7688 | { | ||
7689 | struct hrtimer *hrtimer = &__raw_get_cpu_var(watchdog_hrtimer); | ||
7690 | |||
7691 | - if (!watchdog_enabled) | ||
7692 | - return; | ||
7693 | - | ||
7694 | watchdog_set_prio(SCHED_NORMAL, 0); | ||
7695 | hrtimer_cancel(hrtimer); | ||
7696 | /* disable the perf event */ | ||
7697 | diff --git a/mm/bootmem.c b/mm/bootmem.c | ||
7698 | index f468185..af3d5af 100644 | ||
7699 | --- a/mm/bootmem.c | ||
7700 | +++ b/mm/bootmem.c | ||
7701 | @@ -185,10 +185,23 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) | ||
7702 | |||
7703 | while (start < end) { | ||
7704 | unsigned long *map, idx, vec; | ||
7705 | + unsigned shift; | ||
7706 | |||
7707 | map = bdata->node_bootmem_map; | ||
7708 | idx = start - bdata->node_min_pfn; | ||
7709 | + shift = idx & (BITS_PER_LONG - 1); | ||
7710 | + /* | ||
7711 | + * vec holds at most BITS_PER_LONG map bits, | ||
7712 | + * bit 0 corresponds to start. | ||
7713 | + */ | ||
7714 | vec = ~map[idx / BITS_PER_LONG]; | ||
7715 | + | ||
7716 | + if (shift) { | ||
7717 | + vec >>= shift; | ||
7718 | + if (end - start >= BITS_PER_LONG) | ||
7719 | + vec |= ~map[idx / BITS_PER_LONG + 1] << | ||
7720 | + (BITS_PER_LONG - shift); | ||
7721 | + } | ||
7722 | /* | ||
7723 | * If we have a properly aligned and fully unreserved | ||
7724 | * BITS_PER_LONG block of pages in front of us, free | ||
7725 | @@ -201,19 +214,18 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata) | ||
7726 | count += BITS_PER_LONG; | ||
7727 | start += BITS_PER_LONG; | ||
7728 | } else { | ||
7729 | - unsigned long off = 0; | ||
7730 | + unsigned long cur = start; | ||
7731 | |||
7732 | - vec >>= start & (BITS_PER_LONG - 1); | ||
7733 | - while (vec) { | ||
7734 | + start = ALIGN(start + 1, BITS_PER_LONG); | ||
7735 | + while (vec && cur != start) { | ||
7736 | if (vec & 1) { | ||
7737 | - page = pfn_to_page(start + off); | ||
7738 | + page = pfn_to_page(cur); | ||
7739 | __free_pages_bootmem(page, 0); | ||
7740 | count++; | ||
7741 | } | ||
7742 | vec >>= 1; | ||
7743 | - off++; | ||
7744 | + ++cur; | ||
7745 | } | ||
7746 | - start = ALIGN(start + 1, BITS_PER_LONG); | ||
7747 | } | ||
7748 | } | ||
7749 | |||
7750 | diff --git a/mm/compaction.c b/mm/compaction.c | ||
7751 | index 694eaab..027ebb9 100644 | ||
7752 | --- a/mm/compaction.c | ||
7753 | +++ b/mm/compaction.c | ||
7754 | @@ -214,60 +214,6 @@ static bool suitable_migration_target(struct page *page) | ||
7755 | return false; | ||
7756 | } | ||
7757 | |||
7758 | -static void compact_capture_page(struct compact_control *cc) | ||
7759 | -{ | ||
7760 | - unsigned long flags; | ||
7761 | - int mtype, mtype_low, mtype_high; | ||
7762 | - | ||
7763 | - if (!cc->page || *cc->page) | ||
7764 | - return; | ||
7765 | - | ||
7766 | - /* | ||
7767 | - * For MIGRATE_MOVABLE allocations we capture a suitable page ASAP | ||
7768 | - * regardless of the migratetype of the freelist is is captured from. | ||
7769 | - * This is fine because the order for a high-order MIGRATE_MOVABLE | ||
7770 | - * allocation is typically at least a pageblock size and overall | ||
7771 | - * fragmentation is not impaired. Other allocation types must | ||
7772 | - * capture pages from their own migratelist because otherwise they | ||
7773 | - * could pollute other pageblocks like MIGRATE_MOVABLE with | ||
7774 | - * difficult to move pages and making fragmentation worse overall. | ||
7775 | - */ | ||
7776 | - if (cc->migratetype == MIGRATE_MOVABLE) { | ||
7777 | - mtype_low = 0; | ||
7778 | - mtype_high = MIGRATE_PCPTYPES; | ||
7779 | - } else { | ||
7780 | - mtype_low = cc->migratetype; | ||
7781 | - mtype_high = cc->migratetype + 1; | ||
7782 | - } | ||
7783 | - | ||
7784 | - /* Speculatively examine the free lists without zone lock */ | ||
7785 | - for (mtype = mtype_low; mtype < mtype_high; mtype++) { | ||
7786 | - int order; | ||
7787 | - for (order = cc->order; order < MAX_ORDER; order++) { | ||
7788 | - struct page *page; | ||
7789 | - struct free_area *area; | ||
7790 | - area = &(cc->zone->free_area[order]); | ||
7791 | - if (list_empty(&area->free_list[mtype])) | ||
7792 | - continue; | ||
7793 | - | ||
7794 | - /* Take the lock and attempt capture of the page */ | ||
7795 | - if (!compact_trylock_irqsave(&cc->zone->lock, &flags, cc)) | ||
7796 | - return; | ||
7797 | - if (!list_empty(&area->free_list[mtype])) { | ||
7798 | - page = list_entry(area->free_list[mtype].next, | ||
7799 | - struct page, lru); | ||
7800 | - if (capture_free_page(page, cc->order, mtype)) { | ||
7801 | - spin_unlock_irqrestore(&cc->zone->lock, | ||
7802 | - flags); | ||
7803 | - *cc->page = page; | ||
7804 | - return; | ||
7805 | - } | ||
7806 | - } | ||
7807 | - spin_unlock_irqrestore(&cc->zone->lock, flags); | ||
7808 | - } | ||
7809 | - } | ||
7810 | -} | ||
7811 | - | ||
7812 | /* | ||
7813 | * Isolate free pages onto a private freelist. Caller must hold zone->lock. | ||
7814 | * If @strict is true, will abort returning 0 on any invalid PFNs or non-free | ||
7815 | @@ -831,6 +777,7 @@ static isolate_migrate_t isolate_migratepages(struct zone *zone, | ||
7816 | static int compact_finished(struct zone *zone, | ||
7817 | struct compact_control *cc) | ||
7818 | { | ||
7819 | + unsigned int order; | ||
7820 | unsigned long watermark; | ||
7821 | |||
7822 | if (fatal_signal_pending(current)) | ||
7823 | @@ -865,22 +812,16 @@ static int compact_finished(struct zone *zone, | ||
7824 | return COMPACT_CONTINUE; | ||
7825 | |||
7826 | /* Direct compactor: Is a suitable page free? */ | ||
7827 | - if (cc->page) { | ||
7828 | - /* Was a suitable page captured? */ | ||
7829 | - if (*cc->page) | ||
7830 | + for (order = cc->order; order < MAX_ORDER; order++) { | ||
7831 | + struct free_area *area = &zone->free_area[order]; | ||
7832 | + | ||
7833 | + /* Job done if page is free of the right migratetype */ | ||
7834 | + if (!list_empty(&area->free_list[cc->migratetype])) | ||
7835 | + return COMPACT_PARTIAL; | ||
7836 | + | ||
7837 | + /* Job done if allocation would set block type */ | ||
7838 | + if (cc->order >= pageblock_order && area->nr_free) | ||
7839 | return COMPACT_PARTIAL; | ||
7840 | - } else { | ||
7841 | - unsigned int order; | ||
7842 | - for (order = cc->order; order < MAX_ORDER; order++) { | ||
7843 | - struct free_area *area = &zone->free_area[cc->order]; | ||
7844 | - /* Job done if page is free of the right migratetype */ | ||
7845 | - if (!list_empty(&area->free_list[cc->migratetype])) | ||
7846 | - return COMPACT_PARTIAL; | ||
7847 | - | ||
7848 | - /* Job done if allocation would set block type */ | ||
7849 | - if (cc->order >= pageblock_order && area->nr_free) | ||
7850 | - return COMPACT_PARTIAL; | ||
7851 | - } | ||
7852 | } | ||
7853 | |||
7854 | return COMPACT_CONTINUE; | ||
7855 | @@ -1018,9 +959,6 @@ static int compact_zone(struct zone *zone, struct compact_control *cc) | ||
7856 | goto out; | ||
7857 | } | ||
7858 | } | ||
7859 | - | ||
7860 | - /* Capture a page now if it is a suitable size */ | ||
7861 | - compact_capture_page(cc); | ||
7862 | } | ||
7863 | |||
7864 | out: | ||
7865 | @@ -1033,8 +971,7 @@ out: | ||
7866 | |||
7867 | static unsigned long compact_zone_order(struct zone *zone, | ||
7868 | int order, gfp_t gfp_mask, | ||
7869 | - bool sync, bool *contended, | ||
7870 | - struct page **page) | ||
7871 | + bool sync, bool *contended) | ||
7872 | { | ||
7873 | unsigned long ret; | ||
7874 | struct compact_control cc = { | ||
7875 | @@ -1044,7 +981,6 @@ static unsigned long compact_zone_order(struct zone *zone, | ||
7876 | .migratetype = allocflags_to_migratetype(gfp_mask), | ||
7877 | .zone = zone, | ||
7878 | .sync = sync, | ||
7879 | - .page = page, | ||
7880 | }; | ||
7881 | INIT_LIST_HEAD(&cc.freepages); | ||
7882 | INIT_LIST_HEAD(&cc.migratepages); | ||
7883 | @@ -1074,7 +1010,7 @@ int sysctl_extfrag_threshold = 500; | ||
7884 | */ | ||
7885 | unsigned long try_to_compact_pages(struct zonelist *zonelist, | ||
7886 | int order, gfp_t gfp_mask, nodemask_t *nodemask, | ||
7887 | - bool sync, bool *contended, struct page **page) | ||
7888 | + bool sync, bool *contended) | ||
7889 | { | ||
7890 | enum zone_type high_zoneidx = gfp_zone(gfp_mask); | ||
7891 | int may_enter_fs = gfp_mask & __GFP_FS; | ||
7892 | @@ -1100,7 +1036,7 @@ unsigned long try_to_compact_pages(struct zonelist *zonelist, | ||
7893 | int status; | ||
7894 | |||
7895 | status = compact_zone_order(zone, order, gfp_mask, sync, | ||
7896 | - contended, page); | ||
7897 | + contended); | ||
7898 | rc = max(status, rc); | ||
7899 | |||
7900 | /* If a normal allocation would succeed, stop compacting */ | ||
7901 | @@ -1156,7 +1092,6 @@ int compact_pgdat(pg_data_t *pgdat, int order) | ||
7902 | struct compact_control cc = { | ||
7903 | .order = order, | ||
7904 | .sync = false, | ||
7905 | - .page = NULL, | ||
7906 | }; | ||
7907 | |||
7908 | return __compact_pgdat(pgdat, &cc); | ||
7909 | @@ -1167,14 +1102,13 @@ static int compact_node(int nid) | ||
7910 | struct compact_control cc = { | ||
7911 | .order = -1, | ||
7912 | .sync = true, | ||
7913 | - .page = NULL, | ||
7914 | }; | ||
7915 | |||
7916 | return __compact_pgdat(NODE_DATA(nid), &cc); | ||
7917 | } | ||
7918 | |||
7919 | /* Compact all nodes in the system */ | ||
7920 | -static int compact_nodes(void) | ||
7921 | +static void compact_nodes(void) | ||
7922 | { | ||
7923 | int nid; | ||
7924 | |||
7925 | @@ -1183,8 +1117,6 @@ static int compact_nodes(void) | ||
7926 | |||
7927 | for_each_online_node(nid) | ||
7928 | compact_node(nid); | ||
7929 | - | ||
7930 | - return COMPACT_COMPLETE; | ||
7931 | } | ||
7932 | |||
7933 | /* The written value is actually unused, all memory is compacted */ | ||
7934 | @@ -1195,7 +1127,7 @@ int sysctl_compaction_handler(struct ctl_table *table, int write, | ||
7935 | void __user *buffer, size_t *length, loff_t *ppos) | ||
7936 | { | ||
7937 | if (write) | ||
7938 | - return compact_nodes(); | ||
7939 | + compact_nodes(); | ||
7940 | |||
7941 | return 0; | ||
7942 | } | ||
7943 | diff --git a/mm/internal.h b/mm/internal.h | ||
7944 | index a4fa284..3c5197d 100644 | ||
7945 | --- a/mm/internal.h | ||
7946 | +++ b/mm/internal.h | ||
7947 | @@ -130,7 +130,6 @@ struct compact_control { | ||
7948 | int migratetype; /* MOVABLE, RECLAIMABLE etc */ | ||
7949 | struct zone *zone; | ||
7950 | bool contended; /* True if a lock was contended */ | ||
7951 | - struct page **page; /* Page captured of requested size */ | ||
7952 | }; | ||
7953 | |||
7954 | unsigned long | ||
7955 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c | ||
7956 | index 7e208f0..ceb4168 100644 | ||
7957 | --- a/mm/page_alloc.c | ||
7958 | +++ b/mm/page_alloc.c | ||
7959 | @@ -1376,14 +1376,8 @@ void split_page(struct page *page, unsigned int order) | ||
7960 | set_page_refcounted(page + i); | ||
7961 | } | ||
7962 | |||
7963 | -/* | ||
7964 | - * Similar to the split_page family of functions except that the page | ||
7965 | - * required at the given order and being isolated now to prevent races | ||
7966 | - * with parallel allocators | ||
7967 | - */ | ||
7968 | -int capture_free_page(struct page *page, int alloc_order, int migratetype) | ||
7969 | +static int __isolate_free_page(struct page *page, unsigned int order) | ||
7970 | { | ||
7971 | - unsigned int order; | ||
7972 | unsigned long watermark; | ||
7973 | struct zone *zone; | ||
7974 | int mt; | ||
7975 | @@ -1391,7 +1385,6 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype) | ||
7976 | BUG_ON(!PageBuddy(page)); | ||
7977 | |||
7978 | zone = page_zone(page); | ||
7979 | - order = page_order(page); | ||
7980 | |||
7981 | /* Obey watermarks as if the page was being allocated */ | ||
7982 | watermark = low_wmark_pages(zone) + (1 << order); | ||
7983 | @@ -1405,13 +1398,9 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype) | ||
7984 | |||
7985 | mt = get_pageblock_migratetype(page); | ||
7986 | if (unlikely(mt != MIGRATE_ISOLATE)) | ||
7987 | - __mod_zone_freepage_state(zone, -(1UL << alloc_order), mt); | ||
7988 | - | ||
7989 | - if (alloc_order != order) | ||
7990 | - expand(zone, page, alloc_order, order, | ||
7991 | - &zone->free_area[order], migratetype); | ||
7992 | + __mod_zone_freepage_state(zone, -(1UL << order), mt); | ||
7993 | |||
7994 | - /* Set the pageblock if the captured page is at least a pageblock */ | ||
7995 | + /* Set the pageblock if the isolated page is at least a pageblock */ | ||
7996 | if (order >= pageblock_order - 1) { | ||
7997 | struct page *endpage = page + (1 << order) - 1; | ||
7998 | for (; page < endpage; page += pageblock_nr_pages) { | ||
7999 | @@ -1422,7 +1411,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype) | ||
8000 | } | ||
8001 | } | ||
8002 | |||
8003 | - return 1UL << alloc_order; | ||
8004 | + return 1UL << order; | ||
8005 | } | ||
8006 | |||
8007 | /* | ||
8008 | @@ -1440,10 +1429,9 @@ int split_free_page(struct page *page) | ||
8009 | unsigned int order; | ||
8010 | int nr_pages; | ||
8011 | |||
8012 | - BUG_ON(!PageBuddy(page)); | ||
8013 | order = page_order(page); | ||
8014 | |||
8015 | - nr_pages = capture_free_page(page, order, 0); | ||
8016 | + nr_pages = __isolate_free_page(page, order); | ||
8017 | if (!nr_pages) | ||
8018 | return 0; | ||
8019 | |||
8020 | @@ -2148,8 +2136,6 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, | ||
8021 | bool *contended_compaction, bool *deferred_compaction, | ||
8022 | unsigned long *did_some_progress) | ||
8023 | { | ||
8024 | - struct page *page = NULL; | ||
8025 | - | ||
8026 | if (!order) | ||
8027 | return NULL; | ||
8028 | |||
8029 | @@ -2161,16 +2147,12 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, | ||
8030 | current->flags |= PF_MEMALLOC; | ||
8031 | *did_some_progress = try_to_compact_pages(zonelist, order, gfp_mask, | ||
8032 | nodemask, sync_migration, | ||
8033 | - contended_compaction, &page); | ||
8034 | + contended_compaction); | ||
8035 | current->flags &= ~PF_MEMALLOC; | ||
8036 | |||
8037 | - /* If compaction captured a page, prep and use it */ | ||
8038 | - if (page) { | ||
8039 | - prep_new_page(page, order, gfp_mask); | ||
8040 | - goto got_page; | ||
8041 | - } | ||
8042 | - | ||
8043 | if (*did_some_progress != COMPACT_SKIPPED) { | ||
8044 | + struct page *page; | ||
8045 | + | ||
8046 | /* Page migration frees to the PCP lists but we want merging */ | ||
8047 | drain_pages(get_cpu()); | ||
8048 | put_cpu(); | ||
8049 | @@ -2180,7 +2162,6 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order, | ||
8050 | alloc_flags & ~ALLOC_NO_WATERMARKS, | ||
8051 | preferred_zone, migratetype); | ||
8052 | if (page) { | ||
8053 | -got_page: | ||
8054 | preferred_zone->compact_blockskip_flush = false; | ||
8055 | preferred_zone->compact_considered = 0; | ||
8056 | preferred_zone->compact_defer_shift = 0; | ||
8057 | @@ -5506,7 +5487,7 @@ static inline int pfn_to_bitidx(struct zone *zone, unsigned long pfn) | ||
8058 | pfn &= (PAGES_PER_SECTION-1); | ||
8059 | return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS; | ||
8060 | #else | ||
8061 | - pfn = pfn - zone->zone_start_pfn; | ||
8062 | + pfn = pfn - round_down(zone->zone_start_pfn, pageblock_nr_pages); | ||
8063 | return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS; | ||
8064 | #endif /* CONFIG_SPARSEMEM */ | ||
8065 | } | ||
8066 | diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c | ||
8067 | index a802029..ee71ea2 100644 | ||
8068 | --- a/net/ceph/ceph_common.c | ||
8069 | +++ b/net/ceph/ceph_common.c | ||
8070 | @@ -305,7 +305,6 @@ ceph_parse_options(char *options, const char *dev_name, | ||
8071 | |||
8072 | /* start with defaults */ | ||
8073 | opt->flags = CEPH_OPT_DEFAULT; | ||
8074 | - opt->osd_timeout = CEPH_OSD_TIMEOUT_DEFAULT; | ||
8075 | opt->osd_keepalive_timeout = CEPH_OSD_KEEPALIVE_DEFAULT; | ||
8076 | opt->mount_timeout = CEPH_MOUNT_TIMEOUT_DEFAULT; /* seconds */ | ||
8077 | opt->osd_idle_ttl = CEPH_OSD_IDLE_TTL_DEFAULT; /* seconds */ | ||
8078 | @@ -391,7 +390,7 @@ ceph_parse_options(char *options, const char *dev_name, | ||
8079 | |||
8080 | /* misc */ | ||
8081 | case Opt_osdtimeout: | ||
8082 | - opt->osd_timeout = intval; | ||
8083 | + pr_warning("ignoring deprecated osdtimeout option\n"); | ||
8084 | break; | ||
8085 | case Opt_osdkeepalivetimeout: | ||
8086 | opt->osd_keepalive_timeout = intval; | ||
8087 | diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c | ||
8088 | index 3ef1759..e9f2159 100644 | ||
8089 | --- a/net/ceph/messenger.c | ||
8090 | +++ b/net/ceph/messenger.c | ||
8091 | @@ -506,6 +506,7 @@ static void reset_connection(struct ceph_connection *con) | ||
8092 | { | ||
8093 | /* reset connection, out_queue, msg_ and connect_seq */ | ||
8094 | /* discard existing out_queue and msg_seq */ | ||
8095 | + dout("reset_connection %p\n", con); | ||
8096 | ceph_msg_remove_list(&con->out_queue); | ||
8097 | ceph_msg_remove_list(&con->out_sent); | ||
8098 | |||
8099 | @@ -561,7 +562,7 @@ void ceph_con_open(struct ceph_connection *con, | ||
8100 | mutex_lock(&con->mutex); | ||
8101 | dout("con_open %p %s\n", con, ceph_pr_addr(&addr->in_addr)); | ||
8102 | |||
8103 | - BUG_ON(con->state != CON_STATE_CLOSED); | ||
8104 | + WARN_ON(con->state != CON_STATE_CLOSED); | ||
8105 | con->state = CON_STATE_PREOPEN; | ||
8106 | |||
8107 | con->peer_name.type = (__u8) entity_type; | ||
8108 | @@ -1506,13 +1507,6 @@ static int process_banner(struct ceph_connection *con) | ||
8109 | return 0; | ||
8110 | } | ||
8111 | |||
8112 | -static void fail_protocol(struct ceph_connection *con) | ||
8113 | -{ | ||
8114 | - reset_connection(con); | ||
8115 | - BUG_ON(con->state != CON_STATE_NEGOTIATING); | ||
8116 | - con->state = CON_STATE_CLOSED; | ||
8117 | -} | ||
8118 | - | ||
8119 | static int process_connect(struct ceph_connection *con) | ||
8120 | { | ||
8121 | u64 sup_feat = con->msgr->supported_features; | ||
8122 | @@ -1530,7 +1524,7 @@ static int process_connect(struct ceph_connection *con) | ||
8123 | ceph_pr_addr(&con->peer_addr.in_addr), | ||
8124 | sup_feat, server_feat, server_feat & ~sup_feat); | ||
8125 | con->error_msg = "missing required protocol features"; | ||
8126 | - fail_protocol(con); | ||
8127 | + reset_connection(con); | ||
8128 | return -1; | ||
8129 | |||
8130 | case CEPH_MSGR_TAG_BADPROTOVER: | ||
8131 | @@ -1541,7 +1535,7 @@ static int process_connect(struct ceph_connection *con) | ||
8132 | le32_to_cpu(con->out_connect.protocol_version), | ||
8133 | le32_to_cpu(con->in_reply.protocol_version)); | ||
8134 | con->error_msg = "protocol version mismatch"; | ||
8135 | - fail_protocol(con); | ||
8136 | + reset_connection(con); | ||
8137 | return -1; | ||
8138 | |||
8139 | case CEPH_MSGR_TAG_BADAUTHORIZER: | ||
8140 | @@ -1631,11 +1625,11 @@ static int process_connect(struct ceph_connection *con) | ||
8141 | ceph_pr_addr(&con->peer_addr.in_addr), | ||
8142 | req_feat, server_feat, req_feat & ~server_feat); | ||
8143 | con->error_msg = "missing required protocol features"; | ||
8144 | - fail_protocol(con); | ||
8145 | + reset_connection(con); | ||
8146 | return -1; | ||
8147 | } | ||
8148 | |||
8149 | - BUG_ON(con->state != CON_STATE_NEGOTIATING); | ||
8150 | + WARN_ON(con->state != CON_STATE_NEGOTIATING); | ||
8151 | con->state = CON_STATE_OPEN; | ||
8152 | |||
8153 | con->peer_global_seq = le32_to_cpu(con->in_reply.global_seq); | ||
8154 | @@ -2132,7 +2126,6 @@ more: | ||
8155 | if (ret < 0) | ||
8156 | goto out; | ||
8157 | |||
8158 | - BUG_ON(con->state != CON_STATE_CONNECTING); | ||
8159 | con->state = CON_STATE_NEGOTIATING; | ||
8160 | |||
8161 | /* | ||
8162 | @@ -2160,7 +2153,7 @@ more: | ||
8163 | goto more; | ||
8164 | } | ||
8165 | |||
8166 | - BUG_ON(con->state != CON_STATE_OPEN); | ||
8167 | + WARN_ON(con->state != CON_STATE_OPEN); | ||
8168 | |||
8169 | if (con->in_base_pos < 0) { | ||
8170 | /* | ||
8171 | @@ -2262,6 +2255,35 @@ static void queue_con(struct ceph_connection *con) | ||
8172 | } | ||
8173 | } | ||
8174 | |||
8175 | +static bool con_sock_closed(struct ceph_connection *con) | ||
8176 | +{ | ||
8177 | + if (!test_and_clear_bit(CON_FLAG_SOCK_CLOSED, &con->flags)) | ||
8178 | + return false; | ||
8179 | + | ||
8180 | +#define CASE(x) \ | ||
8181 | + case CON_STATE_ ## x: \ | ||
8182 | + con->error_msg = "socket closed (con state " #x ")"; \ | ||
8183 | + break; | ||
8184 | + | ||
8185 | + switch (con->state) { | ||
8186 | + CASE(CLOSED); | ||
8187 | + CASE(PREOPEN); | ||
8188 | + CASE(CONNECTING); | ||
8189 | + CASE(NEGOTIATING); | ||
8190 | + CASE(OPEN); | ||
8191 | + CASE(STANDBY); | ||
8192 | + default: | ||
8193 | + pr_warning("%s con %p unrecognized state %lu\n", | ||
8194 | + __func__, con, con->state); | ||
8195 | + con->error_msg = "unrecognized con state"; | ||
8196 | + BUG(); | ||
8197 | + break; | ||
8198 | + } | ||
8199 | +#undef CASE | ||
8200 | + | ||
8201 | + return true; | ||
8202 | +} | ||
8203 | + | ||
8204 | /* | ||
8205 | * Do some work on a connection. Drop a connection ref when we're done. | ||
8206 | */ | ||
8207 | @@ -2273,24 +2295,8 @@ static void con_work(struct work_struct *work) | ||
8208 | |||
8209 | mutex_lock(&con->mutex); | ||
8210 | restart: | ||
8211 | - if (test_and_clear_bit(CON_FLAG_SOCK_CLOSED, &con->flags)) { | ||
8212 | - switch (con->state) { | ||
8213 | - case CON_STATE_CONNECTING: | ||
8214 | - con->error_msg = "connection failed"; | ||
8215 | - break; | ||
8216 | - case CON_STATE_NEGOTIATING: | ||
8217 | - con->error_msg = "negotiation failed"; | ||
8218 | - break; | ||
8219 | - case CON_STATE_OPEN: | ||
8220 | - con->error_msg = "socket closed"; | ||
8221 | - break; | ||
8222 | - default: | ||
8223 | - dout("unrecognized con state %d\n", (int)con->state); | ||
8224 | - con->error_msg = "unrecognized con state"; | ||
8225 | - BUG(); | ||
8226 | - } | ||
8227 | + if (con_sock_closed(con)) | ||
8228 | goto fault; | ||
8229 | - } | ||
8230 | |||
8231 | if (test_and_clear_bit(CON_FLAG_BACKOFF, &con->flags)) { | ||
8232 | dout("con_work %p backing off\n", con); | ||
8233 | @@ -2356,12 +2362,12 @@ fault: | ||
8234 | static void ceph_fault(struct ceph_connection *con) | ||
8235 | __releases(con->mutex) | ||
8236 | { | ||
8237 | - pr_err("%s%lld %s %s\n", ENTITY_NAME(con->peer_name), | ||
8238 | + pr_warning("%s%lld %s %s\n", ENTITY_NAME(con->peer_name), | ||
8239 | ceph_pr_addr(&con->peer_addr.in_addr), con->error_msg); | ||
8240 | dout("fault %p state %lu to peer %s\n", | ||
8241 | con, con->state, ceph_pr_addr(&con->peer_addr.in_addr)); | ||
8242 | |||
8243 | - BUG_ON(con->state != CON_STATE_CONNECTING && | ||
8244 | + WARN_ON(con->state != CON_STATE_CONNECTING && | ||
8245 | con->state != CON_STATE_NEGOTIATING && | ||
8246 | con->state != CON_STATE_OPEN); | ||
8247 | |||
8248 | diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c | ||
8249 | index c1d756c..eb9a444 100644 | ||
8250 | --- a/net/ceph/osd_client.c | ||
8251 | +++ b/net/ceph/osd_client.c | ||
8252 | @@ -221,6 +221,7 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc, | ||
8253 | kref_init(&req->r_kref); | ||
8254 | init_completion(&req->r_completion); | ||
8255 | init_completion(&req->r_safe_completion); | ||
8256 | + RB_CLEAR_NODE(&req->r_node); | ||
8257 | INIT_LIST_HEAD(&req->r_unsafe_item); | ||
8258 | INIT_LIST_HEAD(&req->r_linger_item); | ||
8259 | INIT_LIST_HEAD(&req->r_linger_osd); | ||
8260 | @@ -580,7 +581,7 @@ static void __kick_osd_requests(struct ceph_osd_client *osdc, | ||
8261 | |||
8262 | dout("__kick_osd_requests osd%d\n", osd->o_osd); | ||
8263 | err = __reset_osd(osdc, osd); | ||
8264 | - if (err == -EAGAIN) | ||
8265 | + if (err) | ||
8266 | return; | ||
8267 | |||
8268 | list_for_each_entry(req, &osd->o_requests, r_osd_item) { | ||
8269 | @@ -607,14 +608,6 @@ static void __kick_osd_requests(struct ceph_osd_client *osdc, | ||
8270 | } | ||
8271 | } | ||
8272 | |||
8273 | -static void kick_osd_requests(struct ceph_osd_client *osdc, | ||
8274 | - struct ceph_osd *kickosd) | ||
8275 | -{ | ||
8276 | - mutex_lock(&osdc->request_mutex); | ||
8277 | - __kick_osd_requests(osdc, kickosd); | ||
8278 | - mutex_unlock(&osdc->request_mutex); | ||
8279 | -} | ||
8280 | - | ||
8281 | /* | ||
8282 | * If the osd connection drops, we need to resubmit all requests. | ||
8283 | */ | ||
8284 | @@ -628,7 +621,9 @@ static void osd_reset(struct ceph_connection *con) | ||
8285 | dout("osd_reset osd%d\n", osd->o_osd); | ||
8286 | osdc = osd->o_osdc; | ||
8287 | down_read(&osdc->map_sem); | ||
8288 | - kick_osd_requests(osdc, osd); | ||
8289 | + mutex_lock(&osdc->request_mutex); | ||
8290 | + __kick_osd_requests(osdc, osd); | ||
8291 | + mutex_unlock(&osdc->request_mutex); | ||
8292 | send_queued(osdc); | ||
8293 | up_read(&osdc->map_sem); | ||
8294 | } | ||
8295 | @@ -647,6 +642,7 @@ static struct ceph_osd *create_osd(struct ceph_osd_client *osdc, int onum) | ||
8296 | atomic_set(&osd->o_ref, 1); | ||
8297 | osd->o_osdc = osdc; | ||
8298 | osd->o_osd = onum; | ||
8299 | + RB_CLEAR_NODE(&osd->o_node); | ||
8300 | INIT_LIST_HEAD(&osd->o_requests); | ||
8301 | INIT_LIST_HEAD(&osd->o_linger_requests); | ||
8302 | INIT_LIST_HEAD(&osd->o_osd_lru); | ||
8303 | @@ -750,6 +746,7 @@ static int __reset_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd) | ||
8304 | if (list_empty(&osd->o_requests) && | ||
8305 | list_empty(&osd->o_linger_requests)) { | ||
8306 | __remove_osd(osdc, osd); | ||
8307 | + ret = -ENODEV; | ||
8308 | } else if (memcmp(&osdc->osdmap->osd_addr[osd->o_osd], | ||
8309 | &osd->o_con.peer_addr, | ||
8310 | sizeof(osd->o_con.peer_addr)) == 0 && | ||
8311 | @@ -876,9 +873,9 @@ static void __unregister_request(struct ceph_osd_client *osdc, | ||
8312 | req->r_osd = NULL; | ||
8313 | } | ||
8314 | |||
8315 | + list_del_init(&req->r_req_lru_item); | ||
8316 | ceph_osdc_put_request(req); | ||
8317 | |||
8318 | - list_del_init(&req->r_req_lru_item); | ||
8319 | if (osdc->num_requests == 0) { | ||
8320 | dout(" no requests, canceling timeout\n"); | ||
8321 | __cancel_osd_timeout(osdc); | ||
8322 | @@ -910,8 +907,8 @@ static void __unregister_linger_request(struct ceph_osd_client *osdc, | ||
8323 | struct ceph_osd_request *req) | ||
8324 | { | ||
8325 | dout("__unregister_linger_request %p\n", req); | ||
8326 | + list_del_init(&req->r_linger_item); | ||
8327 | if (req->r_osd) { | ||
8328 | - list_del_init(&req->r_linger_item); | ||
8329 | list_del_init(&req->r_linger_osd); | ||
8330 | |||
8331 | if (list_empty(&req->r_osd->o_requests) && | ||
8332 | @@ -1090,12 +1087,10 @@ static void handle_timeout(struct work_struct *work) | ||
8333 | { | ||
8334 | struct ceph_osd_client *osdc = | ||
8335 | container_of(work, struct ceph_osd_client, timeout_work.work); | ||
8336 | - struct ceph_osd_request *req, *last_req = NULL; | ||
8337 | + struct ceph_osd_request *req; | ||
8338 | struct ceph_osd *osd; | ||
8339 | - unsigned long timeout = osdc->client->options->osd_timeout * HZ; | ||
8340 | unsigned long keepalive = | ||
8341 | osdc->client->options->osd_keepalive_timeout * HZ; | ||
8342 | - unsigned long last_stamp = 0; | ||
8343 | struct list_head slow_osds; | ||
8344 | dout("timeout\n"); | ||
8345 | down_read(&osdc->map_sem); | ||
8346 | @@ -1105,37 +1100,6 @@ static void handle_timeout(struct work_struct *work) | ||
8347 | mutex_lock(&osdc->request_mutex); | ||
8348 | |||
8349 | /* | ||
8350 | - * reset osds that appear to be _really_ unresponsive. this | ||
8351 | - * is a failsafe measure.. we really shouldn't be getting to | ||
8352 | - * this point if the system is working properly. the monitors | ||
8353 | - * should mark the osd as failed and we should find out about | ||
8354 | - * it from an updated osd map. | ||
8355 | - */ | ||
8356 | - while (timeout && !list_empty(&osdc->req_lru)) { | ||
8357 | - req = list_entry(osdc->req_lru.next, struct ceph_osd_request, | ||
8358 | - r_req_lru_item); | ||
8359 | - | ||
8360 | - /* hasn't been long enough since we sent it? */ | ||
8361 | - if (time_before(jiffies, req->r_stamp + timeout)) | ||
8362 | - break; | ||
8363 | - | ||
8364 | - /* hasn't been long enough since it was acked? */ | ||
8365 | - if (req->r_request->ack_stamp == 0 || | ||
8366 | - time_before(jiffies, req->r_request->ack_stamp + timeout)) | ||
8367 | - break; | ||
8368 | - | ||
8369 | - BUG_ON(req == last_req && req->r_stamp == last_stamp); | ||
8370 | - last_req = req; | ||
8371 | - last_stamp = req->r_stamp; | ||
8372 | - | ||
8373 | - osd = req->r_osd; | ||
8374 | - BUG_ON(!osd); | ||
8375 | - pr_warning(" tid %llu timed out on osd%d, will reset osd\n", | ||
8376 | - req->r_tid, osd->o_osd); | ||
8377 | - __kick_osd_requests(osdc, osd); | ||
8378 | - } | ||
8379 | - | ||
8380 | - /* | ||
8381 | * ping osds that are a bit slow. this ensures that if there | ||
8382 | * is a break in the TCP connection we will notice, and reopen | ||
8383 | * a connection with that osd (from the fault callback). | ||
8384 | @@ -1306,7 +1270,7 @@ static void reset_changed_osds(struct ceph_osd_client *osdc) | ||
8385 | * Requeue requests whose mapping to an OSD has changed. If requests map to | ||
8386 | * no osd, request a new map. | ||
8387 | * | ||
8388 | - * Caller should hold map_sem for read and request_mutex. | ||
8389 | + * Caller should hold map_sem for read. | ||
8390 | */ | ||
8391 | static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
8392 | { | ||
8393 | @@ -1320,6 +1284,24 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
8394 | for (p = rb_first(&osdc->requests); p; ) { | ||
8395 | req = rb_entry(p, struct ceph_osd_request, r_node); | ||
8396 | p = rb_next(p); | ||
8397 | + | ||
8398 | + /* | ||
8399 | + * For linger requests that have not yet been | ||
8400 | + * registered, move them to the linger list; they'll | ||
8401 | + * be sent to the osd in the loop below. Unregister | ||
8402 | + * the request before re-registering it as a linger | ||
8403 | + * request to ensure the __map_request() below | ||
8404 | + * will decide it needs to be sent. | ||
8405 | + */ | ||
8406 | + if (req->r_linger && list_empty(&req->r_linger_item)) { | ||
8407 | + dout("%p tid %llu restart on osd%d\n", | ||
8408 | + req, req->r_tid, | ||
8409 | + req->r_osd ? req->r_osd->o_osd : -1); | ||
8410 | + __unregister_request(osdc, req); | ||
8411 | + __register_linger_request(osdc, req); | ||
8412 | + continue; | ||
8413 | + } | ||
8414 | + | ||
8415 | err = __map_request(osdc, req, force_resend); | ||
8416 | if (err < 0) | ||
8417 | continue; /* error */ | ||
8418 | @@ -1334,17 +1316,6 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
8419 | req->r_flags |= CEPH_OSD_FLAG_RETRY; | ||
8420 | } | ||
8421 | } | ||
8422 | - if (req->r_linger && list_empty(&req->r_linger_item)) { | ||
8423 | - /* | ||
8424 | - * register as a linger so that we will | ||
8425 | - * re-submit below and get a new tid | ||
8426 | - */ | ||
8427 | - dout("%p tid %llu restart on osd%d\n", | ||
8428 | - req, req->r_tid, | ||
8429 | - req->r_osd ? req->r_osd->o_osd : -1); | ||
8430 | - __register_linger_request(osdc, req); | ||
8431 | - __unregister_request(osdc, req); | ||
8432 | - } | ||
8433 | } | ||
8434 | |||
8435 | list_for_each_entry_safe(req, nreq, &osdc->req_linger, | ||
8436 | @@ -1352,6 +1323,7 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
8437 | dout("linger req=%p req->r_osd=%p\n", req, req->r_osd); | ||
8438 | |||
8439 | err = __map_request(osdc, req, force_resend); | ||
8440 | + dout("__map_request returned %d\n", err); | ||
8441 | if (err == 0) | ||
8442 | continue; /* no change and no osd was specified */ | ||
8443 | if (err < 0) | ||
8444 | @@ -1364,8 +1336,8 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
8445 | |||
8446 | dout("kicking lingering %p tid %llu osd%d\n", req, req->r_tid, | ||
8447 | req->r_osd ? req->r_osd->o_osd : -1); | ||
8448 | - __unregister_linger_request(osdc, req); | ||
8449 | __register_request(osdc, req); | ||
8450 | + __unregister_linger_request(osdc, req); | ||
8451 | } | ||
8452 | mutex_unlock(&osdc->request_mutex); | ||
8453 | |||
8454 | @@ -1373,6 +1345,7 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | ||
8455 | dout("%d requests for down osds, need new map\n", needmap); | ||
8456 | ceph_monc_request_next_osdmap(&osdc->client->monc); | ||
8457 | } | ||
8458 | + reset_changed_osds(osdc); | ||
8459 | } | ||
8460 | |||
8461 | |||
8462 | @@ -1429,7 +1402,6 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | ||
8463 | osdc->osdmap = newmap; | ||
8464 | } | ||
8465 | kick_requests(osdc, 0); | ||
8466 | - reset_changed_osds(osdc); | ||
8467 | } else { | ||
8468 | dout("ignoring incremental map %u len %d\n", | ||
8469 | epoch, maplen); | ||
8470 | @@ -1599,6 +1571,7 @@ int ceph_osdc_create_event(struct ceph_osd_client *osdc, | ||
8471 | event->data = data; | ||
8472 | event->osdc = osdc; | ||
8473 | INIT_LIST_HEAD(&event->osd_node); | ||
8474 | + RB_CLEAR_NODE(&event->node); | ||
8475 | kref_init(&event->kref); /* one ref for us */ | ||
8476 | kref_get(&event->kref); /* one ref for the caller */ | ||
8477 | init_completion(&event->completion); | ||
8478 | diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c | ||
8479 | index 5433fb0..f552aa4 100644 | ||
8480 | --- a/net/ceph/osdmap.c | ||
8481 | +++ b/net/ceph/osdmap.c | ||
8482 | @@ -645,10 +645,12 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end) | ||
8483 | ceph_decode_32_safe(p, end, max, bad); | ||
8484 | while (max--) { | ||
8485 | ceph_decode_need(p, end, 4 + 1 + sizeof(pi->v), bad); | ||
8486 | + err = -ENOMEM; | ||
8487 | pi = kzalloc(sizeof(*pi), GFP_NOFS); | ||
8488 | if (!pi) | ||
8489 | goto bad; | ||
8490 | pi->id = ceph_decode_32(p); | ||
8491 | + err = -EINVAL; | ||
8492 | ev = ceph_decode_8(p); /* encoding version */ | ||
8493 | if (ev > CEPH_PG_POOL_VERSION) { | ||
8494 | pr_warning("got unknown v %d > %d of ceph_pg_pool\n", | ||
8495 | @@ -664,8 +666,13 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end) | ||
8496 | __insert_pg_pool(&map->pg_pools, pi); | ||
8497 | } | ||
8498 | |||
8499 | - if (version >= 5 && __decode_pool_names(p, end, map) < 0) | ||
8500 | - goto bad; | ||
8501 | + if (version >= 5) { | ||
8502 | + err = __decode_pool_names(p, end, map); | ||
8503 | + if (err < 0) { | ||
8504 | + dout("fail to decode pool names"); | ||
8505 | + goto bad; | ||
8506 | + } | ||
8507 | + } | ||
8508 | |||
8509 | ceph_decode_32_safe(p, end, map->pool_max, bad); | ||
8510 | |||
8511 | @@ -745,7 +752,7 @@ struct ceph_osdmap *osdmap_decode(void **p, void *end) | ||
8512 | return map; | ||
8513 | |||
8514 | bad: | ||
8515 | - dout("osdmap_decode fail\n"); | ||
8516 | + dout("osdmap_decode fail err %d\n", err); | ||
8517 | ceph_osdmap_destroy(map); | ||
8518 | return ERR_PTR(err); | ||
8519 | } | ||
8520 | @@ -839,6 +846,7 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | ||
8521 | if (ev > CEPH_PG_POOL_VERSION) { | ||
8522 | pr_warning("got unknown v %d > %d of ceph_pg_pool\n", | ||
8523 | ev, CEPH_PG_POOL_VERSION); | ||
8524 | + err = -EINVAL; | ||
8525 | goto bad; | ||
8526 | } | ||
8527 | pi = __lookup_pg_pool(&map->pg_pools, pool); | ||
8528 | @@ -855,8 +863,11 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | ||
8529 | if (err < 0) | ||
8530 | goto bad; | ||
8531 | } | ||
8532 | - if (version >= 5 && __decode_pool_names(p, end, map) < 0) | ||
8533 | - goto bad; | ||
8534 | + if (version >= 5) { | ||
8535 | + err = __decode_pool_names(p, end, map); | ||
8536 | + if (err < 0) | ||
8537 | + goto bad; | ||
8538 | + } | ||
8539 | |||
8540 | /* old_pool */ | ||
8541 | ceph_decode_32_safe(p, end, len, bad); | ||
8542 | @@ -932,15 +943,13 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | ||
8543 | (void) __remove_pg_mapping(&map->pg_temp, pgid); | ||
8544 | |||
8545 | /* insert */ | ||
8546 | - if (pglen > (UINT_MAX - sizeof(*pg)) / sizeof(u32)) { | ||
8547 | - err = -EINVAL; | ||
8548 | + err = -EINVAL; | ||
8549 | + if (pglen > (UINT_MAX - sizeof(*pg)) / sizeof(u32)) | ||
8550 | goto bad; | ||
8551 | - } | ||
8552 | + err = -ENOMEM; | ||
8553 | pg = kmalloc(sizeof(*pg) + sizeof(u32)*pglen, GFP_NOFS); | ||
8554 | - if (!pg) { | ||
8555 | - err = -ENOMEM; | ||
8556 | + if (!pg) | ||
8557 | goto bad; | ||
8558 | - } | ||
8559 | pg->pgid = pgid; | ||
8560 | pg->len = pglen; | ||
8561 | for (j = 0; j < pglen; j++) | ||
8562 | diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c | ||
8563 | index c21e33d..d9df6b8 100644 | ||
8564 | --- a/net/mac80211/ibss.c | ||
8565 | +++ b/net/mac80211/ibss.c | ||
8566 | @@ -678,8 +678,8 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata) | ||
8567 | sdata_info(sdata, | ||
8568 | "No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)\n"); | ||
8569 | |||
8570 | - ieee80211_request_internal_scan(sdata, | ||
8571 | - ifibss->ssid, ifibss->ssid_len, NULL); | ||
8572 | + ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len, | ||
8573 | + NULL); | ||
8574 | } | ||
8575 | |||
8576 | static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata) | ||
8577 | @@ -777,9 +777,8 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata) | ||
8578 | IEEE80211_SCAN_INTERVAL)) { | ||
8579 | sdata_info(sdata, "Trigger new scan to find an IBSS to join\n"); | ||
8580 | |||
8581 | - ieee80211_request_internal_scan(sdata, | ||
8582 | - ifibss->ssid, ifibss->ssid_len, | ||
8583 | - ifibss->fixed_channel ? ifibss->channel : NULL); | ||
8584 | + ieee80211_request_ibss_scan(sdata, ifibss->ssid, | ||
8585 | + ifibss->ssid_len, chan); | ||
8586 | } else { | ||
8587 | int interval = IEEE80211_SCAN_INTERVAL; | ||
8588 | |||
8589 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h | ||
8590 | index 156e583..3da215c 100644 | ||
8591 | --- a/net/mac80211/ieee80211_i.h | ||
8592 | +++ b/net/mac80211/ieee80211_i.h | ||
8593 | @@ -730,6 +730,10 @@ struct ieee80211_sub_if_data { | ||
8594 | u32 mntr_flags; | ||
8595 | } u; | ||
8596 | |||
8597 | + spinlock_t cleanup_stations_lock; | ||
8598 | + struct list_head cleanup_stations; | ||
8599 | + struct work_struct cleanup_stations_wk; | ||
8600 | + | ||
8601 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
8602 | struct { | ||
8603 | struct dentry *dir; | ||
8604 | @@ -1247,9 +1251,9 @@ void ieee80211_mesh_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, | ||
8605 | |||
8606 | /* scan/BSS handling */ | ||
8607 | void ieee80211_scan_work(struct work_struct *work); | ||
8608 | -int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, | ||
8609 | - const u8 *ssid, u8 ssid_len, | ||
8610 | - struct ieee80211_channel *chan); | ||
8611 | +int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, | ||
8612 | + const u8 *ssid, u8 ssid_len, | ||
8613 | + struct ieee80211_channel *chan); | ||
8614 | int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, | ||
8615 | struct cfg80211_scan_request *req); | ||
8616 | void ieee80211_scan_cancel(struct ieee80211_local *local); | ||
8617 | diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c | ||
8618 | index 7de7717..0f5af91 100644 | ||
8619 | --- a/net/mac80211/iface.c | ||
8620 | +++ b/net/mac80211/iface.c | ||
8621 | @@ -793,20 +793,11 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, | ||
8622 | flush_work(&sdata->work); | ||
8623 | /* | ||
8624 | * When we get here, the interface is marked down. | ||
8625 | - * Call rcu_barrier() to wait both for the RX path | ||
8626 | + * Call synchronize_rcu() to wait for the RX path | ||
8627 | * should it be using the interface and enqueuing | ||
8628 | - * frames at this very time on another CPU, and | ||
8629 | - * for the sta free call_rcu callbacks. | ||
8630 | + * frames at this very time on another CPU. | ||
8631 | */ | ||
8632 | - rcu_barrier(); | ||
8633 | - | ||
8634 | - /* | ||
8635 | - * free_sta_rcu() enqueues a work for the actual | ||
8636 | - * sta cleanup, so we need to flush it while | ||
8637 | - * sdata is still valid. | ||
8638 | - */ | ||
8639 | - flush_workqueue(local->workqueue); | ||
8640 | - | ||
8641 | + synchronize_rcu(); | ||
8642 | skb_queue_purge(&sdata->skb_queue); | ||
8643 | |||
8644 | /* | ||
8645 | @@ -1432,6 +1423,15 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local, | ||
8646 | mutex_unlock(&local->iflist_mtx); | ||
8647 | } | ||
8648 | |||
8649 | +static void ieee80211_cleanup_sdata_stas_wk(struct work_struct *wk) | ||
8650 | +{ | ||
8651 | + struct ieee80211_sub_if_data *sdata; | ||
8652 | + | ||
8653 | + sdata = container_of(wk, struct ieee80211_sub_if_data, cleanup_stations_wk); | ||
8654 | + | ||
8655 | + ieee80211_cleanup_sdata_stas(sdata); | ||
8656 | +} | ||
8657 | + | ||
8658 | int ieee80211_if_add(struct ieee80211_local *local, const char *name, | ||
8659 | struct wireless_dev **new_wdev, enum nl80211_iftype type, | ||
8660 | struct vif_params *params) | ||
8661 | @@ -1507,6 +1507,10 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, | ||
8662 | |||
8663 | INIT_LIST_HEAD(&sdata->key_list); | ||
8664 | |||
8665 | + spin_lock_init(&sdata->cleanup_stations_lock); | ||
8666 | + INIT_LIST_HEAD(&sdata->cleanup_stations); | ||
8667 | + INIT_WORK(&sdata->cleanup_stations_wk, ieee80211_cleanup_sdata_stas_wk); | ||
8668 | + | ||
8669 | for (i = 0; i < IEEE80211_NUM_BANDS; i++) { | ||
8670 | struct ieee80211_supported_band *sband; | ||
8671 | sband = local->hw.wiphy->bands[i]; | ||
8672 | diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c | ||
8673 | index 43e60b5..fab706f 100644 | ||
8674 | --- a/net/mac80211/scan.c | ||
8675 | +++ b/net/mac80211/scan.c | ||
8676 | @@ -819,9 +819,9 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, | ||
8677 | return res; | ||
8678 | } | ||
8679 | |||
8680 | -int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, | ||
8681 | - const u8 *ssid, u8 ssid_len, | ||
8682 | - struct ieee80211_channel *chan) | ||
8683 | +int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, | ||
8684 | + const u8 *ssid, u8 ssid_len, | ||
8685 | + struct ieee80211_channel *chan) | ||
8686 | { | ||
8687 | struct ieee80211_local *local = sdata->local; | ||
8688 | int ret = -EBUSY; | ||
8689 | @@ -835,22 +835,36 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, | ||
8690 | |||
8691 | /* fill internal scan request */ | ||
8692 | if (!chan) { | ||
8693 | - int i, nchan = 0; | ||
8694 | + int i, max_n; | ||
8695 | + int n_ch = 0; | ||
8696 | |||
8697 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { | ||
8698 | if (!local->hw.wiphy->bands[band]) | ||
8699 | continue; | ||
8700 | - for (i = 0; | ||
8701 | - i < local->hw.wiphy->bands[band]->n_channels; | ||
8702 | - i++) { | ||
8703 | - local->int_scan_req->channels[nchan] = | ||
8704 | + | ||
8705 | + max_n = local->hw.wiphy->bands[band]->n_channels; | ||
8706 | + for (i = 0; i < max_n; i++) { | ||
8707 | + struct ieee80211_channel *tmp_ch = | ||
8708 | &local->hw.wiphy->bands[band]->channels[i]; | ||
8709 | - nchan++; | ||
8710 | + | ||
8711 | + if (tmp_ch->flags & (IEEE80211_CHAN_NO_IBSS | | ||
8712 | + IEEE80211_CHAN_DISABLED)) | ||
8713 | + continue; | ||
8714 | + | ||
8715 | + local->int_scan_req->channels[n_ch] = tmp_ch; | ||
8716 | + n_ch++; | ||
8717 | } | ||
8718 | } | ||
8719 | |||
8720 | - local->int_scan_req->n_channels = nchan; | ||
8721 | + if (WARN_ON_ONCE(n_ch == 0)) | ||
8722 | + goto unlock; | ||
8723 | + | ||
8724 | + local->int_scan_req->n_channels = n_ch; | ||
8725 | } else { | ||
8726 | + if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS | | ||
8727 | + IEEE80211_CHAN_DISABLED))) | ||
8728 | + goto unlock; | ||
8729 | + | ||
8730 | local->int_scan_req->channels[0] = chan; | ||
8731 | local->int_scan_req->n_channels = 1; | ||
8732 | } | ||
8733 | diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c | ||
8734 | index d2eb64e..8a9931b 100644 | ||
8735 | --- a/net/mac80211/sta_info.c | ||
8736 | +++ b/net/mac80211/sta_info.c | ||
8737 | @@ -91,9 +91,8 @@ static int sta_info_hash_del(struct ieee80211_local *local, | ||
8738 | return -ENOENT; | ||
8739 | } | ||
8740 | |||
8741 | -static void free_sta_work(struct work_struct *wk) | ||
8742 | +static void cleanup_single_sta(struct sta_info *sta) | ||
8743 | { | ||
8744 | - struct sta_info *sta = container_of(wk, struct sta_info, free_sta_wk); | ||
8745 | int ac, i; | ||
8746 | struct tid_ampdu_tx *tid_tx; | ||
8747 | struct ieee80211_sub_if_data *sdata = sta->sdata; | ||
8748 | @@ -148,11 +147,35 @@ static void free_sta_work(struct work_struct *wk) | ||
8749 | sta_info_free(local, sta); | ||
8750 | } | ||
8751 | |||
8752 | +void ieee80211_cleanup_sdata_stas(struct ieee80211_sub_if_data *sdata) | ||
8753 | +{ | ||
8754 | + struct sta_info *sta; | ||
8755 | + | ||
8756 | + spin_lock_bh(&sdata->cleanup_stations_lock); | ||
8757 | + while (!list_empty(&sdata->cleanup_stations)) { | ||
8758 | + sta = list_first_entry(&sdata->cleanup_stations, | ||
8759 | + struct sta_info, list); | ||
8760 | + list_del(&sta->list); | ||
8761 | + spin_unlock_bh(&sdata->cleanup_stations_lock); | ||
8762 | + | ||
8763 | + cleanup_single_sta(sta); | ||
8764 | + | ||
8765 | + spin_lock_bh(&sdata->cleanup_stations_lock); | ||
8766 | + } | ||
8767 | + | ||
8768 | + spin_unlock_bh(&sdata->cleanup_stations_lock); | ||
8769 | +} | ||
8770 | + | ||
8771 | static void free_sta_rcu(struct rcu_head *h) | ||
8772 | { | ||
8773 | struct sta_info *sta = container_of(h, struct sta_info, rcu_head); | ||
8774 | + struct ieee80211_sub_if_data *sdata = sta->sdata; | ||
8775 | |||
8776 | - ieee80211_queue_work(&sta->local->hw, &sta->free_sta_wk); | ||
8777 | + spin_lock(&sdata->cleanup_stations_lock); | ||
8778 | + list_add_tail(&sta->list, &sdata->cleanup_stations); | ||
8779 | + spin_unlock(&sdata->cleanup_stations_lock); | ||
8780 | + | ||
8781 | + ieee80211_queue_work(&sdata->local->hw, &sdata->cleanup_stations_wk); | ||
8782 | } | ||
8783 | |||
8784 | /* protected by RCU */ | ||
8785 | @@ -305,7 +328,6 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, | ||
8786 | |||
8787 | spin_lock_init(&sta->lock); | ||
8788 | INIT_WORK(&sta->drv_unblock_wk, sta_unblock); | ||
8789 | - INIT_WORK(&sta->free_sta_wk, free_sta_work); | ||
8790 | INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work); | ||
8791 | mutex_init(&sta->ampdu_mlme.mtx); | ||
8792 | |||
8793 | @@ -848,7 +870,7 @@ void sta_info_init(struct ieee80211_local *local) | ||
8794 | |||
8795 | void sta_info_stop(struct ieee80211_local *local) | ||
8796 | { | ||
8797 | - del_timer(&local->sta_cleanup); | ||
8798 | + del_timer_sync(&local->sta_cleanup); | ||
8799 | sta_info_flush(local, NULL); | ||
8800 | } | ||
8801 | |||
8802 | @@ -877,6 +899,20 @@ int sta_info_flush(struct ieee80211_local *local, | ||
8803 | } | ||
8804 | mutex_unlock(&local->sta_mtx); | ||
8805 | |||
8806 | + rcu_barrier(); | ||
8807 | + | ||
8808 | + if (sdata) { | ||
8809 | + ieee80211_cleanup_sdata_stas(sdata); | ||
8810 | + cancel_work_sync(&sdata->cleanup_stations_wk); | ||
8811 | + } else { | ||
8812 | + mutex_lock(&local->iflist_mtx); | ||
8813 | + list_for_each_entry(sdata, &local->interfaces, list) { | ||
8814 | + ieee80211_cleanup_sdata_stas(sdata); | ||
8815 | + cancel_work_sync(&sdata->cleanup_stations_wk); | ||
8816 | + } | ||
8817 | + mutex_unlock(&local->iflist_mtx); | ||
8818 | + } | ||
8819 | + | ||
8820 | return ret; | ||
8821 | } | ||
8822 | |||
8823 | diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h | ||
8824 | index c88f161f..3c4c0f6 100644 | ||
8825 | --- a/net/mac80211/sta_info.h | ||
8826 | +++ b/net/mac80211/sta_info.h | ||
8827 | @@ -298,7 +298,6 @@ struct sta_info { | ||
8828 | spinlock_t lock; | ||
8829 | |||
8830 | struct work_struct drv_unblock_wk; | ||
8831 | - struct work_struct free_sta_wk; | ||
8832 | |||
8833 | u16 listen_interval; | ||
8834 | |||
8835 | @@ -558,4 +557,6 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta); | ||
8836 | void ieee80211_sta_ps_deliver_poll_response(struct sta_info *sta); | ||
8837 | void ieee80211_sta_ps_deliver_uapsd(struct sta_info *sta); | ||
8838 | |||
8839 | +void ieee80211_cleanup_sdata_stas(struct ieee80211_sub_if_data *sdata); | ||
8840 | + | ||
8841 | #endif /* STA_INFO_H */ | ||
8842 | diff --git a/net/mac80211/status.c b/net/mac80211/status.c | ||
8843 | index 101eb88..c511e9c 100644 | ||
8844 | --- a/net/mac80211/status.c | ||
8845 | +++ b/net/mac80211/status.c | ||
8846 | @@ -432,7 +432,11 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | ||
8847 | IEEE80211_BAR_CTRL_TID_INFO_MASK) >> | ||
8848 | IEEE80211_BAR_CTRL_TID_INFO_SHIFT; | ||
8849 | |||
8850 | - ieee80211_set_bar_pending(sta, tid, ssn); | ||
8851 | + if (local->hw.flags & | ||
8852 | + IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL) | ||
8853 | + ieee80211_stop_tx_ba_session(&sta->sta, tid); | ||
8854 | + else | ||
8855 | + ieee80211_set_bar_pending(sta, tid, ssn); | ||
8856 | } | ||
8857 | } | ||
8858 | |||
8859 | diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c | ||
8860 | index cdc7564..10b18b2 100644 | ||
8861 | --- a/net/sunrpc/clnt.c | ||
8862 | +++ b/net/sunrpc/clnt.c | ||
8863 | @@ -234,7 +234,7 @@ static struct rpc_clnt *rpc_get_client_for_event(struct net *net, int event) | ||
8864 | spin_lock(&sn->rpc_client_lock); | ||
8865 | list_for_each_entry(clnt, &sn->all_clients, cl_clients) { | ||
8866 | if (clnt->cl_program->pipe_dir_name == NULL) | ||
8867 | - break; | ||
8868 | + continue; | ||
8869 | if (rpc_clnt_skip_event(clnt, event)) | ||
8870 | continue; | ||
8871 | if (atomic_inc_not_zero(&clnt->cl_count) == 0) | ||
8872 | diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c | ||
8873 | index 80f5dd2..e659def 100644 | ||
8874 | --- a/net/sunrpc/rpc_pipe.c | ||
8875 | +++ b/net/sunrpc/rpc_pipe.c | ||
8876 | @@ -1152,14 +1152,19 @@ static void rpc_kill_sb(struct super_block *sb) | ||
8877 | struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); | ||
8878 | |||
8879 | mutex_lock(&sn->pipefs_sb_lock); | ||
8880 | + if (sn->pipefs_sb != sb) { | ||
8881 | + mutex_unlock(&sn->pipefs_sb_lock); | ||
8882 | + goto out; | ||
8883 | + } | ||
8884 | sn->pipefs_sb = NULL; | ||
8885 | mutex_unlock(&sn->pipefs_sb_lock); | ||
8886 | - put_net(net); | ||
8887 | dprintk("RPC: sending pipefs UMOUNT notification for net %p%s\n", | ||
8888 | net, NET_NAME(net)); | ||
8889 | blocking_notifier_call_chain(&rpc_pipefs_notifier_list, | ||
8890 | RPC_PIPEFS_UMOUNT, | ||
8891 | sb); | ||
8892 | + put_net(net); | ||
8893 | +out: | ||
8894 | kill_litter_super(sb); | ||
8895 | } | ||
8896 | |||
8897 | diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c | ||
8898 | index 6357fcb..7865b44 100644 | ||
8899 | --- a/net/sunrpc/sched.c | ||
8900 | +++ b/net/sunrpc/sched.c | ||
8901 | @@ -919,16 +919,35 @@ struct rpc_task *rpc_new_task(const struct rpc_task_setup *setup_data) | ||
8902 | return task; | ||
8903 | } | ||
8904 | |||
8905 | +/* | ||
8906 | + * rpc_free_task - release rpc task and perform cleanups | ||
8907 | + * | ||
8908 | + * Note that we free up the rpc_task _after_ rpc_release_calldata() | ||
8909 | + * in order to work around a workqueue dependency issue. | ||
8910 | + * | ||
8911 | + * Tejun Heo states: | ||
8912 | + * "Workqueue currently considers two work items to be the same if they're | ||
8913 | + * on the same address and won't execute them concurrently - ie. it | ||
8914 | + * makes a work item which is queued again while being executed wait | ||
8915 | + * for the previous execution to complete. | ||
8916 | + * | ||
8917 | + * If a work function frees the work item, and then waits for an event | ||
8918 | + * which should be performed by another work item and *that* work item | ||
8919 | + * recycles the freed work item, it can create a false dependency loop. | ||
8920 | + * There really is no reliable way to detect this short of verifying | ||
8921 | + * every memory free." | ||
8922 | + * | ||
8923 | + */ | ||
8924 | static void rpc_free_task(struct rpc_task *task) | ||
8925 | { | ||
8926 | - const struct rpc_call_ops *tk_ops = task->tk_ops; | ||
8927 | - void *calldata = task->tk_calldata; | ||
8928 | + unsigned short tk_flags = task->tk_flags; | ||
8929 | + | ||
8930 | + rpc_release_calldata(task->tk_ops, task->tk_calldata); | ||
8931 | |||
8932 | - if (task->tk_flags & RPC_TASK_DYNAMIC) { | ||
8933 | + if (tk_flags & RPC_TASK_DYNAMIC) { | ||
8934 | dprintk("RPC: %5u freeing task\n", task->tk_pid); | ||
8935 | mempool_free(task, rpc_task_mempool); | ||
8936 | } | ||
8937 | - rpc_release_calldata(tk_ops, calldata); | ||
8938 | } | ||
8939 | |||
8940 | static void rpc_async_release(struct work_struct *work) | ||
8941 | @@ -938,8 +957,7 @@ static void rpc_async_release(struct work_struct *work) | ||
8942 | |||
8943 | static void rpc_release_resources_task(struct rpc_task *task) | ||
8944 | { | ||
8945 | - if (task->tk_rqstp) | ||
8946 | - xprt_release(task); | ||
8947 | + xprt_release(task); | ||
8948 | if (task->tk_msg.rpc_cred) { | ||
8949 | put_rpccred(task->tk_msg.rpc_cred); | ||
8950 | task->tk_msg.rpc_cred = NULL; | ||
8951 | diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c | ||
8952 | index bd462a5..33811db 100644 | ||
8953 | --- a/net/sunrpc/xprt.c | ||
8954 | +++ b/net/sunrpc/xprt.c | ||
8955 | @@ -1136,10 +1136,18 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt) | ||
8956 | void xprt_release(struct rpc_task *task) | ||
8957 | { | ||
8958 | struct rpc_xprt *xprt; | ||
8959 | - struct rpc_rqst *req; | ||
8960 | + struct rpc_rqst *req = task->tk_rqstp; | ||
8961 | |||
8962 | - if (!(req = task->tk_rqstp)) | ||
8963 | + if (req == NULL) { | ||
8964 | + if (task->tk_client) { | ||
8965 | + rcu_read_lock(); | ||
8966 | + xprt = rcu_dereference(task->tk_client->cl_xprt); | ||
8967 | + if (xprt->snd_task == task) | ||
8968 | + xprt_release_write(xprt, task); | ||
8969 | + rcu_read_unlock(); | ||
8970 | + } | ||
8971 | return; | ||
8972 | + } | ||
8973 | |||
8974 | xprt = req->rq_xprt; | ||
8975 | if (task->tk_ops->rpc_count_stats != NULL) | ||
8976 | diff --git a/sound/arm/pxa2xx-ac97-lib.c b/sound/arm/pxa2xx-ac97-lib.c | ||
8977 | index 48d7c0a..bd3ba88 100644 | ||
8978 | --- a/sound/arm/pxa2xx-ac97-lib.c | ||
8979 | +++ b/sound/arm/pxa2xx-ac97-lib.c | ||
8980 | @@ -18,6 +18,7 @@ | ||
8981 | #include <linux/delay.h> | ||
8982 | #include <linux/module.h> | ||
8983 | #include <linux/io.h> | ||
8984 | +#include <linux/gpio.h> | ||
8985 | |||
8986 | #include <sound/ac97_codec.h> | ||
8987 | #include <sound/pxa2xx-lib.h> | ||
8988 | @@ -148,6 +149,8 @@ static inline void pxa_ac97_warm_pxa27x(void) | ||
8989 | |||
8990 | static inline void pxa_ac97_cold_pxa27x(void) | ||
8991 | { | ||
8992 | + unsigned int timeout; | ||
8993 | + | ||
8994 | GCR &= GCR_COLD_RST; /* clear everything but nCRST */ | ||
8995 | GCR &= ~GCR_COLD_RST; /* then assert nCRST */ | ||
8996 | |||
8997 | @@ -157,8 +160,10 @@ static inline void pxa_ac97_cold_pxa27x(void) | ||
8998 | clk_enable(ac97conf_clk); | ||
8999 | udelay(5); | ||
9000 | clk_disable(ac97conf_clk); | ||
9001 | - GCR = GCR_COLD_RST; | ||
9002 | - udelay(50); | ||
9003 | + GCR = GCR_COLD_RST | GCR_WARM_RST; | ||
9004 | + timeout = 100; /* wait for the codec-ready bit to be set */ | ||
9005 | + while (!((GSR | gsr_bits) & (GSR_PCR | GSR_SCR)) && timeout--) | ||
9006 | + mdelay(1); | ||
9007 | } | ||
9008 | #endif | ||
9009 | |||
9010 | @@ -340,8 +345,21 @@ int __devinit pxa2xx_ac97_hw_probe(struct platform_device *dev) | ||
9011 | } | ||
9012 | |||
9013 | if (cpu_is_pxa27x()) { | ||
9014 | - /* Use GPIO 113 as AC97 Reset on Bulverde */ | ||
9015 | + /* | ||
9016 | + * This gpio is needed for a work-around to a bug in the ac97 | ||
9017 | + * controller during warm reset. The direction and level is set | ||
9018 | + * here so that it is an output driven high when switching from | ||
9019 | + * AC97_nRESET alt function to generic gpio. | ||
9020 | + */ | ||
9021 | + ret = gpio_request_one(reset_gpio, GPIOF_OUT_INIT_HIGH, | ||
9022 | + "pxa27x ac97 reset"); | ||
9023 | + if (ret < 0) { | ||
9024 | + pr_err("%s: gpio_request_one() failed: %d\n", | ||
9025 | + __func__, ret); | ||
9026 | + goto err_conf; | ||
9027 | + } | ||
9028 | pxa27x_assert_ac97reset(reset_gpio, 0); | ||
9029 | + | ||
9030 | ac97conf_clk = clk_get(&dev->dev, "AC97CONFCLK"); | ||
9031 | if (IS_ERR(ac97conf_clk)) { | ||
9032 | ret = PTR_ERR(ac97conf_clk); | ||
9033 | @@ -384,6 +402,8 @@ EXPORT_SYMBOL_GPL(pxa2xx_ac97_hw_probe); | ||
9034 | |||
9035 | void pxa2xx_ac97_hw_remove(struct platform_device *dev) | ||
9036 | { | ||
9037 | + if (cpu_is_pxa27x()) | ||
9038 | + gpio_free(reset_gpio); | ||
9039 | GCR |= GCR_ACLINK_OFF; | ||
9040 | free_irq(IRQ_AC97, NULL); | ||
9041 | if (ac97conf_clk) { | ||
9042 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
9043 | index a9652d6..f419f0a9 100644 | ||
9044 | --- a/sound/pci/hda/hda_intel.c | ||
9045 | +++ b/sound/pci/hda/hda_intel.c | ||
9046 | @@ -559,9 +559,12 @@ enum { | ||
9047 | #define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */ | ||
9048 | |||
9049 | /* quirks for Intel PCH */ | ||
9050 | -#define AZX_DCAPS_INTEL_PCH \ | ||
9051 | +#define AZX_DCAPS_INTEL_PCH_NOPM \ | ||
9052 | (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \ | ||
9053 | - AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME) | ||
9054 | + AZX_DCAPS_COUNT_LPIB_DELAY) | ||
9055 | + | ||
9056 | +#define AZX_DCAPS_INTEL_PCH \ | ||
9057 | + (AZX_DCAPS_INTEL_PCH_NOPM | AZX_DCAPS_PM_RUNTIME) | ||
9058 | |||
9059 | /* quirks for ATI SB / AMD Hudson */ | ||
9060 | #define AZX_DCAPS_PRESET_ATI_SB \ | ||
9061 | @@ -3448,13 +3451,13 @@ static void __devexit azx_remove(struct pci_dev *pci) | ||
9062 | static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | ||
9063 | /* CPT */ | ||
9064 | { PCI_DEVICE(0x8086, 0x1c20), | ||
9065 | - .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, | ||
9066 | + .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM }, | ||
9067 | /* PBG */ | ||
9068 | { PCI_DEVICE(0x8086, 0x1d20), | ||
9069 | - .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, | ||
9070 | + .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM }, | ||
9071 | /* Panther Point */ | ||
9072 | { PCI_DEVICE(0x8086, 0x1e20), | ||
9073 | - .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, | ||
9074 | + .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH_NOPM }, | ||
9075 | /* Lynx Point */ | ||
9076 | { PCI_DEVICE(0x8086, 0x8c20), | ||
9077 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, | ||
9078 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c | ||
9079 | index a7b522a..8799cf1 100644 | ||
9080 | --- a/sound/pci/hda/patch_conexant.c | ||
9081 | +++ b/sound/pci/hda/patch_conexant.c | ||
9082 | @@ -553,24 +553,12 @@ static int conexant_build_controls(struct hda_codec *codec) | ||
9083 | return 0; | ||
9084 | } | ||
9085 | |||
9086 | -#ifdef CONFIG_PM | ||
9087 | -static int conexant_suspend(struct hda_codec *codec) | ||
9088 | -{ | ||
9089 | - snd_hda_shutup_pins(codec); | ||
9090 | - return 0; | ||
9091 | -} | ||
9092 | -#endif | ||
9093 | - | ||
9094 | static const struct hda_codec_ops conexant_patch_ops = { | ||
9095 | .build_controls = conexant_build_controls, | ||
9096 | .build_pcms = conexant_build_pcms, | ||
9097 | .init = conexant_init, | ||
9098 | .free = conexant_free, | ||
9099 | .set_power_state = conexant_set_power, | ||
9100 | -#ifdef CONFIG_PM | ||
9101 | - .suspend = conexant_suspend, | ||
9102 | -#endif | ||
9103 | - .reboot_notify = snd_hda_shutup_pins, | ||
9104 | }; | ||
9105 | |||
9106 | #ifdef CONFIG_SND_HDA_INPUT_BEEP | ||
9107 | @@ -4393,10 +4381,6 @@ static const struct hda_codec_ops cx_auto_patch_ops = { | ||
9108 | .init = cx_auto_init, | ||
9109 | .free = conexant_free, | ||
9110 | .unsol_event = snd_hda_jack_unsol_event, | ||
9111 | -#ifdef CONFIG_PM | ||
9112 | - .suspend = conexant_suspend, | ||
9113 | -#endif | ||
9114 | - .reboot_notify = snd_hda_shutup_pins, | ||
9115 | }; | ||
9116 | |||
9117 | /* | ||
9118 | diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c | ||
9119 | index 054967d..08ae3cb 100644 | ||
9120 | --- a/sound/soc/codecs/arizona.c | ||
9121 | +++ b/sound/soc/codecs/arizona.c | ||
9122 | @@ -409,15 +409,9 @@ static int arizona_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
9123 | case SND_SOC_DAIFMT_DSP_A: | ||
9124 | mode = 0; | ||
9125 | break; | ||
9126 | - case SND_SOC_DAIFMT_DSP_B: | ||
9127 | - mode = 1; | ||
9128 | - break; | ||
9129 | case SND_SOC_DAIFMT_I2S: | ||
9130 | mode = 2; | ||
9131 | break; | ||
9132 | - case SND_SOC_DAIFMT_LEFT_J: | ||
9133 | - mode = 3; | ||
9134 | - break; | ||
9135 | default: | ||
9136 | arizona_aif_err(dai, "Unsupported DAI format %d\n", | ||
9137 | fmt & SND_SOC_DAIFMT_FORMAT_MASK); | ||
9138 | @@ -677,7 +671,8 @@ static int arizona_hw_params(struct snd_pcm_substream *substream, | ||
9139 | snd_soc_update_bits(codec, ARIZONA_ASYNC_SAMPLE_RATE_1, | ||
9140 | ARIZONA_ASYNC_SAMPLE_RATE_MASK, sr_val); | ||
9141 | snd_soc_update_bits(codec, base + ARIZONA_AIF_RATE_CTRL, | ||
9142 | - ARIZONA_AIF1_RATE_MASK, 8); | ||
9143 | + ARIZONA_AIF1_RATE_MASK, | ||
9144 | + 8 << ARIZONA_AIF1_RATE_SHIFT); | ||
9145 | break; | ||
9146 | default: | ||
9147 | arizona_aif_err(dai, "Invalid clock %d\n", dai_priv->clk); | ||
9148 | diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h | ||
9149 | index 36ec649..cff8dfb 100644 | ||
9150 | --- a/sound/soc/codecs/arizona.h | ||
9151 | +++ b/sound/soc/codecs/arizona.h | ||
9152 | @@ -32,15 +32,15 @@ | ||
9153 | |||
9154 | #define ARIZONA_FLL_SRC_MCLK1 0 | ||
9155 | #define ARIZONA_FLL_SRC_MCLK2 1 | ||
9156 | -#define ARIZONA_FLL_SRC_SLIMCLK 2 | ||
9157 | -#define ARIZONA_FLL_SRC_FLL1 3 | ||
9158 | -#define ARIZONA_FLL_SRC_FLL2 4 | ||
9159 | -#define ARIZONA_FLL_SRC_AIF1BCLK 5 | ||
9160 | -#define ARIZONA_FLL_SRC_AIF2BCLK 6 | ||
9161 | -#define ARIZONA_FLL_SRC_AIF3BCLK 7 | ||
9162 | -#define ARIZONA_FLL_SRC_AIF1LRCLK 8 | ||
9163 | -#define ARIZONA_FLL_SRC_AIF2LRCLK 9 | ||
9164 | -#define ARIZONA_FLL_SRC_AIF3LRCLK 10 | ||
9165 | +#define ARIZONA_FLL_SRC_SLIMCLK 3 | ||
9166 | +#define ARIZONA_FLL_SRC_FLL1 4 | ||
9167 | +#define ARIZONA_FLL_SRC_FLL2 5 | ||
9168 | +#define ARIZONA_FLL_SRC_AIF1BCLK 8 | ||
9169 | +#define ARIZONA_FLL_SRC_AIF2BCLK 9 | ||
9170 | +#define ARIZONA_FLL_SRC_AIF3BCLK 10 | ||
9171 | +#define ARIZONA_FLL_SRC_AIF1LRCLK 12 | ||
9172 | +#define ARIZONA_FLL_SRC_AIF2LRCLK 13 | ||
9173 | +#define ARIZONA_FLL_SRC_AIF3LRCLK 14 | ||
9174 | |||
9175 | #define ARIZONA_MIXER_VOL_MASK 0x00FE | ||
9176 | #define ARIZONA_MIXER_VOL_SHIFT 1 | ||
9177 | diff --git a/sound/soc/codecs/sigmadsp.c b/sound/soc/codecs/sigmadsp.c | ||
9178 | index 5be42bf..4068f24 100644 | ||
9179 | --- a/sound/soc/codecs/sigmadsp.c | ||
9180 | +++ b/sound/soc/codecs/sigmadsp.c | ||
9181 | @@ -225,7 +225,7 @@ EXPORT_SYMBOL(process_sigma_firmware); | ||
9182 | static int sigma_action_write_regmap(void *control_data, | ||
9183 | const struct sigma_action *sa, size_t len) | ||
9184 | { | ||
9185 | - return regmap_raw_write(control_data, le16_to_cpu(sa->addr), | ||
9186 | + return regmap_raw_write(control_data, be16_to_cpu(sa->addr), | ||
9187 | sa->payload, len - 2); | ||
9188 | } | ||
9189 | |||
9190 | diff --git a/sound/soc/codecs/sta529.c b/sound/soc/codecs/sta529.c | ||
9191 | index 9e31448..18171ad 100644 | ||
9192 | --- a/sound/soc/codecs/sta529.c | ||
9193 | +++ b/sound/soc/codecs/sta529.c | ||
9194 | @@ -74,9 +74,10 @@ | ||
9195 | SNDRV_PCM_FMTBIT_S32_LE) | ||
9196 | #define S2PC_VALUE 0x98 | ||
9197 | #define CLOCK_OUT 0x60 | ||
9198 | -#define LEFT_J_DATA_FORMAT 0x10 | ||
9199 | -#define I2S_DATA_FORMAT 0x12 | ||
9200 | -#define RIGHT_J_DATA_FORMAT 0x14 | ||
9201 | +#define DATA_FORMAT_MSK 0x0E | ||
9202 | +#define LEFT_J_DATA_FORMAT 0x00 | ||
9203 | +#define I2S_DATA_FORMAT 0x02 | ||
9204 | +#define RIGHT_J_DATA_FORMAT 0x04 | ||
9205 | #define CODEC_MUTE_VAL 0x80 | ||
9206 | |||
9207 | #define POWER_CNTLMSAK 0x40 | ||
9208 | @@ -289,7 +290,7 @@ static int sta529_set_dai_fmt(struct snd_soc_dai *codec_dai, u32 fmt) | ||
9209 | return -EINVAL; | ||
9210 | } | ||
9211 | |||
9212 | - snd_soc_update_bits(codec, STA529_S2PCFG0, 0x0D, mode); | ||
9213 | + snd_soc_update_bits(codec, STA529_S2PCFG0, DATA_FORMAT_MSK, mode); | ||
9214 | |||
9215 | return 0; | ||
9216 | } | ||
9217 | diff --git a/sound/soc/codecs/wm2000.c b/sound/soc/codecs/wm2000.c | ||
9218 | index 683dc43..cdab549 100644 | ||
9219 | --- a/sound/soc/codecs/wm2000.c | ||
9220 | +++ b/sound/soc/codecs/wm2000.c | ||
9221 | @@ -209,9 +209,9 @@ static int wm2000_power_up(struct i2c_client *i2c, int analogue) | ||
9222 | |||
9223 | ret = wm2000_read(i2c, WM2000_REG_SPEECH_CLARITY); | ||
9224 | if (wm2000->speech_clarity) | ||
9225 | - ret &= ~WM2000_SPEECH_CLARITY; | ||
9226 | - else | ||
9227 | ret |= WM2000_SPEECH_CLARITY; | ||
9228 | + else | ||
9229 | + ret &= ~WM2000_SPEECH_CLARITY; | ||
9230 | wm2000_write(i2c, WM2000_REG_SPEECH_CLARITY, ret); | ||
9231 | |||
9232 | wm2000_write(i2c, WM2000_REG_SYS_START0, 0x33); | ||
9233 | diff --git a/sound/soc/codecs/wm2200.c b/sound/soc/codecs/wm2200.c | ||
9234 | index eab64a1..7ef4e96 100644 | ||
9235 | --- a/sound/soc/codecs/wm2200.c | ||
9236 | +++ b/sound/soc/codecs/wm2200.c | ||
9237 | @@ -1380,15 +1380,9 @@ static int wm2200_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
9238 | case SND_SOC_DAIFMT_DSP_A: | ||
9239 | fmt_val = 0; | ||
9240 | break; | ||
9241 | - case SND_SOC_DAIFMT_DSP_B: | ||
9242 | - fmt_val = 1; | ||
9243 | - break; | ||
9244 | case SND_SOC_DAIFMT_I2S: | ||
9245 | fmt_val = 2; | ||
9246 | break; | ||
9247 | - case SND_SOC_DAIFMT_LEFT_J: | ||
9248 | - fmt_val = 3; | ||
9249 | - break; | ||
9250 | default: | ||
9251 | dev_err(codec->dev, "Unsupported DAI format %d\n", | ||
9252 | fmt & SND_SOC_DAIFMT_FORMAT_MASK); | ||
9253 | @@ -1440,7 +1434,7 @@ static int wm2200_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
9254 | WM2200_AIF1TX_LRCLK_MSTR | WM2200_AIF1TX_LRCLK_INV, | ||
9255 | lrclk); | ||
9256 | snd_soc_update_bits(codec, WM2200_AUDIO_IF_1_5, | ||
9257 | - WM2200_AIF1_FMT_MASK << 1, fmt_val << 1); | ||
9258 | + WM2200_AIF1_FMT_MASK, fmt_val); | ||
9259 | |||
9260 | return 0; | ||
9261 | } | ||
9262 | diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c | ||
9263 | index 7f56758..a351ca0 100644 | ||
9264 | --- a/sound/soc/codecs/wm5100.c | ||
9265 | +++ b/sound/soc/codecs/wm5100.c | ||
9266 | @@ -1279,15 +1279,9 @@ static int wm5100_set_fmt(struct snd_soc_dai *dai, unsigned int fmt) | ||
9267 | case SND_SOC_DAIFMT_DSP_A: | ||
9268 | mask = 0; | ||
9269 | break; | ||
9270 | - case SND_SOC_DAIFMT_DSP_B: | ||
9271 | - mask = 1; | ||
9272 | - break; | ||
9273 | case SND_SOC_DAIFMT_I2S: | ||
9274 | mask = 2; | ||
9275 | break; | ||
9276 | - case SND_SOC_DAIFMT_LEFT_J: | ||
9277 | - mask = 3; | ||
9278 | - break; | ||
9279 | default: | ||
9280 | dev_err(codec->dev, "Unsupported DAI format %d\n", | ||
9281 | fmt & SND_SOC_DAIFMT_FORMAT_MASK); | ||
9282 | diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c | ||
9283 | index b2b2b37..1c2b337 100644 | ||
9284 | --- a/sound/soc/codecs/wm8994.c | ||
9285 | +++ b/sound/soc/codecs/wm8994.c | ||
9286 | @@ -3839,20 +3839,8 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec) | ||
9287 | wm8994->hubs.no_cache_dac_hp_direct = true; | ||
9288 | wm8994->fll_byp = true; | ||
9289 | |||
9290 | - switch (control->cust_id) { | ||
9291 | - case 0: | ||
9292 | - case 2: | ||
9293 | - wm8994->hubs.dcs_codes_l = -9; | ||
9294 | - wm8994->hubs.dcs_codes_r = -7; | ||
9295 | - break; | ||
9296 | - case 1: | ||
9297 | - case 3: | ||
9298 | - wm8994->hubs.dcs_codes_l = -8; | ||
9299 | - wm8994->hubs.dcs_codes_r = -7; | ||
9300 | - break; | ||
9301 | - default: | ||
9302 | - break; | ||
9303 | - } | ||
9304 | + wm8994->hubs.dcs_codes_l = -9; | ||
9305 | + wm8994->hubs.dcs_codes_r = -7; | ||
9306 | |||
9307 | snd_soc_update_bits(codec, WM8994_ANALOGUE_HP_1, | ||
9308 | WM1811_HPOUT1_ATTN, WM1811_HPOUT1_ATTN); | ||
9309 | diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c | ||
9310 | index ef22d0b..d340644 100644 | ||
9311 | --- a/sound/soc/soc-pcm.c | ||
9312 | +++ b/sound/soc/soc-pcm.c | ||
9313 | @@ -1240,6 +1240,7 @@ static int dpcm_be_dai_hw_free(struct snd_soc_pcm_runtime *fe, int stream) | ||
9314 | if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_PARAMS) && | ||
9315 | (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) && | ||
9316 | (be->dpcm[stream].state != SND_SOC_DPCM_STATE_HW_FREE) && | ||
9317 | + (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED) && | ||
9318 | (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP)) | ||
9319 | continue; | ||
9320 | |||
9321 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c | ||
9322 | index be70035..6e8fa7e 100644 | ||
9323 | --- a/virt/kvm/kvm_main.c | ||
9324 | +++ b/virt/kvm/kvm_main.c | ||
9325 | @@ -709,8 +709,7 @@ int __kvm_set_memory_region(struct kvm *kvm, | ||
9326 | int r; | ||
9327 | gfn_t base_gfn; | ||
9328 | unsigned long npages; | ||
9329 | - unsigned long i; | ||
9330 | - struct kvm_memory_slot *memslot; | ||
9331 | + struct kvm_memory_slot *memslot, *slot; | ||
9332 | struct kvm_memory_slot old, new; | ||
9333 | struct kvm_memslots *slots, *old_memslots; | ||
9334 | |||
9335 | @@ -761,13 +760,11 @@ int __kvm_set_memory_region(struct kvm *kvm, | ||
9336 | |||
9337 | /* Check for overlaps */ | ||
9338 | r = -EEXIST; | ||
9339 | - for (i = 0; i < KVM_MEMORY_SLOTS; ++i) { | ||
9340 | - struct kvm_memory_slot *s = &kvm->memslots->memslots[i]; | ||
9341 | - | ||
9342 | - if (s == memslot || !s->npages) | ||
9343 | + kvm_for_each_memslot(slot, kvm->memslots) { | ||
9344 | + if (slot->id >= KVM_MEMORY_SLOTS || slot == memslot) | ||
9345 | continue; | ||
9346 | - if (!((base_gfn + npages <= s->base_gfn) || | ||
9347 | - (base_gfn >= s->base_gfn + s->npages))) | ||
9348 | + if (!((base_gfn + npages <= slot->base_gfn) || | ||
9349 | + (base_gfn >= slot->base_gfn + slot->npages))) | ||
9350 | goto out_free; | ||
9351 | } | ||
9352 |