Contents of /trunk/kernel-magellan/patches-3.7/0102-3.7.3-all-fixes.patch
Parent Directory | Revision Log
Revision 2049 -
(show annotations)
(download)
Mon Jan 28 09:30:34 2013 UTC (11 years, 8 months ago) by niro
File size: 329182 byte(s)
Mon Jan 28 09:30:34 2013 UTC (11 years, 8 months ago) by niro
File size: 329182 byte(s)
-fixed patch
1 | 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 | diff --git a/Makefile b/Makefile |
24 | index 23807aa..51a9bda 100644 |
25 | --- a/Makefile |
26 | +++ b/Makefile |
27 | @@ -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 |