diff options
405 files changed, 2612 insertions, 1790 deletions
@@ -73,6 +73,7 @@ Juha Yrjola <juha.yrjola@nokia.com> | |||
73 | Juha Yrjola <juha.yrjola@solidboot.com> | 73 | Juha Yrjola <juha.yrjola@solidboot.com> |
74 | Kay Sievers <kay.sievers@vrfy.org> | 74 | Kay Sievers <kay.sievers@vrfy.org> |
75 | Kenneth W Chen <kenneth.w.chen@intel.com> | 75 | Kenneth W Chen <kenneth.w.chen@intel.com> |
76 | Konstantin Khlebnikov <koct9i@gmail.com> <k.khlebnikov@samsung.com> | ||
76 | Koushik <raghavendra.koushik@neterion.com> | 77 | Koushik <raghavendra.koushik@neterion.com> |
77 | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 78 | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
78 | Leonid I Ananiev <leonid.i.ananiev@intel.com> | 79 | Leonid I Ananiev <leonid.i.ananiev@intel.com> |
diff --git a/Documentation/acpi/enumeration.txt b/Documentation/acpi/enumeration.txt index b60d2ab69497..9b121a569ab4 100644 --- a/Documentation/acpi/enumeration.txt +++ b/Documentation/acpi/enumeration.txt | |||
@@ -243,7 +243,7 @@ input driver: | |||
243 | .owner = THIS_MODULE, | 243 | .owner = THIS_MODULE, |
244 | .pm = &mpu3050_pm, | 244 | .pm = &mpu3050_pm, |
245 | .of_match_table = mpu3050_of_match, | 245 | .of_match_table = mpu3050_of_match, |
246 | .acpi_match_table ACPI_PTR(mpu3050_acpi_match), | 246 | .acpi_match_table = ACPI_PTR(mpu3050_acpi_match), |
247 | }, | 247 | }, |
248 | .probe = mpu3050_probe, | 248 | .probe = mpu3050_probe, |
249 | .remove = mpu3050_remove, | 249 | .remove = mpu3050_remove, |
diff --git a/Documentation/networking/netlink_mmap.txt b/Documentation/networking/netlink_mmap.txt index c6af4bac5aa8..54f10478e8e3 100644 --- a/Documentation/networking/netlink_mmap.txt +++ b/Documentation/networking/netlink_mmap.txt | |||
@@ -199,16 +199,9 @@ frame header. | |||
199 | TX limitations | 199 | TX limitations |
200 | -------------- | 200 | -------------- |
201 | 201 | ||
202 | Kernel processing usually involves validation of the message received by | 202 | As of Jan 2015 the message is always copied from the ring frame to an |
203 | user-space, then processing its contents. The kernel must assure that | 203 | allocated buffer due to unresolved security concerns. |
204 | userspace is not able to modify the message contents after they have been | 204 | See commit 4682a0358639b29cf ("netlink: Always copy on mmap TX."). |
205 | validated. In order to do so, the message is copied from the ring frame | ||
206 | to an allocated buffer if either of these conditions is false: | ||
207 | |||
208 | - only a single mapping of the ring exists | ||
209 | - the file descriptor is not shared between processes | ||
210 | |||
211 | This means that for threaded programs, the kernel will fall back to copying. | ||
212 | 205 | ||
213 | Example | 206 | Example |
214 | ------- | 207 | ------- |
diff --git a/MAINTAINERS b/MAINTAINERS index aaa039dee999..a52ed9cfcbe4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -270,12 +270,12 @@ F: drivers/acpi/ | |||
270 | F: drivers/pnp/pnpacpi/ | 270 | F: drivers/pnp/pnpacpi/ |
271 | F: include/linux/acpi.h | 271 | F: include/linux/acpi.h |
272 | F: include/acpi/ | 272 | F: include/acpi/ |
273 | F: Documentation/acpi | 273 | F: Documentation/acpi/ |
274 | F: Documentation/ABI/testing/sysfs-bus-acpi | 274 | F: Documentation/ABI/testing/sysfs-bus-acpi |
275 | F: drivers/pci/*acpi* | 275 | F: drivers/pci/*acpi* |
276 | F: drivers/pci/*/*acpi* | 276 | F: drivers/pci/*/*acpi* |
277 | F: drivers/pci/*/*/*acpi* | 277 | F: drivers/pci/*/*/*acpi* |
278 | F: tools/power/acpi | 278 | F: tools/power/acpi/ |
279 | 279 | ||
280 | ACPI COMPONENT ARCHITECTURE (ACPICA) | 280 | ACPI COMPONENT ARCHITECTURE (ACPICA) |
281 | M: Robert Moore <robert.moore@intel.com> | 281 | M: Robert Moore <robert.moore@intel.com> |
@@ -4953,6 +4953,16 @@ F: Documentation/input/multi-touch-protocol.txt | |||
4953 | F: drivers/input/input-mt.c | 4953 | F: drivers/input/input-mt.c |
4954 | K: \b(ABS|SYN)_MT_ | 4954 | K: \b(ABS|SYN)_MT_ |
4955 | 4955 | ||
4956 | INTEL ASoC BDW/HSW DRIVERS | ||
4957 | M: Jie Yang <yang.jie@linux.intel.com> | ||
4958 | L: alsa-devel@alsa-project.org | ||
4959 | S: Supported | ||
4960 | F: sound/soc/intel/sst-haswell* | ||
4961 | F: sound/soc/intel/sst-dsp* | ||
4962 | F: sound/soc/intel/sst-firmware.c | ||
4963 | F: sound/soc/intel/broadwell.c | ||
4964 | F: sound/soc/intel/haswell.c | ||
4965 | |||
4956 | INTEL C600 SERIES SAS CONTROLLER DRIVER | 4966 | INTEL C600 SERIES SAS CONTROLLER DRIVER |
4957 | M: Intel SCU Linux support <intel-linux-scu@intel.com> | 4967 | M: Intel SCU Linux support <intel-linux-scu@intel.com> |
4958 | M: Artur Paszkiewicz <artur.paszkiewicz@intel.com> | 4968 | M: Artur Paszkiewicz <artur.paszkiewicz@intel.com> |
@@ -9241,7 +9251,6 @@ F: drivers/net/ethernet/dlink/sundance.c | |||
9241 | 9251 | ||
9242 | SUPERH | 9252 | SUPERH |
9243 | L: linux-sh@vger.kernel.org | 9253 | L: linux-sh@vger.kernel.org |
9244 | W: http://www.linux-sh.org | ||
9245 | Q: http://patchwork.kernel.org/project/linux-sh/list/ | 9254 | Q: http://patchwork.kernel.org/project/linux-sh/list/ |
9246 | S: Orphan | 9255 | S: Orphan |
9247 | F: Documentation/sh/ | 9256 | F: Documentation/sh/ |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 19 | 2 | PATCHLEVEL = 19 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc7 | 4 | EXTRAVERSION = |
5 | NAME = Diseased Newt | 5 | NAME = Diseased Newt |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 68be9017593d..132c70e2d2f1 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
@@ -263,16 +263,37 @@ restart: adr r0, LC0 | |||
263 | * OK... Let's do some funky business here. | 263 | * OK... Let's do some funky business here. |
264 | * If we do have a DTB appended to zImage, and we do have | 264 | * If we do have a DTB appended to zImage, and we do have |
265 | * an ATAG list around, we want the later to be translated | 265 | * an ATAG list around, we want the later to be translated |
266 | * and folded into the former here. To be on the safe side, | 266 | * and folded into the former here. No GOT fixup has occurred |
267 | * let's temporarily move the stack away into the malloc | 267 | * yet, but none of the code we're about to call uses any |
268 | * area. No GOT fixup has occurred yet, but none of the | 268 | * global variable. |
269 | * code we're about to call uses any global variable. | ||
270 | */ | 269 | */ |
271 | add sp, sp, #0x10000 | 270 | |
271 | /* Get the initial DTB size */ | ||
272 | ldr r5, [r6, #4] | ||
273 | #ifndef __ARMEB__ | ||
274 | /* convert to little endian */ | ||
275 | eor r1, r5, r5, ror #16 | ||
276 | bic r1, r1, #0x00ff0000 | ||
277 | mov r5, r5, ror #8 | ||
278 | eor r5, r5, r1, lsr #8 | ||
279 | #endif | ||
280 | /* 50% DTB growth should be good enough */ | ||
281 | add r5, r5, r5, lsr #1 | ||
282 | /* preserve 64-bit alignment */ | ||
283 | add r5, r5, #7 | ||
284 | bic r5, r5, #7 | ||
285 | /* clamp to 32KB min and 1MB max */ | ||
286 | cmp r5, #(1 << 15) | ||
287 | movlo r5, #(1 << 15) | ||
288 | cmp r5, #(1 << 20) | ||
289 | movhi r5, #(1 << 20) | ||
290 | /* temporarily relocate the stack past the DTB work space */ | ||
291 | add sp, sp, r5 | ||
292 | |||
272 | stmfd sp!, {r0-r3, ip, lr} | 293 | stmfd sp!, {r0-r3, ip, lr} |
273 | mov r0, r8 | 294 | mov r0, r8 |
274 | mov r1, r6 | 295 | mov r1, r6 |
275 | sub r2, sp, r6 | 296 | mov r2, r5 |
276 | bl atags_to_fdt | 297 | bl atags_to_fdt |
277 | 298 | ||
278 | /* | 299 | /* |
@@ -285,11 +306,11 @@ restart: adr r0, LC0 | |||
285 | bic r0, r0, #1 | 306 | bic r0, r0, #1 |
286 | add r0, r0, #0x100 | 307 | add r0, r0, #0x100 |
287 | mov r1, r6 | 308 | mov r1, r6 |
288 | sub r2, sp, r6 | 309 | mov r2, r5 |
289 | bleq atags_to_fdt | 310 | bleq atags_to_fdt |
290 | 311 | ||
291 | ldmfd sp!, {r0-r3, ip, lr} | 312 | ldmfd sp!, {r0-r3, ip, lr} |
292 | sub sp, sp, #0x10000 | 313 | sub sp, sp, r5 |
293 | #endif | 314 | #endif |
294 | 315 | ||
295 | mov r8, r6 @ use the appended device tree | 316 | mov r8, r6 @ use the appended device tree |
@@ -306,7 +327,7 @@ restart: adr r0, LC0 | |||
306 | subs r1, r5, r1 | 327 | subs r1, r5, r1 |
307 | addhi r9, r9, r1 | 328 | addhi r9, r9, r1 |
308 | 329 | ||
309 | /* Get the dtb's size */ | 330 | /* Get the current DTB size */ |
310 | ldr r5, [r6, #4] | 331 | ldr r5, [r6, #4] |
311 | #ifndef __ARMEB__ | 332 | #ifndef __ARMEB__ |
312 | /* convert r5 (dtb size) to little endian */ | 333 | /* convert r5 (dtb size) to little endian */ |
diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi index b8168f1f8139..24ff27049ce0 100644 --- a/arch/arm/boot/dts/exynos4.dtsi +++ b/arch/arm/boot/dts/exynos4.dtsi | |||
@@ -368,7 +368,7 @@ | |||
368 | }; | 368 | }; |
369 | 369 | ||
370 | i2s1: i2s@13960000 { | 370 | i2s1: i2s@13960000 { |
371 | compatible = "samsung,s5pv210-i2s"; | 371 | compatible = "samsung,s3c6410-i2s"; |
372 | reg = <0x13960000 0x100>; | 372 | reg = <0x13960000 0x100>; |
373 | clocks = <&clock CLK_I2S1>; | 373 | clocks = <&clock CLK_I2S1>; |
374 | clock-names = "iis"; | 374 | clock-names = "iis"; |
@@ -378,7 +378,7 @@ | |||
378 | }; | 378 | }; |
379 | 379 | ||
380 | i2s2: i2s@13970000 { | 380 | i2s2: i2s@13970000 { |
381 | compatible = "samsung,s5pv210-i2s"; | 381 | compatible = "samsung,s3c6410-i2s"; |
382 | reg = <0x13970000 0x100>; | 382 | reg = <0x13970000 0x100>; |
383 | clocks = <&clock CLK_I2S2>; | 383 | clocks = <&clock CLK_I2S2>; |
384 | clock-names = "iis"; | 384 | clock-names = "iis"; |
diff --git a/arch/arm/kernel/entry-v7m.S b/arch/arm/kernel/entry-v7m.S index 2260f1855820..8944f4991c3c 100644 --- a/arch/arm/kernel/entry-v7m.S +++ b/arch/arm/kernel/entry-v7m.S | |||
@@ -22,10 +22,12 @@ | |||
22 | 22 | ||
23 | __invalid_entry: | 23 | __invalid_entry: |
24 | v7m_exception_entry | 24 | v7m_exception_entry |
25 | #ifdef CONFIG_PRINTK | ||
25 | adr r0, strerr | 26 | adr r0, strerr |
26 | mrs r1, ipsr | 27 | mrs r1, ipsr |
27 | mov r2, lr | 28 | mov r2, lr |
28 | bl printk | 29 | bl printk |
30 | #endif | ||
29 | mov r0, sp | 31 | mov r0, sp |
30 | bl show_regs | 32 | bl show_regs |
31 | 1: b 1b | 33 | 1: b 1b |
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 03823e784f63..c43c71455566 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -1012,6 +1012,7 @@ config ARCH_SUPPORTS_BIG_ENDIAN | |||
1012 | 1012 | ||
1013 | config ARM_KERNMEM_PERMS | 1013 | config ARM_KERNMEM_PERMS |
1014 | bool "Restrict kernel memory permissions" | 1014 | bool "Restrict kernel memory permissions" |
1015 | depends on MMU | ||
1015 | help | 1016 | help |
1016 | If this is set, kernel memory other than kernel text (and rodata) | 1017 | If this is set, kernel memory other than kernel text (and rodata) |
1017 | will be made non-executable. The tradeoff is that each region is | 1018 | will be made non-executable. The tradeoff is that each region is |
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 91892569710f..845769e41332 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c | |||
@@ -144,21 +144,17 @@ static void flush_context(unsigned int cpu) | |||
144 | /* Update the list of reserved ASIDs and the ASID bitmap. */ | 144 | /* Update the list of reserved ASIDs and the ASID bitmap. */ |
145 | bitmap_clear(asid_map, 0, NUM_USER_ASIDS); | 145 | bitmap_clear(asid_map, 0, NUM_USER_ASIDS); |
146 | for_each_possible_cpu(i) { | 146 | for_each_possible_cpu(i) { |
147 | if (i == cpu) { | 147 | asid = atomic64_xchg(&per_cpu(active_asids, i), 0); |
148 | asid = 0; | 148 | /* |
149 | } else { | 149 | * If this CPU has already been through a |
150 | asid = atomic64_xchg(&per_cpu(active_asids, i), 0); | 150 | * rollover, but hasn't run another task in |
151 | /* | 151 | * the meantime, we must preserve its reserved |
152 | * If this CPU has already been through a | 152 | * ASID, as this is the only trace we have of |
153 | * rollover, but hasn't run another task in | 153 | * the process it is still running. |
154 | * the meantime, we must preserve its reserved | 154 | */ |
155 | * ASID, as this is the only trace we have of | 155 | if (asid == 0) |
156 | * the process it is still running. | 156 | asid = per_cpu(reserved_asids, i); |
157 | */ | 157 | __set_bit(asid & ~ASID_MASK, asid_map); |
158 | if (asid == 0) | ||
159 | asid = per_cpu(reserved_asids, i); | ||
160 | __set_bit(asid & ~ASID_MASK, asid_map); | ||
161 | } | ||
162 | per_cpu(reserved_asids, i) = asid; | 158 | per_cpu(reserved_asids, i) = asid; |
163 | } | 159 | } |
164 | 160 | ||
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index a673c7f7e208..903dba064a03 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
@@ -2048,6 +2048,9 @@ static void arm_teardown_iommu_dma_ops(struct device *dev) | |||
2048 | { | 2048 | { |
2049 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; | 2049 | struct dma_iommu_mapping *mapping = dev->archdata.mapping; |
2050 | 2050 | ||
2051 | if (!mapping) | ||
2052 | return; | ||
2053 | |||
2051 | __arm_iommu_detach_device(dev); | 2054 | __arm_iommu_detach_device(dev); |
2052 | arm_iommu_release_mapping(mapping); | 2055 | arm_iommu_release_mapping(mapping); |
2053 | } | 2056 | } |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index e795cb848154..2c4498919d3c 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
@@ -380,9 +380,6 @@ static void __init acpi_madt_oem_check(char *oem_id, char *oem_table_id) | |||
380 | 380 | ||
381 | static int __init acpi_parse_madt(struct acpi_table_header *table) | 381 | static int __init acpi_parse_madt(struct acpi_table_header *table) |
382 | { | 382 | { |
383 | if (!table) | ||
384 | return -EINVAL; | ||
385 | |||
386 | acpi_madt = (struct acpi_table_madt *)table; | 383 | acpi_madt = (struct acpi_table_madt *)table; |
387 | 384 | ||
388 | acpi_madt_rev = acpi_madt->header.revision; | 385 | acpi_madt_rev = acpi_madt->header.revision; |
@@ -645,9 +642,6 @@ static int __init acpi_parse_fadt(struct acpi_table_header *table) | |||
645 | struct acpi_table_header *fadt_header; | 642 | struct acpi_table_header *fadt_header; |
646 | struct acpi_table_fadt *fadt; | 643 | struct acpi_table_fadt *fadt; |
647 | 644 | ||
648 | if (!table) | ||
649 | return -EINVAL; | ||
650 | |||
651 | fadt_header = (struct acpi_table_header *)table; | 645 | fadt_header = (struct acpi_table_header *)table; |
652 | if (fadt_header->revision != 3) | 646 | if (fadt_header->revision != 3) |
653 | return -ENODEV; /* Only deal with ACPI 2.0 FADT */ | 647 | return -ENODEV; /* Only deal with ACPI 2.0 FADT */ |
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 3289969ee423..843713c05b79 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -2656,27 +2656,21 @@ config TRAD_SIGNALS | |||
2656 | bool | 2656 | bool |
2657 | 2657 | ||
2658 | config MIPS32_COMPAT | 2658 | config MIPS32_COMPAT |
2659 | bool "Kernel support for Linux/MIPS 32-bit binary compatibility" | 2659 | bool |
2660 | depends on 64BIT | ||
2661 | help | ||
2662 | Select this option if you want Linux/MIPS 32-bit binary | ||
2663 | compatibility. Since all software available for Linux/MIPS is | ||
2664 | currently 32-bit you should say Y here. | ||
2665 | 2660 | ||
2666 | config COMPAT | 2661 | config COMPAT |
2667 | bool | 2662 | bool |
2668 | depends on MIPS32_COMPAT | ||
2669 | select ARCH_WANT_OLD_COMPAT_IPC | ||
2670 | default y | ||
2671 | 2663 | ||
2672 | config SYSVIPC_COMPAT | 2664 | config SYSVIPC_COMPAT |
2673 | bool | 2665 | bool |
2674 | depends on COMPAT && SYSVIPC | ||
2675 | default y | ||
2676 | 2666 | ||
2677 | config MIPS32_O32 | 2667 | config MIPS32_O32 |
2678 | bool "Kernel support for o32 binaries" | 2668 | bool "Kernel support for o32 binaries" |
2679 | depends on MIPS32_COMPAT | 2669 | depends on 64BIT |
2670 | select ARCH_WANT_OLD_COMPAT_IPC | ||
2671 | select COMPAT | ||
2672 | select MIPS32_COMPAT | ||
2673 | select SYSVIPC_COMPAT if SYSVIPC | ||
2680 | help | 2674 | help |
2681 | Select this option if you want to run o32 binaries. These are pure | 2675 | Select this option if you want to run o32 binaries. These are pure |
2682 | 32-bit binaries as used by the 32-bit Linux/MIPS port. Most of | 2676 | 32-bit binaries as used by the 32-bit Linux/MIPS port. Most of |
@@ -2686,7 +2680,10 @@ config MIPS32_O32 | |||
2686 | 2680 | ||
2687 | config MIPS32_N32 | 2681 | config MIPS32_N32 |
2688 | bool "Kernel support for n32 binaries" | 2682 | bool "Kernel support for n32 binaries" |
2689 | depends on MIPS32_COMPAT | 2683 | depends on 64BIT |
2684 | select COMPAT | ||
2685 | select MIPS32_COMPAT | ||
2686 | select SYSVIPC_COMPAT if SYSVIPC | ||
2690 | help | 2687 | help |
2691 | Select this option if you want to run n32 binaries. These are | 2688 | Select this option if you want to run n32 binaries. These are |
2692 | 64-bit binaries using 32-bit quantities for addressing and certain | 2689 | 64-bit binaries using 32-bit quantities for addressing and certain |
diff --git a/arch/mips/boot/elf2ecoff.c b/arch/mips/boot/elf2ecoff.c index 8585078ae50e..2a4c52e27f41 100644 --- a/arch/mips/boot/elf2ecoff.c +++ b/arch/mips/boot/elf2ecoff.c | |||
@@ -49,7 +49,8 @@ | |||
49 | /* | 49 | /* |
50 | * Some extra ELF definitions | 50 | * Some extra ELF definitions |
51 | */ | 51 | */ |
52 | #define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ | 52 | #define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ |
53 | #define PT_MIPS_ABIFLAGS 0x70000003 /* Records ABI related flags */ | ||
53 | 54 | ||
54 | /* -------------------------------------------------------------------- */ | 55 | /* -------------------------------------------------------------------- */ |
55 | 56 | ||
@@ -349,39 +350,46 @@ int main(int argc, char *argv[]) | |||
349 | 350 | ||
350 | for (i = 0; i < ex.e_phnum; i++) { | 351 | for (i = 0; i < ex.e_phnum; i++) { |
351 | /* Section types we can ignore... */ | 352 | /* Section types we can ignore... */ |
352 | if (ph[i].p_type == PT_NULL || ph[i].p_type == PT_NOTE || | 353 | switch (ph[i].p_type) { |
353 | ph[i].p_type == PT_PHDR | 354 | case PT_NULL: |
354 | || ph[i].p_type == PT_MIPS_REGINFO) | 355 | case PT_NOTE: |
356 | case PT_PHDR: | ||
357 | case PT_MIPS_REGINFO: | ||
358 | case PT_MIPS_ABIFLAGS: | ||
355 | continue; | 359 | continue; |
356 | /* Section types we can't handle... */ | ||
357 | else if (ph[i].p_type != PT_LOAD) { | ||
358 | fprintf(stderr, | ||
359 | "Program header %d type %d can't be converted.\n", | ||
360 | ex.e_phnum, ph[i].p_type); | ||
361 | exit(1); | ||
362 | } | ||
363 | /* Writable (data) segment? */ | ||
364 | if (ph[i].p_flags & PF_W) { | ||
365 | struct sect ndata, nbss; | ||
366 | 360 | ||
367 | ndata.vaddr = ph[i].p_vaddr; | 361 | case PT_LOAD: |
368 | ndata.len = ph[i].p_filesz; | 362 | /* Writable (data) segment? */ |
369 | nbss.vaddr = ph[i].p_vaddr + ph[i].p_filesz; | 363 | if (ph[i].p_flags & PF_W) { |
370 | nbss.len = ph[i].p_memsz - ph[i].p_filesz; | 364 | struct sect ndata, nbss; |
365 | |||
366 | ndata.vaddr = ph[i].p_vaddr; | ||
367 | ndata.len = ph[i].p_filesz; | ||
368 | nbss.vaddr = ph[i].p_vaddr + ph[i].p_filesz; | ||
369 | nbss.len = ph[i].p_memsz - ph[i].p_filesz; | ||
371 | 370 | ||
372 | combine(&data, &ndata, 0); | 371 | combine(&data, &ndata, 0); |
373 | combine(&bss, &nbss, 1); | 372 | combine(&bss, &nbss, 1); |
374 | } else { | 373 | } else { |
375 | struct sect ntxt; | 374 | struct sect ntxt; |
376 | 375 | ||
377 | ntxt.vaddr = ph[i].p_vaddr; | 376 | ntxt.vaddr = ph[i].p_vaddr; |
378 | ntxt.len = ph[i].p_filesz; | 377 | ntxt.len = ph[i].p_filesz; |
379 | 378 | ||
380 | combine(&text, &ntxt, 0); | 379 | combine(&text, &ntxt, 0); |
380 | } | ||
381 | /* Remember the lowest segment start address. */ | ||
382 | if (ph[i].p_vaddr < cur_vma) | ||
383 | cur_vma = ph[i].p_vaddr; | ||
384 | break; | ||
385 | |||
386 | default: | ||
387 | /* Section types we can't handle... */ | ||
388 | fprintf(stderr, | ||
389 | "Program header %d type %d can't be converted.\n", | ||
390 | ex.e_phnum, ph[i].p_type); | ||
391 | exit(1); | ||
381 | } | 392 | } |
382 | /* Remember the lowest segment start address. */ | ||
383 | if (ph[i].p_vaddr < cur_vma) | ||
384 | cur_vma = ph[i].p_vaddr; | ||
385 | } | 393 | } |
386 | 394 | ||
387 | /* Sections must be in order to be converted... */ | 395 | /* Sections must be in order to be converted... */ |
diff --git a/arch/mips/cavium-octeon/smp.c b/arch/mips/cavium-octeon/smp.c index ecd903dd1c45..8b1eeffa12ed 100644 --- a/arch/mips/cavium-octeon/smp.c +++ b/arch/mips/cavium-octeon/smp.c | |||
@@ -240,9 +240,7 @@ static int octeon_cpu_disable(void) | |||
240 | 240 | ||
241 | set_cpu_online(cpu, false); | 241 | set_cpu_online(cpu, false); |
242 | cpu_clear(cpu, cpu_callin_map); | 242 | cpu_clear(cpu, cpu_callin_map); |
243 | local_irq_disable(); | ||
244 | octeon_fixup_irqs(); | 243 | octeon_fixup_irqs(); |
245 | local_irq_enable(); | ||
246 | 244 | ||
247 | flush_cache_all(); | 245 | flush_cache_all(); |
248 | local_flush_tlb_all(); | 246 | local_flush_tlb_all(); |
diff --git a/arch/mips/configs/malta_defconfig b/arch/mips/configs/malta_defconfig index f57b96dcf7df..61a4460d67d3 100644 --- a/arch/mips/configs/malta_defconfig +++ b/arch/mips/configs/malta_defconfig | |||
@@ -132,7 +132,6 @@ CONFIG_IP_NF_MATCH_ECN=m | |||
132 | CONFIG_IP_NF_MATCH_TTL=m | 132 | CONFIG_IP_NF_MATCH_TTL=m |
133 | CONFIG_IP_NF_FILTER=m | 133 | CONFIG_IP_NF_FILTER=m |
134 | CONFIG_IP_NF_TARGET_REJECT=m | 134 | CONFIG_IP_NF_TARGET_REJECT=m |
135 | CONFIG_IP_NF_TARGET_ULOG=m | ||
136 | CONFIG_IP_NF_MANGLE=m | 135 | CONFIG_IP_NF_MANGLE=m |
137 | CONFIG_IP_NF_TARGET_CLUSTERIP=m | 136 | CONFIG_IP_NF_TARGET_CLUSTERIP=m |
138 | CONFIG_IP_NF_TARGET_ECN=m | 137 | CONFIG_IP_NF_TARGET_ECN=m |
@@ -175,7 +174,6 @@ CONFIG_BRIDGE_EBT_MARK_T=m | |||
175 | CONFIG_BRIDGE_EBT_REDIRECT=m | 174 | CONFIG_BRIDGE_EBT_REDIRECT=m |
176 | CONFIG_BRIDGE_EBT_SNAT=m | 175 | CONFIG_BRIDGE_EBT_SNAT=m |
177 | CONFIG_BRIDGE_EBT_LOG=m | 176 | CONFIG_BRIDGE_EBT_LOG=m |
178 | CONFIG_BRIDGE_EBT_ULOG=m | ||
179 | CONFIG_BRIDGE_EBT_NFLOG=m | 177 | CONFIG_BRIDGE_EBT_NFLOG=m |
180 | CONFIG_IP_SCTP=m | 178 | CONFIG_IP_SCTP=m |
181 | CONFIG_BRIDGE=m | 179 | CONFIG_BRIDGE=m |
@@ -220,8 +218,6 @@ CONFIG_NET_ACT_SKBEDIT=m | |||
220 | CONFIG_NET_CLS_IND=y | 218 | CONFIG_NET_CLS_IND=y |
221 | CONFIG_CFG80211=m | 219 | CONFIG_CFG80211=m |
222 | CONFIG_MAC80211=m | 220 | CONFIG_MAC80211=m |
223 | CONFIG_MAC80211_RC_PID=y | ||
224 | CONFIG_MAC80211_RC_DEFAULT_PID=y | ||
225 | CONFIG_MAC80211_MESH=y | 221 | CONFIG_MAC80211_MESH=y |
226 | CONFIG_RFKILL=m | 222 | CONFIG_RFKILL=m |
227 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 223 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
@@ -248,19 +244,13 @@ CONFIG_ATA_OVER_ETH=m | |||
248 | CONFIG_IDE=y | 244 | CONFIG_IDE=y |
249 | CONFIG_BLK_DEV_IDECD=y | 245 | CONFIG_BLK_DEV_IDECD=y |
250 | CONFIG_IDE_GENERIC=y | 246 | CONFIG_IDE_GENERIC=y |
251 | CONFIG_BLK_DEV_GENERIC=y | ||
252 | CONFIG_BLK_DEV_PIIX=y | ||
253 | CONFIG_BLK_DEV_IT8213=m | ||
254 | CONFIG_BLK_DEV_TC86C001=m | ||
255 | CONFIG_RAID_ATTRS=m | 247 | CONFIG_RAID_ATTRS=m |
256 | CONFIG_SCSI=m | 248 | CONFIG_BLK_DEV_SD=y |
257 | CONFIG_BLK_DEV_SD=m | ||
258 | CONFIG_CHR_DEV_ST=m | 249 | CONFIG_CHR_DEV_ST=m |
259 | CONFIG_CHR_DEV_OSST=m | 250 | CONFIG_CHR_DEV_OSST=m |
260 | CONFIG_BLK_DEV_SR=m | 251 | CONFIG_BLK_DEV_SR=m |
261 | CONFIG_BLK_DEV_SR_VENDOR=y | 252 | CONFIG_BLK_DEV_SR_VENDOR=y |
262 | CONFIG_CHR_DEV_SG=m | 253 | CONFIG_CHR_DEV_SG=m |
263 | CONFIG_SCSI_MULTI_LUN=y | ||
264 | CONFIG_SCSI_CONSTANTS=y | 254 | CONFIG_SCSI_CONSTANTS=y |
265 | CONFIG_SCSI_LOGGING=y | 255 | CONFIG_SCSI_LOGGING=y |
266 | CONFIG_SCSI_SCAN_ASYNC=y | 256 | CONFIG_SCSI_SCAN_ASYNC=y |
@@ -273,6 +263,8 @@ CONFIG_SCSI_AACRAID=m | |||
273 | CONFIG_SCSI_AIC7XXX=m | 263 | CONFIG_SCSI_AIC7XXX=m |
274 | CONFIG_AIC7XXX_RESET_DELAY_MS=15000 | 264 | CONFIG_AIC7XXX_RESET_DELAY_MS=15000 |
275 | # CONFIG_AIC7XXX_DEBUG_ENABLE is not set | 265 | # CONFIG_AIC7XXX_DEBUG_ENABLE is not set |
266 | CONFIG_ATA=y | ||
267 | CONFIG_ATA_PIIX=y | ||
276 | CONFIG_MD=y | 268 | CONFIG_MD=y |
277 | CONFIG_BLK_DEV_MD=m | 269 | CONFIG_BLK_DEV_MD=m |
278 | CONFIG_MD_LINEAR=m | 270 | CONFIG_MD_LINEAR=m |
@@ -340,6 +332,7 @@ CONFIG_UIO=m | |||
340 | CONFIG_UIO_CIF=m | 332 | CONFIG_UIO_CIF=m |
341 | CONFIG_EXT2_FS=y | 333 | CONFIG_EXT2_FS=y |
342 | CONFIG_EXT3_FS=y | 334 | CONFIG_EXT3_FS=y |
335 | CONFIG_EXT4_FS=y | ||
343 | CONFIG_REISERFS_FS=m | 336 | CONFIG_REISERFS_FS=m |
344 | CONFIG_REISERFS_PROC_INFO=y | 337 | CONFIG_REISERFS_PROC_INFO=y |
345 | CONFIG_REISERFS_FS_XATTR=y | 338 | CONFIG_REISERFS_FS_XATTR=y |
@@ -441,4 +434,3 @@ CONFIG_CRYPTO_SERPENT=m | |||
441 | CONFIG_CRYPTO_TEA=m | 434 | CONFIG_CRYPTO_TEA=m |
442 | CONFIG_CRYPTO_TWOFISH=m | 435 | CONFIG_CRYPTO_TWOFISH=m |
443 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 436 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
444 | CONFIG_CRC16=m | ||
diff --git a/arch/mips/include/asm/fpu.h b/arch/mips/include/asm/fpu.h index 994d21939676..affebb78f5d6 100644 --- a/arch/mips/include/asm/fpu.h +++ b/arch/mips/include/asm/fpu.h | |||
@@ -64,7 +64,7 @@ static inline int __enable_fpu(enum fpu_mode mode) | |||
64 | return SIGFPE; | 64 | return SIGFPE; |
65 | 65 | ||
66 | /* set FRE */ | 66 | /* set FRE */ |
67 | write_c0_config5(read_c0_config5() | MIPS_CONF5_FRE); | 67 | set_c0_config5(MIPS_CONF5_FRE); |
68 | goto fr_common; | 68 | goto fr_common; |
69 | 69 | ||
70 | case FPU_64BIT: | 70 | case FPU_64BIT: |
@@ -74,8 +74,10 @@ static inline int __enable_fpu(enum fpu_mode mode) | |||
74 | #endif | 74 | #endif |
75 | /* fall through */ | 75 | /* fall through */ |
76 | case FPU_32BIT: | 76 | case FPU_32BIT: |
77 | /* clear FRE */ | 77 | if (cpu_has_fre) { |
78 | write_c0_config5(read_c0_config5() & ~MIPS_CONF5_FRE); | 78 | /* clear FRE */ |
79 | clear_c0_config5(MIPS_CONF5_FRE); | ||
80 | } | ||
79 | fr_common: | 81 | fr_common: |
80 | /* set CU1 & change FR appropriately */ | 82 | /* set CU1 & change FR appropriately */ |
81 | fr = (int)mode & FPU_FR_MASK; | 83 | fr = (int)mode & FPU_FR_MASK; |
@@ -182,25 +184,32 @@ static inline int init_fpu(void) | |||
182 | int ret = 0; | 184 | int ret = 0; |
183 | 185 | ||
184 | if (cpu_has_fpu) { | 186 | if (cpu_has_fpu) { |
187 | unsigned int config5; | ||
188 | |||
185 | ret = __own_fpu(); | 189 | ret = __own_fpu(); |
186 | if (!ret) { | 190 | if (ret) |
187 | unsigned int config5 = read_c0_config5(); | 191 | return ret; |
188 | |||
189 | /* | ||
190 | * Ensure FRE is clear whilst running _init_fpu, since | ||
191 | * single precision FP instructions are used. If FRE | ||
192 | * was set then we'll just end up initialising all 32 | ||
193 | * 64b registers. | ||
194 | */ | ||
195 | write_c0_config5(config5 & ~MIPS_CONF5_FRE); | ||
196 | enable_fpu_hazard(); | ||
197 | 192 | ||
193 | if (!cpu_has_fre) { | ||
198 | _init_fpu(); | 194 | _init_fpu(); |
199 | 195 | ||
200 | /* Restore FRE */ | 196 | return 0; |
201 | write_c0_config5(config5); | ||
202 | enable_fpu_hazard(); | ||
203 | } | 197 | } |
198 | |||
199 | /* | ||
200 | * Ensure FRE is clear whilst running _init_fpu, since | ||
201 | * single precision FP instructions are used. If FRE | ||
202 | * was set then we'll just end up initialising all 32 | ||
203 | * 64b registers. | ||
204 | */ | ||
205 | config5 = clear_c0_config5(MIPS_CONF5_FRE); | ||
206 | enable_fpu_hazard(); | ||
207 | |||
208 | _init_fpu(); | ||
209 | |||
210 | /* Restore FRE */ | ||
211 | write_c0_config5(config5); | ||
212 | enable_fpu_hazard(); | ||
204 | } else | 213 | } else |
205 | fpu_emulator_init_fpu(); | 214 | fpu_emulator_init_fpu(); |
206 | 215 | ||
diff --git a/arch/mips/include/asm/fw/arc/hinv.h b/arch/mips/include/asm/fw/arc/hinv.h index f8d37d1df5de..9fac64a26353 100644 --- a/arch/mips/include/asm/fw/arc/hinv.h +++ b/arch/mips/include/asm/fw/arc/hinv.h | |||
@@ -119,7 +119,7 @@ union key_u { | |||
119 | #define SGI_ARCS_REV 10 /* rev .10, 3/04/92 */ | 119 | #define SGI_ARCS_REV 10 /* rev .10, 3/04/92 */ |
120 | #endif | 120 | #endif |
121 | 121 | ||
122 | typedef struct component { | 122 | typedef struct { |
123 | CONFIGCLASS Class; | 123 | CONFIGCLASS Class; |
124 | CONFIGTYPE Type; | 124 | CONFIGTYPE Type; |
125 | IDENTIFIERFLAG Flags; | 125 | IDENTIFIERFLAG Flags; |
@@ -140,7 +140,7 @@ struct cfgdata { | |||
140 | }; | 140 | }; |
141 | 141 | ||
142 | /* System ID */ | 142 | /* System ID */ |
143 | typedef struct systemid { | 143 | typedef struct { |
144 | CHAR VendorId[8]; | 144 | CHAR VendorId[8]; |
145 | CHAR ProductId[8]; | 145 | CHAR ProductId[8]; |
146 | } SYSTEMID; | 146 | } SYSTEMID; |
@@ -166,7 +166,7 @@ typedef enum memorytype { | |||
166 | #endif /* _NT_PROM */ | 166 | #endif /* _NT_PROM */ |
167 | } MEMORYTYPE; | 167 | } MEMORYTYPE; |
168 | 168 | ||
169 | typedef struct memorydescriptor { | 169 | typedef struct { |
170 | MEMORYTYPE Type; | 170 | MEMORYTYPE Type; |
171 | LONG BasePage; | 171 | LONG BasePage; |
172 | LONG PageCount; | 172 | LONG PageCount; |
diff --git a/arch/mips/include/asm/mips-cm.h b/arch/mips/include/asm/mips-cm.h index b95a827d763e..59c0901bdd84 100644 --- a/arch/mips/include/asm/mips-cm.h +++ b/arch/mips/include/asm/mips-cm.h | |||
@@ -89,9 +89,9 @@ static inline bool mips_cm_has_l2sync(void) | |||
89 | 89 | ||
90 | /* Macros to ease the creation of register access functions */ | 90 | /* Macros to ease the creation of register access functions */ |
91 | #define BUILD_CM_R_(name, off) \ | 91 | #define BUILD_CM_R_(name, off) \ |
92 | static inline u32 *addr_gcr_##name(void) \ | 92 | static inline u32 __iomem *addr_gcr_##name(void) \ |
93 | { \ | 93 | { \ |
94 | return (u32 *)(mips_cm_base + (off)); \ | 94 | return (u32 __iomem *)(mips_cm_base + (off)); \ |
95 | } \ | 95 | } \ |
96 | \ | 96 | \ |
97 | static inline u32 read_gcr_##name(void) \ | 97 | static inline u32 read_gcr_##name(void) \ |
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h index 5e4aef304b02..5b720d8c2745 100644 --- a/arch/mips/include/asm/mipsregs.h +++ b/arch/mips/include/asm/mipsregs.h | |||
@@ -1386,12 +1386,27 @@ do { \ | |||
1386 | __res; \ | 1386 | __res; \ |
1387 | }) | 1387 | }) |
1388 | 1388 | ||
1389 | #define _write_32bit_cp1_register(dest, val, gas_hardfloat) \ | ||
1390 | do { \ | ||
1391 | __asm__ __volatile__( \ | ||
1392 | " .set push \n" \ | ||
1393 | " .set reorder \n" \ | ||
1394 | " "STR(gas_hardfloat)" \n" \ | ||
1395 | " ctc1 %0,"STR(dest)" \n" \ | ||
1396 | " .set pop \n" \ | ||
1397 | : : "r" (val)); \ | ||
1398 | } while (0) | ||
1399 | |||
1389 | #ifdef GAS_HAS_SET_HARDFLOAT | 1400 | #ifdef GAS_HAS_SET_HARDFLOAT |
1390 | #define read_32bit_cp1_register(source) \ | 1401 | #define read_32bit_cp1_register(source) \ |
1391 | _read_32bit_cp1_register(source, .set hardfloat) | 1402 | _read_32bit_cp1_register(source, .set hardfloat) |
1403 | #define write_32bit_cp1_register(dest, val) \ | ||
1404 | _write_32bit_cp1_register(dest, val, .set hardfloat) | ||
1392 | #else | 1405 | #else |
1393 | #define read_32bit_cp1_register(source) \ | 1406 | #define read_32bit_cp1_register(source) \ |
1394 | _read_32bit_cp1_register(source, ) | 1407 | _read_32bit_cp1_register(source, ) |
1408 | #define write_32bit_cp1_register(dest, val) \ | ||
1409 | _write_32bit_cp1_register(dest, val, ) | ||
1395 | #endif | 1410 | #endif |
1396 | 1411 | ||
1397 | #ifdef HAVE_AS_DSP | 1412 | #ifdef HAVE_AS_DSP |
diff --git a/arch/mips/include/asm/syscall.h b/arch/mips/include/asm/syscall.h index bb7963753730..6499d93ae68d 100644 --- a/arch/mips/include/asm/syscall.h +++ b/arch/mips/include/asm/syscall.h | |||
@@ -29,13 +29,7 @@ | |||
29 | static inline long syscall_get_nr(struct task_struct *task, | 29 | static inline long syscall_get_nr(struct task_struct *task, |
30 | struct pt_regs *regs) | 30 | struct pt_regs *regs) |
31 | { | 31 | { |
32 | /* O32 ABI syscall() - Either 64-bit with O32 or 32-bit */ | 32 | return current_thread_info()->syscall; |
33 | if ((config_enabled(CONFIG_32BIT) || | ||
34 | test_tsk_thread_flag(task, TIF_32BIT_REGS)) && | ||
35 | (regs->regs[2] == __NR_syscall)) | ||
36 | return regs->regs[4]; | ||
37 | else | ||
38 | return regs->regs[2]; | ||
39 | } | 33 | } |
40 | 34 | ||
41 | static inline unsigned long mips_get_syscall_arg(unsigned long *arg, | 35 | static inline unsigned long mips_get_syscall_arg(unsigned long *arg, |
diff --git a/arch/mips/include/asm/thread_info.h b/arch/mips/include/asm/thread_info.h index 99eea59604e9..e4440f92b366 100644 --- a/arch/mips/include/asm/thread_info.h +++ b/arch/mips/include/asm/thread_info.h | |||
@@ -36,6 +36,7 @@ struct thread_info { | |||
36 | */ | 36 | */ |
37 | struct restart_block restart_block; | 37 | struct restart_block restart_block; |
38 | struct pt_regs *regs; | 38 | struct pt_regs *regs; |
39 | long syscall; /* syscall number */ | ||
39 | }; | 40 | }; |
40 | 41 | ||
41 | /* | 42 | /* |
diff --git a/arch/mips/include/uapi/asm/unistd.h b/arch/mips/include/uapi/asm/unistd.h index d001bb1ad177..c03088f9f514 100644 --- a/arch/mips/include/uapi/asm/unistd.h +++ b/arch/mips/include/uapi/asm/unistd.h | |||
@@ -376,16 +376,17 @@ | |||
376 | #define __NR_getrandom (__NR_Linux + 353) | 376 | #define __NR_getrandom (__NR_Linux + 353) |
377 | #define __NR_memfd_create (__NR_Linux + 354) | 377 | #define __NR_memfd_create (__NR_Linux + 354) |
378 | #define __NR_bpf (__NR_Linux + 355) | 378 | #define __NR_bpf (__NR_Linux + 355) |
379 | #define __NR_execveat (__NR_Linux + 356) | ||
379 | 380 | ||
380 | /* | 381 | /* |
381 | * Offset of the last Linux o32 flavoured syscall | 382 | * Offset of the last Linux o32 flavoured syscall |
382 | */ | 383 | */ |
383 | #define __NR_Linux_syscalls 355 | 384 | #define __NR_Linux_syscalls 356 |
384 | 385 | ||
385 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ | 386 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */ |
386 | 387 | ||
387 | #define __NR_O32_Linux 4000 | 388 | #define __NR_O32_Linux 4000 |
388 | #define __NR_O32_Linux_syscalls 355 | 389 | #define __NR_O32_Linux_syscalls 356 |
389 | 390 | ||
390 | #if _MIPS_SIM == _MIPS_SIM_ABI64 | 391 | #if _MIPS_SIM == _MIPS_SIM_ABI64 |
391 | 392 | ||
@@ -709,16 +710,17 @@ | |||
709 | #define __NR_getrandom (__NR_Linux + 313) | 710 | #define __NR_getrandom (__NR_Linux + 313) |
710 | #define __NR_memfd_create (__NR_Linux + 314) | 711 | #define __NR_memfd_create (__NR_Linux + 314) |
711 | #define __NR_bpf (__NR_Linux + 315) | 712 | #define __NR_bpf (__NR_Linux + 315) |
713 | #define __NR_execveat (__NR_Linux + 316) | ||
712 | 714 | ||
713 | /* | 715 | /* |
714 | * Offset of the last Linux 64-bit flavoured syscall | 716 | * Offset of the last Linux 64-bit flavoured syscall |
715 | */ | 717 | */ |
716 | #define __NR_Linux_syscalls 315 | 718 | #define __NR_Linux_syscalls 316 |
717 | 719 | ||
718 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ | 720 | #endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */ |
719 | 721 | ||
720 | #define __NR_64_Linux 5000 | 722 | #define __NR_64_Linux 5000 |
721 | #define __NR_64_Linux_syscalls 315 | 723 | #define __NR_64_Linux_syscalls 316 |
722 | 724 | ||
723 | #if _MIPS_SIM == _MIPS_SIM_NABI32 | 725 | #if _MIPS_SIM == _MIPS_SIM_NABI32 |
724 | 726 | ||
@@ -1046,15 +1048,16 @@ | |||
1046 | #define __NR_getrandom (__NR_Linux + 317) | 1048 | #define __NR_getrandom (__NR_Linux + 317) |
1047 | #define __NR_memfd_create (__NR_Linux + 318) | 1049 | #define __NR_memfd_create (__NR_Linux + 318) |
1048 | #define __NR_bpf (__NR_Linux + 319) | 1050 | #define __NR_bpf (__NR_Linux + 319) |
1051 | #define __NR_execveat (__NR_Linux + 320) | ||
1049 | 1052 | ||
1050 | /* | 1053 | /* |
1051 | * Offset of the last N32 flavoured syscall | 1054 | * Offset of the last N32 flavoured syscall |
1052 | */ | 1055 | */ |
1053 | #define __NR_Linux_syscalls 319 | 1056 | #define __NR_Linux_syscalls 320 |
1054 | 1057 | ||
1055 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ | 1058 | #endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */ |
1056 | 1059 | ||
1057 | #define __NR_N32_Linux 6000 | 1060 | #define __NR_N32_Linux 6000 |
1058 | #define __NR_N32_Linux_syscalls 319 | 1061 | #define __NR_N32_Linux_syscalls 320 |
1059 | 1062 | ||
1060 | #endif /* _UAPI_ASM_UNISTD_H */ | 1063 | #endif /* _UAPI_ASM_UNISTD_H */ |
diff --git a/arch/mips/jz4740/irq.c b/arch/mips/jz4740/irq.c index 2531da1d3add..97206b3deb97 100644 --- a/arch/mips/jz4740/irq.c +++ b/arch/mips/jz4740/irq.c | |||
@@ -30,6 +30,9 @@ | |||
30 | #include <asm/irq_cpu.h> | 30 | #include <asm/irq_cpu.h> |
31 | 31 | ||
32 | #include <asm/mach-jz4740/base.h> | 32 | #include <asm/mach-jz4740/base.h> |
33 | #include <asm/mach-jz4740/irq.h> | ||
34 | |||
35 | #include "irq.h" | ||
33 | 36 | ||
34 | static void __iomem *jz_intc_base; | 37 | static void __iomem *jz_intc_base; |
35 | 38 | ||
diff --git a/arch/mips/kernel/elf.c b/arch/mips/kernel/elf.c index c92b15df6893..a5b5b56485c1 100644 --- a/arch/mips/kernel/elf.c +++ b/arch/mips/kernel/elf.c | |||
@@ -19,8 +19,8 @@ enum { | |||
19 | int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, | 19 | int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, |
20 | bool is_interp, struct arch_elf_state *state) | 20 | bool is_interp, struct arch_elf_state *state) |
21 | { | 21 | { |
22 | struct elfhdr *ehdr = _ehdr; | 22 | struct elf32_hdr *ehdr = _ehdr; |
23 | struct elf_phdr *phdr = _phdr; | 23 | struct elf32_phdr *phdr = _phdr; |
24 | struct mips_elf_abiflags_v0 abiflags; | 24 | struct mips_elf_abiflags_v0 abiflags; |
25 | int ret; | 25 | int ret; |
26 | 26 | ||
@@ -48,7 +48,7 @@ int arch_elf_pt_proc(void *_ehdr, void *_phdr, struct file *elf, | |||
48 | return 0; | 48 | return 0; |
49 | } | 49 | } |
50 | 50 | ||
51 | static inline unsigned get_fp_abi(struct elfhdr *ehdr, int in_abi) | 51 | static inline unsigned get_fp_abi(struct elf32_hdr *ehdr, int in_abi) |
52 | { | 52 | { |
53 | /* If the ABI requirement is provided, simply return that */ | 53 | /* If the ABI requirement is provided, simply return that */ |
54 | if (in_abi != -1) | 54 | if (in_abi != -1) |
@@ -65,7 +65,7 @@ static inline unsigned get_fp_abi(struct elfhdr *ehdr, int in_abi) | |||
65 | int arch_check_elf(void *_ehdr, bool has_interpreter, | 65 | int arch_check_elf(void *_ehdr, bool has_interpreter, |
66 | struct arch_elf_state *state) | 66 | struct arch_elf_state *state) |
67 | { | 67 | { |
68 | struct elfhdr *ehdr = _ehdr; | 68 | struct elf32_hdr *ehdr = _ehdr; |
69 | unsigned fp_abi, interp_fp_abi, abi0, abi1; | 69 | unsigned fp_abi, interp_fp_abi, abi0, abi1; |
70 | 70 | ||
71 | /* Ignore non-O32 binaries */ | 71 | /* Ignore non-O32 binaries */ |
diff --git a/arch/mips/kernel/irq_cpu.c b/arch/mips/kernel/irq_cpu.c index 590c2c980fd3..6eb7a3f515fc 100644 --- a/arch/mips/kernel/irq_cpu.c +++ b/arch/mips/kernel/irq_cpu.c | |||
@@ -57,6 +57,8 @@ static struct irq_chip mips_cpu_irq_controller = { | |||
57 | .irq_mask_ack = mask_mips_irq, | 57 | .irq_mask_ack = mask_mips_irq, |
58 | .irq_unmask = unmask_mips_irq, | 58 | .irq_unmask = unmask_mips_irq, |
59 | .irq_eoi = unmask_mips_irq, | 59 | .irq_eoi = unmask_mips_irq, |
60 | .irq_disable = mask_mips_irq, | ||
61 | .irq_enable = unmask_mips_irq, | ||
60 | }; | 62 | }; |
61 | 63 | ||
62 | /* | 64 | /* |
@@ -93,6 +95,8 @@ static struct irq_chip mips_mt_cpu_irq_controller = { | |||
93 | .irq_mask_ack = mips_mt_cpu_irq_ack, | 95 | .irq_mask_ack = mips_mt_cpu_irq_ack, |
94 | .irq_unmask = unmask_mips_irq, | 96 | .irq_unmask = unmask_mips_irq, |
95 | .irq_eoi = unmask_mips_irq, | 97 | .irq_eoi = unmask_mips_irq, |
98 | .irq_disable = mask_mips_irq, | ||
99 | .irq_enable = unmask_mips_irq, | ||
96 | }; | 100 | }; |
97 | 101 | ||
98 | asmlinkage void __weak plat_irq_dispatch(void) | 102 | asmlinkage void __weak plat_irq_dispatch(void) |
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c index eb76434828e8..85bff5d513e5 100644 --- a/arch/mips/kernel/process.c +++ b/arch/mips/kernel/process.c | |||
@@ -82,6 +82,30 @@ void flush_thread(void) | |||
82 | { | 82 | { |
83 | } | 83 | } |
84 | 84 | ||
85 | int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src) | ||
86 | { | ||
87 | /* | ||
88 | * Save any process state which is live in hardware registers to the | ||
89 | * parent context prior to duplication. This prevents the new child | ||
90 | * state becoming stale if the parent is preempted before copy_thread() | ||
91 | * gets a chance to save the parent's live hardware registers to the | ||
92 | * child context. | ||
93 | */ | ||
94 | preempt_disable(); | ||
95 | |||
96 | if (is_msa_enabled()) | ||
97 | save_msa(current); | ||
98 | else if (is_fpu_owner()) | ||
99 | _save_fp(current); | ||
100 | |||
101 | save_dsp(current); | ||
102 | |||
103 | preempt_enable(); | ||
104 | |||
105 | *dst = *src; | ||
106 | return 0; | ||
107 | } | ||
108 | |||
85 | int copy_thread(unsigned long clone_flags, unsigned long usp, | 109 | int copy_thread(unsigned long clone_flags, unsigned long usp, |
86 | unsigned long arg, struct task_struct *p) | 110 | unsigned long arg, struct task_struct *p) |
87 | { | 111 | { |
@@ -92,18 +116,6 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
92 | 116 | ||
93 | childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32; | 117 | childksp = (unsigned long)task_stack_page(p) + THREAD_SIZE - 32; |
94 | 118 | ||
95 | preempt_disable(); | ||
96 | |||
97 | if (is_msa_enabled()) | ||
98 | save_msa(p); | ||
99 | else if (is_fpu_owner()) | ||
100 | save_fp(p); | ||
101 | |||
102 | if (cpu_has_dsp) | ||
103 | save_dsp(p); | ||
104 | |||
105 | preempt_enable(); | ||
106 | |||
107 | /* set up new TSS. */ | 119 | /* set up new TSS. */ |
108 | childregs = (struct pt_regs *) childksp - 1; | 120 | childregs = (struct pt_regs *) childksp - 1; |
109 | /* Put the stack after the struct pt_regs. */ | 121 | /* Put the stack after the struct pt_regs. */ |
diff --git a/arch/mips/kernel/ptrace.c b/arch/mips/kernel/ptrace.c index 9d1487d83293..510452812594 100644 --- a/arch/mips/kernel/ptrace.c +++ b/arch/mips/kernel/ptrace.c | |||
@@ -770,6 +770,8 @@ asmlinkage long syscall_trace_enter(struct pt_regs *regs, long syscall) | |||
770 | long ret = 0; | 770 | long ret = 0; |
771 | user_exit(); | 771 | user_exit(); |
772 | 772 | ||
773 | current_thread_info()->syscall = syscall; | ||
774 | |||
773 | if (secure_computing() == -1) | 775 | if (secure_computing() == -1) |
774 | return -1; | 776 | return -1; |
775 | 777 | ||
diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S index 00cad1005a16..6e8de80bb446 100644 --- a/arch/mips/kernel/scall32-o32.S +++ b/arch/mips/kernel/scall32-o32.S | |||
@@ -181,6 +181,7 @@ illegal_syscall: | |||
181 | sll t1, t0, 2 | 181 | sll t1, t0, 2 |
182 | beqz v0, einval | 182 | beqz v0, einval |
183 | lw t2, sys_call_table(t1) # syscall routine | 183 | lw t2, sys_call_table(t1) # syscall routine |
184 | sw a0, PT_R2(sp) # call routine directly on restart | ||
184 | 185 | ||
185 | /* Some syscalls like execve get their arguments from struct pt_regs | 186 | /* Some syscalls like execve get their arguments from struct pt_regs |
186 | and claim zero arguments in the syscall table. Thus we have to | 187 | and claim zero arguments in the syscall table. Thus we have to |
@@ -580,3 +581,4 @@ EXPORT(sys_call_table) | |||
580 | PTR sys_getrandom | 581 | PTR sys_getrandom |
581 | PTR sys_memfd_create | 582 | PTR sys_memfd_create |
582 | PTR sys_bpf /* 4355 */ | 583 | PTR sys_bpf /* 4355 */ |
584 | PTR sys_execveat | ||
diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S index 5251565e344b..ad4d44635c76 100644 --- a/arch/mips/kernel/scall64-64.S +++ b/arch/mips/kernel/scall64-64.S | |||
@@ -435,4 +435,5 @@ EXPORT(sys_call_table) | |||
435 | PTR sys_getrandom | 435 | PTR sys_getrandom |
436 | PTR sys_memfd_create | 436 | PTR sys_memfd_create |
437 | PTR sys_bpf /* 5315 */ | 437 | PTR sys_bpf /* 5315 */ |
438 | PTR sys_execveat | ||
438 | .size sys_call_table,.-sys_call_table | 439 | .size sys_call_table,.-sys_call_table |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index 77e74398b828..446cc654da56 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
@@ -428,4 +428,5 @@ EXPORT(sysn32_call_table) | |||
428 | PTR sys_getrandom | 428 | PTR sys_getrandom |
429 | PTR sys_memfd_create | 429 | PTR sys_memfd_create |
430 | PTR sys_bpf | 430 | PTR sys_bpf |
431 | PTR compat_sys_execveat /* 6320 */ | ||
431 | .size sysn32_call_table,.-sysn32_call_table | 432 | .size sysn32_call_table,.-sysn32_call_table |
diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S index 6f8db9f728e8..d07b210fbeff 100644 --- a/arch/mips/kernel/scall64-o32.S +++ b/arch/mips/kernel/scall64-o32.S | |||
@@ -186,6 +186,7 @@ LEAF(sys32_syscall) | |||
186 | dsll t1, t0, 3 | 186 | dsll t1, t0, 3 |
187 | beqz v0, einval | 187 | beqz v0, einval |
188 | ld t2, sys32_call_table(t1) # syscall routine | 188 | ld t2, sys32_call_table(t1) # syscall routine |
189 | sd a0, PT_R2(sp) # call routine directly on restart | ||
189 | 190 | ||
190 | move a0, a1 # shift argument registers | 191 | move a0, a1 # shift argument registers |
191 | move a1, a2 | 192 | move a1, a2 |
@@ -565,4 +566,5 @@ EXPORT(sys32_call_table) | |||
565 | PTR sys_getrandom | 566 | PTR sys_getrandom |
566 | PTR sys_memfd_create | 567 | PTR sys_memfd_create |
567 | PTR sys_bpf /* 4355 */ | 568 | PTR sys_bpf /* 4355 */ |
569 | PTR compat_sys_execveat | ||
568 | .size sys32_call_table,.-sys32_call_table | 570 | .size sys32_call_table,.-sys32_call_table |
diff --git a/arch/mips/kernel/smp-cmp.c b/arch/mips/kernel/smp-cmp.c index 1e0a93c5a3e7..e36a859af666 100644 --- a/arch/mips/kernel/smp-cmp.c +++ b/arch/mips/kernel/smp-cmp.c | |||
@@ -44,8 +44,8 @@ static void cmp_init_secondary(void) | |||
44 | struct cpuinfo_mips *c __maybe_unused = ¤t_cpu_data; | 44 | struct cpuinfo_mips *c __maybe_unused = ¤t_cpu_data; |
45 | 45 | ||
46 | /* Assume GIC is present */ | 46 | /* Assume GIC is present */ |
47 | change_c0_status(ST0_IM, STATUSF_IP3 | STATUSF_IP4 | STATUSF_IP6 | | 47 | change_c0_status(ST0_IM, STATUSF_IP2 | STATUSF_IP3 | STATUSF_IP4 | |
48 | STATUSF_IP7); | 48 | STATUSF_IP5 | STATUSF_IP6 | STATUSF_IP7); |
49 | 49 | ||
50 | /* Enable per-cpu interrupts: platform specific */ | 50 | /* Enable per-cpu interrupts: platform specific */ |
51 | 51 | ||
diff --git a/arch/mips/kernel/smp-mt.c b/arch/mips/kernel/smp-mt.c index ad86951b73bd..17ea705f6c40 100644 --- a/arch/mips/kernel/smp-mt.c +++ b/arch/mips/kernel/smp-mt.c | |||
@@ -161,7 +161,8 @@ static void vsmp_init_secondary(void) | |||
161 | #ifdef CONFIG_MIPS_GIC | 161 | #ifdef CONFIG_MIPS_GIC |
162 | /* This is Malta specific: IPI,performance and timer interrupts */ | 162 | /* This is Malta specific: IPI,performance and timer interrupts */ |
163 | if (gic_present) | 163 | if (gic_present) |
164 | change_c0_status(ST0_IM, STATUSF_IP3 | STATUSF_IP4 | | 164 | change_c0_status(ST0_IM, STATUSF_IP2 | STATUSF_IP3 | |
165 | STATUSF_IP4 | STATUSF_IP5 | | ||
165 | STATUSF_IP6 | STATUSF_IP7); | 166 | STATUSF_IP6 | STATUSF_IP7); |
166 | else | 167 | else |
167 | #endif | 168 | #endif |
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index c94c4e92e17d..1c0d8c50b7e1 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
@@ -123,10 +123,10 @@ asmlinkage void start_secondary(void) | |||
123 | unsigned int cpu; | 123 | unsigned int cpu; |
124 | 124 | ||
125 | cpu_probe(); | 125 | cpu_probe(); |
126 | cpu_report(); | ||
127 | per_cpu_trap_init(false); | 126 | per_cpu_trap_init(false); |
128 | mips_clockevent_init(); | 127 | mips_clockevent_init(); |
129 | mp_ops->init_secondary(); | 128 | mp_ops->init_secondary(); |
129 | cpu_report(); | ||
130 | 130 | ||
131 | /* | 131 | /* |
132 | * XXX parity protection should be folded in here when it's converted | 132 | * XXX parity protection should be folded in here when it's converted |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index ad3d2031c327..c3b41e24c05a 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -1231,7 +1231,8 @@ static int enable_restore_fp_context(int msa) | |||
1231 | 1231 | ||
1232 | /* Restore the scalar FP control & status register */ | 1232 | /* Restore the scalar FP control & status register */ |
1233 | if (!was_fpu_owner) | 1233 | if (!was_fpu_owner) |
1234 | asm volatile("ctc1 %0, $31" : : "r"(current->thread.fpu.fcr31)); | 1234 | write_32bit_cp1_register(CP1_STATUS, |
1235 | current->thread.fpu.fcr31); | ||
1235 | } | 1236 | } |
1236 | 1237 | ||
1237 | out: | 1238 | out: |
diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c index e90b2e899291..30639a6e9b8c 100644 --- a/arch/mips/mm/tlb-r4k.c +++ b/arch/mips/mm/tlb-r4k.c | |||
@@ -489,6 +489,8 @@ static void r4k_tlb_configure(void) | |||
489 | #ifdef CONFIG_64BIT | 489 | #ifdef CONFIG_64BIT |
490 | pg |= PG_ELPA; | 490 | pg |= PG_ELPA; |
491 | #endif | 491 | #endif |
492 | if (cpu_has_rixiex) | ||
493 | pg |= PG_IEC; | ||
492 | write_c0_pagegrain(pg); | 494 | write_c0_pagegrain(pg); |
493 | } | 495 | } |
494 | 496 | ||
diff --git a/arch/mn10300/include/asm/cacheflush.h b/arch/mn10300/include/asm/cacheflush.h index faed90240ded..6d6df839948f 100644 --- a/arch/mn10300/include/asm/cacheflush.h +++ b/arch/mn10300/include/asm/cacheflush.h | |||
@@ -159,13 +159,6 @@ extern void flush_icache_range(unsigned long start, unsigned long end); | |||
159 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | 159 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ |
160 | memcpy(dst, src, len) | 160 | memcpy(dst, src, len) |
161 | 161 | ||
162 | /* | ||
163 | * Internal debugging function | ||
164 | */ | ||
165 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
166 | extern void kernel_map_pages(struct page *page, int numpages, int enable); | ||
167 | #endif | ||
168 | |||
169 | #endif /* __ASSEMBLY__ */ | 162 | #endif /* __ASSEMBLY__ */ |
170 | 163 | ||
171 | #endif /* _ASM_CACHEFLUSH_H */ | 164 | #endif /* _ASM_CACHEFLUSH_H */ |
diff --git a/arch/nios2/mm/fault.c b/arch/nios2/mm/fault.c index 34429d5a0ccd..d194c0427b26 100644 --- a/arch/nios2/mm/fault.c +++ b/arch/nios2/mm/fault.c | |||
@@ -159,9 +159,11 @@ bad_area: | |||
159 | bad_area_nosemaphore: | 159 | bad_area_nosemaphore: |
160 | /* User mode accesses just cause a SIGSEGV */ | 160 | /* User mode accesses just cause a SIGSEGV */ |
161 | if (user_mode(regs)) { | 161 | if (user_mode(regs)) { |
162 | pr_alert("%s: unhandled page fault (%d) at 0x%08lx, " | 162 | if (unhandled_signal(current, SIGSEGV) && printk_ratelimit()) { |
163 | "cause %ld\n", current->comm, SIGSEGV, address, cause); | 163 | pr_info("%s: unhandled page fault (%d) at 0x%08lx, " |
164 | show_regs(regs); | 164 | "cause %ld\n", current->comm, SIGSEGV, address, cause); |
165 | show_regs(regs); | ||
166 | } | ||
165 | _exception(SIGSEGV, regs, code, address); | 167 | _exception(SIGSEGV, regs, code, address); |
166 | return; | 168 | return; |
167 | } | 169 | } |
diff --git a/arch/powerpc/include/asm/cacheflush.h b/arch/powerpc/include/asm/cacheflush.h index 5b9312220e84..30b35fff2dea 100644 --- a/arch/powerpc/include/asm/cacheflush.h +++ b/arch/powerpc/include/asm/cacheflush.h | |||
@@ -60,13 +60,6 @@ extern void flush_dcache_phys_range(unsigned long start, unsigned long stop); | |||
60 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | 60 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ |
61 | memcpy(dst, src, len) | 61 | memcpy(dst, src, len) |
62 | 62 | ||
63 | |||
64 | |||
65 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
66 | /* internal debugging function */ | ||
67 | void kernel_map_pages(struct page *page, int numpages, int enable); | ||
68 | #endif | ||
69 | |||
70 | #endif /* __KERNEL__ */ | 63 | #endif /* __KERNEL__ */ |
71 | 64 | ||
72 | #endif /* _ASM_POWERPC_CACHEFLUSH_H */ | 65 | #endif /* _ASM_POWERPC_CACHEFLUSH_H */ |
diff --git a/arch/s390/include/asm/cacheflush.h b/arch/s390/include/asm/cacheflush.h index 3e20383d0921..58fae7d098cf 100644 --- a/arch/s390/include/asm/cacheflush.h +++ b/arch/s390/include/asm/cacheflush.h | |||
@@ -4,10 +4,6 @@ | |||
4 | /* Caches aren't brain-dead on the s390. */ | 4 | /* Caches aren't brain-dead on the s390. */ |
5 | #include <asm-generic/cacheflush.h> | 5 | #include <asm-generic/cacheflush.h> |
6 | 6 | ||
7 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
8 | void kernel_map_pages(struct page *page, int numpages, int enable); | ||
9 | #endif | ||
10 | |||
11 | int set_memory_ro(unsigned long addr, int numpages); | 7 | int set_memory_ro(unsigned long addr, int numpages); |
12 | int set_memory_rw(unsigned long addr, int numpages); | 8 | int set_memory_rw(unsigned long addr, int numpages); |
13 | int set_memory_nx(unsigned long addr, int numpages); | 9 | int set_memory_nx(unsigned long addr, int numpages); |
diff --git a/arch/sparc/include/asm/cacheflush_64.h b/arch/sparc/include/asm/cacheflush_64.h index 38965379e350..68513c41e10d 100644 --- a/arch/sparc/include/asm/cacheflush_64.h +++ b/arch/sparc/include/asm/cacheflush_64.h | |||
@@ -74,11 +74,6 @@ void flush_ptrace_access(struct vm_area_struct *, struct page *, | |||
74 | #define flush_cache_vmap(start, end) do { } while (0) | 74 | #define flush_cache_vmap(start, end) do { } while (0) |
75 | #define flush_cache_vunmap(start, end) do { } while (0) | 75 | #define flush_cache_vunmap(start, end) do { } while (0) |
76 | 76 | ||
77 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
78 | /* internal debugging function */ | ||
79 | void kernel_map_pages(struct page *page, int numpages, int enable); | ||
80 | #endif | ||
81 | |||
82 | #endif /* !__ASSEMBLY__ */ | 77 | #endif /* !__ASSEMBLY__ */ |
83 | 78 | ||
84 | #endif /* _SPARC64_CACHEFLUSH_H */ | 79 | #endif /* _SPARC64_CACHEFLUSH_H */ |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 0dc9d0144a27..3e15cee34aee 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -496,6 +496,17 @@ config X86_INTEL_LPSS | |||
496 | things like clock tree (common clock framework) and pincontrol | 496 | things like clock tree (common clock framework) and pincontrol |
497 | which are needed by the LPSS peripheral drivers. | 497 | which are needed by the LPSS peripheral drivers. |
498 | 498 | ||
499 | config X86_AMD_PLATFORM_DEVICE | ||
500 | bool "AMD ACPI2Platform devices support" | ||
501 | depends on ACPI | ||
502 | select COMMON_CLK | ||
503 | select PINCTRL | ||
504 | ---help--- | ||
505 | Select to interpret AMD specific ACPI device to platform device | ||
506 | such as I2C, UART, GPIO found on AMD Carrizo and later chipsets. | ||
507 | I2C and UART depend on COMMON_CLK to set clock. GPIO driver is | ||
508 | implemented under PINCTRL subsystem. | ||
509 | |||
499 | config IOSF_MBI | 510 | config IOSF_MBI |
500 | tristate "Intel SoC IOSF Sideband support for SoC platforms" | 511 | tristate "Intel SoC IOSF Sideband support for SoC platforms" |
501 | depends on PCI | 512 | depends on PCI |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index b9e30daa0881..14d3652ece8d 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -843,13 +843,7 @@ int acpi_ioapic_registered(acpi_handle handle, u32 gsi_base) | |||
843 | 843 | ||
844 | static int __init acpi_parse_sbf(struct acpi_table_header *table) | 844 | static int __init acpi_parse_sbf(struct acpi_table_header *table) |
845 | { | 845 | { |
846 | struct acpi_table_boot *sb; | 846 | struct acpi_table_boot *sb = (struct acpi_table_boot *)table; |
847 | |||
848 | sb = (struct acpi_table_boot *)table; | ||
849 | if (!sb) { | ||
850 | printk(KERN_WARNING PREFIX "Unable to map SBF\n"); | ||
851 | return -ENODEV; | ||
852 | } | ||
853 | 847 | ||
854 | sbf_port = sb->cmos_index; /* Save CMOS port */ | 848 | sbf_port = sb->cmos_index; /* Save CMOS port */ |
855 | 849 | ||
@@ -863,13 +857,7 @@ static struct resource *hpet_res __initdata; | |||
863 | 857 | ||
864 | static int __init acpi_parse_hpet(struct acpi_table_header *table) | 858 | static int __init acpi_parse_hpet(struct acpi_table_header *table) |
865 | { | 859 | { |
866 | struct acpi_table_hpet *hpet_tbl; | 860 | struct acpi_table_hpet *hpet_tbl = (struct acpi_table_hpet *)table; |
867 | |||
868 | hpet_tbl = (struct acpi_table_hpet *)table; | ||
869 | if (!hpet_tbl) { | ||
870 | printk(KERN_WARNING PREFIX "Unable to map HPET\n"); | ||
871 | return -ENODEV; | ||
872 | } | ||
873 | 861 | ||
874 | if (hpet_tbl->address.space_id != ACPI_SPACE_MEM) { | 862 | if (hpet_tbl->address.space_id != ACPI_SPACE_MEM) { |
875 | printk(KERN_WARNING PREFIX "HPET timers must be located in " | 863 | printk(KERN_WARNING PREFIX "HPET timers must be located in " |
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c index 15c29096136b..36a83617eb21 100644 --- a/arch/x86/kernel/cpu/microcode/core.c +++ b/arch/x86/kernel/cpu/microcode/core.c | |||
@@ -552,7 +552,7 @@ static int __init microcode_init(void) | |||
552 | int error; | 552 | int error; |
553 | 553 | ||
554 | if (paravirt_enabled() || dis_ucode_ldr) | 554 | if (paravirt_enabled() || dis_ucode_ldr) |
555 | return 0; | 555 | return -EINVAL; |
556 | 556 | ||
557 | if (c->x86_vendor == X86_VENDOR_INTEL) | 557 | if (c->x86_vendor == X86_VENDOR_INTEL) |
558 | microcode_ops = init_intel_microcode(); | 558 | microcode_ops = init_intel_microcode(); |
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index ff1f0afa5ed1..3d2612b68694 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
@@ -448,6 +448,22 @@ static const struct dmi_system_id pciprobe_dmi_table[] __initconst = { | |||
448 | DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"), | 448 | DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"), |
449 | }, | 449 | }, |
450 | }, | 450 | }, |
451 | { | ||
452 | .callback = set_scan_all, | ||
453 | .ident = "Stratus/NEC ftServer", | ||
454 | .matches = { | ||
455 | DMI_MATCH(DMI_SYS_VENDOR, "NEC"), | ||
456 | DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R32"), | ||
457 | }, | ||
458 | }, | ||
459 | { | ||
460 | .callback = set_scan_all, | ||
461 | .ident = "Stratus/NEC ftServer", | ||
462 | .matches = { | ||
463 | DMI_MATCH(DMI_SYS_VENDOR, "NEC"), | ||
464 | DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R31"), | ||
465 | }, | ||
466 | }, | ||
451 | {} | 467 | {} |
452 | }; | 468 | }; |
453 | 469 | ||
diff --git a/block/blk-mq-sysfs.c b/block/blk-mq-sysfs.c index 6774a0e69867..1630a20d5dcf 100644 --- a/block/blk-mq-sysfs.c +++ b/block/blk-mq-sysfs.c | |||
@@ -15,26 +15,6 @@ | |||
15 | 15 | ||
16 | static void blk_mq_sysfs_release(struct kobject *kobj) | 16 | static void blk_mq_sysfs_release(struct kobject *kobj) |
17 | { | 17 | { |
18 | struct request_queue *q; | ||
19 | |||
20 | q = container_of(kobj, struct request_queue, mq_kobj); | ||
21 | free_percpu(q->queue_ctx); | ||
22 | } | ||
23 | |||
24 | static void blk_mq_ctx_release(struct kobject *kobj) | ||
25 | { | ||
26 | struct blk_mq_ctx *ctx; | ||
27 | |||
28 | ctx = container_of(kobj, struct blk_mq_ctx, kobj); | ||
29 | kobject_put(&ctx->queue->mq_kobj); | ||
30 | } | ||
31 | |||
32 | static void blk_mq_hctx_release(struct kobject *kobj) | ||
33 | { | ||
34 | struct blk_mq_hw_ctx *hctx; | ||
35 | |||
36 | hctx = container_of(kobj, struct blk_mq_hw_ctx, kobj); | ||
37 | kfree(hctx); | ||
38 | } | 18 | } |
39 | 19 | ||
40 | struct blk_mq_ctx_sysfs_entry { | 20 | struct blk_mq_ctx_sysfs_entry { |
@@ -338,13 +318,13 @@ static struct kobj_type blk_mq_ktype = { | |||
338 | static struct kobj_type blk_mq_ctx_ktype = { | 318 | static struct kobj_type blk_mq_ctx_ktype = { |
339 | .sysfs_ops = &blk_mq_sysfs_ops, | 319 | .sysfs_ops = &blk_mq_sysfs_ops, |
340 | .default_attrs = default_ctx_attrs, | 320 | .default_attrs = default_ctx_attrs, |
341 | .release = blk_mq_ctx_release, | 321 | .release = blk_mq_sysfs_release, |
342 | }; | 322 | }; |
343 | 323 | ||
344 | static struct kobj_type blk_mq_hw_ktype = { | 324 | static struct kobj_type blk_mq_hw_ktype = { |
345 | .sysfs_ops = &blk_mq_hw_sysfs_ops, | 325 | .sysfs_ops = &blk_mq_hw_sysfs_ops, |
346 | .default_attrs = default_hw_ctx_attrs, | 326 | .default_attrs = default_hw_ctx_attrs, |
347 | .release = blk_mq_hctx_release, | 327 | .release = blk_mq_sysfs_release, |
348 | }; | 328 | }; |
349 | 329 | ||
350 | static void blk_mq_unregister_hctx(struct blk_mq_hw_ctx *hctx) | 330 | static void blk_mq_unregister_hctx(struct blk_mq_hw_ctx *hctx) |
@@ -375,7 +355,6 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx) | |||
375 | return ret; | 355 | return ret; |
376 | 356 | ||
377 | hctx_for_each_ctx(hctx, ctx, i) { | 357 | hctx_for_each_ctx(hctx, ctx, i) { |
378 | kobject_get(&q->mq_kobj); | ||
379 | ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu); | 358 | ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu); |
380 | if (ret) | 359 | if (ret) |
381 | break; | 360 | break; |
diff --git a/block/blk-mq.c b/block/blk-mq.c index 9ee3b87c4498..2390c5541e71 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
@@ -1867,6 +1867,27 @@ static void blk_mq_add_queue_tag_set(struct blk_mq_tag_set *set, | |||
1867 | mutex_unlock(&set->tag_list_lock); | 1867 | mutex_unlock(&set->tag_list_lock); |
1868 | } | 1868 | } |
1869 | 1869 | ||
1870 | /* | ||
1871 | * It is the actual release handler for mq, but we do it from | ||
1872 | * request queue's release handler for avoiding use-after-free | ||
1873 | * and headache because q->mq_kobj shouldn't have been introduced, | ||
1874 | * but we can't group ctx/kctx kobj without it. | ||
1875 | */ | ||
1876 | void blk_mq_release(struct request_queue *q) | ||
1877 | { | ||
1878 | struct blk_mq_hw_ctx *hctx; | ||
1879 | unsigned int i; | ||
1880 | |||
1881 | /* hctx kobj stays in hctx */ | ||
1882 | queue_for_each_hw_ctx(q, hctx, i) | ||
1883 | kfree(hctx); | ||
1884 | |||
1885 | kfree(q->queue_hw_ctx); | ||
1886 | |||
1887 | /* ctx kobj stays in queue_ctx */ | ||
1888 | free_percpu(q->queue_ctx); | ||
1889 | } | ||
1890 | |||
1870 | struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set) | 1891 | struct request_queue *blk_mq_init_queue(struct blk_mq_tag_set *set) |
1871 | { | 1892 | { |
1872 | struct blk_mq_hw_ctx **hctxs; | 1893 | struct blk_mq_hw_ctx **hctxs; |
@@ -2000,10 +2021,8 @@ void blk_mq_free_queue(struct request_queue *q) | |||
2000 | 2021 | ||
2001 | percpu_ref_exit(&q->mq_usage_counter); | 2022 | percpu_ref_exit(&q->mq_usage_counter); |
2002 | 2023 | ||
2003 | kfree(q->queue_hw_ctx); | ||
2004 | kfree(q->mq_map); | 2024 | kfree(q->mq_map); |
2005 | 2025 | ||
2006 | q->queue_hw_ctx = NULL; | ||
2007 | q->mq_map = NULL; | 2026 | q->mq_map = NULL; |
2008 | 2027 | ||
2009 | mutex_lock(&all_q_mutex); | 2028 | mutex_lock(&all_q_mutex); |
diff --git a/block/blk-mq.h b/block/blk-mq.h index 4f4f943c22c3..6a48c4c0d8a2 100644 --- a/block/blk-mq.h +++ b/block/blk-mq.h | |||
@@ -62,6 +62,8 @@ extern void blk_mq_sysfs_unregister(struct request_queue *q); | |||
62 | 62 | ||
63 | extern void blk_mq_rq_timed_out(struct request *req, bool reserved); | 63 | extern void blk_mq_rq_timed_out(struct request *req, bool reserved); |
64 | 64 | ||
65 | void blk_mq_release(struct request_queue *q); | ||
66 | |||
65 | /* | 67 | /* |
66 | * Basic implementation of sparser bitmap, allowing the user to spread | 68 | * Basic implementation of sparser bitmap, allowing the user to spread |
67 | * the bits over more cachelines. | 69 | * the bits over more cachelines. |
diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 935ea2aa0730..faaf36ade7eb 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c | |||
@@ -517,6 +517,8 @@ static void blk_release_queue(struct kobject *kobj) | |||
517 | 517 | ||
518 | if (!q->mq_ops) | 518 | if (!q->mq_ops) |
519 | blk_free_flush_queue(q->fq); | 519 | blk_free_flush_queue(q->fq); |
520 | else | ||
521 | blk_mq_release(q); | ||
520 | 522 | ||
521 | blk_trace_shutdown(q); | 523 | blk_trace_shutdown(q); |
522 | 524 | ||
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile index e59494c90402..b18cd2151ddb 100644 --- a/drivers/acpi/Makefile +++ b/drivers/acpi/Makefile | |||
@@ -40,7 +40,7 @@ acpi-$(CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC) += processor_pdc.o | |||
40 | acpi-y += ec.o | 40 | acpi-y += ec.o |
41 | acpi-$(CONFIG_ACPI_DOCK) += dock.o | 41 | acpi-$(CONFIG_ACPI_DOCK) += dock.o |
42 | acpi-y += pci_root.o pci_link.o pci_irq.o | 42 | acpi-y += pci_root.o pci_link.o pci_irq.o |
43 | acpi-y += acpi_lpss.o | 43 | acpi-y += acpi_lpss.o acpi_apd.o |
44 | acpi-y += acpi_platform.o | 44 | acpi-y += acpi_platform.o |
45 | acpi-y += acpi_pnp.o | 45 | acpi-y += acpi_pnp.o |
46 | acpi-y += int340x_thermal.o | 46 | acpi-y += int340x_thermal.o |
diff --git a/drivers/acpi/acpi_apd.c b/drivers/acpi/acpi_apd.c new file mode 100644 index 000000000000..3984ea96e5f7 --- /dev/null +++ b/drivers/acpi/acpi_apd.c | |||
@@ -0,0 +1,150 @@ | |||
1 | /* | ||
2 | * AMD ACPI support for ACPI2platform device. | ||
3 | * | ||
4 | * Copyright (c) 2014,2015 AMD Corporation. | ||
5 | * Authors: Ken Xue <Ken.Xue@amd.com> | ||
6 | * Wu, Jeff <Jeff.Wu@amd.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | */ | ||
12 | |||
13 | #include <linux/clk-provider.h> | ||
14 | #include <linux/platform_device.h> | ||
15 | #include <linux/pm_domain.h> | ||
16 | #include <linux/clkdev.h> | ||
17 | #include <linux/acpi.h> | ||
18 | #include <linux/err.h> | ||
19 | #include <linux/clk.h> | ||
20 | #include <linux/pm.h> | ||
21 | |||
22 | #include "internal.h" | ||
23 | |||
24 | ACPI_MODULE_NAME("acpi_apd"); | ||
25 | struct apd_private_data; | ||
26 | |||
27 | /** | ||
28 | * ACPI_APD_SYSFS : add device attributes in sysfs | ||
29 | * ACPI_APD_PM : attach power domain to device | ||
30 | */ | ||
31 | #define ACPI_APD_SYSFS BIT(0) | ||
32 | #define ACPI_APD_PM BIT(1) | ||
33 | |||
34 | /** | ||
35 | * struct apd_device_desc - a descriptor for apd device | ||
36 | * @flags: device flags like %ACPI_APD_SYSFS, %ACPI_APD_PM | ||
37 | * @fixed_clk_rate: fixed rate input clock source for acpi device; | ||
38 | * 0 means no fixed rate input clock source | ||
39 | * @setup: a hook routine to set device resource during create platform device | ||
40 | * | ||
41 | * Device description defined as acpi_device_id.driver_data | ||
42 | */ | ||
43 | struct apd_device_desc { | ||
44 | unsigned int flags; | ||
45 | unsigned int fixed_clk_rate; | ||
46 | int (*setup)(struct apd_private_data *pdata); | ||
47 | }; | ||
48 | |||
49 | struct apd_private_data { | ||
50 | struct clk *clk; | ||
51 | struct acpi_device *adev; | ||
52 | const struct apd_device_desc *dev_desc; | ||
53 | }; | ||
54 | |||
55 | #ifdef CONFIG_X86_AMD_PLATFORM_DEVICE | ||
56 | #define APD_ADDR(desc) ((unsigned long)&desc) | ||
57 | |||
58 | static int acpi_apd_setup(struct apd_private_data *pdata) | ||
59 | { | ||
60 | const struct apd_device_desc *dev_desc = pdata->dev_desc; | ||
61 | struct clk *clk = ERR_PTR(-ENODEV); | ||
62 | |||
63 | if (dev_desc->fixed_clk_rate) { | ||
64 | clk = clk_register_fixed_rate(&pdata->adev->dev, | ||
65 | dev_name(&pdata->adev->dev), | ||
66 | NULL, CLK_IS_ROOT, | ||
67 | dev_desc->fixed_clk_rate); | ||
68 | clk_register_clkdev(clk, NULL, dev_name(&pdata->adev->dev)); | ||
69 | pdata->clk = clk; | ||
70 | } | ||
71 | |||
72 | return 0; | ||
73 | } | ||
74 | |||
75 | static struct apd_device_desc cz_i2c_desc = { | ||
76 | .setup = acpi_apd_setup, | ||
77 | .fixed_clk_rate = 133000000, | ||
78 | }; | ||
79 | |||
80 | static struct apd_device_desc cz_uart_desc = { | ||
81 | .setup = acpi_apd_setup, | ||
82 | .fixed_clk_rate = 48000000, | ||
83 | }; | ||
84 | |||
85 | #else | ||
86 | |||
87 | #define APD_ADDR(desc) (0UL) | ||
88 | |||
89 | #endif /* CONFIG_X86_AMD_PLATFORM_DEVICE */ | ||
90 | |||
91 | /** | ||
92 | * Create platform device during acpi scan attach handle. | ||
93 | * Return value > 0 on success of creating device. | ||
94 | */ | ||
95 | static int acpi_apd_create_device(struct acpi_device *adev, | ||
96 | const struct acpi_device_id *id) | ||
97 | { | ||
98 | const struct apd_device_desc *dev_desc = (void *)id->driver_data; | ||
99 | struct apd_private_data *pdata; | ||
100 | struct platform_device *pdev; | ||
101 | int ret; | ||
102 | |||
103 | if (!dev_desc) { | ||
104 | pdev = acpi_create_platform_device(adev); | ||
105 | return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1; | ||
106 | } | ||
107 | |||
108 | pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); | ||
109 | if (!pdata) | ||
110 | return -ENOMEM; | ||
111 | |||
112 | pdata->adev = adev; | ||
113 | pdata->dev_desc = dev_desc; | ||
114 | |||
115 | if (dev_desc->setup) { | ||
116 | ret = dev_desc->setup(pdata); | ||
117 | if (ret) | ||
118 | goto err_out; | ||
119 | } | ||
120 | |||
121 | adev->driver_data = pdata; | ||
122 | pdev = acpi_create_platform_device(adev); | ||
123 | if (!IS_ERR_OR_NULL(pdev)) | ||
124 | return 1; | ||
125 | |||
126 | ret = PTR_ERR(pdev); | ||
127 | adev->driver_data = NULL; | ||
128 | |||
129 | err_out: | ||
130 | kfree(pdata); | ||
131 | return ret; | ||
132 | } | ||
133 | |||
134 | static const struct acpi_device_id acpi_apd_device_ids[] = { | ||
135 | /* Generic apd devices */ | ||
136 | { "AMD0010", APD_ADDR(cz_i2c_desc) }, | ||
137 | { "AMD0020", APD_ADDR(cz_uart_desc) }, | ||
138 | { "AMD0030", }, | ||
139 | { } | ||
140 | }; | ||
141 | |||
142 | static struct acpi_scan_handler apd_handler = { | ||
143 | .ids = acpi_apd_device_ids, | ||
144 | .attach = acpi_apd_create_device, | ||
145 | }; | ||
146 | |||
147 | void __init acpi_apd_init(void) | ||
148 | { | ||
149 | acpi_scan_add_handler(&apd_handler); | ||
150 | } | ||
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index dfd1b8095dad..02e835f3cf8a 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * ACPI support for Intel Lynxpoint LPSS. | 2 | * ACPI support for Intel Lynxpoint LPSS. |
3 | * | 3 | * |
4 | * Copyright (C) 2013, 2014, Intel Corporation | 4 | * Copyright (C) 2013, Intel Corporation |
5 | * Authors: Mika Westerberg <mika.westerberg@linux.intel.com> | 5 | * Authors: Mika Westerberg <mika.westerberg@linux.intel.com> |
6 | * Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 6 | * Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
7 | * | 7 | * |
@@ -60,8 +60,6 @@ ACPI_MODULE_NAME("acpi_lpss"); | |||
60 | #define LPSS_CLK_DIVIDER BIT(2) | 60 | #define LPSS_CLK_DIVIDER BIT(2) |
61 | #define LPSS_LTR BIT(3) | 61 | #define LPSS_LTR BIT(3) |
62 | #define LPSS_SAVE_CTX BIT(4) | 62 | #define LPSS_SAVE_CTX BIT(4) |
63 | #define LPSS_DEV_PROXY BIT(5) | ||
64 | #define LPSS_PROXY_REQ BIT(6) | ||
65 | 63 | ||
66 | struct lpss_private_data; | 64 | struct lpss_private_data; |
67 | 65 | ||
@@ -72,10 +70,8 @@ struct lpss_device_desc { | |||
72 | void (*setup)(struct lpss_private_data *pdata); | 70 | void (*setup)(struct lpss_private_data *pdata); |
73 | }; | 71 | }; |
74 | 72 | ||
75 | static struct device *proxy_device; | ||
76 | |||
77 | static struct lpss_device_desc lpss_dma_desc = { | 73 | static struct lpss_device_desc lpss_dma_desc = { |
78 | .flags = LPSS_CLK | LPSS_PROXY_REQ, | 74 | .flags = LPSS_CLK, |
79 | }; | 75 | }; |
80 | 76 | ||
81 | struct lpss_private_data { | 77 | struct lpss_private_data { |
@@ -129,7 +125,7 @@ static struct lpss_device_desc lpt_dev_desc = { | |||
129 | }; | 125 | }; |
130 | 126 | ||
131 | static struct lpss_device_desc lpt_i2c_dev_desc = { | 127 | static struct lpss_device_desc lpt_i2c_dev_desc = { |
132 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_LTR, | 128 | .flags = LPSS_CLK | LPSS_LTR, |
133 | .prv_offset = 0x800, | 129 | .prv_offset = 0x800, |
134 | }; | 130 | }; |
135 | 131 | ||
@@ -150,24 +146,22 @@ static struct lpss_device_desc byt_pwm_dev_desc = { | |||
150 | }; | 146 | }; |
151 | 147 | ||
152 | static struct lpss_device_desc byt_uart_dev_desc = { | 148 | static struct lpss_device_desc byt_uart_dev_desc = { |
153 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX | | 149 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX, |
154 | LPSS_DEV_PROXY, | ||
155 | .prv_offset = 0x800, | 150 | .prv_offset = 0x800, |
156 | .setup = lpss_uart_setup, | 151 | .setup = lpss_uart_setup, |
157 | }; | 152 | }; |
158 | 153 | ||
159 | static struct lpss_device_desc byt_spi_dev_desc = { | 154 | static struct lpss_device_desc byt_spi_dev_desc = { |
160 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX | | 155 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_SAVE_CTX, |
161 | LPSS_DEV_PROXY, | ||
162 | .prv_offset = 0x400, | 156 | .prv_offset = 0x400, |
163 | }; | 157 | }; |
164 | 158 | ||
165 | static struct lpss_device_desc byt_sdio_dev_desc = { | 159 | static struct lpss_device_desc byt_sdio_dev_desc = { |
166 | .flags = LPSS_CLK | LPSS_DEV_PROXY, | 160 | .flags = LPSS_CLK, |
167 | }; | 161 | }; |
168 | 162 | ||
169 | static struct lpss_device_desc byt_i2c_dev_desc = { | 163 | static struct lpss_device_desc byt_i2c_dev_desc = { |
170 | .flags = LPSS_CLK | LPSS_SAVE_CTX | LPSS_DEV_PROXY, | 164 | .flags = LPSS_CLK | LPSS_SAVE_CTX, |
171 | .prv_offset = 0x800, | 165 | .prv_offset = 0x800, |
172 | .setup = byt_i2c_setup, | 166 | .setup = byt_i2c_setup, |
173 | }; | 167 | }; |
@@ -340,6 +334,8 @@ static int acpi_lpss_create_device(struct acpi_device *adev, | |||
340 | pdata->mmio_size = resource_size(rentry->res); | 334 | pdata->mmio_size = resource_size(rentry->res); |
341 | pdata->mmio_base = ioremap(rentry->res->start, | 335 | pdata->mmio_base = ioremap(rentry->res->start, |
342 | pdata->mmio_size); | 336 | pdata->mmio_size); |
337 | if (!pdata->mmio_base) | ||
338 | goto err_out; | ||
343 | break; | 339 | break; |
344 | } | 340 | } |
345 | 341 | ||
@@ -374,8 +370,6 @@ static int acpi_lpss_create_device(struct acpi_device *adev, | |||
374 | adev->driver_data = pdata; | 370 | adev->driver_data = pdata; |
375 | pdev = acpi_create_platform_device(adev); | 371 | pdev = acpi_create_platform_device(adev); |
376 | if (!IS_ERR_OR_NULL(pdev)) { | 372 | if (!IS_ERR_OR_NULL(pdev)) { |
377 | if (!proxy_device && dev_desc->flags & LPSS_DEV_PROXY) | ||
378 | proxy_device = &pdev->dev; | ||
379 | return 1; | 373 | return 1; |
380 | } | 374 | } |
381 | 375 | ||
@@ -600,14 +594,7 @@ static int acpi_lpss_runtime_suspend(struct device *dev) | |||
600 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) | 594 | if (pdata->dev_desc->flags & LPSS_SAVE_CTX) |
601 | acpi_lpss_save_ctx(dev, pdata); | 595 | acpi_lpss_save_ctx(dev, pdata); |
602 | 596 | ||
603 | ret = acpi_dev_runtime_suspend(dev); | 597 | return acpi_dev_runtime_suspend(dev); |
604 | if (ret) | ||
605 | return ret; | ||
606 | |||
607 | if (pdata->dev_desc->flags & LPSS_PROXY_REQ && proxy_device) | ||
608 | return pm_runtime_put_sync_suspend(proxy_device); | ||
609 | |||
610 | return 0; | ||
611 | } | 598 | } |
612 | 599 | ||
613 | static int acpi_lpss_runtime_resume(struct device *dev) | 600 | static int acpi_lpss_runtime_resume(struct device *dev) |
@@ -615,12 +602,6 @@ static int acpi_lpss_runtime_resume(struct device *dev) | |||
615 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); | 602 | struct lpss_private_data *pdata = acpi_driver_data(ACPI_COMPANION(dev)); |
616 | int ret; | 603 | int ret; |
617 | 604 | ||
618 | if (pdata->dev_desc->flags & LPSS_PROXY_REQ && proxy_device) { | ||
619 | ret = pm_runtime_get_sync(proxy_device); | ||
620 | if (ret) | ||
621 | return ret; | ||
622 | } | ||
623 | |||
624 | ret = acpi_dev_runtime_resume(dev); | 605 | ret = acpi_dev_runtime_resume(dev); |
625 | if (ret) | 606 | if (ret) |
626 | return ret; | 607 | return ret; |
diff --git a/drivers/acpi/acpica/acapps.h b/drivers/acpi/acpica/acapps.h index 3d2c88289da9..d863016565b5 100644 --- a/drivers/acpi/acpica/acapps.h +++ b/drivers/acpi/acpica/acapps.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -47,7 +47,7 @@ | |||
47 | /* Common info for tool signons */ | 47 | /* Common info for tool signons */ |
48 | 48 | ||
49 | #define ACPICA_NAME "Intel ACPI Component Architecture" | 49 | #define ACPICA_NAME "Intel ACPI Component Architecture" |
50 | #define ACPICA_COPYRIGHT "Copyright (c) 2000 - 2014 Intel Corporation" | 50 | #define ACPICA_COPYRIGHT "Copyright (c) 2000 - 2015 Intel Corporation" |
51 | 51 | ||
52 | #if ACPI_MACHINE_WIDTH == 64 | 52 | #if ACPI_MACHINE_WIDTH == 64 |
53 | #define ACPI_WIDTH "-64" | 53 | #define ACPI_WIDTH "-64" |
diff --git a/drivers/acpi/acpica/accommon.h b/drivers/acpi/acpica/accommon.h index 6f1c616910ac..853aa2dbdb61 100644 --- a/drivers/acpi/acpica/accommon.h +++ b/drivers/acpi/acpica/accommon.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acdebug.h b/drivers/acpi/acpica/acdebug.h index 1d026ff1683f..4169bb87a996 100644 --- a/drivers/acpi/acpica/acdebug.h +++ b/drivers/acpi/acpica/acdebug.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acdispat.h b/drivers/acpi/acpica/acdispat.h index d3e2cc395d7f..408f04bcaab4 100644 --- a/drivers/acpi/acpica/acdispat.h +++ b/drivers/acpi/acpica/acdispat.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acevents.h b/drivers/acpi/acpica/acevents.h index 7a7811a9fc26..228704b78657 100644 --- a/drivers/acpi/acpica/acevents.h +++ b/drivers/acpi/acpica/acevents.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -143,8 +143,6 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle, | |||
143 | acpi_status | 143 | acpi_status |
144 | acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context); | 144 | acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context); |
145 | 145 | ||
146 | u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info); | ||
147 | |||
148 | acpi_status | 146 | acpi_status |
149 | acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | 147 | acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info, |
150 | struct acpi_gpe_block_info *gpe_block, void *context); | 148 | struct acpi_gpe_block_info *gpe_block, void *context); |
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h index 7f60582d0c8c..a165d25343e8 100644 --- a/drivers/acpi/acpica/acglobal.h +++ b/drivers/acpi/acpica/acglobal.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/achware.h b/drivers/acpi/acpica/achware.h index c318d3e27893..196a55244559 100644 --- a/drivers/acpi/acpica/achware.h +++ b/drivers/acpi/acpica/achware.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acinterp.h b/drivers/acpi/acpica/acinterp.h index b01f71ce0523..1886bde54b5d 100644 --- a/drivers/acpi/acpica/acinterp.h +++ b/drivers/acpi/acpica/acinterp.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h index 680d23bbae7c..7add32e5d8c5 100644 --- a/drivers/acpi/acpica/aclocal.h +++ b/drivers/acpi/acpica/aclocal.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acmacros.h b/drivers/acpi/acpica/acmacros.h index 4bceb11c7380..cf607fe69dbd 100644 --- a/drivers/acpi/acpica/acmacros.h +++ b/drivers/acpi/acpica/acmacros.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acnamesp.h b/drivers/acpi/acpica/acnamesp.h index ee1c040f321c..952fbe0b7231 100644 --- a/drivers/acpi/acpica/acnamesp.h +++ b/drivers/acpi/acpica/acnamesp.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acobject.h b/drivers/acpi/acpica/acobject.h index 8abb393dafab..3e9720e1f34f 100644 --- a/drivers/acpi/acpica/acobject.h +++ b/drivers/acpi/acpica/acobject.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acopcode.h b/drivers/acpi/acpica/acopcode.h index dda0e6affcf1..a5f17de45ac6 100644 --- a/drivers/acpi/acpica/acopcode.h +++ b/drivers/acpi/acpica/acopcode.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acparser.h b/drivers/acpi/acpica/acparser.h index 6168b85463ed..74a390c6db16 100644 --- a/drivers/acpi/acpica/acparser.h +++ b/drivers/acpi/acpica/acparser.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acpredef.h b/drivers/acpi/acpica/acpredef.h index bd3908d26c4f..a972d11c97c9 100644 --- a/drivers/acpi/acpica/acpredef.h +++ b/drivers/acpi/acpica/acpredef.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acresrc.h b/drivers/acpi/acpica/acresrc.h index 4b008e8884a1..efc4c7124ccc 100644 --- a/drivers/acpi/acpica/acresrc.h +++ b/drivers/acpi/acpica/acresrc.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acstruct.h b/drivers/acpi/acpica/acstruct.h index cf7346110bd8..d14b547b7cd5 100644 --- a/drivers/acpi/acpica/acstruct.h +++ b/drivers/acpi/acpica/acstruct.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/actables.h b/drivers/acpi/acpica/actables.h index 1afe46e44dac..1c127a43017b 100644 --- a/drivers/acpi/acpica/actables.h +++ b/drivers/acpi/acpica/actables.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/acutils.h b/drivers/acpi/acpica/acutils.h index 486d342e74b6..c2f03e8774ad 100644 --- a/drivers/acpi/acpica/acutils.h +++ b/drivers/acpi/acpica/acutils.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/amlcode.h b/drivers/acpi/acpica/amlcode.h index 5908ccec6aea..3a95068fc119 100644 --- a/drivers/acpi/acpica/amlcode.h +++ b/drivers/acpi/acpica/amlcode.h | |||
@@ -7,7 +7,7 @@ | |||
7 | *****************************************************************************/ | 7 | *****************************************************************************/ |
8 | 8 | ||
9 | /* | 9 | /* |
10 | * Copyright (C) 2000 - 2014, Intel Corp. | 10 | * Copyright (C) 2000 - 2015, Intel Corp. |
11 | * All rights reserved. | 11 | * All rights reserved. |
12 | * | 12 | * |
13 | * Redistribution and use in source and binary forms, with or without | 13 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/amlresrc.h b/drivers/acpi/acpica/amlresrc.h index 3a0beeb86ba5..ee0cdd60b93d 100644 --- a/drivers/acpi/acpica/amlresrc.h +++ b/drivers/acpi/acpica/amlresrc.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsargs.c b/drivers/acpi/acpica/dsargs.c index 720b1cdda711..3e6989738e85 100644 --- a/drivers/acpi/acpica/dsargs.c +++ b/drivers/acpi/acpica/dsargs.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dscontrol.c b/drivers/acpi/acpica/dscontrol.c index 8daf9de82b73..39da9da62bbf 100644 --- a/drivers/acpi/acpica/dscontrol.c +++ b/drivers/acpi/acpica/dscontrol.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsfield.c b/drivers/acpi/acpica/dsfield.c index c57666196672..43b40de90484 100644 --- a/drivers/acpi/acpica/dsfield.c +++ b/drivers/acpi/acpica/dsfield.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsinit.c b/drivers/acpi/acpica/dsinit.c index aee5e45f6d35..bbe74bcebbae 100644 --- a/drivers/acpi/acpica/dsinit.c +++ b/drivers/acpi/acpica/dsinit.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c index 3c7f7378b94d..d72565a3c646 100644 --- a/drivers/acpi/acpica/dsmethod.c +++ b/drivers/acpi/acpica/dsmethod.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsmthdat.c b/drivers/acpi/acpica/dsmthdat.c index b67522df01ac..2e4c42b377ec 100644 --- a/drivers/acpi/acpica/dsmthdat.c +++ b/drivers/acpi/acpica/dsmthdat.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsobject.c b/drivers/acpi/acpica/dsobject.c index a1e7e6b6fcf7..8a7b07b6adc8 100644 --- a/drivers/acpi/acpica/dsobject.c +++ b/drivers/acpi/acpica/dsobject.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsopcode.c b/drivers/acpi/acpica/dsopcode.c index 6c0759c0db47..77244182ff02 100644 --- a/drivers/acpi/acpica/dsopcode.c +++ b/drivers/acpi/acpica/dsopcode.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dsutils.c b/drivers/acpi/acpica/dsutils.c index 9f74795e2268..e5ff89bcb3f5 100644 --- a/drivers/acpi/acpica/dsutils.c +++ b/drivers/acpi/acpica/dsutils.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dswexec.c b/drivers/acpi/acpica/dswexec.c index f7f5107e754d..df54d46225cd 100644 --- a/drivers/acpi/acpica/dswexec.c +++ b/drivers/acpi/acpica/dswexec.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dswload.c b/drivers/acpi/acpica/dswload.c index 15623da26200..843942fb4be5 100644 --- a/drivers/acpi/acpica/dswload.c +++ b/drivers/acpi/acpica/dswload.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dswload2.c b/drivers/acpi/acpica/dswload2.c index 2ac28d297305..fcaa30c611fb 100644 --- a/drivers/acpi/acpica/dswload2.c +++ b/drivers/acpi/acpica/dswload2.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dswscope.c b/drivers/acpi/acpica/dswscope.c index 9d6e2c1de1f8..43b3ea40c0b6 100644 --- a/drivers/acpi/acpica/dswscope.c +++ b/drivers/acpi/acpica/dswscope.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/dswstate.c b/drivers/acpi/acpica/dswstate.c index 24f7d5ea678a..89ac2022465e 100644 --- a/drivers/acpi/acpica/dswstate.c +++ b/drivers/acpi/acpica/dswstate.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c index c7bffff9ed32..bf6873f95e72 100644 --- a/drivers/acpi/acpica/evevent.c +++ b/drivers/acpi/acpica/evevent.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evglock.c b/drivers/acpi/acpica/evglock.c index 3393a73ca0d6..b78dc7c6d5d7 100644 --- a/drivers/acpi/acpica/evglock.c +++ b/drivers/acpi/acpica/evglock.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c index aa70154cf4fa..5ed064e8673c 100644 --- a/drivers/acpi/acpica/evgpe.c +++ b/drivers/acpi/acpica/evgpe.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -114,17 +114,6 @@ acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info) | |||
114 | 114 | ||
115 | ACPI_FUNCTION_TRACE(ev_enable_gpe); | 115 | ACPI_FUNCTION_TRACE(ev_enable_gpe); |
116 | 116 | ||
117 | /* | ||
118 | * We will only allow a GPE to be enabled if it has either an associated | ||
119 | * method (_Lxx/_Exx) or a handler, or is using the implicit notify | ||
120 | * feature. Otherwise, the GPE will be immediately disabled by | ||
121 | * acpi_ev_gpe_dispatch the first time it fires. | ||
122 | */ | ||
123 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | ||
124 | ACPI_GPE_DISPATCH_NONE) { | ||
125 | return_ACPI_STATUS(AE_NO_HANDLER); | ||
126 | } | ||
127 | |||
128 | /* Clear the GPE (of stale events) */ | 117 | /* Clear the GPE (of stale events) */ |
129 | 118 | ||
130 | status = acpi_hw_clear_gpe(gpe_event_info); | 119 | status = acpi_hw_clear_gpe(gpe_event_info); |
@@ -339,7 +328,11 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list) | |||
339 | { | 328 | { |
340 | acpi_status status; | 329 | acpi_status status; |
341 | struct acpi_gpe_block_info *gpe_block; | 330 | struct acpi_gpe_block_info *gpe_block; |
331 | struct acpi_namespace_node *gpe_device; | ||
342 | struct acpi_gpe_register_info *gpe_register_info; | 332 | struct acpi_gpe_register_info *gpe_register_info; |
333 | struct acpi_gpe_event_info *gpe_event_info; | ||
334 | u32 gpe_number; | ||
335 | struct acpi_gpe_handler_info *gpe_handler_info; | ||
343 | u32 int_status = ACPI_INTERRUPT_NOT_HANDLED; | 336 | u32 int_status = ACPI_INTERRUPT_NOT_HANDLED; |
344 | u8 enabled_status_byte; | 337 | u8 enabled_status_byte; |
345 | u32 status_reg; | 338 | u32 status_reg; |
@@ -367,6 +360,8 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list) | |||
367 | 360 | ||
368 | gpe_block = gpe_xrupt_list->gpe_block_list_head; | 361 | gpe_block = gpe_xrupt_list->gpe_block_list_head; |
369 | while (gpe_block) { | 362 | while (gpe_block) { |
363 | gpe_device = gpe_block->node; | ||
364 | |||
370 | /* | 365 | /* |
371 | * Read all of the 8-bit GPE status and enable registers in this GPE | 366 | * Read all of the 8-bit GPE status and enable registers in this GPE |
372 | * block, saving all of them. Find all currently active GP events. | 367 | * block, saving all of them. Find all currently active GP events. |
@@ -442,16 +437,68 @@ u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list) | |||
442 | 437 | ||
443 | /* Examine one GPE bit */ | 438 | /* Examine one GPE bit */ |
444 | 439 | ||
440 | gpe_event_info = | ||
441 | &gpe_block-> | ||
442 | event_info[((acpi_size) i * | ||
443 | ACPI_GPE_REGISTER_WIDTH) + j]; | ||
444 | gpe_number = | ||
445 | j + gpe_register_info->base_gpe_number; | ||
446 | |||
445 | if (enabled_status_byte & (1 << j)) { | 447 | if (enabled_status_byte & (1 << j)) { |
446 | /* | 448 | |
447 | * Found an active GPE. Dispatch the event to a handler | 449 | /* Invoke global event handler if present */ |
448 | * or method. | 450 | |
449 | */ | 451 | acpi_gpe_count++; |
450 | int_status |= | 452 | if (acpi_gbl_global_event_handler) { |
451 | acpi_ev_gpe_dispatch(gpe_block-> | 453 | acpi_gbl_global_event_handler |
452 | node, | 454 | (ACPI_EVENT_TYPE_GPE, |
453 | &gpe_block-> | 455 | gpe_device, gpe_number, |
454 | event_info[((acpi_size) i * ACPI_GPE_REGISTER_WIDTH) + j], j + gpe_register_info->base_gpe_number); | 456 | acpi_gbl_global_event_handler_context); |
457 | } | ||
458 | |||
459 | /* Found an active GPE */ | ||
460 | |||
461 | if (ACPI_GPE_DISPATCH_TYPE | ||
462 | (gpe_event_info->flags) == | ||
463 | ACPI_GPE_DISPATCH_RAW_HANDLER) { | ||
464 | |||
465 | /* Dispatch the event to a raw handler */ | ||
466 | |||
467 | gpe_handler_info = | ||
468 | gpe_event_info->dispatch. | ||
469 | handler; | ||
470 | |||
471 | /* | ||
472 | * There is no protection around the namespace node | ||
473 | * and the GPE handler to ensure a safe destruction | ||
474 | * because: | ||
475 | * 1. The namespace node is expected to always | ||
476 | * exist after loading a table. | ||
477 | * 2. The GPE handler is expected to be flushed by | ||
478 | * acpi_os_wait_events_complete() before the | ||
479 | * destruction. | ||
480 | */ | ||
481 | acpi_os_release_lock | ||
482 | (acpi_gbl_gpe_lock, flags); | ||
483 | int_status |= | ||
484 | gpe_handler_info-> | ||
485 | address(gpe_device, | ||
486 | gpe_number, | ||
487 | gpe_handler_info-> | ||
488 | context); | ||
489 | flags = | ||
490 | acpi_os_acquire_lock | ||
491 | (acpi_gbl_gpe_lock); | ||
492 | } else { | ||
493 | /* | ||
494 | * Dispatch the event to a standard handler or | ||
495 | * method. | ||
496 | */ | ||
497 | int_status |= | ||
498 | acpi_ev_gpe_dispatch | ||
499 | (gpe_device, gpe_event_info, | ||
500 | gpe_number); | ||
501 | } | ||
455 | } | 502 | } |
456 | } | 503 | } |
457 | } | 504 | } |
@@ -484,52 +531,15 @@ unlock_and_exit: | |||
484 | static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | 531 | static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) |
485 | { | 532 | { |
486 | struct acpi_gpe_event_info *gpe_event_info = context; | 533 | struct acpi_gpe_event_info *gpe_event_info = context; |
487 | acpi_status status; | 534 | acpi_status status = AE_OK; |
488 | struct acpi_gpe_event_info *local_gpe_event_info; | ||
489 | struct acpi_evaluate_info *info; | 535 | struct acpi_evaluate_info *info; |
490 | struct acpi_gpe_notify_info *notify; | 536 | struct acpi_gpe_notify_info *notify; |
491 | 537 | ||
492 | ACPI_FUNCTION_TRACE(ev_asynch_execute_gpe_method); | 538 | ACPI_FUNCTION_TRACE(ev_asynch_execute_gpe_method); |
493 | 539 | ||
494 | /* Allocate a local GPE block */ | ||
495 | |||
496 | local_gpe_event_info = | ||
497 | ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_gpe_event_info)); | ||
498 | if (!local_gpe_event_info) { | ||
499 | ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY, "while handling a GPE")); | ||
500 | return_VOID; | ||
501 | } | ||
502 | |||
503 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); | ||
504 | if (ACPI_FAILURE(status)) { | ||
505 | ACPI_FREE(local_gpe_event_info); | ||
506 | return_VOID; | ||
507 | } | ||
508 | |||
509 | /* Must revalidate the gpe_number/gpe_block */ | ||
510 | |||
511 | if (!acpi_ev_valid_gpe_event(gpe_event_info)) { | ||
512 | status = acpi_ut_release_mutex(ACPI_MTX_EVENTS); | ||
513 | ACPI_FREE(local_gpe_event_info); | ||
514 | return_VOID; | ||
515 | } | ||
516 | |||
517 | /* | ||
518 | * Take a snapshot of the GPE info for this level - we copy the info to | ||
519 | * prevent a race condition with remove_handler/remove_block. | ||
520 | */ | ||
521 | ACPI_MEMCPY(local_gpe_event_info, gpe_event_info, | ||
522 | sizeof(struct acpi_gpe_event_info)); | ||
523 | |||
524 | status = acpi_ut_release_mutex(ACPI_MTX_EVENTS); | ||
525 | if (ACPI_FAILURE(status)) { | ||
526 | ACPI_FREE(local_gpe_event_info); | ||
527 | return_VOID; | ||
528 | } | ||
529 | |||
530 | /* Do the correct dispatch - normal method or implicit notify */ | 540 | /* Do the correct dispatch - normal method or implicit notify */ |
531 | 541 | ||
532 | switch (local_gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) { | 542 | switch (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags)) { |
533 | case ACPI_GPE_DISPATCH_NOTIFY: | 543 | case ACPI_GPE_DISPATCH_NOTIFY: |
534 | /* | 544 | /* |
535 | * Implicit notify. | 545 | * Implicit notify. |
@@ -542,7 +552,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
542 | * June 2012: Expand implicit notify mechanism to support | 552 | * June 2012: Expand implicit notify mechanism to support |
543 | * notifies on multiple device objects. | 553 | * notifies on multiple device objects. |
544 | */ | 554 | */ |
545 | notify = local_gpe_event_info->dispatch.notify_list; | 555 | notify = gpe_event_info->dispatch.notify_list; |
546 | while (ACPI_SUCCESS(status) && notify) { | 556 | while (ACPI_SUCCESS(status) && notify) { |
547 | status = | 557 | status = |
548 | acpi_ev_queue_notify_request(notify->device_node, | 558 | acpi_ev_queue_notify_request(notify->device_node, |
@@ -566,7 +576,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
566 | * _Lxx/_Exx control method that corresponds to this GPE | 576 | * _Lxx/_Exx control method that corresponds to this GPE |
567 | */ | 577 | */ |
568 | info->prefix_node = | 578 | info->prefix_node = |
569 | local_gpe_event_info->dispatch.method_node; | 579 | gpe_event_info->dispatch.method_node; |
570 | info->flags = ACPI_IGNORE_RETURN_VALUE; | 580 | info->flags = ACPI_IGNORE_RETURN_VALUE; |
571 | 581 | ||
572 | status = acpi_ns_evaluate(info); | 582 | status = acpi_ns_evaluate(info); |
@@ -576,25 +586,27 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
576 | if (ACPI_FAILURE(status)) { | 586 | if (ACPI_FAILURE(status)) { |
577 | ACPI_EXCEPTION((AE_INFO, status, | 587 | ACPI_EXCEPTION((AE_INFO, status, |
578 | "while evaluating GPE method [%4.4s]", | 588 | "while evaluating GPE method [%4.4s]", |
579 | acpi_ut_get_node_name | 589 | acpi_ut_get_node_name(gpe_event_info-> |
580 | (local_gpe_event_info->dispatch. | 590 | dispatch. |
581 | method_node))); | 591 | method_node))); |
582 | } | 592 | } |
583 | break; | 593 | break; |
584 | 594 | ||
585 | default: | 595 | default: |
586 | 596 | ||
587 | return_VOID; /* Should never happen */ | 597 | goto error_exit; /* Should never happen */ |
588 | } | 598 | } |
589 | 599 | ||
590 | /* Defer enabling of GPE until all notify handlers are done */ | 600 | /* Defer enabling of GPE until all notify handlers are done */ |
591 | 601 | ||
592 | status = acpi_os_execute(OSL_NOTIFY_HANDLER, | 602 | status = acpi_os_execute(OSL_NOTIFY_HANDLER, |
593 | acpi_ev_asynch_enable_gpe, | 603 | acpi_ev_asynch_enable_gpe, gpe_event_info); |
594 | local_gpe_event_info); | 604 | if (ACPI_SUCCESS(status)) { |
595 | if (ACPI_FAILURE(status)) { | 605 | return_VOID; |
596 | ACPI_FREE(local_gpe_event_info); | ||
597 | } | 606 | } |
607 | |||
608 | error_exit: | ||
609 | acpi_ev_asynch_enable_gpe(gpe_event_info); | ||
598 | return_VOID; | 610 | return_VOID; |
599 | } | 611 | } |
600 | 612 | ||
@@ -622,7 +634,6 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_enable_gpe(void *context) | |||
622 | (void)acpi_ev_finish_gpe(gpe_event_info); | 634 | (void)acpi_ev_finish_gpe(gpe_event_info); |
623 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | 635 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); |
624 | 636 | ||
625 | ACPI_FREE(gpe_event_info); | ||
626 | return; | 637 | return; |
627 | } | 638 | } |
628 | 639 | ||
@@ -692,15 +703,6 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device, | |||
692 | 703 | ||
693 | ACPI_FUNCTION_TRACE(ev_gpe_dispatch); | 704 | ACPI_FUNCTION_TRACE(ev_gpe_dispatch); |
694 | 705 | ||
695 | /* Invoke global event handler if present */ | ||
696 | |||
697 | acpi_gpe_count++; | ||
698 | if (acpi_gbl_global_event_handler) { | ||
699 | acpi_gbl_global_event_handler(ACPI_EVENT_TYPE_GPE, gpe_device, | ||
700 | gpe_number, | ||
701 | acpi_gbl_global_event_handler_context); | ||
702 | } | ||
703 | |||
704 | /* | 706 | /* |
705 | * Always disable the GPE so that it does not keep firing before | 707 | * Always disable the GPE so that it does not keep firing before |
706 | * any asynchronous activity completes (either from the execution | 708 | * any asynchronous activity completes (either from the execution |
@@ -741,7 +743,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device, | |||
741 | * If there is neither a handler nor a method, leave the GPE | 743 | * If there is neither a handler nor a method, leave the GPE |
742 | * disabled. | 744 | * disabled. |
743 | */ | 745 | */ |
744 | switch (gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) { | 746 | switch (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags)) { |
745 | case ACPI_GPE_DISPATCH_HANDLER: | 747 | case ACPI_GPE_DISPATCH_HANDLER: |
746 | 748 | ||
747 | /* Invoke the installed handler (at interrupt level) */ | 749 | /* Invoke the installed handler (at interrupt level) */ |
diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c index d86699eea33c..e0f24c504513 100644 --- a/drivers/acpi/acpica/evgpeblk.c +++ b/drivers/acpi/acpica/evgpeblk.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -474,10 +474,12 @@ acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | |||
474 | * Ignore GPEs that have no corresponding _Lxx/_Exx method | 474 | * Ignore GPEs that have no corresponding _Lxx/_Exx method |
475 | * and GPEs that are used to wake the system | 475 | * and GPEs that are used to wake the system |
476 | */ | 476 | */ |
477 | if (((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | 477 | if ((ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == |
478 | ACPI_GPE_DISPATCH_NONE) | 478 | ACPI_GPE_DISPATCH_NONE) |
479 | || ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) | 479 | || (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == |
480 | == ACPI_GPE_DISPATCH_HANDLER) | 480 | ACPI_GPE_DISPATCH_HANDLER) |
481 | || (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == | ||
482 | ACPI_GPE_DISPATCH_RAW_HANDLER) | ||
481 | || (gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) { | 483 | || (gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) { |
482 | continue; | 484 | continue; |
483 | } | 485 | } |
diff --git a/drivers/acpi/acpica/evgpeinit.c b/drivers/acpi/acpica/evgpeinit.c index 7be928379879..8840296d5b20 100644 --- a/drivers/acpi/acpica/evgpeinit.c +++ b/drivers/acpi/acpica/evgpeinit.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -401,15 +401,17 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle, | |||
401 | return_ACPI_STATUS(AE_OK); | 401 | return_ACPI_STATUS(AE_OK); |
402 | } | 402 | } |
403 | 403 | ||
404 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | 404 | if ((ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == |
405 | ACPI_GPE_DISPATCH_HANDLER) { | 405 | ACPI_GPE_DISPATCH_HANDLER) || |
406 | (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == | ||
407 | ACPI_GPE_DISPATCH_RAW_HANDLER)) { | ||
406 | 408 | ||
407 | /* If there is already a handler, ignore this GPE method */ | 409 | /* If there is already a handler, ignore this GPE method */ |
408 | 410 | ||
409 | return_ACPI_STATUS(AE_OK); | 411 | return_ACPI_STATUS(AE_OK); |
410 | } | 412 | } |
411 | 413 | ||
412 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | 414 | if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == |
413 | ACPI_GPE_DISPATCH_METHOD) { | 415 | ACPI_GPE_DISPATCH_METHOD) { |
414 | /* | 416 | /* |
415 | * If there is already a method, ignore this method. But check | 417 | * If there is already a method, ignore this method. But check |
diff --git a/drivers/acpi/acpica/evgpeutil.c b/drivers/acpi/acpica/evgpeutil.c index 17e4bbfdb096..3a958f3612fe 100644 --- a/drivers/acpi/acpica/evgpeutil.c +++ b/drivers/acpi/acpica/evgpeutil.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -108,53 +108,6 @@ unlock_and_exit: | |||
108 | 108 | ||
109 | /******************************************************************************* | 109 | /******************************************************************************* |
110 | * | 110 | * |
111 | * FUNCTION: acpi_ev_valid_gpe_event | ||
112 | * | ||
113 | * PARAMETERS: gpe_event_info - Info for this GPE | ||
114 | * | ||
115 | * RETURN: TRUE if the gpe_event is valid | ||
116 | * | ||
117 | * DESCRIPTION: Validate a GPE event. DO NOT CALL FROM INTERRUPT LEVEL. | ||
118 | * Should be called only when the GPE lists are semaphore locked | ||
119 | * and not subject to change. | ||
120 | * | ||
121 | ******************************************************************************/ | ||
122 | |||
123 | u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info) | ||
124 | { | ||
125 | struct acpi_gpe_xrupt_info *gpe_xrupt_block; | ||
126 | struct acpi_gpe_block_info *gpe_block; | ||
127 | |||
128 | ACPI_FUNCTION_ENTRY(); | ||
129 | |||
130 | /* No need for spin lock since we are not changing any list elements */ | ||
131 | |||
132 | /* Walk the GPE interrupt levels */ | ||
133 | |||
134 | gpe_xrupt_block = acpi_gbl_gpe_xrupt_list_head; | ||
135 | while (gpe_xrupt_block) { | ||
136 | gpe_block = gpe_xrupt_block->gpe_block_list_head; | ||
137 | |||
138 | /* Walk the GPE blocks on this interrupt level */ | ||
139 | |||
140 | while (gpe_block) { | ||
141 | if ((&gpe_block->event_info[0] <= gpe_event_info) && | ||
142 | (&gpe_block->event_info[gpe_block->gpe_count] > | ||
143 | gpe_event_info)) { | ||
144 | return (TRUE); | ||
145 | } | ||
146 | |||
147 | gpe_block = gpe_block->next; | ||
148 | } | ||
149 | |||
150 | gpe_xrupt_block = gpe_xrupt_block->next; | ||
151 | } | ||
152 | |||
153 | return (FALSE); | ||
154 | } | ||
155 | |||
156 | /******************************************************************************* | ||
157 | * | ||
158 | * FUNCTION: acpi_ev_get_gpe_device | 111 | * FUNCTION: acpi_ev_get_gpe_device |
159 | * | 112 | * |
160 | * PARAMETERS: GPE_WALK_CALLBACK | 113 | * PARAMETERS: GPE_WALK_CALLBACK |
@@ -371,8 +324,10 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | |||
371 | ACPI_GPE_REGISTER_WIDTH) | 324 | ACPI_GPE_REGISTER_WIDTH) |
372 | + j]; | 325 | + j]; |
373 | 326 | ||
374 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | 327 | if ((ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == |
375 | ACPI_GPE_DISPATCH_HANDLER) { | 328 | ACPI_GPE_DISPATCH_HANDLER) || |
329 | (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == | ||
330 | ACPI_GPE_DISPATCH_RAW_HANDLER)) { | ||
376 | 331 | ||
377 | /* Delete an installed handler block */ | 332 | /* Delete an installed handler block */ |
378 | 333 | ||
@@ -380,10 +335,8 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | |||
380 | gpe_event_info->dispatch.handler = NULL; | 335 | gpe_event_info->dispatch.handler = NULL; |
381 | gpe_event_info->flags &= | 336 | gpe_event_info->flags &= |
382 | ~ACPI_GPE_DISPATCH_MASK; | 337 | ~ACPI_GPE_DISPATCH_MASK; |
383 | } else | 338 | } else if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) |
384 | if ((gpe_event_info-> | 339 | == ACPI_GPE_DISPATCH_NOTIFY) { |
385 | flags & ACPI_GPE_DISPATCH_MASK) == | ||
386 | ACPI_GPE_DISPATCH_NOTIFY) { | ||
387 | 340 | ||
388 | /* Delete the implicit notification device list */ | 341 | /* Delete the implicit notification device list */ |
389 | 342 | ||
diff --git a/drivers/acpi/acpica/evhandler.c b/drivers/acpi/acpica/evhandler.c index 78ac29351c9e..74e8595f5a2b 100644 --- a/drivers/acpi/acpica/evhandler.c +++ b/drivers/acpi/acpica/evhandler.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evmisc.c b/drivers/acpi/acpica/evmisc.c index 24ea3424981b..f7c9dfe7b990 100644 --- a/drivers/acpi/acpica/evmisc.c +++ b/drivers/acpi/acpica/evmisc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evregion.c b/drivers/acpi/acpica/evregion.c index 8eb8575e8c16..9abace3401f9 100644 --- a/drivers/acpi/acpica/evregion.c +++ b/drivers/acpi/acpica/evregion.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evrgnini.c b/drivers/acpi/acpica/evrgnini.c index 1b148a440d67..da323390bb70 100644 --- a/drivers/acpi/acpica/evrgnini.c +++ b/drivers/acpi/acpica/evrgnini.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evsci.c b/drivers/acpi/acpica/evsci.c index 29630e303829..0366703d2970 100644 --- a/drivers/acpi/acpica/evsci.c +++ b/drivers/acpi/acpica/evsci.c | |||
@@ -6,7 +6,7 @@ | |||
6 | ******************************************************************************/ | 6 | ******************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c index 55a58f3ec8df..81f2d9e87fad 100644 --- a/drivers/acpi/acpica/evxface.c +++ b/drivers/acpi/acpica/evxface.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -51,6 +51,16 @@ | |||
51 | 51 | ||
52 | #define _COMPONENT ACPI_EVENTS | 52 | #define _COMPONENT ACPI_EVENTS |
53 | ACPI_MODULE_NAME("evxface") | 53 | ACPI_MODULE_NAME("evxface") |
54 | #if (!ACPI_REDUCED_HARDWARE) | ||
55 | /* Local prototypes */ | ||
56 | static acpi_status | ||
57 | acpi_ev_install_gpe_handler(acpi_handle gpe_device, | ||
58 | u32 gpe_number, | ||
59 | u32 type, | ||
60 | u8 is_raw_handler, | ||
61 | acpi_gpe_handler address, void *context); | ||
62 | |||
63 | #endif | ||
54 | 64 | ||
55 | 65 | ||
56 | /******************************************************************************* | 66 | /******************************************************************************* |
@@ -76,6 +86,7 @@ ACPI_MODULE_NAME("evxface") | |||
76 | * handlers. | 86 | * handlers. |
77 | * | 87 | * |
78 | ******************************************************************************/ | 88 | ******************************************************************************/ |
89 | |||
79 | acpi_status | 90 | acpi_status |
80 | acpi_install_notify_handler(acpi_handle device, | 91 | acpi_install_notify_handler(acpi_handle device, |
81 | u32 handler_type, | 92 | u32 handler_type, |
@@ -717,32 +728,37 @@ ACPI_EXPORT_SYMBOL(acpi_remove_fixed_event_handler) | |||
717 | 728 | ||
718 | /******************************************************************************* | 729 | /******************************************************************************* |
719 | * | 730 | * |
720 | * FUNCTION: acpi_install_gpe_handler | 731 | * FUNCTION: acpi_ev_install_gpe_handler |
721 | * | 732 | * |
722 | * PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT | 733 | * PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT |
723 | * defined GPEs) | 734 | * defined GPEs) |
724 | * gpe_number - The GPE number within the GPE block | 735 | * gpe_number - The GPE number within the GPE block |
725 | * type - Whether this GPE should be treated as an | 736 | * type - Whether this GPE should be treated as an |
726 | * edge- or level-triggered interrupt. | 737 | * edge- or level-triggered interrupt. |
738 | * is_raw_handler - Whether this GPE should be handled using | ||
739 | * the special GPE handler mode. | ||
727 | * address - Address of the handler | 740 | * address - Address of the handler |
728 | * context - Value passed to the handler on each GPE | 741 | * context - Value passed to the handler on each GPE |
729 | * | 742 | * |
730 | * RETURN: Status | 743 | * RETURN: Status |
731 | * | 744 | * |
732 | * DESCRIPTION: Install a handler for a General Purpose Event. | 745 | * DESCRIPTION: Internal function to install a handler for a General Purpose |
746 | * Event. | ||
733 | * | 747 | * |
734 | ******************************************************************************/ | 748 | ******************************************************************************/ |
735 | acpi_status | 749 | static acpi_status |
736 | acpi_install_gpe_handler(acpi_handle gpe_device, | 750 | acpi_ev_install_gpe_handler(acpi_handle gpe_device, |
737 | u32 gpe_number, | 751 | u32 gpe_number, |
738 | u32 type, acpi_gpe_handler address, void *context) | 752 | u32 type, |
753 | u8 is_raw_handler, | ||
754 | acpi_gpe_handler address, void *context) | ||
739 | { | 755 | { |
740 | struct acpi_gpe_event_info *gpe_event_info; | 756 | struct acpi_gpe_event_info *gpe_event_info; |
741 | struct acpi_gpe_handler_info *handler; | 757 | struct acpi_gpe_handler_info *handler; |
742 | acpi_status status; | 758 | acpi_status status; |
743 | acpi_cpu_flags flags; | 759 | acpi_cpu_flags flags; |
744 | 760 | ||
745 | ACPI_FUNCTION_TRACE(acpi_install_gpe_handler); | 761 | ACPI_FUNCTION_TRACE(ev_install_gpe_handler); |
746 | 762 | ||
747 | /* Parameter validation */ | 763 | /* Parameter validation */ |
748 | 764 | ||
@@ -775,8 +791,10 @@ acpi_install_gpe_handler(acpi_handle gpe_device, | |||
775 | 791 | ||
776 | /* Make sure that there isn't a handler there already */ | 792 | /* Make sure that there isn't a handler there already */ |
777 | 793 | ||
778 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | 794 | if ((ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == |
779 | ACPI_GPE_DISPATCH_HANDLER) { | 795 | ACPI_GPE_DISPATCH_HANDLER) || |
796 | (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == | ||
797 | ACPI_GPE_DISPATCH_RAW_HANDLER)) { | ||
780 | status = AE_ALREADY_EXISTS; | 798 | status = AE_ALREADY_EXISTS; |
781 | goto free_and_exit; | 799 | goto free_and_exit; |
782 | } | 800 | } |
@@ -793,9 +811,10 @@ acpi_install_gpe_handler(acpi_handle gpe_device, | |||
793 | * automatically during initialization, in which case it has to be | 811 | * automatically during initialization, in which case it has to be |
794 | * disabled now to avoid spurious execution of the handler. | 812 | * disabled now to avoid spurious execution of the handler. |
795 | */ | 813 | */ |
796 | if (((handler->original_flags & ACPI_GPE_DISPATCH_METHOD) || | 814 | if (((ACPI_GPE_DISPATCH_TYPE(handler->original_flags) == |
797 | (handler->original_flags & ACPI_GPE_DISPATCH_NOTIFY)) && | 815 | ACPI_GPE_DISPATCH_METHOD) || |
798 | gpe_event_info->runtime_count) { | 816 | (ACPI_GPE_DISPATCH_TYPE(handler->original_flags) == |
817 | ACPI_GPE_DISPATCH_NOTIFY)) && gpe_event_info->runtime_count) { | ||
799 | handler->originally_enabled = TRUE; | 818 | handler->originally_enabled = TRUE; |
800 | (void)acpi_ev_remove_gpe_reference(gpe_event_info); | 819 | (void)acpi_ev_remove_gpe_reference(gpe_event_info); |
801 | 820 | ||
@@ -816,7 +835,10 @@ acpi_install_gpe_handler(acpi_handle gpe_device, | |||
816 | 835 | ||
817 | gpe_event_info->flags &= | 836 | gpe_event_info->flags &= |
818 | ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); | 837 | ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); |
819 | gpe_event_info->flags |= (u8)(type | ACPI_GPE_DISPATCH_HANDLER); | 838 | gpe_event_info->flags |= |
839 | (u8)(type | | ||
840 | (is_raw_handler ? ACPI_GPE_DISPATCH_RAW_HANDLER : | ||
841 | ACPI_GPE_DISPATCH_HANDLER)); | ||
820 | 842 | ||
821 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | 843 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); |
822 | 844 | ||
@@ -830,10 +852,78 @@ free_and_exit: | |||
830 | goto unlock_and_exit; | 852 | goto unlock_and_exit; |
831 | } | 853 | } |
832 | 854 | ||
855 | /******************************************************************************* | ||
856 | * | ||
857 | * FUNCTION: acpi_install_gpe_handler | ||
858 | * | ||
859 | * PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT | ||
860 | * defined GPEs) | ||
861 | * gpe_number - The GPE number within the GPE block | ||
862 | * type - Whether this GPE should be treated as an | ||
863 | * edge- or level-triggered interrupt. | ||
864 | * address - Address of the handler | ||
865 | * context - Value passed to the handler on each GPE | ||
866 | * | ||
867 | * RETURN: Status | ||
868 | * | ||
869 | * DESCRIPTION: Install a handler for a General Purpose Event. | ||
870 | * | ||
871 | ******************************************************************************/ | ||
872 | |||
873 | acpi_status | ||
874 | acpi_install_gpe_handler(acpi_handle gpe_device, | ||
875 | u32 gpe_number, | ||
876 | u32 type, acpi_gpe_handler address, void *context) | ||
877 | { | ||
878 | acpi_status status; | ||
879 | |||
880 | ACPI_FUNCTION_TRACE(acpi_install_gpe_handler); | ||
881 | |||
882 | status = | ||
883 | acpi_ev_install_gpe_handler(gpe_device, gpe_number, type, FALSE, | ||
884 | address, context); | ||
885 | |||
886 | return_ACPI_STATUS(status); | ||
887 | } | ||
888 | |||
833 | ACPI_EXPORT_SYMBOL(acpi_install_gpe_handler) | 889 | ACPI_EXPORT_SYMBOL(acpi_install_gpe_handler) |
834 | 890 | ||
835 | /******************************************************************************* | 891 | /******************************************************************************* |
836 | * | 892 | * |
893 | * FUNCTION: acpi_install_gpe_raw_handler | ||
894 | * | ||
895 | * PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT | ||
896 | * defined GPEs) | ||
897 | * gpe_number - The GPE number within the GPE block | ||
898 | * type - Whether this GPE should be treated as an | ||
899 | * edge- or level-triggered interrupt. | ||
900 | * address - Address of the handler | ||
901 | * context - Value passed to the handler on each GPE | ||
902 | * | ||
903 | * RETURN: Status | ||
904 | * | ||
905 | * DESCRIPTION: Install a handler for a General Purpose Event. | ||
906 | * | ||
907 | ******************************************************************************/ | ||
908 | acpi_status | ||
909 | acpi_install_gpe_raw_handler(acpi_handle gpe_device, | ||
910 | u32 gpe_number, | ||
911 | u32 type, acpi_gpe_handler address, void *context) | ||
912 | { | ||
913 | acpi_status status; | ||
914 | |||
915 | ACPI_FUNCTION_TRACE(acpi_install_gpe_raw_handler); | ||
916 | |||
917 | status = acpi_ev_install_gpe_handler(gpe_device, gpe_number, type, TRUE, | ||
918 | address, context); | ||
919 | |||
920 | return_ACPI_STATUS(status); | ||
921 | } | ||
922 | |||
923 | ACPI_EXPORT_SYMBOL(acpi_install_gpe_raw_handler) | ||
924 | |||
925 | /******************************************************************************* | ||
926 | * | ||
837 | * FUNCTION: acpi_remove_gpe_handler | 927 | * FUNCTION: acpi_remove_gpe_handler |
838 | * | 928 | * |
839 | * PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT | 929 | * PARAMETERS: gpe_device - Namespace node for the GPE (NULL for FADT |
@@ -880,8 +970,10 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, | |||
880 | 970 | ||
881 | /* Make sure that a handler is indeed installed */ | 971 | /* Make sure that a handler is indeed installed */ |
882 | 972 | ||
883 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) != | 973 | if ((ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) != |
884 | ACPI_GPE_DISPATCH_HANDLER) { | 974 | ACPI_GPE_DISPATCH_HANDLER) && |
975 | (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) != | ||
976 | ACPI_GPE_DISPATCH_RAW_HANDLER)) { | ||
885 | status = AE_NOT_EXIST; | 977 | status = AE_NOT_EXIST; |
886 | goto unlock_and_exit; | 978 | goto unlock_and_exit; |
887 | } | 979 | } |
@@ -896,6 +988,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, | |||
896 | /* Remove the handler */ | 988 | /* Remove the handler */ |
897 | 989 | ||
898 | handler = gpe_event_info->dispatch.handler; | 990 | handler = gpe_event_info->dispatch.handler; |
991 | gpe_event_info->dispatch.handler = NULL; | ||
899 | 992 | ||
900 | /* Restore Method node (if any), set dispatch flags */ | 993 | /* Restore Method node (if any), set dispatch flags */ |
901 | 994 | ||
@@ -909,9 +1002,10 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, | |||
909 | * enabled, it should be enabled at this point to restore the | 1002 | * enabled, it should be enabled at this point to restore the |
910 | * post-initialization configuration. | 1003 | * post-initialization configuration. |
911 | */ | 1004 | */ |
912 | if (((handler->original_flags & ACPI_GPE_DISPATCH_METHOD) || | 1005 | if (((ACPI_GPE_DISPATCH_TYPE(handler->original_flags) == |
913 | (handler->original_flags & ACPI_GPE_DISPATCH_NOTIFY)) && | 1006 | ACPI_GPE_DISPATCH_METHOD) || |
914 | handler->originally_enabled) { | 1007 | (ACPI_GPE_DISPATCH_TYPE(handler->original_flags) == |
1008 | ACPI_GPE_DISPATCH_NOTIFY)) && handler->originally_enabled) { | ||
915 | (void)acpi_ev_add_gpe_reference(gpe_event_info); | 1009 | (void)acpi_ev_add_gpe_reference(gpe_event_info); |
916 | } | 1010 | } |
917 | 1011 | ||
diff --git a/drivers/acpi/acpica/evxfevnt.c b/drivers/acpi/acpica/evxfevnt.c index bb8cbf5961bf..df06a23c4197 100644 --- a/drivers/acpi/acpica/evxfevnt.c +++ b/drivers/acpi/acpica/evxfevnt.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/evxfgpe.c b/drivers/acpi/acpica/evxfgpe.c index e889a5304abd..70eb47e3d724 100644 --- a/drivers/acpi/acpica/evxfgpe.c +++ b/drivers/acpi/acpica/evxfgpe.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -132,7 +132,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number) | |||
132 | */ | 132 | */ |
133 | gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); | 133 | gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); |
134 | if (gpe_event_info) { | 134 | if (gpe_event_info) { |
135 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) != | 135 | if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) != |
136 | ACPI_GPE_DISPATCH_NONE) { | 136 | ACPI_GPE_DISPATCH_NONE) { |
137 | status = acpi_ev_add_gpe_reference(gpe_event_info); | 137 | status = acpi_ev_add_gpe_reference(gpe_event_info); |
138 | } else { | 138 | } else { |
@@ -183,6 +183,77 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number) | |||
183 | 183 | ||
184 | ACPI_EXPORT_SYMBOL(acpi_disable_gpe) | 184 | ACPI_EXPORT_SYMBOL(acpi_disable_gpe) |
185 | 185 | ||
186 | /******************************************************************************* | ||
187 | * | ||
188 | * FUNCTION: acpi_set_gpe | ||
189 | * | ||
190 | * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 | ||
191 | * gpe_number - GPE level within the GPE block | ||
192 | * action - ACPI_GPE_ENABLE or ACPI_GPE_DISABLE | ||
193 | * | ||
194 | * RETURN: Status | ||
195 | * | ||
196 | * DESCRIPTION: Enable or disable an individual GPE. This function bypasses | ||
197 | * the reference count mechanism used in the acpi_enable_gpe(), | ||
198 | * acpi_disable_gpe() interfaces. | ||
199 | * This API is typically used by the GPE raw handler mode driver | ||
200 | * to switch between the polling mode and the interrupt mode after | ||
201 | * the driver has enabled the GPE. | ||
202 | * The APIs should be invoked in this order: | ||
203 | * acpi_enable_gpe() <- Ensure the reference count > 0 | ||
204 | * acpi_set_gpe(ACPI_GPE_DISABLE) <- Enter polling mode | ||
205 | * acpi_set_gpe(ACPI_GPE_ENABLE) <- Leave polling mode | ||
206 | * acpi_disable_gpe() <- Decrease the reference count | ||
207 | * | ||
208 | * Note: If a GPE is shared by 2 silicon components, then both the drivers | ||
209 | * should support GPE polling mode or disabling the GPE for long period | ||
210 | * for one driver may break the other. So use it with care since all | ||
211 | * firmware _Lxx/_Exx handlers currently rely on the GPE interrupt mode. | ||
212 | * | ||
213 | ******************************************************************************/ | ||
214 | acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action) | ||
215 | { | ||
216 | struct acpi_gpe_event_info *gpe_event_info; | ||
217 | acpi_status status; | ||
218 | acpi_cpu_flags flags; | ||
219 | |||
220 | ACPI_FUNCTION_TRACE(acpi_set_gpe); | ||
221 | |||
222 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | ||
223 | |||
224 | /* Ensure that we have a valid GPE number */ | ||
225 | |||
226 | gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); | ||
227 | if (!gpe_event_info) { | ||
228 | status = AE_BAD_PARAMETER; | ||
229 | goto unlock_and_exit; | ||
230 | } | ||
231 | |||
232 | /* Perform the action */ | ||
233 | |||
234 | switch (action) { | ||
235 | case ACPI_GPE_ENABLE: | ||
236 | |||
237 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_ENABLE); | ||
238 | break; | ||
239 | |||
240 | case ACPI_GPE_DISABLE: | ||
241 | |||
242 | status = acpi_hw_low_set_gpe(gpe_event_info, ACPI_GPE_DISABLE); | ||
243 | break; | ||
244 | |||
245 | default: | ||
246 | |||
247 | status = AE_BAD_PARAMETER; | ||
248 | break; | ||
249 | } | ||
250 | |||
251 | unlock_and_exit: | ||
252 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | ||
253 | return_ACPI_STATUS(status); | ||
254 | } | ||
255 | |||
256 | ACPI_EXPORT_SYMBOL(acpi_set_gpe) | ||
186 | 257 | ||
187 | /******************************************************************************* | 258 | /******************************************************************************* |
188 | * | 259 | * |
@@ -313,7 +384,7 @@ acpi_setup_gpe_for_wake(acpi_handle wake_device, | |||
313 | * known as an "implicit notify". Note: The GPE is assumed to be | 384 | * known as an "implicit notify". Note: The GPE is assumed to be |
314 | * level-triggered (for windows compatibility). | 385 | * level-triggered (for windows compatibility). |
315 | */ | 386 | */ |
316 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | 387 | if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == |
317 | ACPI_GPE_DISPATCH_NONE) { | 388 | ACPI_GPE_DISPATCH_NONE) { |
318 | /* | 389 | /* |
319 | * This is the first device for implicit notify on this GPE. | 390 | * This is the first device for implicit notify on this GPE. |
@@ -327,7 +398,7 @@ acpi_setup_gpe_for_wake(acpi_handle wake_device, | |||
327 | * If we already have an implicit notify on this GPE, add | 398 | * If we already have an implicit notify on this GPE, add |
328 | * this device to the notify list. | 399 | * this device to the notify list. |
329 | */ | 400 | */ |
330 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | 401 | if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) == |
331 | ACPI_GPE_DISPATCH_NOTIFY) { | 402 | ACPI_GPE_DISPATCH_NOTIFY) { |
332 | 403 | ||
333 | /* Ensure that the device is not already in the list */ | 404 | /* Ensure that the device is not already in the list */ |
@@ -530,6 +601,49 @@ unlock_and_exit: | |||
530 | 601 | ||
531 | ACPI_EXPORT_SYMBOL(acpi_get_gpe_status) | 602 | ACPI_EXPORT_SYMBOL(acpi_get_gpe_status) |
532 | 603 | ||
604 | /******************************************************************************* | ||
605 | * | ||
606 | * FUNCTION: acpi_finish_gpe | ||
607 | * | ||
608 | * PARAMETERS: gpe_device - Namespace node for the GPE Block | ||
609 | * (NULL for FADT defined GPEs) | ||
610 | * gpe_number - GPE level within the GPE block | ||
611 | * | ||
612 | * RETURN: Status | ||
613 | * | ||
614 | * DESCRIPTION: Clear and conditionally reenable a GPE. This completes the GPE | ||
615 | * processing. Intended for use by asynchronous host-installed | ||
616 | * GPE handlers. The GPE is only reenabled if the enable_for_run bit | ||
617 | * is set in the GPE info. | ||
618 | * | ||
619 | ******************************************************************************/ | ||
620 | acpi_status acpi_finish_gpe(acpi_handle gpe_device, u32 gpe_number) | ||
621 | { | ||
622 | struct acpi_gpe_event_info *gpe_event_info; | ||
623 | acpi_status status; | ||
624 | acpi_cpu_flags flags; | ||
625 | |||
626 | ACPI_FUNCTION_TRACE(acpi_finish_gpe); | ||
627 | |||
628 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | ||
629 | |||
630 | /* Ensure that we have a valid GPE number */ | ||
631 | |||
632 | gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); | ||
633 | if (!gpe_event_info) { | ||
634 | status = AE_BAD_PARAMETER; | ||
635 | goto unlock_and_exit; | ||
636 | } | ||
637 | |||
638 | status = acpi_ev_finish_gpe(gpe_event_info); | ||
639 | |||
640 | unlock_and_exit: | ||
641 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | ||
642 | return_ACPI_STATUS(status); | ||
643 | } | ||
644 | |||
645 | ACPI_EXPORT_SYMBOL(acpi_finish_gpe) | ||
646 | |||
533 | /****************************************************************************** | 647 | /****************************************************************************** |
534 | * | 648 | * |
535 | * FUNCTION: acpi_disable_all_gpes | 649 | * FUNCTION: acpi_disable_all_gpes |
@@ -604,7 +718,6 @@ ACPI_EXPORT_SYMBOL(acpi_enable_all_runtime_gpes) | |||
604 | * all GPE blocks. | 718 | * all GPE blocks. |
605 | * | 719 | * |
606 | ******************************************************************************/ | 720 | ******************************************************************************/ |
607 | |||
608 | acpi_status acpi_enable_all_wakeup_gpes(void) | 721 | acpi_status acpi_enable_all_wakeup_gpes(void) |
609 | { | 722 | { |
610 | acpi_status status; | 723 | acpi_status status; |
diff --git a/drivers/acpi/acpica/evxfregn.c b/drivers/acpi/acpica/evxfregn.c index 2d6f187939c7..f21afbab03f7 100644 --- a/drivers/acpi/acpica/evxfregn.c +++ b/drivers/acpi/acpica/evxfregn.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exconfig.c b/drivers/acpi/acpica/exconfig.c index 7d2949420db7..6e0df2b9d5a4 100644 --- a/drivers/acpi/acpica/exconfig.c +++ b/drivers/acpi/acpica/exconfig.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exconvrt.c b/drivers/acpi/acpica/exconvrt.c index c545386fee96..89a976b4ccf2 100644 --- a/drivers/acpi/acpica/exconvrt.c +++ b/drivers/acpi/acpica/exconvrt.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/excreate.c b/drivers/acpi/acpica/excreate.c index 95d23dabcfbb..aaeea4840aaa 100644 --- a/drivers/acpi/acpica/excreate.c +++ b/drivers/acpi/acpica/excreate.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c index 6fbfad47518c..e67d0aca3fe6 100644 --- a/drivers/acpi/acpica/exdebug.c +++ b/drivers/acpi/acpica/exdebug.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exdump.c b/drivers/acpi/acpica/exdump.c index 0f23c3f2678e..7c213b6b6472 100644 --- a/drivers/acpi/acpica/exdump.c +++ b/drivers/acpi/acpica/exdump.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exfield.c b/drivers/acpi/acpica/exfield.c index b994845ed359..c161dd974f74 100644 --- a/drivers/acpi/acpica/exfield.c +++ b/drivers/acpi/acpica/exfield.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exfldio.c b/drivers/acpi/acpica/exfldio.c index 1d1b27a96c5b..49479927e7f7 100644 --- a/drivers/acpi/acpica/exfldio.c +++ b/drivers/acpi/acpica/exfldio.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exmisc.c b/drivers/acpi/acpica/exmisc.c index 2207e624f538..b56fc9d6f48e 100644 --- a/drivers/acpi/acpica/exmisc.c +++ b/drivers/acpi/acpica/exmisc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exmutex.c b/drivers/acpi/acpica/exmutex.c index b49ea2a95f4f..472030f2b5bb 100644 --- a/drivers/acpi/acpica/exmutex.c +++ b/drivers/acpi/acpica/exmutex.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exnames.c b/drivers/acpi/acpica/exnames.c index dbb03b544e8c..453b00c30177 100644 --- a/drivers/acpi/acpica/exnames.c +++ b/drivers/acpi/acpica/exnames.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exoparg1.c b/drivers/acpi/acpica/exoparg1.c index 1b8e94104407..77930683ab7d 100644 --- a/drivers/acpi/acpica/exoparg1.c +++ b/drivers/acpi/acpica/exoparg1.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exoparg2.c b/drivers/acpi/acpica/exoparg2.c index 2ede656ee26a..fcc618aa2061 100644 --- a/drivers/acpi/acpica/exoparg2.c +++ b/drivers/acpi/acpica/exoparg2.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exoparg3.c b/drivers/acpi/acpica/exoparg3.c index 363767cf01e5..b813fed95e56 100644 --- a/drivers/acpi/acpica/exoparg3.c +++ b/drivers/acpi/acpica/exoparg3.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exoparg6.c b/drivers/acpi/acpica/exoparg6.c index 29e9e99f7fe3..c930edda3f65 100644 --- a/drivers/acpi/acpica/exoparg6.c +++ b/drivers/acpi/acpica/exoparg6.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exprep.c b/drivers/acpi/acpica/exprep.c index 118e942005e5..4c2836dc825b 100644 --- a/drivers/acpi/acpica/exprep.c +++ b/drivers/acpi/acpica/exprep.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exregion.c b/drivers/acpi/acpica/exregion.c index cd5288a257a9..0fe188e238ef 100644 --- a/drivers/acpi/acpica/exregion.c +++ b/drivers/acpi/acpica/exregion.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exresnte.c b/drivers/acpi/acpica/exresnte.c index ab060261b43e..c7e3b929aa85 100644 --- a/drivers/acpi/acpica/exresnte.c +++ b/drivers/acpi/acpica/exresnte.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exresolv.c b/drivers/acpi/acpica/exresolv.c index 3cde553bcbe1..b6b7f3af29e4 100644 --- a/drivers/acpi/acpica/exresolv.c +++ b/drivers/acpi/acpica/exresolv.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exresop.c b/drivers/acpi/acpica/exresop.c index 3af8de3fcea4..d2964af9ad4d 100644 --- a/drivers/acpi/acpica/exresop.c +++ b/drivers/acpi/acpica/exresop.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exstore.c b/drivers/acpi/acpica/exstore.c index daf49f7ea311..a7eee2400ce0 100644 --- a/drivers/acpi/acpica/exstore.c +++ b/drivers/acpi/acpica/exstore.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exstoren.c b/drivers/acpi/acpica/exstoren.c index 04bd16c08f9e..3101607b4efe 100644 --- a/drivers/acpi/acpica/exstoren.c +++ b/drivers/acpi/acpica/exstoren.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exstorob.c b/drivers/acpi/acpica/exstorob.c index fd11018b0168..6fa3c8d8fc5f 100644 --- a/drivers/acpi/acpica/exstorob.c +++ b/drivers/acpi/acpica/exstorob.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exsystem.c b/drivers/acpi/acpica/exsystem.c index f7da64123ed5..05450656fe3d 100644 --- a/drivers/acpi/acpica/exsystem.c +++ b/drivers/acpi/acpica/exsystem.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/exutils.c b/drivers/acpi/acpica/exutils.c index d9d72dff2a76..3f4225e95d93 100644 --- a/drivers/acpi/acpica/exutils.c +++ b/drivers/acpi/acpica/exutils.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwacpi.c b/drivers/acpi/acpica/hwacpi.c index 1e66d960fc11..e5c5949f9081 100644 --- a/drivers/acpi/acpica/hwacpi.c +++ b/drivers/acpi/acpica/hwacpi.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwesleep.c b/drivers/acpi/acpica/hwesleep.c index 858fdd6be598..e5599f610808 100644 --- a/drivers/acpi/acpica/hwesleep.c +++ b/drivers/acpi/acpica/hwesleep.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwgpe.c b/drivers/acpi/acpica/hwgpe.c index 494027f5c067..84bc550f4f1d 100644 --- a/drivers/acpi/acpica/hwgpe.c +++ b/drivers/acpi/acpica/hwgpe.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -54,6 +54,10 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | |||
54 | struct acpi_gpe_block_info *gpe_block, | 54 | struct acpi_gpe_block_info *gpe_block, |
55 | void *context); | 55 | void *context); |
56 | 56 | ||
57 | static acpi_status | ||
58 | acpi_hw_gpe_enable_write(u8 enable_mask, | ||
59 | struct acpi_gpe_register_info *gpe_register_info); | ||
60 | |||
57 | /****************************************************************************** | 61 | /****************************************************************************** |
58 | * | 62 | * |
59 | * FUNCTION: acpi_hw_get_gpe_register_bit | 63 | * FUNCTION: acpi_hw_get_gpe_register_bit |
@@ -146,7 +150,7 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action) | |||
146 | 150 | ||
147 | status = acpi_hw_write(enable_mask, &gpe_register_info->enable_address); | 151 | status = acpi_hw_write(enable_mask, &gpe_register_info->enable_address); |
148 | if (ACPI_SUCCESS(status) && (action & ACPI_GPE_SAVE_MASK)) { | 152 | if (ACPI_SUCCESS(status) && (action & ACPI_GPE_SAVE_MASK)) { |
149 | gpe_register_info->enable_mask = enable_mask; | 153 | gpe_register_info->enable_mask = (u8)enable_mask; |
150 | } | 154 | } |
151 | return (status); | 155 | return (status); |
152 | } | 156 | } |
@@ -221,7 +225,7 @@ acpi_hw_get_gpe_status(struct acpi_gpe_event_info * gpe_event_info, | |||
221 | 225 | ||
222 | /* GPE currently handled? */ | 226 | /* GPE currently handled? */ |
223 | 227 | ||
224 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) != | 228 | if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) != |
225 | ACPI_GPE_DISPATCH_NONE) { | 229 | ACPI_GPE_DISPATCH_NONE) { |
226 | local_event_status |= ACPI_EVENT_FLAG_HAS_HANDLER; | 230 | local_event_status |= ACPI_EVENT_FLAG_HAS_HANDLER; |
227 | } | 231 | } |
diff --git a/drivers/acpi/acpica/hwpci.c b/drivers/acpi/acpica/hwpci.c index 6aade8e1d2a1..c5214dec4988 100644 --- a/drivers/acpi/acpica/hwpci.c +++ b/drivers/acpi/acpica/hwpci.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwregs.c b/drivers/acpi/acpica/hwregs.c index a4c34d2c556b..3cf77afd142c 100644 --- a/drivers/acpi/acpica/hwregs.c +++ b/drivers/acpi/acpica/hwregs.c | |||
@@ -6,7 +6,7 @@ | |||
6 | ******************************************************************************/ | 6 | ******************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c index d590693eb54e..7d21cae6d602 100644 --- a/drivers/acpi/acpica/hwsleep.c +++ b/drivers/acpi/acpica/hwsleep.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwtimer.c b/drivers/acpi/acpica/hwtimer.c index 76ab5c1a814e..675c709a300b 100644 --- a/drivers/acpi/acpica/hwtimer.c +++ b/drivers/acpi/acpica/hwtimer.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwvalid.c b/drivers/acpi/acpica/hwvalid.c index 6b919127cd9d..2bd33fe56cb3 100644 --- a/drivers/acpi/acpica/hwvalid.c +++ b/drivers/acpi/acpica/hwvalid.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwxface.c b/drivers/acpi/acpica/hwxface.c index 96d007df65ec..5f97468df8ff 100644 --- a/drivers/acpi/acpica/hwxface.c +++ b/drivers/acpi/acpica/hwxface.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/hwxfsleep.c b/drivers/acpi/acpica/hwxfsleep.c index 6921c7f3d208..3b3767698827 100644 --- a/drivers/acpi/acpica/hwxfsleep.c +++ b/drivers/acpi/acpica/hwxfsleep.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsaccess.c b/drivers/acpi/acpica/nsaccess.c index f1249e3463be..24fa19a76d70 100644 --- a/drivers/acpi/acpica/nsaccess.c +++ b/drivers/acpi/acpica/nsaccess.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsalloc.c b/drivers/acpi/acpica/nsalloc.c index 607eb9e5150d..e107f929d9cf 100644 --- a/drivers/acpi/acpica/nsalloc.c +++ b/drivers/acpi/acpica/nsalloc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsarguments.c b/drivers/acpi/acpica/nsarguments.c index 80fcfc8c9c1b..5d347a71bd0b 100644 --- a/drivers/acpi/acpica/nsarguments.c +++ b/drivers/acpi/acpica/nsarguments.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsconvert.c b/drivers/acpi/acpica/nsconvert.c index b55642c4ee58..1a8b39c8d969 100644 --- a/drivers/acpi/acpica/nsconvert.c +++ b/drivers/acpi/acpica/nsconvert.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsdump.c b/drivers/acpi/acpica/nsdump.c index 3d88ef4a3e0d..80f097eb7381 100644 --- a/drivers/acpi/acpica/nsdump.c +++ b/drivers/acpi/acpica/nsdump.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c index 42d37109aa5d..7dc367e6fe09 100644 --- a/drivers/acpi/acpica/nsdumpdv.c +++ b/drivers/acpi/acpica/nsdumpdv.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nseval.c b/drivers/acpi/acpica/nseval.c index e634a05974db..7bcc68f57afa 100644 --- a/drivers/acpi/acpica/nseval.c +++ b/drivers/acpi/acpica/nseval.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsinit.c b/drivers/acpi/acpica/nsinit.c index a3fb7e4c0809..4a85c4517988 100644 --- a/drivers/acpi/acpica/nsinit.c +++ b/drivers/acpi/acpica/nsinit.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsload.c b/drivers/acpi/acpica/nsload.c index 7c9d0181f341..bd6cd4a81316 100644 --- a/drivers/acpi/acpica/nsload.c +++ b/drivers/acpi/acpica/nsload.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsnames.c b/drivers/acpi/acpica/nsnames.c index 7eee0a6f02f6..d293d9748036 100644 --- a/drivers/acpi/acpica/nsnames.c +++ b/drivers/acpi/acpica/nsnames.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsobject.c b/drivers/acpi/acpica/nsobject.c index a42ee9d6970d..677bc9330e64 100644 --- a/drivers/acpi/acpica/nsobject.c +++ b/drivers/acpi/acpica/nsobject.c | |||
@@ -6,7 +6,7 @@ | |||
6 | ******************************************************************************/ | 6 | ******************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsparse.c b/drivers/acpi/acpica/nsparse.c index e83cff31754b..c95a119767b5 100644 --- a/drivers/acpi/acpica/nsparse.c +++ b/drivers/acpi/acpica/nsparse.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nspredef.c b/drivers/acpi/acpica/nspredef.c index 392910ffbed9..0eb54315b4be 100644 --- a/drivers/acpi/acpica/nspredef.c +++ b/drivers/acpi/acpica/nspredef.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsprepkg.c b/drivers/acpi/acpica/nsprepkg.c index 1b13b921dda9..8b79958b7aca 100644 --- a/drivers/acpi/acpica/nsprepkg.c +++ b/drivers/acpi/acpica/nsprepkg.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsrepair.c b/drivers/acpi/acpica/nsrepair.c index 7e417aa5c91e..151fcd95ba84 100644 --- a/drivers/acpi/acpica/nsrepair.c +++ b/drivers/acpi/acpica/nsrepair.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c index b09e6bef72b8..c30672d23878 100644 --- a/drivers/acpi/acpica/nsrepair2.c +++ b/drivers/acpi/acpica/nsrepair2.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nssearch.c b/drivers/acpi/acpica/nssearch.c index af1cc42a8aa1..4a9d4a66016e 100644 --- a/drivers/acpi/acpica/nssearch.c +++ b/drivers/acpi/acpica/nssearch.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsutils.c b/drivers/acpi/acpica/nsutils.c index 4a5e3f5c0ff7..6ad02008c0c2 100644 --- a/drivers/acpi/acpica/nsutils.c +++ b/drivers/acpi/acpica/nsutils.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nswalk.c b/drivers/acpi/acpica/nswalk.c index 4758a1f2ce22..c68609a2bc1b 100644 --- a/drivers/acpi/acpica/nswalk.c +++ b/drivers/acpi/acpica/nswalk.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsxfeval.c b/drivers/acpi/acpica/nsxfeval.c index 4bd558bf10d2..b6030a2deee1 100644 --- a/drivers/acpi/acpica/nsxfeval.c +++ b/drivers/acpi/acpica/nsxfeval.c | |||
@@ -6,7 +6,7 @@ | |||
6 | ******************************************************************************/ | 6 | ******************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c index 8c6c11ce9760..d66c326485d8 100644 --- a/drivers/acpi/acpica/nsxfname.c +++ b/drivers/acpi/acpica/nsxfname.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/nsxfobj.c b/drivers/acpi/acpica/nsxfobj.c index 51a83298c18d..793383501f81 100644 --- a/drivers/acpi/acpica/nsxfobj.c +++ b/drivers/acpi/acpica/nsxfobj.c | |||
@@ -6,7 +6,7 @@ | |||
6 | ******************************************************************************/ | 6 | ******************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2014, Intel Corp. | 9 | * Copyright (C) 2000 - 2015, Intel Corp. |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c index 314d314340ae..6d038770577b 100644 --- a/drivers/acpi/acpica/psargs.c +++ b/drivers/acpi/acpica/psargs.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psloop.c b/drivers/acpi/acpica/psloop.c index b058e2390fdd..90437227d790 100644 --- a/drivers/acpi/acpica/psloop.c +++ b/drivers/acpi/acpica/psloop.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psobject.c b/drivers/acpi/acpica/psobject.c index a6885077d59e..2f5ddd806c58 100644 --- a/drivers/acpi/acpica/psobject.c +++ b/drivers/acpi/acpica/psobject.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psopcode.c b/drivers/acpi/acpica/psopcode.c index 1755d2ac5656..1af4a405e351 100644 --- a/drivers/acpi/acpica/psopcode.c +++ b/drivers/acpi/acpica/psopcode.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psopinfo.c b/drivers/acpi/acpica/psopinfo.c index 0d8d37ffd04d..e18e7c47f482 100644 --- a/drivers/acpi/acpica/psopinfo.c +++ b/drivers/acpi/acpica/psopinfo.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psparse.c b/drivers/acpi/acpica/psparse.c index 6d27b597394e..a555f7f7b9a2 100644 --- a/drivers/acpi/acpica/psparse.c +++ b/drivers/acpi/acpica/psparse.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psscope.c b/drivers/acpi/acpica/psscope.c index 32d250feea21..9d669cc6cb62 100644 --- a/drivers/acpi/acpica/psscope.c +++ b/drivers/acpi/acpica/psscope.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/pstree.c b/drivers/acpi/acpica/pstree.c index 0b64181e7720..89984f30addc 100644 --- a/drivers/acpi/acpica/pstree.c +++ b/drivers/acpi/acpica/pstree.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psutils.c b/drivers/acpi/acpica/psutils.c index 3cd48802eede..960505ab409a 100644 --- a/drivers/acpi/acpica/psutils.c +++ b/drivers/acpi/acpica/psutils.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/pswalk.c b/drivers/acpi/acpica/pswalk.c index 9cb07e1e76d9..ba5f69171288 100644 --- a/drivers/acpi/acpica/pswalk.c +++ b/drivers/acpi/acpica/pswalk.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/psxface.c b/drivers/acpi/acpica/psxface.c index e135acaa5e1c..841a5ea06094 100644 --- a/drivers/acpi/acpica/psxface.c +++ b/drivers/acpi/acpica/psxface.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsaddr.c b/drivers/acpi/acpica/rsaddr.c index 94a3a057042c..66d406e8fe36 100644 --- a/drivers/acpi/acpica/rsaddr.c +++ b/drivers/acpi/acpica/rsaddr.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rscalc.c b/drivers/acpi/acpica/rscalc.c index 689556744b03..cb739a694931 100644 --- a/drivers/acpi/acpica/rscalc.c +++ b/drivers/acpi/acpica/rscalc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rscreate.c b/drivers/acpi/acpica/rscreate.c index 049d9c22a0f9..15434e4c9b34 100644 --- a/drivers/acpi/acpica/rscreate.c +++ b/drivers/acpi/acpica/rscreate.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsdump.c b/drivers/acpi/acpica/rsdump.c index c3c56b5a9788..1539394c8c52 100644 --- a/drivers/acpi/acpica/rsdump.c +++ b/drivers/acpi/acpica/rsdump.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsdumpinfo.c b/drivers/acpi/acpica/rsdumpinfo.c index 6ba7ad5faa9c..b29d9ec63d1b 100644 --- a/drivers/acpi/acpica/rsdumpinfo.c +++ b/drivers/acpi/acpica/rsdumpinfo.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsinfo.c b/drivers/acpi/acpica/rsinfo.c index 9d3f8a9a24bd..edecfc675979 100644 --- a/drivers/acpi/acpica/rsinfo.c +++ b/drivers/acpi/acpica/rsinfo.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsio.c b/drivers/acpi/acpica/rsio.c index 19d64873290a..5adba018bab0 100644 --- a/drivers/acpi/acpica/rsio.c +++ b/drivers/acpi/acpica/rsio.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsirq.c b/drivers/acpi/acpica/rsirq.c index 3461f7db26df..07cfa70a475b 100644 --- a/drivers/acpi/acpica/rsirq.c +++ b/drivers/acpi/acpica/rsirq.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rslist.c b/drivers/acpi/acpica/rslist.c index 77291293af64..50d5be2ee062 100644 --- a/drivers/acpi/acpica/rslist.c +++ b/drivers/acpi/acpica/rslist.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsmemory.c b/drivers/acpi/acpica/rsmemory.c index eab4483ff5f8..c6b80862030e 100644 --- a/drivers/acpi/acpica/rsmemory.c +++ b/drivers/acpi/acpica/rsmemory.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsmisc.c b/drivers/acpi/acpica/rsmisc.c index 41eea4bc089c..1fe49d223663 100644 --- a/drivers/acpi/acpica/rsmisc.c +++ b/drivers/acpi/acpica/rsmisc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsserial.c b/drivers/acpi/acpica/rsserial.c index 9e8407223d95..4c8c6fe6ea74 100644 --- a/drivers/acpi/acpica/rsserial.c +++ b/drivers/acpi/acpica/rsserial.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsutils.c b/drivers/acpi/acpica/rsutils.c index 897a5ceb0420..ece3cd60cc6a 100644 --- a/drivers/acpi/acpica/rsutils.c +++ b/drivers/acpi/acpica/rsutils.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/rsxface.c b/drivers/acpi/acpica/rsxface.c index 295287891174..8e6276df0226 100644 --- a/drivers/acpi/acpica/rsxface.c +++ b/drivers/acpi/acpica/rsxface.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbdata.c b/drivers/acpi/acpica/tbdata.c index f499c10ceb4a..6a144957aadd 100644 --- a/drivers/acpi/acpica/tbdata.c +++ b/drivers/acpi/acpica/tbdata.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c index 41519a958083..7d2486005e3f 100644 --- a/drivers/acpi/acpica/tbfadt.c +++ b/drivers/acpi/acpica/tbfadt.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbfind.c b/drivers/acpi/acpica/tbfind.c index cb947700206c..0b879fcfef67 100644 --- a/drivers/acpi/acpica/tbfind.c +++ b/drivers/acpi/acpica/tbfind.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbinstal.c b/drivers/acpi/acpica/tbinstal.c index 755b90c40ddf..9bad45e63a45 100644 --- a/drivers/acpi/acpica/tbinstal.c +++ b/drivers/acpi/acpica/tbinstal.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbprint.c b/drivers/acpi/acpica/tbprint.c index df3bb20ea325..ef16c06e5091 100644 --- a/drivers/acpi/acpica/tbprint.c +++ b/drivers/acpi/acpica/tbprint.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c index 6b1ca9991b90..6559a58439c5 100644 --- a/drivers/acpi/acpica/tbutils.c +++ b/drivers/acpi/acpica/tbutils.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbxface.c b/drivers/acpi/acpica/tbxface.c index 0f9dd80b1cdd..60e94f87f27a 100644 --- a/drivers/acpi/acpica/tbxface.c +++ b/drivers/acpi/acpica/tbxface.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbxfload.c b/drivers/acpi/acpica/tbxfload.c index ab5308b81aa8..aadb3002a2dd 100644 --- a/drivers/acpi/acpica/tbxfload.c +++ b/drivers/acpi/acpica/tbxfload.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/tbxfroot.c b/drivers/acpi/acpica/tbxfroot.c index 43a54af2b548..eac52cf14f1a 100644 --- a/drivers/acpi/acpica/tbxfroot.c +++ b/drivers/acpi/acpica/tbxfroot.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utaddress.c b/drivers/acpi/acpica/utaddress.c index a1acec9d2ef3..1279f50da757 100644 --- a/drivers/acpi/acpica/utaddress.c +++ b/drivers/acpi/acpica/utaddress.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utalloc.c b/drivers/acpi/acpica/utalloc.c index efac83c606dc..61d8f6d186d1 100644 --- a/drivers/acpi/acpica/utalloc.c +++ b/drivers/acpi/acpica/utalloc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utbuffer.c b/drivers/acpi/acpica/utbuffer.c index 038ea887f562..242bd071f007 100644 --- a/drivers/acpi/acpica/utbuffer.c +++ b/drivers/acpi/acpica/utbuffer.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utcache.c b/drivers/acpi/acpica/utcache.c index 78fde0aac487..eacc5eee362e 100644 --- a/drivers/acpi/acpica/utcache.c +++ b/drivers/acpi/acpica/utcache.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utcopy.c b/drivers/acpi/acpica/utcopy.c index ff601c0f7c7a..c37ec5035f4c 100644 --- a/drivers/acpi/acpica/utcopy.c +++ b/drivers/acpi/acpica/utcopy.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utdebug.c b/drivers/acpi/acpica/utdebug.c index e516254c63b2..57078e3ea9b7 100644 --- a/drivers/acpi/acpica/utdebug.c +++ b/drivers/acpi/acpica/utdebug.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utdecode.c b/drivers/acpi/acpica/utdecode.c index 40e923e675fc..988e23b7795c 100644 --- a/drivers/acpi/acpica/utdecode.c +++ b/drivers/acpi/acpica/utdecode.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utdelete.c b/drivers/acpi/acpica/utdelete.c index a3516de213fa..71fce389fd48 100644 --- a/drivers/acpi/acpica/utdelete.c +++ b/drivers/acpi/acpica/utdelete.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/uterror.c b/drivers/acpi/acpica/uterror.c index 8e544d4688cd..9ef80f2828e3 100644 --- a/drivers/acpi/acpica/uterror.c +++ b/drivers/acpi/acpica/uterror.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/uteval.c b/drivers/acpi/acpica/uteval.c index 8fed1482d228..6c738fa0cd42 100644 --- a/drivers/acpi/acpica/uteval.c +++ b/drivers/acpi/acpica/uteval.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utexcep.c b/drivers/acpi/acpica/utexcep.c index 0403dcaabaf2..743a0ae9fb17 100644 --- a/drivers/acpi/acpica/utexcep.c +++ b/drivers/acpi/acpica/utexcep.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utfileio.c b/drivers/acpi/acpica/utfileio.c index 4e263a8cc6f0..7e1168be39fa 100644 --- a/drivers/acpi/acpica/utfileio.c +++ b/drivers/acpi/acpica/utfileio.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utglobal.c b/drivers/acpi/acpica/utglobal.c index 77ceac715f28..5e8df9177da4 100644 --- a/drivers/acpi/acpica/utglobal.c +++ b/drivers/acpi/acpica/utglobal.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/uthex.c b/drivers/acpi/acpica/uthex.c index 9afa9441b183..aa448278ba28 100644 --- a/drivers/acpi/acpica/uthex.c +++ b/drivers/acpi/acpica/uthex.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utids.c b/drivers/acpi/acpica/utids.c index 4b12880e5b11..27431cfc1c44 100644 --- a/drivers/acpi/acpica/utids.c +++ b/drivers/acpi/acpica/utids.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utinit.c b/drivers/acpi/acpica/utinit.c index 77120ec9ea86..e402e07b4846 100644 --- a/drivers/acpi/acpica/utinit.c +++ b/drivers/acpi/acpica/utinit.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utlock.c b/drivers/acpi/acpica/utlock.c index dc6e96547f18..089f78bbd59b 100644 --- a/drivers/acpi/acpica/utlock.c +++ b/drivers/acpi/acpica/utlock.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utmath.c b/drivers/acpi/acpica/utmath.c index d44dee6ee10a..f9ff100f0159 100644 --- a/drivers/acpi/acpica/utmath.c +++ b/drivers/acpi/acpica/utmath.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utmisc.c b/drivers/acpi/acpica/utmisc.c index 2e2bb14e1099..56bbacd576f2 100644 --- a/drivers/acpi/acpica/utmisc.c +++ b/drivers/acpi/acpica/utmisc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utmutex.c b/drivers/acpi/acpica/utmutex.c index 82717fff9ffc..37b8b58fcd56 100644 --- a/drivers/acpi/acpica/utmutex.c +++ b/drivers/acpi/acpica/utmutex.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utobject.c b/drivers/acpi/acpica/utobject.c index dfa9009bfc87..7d83efe1ea29 100644 --- a/drivers/acpi/acpica/utobject.c +++ b/drivers/acpi/acpica/utobject.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utosi.c b/drivers/acpi/acpica/utosi.c index 685766fc6ca8..574cd3118313 100644 --- a/drivers/acpi/acpica/utosi.c +++ b/drivers/acpi/acpica/utosi.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utownerid.c b/drivers/acpi/acpica/utownerid.c index 36bec57ebd23..2959217067cb 100644 --- a/drivers/acpi/acpica/utownerid.c +++ b/drivers/acpi/acpica/utownerid.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utpredef.c b/drivers/acpi/acpica/utpredef.c index db30caff130a..29e449935a82 100644 --- a/drivers/acpi/acpica/utpredef.c +++ b/drivers/acpi/acpica/utpredef.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utprint.c b/drivers/acpi/acpica/utprint.c index 0ce3f5a0dd67..82ca9142e10d 100644 --- a/drivers/acpi/acpica/utprint.c +++ b/drivers/acpi/acpica/utprint.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utresrc.c b/drivers/acpi/acpica/utresrc.c index bc1ff820c7dd..b3505dbc715e 100644 --- a/drivers/acpi/acpica/utresrc.c +++ b/drivers/acpi/acpica/utresrc.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utstate.c b/drivers/acpi/acpica/utstate.c index 1cc97a752c15..8274cc16edc3 100644 --- a/drivers/acpi/acpica/utstate.c +++ b/drivers/acpi/acpica/utstate.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utstring.c b/drivers/acpi/acpica/utstring.c index 6dc54b3c28b0..83b6c52490dc 100644 --- a/drivers/acpi/acpica/utstring.c +++ b/drivers/acpi/acpica/utstring.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/uttrack.c b/drivers/acpi/acpica/uttrack.c index 7d0ee969d781..130dd9f96f0f 100644 --- a/drivers/acpi/acpica/uttrack.c +++ b/drivers/acpi/acpica/uttrack.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utuuid.c b/drivers/acpi/acpica/utuuid.c index 4dc33130f134..c6149a212149 100644 --- a/drivers/acpi/acpica/utuuid.c +++ b/drivers/acpi/acpica/utuuid.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utxface.c b/drivers/acpi/acpica/utxface.c index 49c873c68756..0929187bdce0 100644 --- a/drivers/acpi/acpica/utxface.c +++ b/drivers/acpi/acpica/utxface.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utxferror.c b/drivers/acpi/acpica/utxferror.c index 88ef77f3cf88..306e785f9418 100644 --- a/drivers/acpi/acpica/utxferror.c +++ b/drivers/acpi/acpica/utxferror.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utxfinit.c b/drivers/acpi/acpica/utxfinit.c index b1fd6886e439..083a76891889 100644 --- a/drivers/acpi/acpica/utxfinit.c +++ b/drivers/acpi/acpica/utxfinit.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/acpica/utxfmutex.c b/drivers/acpi/acpica/utxfmutex.c index 2a0f9e04d3a4..f2606af3364c 100644 --- a/drivers/acpi/acpica/utxfmutex.c +++ b/drivers/acpi/acpica/utxfmutex.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 1b5853f384e2..14d0c89ada2a 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -1,8 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * ec.c - ACPI Embedded Controller Driver (v2.2) | 2 | * ec.c - ACPI Embedded Controller Driver (v3) |
3 | * | 3 | * |
4 | * Copyright (C) 2001-2014 Intel Corporation | 4 | * Copyright (C) 2001-2015 Intel Corporation |
5 | * Author: 2014 Lv Zheng <lv.zheng@intel.com> | 5 | * Author: 2014, 2015 Lv Zheng <lv.zheng@intel.com> |
6 | * 2006, 2007 Alexey Starikovskiy <alexey.y.starikovskiy@intel.com> | 6 | * 2006, 2007 Alexey Starikovskiy <alexey.y.starikovskiy@intel.com> |
7 | * 2006 Denis Sadykov <denis.m.sadykov@intel.com> | 7 | * 2006 Denis Sadykov <denis.m.sadykov@intel.com> |
8 | * 2004 Luming Yu <luming.yu@intel.com> | 8 | * 2004 Luming Yu <luming.yu@intel.com> |
@@ -31,6 +31,7 @@ | |||
31 | 31 | ||
32 | /* Uncomment next line to get verbose printout */ | 32 | /* Uncomment next line to get verbose printout */ |
33 | /* #define DEBUG */ | 33 | /* #define DEBUG */ |
34 | #define DEBUG_REF 0 | ||
34 | #define pr_fmt(fmt) "ACPI : EC: " fmt | 35 | #define pr_fmt(fmt) "ACPI : EC: " fmt |
35 | 36 | ||
36 | #include <linux/kernel.h> | 37 | #include <linux/kernel.h> |
@@ -71,20 +72,32 @@ enum ec_command { | |||
71 | #define ACPI_EC_DELAY 500 /* Wait 500ms max. during EC ops */ | 72 | #define ACPI_EC_DELAY 500 /* Wait 500ms max. during EC ops */ |
72 | #define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */ | 73 | #define ACPI_EC_UDELAY_GLK 1000 /* Wait 1ms max. to get global lock */ |
73 | #define ACPI_EC_MSI_UDELAY 550 /* Wait 550us for MSI EC */ | 74 | #define ACPI_EC_MSI_UDELAY 550 /* Wait 550us for MSI EC */ |
75 | #define ACPI_EC_UDELAY_POLL 1000 /* Wait 1ms for EC transaction polling */ | ||
74 | #define ACPI_EC_CLEAR_MAX 100 /* Maximum number of events to query | 76 | #define ACPI_EC_CLEAR_MAX 100 /* Maximum number of events to query |
75 | * when trying to clear the EC */ | 77 | * when trying to clear the EC */ |
76 | 78 | ||
77 | enum { | 79 | enum { |
78 | EC_FLAGS_QUERY_PENDING, /* Query is pending */ | 80 | EC_FLAGS_EVENT_ENABLED, /* Event is enabled */ |
79 | EC_FLAGS_GPE_STORM, /* GPE storm detected */ | 81 | EC_FLAGS_EVENT_PENDING, /* Event is pending */ |
82 | EC_FLAGS_EVENT_DETECTED, /* Event is detected */ | ||
80 | EC_FLAGS_HANDLERS_INSTALLED, /* Handlers for GPE and | 83 | EC_FLAGS_HANDLERS_INSTALLED, /* Handlers for GPE and |
81 | * OpReg are installed */ | 84 | * OpReg are installed */ |
82 | EC_FLAGS_BLOCKED, /* Transactions are blocked */ | 85 | EC_FLAGS_STARTED, /* Driver is started */ |
86 | EC_FLAGS_STOPPED, /* Driver is stopped */ | ||
87 | EC_FLAGS_COMMAND_STORM, /* GPE storms occurred to the | ||
88 | * current command processing */ | ||
83 | }; | 89 | }; |
84 | 90 | ||
85 | #define ACPI_EC_COMMAND_POLL 0x01 /* Available for command byte */ | 91 | #define ACPI_EC_COMMAND_POLL 0x01 /* Available for command byte */ |
86 | #define ACPI_EC_COMMAND_COMPLETE 0x02 /* Completed last byte */ | 92 | #define ACPI_EC_COMMAND_COMPLETE 0x02 /* Completed last byte */ |
87 | 93 | ||
94 | #define ec_debug_ref(ec, fmt, ...) \ | ||
95 | do { \ | ||
96 | if (DEBUG_REF) \ | ||
97 | pr_debug("%lu: " fmt, ec->reference_count, \ | ||
98 | ## __VA_ARGS__); \ | ||
99 | } while (0) | ||
100 | |||
88 | /* ec.c is compiled in acpi namespace so this shows up as acpi.ec_delay param */ | 101 | /* ec.c is compiled in acpi namespace so this shows up as acpi.ec_delay param */ |
89 | static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY; | 102 | static unsigned int ec_delay __read_mostly = ACPI_EC_DELAY; |
90 | module_param(ec_delay, uint, 0644); | 103 | module_param(ec_delay, uint, 0644); |
@@ -105,6 +118,7 @@ struct acpi_ec_query_handler { | |||
105 | acpi_handle handle; | 118 | acpi_handle handle; |
106 | void *data; | 119 | void *data; |
107 | u8 query_bit; | 120 | u8 query_bit; |
121 | struct kref kref; | ||
108 | }; | 122 | }; |
109 | 123 | ||
110 | struct transaction { | 124 | struct transaction { |
@@ -117,8 +131,12 @@ struct transaction { | |||
117 | u8 wlen; | 131 | u8 wlen; |
118 | u8 rlen; | 132 | u8 rlen; |
119 | u8 flags; | 133 | u8 flags; |
134 | unsigned long timestamp; | ||
120 | }; | 135 | }; |
121 | 136 | ||
137 | static int acpi_ec_query(struct acpi_ec *ec, u8 *data); | ||
138 | static void advance_transaction(struct acpi_ec *ec); | ||
139 | |||
122 | struct acpi_ec *boot_ec, *first_ec; | 140 | struct acpi_ec *boot_ec, *first_ec; |
123 | EXPORT_SYMBOL(first_ec); | 141 | EXPORT_SYMBOL(first_ec); |
124 | 142 | ||
@@ -129,7 +147,28 @@ static int EC_FLAGS_CLEAR_ON_RESUME; /* Needs acpi_ec_clear() on boot/resume */ | |||
129 | static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */ | 147 | static int EC_FLAGS_QUERY_HANDSHAKE; /* Needs QR_EC issued when SCI_EVT set */ |
130 | 148 | ||
131 | /* -------------------------------------------------------------------------- | 149 | /* -------------------------------------------------------------------------- |
132 | * Transaction Management | 150 | * Device Flags |
151 | * -------------------------------------------------------------------------- */ | ||
152 | |||
153 | static bool acpi_ec_started(struct acpi_ec *ec) | ||
154 | { | ||
155 | return test_bit(EC_FLAGS_STARTED, &ec->flags) && | ||
156 | !test_bit(EC_FLAGS_STOPPED, &ec->flags); | ||
157 | } | ||
158 | |||
159 | static bool acpi_ec_flushed(struct acpi_ec *ec) | ||
160 | { | ||
161 | return ec->reference_count == 1; | ||
162 | } | ||
163 | |||
164 | static bool acpi_ec_has_pending_event(struct acpi_ec *ec) | ||
165 | { | ||
166 | return test_bit(EC_FLAGS_EVENT_DETECTED, &ec->flags) || | ||
167 | test_bit(EC_FLAGS_EVENT_PENDING, &ec->flags); | ||
168 | } | ||
169 | |||
170 | /* -------------------------------------------------------------------------- | ||
171 | * EC Registers | ||
133 | * -------------------------------------------------------------------------- */ | 172 | * -------------------------------------------------------------------------- */ |
134 | 173 | ||
135 | static inline u8 acpi_ec_read_status(struct acpi_ec *ec) | 174 | static inline u8 acpi_ec_read_status(struct acpi_ec *ec) |
@@ -151,6 +190,7 @@ static inline u8 acpi_ec_read_data(struct acpi_ec *ec) | |||
151 | { | 190 | { |
152 | u8 x = inb(ec->data_addr); | 191 | u8 x = inb(ec->data_addr); |
153 | 192 | ||
193 | ec->curr->timestamp = jiffies; | ||
154 | pr_debug("EC_DATA(R) = 0x%2.2x\n", x); | 194 | pr_debug("EC_DATA(R) = 0x%2.2x\n", x); |
155 | return x; | 195 | return x; |
156 | } | 196 | } |
@@ -159,12 +199,14 @@ static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command) | |||
159 | { | 199 | { |
160 | pr_debug("EC_SC(W) = 0x%2.2x\n", command); | 200 | pr_debug("EC_SC(W) = 0x%2.2x\n", command); |
161 | outb(command, ec->command_addr); | 201 | outb(command, ec->command_addr); |
202 | ec->curr->timestamp = jiffies; | ||
162 | } | 203 | } |
163 | 204 | ||
164 | static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data) | 205 | static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data) |
165 | { | 206 | { |
166 | pr_debug("EC_DATA(W) = 0x%2.2x\n", data); | 207 | pr_debug("EC_DATA(W) = 0x%2.2x\n", data); |
167 | outb(data, ec->data_addr); | 208 | outb(data, ec->data_addr); |
209 | ec->curr->timestamp = jiffies; | ||
168 | } | 210 | } |
169 | 211 | ||
170 | #ifdef DEBUG | 212 | #ifdef DEBUG |
@@ -188,6 +230,203 @@ static const char *acpi_ec_cmd_string(u8 cmd) | |||
188 | #define acpi_ec_cmd_string(cmd) "UNDEF" | 230 | #define acpi_ec_cmd_string(cmd) "UNDEF" |
189 | #endif | 231 | #endif |
190 | 232 | ||
233 | /* -------------------------------------------------------------------------- | ||
234 | * GPE Registers | ||
235 | * -------------------------------------------------------------------------- */ | ||
236 | |||
237 | static inline bool acpi_ec_is_gpe_raised(struct acpi_ec *ec) | ||
238 | { | ||
239 | acpi_event_status gpe_status = 0; | ||
240 | |||
241 | (void)acpi_get_gpe_status(NULL, ec->gpe, &gpe_status); | ||
242 | return (gpe_status & ACPI_EVENT_FLAG_SET) ? true : false; | ||
243 | } | ||
244 | |||
245 | static inline void acpi_ec_enable_gpe(struct acpi_ec *ec, bool open) | ||
246 | { | ||
247 | if (open) | ||
248 | acpi_enable_gpe(NULL, ec->gpe); | ||
249 | else { | ||
250 | BUG_ON(ec->reference_count < 1); | ||
251 | acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE); | ||
252 | } | ||
253 | if (acpi_ec_is_gpe_raised(ec)) { | ||
254 | /* | ||
255 | * On some platforms, EN=1 writes cannot trigger GPE. So | ||
256 | * software need to manually trigger a pseudo GPE event on | ||
257 | * EN=1 writes. | ||
258 | */ | ||
259 | pr_debug("***** Polling quirk *****\n"); | ||
260 | advance_transaction(ec); | ||
261 | } | ||
262 | } | ||
263 | |||
264 | static inline void acpi_ec_disable_gpe(struct acpi_ec *ec, bool close) | ||
265 | { | ||
266 | if (close) | ||
267 | acpi_disable_gpe(NULL, ec->gpe); | ||
268 | else { | ||
269 | BUG_ON(ec->reference_count < 1); | ||
270 | acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE); | ||
271 | } | ||
272 | } | ||
273 | |||
274 | static inline void acpi_ec_clear_gpe(struct acpi_ec *ec) | ||
275 | { | ||
276 | /* | ||
277 | * GPE STS is a W1C register, which means: | ||
278 | * 1. Software can clear it without worrying about clearing other | ||
279 | * GPEs' STS bits when the hardware sets them in parallel. | ||
280 | * 2. As long as software can ensure only clearing it when it is | ||
281 | * set, hardware won't set it in parallel. | ||
282 | * So software can clear GPE in any contexts. | ||
283 | * Warning: do not move the check into advance_transaction() as the | ||
284 | * EC commands will be sent without GPE raised. | ||
285 | */ | ||
286 | if (!acpi_ec_is_gpe_raised(ec)) | ||
287 | return; | ||
288 | acpi_clear_gpe(NULL, ec->gpe); | ||
289 | } | ||
290 | |||
291 | /* -------------------------------------------------------------------------- | ||
292 | * Transaction Management | ||
293 | * -------------------------------------------------------------------------- */ | ||
294 | |||
295 | static void acpi_ec_submit_request(struct acpi_ec *ec) | ||
296 | { | ||
297 | ec->reference_count++; | ||
298 | if (ec->reference_count == 1) | ||
299 | acpi_ec_enable_gpe(ec, true); | ||
300 | } | ||
301 | |||
302 | static void acpi_ec_complete_request(struct acpi_ec *ec) | ||
303 | { | ||
304 | bool flushed = false; | ||
305 | |||
306 | ec->reference_count--; | ||
307 | if (ec->reference_count == 0) | ||
308 | acpi_ec_disable_gpe(ec, true); | ||
309 | flushed = acpi_ec_flushed(ec); | ||
310 | if (flushed) | ||
311 | wake_up(&ec->wait); | ||
312 | } | ||
313 | |||
314 | static void acpi_ec_set_storm(struct acpi_ec *ec, u8 flag) | ||
315 | { | ||
316 | if (!test_bit(flag, &ec->flags)) { | ||
317 | acpi_ec_disable_gpe(ec, false); | ||
318 | pr_debug("+++++ Polling enabled +++++\n"); | ||
319 | set_bit(flag, &ec->flags); | ||
320 | } | ||
321 | } | ||
322 | |||
323 | static void acpi_ec_clear_storm(struct acpi_ec *ec, u8 flag) | ||
324 | { | ||
325 | if (test_bit(flag, &ec->flags)) { | ||
326 | clear_bit(flag, &ec->flags); | ||
327 | acpi_ec_enable_gpe(ec, false); | ||
328 | pr_debug("+++++ Polling disabled +++++\n"); | ||
329 | } | ||
330 | } | ||
331 | |||
332 | /* | ||
333 | * acpi_ec_submit_flushable_request() - Increase the reference count unless | ||
334 | * the flush operation is not in | ||
335 | * progress | ||
336 | * @ec: the EC device | ||
337 | * @allow_event: whether event should be handled | ||
338 | * | ||
339 | * This function must be used before taking a new action that should hold | ||
340 | * the reference count. If this function returns false, then the action | ||
341 | * must be discarded or it will prevent the flush operation from being | ||
342 | * completed. | ||
343 | * | ||
344 | * During flushing, QR_EC command need to pass this check when there is a | ||
345 | * pending event, so that the reference count held for the pending event | ||
346 | * can be decreased by the completion of the QR_EC command. | ||
347 | */ | ||
348 | static bool acpi_ec_submit_flushable_request(struct acpi_ec *ec, | ||
349 | bool allow_event) | ||
350 | { | ||
351 | if (!acpi_ec_started(ec)) { | ||
352 | if (!allow_event || !acpi_ec_has_pending_event(ec)) | ||
353 | return false; | ||
354 | } | ||
355 | acpi_ec_submit_request(ec); | ||
356 | return true; | ||
357 | } | ||
358 | |||
359 | static void acpi_ec_submit_event(struct acpi_ec *ec) | ||
360 | { | ||
361 | if (!test_bit(EC_FLAGS_EVENT_DETECTED, &ec->flags) || | ||
362 | !test_bit(EC_FLAGS_EVENT_ENABLED, &ec->flags)) | ||
363 | return; | ||
364 | /* Hold reference for pending event */ | ||
365 | if (!acpi_ec_submit_flushable_request(ec, true)) | ||
366 | return; | ||
367 | ec_debug_ref(ec, "Increase event\n"); | ||
368 | if (!test_and_set_bit(EC_FLAGS_EVENT_PENDING, &ec->flags)) { | ||
369 | pr_debug("***** Event query started *****\n"); | ||
370 | schedule_work(&ec->work); | ||
371 | return; | ||
372 | } | ||
373 | acpi_ec_complete_request(ec); | ||
374 | ec_debug_ref(ec, "Decrease event\n"); | ||
375 | } | ||
376 | |||
377 | static void acpi_ec_complete_event(struct acpi_ec *ec) | ||
378 | { | ||
379 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { | ||
380 | clear_bit(EC_FLAGS_EVENT_PENDING, &ec->flags); | ||
381 | pr_debug("***** Event query stopped *****\n"); | ||
382 | /* Unhold reference for pending event */ | ||
383 | acpi_ec_complete_request(ec); | ||
384 | ec_debug_ref(ec, "Decrease event\n"); | ||
385 | /* Check if there is another SCI_EVT detected */ | ||
386 | acpi_ec_submit_event(ec); | ||
387 | } | ||
388 | } | ||
389 | |||
390 | static void acpi_ec_submit_detection(struct acpi_ec *ec) | ||
391 | { | ||
392 | /* Hold reference for query submission */ | ||
393 | if (!acpi_ec_submit_flushable_request(ec, false)) | ||
394 | return; | ||
395 | ec_debug_ref(ec, "Increase query\n"); | ||
396 | if (!test_and_set_bit(EC_FLAGS_EVENT_DETECTED, &ec->flags)) { | ||
397 | pr_debug("***** Event detection blocked *****\n"); | ||
398 | acpi_ec_submit_event(ec); | ||
399 | return; | ||
400 | } | ||
401 | acpi_ec_complete_request(ec); | ||
402 | ec_debug_ref(ec, "Decrease query\n"); | ||
403 | } | ||
404 | |||
405 | static void acpi_ec_complete_detection(struct acpi_ec *ec) | ||
406 | { | ||
407 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { | ||
408 | clear_bit(EC_FLAGS_EVENT_DETECTED, &ec->flags); | ||
409 | pr_debug("***** Event detetion unblocked *****\n"); | ||
410 | /* Unhold reference for query submission */ | ||
411 | acpi_ec_complete_request(ec); | ||
412 | ec_debug_ref(ec, "Decrease query\n"); | ||
413 | } | ||
414 | } | ||
415 | |||
416 | static void acpi_ec_enable_event(struct acpi_ec *ec) | ||
417 | { | ||
418 | unsigned long flags; | ||
419 | |||
420 | spin_lock_irqsave(&ec->lock, flags); | ||
421 | set_bit(EC_FLAGS_EVENT_ENABLED, &ec->flags); | ||
422 | /* | ||
423 | * An event may be pending even with SCI_EVT=0, so QR_EC should | ||
424 | * always be issued right after started. | ||
425 | */ | ||
426 | acpi_ec_submit_detection(ec); | ||
427 | spin_unlock_irqrestore(&ec->lock, flags); | ||
428 | } | ||
429 | |||
191 | static int ec_transaction_completed(struct acpi_ec *ec) | 430 | static int ec_transaction_completed(struct acpi_ec *ec) |
192 | { | 431 | { |
193 | unsigned long flags; | 432 | unsigned long flags; |
@@ -200,7 +439,7 @@ static int ec_transaction_completed(struct acpi_ec *ec) | |||
200 | return ret; | 439 | return ret; |
201 | } | 440 | } |
202 | 441 | ||
203 | static bool advance_transaction(struct acpi_ec *ec) | 442 | static void advance_transaction(struct acpi_ec *ec) |
204 | { | 443 | { |
205 | struct transaction *t; | 444 | struct transaction *t; |
206 | u8 status; | 445 | u8 status; |
@@ -208,6 +447,12 @@ static bool advance_transaction(struct acpi_ec *ec) | |||
208 | 447 | ||
209 | pr_debug("===== %s (%d) =====\n", | 448 | pr_debug("===== %s (%d) =====\n", |
210 | in_interrupt() ? "IRQ" : "TASK", smp_processor_id()); | 449 | in_interrupt() ? "IRQ" : "TASK", smp_processor_id()); |
450 | /* | ||
451 | * By always clearing STS before handling all indications, we can | ||
452 | * ensure a hardware STS 0->1 change after this clearing can always | ||
453 | * trigger a GPE interrupt. | ||
454 | */ | ||
455 | acpi_ec_clear_gpe(ec); | ||
211 | status = acpi_ec_read_status(ec); | 456 | status = acpi_ec_read_status(ec); |
212 | t = ec->curr; | 457 | t = ec->curr; |
213 | if (!t) | 458 | if (!t) |
@@ -223,6 +468,7 @@ static bool advance_transaction(struct acpi_ec *ec) | |||
223 | t->rdata[t->ri++] = acpi_ec_read_data(ec); | 468 | t->rdata[t->ri++] = acpi_ec_read_data(ec); |
224 | if (t->rlen == t->ri) { | 469 | if (t->rlen == t->ri) { |
225 | t->flags |= ACPI_EC_COMMAND_COMPLETE; | 470 | t->flags |= ACPI_EC_COMMAND_COMPLETE; |
471 | acpi_ec_complete_event(ec); | ||
226 | if (t->command == ACPI_EC_COMMAND_QUERY) | 472 | if (t->command == ACPI_EC_COMMAND_QUERY) |
227 | pr_debug("***** Command(%s) hardware completion *****\n", | 473 | pr_debug("***** Command(%s) hardware completion *****\n", |
228 | acpi_ec_cmd_string(t->command)); | 474 | acpi_ec_cmd_string(t->command)); |
@@ -233,25 +479,29 @@ static bool advance_transaction(struct acpi_ec *ec) | |||
233 | } else if (t->wlen == t->wi && | 479 | } else if (t->wlen == t->wi && |
234 | (status & ACPI_EC_FLAG_IBF) == 0) { | 480 | (status & ACPI_EC_FLAG_IBF) == 0) { |
235 | t->flags |= ACPI_EC_COMMAND_COMPLETE; | 481 | t->flags |= ACPI_EC_COMMAND_COMPLETE; |
482 | acpi_ec_complete_event(ec); | ||
236 | wakeup = true; | 483 | wakeup = true; |
237 | } | 484 | } |
238 | return wakeup; | 485 | goto out; |
239 | } else { | 486 | } else { |
240 | if (EC_FLAGS_QUERY_HANDSHAKE && | 487 | if (EC_FLAGS_QUERY_HANDSHAKE && |
241 | !(status & ACPI_EC_FLAG_SCI) && | 488 | !(status & ACPI_EC_FLAG_SCI) && |
242 | (t->command == ACPI_EC_COMMAND_QUERY)) { | 489 | (t->command == ACPI_EC_COMMAND_QUERY)) { |
243 | t->flags |= ACPI_EC_COMMAND_POLL; | 490 | t->flags |= ACPI_EC_COMMAND_POLL; |
491 | acpi_ec_complete_detection(ec); | ||
244 | t->rdata[t->ri++] = 0x00; | 492 | t->rdata[t->ri++] = 0x00; |
245 | t->flags |= ACPI_EC_COMMAND_COMPLETE; | 493 | t->flags |= ACPI_EC_COMMAND_COMPLETE; |
494 | acpi_ec_complete_event(ec); | ||
246 | pr_debug("***** Command(%s) software completion *****\n", | 495 | pr_debug("***** Command(%s) software completion *****\n", |
247 | acpi_ec_cmd_string(t->command)); | 496 | acpi_ec_cmd_string(t->command)); |
248 | wakeup = true; | 497 | wakeup = true; |
249 | } else if ((status & ACPI_EC_FLAG_IBF) == 0) { | 498 | } else if ((status & ACPI_EC_FLAG_IBF) == 0) { |
250 | acpi_ec_write_cmd(ec, t->command); | 499 | acpi_ec_write_cmd(ec, t->command); |
251 | t->flags |= ACPI_EC_COMMAND_POLL; | 500 | t->flags |= ACPI_EC_COMMAND_POLL; |
501 | acpi_ec_complete_detection(ec); | ||
252 | } else | 502 | } else |
253 | goto err; | 503 | goto err; |
254 | return wakeup; | 504 | goto out; |
255 | } | 505 | } |
256 | err: | 506 | err: |
257 | /* | 507 | /* |
@@ -259,28 +509,27 @@ err: | |||
259 | * otherwise will take a not handled IRQ as a false one. | 509 | * otherwise will take a not handled IRQ as a false one. |
260 | */ | 510 | */ |
261 | if (!(status & ACPI_EC_FLAG_SCI)) { | 511 | if (!(status & ACPI_EC_FLAG_SCI)) { |
262 | if (in_interrupt() && t) | 512 | if (in_interrupt() && t) { |
263 | ++t->irq_count; | 513 | if (t->irq_count < ec_storm_threshold) |
514 | ++t->irq_count; | ||
515 | /* Allow triggering on 0 threshold */ | ||
516 | if (t->irq_count == ec_storm_threshold) | ||
517 | acpi_ec_set_storm(ec, EC_FLAGS_COMMAND_STORM); | ||
518 | } | ||
264 | } | 519 | } |
265 | return wakeup; | 520 | out: |
521 | if (status & ACPI_EC_FLAG_SCI) | ||
522 | acpi_ec_submit_detection(ec); | ||
523 | if (wakeup && in_interrupt()) | ||
524 | wake_up(&ec->wait); | ||
266 | } | 525 | } |
267 | 526 | ||
268 | static void start_transaction(struct acpi_ec *ec) | 527 | static void start_transaction(struct acpi_ec *ec) |
269 | { | 528 | { |
270 | ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0; | 529 | ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0; |
271 | ec->curr->flags = 0; | 530 | ec->curr->flags = 0; |
272 | (void)advance_transaction(ec); | 531 | ec->curr->timestamp = jiffies; |
273 | } | 532 | advance_transaction(ec); |
274 | |||
275 | static int acpi_ec_sync_query(struct acpi_ec *ec, u8 *data); | ||
276 | |||
277 | static int ec_check_sci_sync(struct acpi_ec *ec, u8 state) | ||
278 | { | ||
279 | if (state & ACPI_EC_FLAG_SCI) { | ||
280 | if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) | ||
281 | return acpi_ec_sync_query(ec, NULL); | ||
282 | } | ||
283 | return 0; | ||
284 | } | 533 | } |
285 | 534 | ||
286 | static int ec_poll(struct acpi_ec *ec) | 535 | static int ec_poll(struct acpi_ec *ec) |
@@ -291,20 +540,25 @@ static int ec_poll(struct acpi_ec *ec) | |||
291 | while (repeat--) { | 540 | while (repeat--) { |
292 | unsigned long delay = jiffies + | 541 | unsigned long delay = jiffies + |
293 | msecs_to_jiffies(ec_delay); | 542 | msecs_to_jiffies(ec_delay); |
543 | unsigned long usecs = ACPI_EC_UDELAY_POLL; | ||
294 | do { | 544 | do { |
295 | /* don't sleep with disabled interrupts */ | 545 | /* don't sleep with disabled interrupts */ |
296 | if (EC_FLAGS_MSI || irqs_disabled()) { | 546 | if (EC_FLAGS_MSI || irqs_disabled()) { |
297 | udelay(ACPI_EC_MSI_UDELAY); | 547 | usecs = ACPI_EC_MSI_UDELAY; |
548 | udelay(usecs); | ||
298 | if (ec_transaction_completed(ec)) | 549 | if (ec_transaction_completed(ec)) |
299 | return 0; | 550 | return 0; |
300 | } else { | 551 | } else { |
301 | if (wait_event_timeout(ec->wait, | 552 | if (wait_event_timeout(ec->wait, |
302 | ec_transaction_completed(ec), | 553 | ec_transaction_completed(ec), |
303 | msecs_to_jiffies(1))) | 554 | usecs_to_jiffies(usecs))) |
304 | return 0; | 555 | return 0; |
305 | } | 556 | } |
306 | spin_lock_irqsave(&ec->lock, flags); | 557 | spin_lock_irqsave(&ec->lock, flags); |
307 | (void)advance_transaction(ec); | 558 | if (time_after(jiffies, |
559 | ec->curr->timestamp + | ||
560 | usecs_to_jiffies(usecs))) | ||
561 | advance_transaction(ec); | ||
308 | spin_unlock_irqrestore(&ec->lock, flags); | 562 | spin_unlock_irqrestore(&ec->lock, flags); |
309 | } while (time_before(jiffies, delay)); | 563 | } while (time_before(jiffies, delay)); |
310 | pr_debug("controller reset, restart transaction\n"); | 564 | pr_debug("controller reset, restart transaction\n"); |
@@ -325,21 +579,29 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, | |||
325 | udelay(ACPI_EC_MSI_UDELAY); | 579 | udelay(ACPI_EC_MSI_UDELAY); |
326 | /* start transaction */ | 580 | /* start transaction */ |
327 | spin_lock_irqsave(&ec->lock, tmp); | 581 | spin_lock_irqsave(&ec->lock, tmp); |
582 | /* Enable GPE for command processing (IBF=0/OBF=1) */ | ||
583 | if (!acpi_ec_submit_flushable_request(ec, true)) { | ||
584 | ret = -EINVAL; | ||
585 | goto unlock; | ||
586 | } | ||
587 | ec_debug_ref(ec, "Increase command\n"); | ||
328 | /* following two actions should be kept atomic */ | 588 | /* following two actions should be kept atomic */ |
329 | ec->curr = t; | 589 | ec->curr = t; |
330 | pr_debug("***** Command(%s) started *****\n", | 590 | pr_debug("***** Command(%s) started *****\n", |
331 | acpi_ec_cmd_string(t->command)); | 591 | acpi_ec_cmd_string(t->command)); |
332 | start_transaction(ec); | 592 | start_transaction(ec); |
333 | if (ec->curr->command == ACPI_EC_COMMAND_QUERY) { | ||
334 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); | ||
335 | pr_debug("***** Event stopped *****\n"); | ||
336 | } | ||
337 | spin_unlock_irqrestore(&ec->lock, tmp); | 593 | spin_unlock_irqrestore(&ec->lock, tmp); |
338 | ret = ec_poll(ec); | 594 | ret = ec_poll(ec); |
339 | spin_lock_irqsave(&ec->lock, tmp); | 595 | spin_lock_irqsave(&ec->lock, tmp); |
596 | if (t->irq_count == ec_storm_threshold) | ||
597 | acpi_ec_clear_storm(ec, EC_FLAGS_COMMAND_STORM); | ||
340 | pr_debug("***** Command(%s) stopped *****\n", | 598 | pr_debug("***** Command(%s) stopped *****\n", |
341 | acpi_ec_cmd_string(t->command)); | 599 | acpi_ec_cmd_string(t->command)); |
342 | ec->curr = NULL; | 600 | ec->curr = NULL; |
601 | /* Disable GPE for command processing (IBF=0/OBF=1) */ | ||
602 | acpi_ec_complete_request(ec); | ||
603 | ec_debug_ref(ec, "Decrease command\n"); | ||
604 | unlock: | ||
343 | spin_unlock_irqrestore(&ec->lock, tmp); | 605 | spin_unlock_irqrestore(&ec->lock, tmp); |
344 | return ret; | 606 | return ret; |
345 | } | 607 | } |
@@ -354,10 +616,6 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) | |||
354 | if (t->rdata) | 616 | if (t->rdata) |
355 | memset(t->rdata, 0, t->rlen); | 617 | memset(t->rdata, 0, t->rlen); |
356 | mutex_lock(&ec->mutex); | 618 | mutex_lock(&ec->mutex); |
357 | if (test_bit(EC_FLAGS_BLOCKED, &ec->flags)) { | ||
358 | status = -EINVAL; | ||
359 | goto unlock; | ||
360 | } | ||
361 | if (ec->global_lock) { | 619 | if (ec->global_lock) { |
362 | status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk); | 620 | status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk); |
363 | if (ACPI_FAILURE(status)) { | 621 | if (ACPI_FAILURE(status)) { |
@@ -365,26 +623,11 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t) | |||
365 | goto unlock; | 623 | goto unlock; |
366 | } | 624 | } |
367 | } | 625 | } |
368 | /* disable GPE during transaction if storm is detected */ | ||
369 | if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) { | ||
370 | /* It has to be disabled, so that it doesn't trigger. */ | ||
371 | acpi_disable_gpe(NULL, ec->gpe); | ||
372 | } | ||
373 | 626 | ||
374 | status = acpi_ec_transaction_unlocked(ec, t); | 627 | status = acpi_ec_transaction_unlocked(ec, t); |
375 | 628 | ||
376 | /* check if we received SCI during transaction */ | 629 | if (test_bit(EC_FLAGS_COMMAND_STORM, &ec->flags)) |
377 | ec_check_sci_sync(ec, acpi_ec_read_status(ec)); | ||
378 | if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) { | ||
379 | msleep(1); | 630 | msleep(1); |
380 | /* It is safe to enable the GPE outside of the transaction. */ | ||
381 | acpi_enable_gpe(NULL, ec->gpe); | ||
382 | } else if (t->irq_count > ec_storm_threshold) { | ||
383 | pr_info("GPE storm detected(%d GPEs), " | ||
384 | "transactions will use polling mode\n", | ||
385 | t->irq_count); | ||
386 | set_bit(EC_FLAGS_GPE_STORM, &ec->flags); | ||
387 | } | ||
388 | if (ec->global_lock) | 631 | if (ec->global_lock) |
389 | acpi_release_global_lock(glk); | 632 | acpi_release_global_lock(glk); |
390 | unlock: | 633 | unlock: |
@@ -500,7 +743,7 @@ static void acpi_ec_clear(struct acpi_ec *ec) | |||
500 | u8 value = 0; | 743 | u8 value = 0; |
501 | 744 | ||
502 | for (i = 0; i < ACPI_EC_CLEAR_MAX; i++) { | 745 | for (i = 0; i < ACPI_EC_CLEAR_MAX; i++) { |
503 | status = acpi_ec_sync_query(ec, &value); | 746 | status = acpi_ec_query(ec, &value); |
504 | if (status || !value) | 747 | if (status || !value) |
505 | break; | 748 | break; |
506 | } | 749 | } |
@@ -511,6 +754,57 @@ static void acpi_ec_clear(struct acpi_ec *ec) | |||
511 | pr_info("%d stale EC events cleared\n", i); | 754 | pr_info("%d stale EC events cleared\n", i); |
512 | } | 755 | } |
513 | 756 | ||
757 | static void acpi_ec_start(struct acpi_ec *ec, bool resuming) | ||
758 | { | ||
759 | unsigned long flags; | ||
760 | |||
761 | spin_lock_irqsave(&ec->lock, flags); | ||
762 | if (!test_and_set_bit(EC_FLAGS_STARTED, &ec->flags)) { | ||
763 | pr_debug("+++++ Starting EC +++++\n"); | ||
764 | /* Enable GPE for event processing (SCI_EVT=1) */ | ||
765 | if (!resuming) { | ||
766 | acpi_ec_submit_request(ec); | ||
767 | ec_debug_ref(ec, "Increase driver\n"); | ||
768 | } | ||
769 | pr_info("+++++ EC started +++++\n"); | ||
770 | } | ||
771 | spin_unlock_irqrestore(&ec->lock, flags); | ||
772 | } | ||
773 | |||
774 | static bool acpi_ec_stopped(struct acpi_ec *ec) | ||
775 | { | ||
776 | unsigned long flags; | ||
777 | bool flushed; | ||
778 | |||
779 | spin_lock_irqsave(&ec->lock, flags); | ||
780 | flushed = acpi_ec_flushed(ec); | ||
781 | spin_unlock_irqrestore(&ec->lock, flags); | ||
782 | return flushed; | ||
783 | } | ||
784 | |||
785 | static void acpi_ec_stop(struct acpi_ec *ec, bool suspending) | ||
786 | { | ||
787 | unsigned long flags; | ||
788 | |||
789 | spin_lock_irqsave(&ec->lock, flags); | ||
790 | if (acpi_ec_started(ec)) { | ||
791 | pr_debug("+++++ Stopping EC +++++\n"); | ||
792 | set_bit(EC_FLAGS_STOPPED, &ec->flags); | ||
793 | spin_unlock_irqrestore(&ec->lock, flags); | ||
794 | wait_event(ec->wait, acpi_ec_stopped(ec)); | ||
795 | spin_lock_irqsave(&ec->lock, flags); | ||
796 | /* Disable GPE for event processing (SCI_EVT=1) */ | ||
797 | if (!suspending) { | ||
798 | acpi_ec_complete_request(ec); | ||
799 | ec_debug_ref(ec, "Decrease driver\n"); | ||
800 | } | ||
801 | clear_bit(EC_FLAGS_STARTED, &ec->flags); | ||
802 | clear_bit(EC_FLAGS_STOPPED, &ec->flags); | ||
803 | pr_info("+++++ EC stopped +++++\n"); | ||
804 | } | ||
805 | spin_unlock_irqrestore(&ec->lock, flags); | ||
806 | } | ||
807 | |||
514 | void acpi_ec_block_transactions(void) | 808 | void acpi_ec_block_transactions(void) |
515 | { | 809 | { |
516 | struct acpi_ec *ec = first_ec; | 810 | struct acpi_ec *ec = first_ec; |
@@ -520,7 +814,7 @@ void acpi_ec_block_transactions(void) | |||
520 | 814 | ||
521 | mutex_lock(&ec->mutex); | 815 | mutex_lock(&ec->mutex); |
522 | /* Prevent transactions from being carried out */ | 816 | /* Prevent transactions from being carried out */ |
523 | set_bit(EC_FLAGS_BLOCKED, &ec->flags); | 817 | acpi_ec_stop(ec, true); |
524 | mutex_unlock(&ec->mutex); | 818 | mutex_unlock(&ec->mutex); |
525 | } | 819 | } |
526 | 820 | ||
@@ -531,14 +825,11 @@ void acpi_ec_unblock_transactions(void) | |||
531 | if (!ec) | 825 | if (!ec) |
532 | return; | 826 | return; |
533 | 827 | ||
534 | mutex_lock(&ec->mutex); | ||
535 | /* Allow transactions to be carried out again */ | 828 | /* Allow transactions to be carried out again */ |
536 | clear_bit(EC_FLAGS_BLOCKED, &ec->flags); | 829 | acpi_ec_start(ec, true); |
537 | 830 | ||
538 | if (EC_FLAGS_CLEAR_ON_RESUME) | 831 | if (EC_FLAGS_CLEAR_ON_RESUME) |
539 | acpi_ec_clear(ec); | 832 | acpi_ec_clear(ec); |
540 | |||
541 | mutex_unlock(&ec->mutex); | ||
542 | } | 833 | } |
543 | 834 | ||
544 | void acpi_ec_unblock_transactions_early(void) | 835 | void acpi_ec_unblock_transactions_early(void) |
@@ -548,36 +839,33 @@ void acpi_ec_unblock_transactions_early(void) | |||
548 | * atomic context during wakeup, so we don't need to acquire the mutex). | 839 | * atomic context during wakeup, so we don't need to acquire the mutex). |
549 | */ | 840 | */ |
550 | if (first_ec) | 841 | if (first_ec) |
551 | clear_bit(EC_FLAGS_BLOCKED, &first_ec->flags); | 842 | acpi_ec_start(first_ec, true); |
552 | } | 843 | } |
553 | 844 | ||
554 | static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 *data) | 845 | /* -------------------------------------------------------------------------- |
846 | Event Management | ||
847 | -------------------------------------------------------------------------- */ | ||
848 | static struct acpi_ec_query_handler * | ||
849 | acpi_ec_get_query_handler(struct acpi_ec_query_handler *handler) | ||
555 | { | 850 | { |
556 | int result; | 851 | if (handler) |
557 | u8 d; | 852 | kref_get(&handler->kref); |
558 | struct transaction t = {.command = ACPI_EC_COMMAND_QUERY, | 853 | return handler; |
559 | .wdata = NULL, .rdata = &d, | 854 | } |
560 | .wlen = 0, .rlen = 1}; | ||
561 | 855 | ||
562 | if (!ec || !data) | 856 | static void acpi_ec_query_handler_release(struct kref *kref) |
563 | return -EINVAL; | 857 | { |
564 | /* | 858 | struct acpi_ec_query_handler *handler = |
565 | * Query the EC to find out which _Qxx method we need to evaluate. | 859 | container_of(kref, struct acpi_ec_query_handler, kref); |
566 | * Note that successful completion of the query causes the ACPI_EC_SCI | 860 | |
567 | * bit to be cleared (and thus clearing the interrupt source). | 861 | kfree(handler); |
568 | */ | 862 | } |
569 | result = acpi_ec_transaction_unlocked(ec, &t); | 863 | |
570 | if (result) | 864 | static void acpi_ec_put_query_handler(struct acpi_ec_query_handler *handler) |
571 | return result; | 865 | { |
572 | if (!d) | 866 | kref_put(&handler->kref, acpi_ec_query_handler_release); |
573 | return -ENODATA; | ||
574 | *data = d; | ||
575 | return 0; | ||
576 | } | 867 | } |
577 | 868 | ||
578 | /* -------------------------------------------------------------------------- | ||
579 | Event Management | ||
580 | -------------------------------------------------------------------------- */ | ||
581 | int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, | 869 | int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, |
582 | acpi_handle handle, acpi_ec_query_func func, | 870 | acpi_handle handle, acpi_ec_query_func func, |
583 | void *data) | 871 | void *data) |
@@ -593,6 +881,7 @@ int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit, | |||
593 | handler->func = func; | 881 | handler->func = func; |
594 | handler->data = data; | 882 | handler->data = data; |
595 | mutex_lock(&ec->mutex); | 883 | mutex_lock(&ec->mutex); |
884 | kref_init(&handler->kref); | ||
596 | list_add(&handler->node, &ec->list); | 885 | list_add(&handler->node, &ec->list); |
597 | mutex_unlock(&ec->mutex); | 886 | mutex_unlock(&ec->mutex); |
598 | return 0; | 887 | return 0; |
@@ -602,15 +891,18 @@ EXPORT_SYMBOL_GPL(acpi_ec_add_query_handler); | |||
602 | void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit) | 891 | void acpi_ec_remove_query_handler(struct acpi_ec *ec, u8 query_bit) |
603 | { | 892 | { |
604 | struct acpi_ec_query_handler *handler, *tmp; | 893 | struct acpi_ec_query_handler *handler, *tmp; |
894 | LIST_HEAD(free_list); | ||
605 | 895 | ||
606 | mutex_lock(&ec->mutex); | 896 | mutex_lock(&ec->mutex); |
607 | list_for_each_entry_safe(handler, tmp, &ec->list, node) { | 897 | list_for_each_entry_safe(handler, tmp, &ec->list, node) { |
608 | if (query_bit == handler->query_bit) { | 898 | if (query_bit == handler->query_bit) { |
609 | list_del(&handler->node); | 899 | list_del_init(&handler->node); |
610 | kfree(handler); | 900 | list_add(&handler->node, &free_list); |
611 | } | 901 | } |
612 | } | 902 | } |
613 | mutex_unlock(&ec->mutex); | 903 | mutex_unlock(&ec->mutex); |
904 | list_for_each_entry(handler, &free_list, node) | ||
905 | acpi_ec_put_query_handler(handler); | ||
614 | } | 906 | } |
615 | EXPORT_SYMBOL_GPL(acpi_ec_remove_query_handler); | 907 | EXPORT_SYMBOL_GPL(acpi_ec_remove_query_handler); |
616 | 908 | ||
@@ -626,59 +918,58 @@ static void acpi_ec_run(void *cxt) | |||
626 | else if (handler->handle) | 918 | else if (handler->handle) |
627 | acpi_evaluate_object(handler->handle, NULL, NULL, NULL); | 919 | acpi_evaluate_object(handler->handle, NULL, NULL, NULL); |
628 | pr_debug("##### Query(0x%02x) stopped #####\n", handler->query_bit); | 920 | pr_debug("##### Query(0x%02x) stopped #####\n", handler->query_bit); |
629 | kfree(handler); | 921 | acpi_ec_put_query_handler(handler); |
630 | } | 922 | } |
631 | 923 | ||
632 | static int acpi_ec_sync_query(struct acpi_ec *ec, u8 *data) | 924 | static int acpi_ec_query(struct acpi_ec *ec, u8 *data) |
633 | { | 925 | { |
634 | u8 value = 0; | 926 | u8 value = 0; |
635 | int status; | 927 | int result; |
636 | struct acpi_ec_query_handler *handler, *copy; | 928 | acpi_status status; |
929 | struct acpi_ec_query_handler *handler; | ||
930 | struct transaction t = {.command = ACPI_EC_COMMAND_QUERY, | ||
931 | .wdata = NULL, .rdata = &value, | ||
932 | .wlen = 0, .rlen = 1}; | ||
637 | 933 | ||
638 | status = acpi_ec_query_unlocked(ec, &value); | 934 | /* |
935 | * Query the EC to find out which _Qxx method we need to evaluate. | ||
936 | * Note that successful completion of the query causes the ACPI_EC_SCI | ||
937 | * bit to be cleared (and thus clearing the interrupt source). | ||
938 | */ | ||
939 | result = acpi_ec_transaction(ec, &t); | ||
940 | if (result) | ||
941 | return result; | ||
639 | if (data) | 942 | if (data) |
640 | *data = value; | 943 | *data = value; |
641 | if (status) | 944 | if (!value) |
642 | return status; | 945 | return -ENODATA; |
643 | 946 | ||
947 | mutex_lock(&ec->mutex); | ||
644 | list_for_each_entry(handler, &ec->list, node) { | 948 | list_for_each_entry(handler, &ec->list, node) { |
645 | if (value == handler->query_bit) { | 949 | if (value == handler->query_bit) { |
646 | /* have custom handler for this bit */ | 950 | /* have custom handler for this bit */ |
647 | copy = kmalloc(sizeof(*handler), GFP_KERNEL); | 951 | handler = acpi_ec_get_query_handler(handler); |
648 | if (!copy) | ||
649 | return -ENOMEM; | ||
650 | memcpy(copy, handler, sizeof(*copy)); | ||
651 | pr_debug("##### Query(0x%02x) scheduled #####\n", | 952 | pr_debug("##### Query(0x%02x) scheduled #####\n", |
652 | handler->query_bit); | 953 | handler->query_bit); |
653 | return acpi_os_execute((copy->func) ? | 954 | status = acpi_os_execute((handler->func) ? |
654 | OSL_NOTIFY_HANDLER : OSL_GPE_HANDLER, | 955 | OSL_NOTIFY_HANDLER : OSL_GPE_HANDLER, |
655 | acpi_ec_run, copy); | 956 | acpi_ec_run, handler); |
957 | if (ACPI_FAILURE(status)) | ||
958 | result = -EBUSY; | ||
959 | break; | ||
656 | } | 960 | } |
657 | } | 961 | } |
658 | return 0; | ||
659 | } | ||
660 | |||
661 | static void acpi_ec_gpe_query(void *ec_cxt) | ||
662 | { | ||
663 | struct acpi_ec *ec = ec_cxt; | ||
664 | |||
665 | if (!ec) | ||
666 | return; | ||
667 | mutex_lock(&ec->mutex); | ||
668 | acpi_ec_sync_query(ec, NULL); | ||
669 | mutex_unlock(&ec->mutex); | 962 | mutex_unlock(&ec->mutex); |
963 | return result; | ||
670 | } | 964 | } |
671 | 965 | ||
672 | static int ec_check_sci(struct acpi_ec *ec, u8 state) | 966 | static void acpi_ec_gpe_poller(struct work_struct *work) |
673 | { | 967 | { |
674 | if (state & ACPI_EC_FLAG_SCI) { | 968 | struct acpi_ec *ec = container_of(work, struct acpi_ec, work); |
675 | if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) { | 969 | |
676 | pr_debug("***** Event started *****\n"); | 970 | pr_debug("***** Event poller started *****\n"); |
677 | return acpi_os_execute(OSL_NOTIFY_HANDLER, | 971 | acpi_ec_query(ec, NULL); |
678 | acpi_ec_gpe_query, ec); | 972 | pr_debug("***** Event poller stopped *****\n"); |
679 | } | ||
680 | } | ||
681 | return 0; | ||
682 | } | 973 | } |
683 | 974 | ||
684 | static u32 acpi_ec_gpe_handler(acpi_handle gpe_device, | 975 | static u32 acpi_ec_gpe_handler(acpi_handle gpe_device, |
@@ -688,11 +979,9 @@ static u32 acpi_ec_gpe_handler(acpi_handle gpe_device, | |||
688 | struct acpi_ec *ec = data; | 979 | struct acpi_ec *ec = data; |
689 | 980 | ||
690 | spin_lock_irqsave(&ec->lock, flags); | 981 | spin_lock_irqsave(&ec->lock, flags); |
691 | if (advance_transaction(ec)) | 982 | advance_transaction(ec); |
692 | wake_up(&ec->wait); | ||
693 | spin_unlock_irqrestore(&ec->lock, flags); | 983 | spin_unlock_irqrestore(&ec->lock, flags); |
694 | ec_check_sci(ec, acpi_ec_read_status(ec)); | 984 | return ACPI_INTERRUPT_HANDLED; |
695 | return ACPI_INTERRUPT_HANDLED | ACPI_REENABLE_GPE; | ||
696 | } | 985 | } |
697 | 986 | ||
698 | /* -------------------------------------------------------------------------- | 987 | /* -------------------------------------------------------------------------- |
@@ -750,11 +1039,11 @@ static struct acpi_ec *make_acpi_ec(void) | |||
750 | 1039 | ||
751 | if (!ec) | 1040 | if (!ec) |
752 | return NULL; | 1041 | return NULL; |
753 | ec->flags = 1 << EC_FLAGS_QUERY_PENDING; | ||
754 | mutex_init(&ec->mutex); | 1042 | mutex_init(&ec->mutex); |
755 | init_waitqueue_head(&ec->wait); | 1043 | init_waitqueue_head(&ec->wait); |
756 | INIT_LIST_HEAD(&ec->list); | 1044 | INIT_LIST_HEAD(&ec->list); |
757 | spin_lock_init(&ec->lock); | 1045 | spin_lock_init(&ec->lock); |
1046 | INIT_WORK(&ec->work, acpi_ec_gpe_poller); | ||
758 | return ec; | 1047 | return ec; |
759 | } | 1048 | } |
760 | 1049 | ||
@@ -810,13 +1099,13 @@ static int ec_install_handlers(struct acpi_ec *ec) | |||
810 | 1099 | ||
811 | if (test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags)) | 1100 | if (test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags)) |
812 | return 0; | 1101 | return 0; |
813 | status = acpi_install_gpe_handler(NULL, ec->gpe, | 1102 | status = acpi_install_gpe_raw_handler(NULL, ec->gpe, |
814 | ACPI_GPE_EDGE_TRIGGERED, | 1103 | ACPI_GPE_EDGE_TRIGGERED, |
815 | &acpi_ec_gpe_handler, ec); | 1104 | &acpi_ec_gpe_handler, ec); |
816 | if (ACPI_FAILURE(status)) | 1105 | if (ACPI_FAILURE(status)) |
817 | return -ENODEV; | 1106 | return -ENODEV; |
818 | 1107 | ||
819 | acpi_enable_gpe(NULL, ec->gpe); | 1108 | acpi_ec_start(ec, false); |
820 | status = acpi_install_address_space_handler(ec->handle, | 1109 | status = acpi_install_address_space_handler(ec->handle, |
821 | ACPI_ADR_SPACE_EC, | 1110 | ACPI_ADR_SPACE_EC, |
822 | &acpi_ec_space_handler, | 1111 | &acpi_ec_space_handler, |
@@ -831,7 +1120,7 @@ static int ec_install_handlers(struct acpi_ec *ec) | |||
831 | pr_err("Fail in evaluating the _REG object" | 1120 | pr_err("Fail in evaluating the _REG object" |
832 | " of EC device. Broken bios is suspected.\n"); | 1121 | " of EC device. Broken bios is suspected.\n"); |
833 | } else { | 1122 | } else { |
834 | acpi_disable_gpe(NULL, ec->gpe); | 1123 | acpi_ec_stop(ec, false); |
835 | acpi_remove_gpe_handler(NULL, ec->gpe, | 1124 | acpi_remove_gpe_handler(NULL, ec->gpe, |
836 | &acpi_ec_gpe_handler); | 1125 | &acpi_ec_gpe_handler); |
837 | return -ENODEV; | 1126 | return -ENODEV; |
@@ -846,7 +1135,7 @@ static void ec_remove_handlers(struct acpi_ec *ec) | |||
846 | { | 1135 | { |
847 | if (!test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags)) | 1136 | if (!test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags)) |
848 | return; | 1137 | return; |
849 | acpi_disable_gpe(NULL, ec->gpe); | 1138 | acpi_ec_stop(ec, false); |
850 | if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle, | 1139 | if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle, |
851 | ACPI_ADR_SPACE_EC, &acpi_ec_space_handler))) | 1140 | ACPI_ADR_SPACE_EC, &acpi_ec_space_handler))) |
852 | pr_err("failed to remove space handler\n"); | 1141 | pr_err("failed to remove space handler\n"); |
@@ -900,14 +1189,11 @@ static int acpi_ec_add(struct acpi_device *device) | |||
900 | ret = ec_install_handlers(ec); | 1189 | ret = ec_install_handlers(ec); |
901 | 1190 | ||
902 | /* EC is fully operational, allow queries */ | 1191 | /* EC is fully operational, allow queries */ |
903 | clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags); | 1192 | acpi_ec_enable_event(ec); |
904 | 1193 | ||
905 | /* Clear stale _Q events if hardware might require that */ | 1194 | /* Clear stale _Q events if hardware might require that */ |
906 | if (EC_FLAGS_CLEAR_ON_RESUME) { | 1195 | if (EC_FLAGS_CLEAR_ON_RESUME) |
907 | mutex_lock(&ec->mutex); | ||
908 | acpi_ec_clear(ec); | 1196 | acpi_ec_clear(ec); |
909 | mutex_unlock(&ec->mutex); | ||
910 | } | ||
911 | return ret; | 1197 | return ret; |
912 | } | 1198 | } |
913 | 1199 | ||
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h index caca2805536d..56b321aa2b1c 100644 --- a/drivers/acpi/internal.h +++ b/drivers/acpi/internal.h | |||
@@ -75,6 +75,8 @@ static inline void acpi_debugfs_init(void) { return; } | |||
75 | #endif | 75 | #endif |
76 | void acpi_lpss_init(void); | 76 | void acpi_lpss_init(void); |
77 | 77 | ||
78 | void acpi_apd_init(void); | ||
79 | |||
78 | acpi_status acpi_hotplug_schedule(struct acpi_device *adev, u32 src); | 80 | acpi_status acpi_hotplug_schedule(struct acpi_device *adev, u32 src); |
79 | bool acpi_queue_hotplug_work(struct work_struct *work); | 81 | bool acpi_queue_hotplug_work(struct work_struct *work); |
80 | void acpi_device_hotplug(struct acpi_device *adev, u32 src); | 82 | void acpi_device_hotplug(struct acpi_device *adev, u32 src); |
@@ -129,11 +131,13 @@ struct acpi_ec { | |||
129 | unsigned long data_addr; | 131 | unsigned long data_addr; |
130 | unsigned long global_lock; | 132 | unsigned long global_lock; |
131 | unsigned long flags; | 133 | unsigned long flags; |
134 | unsigned long reference_count; | ||
132 | struct mutex mutex; | 135 | struct mutex mutex; |
133 | wait_queue_head_t wait; | 136 | wait_queue_head_t wait; |
134 | struct list_head list; | 137 | struct list_head list; |
135 | struct transaction *curr; | 138 | struct transaction *curr; |
136 | spinlock_t lock; | 139 | spinlock_t lock; |
140 | struct work_struct work; | ||
137 | }; | 141 | }; |
138 | 142 | ||
139 | extern struct acpi_ec *first_ec; | 143 | extern struct acpi_ec *first_ec; |
diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c index 24b5476449a1..1333cbdc3ea2 100644 --- a/drivers/acpi/numa.c +++ b/drivers/acpi/numa.c | |||
@@ -177,12 +177,7 @@ static int __init slit_valid(struct acpi_table_slit *slit) | |||
177 | 177 | ||
178 | static int __init acpi_parse_slit(struct acpi_table_header *table) | 178 | static int __init acpi_parse_slit(struct acpi_table_header *table) |
179 | { | 179 | { |
180 | struct acpi_table_slit *slit; | 180 | struct acpi_table_slit *slit = (struct acpi_table_slit *)table; |
181 | |||
182 | if (!table) | ||
183 | return -EINVAL; | ||
184 | |||
185 | slit = (struct acpi_table_slit *)table; | ||
186 | 181 | ||
187 | if (!slit_valid(slit)) { | 182 | if (!slit_valid(slit)) { |
188 | printk(KERN_INFO "ACPI: SLIT table looks invalid. Not used.\n"); | 183 | printk(KERN_INFO "ACPI: SLIT table looks invalid. Not used.\n"); |
@@ -260,11 +255,8 @@ acpi_parse_memory_affinity(struct acpi_subtable_header * header, | |||
260 | 255 | ||
261 | static int __init acpi_parse_srat(struct acpi_table_header *table) | 256 | static int __init acpi_parse_srat(struct acpi_table_header *table) |
262 | { | 257 | { |
263 | struct acpi_table_srat *srat; | 258 | struct acpi_table_srat *srat = (struct acpi_table_srat *)table; |
264 | if (!table) | ||
265 | return -EINVAL; | ||
266 | 259 | ||
267 | srat = (struct acpi_table_srat *)table; | ||
268 | acpi_srat_revision = srat->header.revision; | 260 | acpi_srat_revision = srat->header.revision; |
269 | 261 | ||
270 | /* Real work done in acpi_table_parse_srat below. */ | 262 | /* Real work done in acpi_table_parse_srat below. */ |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 87b704e41877..c256bd7fbd78 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -681,15 +681,13 @@ static int acpi_idle_bm_check(void) | |||
681 | } | 681 | } |
682 | 682 | ||
683 | /** | 683 | /** |
684 | * acpi_idle_do_entry - a helper function that does C2 and C3 type entry | 684 | * acpi_idle_do_entry - enter idle state using the appropriate method |
685 | * @cx: cstate data | 685 | * @cx: cstate data |
686 | * | 686 | * |
687 | * Caller disables interrupt before call and enables interrupt after return. | 687 | * Caller disables interrupt before call and enables interrupt after return. |
688 | */ | 688 | */ |
689 | static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx) | 689 | static void acpi_idle_do_entry(struct acpi_processor_cx *cx) |
690 | { | 690 | { |
691 | /* Don't trace irqs off for idle */ | ||
692 | stop_critical_timings(); | ||
693 | if (cx->entry_method == ACPI_CSTATE_FFH) { | 691 | if (cx->entry_method == ACPI_CSTATE_FFH) { |
694 | /* Call into architectural FFH based C-state */ | 692 | /* Call into architectural FFH based C-state */ |
695 | acpi_processor_ffh_cstate_enter(cx); | 693 | acpi_processor_ffh_cstate_enter(cx); |
@@ -703,38 +701,9 @@ static inline void acpi_idle_do_entry(struct acpi_processor_cx *cx) | |||
703 | gets asserted in time to freeze execution properly. */ | 701 | gets asserted in time to freeze execution properly. */ |
704 | inl(acpi_gbl_FADT.xpm_timer_block.address); | 702 | inl(acpi_gbl_FADT.xpm_timer_block.address); |
705 | } | 703 | } |
706 | start_critical_timings(); | ||
707 | } | 704 | } |
708 | 705 | ||
709 | /** | 706 | /** |
710 | * acpi_idle_enter_c1 - enters an ACPI C1 state-type | ||
711 | * @dev: the target CPU | ||
712 | * @drv: cpuidle driver containing cpuidle state info | ||
713 | * @index: index of target state | ||
714 | * | ||
715 | * This is equivalent to the HALT instruction. | ||
716 | */ | ||
717 | static int acpi_idle_enter_c1(struct cpuidle_device *dev, | ||
718 | struct cpuidle_driver *drv, int index) | ||
719 | { | ||
720 | struct acpi_processor *pr; | ||
721 | struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu); | ||
722 | |||
723 | pr = __this_cpu_read(processors); | ||
724 | |||
725 | if (unlikely(!pr)) | ||
726 | return -EINVAL; | ||
727 | |||
728 | lapic_timer_state_broadcast(pr, cx, 1); | ||
729 | acpi_idle_do_entry(cx); | ||
730 | |||
731 | lapic_timer_state_broadcast(pr, cx, 0); | ||
732 | |||
733 | return index; | ||
734 | } | ||
735 | |||
736 | |||
737 | /** | ||
738 | * acpi_idle_play_dead - enters an ACPI state for long-term idle (i.e. off-lining) | 707 | * acpi_idle_play_dead - enters an ACPI state for long-term idle (i.e. off-lining) |
739 | * @dev: the target CPU | 708 | * @dev: the target CPU |
740 | * @index: the index of suggested state | 709 | * @index: the index of suggested state |
@@ -761,47 +730,11 @@ static int acpi_idle_play_dead(struct cpuidle_device *dev, int index) | |||
761 | return 0; | 730 | return 0; |
762 | } | 731 | } |
763 | 732 | ||
764 | /** | 733 | static bool acpi_idle_fallback_to_c1(struct acpi_processor *pr) |
765 | * acpi_idle_enter_simple - enters an ACPI state without BM handling | ||
766 | * @dev: the target CPU | ||
767 | * @drv: cpuidle driver with cpuidle state information | ||
768 | * @index: the index of suggested state | ||
769 | */ | ||
770 | static int acpi_idle_enter_simple(struct cpuidle_device *dev, | ||
771 | struct cpuidle_driver *drv, int index) | ||
772 | { | 734 | { |
773 | struct acpi_processor *pr; | 735 | return IS_ENABLED(CONFIG_HOTPLUG_CPU) && num_online_cpus() > 1 && |
774 | struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu); | 736 | !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED) && |
775 | 737 | !pr->flags.has_cst; | |
776 | pr = __this_cpu_read(processors); | ||
777 | |||
778 | if (unlikely(!pr)) | ||
779 | return -EINVAL; | ||
780 | |||
781 | #ifdef CONFIG_HOTPLUG_CPU | ||
782 | if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) && | ||
783 | !pr->flags.has_cst && | ||
784 | !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED)) | ||
785 | return acpi_idle_enter_c1(dev, drv, CPUIDLE_DRIVER_STATE_START); | ||
786 | #endif | ||
787 | |||
788 | /* | ||
789 | * Must be done before busmaster disable as we might need to | ||
790 | * access HPET ! | ||
791 | */ | ||
792 | lapic_timer_state_broadcast(pr, cx, 1); | ||
793 | |||
794 | if (cx->type == ACPI_STATE_C3) | ||
795 | ACPI_FLUSH_CPU_CACHE(); | ||
796 | |||
797 | /* Tell the scheduler that we are going deep-idle: */ | ||
798 | sched_clock_idle_sleep_event(); | ||
799 | acpi_idle_do_entry(cx); | ||
800 | |||
801 | sched_clock_idle_wakeup_event(0); | ||
802 | |||
803 | lapic_timer_state_broadcast(pr, cx, 0); | ||
804 | return index; | ||
805 | } | 738 | } |
806 | 739 | ||
807 | static int c3_cpu_count; | 740 | static int c3_cpu_count; |
@@ -809,44 +742,14 @@ static DEFINE_RAW_SPINLOCK(c3_lock); | |||
809 | 742 | ||
810 | /** | 743 | /** |
811 | * acpi_idle_enter_bm - enters C3 with proper BM handling | 744 | * acpi_idle_enter_bm - enters C3 with proper BM handling |
812 | * @dev: the target CPU | 745 | * @pr: Target processor |
813 | * @drv: cpuidle driver containing state data | 746 | * @cx: Target state context |
814 | * @index: the index of suggested state | ||
815 | * | ||
816 | * If BM is detected, the deepest non-C3 idle state is entered instead. | ||
817 | */ | 747 | */ |
818 | static int acpi_idle_enter_bm(struct cpuidle_device *dev, | 748 | static void acpi_idle_enter_bm(struct acpi_processor *pr, |
819 | struct cpuidle_driver *drv, int index) | 749 | struct acpi_processor_cx *cx) |
820 | { | 750 | { |
821 | struct acpi_processor *pr; | ||
822 | struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu); | ||
823 | |||
824 | pr = __this_cpu_read(processors); | ||
825 | |||
826 | if (unlikely(!pr)) | ||
827 | return -EINVAL; | ||
828 | |||
829 | #ifdef CONFIG_HOTPLUG_CPU | ||
830 | if ((cx->type != ACPI_STATE_C1) && (num_online_cpus() > 1) && | ||
831 | !pr->flags.has_cst && | ||
832 | !(acpi_gbl_FADT.flags & ACPI_FADT_C2_MP_SUPPORTED)) | ||
833 | return acpi_idle_enter_c1(dev, drv, CPUIDLE_DRIVER_STATE_START); | ||
834 | #endif | ||
835 | |||
836 | if (!cx->bm_sts_skip && acpi_idle_bm_check()) { | ||
837 | if (drv->safe_state_index >= 0) { | ||
838 | return drv->states[drv->safe_state_index].enter(dev, | ||
839 | drv, drv->safe_state_index); | ||
840 | } else { | ||
841 | acpi_safe_halt(); | ||
842 | return -EBUSY; | ||
843 | } | ||
844 | } | ||
845 | |||
846 | acpi_unlazy_tlb(smp_processor_id()); | 751 | acpi_unlazy_tlb(smp_processor_id()); |
847 | 752 | ||
848 | /* Tell the scheduler that we are going deep-idle: */ | ||
849 | sched_clock_idle_sleep_event(); | ||
850 | /* | 753 | /* |
851 | * Must be done before busmaster disable as we might need to | 754 | * Must be done before busmaster disable as we might need to |
852 | * access HPET ! | 755 | * access HPET ! |
@@ -856,37 +759,71 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev, | |||
856 | /* | 759 | /* |
857 | * disable bus master | 760 | * disable bus master |
858 | * bm_check implies we need ARB_DIS | 761 | * bm_check implies we need ARB_DIS |
859 | * !bm_check implies we need cache flush | ||
860 | * bm_control implies whether we can do ARB_DIS | 762 | * bm_control implies whether we can do ARB_DIS |
861 | * | 763 | * |
862 | * That leaves a case where bm_check is set and bm_control is | 764 | * That leaves a case where bm_check is set and bm_control is |
863 | * not set. In that case we cannot do much, we enter C3 | 765 | * not set. In that case we cannot do much, we enter C3 |
864 | * without doing anything. | 766 | * without doing anything. |
865 | */ | 767 | */ |
866 | if (pr->flags.bm_check && pr->flags.bm_control) { | 768 | if (pr->flags.bm_control) { |
867 | raw_spin_lock(&c3_lock); | 769 | raw_spin_lock(&c3_lock); |
868 | c3_cpu_count++; | 770 | c3_cpu_count++; |
869 | /* Disable bus master arbitration when all CPUs are in C3 */ | 771 | /* Disable bus master arbitration when all CPUs are in C3 */ |
870 | if (c3_cpu_count == num_online_cpus()) | 772 | if (c3_cpu_count == num_online_cpus()) |
871 | acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 1); | 773 | acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 1); |
872 | raw_spin_unlock(&c3_lock); | 774 | raw_spin_unlock(&c3_lock); |
873 | } else if (!pr->flags.bm_check) { | ||
874 | ACPI_FLUSH_CPU_CACHE(); | ||
875 | } | 775 | } |
876 | 776 | ||
877 | acpi_idle_do_entry(cx); | 777 | acpi_idle_do_entry(cx); |
878 | 778 | ||
879 | /* Re-enable bus master arbitration */ | 779 | /* Re-enable bus master arbitration */ |
880 | if (pr->flags.bm_check && pr->flags.bm_control) { | 780 | if (pr->flags.bm_control) { |
881 | raw_spin_lock(&c3_lock); | 781 | raw_spin_lock(&c3_lock); |
882 | acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 0); | 782 | acpi_write_bit_register(ACPI_BITREG_ARB_DISABLE, 0); |
883 | c3_cpu_count--; | 783 | c3_cpu_count--; |
884 | raw_spin_unlock(&c3_lock); | 784 | raw_spin_unlock(&c3_lock); |
885 | } | 785 | } |
886 | 786 | ||
887 | sched_clock_idle_wakeup_event(0); | 787 | lapic_timer_state_broadcast(pr, cx, 0); |
788 | } | ||
789 | |||
790 | static int acpi_idle_enter(struct cpuidle_device *dev, | ||
791 | struct cpuidle_driver *drv, int index) | ||
792 | { | ||
793 | struct acpi_processor_cx *cx = per_cpu(acpi_cstate[index], dev->cpu); | ||
794 | struct acpi_processor *pr; | ||
795 | |||
796 | pr = __this_cpu_read(processors); | ||
797 | if (unlikely(!pr)) | ||
798 | return -EINVAL; | ||
799 | |||
800 | if (cx->type != ACPI_STATE_C1) { | ||
801 | if (acpi_idle_fallback_to_c1(pr)) { | ||
802 | index = CPUIDLE_DRIVER_STATE_START; | ||
803 | cx = per_cpu(acpi_cstate[index], dev->cpu); | ||
804 | } else if (cx->type == ACPI_STATE_C3 && pr->flags.bm_check) { | ||
805 | if (cx->bm_sts_skip || !acpi_idle_bm_check()) { | ||
806 | acpi_idle_enter_bm(pr, cx); | ||
807 | return index; | ||
808 | } else if (drv->safe_state_index >= 0) { | ||
809 | index = drv->safe_state_index; | ||
810 | cx = per_cpu(acpi_cstate[index], dev->cpu); | ||
811 | } else { | ||
812 | acpi_safe_halt(); | ||
813 | return -EBUSY; | ||
814 | } | ||
815 | } | ||
816 | } | ||
817 | |||
818 | lapic_timer_state_broadcast(pr, cx, 1); | ||
819 | |||
820 | if (cx->type == ACPI_STATE_C3) | ||
821 | ACPI_FLUSH_CPU_CACHE(); | ||
822 | |||
823 | acpi_idle_do_entry(cx); | ||
888 | 824 | ||
889 | lapic_timer_state_broadcast(pr, cx, 0); | 825 | lapic_timer_state_broadcast(pr, cx, 0); |
826 | |||
890 | return index; | 827 | return index; |
891 | } | 828 | } |
892 | 829 | ||
@@ -981,27 +918,12 @@ static int acpi_processor_setup_cpuidle_states(struct acpi_processor *pr) | |||
981 | strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN); | 918 | strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN); |
982 | state->exit_latency = cx->latency; | 919 | state->exit_latency = cx->latency; |
983 | state->target_residency = cx->latency * latency_factor; | 920 | state->target_residency = cx->latency * latency_factor; |
921 | state->enter = acpi_idle_enter; | ||
984 | 922 | ||
985 | state->flags = 0; | 923 | state->flags = 0; |
986 | switch (cx->type) { | 924 | if (cx->type == ACPI_STATE_C1 || cx->type == ACPI_STATE_C2) { |
987 | case ACPI_STATE_C1: | ||
988 | |||
989 | state->enter = acpi_idle_enter_c1; | ||
990 | state->enter_dead = acpi_idle_play_dead; | ||
991 | drv->safe_state_index = count; | ||
992 | break; | ||
993 | |||
994 | case ACPI_STATE_C2: | ||
995 | state->enter = acpi_idle_enter_simple; | ||
996 | state->enter_dead = acpi_idle_play_dead; | 925 | state->enter_dead = acpi_idle_play_dead; |
997 | drv->safe_state_index = count; | 926 | drv->safe_state_index = count; |
998 | break; | ||
999 | |||
1000 | case ACPI_STATE_C3: | ||
1001 | state->enter = pr->flags.bm_check ? | ||
1002 | acpi_idle_enter_bm : | ||
1003 | acpi_idle_enter_simple; | ||
1004 | break; | ||
1005 | } | 927 | } |
1006 | 928 | ||
1007 | count++; | 929 | count++; |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index dc4d8960684a..bbca7830e18a 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -2544,6 +2544,7 @@ int __init acpi_scan_init(void) | |||
2544 | acpi_pci_link_init(); | 2544 | acpi_pci_link_init(); |
2545 | acpi_processor_init(); | 2545 | acpi_processor_init(); |
2546 | acpi_lpss_init(); | 2546 | acpi_lpss_init(); |
2547 | acpi_apd_init(); | ||
2547 | acpi_cmos_rtc_init(); | 2548 | acpi_cmos_rtc_init(); |
2548 | acpi_container_init(); | 2549 | acpi_container_init(); |
2549 | acpi_memory_hotplug_init(); | 2550 | acpi_memory_hotplug_init(); |
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c index 8aa9254a387f..7f251dd1a687 100644 --- a/drivers/acpi/sleep.c +++ b/drivers/acpi/sleep.c | |||
@@ -321,7 +321,7 @@ static struct dmi_system_id acpisleep_dmi_table[] __initdata = { | |||
321 | {}, | 321 | {}, |
322 | }; | 322 | }; |
323 | 323 | ||
324 | static void acpi_sleep_dmi_check(void) | 324 | static void __init acpi_sleep_dmi_check(void) |
325 | { | 325 | { |
326 | int year; | 326 | int year; |
327 | 327 | ||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 032db459370f..88a4f99dd2a7 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -522,6 +522,24 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
522 | DMI_MATCH(DMI_PRODUCT_NAME, "370R4E/370R4V/370R5E/3570RE/370R5V"), | 522 | DMI_MATCH(DMI_PRODUCT_NAME, "370R4E/370R4V/370R5E/3570RE/370R5V"), |
523 | }, | 523 | }, |
524 | }, | 524 | }, |
525 | { | ||
526 | /* https://bugzilla.redhat.com/show_bug.cgi?id=1186097 */ | ||
527 | .callback = video_disable_native_backlight, | ||
528 | .ident = "SAMSUNG 3570R/370R/470R/450R/510R/4450RV", | ||
529 | .matches = { | ||
530 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
531 | DMI_MATCH(DMI_PRODUCT_NAME, "3570R/370R/470R/450R/510R/4450RV"), | ||
532 | }, | ||
533 | }, | ||
534 | { | ||
535 | /* https://bugzilla.redhat.com/show_bug.cgi?id=1094948 */ | ||
536 | .callback = video_disable_native_backlight, | ||
537 | .ident = "SAMSUNG 730U3E/740U3E", | ||
538 | .matches = { | ||
539 | DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."), | ||
540 | DMI_MATCH(DMI_PRODUCT_NAME, "730U3E/740U3E"), | ||
541 | }, | ||
542 | }, | ||
525 | 543 | ||
526 | { | 544 | { |
527 | /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */ | 545 | /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */ |
diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c index da9c316059bc..eea5d7e578c9 100644 --- a/drivers/gpio/gpio-mcp23s08.c +++ b/drivers/gpio/gpio-mcp23s08.c | |||
@@ -801,9 +801,11 @@ static int mcp230xx_probe(struct i2c_client *client, | |||
801 | client->irq = irq_of_parse_and_map(client->dev.of_node, 0); | 801 | client->irq = irq_of_parse_and_map(client->dev.of_node, 0); |
802 | } else { | 802 | } else { |
803 | pdata = dev_get_platdata(&client->dev); | 803 | pdata = dev_get_platdata(&client->dev); |
804 | if (!pdata || !gpio_is_valid(pdata->base)) { | 804 | if (!pdata) { |
805 | dev_dbg(&client->dev, "invalid platform data\n"); | 805 | pdata = devm_kzalloc(&client->dev, |
806 | return -EINVAL; | 806 | sizeof(struct mcp23s08_platform_data), |
807 | GFP_KERNEL); | ||
808 | pdata->base = -1; | ||
807 | } | 809 | } |
808 | } | 810 | } |
809 | 811 | ||
@@ -924,10 +926,11 @@ static int mcp23s08_probe(struct spi_device *spi) | |||
924 | } else { | 926 | } else { |
925 | type = spi_get_device_id(spi)->driver_data; | 927 | type = spi_get_device_id(spi)->driver_data; |
926 | pdata = dev_get_platdata(&spi->dev); | 928 | pdata = dev_get_platdata(&spi->dev); |
927 | if (!pdata || !gpio_is_valid(pdata->base)) { | 929 | if (!pdata) { |
928 | dev_dbg(&spi->dev, | 930 | pdata = devm_kzalloc(&spi->dev, |
929 | "invalid or missing platform data\n"); | 931 | sizeof(struct mcp23s08_platform_data), |
930 | return -EINVAL; | 932 | GFP_KERNEL); |
933 | pdata->base = -1; | ||
931 | } | 934 | } |
932 | 935 | ||
933 | for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) { | 936 | for (addr = 0; addr < ARRAY_SIZE(pdata->chip); addr++) { |
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 30646cfe0efa..f476ae2eb0b3 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c | |||
@@ -88,6 +88,8 @@ struct gpio_bank { | |||
88 | #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage) | 88 | #define BANK_USED(bank) (bank->mod_usage || bank->irq_usage) |
89 | #define LINE_USED(line, offset) (line & (BIT(offset))) | 89 | #define LINE_USED(line, offset) (line & (BIT(offset))) |
90 | 90 | ||
91 | static void omap_gpio_unmask_irq(struct irq_data *d); | ||
92 | |||
91 | static int omap_irq_to_gpio(struct gpio_bank *bank, unsigned int gpio_irq) | 93 | static int omap_irq_to_gpio(struct gpio_bank *bank, unsigned int gpio_irq) |
92 | { | 94 | { |
93 | return bank->chip.base + gpio_irq; | 95 | return bank->chip.base + gpio_irq; |
@@ -477,6 +479,16 @@ static int omap_gpio_is_input(struct gpio_bank *bank, int mask) | |||
477 | return readl_relaxed(reg) & mask; | 479 | return readl_relaxed(reg) & mask; |
478 | } | 480 | } |
479 | 481 | ||
482 | static void omap_gpio_init_irq(struct gpio_bank *bank, unsigned gpio, | ||
483 | unsigned offset) | ||
484 | { | ||
485 | if (!LINE_USED(bank->mod_usage, offset)) { | ||
486 | omap_enable_gpio_module(bank, offset); | ||
487 | omap_set_gpio_direction(bank, offset, 1); | ||
488 | } | ||
489 | bank->irq_usage |= BIT(GPIO_INDEX(bank, gpio)); | ||
490 | } | ||
491 | |||
480 | static int omap_gpio_irq_type(struct irq_data *d, unsigned type) | 492 | static int omap_gpio_irq_type(struct irq_data *d, unsigned type) |
481 | { | 493 | { |
482 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 494 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
@@ -506,15 +518,11 @@ static int omap_gpio_irq_type(struct irq_data *d, unsigned type) | |||
506 | spin_lock_irqsave(&bank->lock, flags); | 518 | spin_lock_irqsave(&bank->lock, flags); |
507 | offset = GPIO_INDEX(bank, gpio); | 519 | offset = GPIO_INDEX(bank, gpio); |
508 | retval = omap_set_gpio_triggering(bank, offset, type); | 520 | retval = omap_set_gpio_triggering(bank, offset, type); |
509 | if (!LINE_USED(bank->mod_usage, offset)) { | 521 | omap_gpio_init_irq(bank, gpio, offset); |
510 | omap_enable_gpio_module(bank, offset); | 522 | if (!omap_gpio_is_input(bank, BIT(offset))) { |
511 | omap_set_gpio_direction(bank, offset, 1); | ||
512 | } else if (!omap_gpio_is_input(bank, BIT(offset))) { | ||
513 | spin_unlock_irqrestore(&bank->lock, flags); | 523 | spin_unlock_irqrestore(&bank->lock, flags); |
514 | return -EINVAL; | 524 | return -EINVAL; |
515 | } | 525 | } |
516 | |||
517 | bank->irq_usage |= BIT(GPIO_INDEX(bank, gpio)); | ||
518 | spin_unlock_irqrestore(&bank->lock, flags); | 526 | spin_unlock_irqrestore(&bank->lock, flags); |
519 | 527 | ||
520 | if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) | 528 | if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH)) |
@@ -792,6 +800,24 @@ exit: | |||
792 | pm_runtime_put(bank->dev); | 800 | pm_runtime_put(bank->dev); |
793 | } | 801 | } |
794 | 802 | ||
803 | static unsigned int omap_gpio_irq_startup(struct irq_data *d) | ||
804 | { | ||
805 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | ||
806 | unsigned int gpio = omap_irq_to_gpio(bank, d->hwirq); | ||
807 | unsigned long flags; | ||
808 | unsigned offset = GPIO_INDEX(bank, gpio); | ||
809 | |||
810 | if (!BANK_USED(bank)) | ||
811 | pm_runtime_get_sync(bank->dev); | ||
812 | |||
813 | spin_lock_irqsave(&bank->lock, flags); | ||
814 | omap_gpio_init_irq(bank, gpio, offset); | ||
815 | spin_unlock_irqrestore(&bank->lock, flags); | ||
816 | omap_gpio_unmask_irq(d); | ||
817 | |||
818 | return 0; | ||
819 | } | ||
820 | |||
795 | static void omap_gpio_irq_shutdown(struct irq_data *d) | 821 | static void omap_gpio_irq_shutdown(struct irq_data *d) |
796 | { | 822 | { |
797 | struct gpio_bank *bank = omap_irq_data_get_bank(d); | 823 | struct gpio_bank *bank = omap_irq_data_get_bank(d); |
@@ -1181,6 +1207,7 @@ static int omap_gpio_probe(struct platform_device *pdev) | |||
1181 | if (!irqc) | 1207 | if (!irqc) |
1182 | return -ENOMEM; | 1208 | return -ENOMEM; |
1183 | 1209 | ||
1210 | irqc->irq_startup = omap_gpio_irq_startup, | ||
1184 | irqc->irq_shutdown = omap_gpio_irq_shutdown, | 1211 | irqc->irq_shutdown = omap_gpio_irq_shutdown, |
1185 | irqc->irq_ack = omap_gpio_ack_irq, | 1212 | irqc->irq_ack = omap_gpio_ack_irq, |
1186 | irqc->irq_mask = omap_gpio_mask_irq, | 1213 | irqc->irq_mask = omap_gpio_mask_irq, |
diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c index f62aa115d79a..7722ed53bd65 100644 --- a/drivers/gpio/gpiolib-sysfs.c +++ b/drivers/gpio/gpiolib-sysfs.c | |||
@@ -648,6 +648,7 @@ int gpiod_export_link(struct device *dev, const char *name, | |||
648 | if (tdev != NULL) { | 648 | if (tdev != NULL) { |
649 | status = sysfs_create_link(&dev->kobj, &tdev->kobj, | 649 | status = sysfs_create_link(&dev->kobj, &tdev->kobj, |
650 | name); | 650 | name); |
651 | put_device(tdev); | ||
651 | } else { | 652 | } else { |
652 | status = -ENODEV; | 653 | status = -ENODEV; |
653 | } | 654 | } |
@@ -695,7 +696,7 @@ int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value) | |||
695 | } | 696 | } |
696 | 697 | ||
697 | status = sysfs_set_active_low(desc, dev, value); | 698 | status = sysfs_set_active_low(desc, dev, value); |
698 | 699 | put_device(dev); | |
699 | unlock: | 700 | unlock: |
700 | mutex_unlock(&sysfs_lock); | 701 | mutex_unlock(&sysfs_lock); |
701 | 702 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index 0d8694f015c1..0fd592799d58 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | |||
@@ -822,7 +822,7 @@ static void destroy_kernel_queue_cpsch(struct device_queue_manager *dqm, | |||
822 | * Unconditionally decrement this counter, regardless of the queue's | 822 | * Unconditionally decrement this counter, regardless of the queue's |
823 | * type. | 823 | * type. |
824 | */ | 824 | */ |
825 | dqm->total_queue_count++; | 825 | dqm->total_queue_count--; |
826 | pr_debug("Total of %d queues are accountable so far\n", | 826 | pr_debug("Total of %d queues are accountable so far\n", |
827 | dqm->total_queue_count); | 827 | dqm->total_queue_count); |
828 | mutex_unlock(&dqm->lock); | 828 | mutex_unlock(&dqm->lock); |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_module.c b/drivers/gpu/drm/amd/amdkfd/kfd_module.c index a8be6df85347..1c385c23dd0b 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_module.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_module.c | |||
@@ -95,10 +95,10 @@ static int __init kfd_module_init(void) | |||
95 | } | 95 | } |
96 | 96 | ||
97 | /* Verify module parameters */ | 97 | /* Verify module parameters */ |
98 | if ((max_num_of_queues_per_device < 0) || | 98 | if ((max_num_of_queues_per_device < 1) || |
99 | (max_num_of_queues_per_device > | 99 | (max_num_of_queues_per_device > |
100 | KFD_MAX_NUM_OF_QUEUES_PER_DEVICE)) { | 100 | KFD_MAX_NUM_OF_QUEUES_PER_DEVICE)) { |
101 | pr_err("kfd: max_num_of_queues_per_device must be between 0 to KFD_MAX_NUM_OF_QUEUES_PER_DEVICE\n"); | 101 | pr_err("kfd: max_num_of_queues_per_device must be between 1 to KFD_MAX_NUM_OF_QUEUES_PER_DEVICE\n"); |
102 | return -1; | 102 | return -1; |
103 | } | 103 | } |
104 | 104 | ||
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c index f37cf5efe642..2fda1927bff7 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c | |||
@@ -315,7 +315,11 @@ int pqm_update_queue(struct process_queue_manager *pqm, unsigned int qid, | |||
315 | BUG_ON(!pqm); | 315 | BUG_ON(!pqm); |
316 | 316 | ||
317 | pqn = get_queue_by_qid(pqm, qid); | 317 | pqn = get_queue_by_qid(pqm, qid); |
318 | BUG_ON(!pqn); | 318 | if (!pqn) { |
319 | pr_debug("amdkfd: No queue %d exists for update operation\n", | ||
320 | qid); | ||
321 | return -EFAULT; | ||
322 | } | ||
319 | 323 | ||
320 | pqn->q->properties.queue_address = p->queue_address; | 324 | pqn->q->properties.queue_address = p->queue_address; |
321 | pqn->q->properties.queue_size = p->queue_size; | 325 | pqn->q->properties.queue_size = p->queue_size; |
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.c b/drivers/gpu/drm/cirrus/cirrus_drv.c index c2a1cba1e984..b9140032962d 100644 --- a/drivers/gpu/drm/cirrus/cirrus_drv.c +++ b/drivers/gpu/drm/cirrus/cirrus_drv.c | |||
@@ -16,9 +16,12 @@ | |||
16 | #include "cirrus_drv.h" | 16 | #include "cirrus_drv.h" |
17 | 17 | ||
18 | int cirrus_modeset = -1; | 18 | int cirrus_modeset = -1; |
19 | int cirrus_bpp = 24; | ||
19 | 20 | ||
20 | MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); | 21 | MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); |
21 | module_param_named(modeset, cirrus_modeset, int, 0400); | 22 | module_param_named(modeset, cirrus_modeset, int, 0400); |
23 | MODULE_PARM_DESC(bpp, "Max bits-per-pixel (default:24)"); | ||
24 | module_param_named(bpp, cirrus_bpp, int, 0400); | ||
22 | 25 | ||
23 | /* | 26 | /* |
24 | * This is the generic driver code. This binds the driver to the drm core, | 27 | * This is the generic driver code. This binds the driver to the drm core, |
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h index 693a4565c4ff..705061537a27 100644 --- a/drivers/gpu/drm/cirrus/cirrus_drv.h +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h | |||
@@ -262,4 +262,7 @@ static inline void cirrus_bo_unreserve(struct cirrus_bo *bo) | |||
262 | 262 | ||
263 | int cirrus_bo_push_sysram(struct cirrus_bo *bo); | 263 | int cirrus_bo_push_sysram(struct cirrus_bo *bo); |
264 | int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr); | 264 | int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr); |
265 | |||
266 | extern int cirrus_bpp; | ||
267 | |||
265 | #endif /* __CIRRUS_DRV_H__ */ | 268 | #endif /* __CIRRUS_DRV_H__ */ |
diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c b/drivers/gpu/drm/cirrus/cirrus_main.c index 4c2d68e9102d..e4b976658087 100644 --- a/drivers/gpu/drm/cirrus/cirrus_main.c +++ b/drivers/gpu/drm/cirrus/cirrus_main.c | |||
@@ -320,6 +320,8 @@ bool cirrus_check_framebuffer(struct cirrus_device *cdev, int width, int height, | |||
320 | const int max_pitch = 0x1FF << 3; /* (4096 - 1) & ~111b bytes */ | 320 | const int max_pitch = 0x1FF << 3; /* (4096 - 1) & ~111b bytes */ |
321 | const int max_size = cdev->mc.vram_size; | 321 | const int max_size = cdev->mc.vram_size; |
322 | 322 | ||
323 | if (bpp > cirrus_bpp) | ||
324 | return false; | ||
323 | if (bpp > 32) | 325 | if (bpp > 32) |
324 | return false; | 326 | return false; |
325 | 327 | ||
diff --git a/drivers/gpu/drm/cirrus/cirrus_mode.c b/drivers/gpu/drm/cirrus/cirrus_mode.c index 99d4a74ffeaf..61385f2298bf 100644 --- a/drivers/gpu/drm/cirrus/cirrus_mode.c +++ b/drivers/gpu/drm/cirrus/cirrus_mode.c | |||
@@ -501,8 +501,13 @@ static int cirrus_vga_get_modes(struct drm_connector *connector) | |||
501 | int count; | 501 | int count; |
502 | 502 | ||
503 | /* Just add a static list of modes */ | 503 | /* Just add a static list of modes */ |
504 | count = drm_add_modes_noedid(connector, 1280, 1024); | 504 | if (cirrus_bpp <= 24) { |
505 | drm_set_preferred_mode(connector, 1024, 768); | 505 | count = drm_add_modes_noedid(connector, 1280, 1024); |
506 | drm_set_preferred_mode(connector, 1024, 768); | ||
507 | } else { | ||
508 | count = drm_add_modes_noedid(connector, 800, 600); | ||
509 | drm_set_preferred_mode(connector, 800, 600); | ||
510 | } | ||
506 | return count; | 511 | return count; |
507 | } | 512 | } |
508 | 513 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c index 9e7f23dd14bd..87d5fb21cb61 100644 --- a/drivers/gpu/drm/radeon/radeon_benchmark.c +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c | |||
@@ -34,7 +34,8 @@ | |||
34 | 34 | ||
35 | static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size, | 35 | static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size, |
36 | uint64_t saddr, uint64_t daddr, | 36 | uint64_t saddr, uint64_t daddr, |
37 | int flag, int n) | 37 | int flag, int n, |
38 | struct reservation_object *resv) | ||
38 | { | 39 | { |
39 | unsigned long start_jiffies; | 40 | unsigned long start_jiffies; |
40 | unsigned long end_jiffies; | 41 | unsigned long end_jiffies; |
@@ -47,12 +48,12 @@ static int radeon_benchmark_do_move(struct radeon_device *rdev, unsigned size, | |||
47 | case RADEON_BENCHMARK_COPY_DMA: | 48 | case RADEON_BENCHMARK_COPY_DMA: |
48 | fence = radeon_copy_dma(rdev, saddr, daddr, | 49 | fence = radeon_copy_dma(rdev, saddr, daddr, |
49 | size / RADEON_GPU_PAGE_SIZE, | 50 | size / RADEON_GPU_PAGE_SIZE, |
50 | NULL); | 51 | resv); |
51 | break; | 52 | break; |
52 | case RADEON_BENCHMARK_COPY_BLIT: | 53 | case RADEON_BENCHMARK_COPY_BLIT: |
53 | fence = radeon_copy_blit(rdev, saddr, daddr, | 54 | fence = radeon_copy_blit(rdev, saddr, daddr, |
54 | size / RADEON_GPU_PAGE_SIZE, | 55 | size / RADEON_GPU_PAGE_SIZE, |
55 | NULL); | 56 | resv); |
56 | break; | 57 | break; |
57 | default: | 58 | default: |
58 | DRM_ERROR("Unknown copy method\n"); | 59 | DRM_ERROR("Unknown copy method\n"); |
@@ -120,7 +121,8 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size, | |||
120 | 121 | ||
121 | if (rdev->asic->copy.dma) { | 122 | if (rdev->asic->copy.dma) { |
122 | time = radeon_benchmark_do_move(rdev, size, saddr, daddr, | 123 | time = radeon_benchmark_do_move(rdev, size, saddr, daddr, |
123 | RADEON_BENCHMARK_COPY_DMA, n); | 124 | RADEON_BENCHMARK_COPY_DMA, n, |
125 | dobj->tbo.resv); | ||
124 | if (time < 0) | 126 | if (time < 0) |
125 | goto out_cleanup; | 127 | goto out_cleanup; |
126 | if (time > 0) | 128 | if (time > 0) |
@@ -130,7 +132,8 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size, | |||
130 | 132 | ||
131 | if (rdev->asic->copy.blit) { | 133 | if (rdev->asic->copy.blit) { |
132 | time = radeon_benchmark_do_move(rdev, size, saddr, daddr, | 134 | time = radeon_benchmark_do_move(rdev, size, saddr, daddr, |
133 | RADEON_BENCHMARK_COPY_BLIT, n); | 135 | RADEON_BENCHMARK_COPY_BLIT, n, |
136 | dobj->tbo.resv); | ||
134 | if (time < 0) | 137 | if (time < 0) |
135 | goto out_cleanup; | 138 | goto out_cleanup; |
136 | if (time > 0) | 139 | if (time > 0) |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 102116902a07..913fafa597ad 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -960,6 +960,9 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll, | |||
960 | if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV && | 960 | if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV && |
961 | pll->flags & RADEON_PLL_USE_REF_DIV) | 961 | pll->flags & RADEON_PLL_USE_REF_DIV) |
962 | ref_div_max = pll->reference_div; | 962 | ref_div_max = pll->reference_div; |
963 | else if (pll->flags & RADEON_PLL_PREFER_MINM_OVER_MAXP) | ||
964 | /* fix for problems on RS880 */ | ||
965 | ref_div_max = min(pll->max_ref_div, 7u); | ||
963 | else | 966 | else |
964 | ref_div_max = pll->max_ref_div; | 967 | ref_div_max = pll->max_ref_div; |
965 | 968 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index d0b4f7d1140d..ac3c1310b953 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
@@ -146,7 +146,8 @@ int radeon_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_pri | |||
146 | struct radeon_bo_va *bo_va; | 146 | struct radeon_bo_va *bo_va; |
147 | int r; | 147 | int r; |
148 | 148 | ||
149 | if (rdev->family < CHIP_CAYMAN) { | 149 | if ((rdev->family < CHIP_CAYMAN) || |
150 | (!rdev->accel_working)) { | ||
150 | return 0; | 151 | return 0; |
151 | } | 152 | } |
152 | 153 | ||
@@ -176,7 +177,8 @@ void radeon_gem_object_close(struct drm_gem_object *obj, | |||
176 | struct radeon_bo_va *bo_va; | 177 | struct radeon_bo_va *bo_va; |
177 | int r; | 178 | int r; |
178 | 179 | ||
179 | if (rdev->family < CHIP_CAYMAN) { | 180 | if ((rdev->family < CHIP_CAYMAN) || |
181 | (!rdev->accel_working)) { | ||
180 | return; | 182 | return; |
181 | } | 183 | } |
182 | 184 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 3cf9c1fa6475..686411e4e4f6 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
@@ -605,14 +605,14 @@ int radeon_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) | |||
605 | return -ENOMEM; | 605 | return -ENOMEM; |
606 | } | 606 | } |
607 | 607 | ||
608 | vm = &fpriv->vm; | ||
609 | r = radeon_vm_init(rdev, vm); | ||
610 | if (r) { | ||
611 | kfree(fpriv); | ||
612 | return r; | ||
613 | } | ||
614 | |||
615 | if (rdev->accel_working) { | 608 | if (rdev->accel_working) { |
609 | vm = &fpriv->vm; | ||
610 | r = radeon_vm_init(rdev, vm); | ||
611 | if (r) { | ||
612 | kfree(fpriv); | ||
613 | return r; | ||
614 | } | ||
615 | |||
616 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); | 616 | r = radeon_bo_reserve(rdev->ring_tmp_bo.bo, false); |
617 | if (r) { | 617 | if (r) { |
618 | radeon_vm_fini(rdev, vm); | 618 | radeon_vm_fini(rdev, vm); |
@@ -668,9 +668,9 @@ void radeon_driver_postclose_kms(struct drm_device *dev, | |||
668 | radeon_vm_bo_rmv(rdev, vm->ib_bo_va); | 668 | radeon_vm_bo_rmv(rdev, vm->ib_bo_va); |
669 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); | 669 | radeon_bo_unreserve(rdev->ring_tmp_bo.bo); |
670 | } | 670 | } |
671 | radeon_vm_fini(rdev, vm); | ||
671 | } | 672 | } |
672 | 673 | ||
673 | radeon_vm_fini(rdev, vm); | ||
674 | kfree(fpriv); | 674 | kfree(fpriv); |
675 | file_priv->driver_priv = NULL; | 675 | file_priv->driver_priv = NULL; |
676 | } | 676 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c index 07b506b41008..791818165c76 100644 --- a/drivers/gpu/drm/radeon/radeon_test.c +++ b/drivers/gpu/drm/radeon/radeon_test.c | |||
@@ -119,11 +119,11 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag) | |||
119 | if (ring == R600_RING_TYPE_DMA_INDEX) | 119 | if (ring == R600_RING_TYPE_DMA_INDEX) |
120 | fence = radeon_copy_dma(rdev, gtt_addr, vram_addr, | 120 | fence = radeon_copy_dma(rdev, gtt_addr, vram_addr, |
121 | size / RADEON_GPU_PAGE_SIZE, | 121 | size / RADEON_GPU_PAGE_SIZE, |
122 | NULL); | 122 | vram_obj->tbo.resv); |
123 | else | 123 | else |
124 | fence = radeon_copy_blit(rdev, gtt_addr, vram_addr, | 124 | fence = radeon_copy_blit(rdev, gtt_addr, vram_addr, |
125 | size / RADEON_GPU_PAGE_SIZE, | 125 | size / RADEON_GPU_PAGE_SIZE, |
126 | NULL); | 126 | vram_obj->tbo.resv); |
127 | if (IS_ERR(fence)) { | 127 | if (IS_ERR(fence)) { |
128 | DRM_ERROR("Failed GTT->VRAM copy %d\n", i); | 128 | DRM_ERROR("Failed GTT->VRAM copy %d\n", i); |
129 | r = PTR_ERR(fence); | 129 | r = PTR_ERR(fence); |
@@ -170,11 +170,11 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag) | |||
170 | if (ring == R600_RING_TYPE_DMA_INDEX) | 170 | if (ring == R600_RING_TYPE_DMA_INDEX) |
171 | fence = radeon_copy_dma(rdev, vram_addr, gtt_addr, | 171 | fence = radeon_copy_dma(rdev, vram_addr, gtt_addr, |
172 | size / RADEON_GPU_PAGE_SIZE, | 172 | size / RADEON_GPU_PAGE_SIZE, |
173 | NULL); | 173 | vram_obj->tbo.resv); |
174 | else | 174 | else |
175 | fence = radeon_copy_blit(rdev, vram_addr, gtt_addr, | 175 | fence = radeon_copy_blit(rdev, vram_addr, gtt_addr, |
176 | size / RADEON_GPU_PAGE_SIZE, | 176 | size / RADEON_GPU_PAGE_SIZE, |
177 | NULL); | 177 | vram_obj->tbo.resv); |
178 | if (IS_ERR(fence)) { | 178 | if (IS_ERR(fence)) { |
179 | DRM_ERROR("Failed VRAM->GTT copy %d\n", i); | 179 | DRM_ERROR("Failed VRAM->GTT copy %d\n", i); |
180 | r = PTR_ERR(fence); | 180 | r = PTR_ERR(fence); |
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c index 06d2246d07f1..2a5a4a9e772d 100644 --- a/drivers/gpu/drm/radeon/radeon_vm.c +++ b/drivers/gpu/drm/radeon/radeon_vm.c | |||
@@ -743,9 +743,11 @@ static void radeon_vm_frag_ptes(struct radeon_device *rdev, | |||
743 | */ | 743 | */ |
744 | 744 | ||
745 | /* NI is optimized for 256KB fragments, SI and newer for 64KB */ | 745 | /* NI is optimized for 256KB fragments, SI and newer for 64KB */ |
746 | uint64_t frag_flags = rdev->family == CHIP_CAYMAN ? | 746 | uint64_t frag_flags = ((rdev->family == CHIP_CAYMAN) || |
747 | (rdev->family == CHIP_ARUBA)) ? | ||
747 | R600_PTE_FRAG_256KB : R600_PTE_FRAG_64KB; | 748 | R600_PTE_FRAG_256KB : R600_PTE_FRAG_64KB; |
748 | uint64_t frag_align = rdev->family == CHIP_CAYMAN ? 0x200 : 0x80; | 749 | uint64_t frag_align = ((rdev->family == CHIP_CAYMAN) || |
750 | (rdev->family == CHIP_ARUBA)) ? 0x200 : 0x80; | ||
749 | 751 | ||
750 | uint64_t frag_start = ALIGN(pe_start, frag_align); | 752 | uint64_t frag_start = ALIGN(pe_start, frag_align); |
751 | uint64_t frag_end = pe_end & ~(frag_align - 1); | 753 | uint64_t frag_end = pe_end & ~(frag_align - 1); |
diff --git a/drivers/infiniband/core/uverbs.h b/drivers/infiniband/core/uverbs.h index b716b0815644..643c08a025a5 100644 --- a/drivers/infiniband/core/uverbs.h +++ b/drivers/infiniband/core/uverbs.h | |||
@@ -258,6 +258,5 @@ IB_UVERBS_DECLARE_CMD(close_xrcd); | |||
258 | 258 | ||
259 | IB_UVERBS_DECLARE_EX_CMD(create_flow); | 259 | IB_UVERBS_DECLARE_EX_CMD(create_flow); |
260 | IB_UVERBS_DECLARE_EX_CMD(destroy_flow); | 260 | IB_UVERBS_DECLARE_EX_CMD(destroy_flow); |
261 | IB_UVERBS_DECLARE_EX_CMD(query_device); | ||
262 | 261 | ||
263 | #endif /* UVERBS_H */ | 262 | #endif /* UVERBS_H */ |
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 532d8eba8b02..b7943ff16ed3 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c | |||
@@ -400,52 +400,6 @@ err: | |||
400 | return ret; | 400 | return ret; |
401 | } | 401 | } |
402 | 402 | ||
403 | static void copy_query_dev_fields(struct ib_uverbs_file *file, | ||
404 | struct ib_uverbs_query_device_resp *resp, | ||
405 | struct ib_device_attr *attr) | ||
406 | { | ||
407 | resp->fw_ver = attr->fw_ver; | ||
408 | resp->node_guid = file->device->ib_dev->node_guid; | ||
409 | resp->sys_image_guid = attr->sys_image_guid; | ||
410 | resp->max_mr_size = attr->max_mr_size; | ||
411 | resp->page_size_cap = attr->page_size_cap; | ||
412 | resp->vendor_id = attr->vendor_id; | ||
413 | resp->vendor_part_id = attr->vendor_part_id; | ||
414 | resp->hw_ver = attr->hw_ver; | ||
415 | resp->max_qp = attr->max_qp; | ||
416 | resp->max_qp_wr = attr->max_qp_wr; | ||
417 | resp->device_cap_flags = attr->device_cap_flags; | ||
418 | resp->max_sge = attr->max_sge; | ||
419 | resp->max_sge_rd = attr->max_sge_rd; | ||
420 | resp->max_cq = attr->max_cq; | ||
421 | resp->max_cqe = attr->max_cqe; | ||
422 | resp->max_mr = attr->max_mr; | ||
423 | resp->max_pd = attr->max_pd; | ||
424 | resp->max_qp_rd_atom = attr->max_qp_rd_atom; | ||
425 | resp->max_ee_rd_atom = attr->max_ee_rd_atom; | ||
426 | resp->max_res_rd_atom = attr->max_res_rd_atom; | ||
427 | resp->max_qp_init_rd_atom = attr->max_qp_init_rd_atom; | ||
428 | resp->max_ee_init_rd_atom = attr->max_ee_init_rd_atom; | ||
429 | resp->atomic_cap = attr->atomic_cap; | ||
430 | resp->max_ee = attr->max_ee; | ||
431 | resp->max_rdd = attr->max_rdd; | ||
432 | resp->max_mw = attr->max_mw; | ||
433 | resp->max_raw_ipv6_qp = attr->max_raw_ipv6_qp; | ||
434 | resp->max_raw_ethy_qp = attr->max_raw_ethy_qp; | ||
435 | resp->max_mcast_grp = attr->max_mcast_grp; | ||
436 | resp->max_mcast_qp_attach = attr->max_mcast_qp_attach; | ||
437 | resp->max_total_mcast_qp_attach = attr->max_total_mcast_qp_attach; | ||
438 | resp->max_ah = attr->max_ah; | ||
439 | resp->max_fmr = attr->max_fmr; | ||
440 | resp->max_map_per_fmr = attr->max_map_per_fmr; | ||
441 | resp->max_srq = attr->max_srq; | ||
442 | resp->max_srq_wr = attr->max_srq_wr; | ||
443 | resp->max_srq_sge = attr->max_srq_sge; | ||
444 | resp->max_pkeys = attr->max_pkeys; | ||
445 | resp->local_ca_ack_delay = attr->local_ca_ack_delay; | ||
446 | resp->phys_port_cnt = file->device->ib_dev->phys_port_cnt; | ||
447 | } | ||
448 | |||
449 | ssize_t ib_uverbs_query_device(struct ib_uverbs_file *file, | 403 | ssize_t ib_uverbs_query_device(struct ib_uverbs_file *file, |
450 | const char __user *buf, | 404 | const char __user *buf, |
451 | int in_len, int out_len) | 405 | int in_len, int out_len) |
@@ -466,7 +420,47 @@ ssize_t ib_uverbs_query_device(struct ib_uverbs_file *file, | |||
466 | return ret; | 420 | return ret; |
467 | 421 | ||
468 | memset(&resp, 0, sizeof resp); | 422 | memset(&resp, 0, sizeof resp); |
469 | copy_query_dev_fields(file, &resp, &attr); | 423 | |
424 | resp.fw_ver = attr.fw_ver; | ||
425 | resp.node_guid = file->device->ib_dev->node_guid; | ||
426 | resp.sys_image_guid = attr.sys_image_guid; | ||
427 | resp.max_mr_size = attr.max_mr_size; | ||
428 | resp.page_size_cap = attr.page_size_cap; | ||
429 | resp.vendor_id = attr.vendor_id; | ||
430 | resp.vendor_part_id = attr.vendor_part_id; | ||
431 | resp.hw_ver = attr.hw_ver; | ||
432 | resp.max_qp = attr.max_qp; | ||
433 | resp.max_qp_wr = attr.max_qp_wr; | ||
434 | resp.device_cap_flags = attr.device_cap_flags; | ||
435 | resp.max_sge = attr.max_sge; | ||
436 | resp.max_sge_rd = attr.max_sge_rd; | ||
437 | resp.max_cq = attr.max_cq; | ||
438 | resp.max_cqe = attr.max_cqe; | ||
439 | resp.max_mr = attr.max_mr; | ||
440 | resp.max_pd = attr.max_pd; | ||
441 | resp.max_qp_rd_atom = attr.max_qp_rd_atom; | ||
442 | resp.max_ee_rd_atom = attr.max_ee_rd_atom; | ||
443 | resp.max_res_rd_atom = attr.max_res_rd_atom; | ||
444 | resp.max_qp_init_rd_atom = attr.max_qp_init_rd_atom; | ||
445 | resp.max_ee_init_rd_atom = attr.max_ee_init_rd_atom; | ||
446 | resp.atomic_cap = attr.atomic_cap; | ||
447 | resp.max_ee = attr.max_ee; | ||
448 | resp.max_rdd = attr.max_rdd; | ||
449 | resp.max_mw = attr.max_mw; | ||
450 | resp.max_raw_ipv6_qp = attr.max_raw_ipv6_qp; | ||
451 | resp.max_raw_ethy_qp = attr.max_raw_ethy_qp; | ||
452 | resp.max_mcast_grp = attr.max_mcast_grp; | ||
453 | resp.max_mcast_qp_attach = attr.max_mcast_qp_attach; | ||
454 | resp.max_total_mcast_qp_attach = attr.max_total_mcast_qp_attach; | ||
455 | resp.max_ah = attr.max_ah; | ||
456 | resp.max_fmr = attr.max_fmr; | ||
457 | resp.max_map_per_fmr = attr.max_map_per_fmr; | ||
458 | resp.max_srq = attr.max_srq; | ||
459 | resp.max_srq_wr = attr.max_srq_wr; | ||
460 | resp.max_srq_sge = attr.max_srq_sge; | ||
461 | resp.max_pkeys = attr.max_pkeys; | ||
462 | resp.local_ca_ack_delay = attr.local_ca_ack_delay; | ||
463 | resp.phys_port_cnt = file->device->ib_dev->phys_port_cnt; | ||
470 | 464 | ||
471 | if (copy_to_user((void __user *) (unsigned long) cmd.response, | 465 | if (copy_to_user((void __user *) (unsigned long) cmd.response, |
472 | &resp, sizeof resp)) | 466 | &resp, sizeof resp)) |
@@ -3293,52 +3287,3 @@ ssize_t ib_uverbs_destroy_srq(struct ib_uverbs_file *file, | |||
3293 | 3287 | ||
3294 | return ret ? ret : in_len; | 3288 | return ret ? ret : in_len; |
3295 | } | 3289 | } |
3296 | |||
3297 | int ib_uverbs_ex_query_device(struct ib_uverbs_file *file, | ||
3298 | struct ib_udata *ucore, | ||
3299 | struct ib_udata *uhw) | ||
3300 | { | ||
3301 | struct ib_uverbs_ex_query_device_resp resp; | ||
3302 | struct ib_uverbs_ex_query_device cmd; | ||
3303 | struct ib_device_attr attr; | ||
3304 | struct ib_device *device; | ||
3305 | int err; | ||
3306 | |||
3307 | device = file->device->ib_dev; | ||
3308 | if (ucore->inlen < sizeof(cmd)) | ||
3309 | return -EINVAL; | ||
3310 | |||
3311 | err = ib_copy_from_udata(&cmd, ucore, sizeof(cmd)); | ||
3312 | if (err) | ||
3313 | return err; | ||
3314 | |||
3315 | if (cmd.reserved) | ||
3316 | return -EINVAL; | ||
3317 | |||
3318 | err = device->query_device(device, &attr); | ||
3319 | if (err) | ||
3320 | return err; | ||
3321 | |||
3322 | memset(&resp, 0, sizeof(resp)); | ||
3323 | copy_query_dev_fields(file, &resp.base, &attr); | ||
3324 | resp.comp_mask = 0; | ||
3325 | |||
3326 | #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING | ||
3327 | if (cmd.comp_mask & IB_USER_VERBS_EX_QUERY_DEVICE_ODP) { | ||
3328 | resp.odp_caps.general_caps = attr.odp_caps.general_caps; | ||
3329 | resp.odp_caps.per_transport_caps.rc_odp_caps = | ||
3330 | attr.odp_caps.per_transport_caps.rc_odp_caps; | ||
3331 | resp.odp_caps.per_transport_caps.uc_odp_caps = | ||
3332 | attr.odp_caps.per_transport_caps.uc_odp_caps; | ||
3333 | resp.odp_caps.per_transport_caps.ud_odp_caps = | ||
3334 | attr.odp_caps.per_transport_caps.ud_odp_caps; | ||
3335 | resp.comp_mask |= IB_USER_VERBS_EX_QUERY_DEVICE_ODP; | ||
3336 | } | ||
3337 | #endif | ||
3338 | |||
3339 | err = ib_copy_to_udata(ucore, &resp, sizeof(resp)); | ||
3340 | if (err) | ||
3341 | return err; | ||
3342 | |||
3343 | return 0; | ||
3344 | } | ||
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index e6c23b9eab33..5db1a8cc388d 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c | |||
@@ -123,7 +123,6 @@ static int (*uverbs_ex_cmd_table[])(struct ib_uverbs_file *file, | |||
123 | struct ib_udata *uhw) = { | 123 | struct ib_udata *uhw) = { |
124 | [IB_USER_VERBS_EX_CMD_CREATE_FLOW] = ib_uverbs_ex_create_flow, | 124 | [IB_USER_VERBS_EX_CMD_CREATE_FLOW] = ib_uverbs_ex_create_flow, |
125 | [IB_USER_VERBS_EX_CMD_DESTROY_FLOW] = ib_uverbs_ex_destroy_flow, | 125 | [IB_USER_VERBS_EX_CMD_DESTROY_FLOW] = ib_uverbs_ex_destroy_flow, |
126 | [IB_USER_VERBS_EX_CMD_QUERY_DEVICE] = ib_uverbs_ex_query_device | ||
127 | }; | 126 | }; |
128 | 127 | ||
129 | static void ib_uverbs_add_one(struct ib_device *device); | 128 | static void ib_uverbs_add_one(struct ib_device *device); |
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c index 8a87404e9c76..03bf81211a54 100644 --- a/drivers/infiniband/hw/mlx5/main.c +++ b/drivers/infiniband/hw/mlx5/main.c | |||
@@ -1331,8 +1331,6 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev) | |||
1331 | (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) | | 1331 | (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) | |
1332 | (1ull << IB_USER_VERBS_CMD_CREATE_XSRQ) | | 1332 | (1ull << IB_USER_VERBS_CMD_CREATE_XSRQ) | |
1333 | (1ull << IB_USER_VERBS_CMD_OPEN_QP); | 1333 | (1ull << IB_USER_VERBS_CMD_OPEN_QP); |
1334 | dev->ib_dev.uverbs_ex_cmd_mask = | ||
1335 | (1ull << IB_USER_VERBS_EX_CMD_QUERY_DEVICE); | ||
1336 | 1334 | ||
1337 | dev->ib_dev.query_device = mlx5_ib_query_device; | 1335 | dev->ib_dev.query_device = mlx5_ib_query_device; |
1338 | dev->ib_dev.query_port = mlx5_ib_query_port; | 1336 | dev->ib_dev.query_port = mlx5_ib_query_port; |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index 8ba80a6d3a46..d7562beb5423 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
@@ -98,15 +98,9 @@ enum { | |||
98 | 98 | ||
99 | IPOIB_MCAST_FLAG_FOUND = 0, /* used in set_multicast_list */ | 99 | IPOIB_MCAST_FLAG_FOUND = 0, /* used in set_multicast_list */ |
100 | IPOIB_MCAST_FLAG_SENDONLY = 1, | 100 | IPOIB_MCAST_FLAG_SENDONLY = 1, |
101 | /* | 101 | IPOIB_MCAST_FLAG_BUSY = 2, /* joining or already joined */ |
102 | * For IPOIB_MCAST_FLAG_BUSY | ||
103 | * When set, in flight join and mcast->mc is unreliable | ||
104 | * When clear and mcast->mc IS_ERR_OR_NULL, need to restart or | ||
105 | * haven't started yet | ||
106 | * When clear and mcast->mc is valid pointer, join was successful | ||
107 | */ | ||
108 | IPOIB_MCAST_FLAG_BUSY = 2, | ||
109 | IPOIB_MCAST_FLAG_ATTACHED = 3, | 102 | IPOIB_MCAST_FLAG_ATTACHED = 3, |
103 | IPOIB_MCAST_JOIN_STARTED = 4, | ||
110 | 104 | ||
111 | MAX_SEND_CQE = 16, | 105 | MAX_SEND_CQE = 16, |
112 | IPOIB_CM_COPYBREAK = 256, | 106 | IPOIB_CM_COPYBREAK = 256, |
@@ -323,7 +317,6 @@ struct ipoib_dev_priv { | |||
323 | struct list_head multicast_list; | 317 | struct list_head multicast_list; |
324 | struct rb_root multicast_tree; | 318 | struct rb_root multicast_tree; |
325 | 319 | ||
326 | struct workqueue_struct *wq; | ||
327 | struct delayed_work mcast_task; | 320 | struct delayed_work mcast_task; |
328 | struct work_struct carrier_on_task; | 321 | struct work_struct carrier_on_task; |
329 | struct work_struct flush_light; | 322 | struct work_struct flush_light; |
@@ -484,10 +477,10 @@ void ipoib_ib_dev_flush_heavy(struct work_struct *work); | |||
484 | void ipoib_pkey_event(struct work_struct *work); | 477 | void ipoib_pkey_event(struct work_struct *work); |
485 | void ipoib_ib_dev_cleanup(struct net_device *dev); | 478 | void ipoib_ib_dev_cleanup(struct net_device *dev); |
486 | 479 | ||
487 | int ipoib_ib_dev_open(struct net_device *dev); | 480 | int ipoib_ib_dev_open(struct net_device *dev, int flush); |
488 | int ipoib_ib_dev_up(struct net_device *dev); | 481 | int ipoib_ib_dev_up(struct net_device *dev); |
489 | int ipoib_ib_dev_down(struct net_device *dev); | 482 | int ipoib_ib_dev_down(struct net_device *dev, int flush); |
490 | int ipoib_ib_dev_stop(struct net_device *dev); | 483 | int ipoib_ib_dev_stop(struct net_device *dev, int flush); |
491 | void ipoib_pkey_dev_check_presence(struct net_device *dev); | 484 | void ipoib_pkey_dev_check_presence(struct net_device *dev); |
492 | 485 | ||
493 | int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port); | 486 | int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port); |
@@ -499,7 +492,7 @@ void ipoib_mcast_send(struct net_device *dev, u8 *daddr, struct sk_buff *skb); | |||
499 | 492 | ||
500 | void ipoib_mcast_restart_task(struct work_struct *work); | 493 | void ipoib_mcast_restart_task(struct work_struct *work); |
501 | int ipoib_mcast_start_thread(struct net_device *dev); | 494 | int ipoib_mcast_start_thread(struct net_device *dev); |
502 | int ipoib_mcast_stop_thread(struct net_device *dev); | 495 | int ipoib_mcast_stop_thread(struct net_device *dev, int flush); |
503 | 496 | ||
504 | void ipoib_mcast_dev_down(struct net_device *dev); | 497 | void ipoib_mcast_dev_down(struct net_device *dev); |
505 | void ipoib_mcast_dev_flush(struct net_device *dev); | 498 | void ipoib_mcast_dev_flush(struct net_device *dev); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c index 56959adb6c7d..933efcea0d03 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c | |||
@@ -474,7 +474,7 @@ static int ipoib_cm_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *even | |||
474 | } | 474 | } |
475 | 475 | ||
476 | spin_lock_irq(&priv->lock); | 476 | spin_lock_irq(&priv->lock); |
477 | queue_delayed_work(priv->wq, | 477 | queue_delayed_work(ipoib_workqueue, |
478 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); | 478 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); |
479 | /* Add this entry to passive ids list head, but do not re-add it | 479 | /* Add this entry to passive ids list head, but do not re-add it |
480 | * if IB_EVENT_QP_LAST_WQE_REACHED has moved it to flush list. */ | 480 | * if IB_EVENT_QP_LAST_WQE_REACHED has moved it to flush list. */ |
@@ -576,7 +576,7 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc) | |||
576 | spin_lock_irqsave(&priv->lock, flags); | 576 | spin_lock_irqsave(&priv->lock, flags); |
577 | list_splice_init(&priv->cm.rx_drain_list, &priv->cm.rx_reap_list); | 577 | list_splice_init(&priv->cm.rx_drain_list, &priv->cm.rx_reap_list); |
578 | ipoib_cm_start_rx_drain(priv); | 578 | ipoib_cm_start_rx_drain(priv); |
579 | queue_work(priv->wq, &priv->cm.rx_reap_task); | 579 | queue_work(ipoib_workqueue, &priv->cm.rx_reap_task); |
580 | spin_unlock_irqrestore(&priv->lock, flags); | 580 | spin_unlock_irqrestore(&priv->lock, flags); |
581 | } else | 581 | } else |
582 | ipoib_warn(priv, "cm recv completion event with wrid %d (> %d)\n", | 582 | ipoib_warn(priv, "cm recv completion event with wrid %d (> %d)\n", |
@@ -603,7 +603,7 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc) | |||
603 | spin_lock_irqsave(&priv->lock, flags); | 603 | spin_lock_irqsave(&priv->lock, flags); |
604 | list_move(&p->list, &priv->cm.rx_reap_list); | 604 | list_move(&p->list, &priv->cm.rx_reap_list); |
605 | spin_unlock_irqrestore(&priv->lock, flags); | 605 | spin_unlock_irqrestore(&priv->lock, flags); |
606 | queue_work(priv->wq, &priv->cm.rx_reap_task); | 606 | queue_work(ipoib_workqueue, &priv->cm.rx_reap_task); |
607 | } | 607 | } |
608 | return; | 608 | return; |
609 | } | 609 | } |
@@ -827,7 +827,7 @@ void ipoib_cm_handle_tx_wc(struct net_device *dev, struct ib_wc *wc) | |||
827 | 827 | ||
828 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { | 828 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { |
829 | list_move(&tx->list, &priv->cm.reap_list); | 829 | list_move(&tx->list, &priv->cm.reap_list); |
830 | queue_work(priv->wq, &priv->cm.reap_task); | 830 | queue_work(ipoib_workqueue, &priv->cm.reap_task); |
831 | } | 831 | } |
832 | 832 | ||
833 | clear_bit(IPOIB_FLAG_OPER_UP, &tx->flags); | 833 | clear_bit(IPOIB_FLAG_OPER_UP, &tx->flags); |
@@ -1255,7 +1255,7 @@ static int ipoib_cm_tx_handler(struct ib_cm_id *cm_id, | |||
1255 | 1255 | ||
1256 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { | 1256 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { |
1257 | list_move(&tx->list, &priv->cm.reap_list); | 1257 | list_move(&tx->list, &priv->cm.reap_list); |
1258 | queue_work(priv->wq, &priv->cm.reap_task); | 1258 | queue_work(ipoib_workqueue, &priv->cm.reap_task); |
1259 | } | 1259 | } |
1260 | 1260 | ||
1261 | spin_unlock_irqrestore(&priv->lock, flags); | 1261 | spin_unlock_irqrestore(&priv->lock, flags); |
@@ -1284,7 +1284,7 @@ struct ipoib_cm_tx *ipoib_cm_create_tx(struct net_device *dev, struct ipoib_path | |||
1284 | tx->dev = dev; | 1284 | tx->dev = dev; |
1285 | list_add(&tx->list, &priv->cm.start_list); | 1285 | list_add(&tx->list, &priv->cm.start_list); |
1286 | set_bit(IPOIB_FLAG_INITIALIZED, &tx->flags); | 1286 | set_bit(IPOIB_FLAG_INITIALIZED, &tx->flags); |
1287 | queue_work(priv->wq, &priv->cm.start_task); | 1287 | queue_work(ipoib_workqueue, &priv->cm.start_task); |
1288 | return tx; | 1288 | return tx; |
1289 | } | 1289 | } |
1290 | 1290 | ||
@@ -1295,7 +1295,7 @@ void ipoib_cm_destroy_tx(struct ipoib_cm_tx *tx) | |||
1295 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { | 1295 | if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &tx->flags)) { |
1296 | spin_lock_irqsave(&priv->lock, flags); | 1296 | spin_lock_irqsave(&priv->lock, flags); |
1297 | list_move(&tx->list, &priv->cm.reap_list); | 1297 | list_move(&tx->list, &priv->cm.reap_list); |
1298 | queue_work(priv->wq, &priv->cm.reap_task); | 1298 | queue_work(ipoib_workqueue, &priv->cm.reap_task); |
1299 | ipoib_dbg(priv, "Reap connection for gid %pI6\n", | 1299 | ipoib_dbg(priv, "Reap connection for gid %pI6\n", |
1300 | tx->neigh->daddr + 4); | 1300 | tx->neigh->daddr + 4); |
1301 | tx->neigh = NULL; | 1301 | tx->neigh = NULL; |
@@ -1417,7 +1417,7 @@ void ipoib_cm_skb_too_long(struct net_device *dev, struct sk_buff *skb, | |||
1417 | 1417 | ||
1418 | skb_queue_tail(&priv->cm.skb_queue, skb); | 1418 | skb_queue_tail(&priv->cm.skb_queue, skb); |
1419 | if (e) | 1419 | if (e) |
1420 | queue_work(priv->wq, &priv->cm.skb_task); | 1420 | queue_work(ipoib_workqueue, &priv->cm.skb_task); |
1421 | } | 1421 | } |
1422 | 1422 | ||
1423 | static void ipoib_cm_rx_reap(struct work_struct *work) | 1423 | static void ipoib_cm_rx_reap(struct work_struct *work) |
@@ -1450,7 +1450,7 @@ static void ipoib_cm_stale_task(struct work_struct *work) | |||
1450 | } | 1450 | } |
1451 | 1451 | ||
1452 | if (!list_empty(&priv->cm.passive_ids)) | 1452 | if (!list_empty(&priv->cm.passive_ids)) |
1453 | queue_delayed_work(priv->wq, | 1453 | queue_delayed_work(ipoib_workqueue, |
1454 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); | 1454 | &priv->cm.stale_task, IPOIB_CM_RX_DELAY); |
1455 | spin_unlock_irq(&priv->lock); | 1455 | spin_unlock_irq(&priv->lock); |
1456 | } | 1456 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c index fe65abb5150c..72626c348174 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | |||
@@ -655,7 +655,7 @@ void ipoib_reap_ah(struct work_struct *work) | |||
655 | __ipoib_reap_ah(dev); | 655 | __ipoib_reap_ah(dev); |
656 | 656 | ||
657 | if (!test_bit(IPOIB_STOP_REAPER, &priv->flags)) | 657 | if (!test_bit(IPOIB_STOP_REAPER, &priv->flags)) |
658 | queue_delayed_work(priv->wq, &priv->ah_reap_task, | 658 | queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, |
659 | round_jiffies_relative(HZ)); | 659 | round_jiffies_relative(HZ)); |
660 | } | 660 | } |
661 | 661 | ||
@@ -664,7 +664,7 @@ static void ipoib_ib_tx_timer_func(unsigned long ctx) | |||
664 | drain_tx_cq((struct net_device *)ctx); | 664 | drain_tx_cq((struct net_device *)ctx); |
665 | } | 665 | } |
666 | 666 | ||
667 | int ipoib_ib_dev_open(struct net_device *dev) | 667 | int ipoib_ib_dev_open(struct net_device *dev, int flush) |
668 | { | 668 | { |
669 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 669 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
670 | int ret; | 670 | int ret; |
@@ -696,7 +696,7 @@ int ipoib_ib_dev_open(struct net_device *dev) | |||
696 | } | 696 | } |
697 | 697 | ||
698 | clear_bit(IPOIB_STOP_REAPER, &priv->flags); | 698 | clear_bit(IPOIB_STOP_REAPER, &priv->flags); |
699 | queue_delayed_work(priv->wq, &priv->ah_reap_task, | 699 | queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, |
700 | round_jiffies_relative(HZ)); | 700 | round_jiffies_relative(HZ)); |
701 | 701 | ||
702 | if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) | 702 | if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) |
@@ -706,7 +706,7 @@ int ipoib_ib_dev_open(struct net_device *dev) | |||
706 | dev_stop: | 706 | dev_stop: |
707 | if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) | 707 | if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) |
708 | napi_enable(&priv->napi); | 708 | napi_enable(&priv->napi); |
709 | ipoib_ib_dev_stop(dev); | 709 | ipoib_ib_dev_stop(dev, flush); |
710 | return -1; | 710 | return -1; |
711 | } | 711 | } |
712 | 712 | ||
@@ -738,7 +738,7 @@ int ipoib_ib_dev_up(struct net_device *dev) | |||
738 | return ipoib_mcast_start_thread(dev); | 738 | return ipoib_mcast_start_thread(dev); |
739 | } | 739 | } |
740 | 740 | ||
741 | int ipoib_ib_dev_down(struct net_device *dev) | 741 | int ipoib_ib_dev_down(struct net_device *dev, int flush) |
742 | { | 742 | { |
743 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 743 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
744 | 744 | ||
@@ -747,7 +747,7 @@ int ipoib_ib_dev_down(struct net_device *dev) | |||
747 | clear_bit(IPOIB_FLAG_OPER_UP, &priv->flags); | 747 | clear_bit(IPOIB_FLAG_OPER_UP, &priv->flags); |
748 | netif_carrier_off(dev); | 748 | netif_carrier_off(dev); |
749 | 749 | ||
750 | ipoib_mcast_stop_thread(dev); | 750 | ipoib_mcast_stop_thread(dev, flush); |
751 | ipoib_mcast_dev_flush(dev); | 751 | ipoib_mcast_dev_flush(dev); |
752 | 752 | ||
753 | ipoib_flush_paths(dev); | 753 | ipoib_flush_paths(dev); |
@@ -807,7 +807,7 @@ void ipoib_drain_cq(struct net_device *dev) | |||
807 | local_bh_enable(); | 807 | local_bh_enable(); |
808 | } | 808 | } |
809 | 809 | ||
810 | int ipoib_ib_dev_stop(struct net_device *dev) | 810 | int ipoib_ib_dev_stop(struct net_device *dev, int flush) |
811 | { | 811 | { |
812 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 812 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
813 | struct ib_qp_attr qp_attr; | 813 | struct ib_qp_attr qp_attr; |
@@ -880,7 +880,8 @@ timeout: | |||
880 | /* Wait for all AHs to be reaped */ | 880 | /* Wait for all AHs to be reaped */ |
881 | set_bit(IPOIB_STOP_REAPER, &priv->flags); | 881 | set_bit(IPOIB_STOP_REAPER, &priv->flags); |
882 | cancel_delayed_work(&priv->ah_reap_task); | 882 | cancel_delayed_work(&priv->ah_reap_task); |
883 | flush_workqueue(priv->wq); | 883 | if (flush) |
884 | flush_workqueue(ipoib_workqueue); | ||
884 | 885 | ||
885 | begin = jiffies; | 886 | begin = jiffies; |
886 | 887 | ||
@@ -917,7 +918,7 @@ int ipoib_ib_dev_init(struct net_device *dev, struct ib_device *ca, int port) | |||
917 | (unsigned long) dev); | 918 | (unsigned long) dev); |
918 | 919 | ||
919 | if (dev->flags & IFF_UP) { | 920 | if (dev->flags & IFF_UP) { |
920 | if (ipoib_ib_dev_open(dev)) { | 921 | if (ipoib_ib_dev_open(dev, 1)) { |
921 | ipoib_transport_dev_cleanup(dev); | 922 | ipoib_transport_dev_cleanup(dev); |
922 | return -ENODEV; | 923 | return -ENODEV; |
923 | } | 924 | } |
@@ -1039,12 +1040,12 @@ static void __ipoib_ib_dev_flush(struct ipoib_dev_priv *priv, | |||
1039 | } | 1040 | } |
1040 | 1041 | ||
1041 | if (level >= IPOIB_FLUSH_NORMAL) | 1042 | if (level >= IPOIB_FLUSH_NORMAL) |
1042 | ipoib_ib_dev_down(dev); | 1043 | ipoib_ib_dev_down(dev, 0); |
1043 | 1044 | ||
1044 | if (level == IPOIB_FLUSH_HEAVY) { | 1045 | if (level == IPOIB_FLUSH_HEAVY) { |
1045 | if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) | 1046 | if (test_bit(IPOIB_FLAG_INITIALIZED, &priv->flags)) |
1046 | ipoib_ib_dev_stop(dev); | 1047 | ipoib_ib_dev_stop(dev, 0); |
1047 | if (ipoib_ib_dev_open(dev) != 0) | 1048 | if (ipoib_ib_dev_open(dev, 0) != 0) |
1048 | return; | 1049 | return; |
1049 | if (netif_queue_stopped(dev)) | 1050 | if (netif_queue_stopped(dev)) |
1050 | netif_start_queue(dev); | 1051 | netif_start_queue(dev); |
@@ -1096,7 +1097,7 @@ void ipoib_ib_dev_cleanup(struct net_device *dev) | |||
1096 | */ | 1097 | */ |
1097 | ipoib_flush_paths(dev); | 1098 | ipoib_flush_paths(dev); |
1098 | 1099 | ||
1099 | ipoib_mcast_stop_thread(dev); | 1100 | ipoib_mcast_stop_thread(dev, 1); |
1100 | ipoib_mcast_dev_flush(dev); | 1101 | ipoib_mcast_dev_flush(dev); |
1101 | 1102 | ||
1102 | ipoib_transport_dev_cleanup(dev); | 1103 | ipoib_transport_dev_cleanup(dev); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 6bad17d4d588..58b5aa3b6f2d 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -108,7 +108,7 @@ int ipoib_open(struct net_device *dev) | |||
108 | 108 | ||
109 | set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); | 109 | set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); |
110 | 110 | ||
111 | if (ipoib_ib_dev_open(dev)) { | 111 | if (ipoib_ib_dev_open(dev, 1)) { |
112 | if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) | 112 | if (!test_bit(IPOIB_PKEY_ASSIGNED, &priv->flags)) |
113 | return 0; | 113 | return 0; |
114 | goto err_disable; | 114 | goto err_disable; |
@@ -139,7 +139,7 @@ int ipoib_open(struct net_device *dev) | |||
139 | return 0; | 139 | return 0; |
140 | 140 | ||
141 | err_stop: | 141 | err_stop: |
142 | ipoib_ib_dev_stop(dev); | 142 | ipoib_ib_dev_stop(dev, 1); |
143 | 143 | ||
144 | err_disable: | 144 | err_disable: |
145 | clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); | 145 | clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags); |
@@ -157,8 +157,8 @@ static int ipoib_stop(struct net_device *dev) | |||
157 | 157 | ||
158 | netif_stop_queue(dev); | 158 | netif_stop_queue(dev); |
159 | 159 | ||
160 | ipoib_ib_dev_down(dev); | 160 | ipoib_ib_dev_down(dev, 1); |
161 | ipoib_ib_dev_stop(dev); | 161 | ipoib_ib_dev_stop(dev, 0); |
162 | 162 | ||
163 | if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { | 163 | if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { |
164 | struct ipoib_dev_priv *cpriv; | 164 | struct ipoib_dev_priv *cpriv; |
@@ -839,7 +839,7 @@ static void ipoib_set_mcast_list(struct net_device *dev) | |||
839 | return; | 839 | return; |
840 | } | 840 | } |
841 | 841 | ||
842 | queue_work(priv->wq, &priv->restart_task); | 842 | queue_work(ipoib_workqueue, &priv->restart_task); |
843 | } | 843 | } |
844 | 844 | ||
845 | static u32 ipoib_addr_hash(struct ipoib_neigh_hash *htbl, u8 *daddr) | 845 | static u32 ipoib_addr_hash(struct ipoib_neigh_hash *htbl, u8 *daddr) |
@@ -954,7 +954,7 @@ static void ipoib_reap_neigh(struct work_struct *work) | |||
954 | __ipoib_reap_neigh(priv); | 954 | __ipoib_reap_neigh(priv); |
955 | 955 | ||
956 | if (!test_bit(IPOIB_STOP_NEIGH_GC, &priv->flags)) | 956 | if (!test_bit(IPOIB_STOP_NEIGH_GC, &priv->flags)) |
957 | queue_delayed_work(priv->wq, &priv->neigh_reap_task, | 957 | queue_delayed_work(ipoib_workqueue, &priv->neigh_reap_task, |
958 | arp_tbl.gc_interval); | 958 | arp_tbl.gc_interval); |
959 | } | 959 | } |
960 | 960 | ||
@@ -1133,7 +1133,7 @@ static int ipoib_neigh_hash_init(struct ipoib_dev_priv *priv) | |||
1133 | 1133 | ||
1134 | /* start garbage collection */ | 1134 | /* start garbage collection */ |
1135 | clear_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); | 1135 | clear_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); |
1136 | queue_delayed_work(priv->wq, &priv->neigh_reap_task, | 1136 | queue_delayed_work(ipoib_workqueue, &priv->neigh_reap_task, |
1137 | arp_tbl.gc_interval); | 1137 | arp_tbl.gc_interval); |
1138 | 1138 | ||
1139 | return 0; | 1139 | return 0; |
@@ -1262,13 +1262,15 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) | |||
1262 | { | 1262 | { |
1263 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 1263 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
1264 | 1264 | ||
1265 | if (ipoib_neigh_hash_init(priv) < 0) | ||
1266 | goto out; | ||
1265 | /* Allocate RX/TX "rings" to hold queued skbs */ | 1267 | /* Allocate RX/TX "rings" to hold queued skbs */ |
1266 | priv->rx_ring = kzalloc(ipoib_recvq_size * sizeof *priv->rx_ring, | 1268 | priv->rx_ring = kzalloc(ipoib_recvq_size * sizeof *priv->rx_ring, |
1267 | GFP_KERNEL); | 1269 | GFP_KERNEL); |
1268 | if (!priv->rx_ring) { | 1270 | if (!priv->rx_ring) { |
1269 | printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n", | 1271 | printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n", |
1270 | ca->name, ipoib_recvq_size); | 1272 | ca->name, ipoib_recvq_size); |
1271 | goto out; | 1273 | goto out_neigh_hash_cleanup; |
1272 | } | 1274 | } |
1273 | 1275 | ||
1274 | priv->tx_ring = vzalloc(ipoib_sendq_size * sizeof *priv->tx_ring); | 1276 | priv->tx_ring = vzalloc(ipoib_sendq_size * sizeof *priv->tx_ring); |
@@ -1283,24 +1285,16 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) | |||
1283 | if (ipoib_ib_dev_init(dev, ca, port)) | 1285 | if (ipoib_ib_dev_init(dev, ca, port)) |
1284 | goto out_tx_ring_cleanup; | 1286 | goto out_tx_ring_cleanup; |
1285 | 1287 | ||
1286 | /* | ||
1287 | * Must be after ipoib_ib_dev_init so we can allocate a per | ||
1288 | * device wq there and use it here | ||
1289 | */ | ||
1290 | if (ipoib_neigh_hash_init(priv) < 0) | ||
1291 | goto out_dev_uninit; | ||
1292 | |||
1293 | return 0; | 1288 | return 0; |
1294 | 1289 | ||
1295 | out_dev_uninit: | ||
1296 | ipoib_ib_dev_cleanup(dev); | ||
1297 | |||
1298 | out_tx_ring_cleanup: | 1290 | out_tx_ring_cleanup: |
1299 | vfree(priv->tx_ring); | 1291 | vfree(priv->tx_ring); |
1300 | 1292 | ||
1301 | out_rx_ring_cleanup: | 1293 | out_rx_ring_cleanup: |
1302 | kfree(priv->rx_ring); | 1294 | kfree(priv->rx_ring); |
1303 | 1295 | ||
1296 | out_neigh_hash_cleanup: | ||
1297 | ipoib_neigh_hash_uninit(dev); | ||
1304 | out: | 1298 | out: |
1305 | return -ENOMEM; | 1299 | return -ENOMEM; |
1306 | } | 1300 | } |
@@ -1323,12 +1317,6 @@ void ipoib_dev_cleanup(struct net_device *dev) | |||
1323 | } | 1317 | } |
1324 | unregister_netdevice_many(&head); | 1318 | unregister_netdevice_many(&head); |
1325 | 1319 | ||
1326 | /* | ||
1327 | * Must be before ipoib_ib_dev_cleanup or we delete an in use | ||
1328 | * work queue | ||
1329 | */ | ||
1330 | ipoib_neigh_hash_uninit(dev); | ||
1331 | |||
1332 | ipoib_ib_dev_cleanup(dev); | 1320 | ipoib_ib_dev_cleanup(dev); |
1333 | 1321 | ||
1334 | kfree(priv->rx_ring); | 1322 | kfree(priv->rx_ring); |
@@ -1336,6 +1324,8 @@ void ipoib_dev_cleanup(struct net_device *dev) | |||
1336 | 1324 | ||
1337 | priv->rx_ring = NULL; | 1325 | priv->rx_ring = NULL; |
1338 | priv->tx_ring = NULL; | 1326 | priv->tx_ring = NULL; |
1327 | |||
1328 | ipoib_neigh_hash_uninit(dev); | ||
1339 | } | 1329 | } |
1340 | 1330 | ||
1341 | static const struct header_ops ipoib_header_ops = { | 1331 | static const struct header_ops ipoib_header_ops = { |
@@ -1646,7 +1636,7 @@ register_failed: | |||
1646 | /* Stop GC if started before flush */ | 1636 | /* Stop GC if started before flush */ |
1647 | set_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); | 1637 | set_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); |
1648 | cancel_delayed_work(&priv->neigh_reap_task); | 1638 | cancel_delayed_work(&priv->neigh_reap_task); |
1649 | flush_workqueue(priv->wq); | 1639 | flush_workqueue(ipoib_workqueue); |
1650 | 1640 | ||
1651 | event_failed: | 1641 | event_failed: |
1652 | ipoib_dev_cleanup(priv->dev); | 1642 | ipoib_dev_cleanup(priv->dev); |
@@ -1717,7 +1707,7 @@ static void ipoib_remove_one(struct ib_device *device) | |||
1717 | /* Stop GC */ | 1707 | /* Stop GC */ |
1718 | set_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); | 1708 | set_bit(IPOIB_STOP_NEIGH_GC, &priv->flags); |
1719 | cancel_delayed_work(&priv->neigh_reap_task); | 1709 | cancel_delayed_work(&priv->neigh_reap_task); |
1720 | flush_workqueue(priv->wq); | 1710 | flush_workqueue(ipoib_workqueue); |
1721 | 1711 | ||
1722 | unregister_netdev(priv->dev); | 1712 | unregister_netdev(priv->dev); |
1723 | free_netdev(priv->dev); | 1713 | free_netdev(priv->dev); |
@@ -1758,13 +1748,8 @@ static int __init ipoib_init_module(void) | |||
1758 | * unregister_netdev() and linkwatch_event take the rtnl lock, | 1748 | * unregister_netdev() and linkwatch_event take the rtnl lock, |
1759 | * so flush_scheduled_work() can deadlock during device | 1749 | * so flush_scheduled_work() can deadlock during device |
1760 | * removal. | 1750 | * removal. |
1761 | * | ||
1762 | * In addition, bringing one device up and another down at the | ||
1763 | * same time can deadlock a single workqueue, so we have this | ||
1764 | * global fallback workqueue, but we also attempt to open a | ||
1765 | * per device workqueue each time we bring an interface up | ||
1766 | */ | 1751 | */ |
1767 | ipoib_workqueue = create_singlethread_workqueue("ipoib_flush"); | 1752 | ipoib_workqueue = create_singlethread_workqueue("ipoib"); |
1768 | if (!ipoib_workqueue) { | 1753 | if (!ipoib_workqueue) { |
1769 | ret = -ENOMEM; | 1754 | ret = -ENOMEM; |
1770 | goto err_fs; | 1755 | goto err_fs; |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index bc50dd0d0e4d..ffb83b5f7e80 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
@@ -190,6 +190,12 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, | |||
190 | spin_unlock_irq(&priv->lock); | 190 | spin_unlock_irq(&priv->lock); |
191 | priv->tx_wr.wr.ud.remote_qkey = priv->qkey; | 191 | priv->tx_wr.wr.ud.remote_qkey = priv->qkey; |
192 | set_qkey = 1; | 192 | set_qkey = 1; |
193 | |||
194 | if (!ipoib_cm_admin_enabled(dev)) { | ||
195 | rtnl_lock(); | ||
196 | dev_set_mtu(dev, min(priv->mcast_mtu, priv->admin_mtu)); | ||
197 | rtnl_unlock(); | ||
198 | } | ||
193 | } | 199 | } |
194 | 200 | ||
195 | if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { | 201 | if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { |
@@ -271,27 +277,16 @@ ipoib_mcast_sendonly_join_complete(int status, | |||
271 | struct ipoib_mcast *mcast = multicast->context; | 277 | struct ipoib_mcast *mcast = multicast->context; |
272 | struct net_device *dev = mcast->dev; | 278 | struct net_device *dev = mcast->dev; |
273 | 279 | ||
274 | /* | ||
275 | * We have to take the mutex to force mcast_sendonly_join to | ||
276 | * return from ib_sa_multicast_join and set mcast->mc to a | ||
277 | * valid value. Otherwise we were racing with ourselves in | ||
278 | * that we might fail here, but get a valid return from | ||
279 | * ib_sa_multicast_join after we had cleared mcast->mc here, | ||
280 | * resulting in mis-matched joins and leaves and a deadlock | ||
281 | */ | ||
282 | mutex_lock(&mcast_mutex); | ||
283 | |||
284 | /* We trap for port events ourselves. */ | 280 | /* We trap for port events ourselves. */ |
285 | if (status == -ENETRESET) | 281 | if (status == -ENETRESET) |
286 | goto out; | 282 | return 0; |
287 | 283 | ||
288 | if (!status) | 284 | if (!status) |
289 | status = ipoib_mcast_join_finish(mcast, &multicast->rec); | 285 | status = ipoib_mcast_join_finish(mcast, &multicast->rec); |
290 | 286 | ||
291 | if (status) { | 287 | if (status) { |
292 | if (mcast->logcount++ < 20) | 288 | if (mcast->logcount++ < 20) |
293 | ipoib_dbg_mcast(netdev_priv(dev), "sendonly multicast " | 289 | ipoib_dbg_mcast(netdev_priv(dev), "multicast join failed for %pI6, status %d\n", |
294 | "join failed for %pI6, status %d\n", | ||
295 | mcast->mcmember.mgid.raw, status); | 290 | mcast->mcmember.mgid.raw, status); |
296 | 291 | ||
297 | /* Flush out any queued packets */ | 292 | /* Flush out any queued packets */ |
@@ -301,15 +296,11 @@ ipoib_mcast_sendonly_join_complete(int status, | |||
301 | dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue)); | 296 | dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue)); |
302 | } | 297 | } |
303 | netif_tx_unlock_bh(dev); | 298 | netif_tx_unlock_bh(dev); |
299 | |||
300 | /* Clear the busy flag so we try again */ | ||
301 | status = test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, | ||
302 | &mcast->flags); | ||
304 | } | 303 | } |
305 | out: | ||
306 | clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | ||
307 | if (status) | ||
308 | mcast->mc = NULL; | ||
309 | complete(&mcast->done); | ||
310 | if (status == -ENETRESET) | ||
311 | status = 0; | ||
312 | mutex_unlock(&mcast_mutex); | ||
313 | return status; | 304 | return status; |
314 | } | 305 | } |
315 | 306 | ||
@@ -327,14 +318,12 @@ static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) | |||
327 | int ret = 0; | 318 | int ret = 0; |
328 | 319 | ||
329 | if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)) { | 320 | if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)) { |
330 | ipoib_dbg_mcast(priv, "device shutting down, no sendonly " | 321 | ipoib_dbg_mcast(priv, "device shutting down, no multicast joins\n"); |
331 | "multicast joins\n"); | ||
332 | return -ENODEV; | 322 | return -ENODEV; |
333 | } | 323 | } |
334 | 324 | ||
335 | if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { | 325 | if (test_and_set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { |
336 | ipoib_dbg_mcast(priv, "multicast entry busy, skipping " | 326 | ipoib_dbg_mcast(priv, "multicast entry busy, skipping\n"); |
337 | "sendonly join\n"); | ||
338 | return -EBUSY; | 327 | return -EBUSY; |
339 | } | 328 | } |
340 | 329 | ||
@@ -342,9 +331,6 @@ static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) | |||
342 | rec.port_gid = priv->local_gid; | 331 | rec.port_gid = priv->local_gid; |
343 | rec.pkey = cpu_to_be16(priv->pkey); | 332 | rec.pkey = cpu_to_be16(priv->pkey); |
344 | 333 | ||
345 | mutex_lock(&mcast_mutex); | ||
346 | init_completion(&mcast->done); | ||
347 | set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | ||
348 | mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, | 334 | mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, |
349 | priv->port, &rec, | 335 | priv->port, &rec, |
350 | IB_SA_MCMEMBER_REC_MGID | | 336 | IB_SA_MCMEMBER_REC_MGID | |
@@ -357,14 +343,12 @@ static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) | |||
357 | if (IS_ERR(mcast->mc)) { | 343 | if (IS_ERR(mcast->mc)) { |
358 | ret = PTR_ERR(mcast->mc); | 344 | ret = PTR_ERR(mcast->mc); |
359 | clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | 345 | clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); |
360 | complete(&mcast->done); | 346 | ipoib_warn(priv, "ib_sa_join_multicast failed (ret = %d)\n", |
361 | ipoib_warn(priv, "ib_sa_join_multicast for sendonly join " | 347 | ret); |
362 | "failed (ret = %d)\n", ret); | ||
363 | } else { | 348 | } else { |
364 | ipoib_dbg_mcast(priv, "no multicast record for %pI6, starting " | 349 | ipoib_dbg_mcast(priv, "no multicast record for %pI6, starting join\n", |
365 | "sendonly join\n", mcast->mcmember.mgid.raw); | 350 | mcast->mcmember.mgid.raw); |
366 | } | 351 | } |
367 | mutex_unlock(&mcast_mutex); | ||
368 | 352 | ||
369 | return ret; | 353 | return ret; |
370 | } | 354 | } |
@@ -375,29 +359,18 @@ void ipoib_mcast_carrier_on_task(struct work_struct *work) | |||
375 | carrier_on_task); | 359 | carrier_on_task); |
376 | struct ib_port_attr attr; | 360 | struct ib_port_attr attr; |
377 | 361 | ||
362 | /* | ||
363 | * Take rtnl_lock to avoid racing with ipoib_stop() and | ||
364 | * turning the carrier back on while a device is being | ||
365 | * removed. | ||
366 | */ | ||
378 | if (ib_query_port(priv->ca, priv->port, &attr) || | 367 | if (ib_query_port(priv->ca, priv->port, &attr) || |
379 | attr.state != IB_PORT_ACTIVE) { | 368 | attr.state != IB_PORT_ACTIVE) { |
380 | ipoib_dbg(priv, "Keeping carrier off until IB port is active\n"); | 369 | ipoib_dbg(priv, "Keeping carrier off until IB port is active\n"); |
381 | return; | 370 | return; |
382 | } | 371 | } |
383 | 372 | ||
384 | /* | 373 | rtnl_lock(); |
385 | * Take rtnl_lock to avoid racing with ipoib_stop() and | ||
386 | * turning the carrier back on while a device is being | ||
387 | * removed. However, ipoib_stop() will attempt to flush | ||
388 | * the workqueue while holding the rtnl lock, so loop | ||
389 | * on trylock until either we get the lock or we see | ||
390 | * FLAG_ADMIN_UP go away as that signals that we are bailing | ||
391 | * and can safely ignore the carrier on work. | ||
392 | */ | ||
393 | while (!rtnl_trylock()) { | ||
394 | if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) | ||
395 | return; | ||
396 | else | ||
397 | msleep(20); | ||
398 | } | ||
399 | if (!ipoib_cm_admin_enabled(priv->dev)) | ||
400 | dev_set_mtu(priv->dev, min(priv->mcast_mtu, priv->admin_mtu)); | ||
401 | netif_carrier_on(priv->dev); | 374 | netif_carrier_on(priv->dev); |
402 | rtnl_unlock(); | 375 | rtnl_unlock(); |
403 | } | 376 | } |
@@ -412,63 +385,60 @@ static int ipoib_mcast_join_complete(int status, | |||
412 | ipoib_dbg_mcast(priv, "join completion for %pI6 (status %d)\n", | 385 | ipoib_dbg_mcast(priv, "join completion for %pI6 (status %d)\n", |
413 | mcast->mcmember.mgid.raw, status); | 386 | mcast->mcmember.mgid.raw, status); |
414 | 387 | ||
415 | /* | ||
416 | * We have to take the mutex to force mcast_join to | ||
417 | * return from ib_sa_multicast_join and set mcast->mc to a | ||
418 | * valid value. Otherwise we were racing with ourselves in | ||
419 | * that we might fail here, but get a valid return from | ||
420 | * ib_sa_multicast_join after we had cleared mcast->mc here, | ||
421 | * resulting in mis-matched joins and leaves and a deadlock | ||
422 | */ | ||
423 | mutex_lock(&mcast_mutex); | ||
424 | |||
425 | /* We trap for port events ourselves. */ | 388 | /* We trap for port events ourselves. */ |
426 | if (status == -ENETRESET) | 389 | if (status == -ENETRESET) { |
390 | status = 0; | ||
427 | goto out; | 391 | goto out; |
392 | } | ||
428 | 393 | ||
429 | if (!status) | 394 | if (!status) |
430 | status = ipoib_mcast_join_finish(mcast, &multicast->rec); | 395 | status = ipoib_mcast_join_finish(mcast, &multicast->rec); |
431 | 396 | ||
432 | if (!status) { | 397 | if (!status) { |
433 | mcast->backoff = 1; | 398 | mcast->backoff = 1; |
399 | mutex_lock(&mcast_mutex); | ||
434 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) | 400 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) |
435 | queue_delayed_work(priv->wq, &priv->mcast_task, 0); | 401 | queue_delayed_work(ipoib_workqueue, |
402 | &priv->mcast_task, 0); | ||
403 | mutex_unlock(&mcast_mutex); | ||
436 | 404 | ||
437 | /* | 405 | /* |
438 | * Defer carrier on work to priv->wq to avoid a | 406 | * Defer carrier on work to ipoib_workqueue to avoid a |
439 | * deadlock on rtnl_lock here. | 407 | * deadlock on rtnl_lock here. |
440 | */ | 408 | */ |
441 | if (mcast == priv->broadcast) | 409 | if (mcast == priv->broadcast) |
442 | queue_work(priv->wq, &priv->carrier_on_task); | 410 | queue_work(ipoib_workqueue, &priv->carrier_on_task); |
443 | } else { | ||
444 | if (mcast->logcount++ < 20) { | ||
445 | if (status == -ETIMEDOUT || status == -EAGAIN) { | ||
446 | ipoib_dbg_mcast(priv, "multicast join failed for %pI6, status %d\n", | ||
447 | mcast->mcmember.mgid.raw, status); | ||
448 | } else { | ||
449 | ipoib_warn(priv, "multicast join failed for %pI6, status %d\n", | ||
450 | mcast->mcmember.mgid.raw, status); | ||
451 | } | ||
452 | } | ||
453 | 411 | ||
454 | mcast->backoff *= 2; | 412 | status = 0; |
455 | if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) | 413 | goto out; |
456 | mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; | ||
457 | } | 414 | } |
458 | out: | 415 | |
416 | if (mcast->logcount++ < 20) { | ||
417 | if (status == -ETIMEDOUT || status == -EAGAIN) { | ||
418 | ipoib_dbg_mcast(priv, "multicast join failed for %pI6, status %d\n", | ||
419 | mcast->mcmember.mgid.raw, status); | ||
420 | } else { | ||
421 | ipoib_warn(priv, "multicast join failed for %pI6, status %d\n", | ||
422 | mcast->mcmember.mgid.raw, status); | ||
423 | } | ||
424 | } | ||
425 | |||
426 | mcast->backoff *= 2; | ||
427 | if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) | ||
428 | mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; | ||
429 | |||
430 | /* Clear the busy flag so we try again */ | ||
431 | status = test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | ||
432 | |||
433 | mutex_lock(&mcast_mutex); | ||
459 | spin_lock_irq(&priv->lock); | 434 | spin_lock_irq(&priv->lock); |
460 | clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | 435 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) |
461 | if (status) | 436 | queue_delayed_work(ipoib_workqueue, &priv->mcast_task, |
462 | mcast->mc = NULL; | ||
463 | complete(&mcast->done); | ||
464 | if (status == -ENETRESET) | ||
465 | status = 0; | ||
466 | if (status && test_bit(IPOIB_MCAST_RUN, &priv->flags)) | ||
467 | queue_delayed_work(priv->wq, &priv->mcast_task, | ||
468 | mcast->backoff * HZ); | 437 | mcast->backoff * HZ); |
469 | spin_unlock_irq(&priv->lock); | 438 | spin_unlock_irq(&priv->lock); |
470 | mutex_unlock(&mcast_mutex); | 439 | mutex_unlock(&mcast_mutex); |
471 | 440 | out: | |
441 | complete(&mcast->done); | ||
472 | return status; | 442 | return status; |
473 | } | 443 | } |
474 | 444 | ||
@@ -517,9 +487,10 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast, | |||
517 | rec.hop_limit = priv->broadcast->mcmember.hop_limit; | 487 | rec.hop_limit = priv->broadcast->mcmember.hop_limit; |
518 | } | 488 | } |
519 | 489 | ||
520 | mutex_lock(&mcast_mutex); | ||
521 | init_completion(&mcast->done); | ||
522 | set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); | 490 | set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); |
491 | init_completion(&mcast->done); | ||
492 | set_bit(IPOIB_MCAST_JOIN_STARTED, &mcast->flags); | ||
493 | |||
523 | mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, priv->port, | 494 | mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, priv->port, |
524 | &rec, comp_mask, GFP_KERNEL, | 495 | &rec, comp_mask, GFP_KERNEL, |
525 | ipoib_mcast_join_complete, mcast); | 496 | ipoib_mcast_join_complete, mcast); |
@@ -533,11 +504,13 @@ static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast, | |||
533 | if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) | 504 | if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) |
534 | mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; | 505 | mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; |
535 | 506 | ||
507 | mutex_lock(&mcast_mutex); | ||
536 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) | 508 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) |
537 | queue_delayed_work(priv->wq, &priv->mcast_task, | 509 | queue_delayed_work(ipoib_workqueue, |
510 | &priv->mcast_task, | ||
538 | mcast->backoff * HZ); | 511 | mcast->backoff * HZ); |
512 | mutex_unlock(&mcast_mutex); | ||
539 | } | 513 | } |
540 | mutex_unlock(&mcast_mutex); | ||
541 | } | 514 | } |
542 | 515 | ||
543 | void ipoib_mcast_join_task(struct work_struct *work) | 516 | void ipoib_mcast_join_task(struct work_struct *work) |
@@ -574,8 +547,8 @@ void ipoib_mcast_join_task(struct work_struct *work) | |||
574 | ipoib_warn(priv, "failed to allocate broadcast group\n"); | 547 | ipoib_warn(priv, "failed to allocate broadcast group\n"); |
575 | mutex_lock(&mcast_mutex); | 548 | mutex_lock(&mcast_mutex); |
576 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) | 549 | if (test_bit(IPOIB_MCAST_RUN, &priv->flags)) |
577 | queue_delayed_work(priv->wq, &priv->mcast_task, | 550 | queue_delayed_work(ipoib_workqueue, |
578 | HZ); | 551 | &priv->mcast_task, HZ); |
579 | mutex_unlock(&mcast_mutex); | 552 | mutex_unlock(&mcast_mutex); |
580 | return; | 553 | return; |
581 | } | 554 | } |
@@ -590,8 +563,7 @@ void ipoib_mcast_join_task(struct work_struct *work) | |||
590 | } | 563 | } |
591 | 564 | ||
592 | if (!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) { | 565 | if (!test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) { |
593 | if (IS_ERR_OR_NULL(priv->broadcast->mc) && | 566 | if (!test_bit(IPOIB_MCAST_FLAG_BUSY, &priv->broadcast->flags)) |
594 | !test_bit(IPOIB_MCAST_FLAG_BUSY, &priv->broadcast->flags)) | ||
595 | ipoib_mcast_join(dev, priv->broadcast, 0); | 567 | ipoib_mcast_join(dev, priv->broadcast, 0); |
596 | return; | 568 | return; |
597 | } | 569 | } |
@@ -599,33 +571,23 @@ void ipoib_mcast_join_task(struct work_struct *work) | |||
599 | while (1) { | 571 | while (1) { |
600 | struct ipoib_mcast *mcast = NULL; | 572 | struct ipoib_mcast *mcast = NULL; |
601 | 573 | ||
602 | /* | ||
603 | * Need the mutex so our flags are consistent, need the | ||
604 | * priv->lock so we don't race with list removals in either | ||
605 | * mcast_dev_flush or mcast_restart_task | ||
606 | */ | ||
607 | mutex_lock(&mcast_mutex); | ||
608 | spin_lock_irq(&priv->lock); | 574 | spin_lock_irq(&priv->lock); |
609 | list_for_each_entry(mcast, &priv->multicast_list, list) { | 575 | list_for_each_entry(mcast, &priv->multicast_list, list) { |
610 | if (IS_ERR_OR_NULL(mcast->mc) && | 576 | if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) |
611 | !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) && | 577 | && !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) |
612 | !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { | 578 | && !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { |
613 | /* Found the next unjoined group */ | 579 | /* Found the next unjoined group */ |
614 | break; | 580 | break; |
615 | } | 581 | } |
616 | } | 582 | } |
617 | spin_unlock_irq(&priv->lock); | 583 | spin_unlock_irq(&priv->lock); |
618 | mutex_unlock(&mcast_mutex); | ||
619 | 584 | ||
620 | if (&mcast->list == &priv->multicast_list) { | 585 | if (&mcast->list == &priv->multicast_list) { |
621 | /* All done */ | 586 | /* All done */ |
622 | break; | 587 | break; |
623 | } | 588 | } |
624 | 589 | ||
625 | if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) | 590 | ipoib_mcast_join(dev, mcast, 1); |
626 | ipoib_mcast_sendonly_join(mcast); | ||
627 | else | ||
628 | ipoib_mcast_join(dev, mcast, 1); | ||
629 | return; | 591 | return; |
630 | } | 592 | } |
631 | 593 | ||
@@ -642,13 +604,13 @@ int ipoib_mcast_start_thread(struct net_device *dev) | |||
642 | 604 | ||
643 | mutex_lock(&mcast_mutex); | 605 | mutex_lock(&mcast_mutex); |
644 | if (!test_and_set_bit(IPOIB_MCAST_RUN, &priv->flags)) | 606 | if (!test_and_set_bit(IPOIB_MCAST_RUN, &priv->flags)) |
645 | queue_delayed_work(priv->wq, &priv->mcast_task, 0); | 607 | queue_delayed_work(ipoib_workqueue, &priv->mcast_task, 0); |
646 | mutex_unlock(&mcast_mutex); | 608 | mutex_unlock(&mcast_mutex); |
647 | 609 | ||
648 | return 0; | 610 | return 0; |
649 | } | 611 | } |
650 | 612 | ||
651 | int ipoib_mcast_stop_thread(struct net_device *dev) | 613 | int ipoib_mcast_stop_thread(struct net_device *dev, int flush) |
652 | { | 614 | { |
653 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 615 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
654 | 616 | ||
@@ -659,7 +621,8 @@ int ipoib_mcast_stop_thread(struct net_device *dev) | |||
659 | cancel_delayed_work(&priv->mcast_task); | 621 | cancel_delayed_work(&priv->mcast_task); |
660 | mutex_unlock(&mcast_mutex); | 622 | mutex_unlock(&mcast_mutex); |
661 | 623 | ||
662 | flush_workqueue(priv->wq); | 624 | if (flush) |
625 | flush_workqueue(ipoib_workqueue); | ||
663 | 626 | ||
664 | return 0; | 627 | return 0; |
665 | } | 628 | } |
@@ -670,9 +633,6 @@ static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) | |||
670 | int ret = 0; | 633 | int ret = 0; |
671 | 634 | ||
672 | if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) | 635 | if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) |
673 | ipoib_warn(priv, "ipoib_mcast_leave on an in-flight join\n"); | ||
674 | |||
675 | if (!IS_ERR_OR_NULL(mcast->mc)) | ||
676 | ib_sa_free_multicast(mcast->mc); | 636 | ib_sa_free_multicast(mcast->mc); |
677 | 637 | ||
678 | if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { | 638 | if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { |
@@ -725,8 +685,6 @@ void ipoib_mcast_send(struct net_device *dev, u8 *daddr, struct sk_buff *skb) | |||
725 | memcpy(mcast->mcmember.mgid.raw, mgid, sizeof (union ib_gid)); | 685 | memcpy(mcast->mcmember.mgid.raw, mgid, sizeof (union ib_gid)); |
726 | __ipoib_mcast_add(dev, mcast); | 686 | __ipoib_mcast_add(dev, mcast); |
727 | list_add_tail(&mcast->list, &priv->multicast_list); | 687 | list_add_tail(&mcast->list, &priv->multicast_list); |
728 | if (!test_and_set_bit(IPOIB_MCAST_RUN, &priv->flags)) | ||
729 | queue_delayed_work(priv->wq, &priv->mcast_task, 0); | ||
730 | } | 688 | } |
731 | 689 | ||
732 | if (!mcast->ah) { | 690 | if (!mcast->ah) { |
@@ -740,6 +698,8 @@ void ipoib_mcast_send(struct net_device *dev, u8 *daddr, struct sk_buff *skb) | |||
740 | if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) | 698 | if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) |
741 | ipoib_dbg_mcast(priv, "no address vector, " | 699 | ipoib_dbg_mcast(priv, "no address vector, " |
742 | "but multicast join already started\n"); | 700 | "but multicast join already started\n"); |
701 | else if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) | ||
702 | ipoib_mcast_sendonly_join(mcast); | ||
743 | 703 | ||
744 | /* | 704 | /* |
745 | * If lookup completes between here and out:, don't | 705 | * If lookup completes between here and out:, don't |
@@ -799,12 +759,9 @@ void ipoib_mcast_dev_flush(struct net_device *dev) | |||
799 | 759 | ||
800 | spin_unlock_irqrestore(&priv->lock, flags); | 760 | spin_unlock_irqrestore(&priv->lock, flags); |
801 | 761 | ||
802 | /* | 762 | /* seperate between the wait to the leave*/ |
803 | * make sure the in-flight joins have finished before we attempt | ||
804 | * to leave | ||
805 | */ | ||
806 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) | 763 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) |
807 | if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) | 764 | if (test_bit(IPOIB_MCAST_JOIN_STARTED, &mcast->flags)) |
808 | wait_for_completion(&mcast->done); | 765 | wait_for_completion(&mcast->done); |
809 | 766 | ||
810 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { | 767 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { |
@@ -837,6 +794,8 @@ void ipoib_mcast_restart_task(struct work_struct *work) | |||
837 | 794 | ||
838 | ipoib_dbg_mcast(priv, "restarting multicast task\n"); | 795 | ipoib_dbg_mcast(priv, "restarting multicast task\n"); |
839 | 796 | ||
797 | ipoib_mcast_stop_thread(dev, 0); | ||
798 | |||
840 | local_irq_save(flags); | 799 | local_irq_save(flags); |
841 | netif_addr_lock(dev); | 800 | netif_addr_lock(dev); |
842 | spin_lock(&priv->lock); | 801 | spin_lock(&priv->lock); |
@@ -921,38 +880,14 @@ void ipoib_mcast_restart_task(struct work_struct *work) | |||
921 | netif_addr_unlock(dev); | 880 | netif_addr_unlock(dev); |
922 | local_irq_restore(flags); | 881 | local_irq_restore(flags); |
923 | 882 | ||
924 | /* | 883 | /* We have to cancel outside of the spinlock */ |
925 | * make sure the in-flight joins have finished before we attempt | ||
926 | * to leave | ||
927 | */ | ||
928 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) | ||
929 | if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) | ||
930 | wait_for_completion(&mcast->done); | ||
931 | |||
932 | /* | ||
933 | * We have to cancel outside of the spinlock, but we have to | ||
934 | * take the rtnl lock or else we race with the removal of | ||
935 | * entries from the remove list in mcast_dev_flush as part | ||
936 | * of ipoib_stop(). We detect the drop of the ADMIN_UP flag | ||
937 | * to signal that we have hit this particular race, and we | ||
938 | * return since we know we don't need to do anything else | ||
939 | * anyway. | ||
940 | */ | ||
941 | while (!rtnl_trylock()) { | ||
942 | if (!test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) | ||
943 | return; | ||
944 | else | ||
945 | msleep(20); | ||
946 | } | ||
947 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { | 884 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { |
948 | ipoib_mcast_leave(mcast->dev, mcast); | 885 | ipoib_mcast_leave(mcast->dev, mcast); |
949 | ipoib_mcast_free(mcast); | 886 | ipoib_mcast_free(mcast); |
950 | } | 887 | } |
951 | /* | 888 | |
952 | * Restart our join task if needed | 889 | if (test_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags)) |
953 | */ | 890 | ipoib_mcast_start_thread(dev); |
954 | ipoib_mcast_start_thread(dev); | ||
955 | rtnl_unlock(); | ||
956 | } | 891 | } |
957 | 892 | ||
958 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG | 893 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c index b72a753eb41d..c56d5d44c53b 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c | |||
@@ -145,20 +145,10 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca) | |||
145 | int ret, size; | 145 | int ret, size; |
146 | int i; | 146 | int i; |
147 | 147 | ||
148 | /* | ||
149 | * the various IPoIB tasks assume they will never race against | ||
150 | * themselves, so always use a single thread workqueue | ||
151 | */ | ||
152 | priv->wq = create_singlethread_workqueue("ipoib_wq"); | ||
153 | if (!priv->wq) { | ||
154 | printk(KERN_WARNING "ipoib: failed to allocate device WQ\n"); | ||
155 | return -ENODEV; | ||
156 | } | ||
157 | |||
158 | priv->pd = ib_alloc_pd(priv->ca); | 148 | priv->pd = ib_alloc_pd(priv->ca); |
159 | if (IS_ERR(priv->pd)) { | 149 | if (IS_ERR(priv->pd)) { |
160 | printk(KERN_WARNING "%s: failed to allocate PD\n", ca->name); | 150 | printk(KERN_WARNING "%s: failed to allocate PD\n", ca->name); |
161 | goto out_free_wq; | 151 | return -ENODEV; |
162 | } | 152 | } |
163 | 153 | ||
164 | priv->mr = ib_get_dma_mr(priv->pd, IB_ACCESS_LOCAL_WRITE); | 154 | priv->mr = ib_get_dma_mr(priv->pd, IB_ACCESS_LOCAL_WRITE); |
@@ -252,10 +242,6 @@ out_free_mr: | |||
252 | 242 | ||
253 | out_free_pd: | 243 | out_free_pd: |
254 | ib_dealloc_pd(priv->pd); | 244 | ib_dealloc_pd(priv->pd); |
255 | |||
256 | out_free_wq: | ||
257 | destroy_workqueue(priv->wq); | ||
258 | priv->wq = NULL; | ||
259 | return -ENODEV; | 245 | return -ENODEV; |
260 | } | 246 | } |
261 | 247 | ||
@@ -284,12 +270,6 @@ void ipoib_transport_dev_cleanup(struct net_device *dev) | |||
284 | 270 | ||
285 | if (ib_dealloc_pd(priv->pd)) | 271 | if (ib_dealloc_pd(priv->pd)) |
286 | ipoib_warn(priv, "ib_dealloc_pd failed\n"); | 272 | ipoib_warn(priv, "ib_dealloc_pd failed\n"); |
287 | |||
288 | if (priv->wq) { | ||
289 | flush_workqueue(priv->wq); | ||
290 | destroy_workqueue(priv->wq); | ||
291 | priv->wq = NULL; | ||
292 | } | ||
293 | } | 273 | } |
294 | 274 | ||
295 | void ipoib_event(struct ib_event_handler *handler, | 275 | void ipoib_event(struct ib_event_handler *handler, |
diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c index 2b0468e3df6a..56b96c63dc4b 100644 --- a/drivers/irqchip/irq-mips-gic.c +++ b/drivers/irqchip/irq-mips-gic.c | |||
@@ -37,6 +37,7 @@ static struct irq_domain *gic_irq_domain; | |||
37 | static int gic_shared_intrs; | 37 | static int gic_shared_intrs; |
38 | static int gic_vpes; | 38 | static int gic_vpes; |
39 | static unsigned int gic_cpu_pin; | 39 | static unsigned int gic_cpu_pin; |
40 | static unsigned int timer_cpu_pin; | ||
40 | static struct irq_chip gic_level_irq_controller, gic_edge_irq_controller; | 41 | static struct irq_chip gic_level_irq_controller, gic_edge_irq_controller; |
41 | 42 | ||
42 | static void __gic_irq_dispatch(void); | 43 | static void __gic_irq_dispatch(void); |
@@ -616,6 +617,8 @@ static int gic_local_irq_domain_map(struct irq_domain *d, unsigned int virq, | |||
616 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_MAP), val); | 617 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_COMPARE_MAP), val); |
617 | break; | 618 | break; |
618 | case GIC_LOCAL_INT_TIMER: | 619 | case GIC_LOCAL_INT_TIMER: |
620 | /* CONFIG_MIPS_CMP workaround (see __gic_init) */ | ||
621 | val = GIC_MAP_TO_PIN_MSK | timer_cpu_pin; | ||
619 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_TIMER_MAP), val); | 622 | gic_write(GIC_REG(VPE_OTHER, GIC_VPE_TIMER_MAP), val); |
620 | break; | 623 | break; |
621 | case GIC_LOCAL_INT_PERFCTR: | 624 | case GIC_LOCAL_INT_PERFCTR: |
@@ -713,12 +716,36 @@ static void __init __gic_init(unsigned long gic_base_addr, | |||
713 | if (cpu_has_veic) { | 716 | if (cpu_has_veic) { |
714 | /* Always use vector 1 in EIC mode */ | 717 | /* Always use vector 1 in EIC mode */ |
715 | gic_cpu_pin = 0; | 718 | gic_cpu_pin = 0; |
719 | timer_cpu_pin = gic_cpu_pin; | ||
716 | set_vi_handler(gic_cpu_pin + GIC_PIN_TO_VEC_OFFSET, | 720 | set_vi_handler(gic_cpu_pin + GIC_PIN_TO_VEC_OFFSET, |
717 | __gic_irq_dispatch); | 721 | __gic_irq_dispatch); |
718 | } else { | 722 | } else { |
719 | gic_cpu_pin = cpu_vec - GIC_CPU_PIN_OFFSET; | 723 | gic_cpu_pin = cpu_vec - GIC_CPU_PIN_OFFSET; |
720 | irq_set_chained_handler(MIPS_CPU_IRQ_BASE + cpu_vec, | 724 | irq_set_chained_handler(MIPS_CPU_IRQ_BASE + cpu_vec, |
721 | gic_irq_dispatch); | 725 | gic_irq_dispatch); |
726 | /* | ||
727 | * With the CMP implementation of SMP (deprecated), other CPUs | ||
728 | * are started by the bootloader and put into a timer based | ||
729 | * waiting poll loop. We must not re-route those CPU's local | ||
730 | * timer interrupts as the wait instruction will never finish, | ||
731 | * so just handle whatever CPU interrupt it is routed to by | ||
732 | * default. | ||
733 | * | ||
734 | * This workaround should be removed when CMP support is | ||
735 | * dropped. | ||
736 | */ | ||
737 | if (IS_ENABLED(CONFIG_MIPS_CMP) && | ||
738 | gic_local_irq_is_routable(GIC_LOCAL_INT_TIMER)) { | ||
739 | timer_cpu_pin = gic_read(GIC_REG(VPE_LOCAL, | ||
740 | GIC_VPE_TIMER_MAP)) & | ||
741 | GIC_MAP_MSK; | ||
742 | irq_set_chained_handler(MIPS_CPU_IRQ_BASE + | ||
743 | GIC_CPU_PIN_OFFSET + | ||
744 | timer_cpu_pin, | ||
745 | gic_irq_dispatch); | ||
746 | } else { | ||
747 | timer_cpu_pin = gic_cpu_pin; | ||
748 | } | ||
722 | } | 749 | } |
723 | 750 | ||
724 | gic_irq_domain = irq_domain_add_simple(node, GIC_NUM_LOCAL_INTRS + | 751 | gic_irq_domain = irq_domain_add_simple(node, GIC_NUM_LOCAL_INTRS + |
diff --git a/drivers/isdn/hardware/eicon/message.c b/drivers/isdn/hardware/eicon/message.c index 0b380603a578..d7c286656a25 100644 --- a/drivers/isdn/hardware/eicon/message.c +++ b/drivers/isdn/hardware/eicon/message.c | |||
@@ -1474,7 +1474,7 @@ static byte connect_res(dword Id, word Number, DIVA_CAPI_ADAPTER *a, | |||
1474 | add_ai(plci, &parms[5]); | 1474 | add_ai(plci, &parms[5]); |
1475 | sig_req(plci, REJECT, 0); | 1475 | sig_req(plci, REJECT, 0); |
1476 | } | 1476 | } |
1477 | else if (Reject == 1 || Reject > 9) | 1477 | else if (Reject == 1 || Reject >= 9) |
1478 | { | 1478 | { |
1479 | add_ai(plci, &parms[5]); | 1479 | add_ai(plci, &parms[5]); |
1480 | sig_req(plci, HANGUP, 0); | 1480 | sig_req(plci, HANGUP, 0); |
diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c index 6dbf6fcbdfaf..e8902f8dddfc 100644 --- a/drivers/mailbox/pcc.c +++ b/drivers/mailbox/pcc.c | |||
@@ -386,7 +386,7 @@ static int __init pcc_init(void) | |||
386 | ret = acpi_pcc_probe(); | 386 | ret = acpi_pcc_probe(); |
387 | 387 | ||
388 | if (ret) { | 388 | if (ret) { |
389 | pr_err("ACPI PCC probe failed.\n"); | 389 | pr_debug("ACPI PCC probe failed.\n"); |
390 | return -ENODEV; | 390 | return -ENODEV; |
391 | } | 391 | } |
392 | 392 | ||
@@ -394,7 +394,7 @@ static int __init pcc_init(void) | |||
394 | pcc_mbox_probe, NULL, 0, NULL, 0); | 394 | pcc_mbox_probe, NULL, 0, NULL, 0); |
395 | 395 | ||
396 | if (!pcc_pdev) { | 396 | if (!pcc_pdev) { |
397 | pr_err("Err creating PCC platform bundle\n"); | 397 | pr_debug("Err creating PCC platform bundle\n"); |
398 | return -ENODEV; | 398 | return -ENODEV; |
399 | } | 399 | } |
400 | 400 | ||
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index da3604e73e8a..1695ee5f3ffc 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -72,6 +72,19 @@ __acquires(bitmap->lock) | |||
72 | /* this page has not been allocated yet */ | 72 | /* this page has not been allocated yet */ |
73 | 73 | ||
74 | spin_unlock_irq(&bitmap->lock); | 74 | spin_unlock_irq(&bitmap->lock); |
75 | /* It is possible that this is being called inside a | ||
76 | * prepare_to_wait/finish_wait loop from raid5c:make_request(). | ||
77 | * In general it is not permitted to sleep in that context as it | ||
78 | * can cause the loop to spin freely. | ||
79 | * That doesn't apply here as we can only reach this point | ||
80 | * once with any loop. | ||
81 | * When this function completes, either bp[page].map or | ||
82 | * bp[page].hijacked. In either case, this function will | ||
83 | * abort before getting to this point again. So there is | ||
84 | * no risk of a free-spin, and so it is safe to assert | ||
85 | * that sleeping here is allowed. | ||
86 | */ | ||
87 | sched_annotate_sleep(); | ||
75 | mappage = kzalloc(PAGE_SIZE, GFP_NOIO); | 88 | mappage = kzalloc(PAGE_SIZE, GFP_NOIO); |
76 | spin_lock_irq(&bitmap->lock); | 89 | spin_lock_irq(&bitmap->lock); |
77 | 90 | ||
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index c1b0d52bfcb0..b98765f6f77f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -3195,6 +3195,11 @@ static void handle_stripe_dirtying(struct r5conf *conf, | |||
3195 | (unsigned long long)sh->sector, | 3195 | (unsigned long long)sh->sector, |
3196 | rcw, qread, test_bit(STRIPE_DELAYED, &sh->state)); | 3196 | rcw, qread, test_bit(STRIPE_DELAYED, &sh->state)); |
3197 | } | 3197 | } |
3198 | |||
3199 | if (rcw > disks && rmw > disks && | ||
3200 | !test_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) | ||
3201 | set_bit(STRIPE_DELAYED, &sh->state); | ||
3202 | |||
3198 | /* now if nothing is locked, and if we have enough data, | 3203 | /* now if nothing is locked, and if we have enough data, |
3199 | * we can start a write request | 3204 | * we can start a write request |
3200 | */ | 3205 | */ |
diff --git a/drivers/net/caif/caif_hsi.c b/drivers/net/caif/caif_hsi.c index 5e40a8b68cbe..b3b922adc0e4 100644 --- a/drivers/net/caif/caif_hsi.c +++ b/drivers/net/caif/caif_hsi.c | |||
@@ -1415,7 +1415,6 @@ static int caif_hsi_newlink(struct net *src_net, struct net_device *dev, | |||
1415 | 1415 | ||
1416 | cfhsi = netdev_priv(dev); | 1416 | cfhsi = netdev_priv(dev); |
1417 | cfhsi_netlink_parms(data, cfhsi); | 1417 | cfhsi_netlink_parms(data, cfhsi); |
1418 | dev_net_set(cfhsi->ndev, src_net); | ||
1419 | 1418 | ||
1420 | get_ops = symbol_get(cfhsi_get_ops); | 1419 | get_ops = symbol_get(cfhsi_get_ops); |
1421 | if (!get_ops) { | 1420 | if (!get_ops) { |
diff --git a/drivers/net/ethernet/amd/Kconfig b/drivers/net/ethernet/amd/Kconfig index 7a5e4aa5415e..77f1f6048ddd 100644 --- a/drivers/net/ethernet/amd/Kconfig +++ b/drivers/net/ethernet/amd/Kconfig | |||
@@ -45,7 +45,7 @@ config AMD8111_ETH | |||
45 | 45 | ||
46 | config LANCE | 46 | config LANCE |
47 | tristate "AMD LANCE and PCnet (AT1500 and NE2100) support" | 47 | tristate "AMD LANCE and PCnet (AT1500 and NE2100) support" |
48 | depends on ISA && ISA_DMA_API | 48 | depends on ISA && ISA_DMA_API && !ARM |
49 | ---help--- | 49 | ---help--- |
50 | If you have a network (Ethernet) card of this type, say Y and read | 50 | If you have a network (Ethernet) card of this type, say Y and read |
51 | the Ethernet-HOWTO, available from | 51 | the Ethernet-HOWTO, available from |
@@ -142,7 +142,7 @@ config PCMCIA_NMCLAN | |||
142 | 142 | ||
143 | config NI65 | 143 | config NI65 |
144 | tristate "NI6510 support" | 144 | tristate "NI6510 support" |
145 | depends on ISA && ISA_DMA_API | 145 | depends on ISA && ISA_DMA_API && !ARM |
146 | ---help--- | 146 | ---help--- |
147 | If you have a network (Ethernet) card of this type, say Y and read | 147 | If you have a network (Ethernet) card of this type, say Y and read |
148 | the Ethernet-HOWTO, available from | 148 | the Ethernet-HOWTO, available from |
diff --git a/drivers/net/ethernet/amd/nmclan_cs.c b/drivers/net/ethernet/amd/nmclan_cs.c index 5b22764ba88d..27245efe9f50 100644 --- a/drivers/net/ethernet/amd/nmclan_cs.c +++ b/drivers/net/ethernet/amd/nmclan_cs.c | |||
@@ -952,6 +952,8 @@ static irqreturn_t mace_interrupt(int irq, void *dev_id) | |||
952 | do { | 952 | do { |
953 | /* WARNING: MACE_IR is a READ/CLEAR port! */ | 953 | /* WARNING: MACE_IR is a READ/CLEAR port! */ |
954 | status = inb(ioaddr + AM2150_MACE_BASE + MACE_IR); | 954 | status = inb(ioaddr + AM2150_MACE_BASE + MACE_IR); |
955 | if (!(status & ~MACE_IMR_DEFAULT) && IntrCnt == MACE_MAX_IR_ITERATIONS) | ||
956 | return IRQ_NONE; | ||
955 | 957 | ||
956 | pr_debug("mace_interrupt: irq 0x%X status 0x%X.\n", irq, status); | 958 | pr_debug("mace_interrupt: irq 0x%X status 0x%X.\n", irq, status); |
957 | 959 | ||
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c index 7bb5f07dbeef..e5ffb2ccb67d 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c | |||
@@ -523,6 +523,7 @@ void xgbe_get_all_hw_features(struct xgbe_prv_data *pdata) | |||
523 | hw_feat->sph = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, SPHEN); | 523 | hw_feat->sph = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, SPHEN); |
524 | hw_feat->tso = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, TSOEN); | 524 | hw_feat->tso = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, TSOEN); |
525 | hw_feat->dma_debug = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DBGMEMA); | 525 | hw_feat->dma_debug = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, DBGMEMA); |
526 | hw_feat->rss = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, RSSEN); | ||
526 | hw_feat->tc_cnt = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, NUMTC); | 527 | hw_feat->tc_cnt = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, NUMTC); |
527 | hw_feat->hash_table_size = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, | 528 | hw_feat->hash_table_size = XGMAC_GET_BITS(mac_hfr1, MAC_HWF1R, |
528 | HASHTBLSZ); | 529 | HASHTBLSZ); |
@@ -552,13 +553,14 @@ void xgbe_get_all_hw_features(struct xgbe_prv_data *pdata) | |||
552 | break; | 553 | break; |
553 | } | 554 | } |
554 | 555 | ||
555 | /* The Queue and Channel counts are zero based so increment them | 556 | /* The Queue, Channel and TC counts are zero based so increment them |
556 | * to get the actual number | 557 | * to get the actual number |
557 | */ | 558 | */ |
558 | hw_feat->rx_q_cnt++; | 559 | hw_feat->rx_q_cnt++; |
559 | hw_feat->tx_q_cnt++; | 560 | hw_feat->tx_q_cnt++; |
560 | hw_feat->rx_ch_cnt++; | 561 | hw_feat->rx_ch_cnt++; |
561 | hw_feat->tx_ch_cnt++; | 562 | hw_feat->tx_ch_cnt++; |
563 | hw_feat->tc_cnt++; | ||
562 | 564 | ||
563 | DBGPR("<--xgbe_get_all_hw_features\n"); | 565 | DBGPR("<--xgbe_get_all_hw_features\n"); |
564 | } | 566 | } |
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c index 83a50280bb70..793f3b73eeff 100644 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c | |||
@@ -369,6 +369,8 @@ static int xgene_enet_process_ring(struct xgene_enet_desc_ring *ring, | |||
369 | if (unlikely(xgene_enet_is_desc_slot_empty(raw_desc))) | 369 | if (unlikely(xgene_enet_is_desc_slot_empty(raw_desc))) |
370 | break; | 370 | break; |
371 | 371 | ||
372 | /* read fpqnum field after dataaddr field */ | ||
373 | dma_rmb(); | ||
372 | if (is_rx_desc(raw_desc)) | 374 | if (is_rx_desc(raw_desc)) |
373 | ret = xgene_enet_rx_frame(ring, raw_desc); | 375 | ret = xgene_enet_rx_frame(ring, raw_desc); |
374 | else | 376 | else |
diff --git a/drivers/net/ethernet/cirrus/Kconfig b/drivers/net/ethernet/cirrus/Kconfig index 7403dff8f14a..905ac5f5d9a6 100644 --- a/drivers/net/ethernet/cirrus/Kconfig +++ b/drivers/net/ethernet/cirrus/Kconfig | |||
@@ -32,7 +32,8 @@ config CS89x0 | |||
32 | will be called cs89x0. | 32 | will be called cs89x0. |
33 | 33 | ||
34 | config CS89x0_PLATFORM | 34 | config CS89x0_PLATFORM |
35 | bool "CS89x0 platform driver support" | 35 | bool "CS89x0 platform driver support" if HAS_IOPORT_MAP |
36 | default !HAS_IOPORT_MAP | ||
36 | depends on CS89x0 | 37 | depends on CS89x0 |
37 | help | 38 | help |
38 | Say Y to compile the cs89x0 driver as a platform driver. This | 39 | Say Y to compile the cs89x0 driver as a platform driver. This |
diff --git a/drivers/net/ethernet/freescale/gianfar_ethtool.c b/drivers/net/ethernet/freescale/gianfar_ethtool.c index 3e1a9c1a67a9..fda12fb32ec7 100644 --- a/drivers/net/ethernet/freescale/gianfar_ethtool.c +++ b/drivers/net/ethernet/freescale/gianfar_ethtool.c | |||
@@ -1586,7 +1586,7 @@ static int gfar_write_filer_table(struct gfar_private *priv, | |||
1586 | return -EBUSY; | 1586 | return -EBUSY; |
1587 | 1587 | ||
1588 | /* Fill regular entries */ | 1588 | /* Fill regular entries */ |
1589 | for (; i < MAX_FILER_IDX - 1 && (tab->fe[i].ctrl | tab->fe[i].ctrl); | 1589 | for (; i < MAX_FILER_IDX - 1 && (tab->fe[i].ctrl | tab->fe[i].prop); |
1590 | i++) | 1590 | i++) |
1591 | gfar_write_filer(priv, i, tab->fe[i].ctrl, tab->fe[i].prop); | 1591 | gfar_write_filer(priv, i, tab->fe[i].ctrl, tab->fe[i].prop); |
1592 | /* Fill the rest with fall-troughs */ | 1592 | /* Fill the rest with fall-troughs */ |
diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c index 63c807c9b21c..edea13b0ee85 100644 --- a/drivers/net/ethernet/intel/igbvf/netdev.c +++ b/drivers/net/ethernet/intel/igbvf/netdev.c | |||
@@ -1907,7 +1907,8 @@ static void igbvf_watchdog_task(struct work_struct *work) | |||
1907 | 1907 | ||
1908 | static int igbvf_tso(struct igbvf_adapter *adapter, | 1908 | static int igbvf_tso(struct igbvf_adapter *adapter, |
1909 | struct igbvf_ring *tx_ring, | 1909 | struct igbvf_ring *tx_ring, |
1910 | struct sk_buff *skb, u32 tx_flags, u8 *hdr_len) | 1910 | struct sk_buff *skb, u32 tx_flags, u8 *hdr_len, |
1911 | __be16 protocol) | ||
1911 | { | 1912 | { |
1912 | struct e1000_adv_tx_context_desc *context_desc; | 1913 | struct e1000_adv_tx_context_desc *context_desc; |
1913 | struct igbvf_buffer *buffer_info; | 1914 | struct igbvf_buffer *buffer_info; |
@@ -1927,7 +1928,7 @@ static int igbvf_tso(struct igbvf_adapter *adapter, | |||
1927 | l4len = tcp_hdrlen(skb); | 1928 | l4len = tcp_hdrlen(skb); |
1928 | *hdr_len += l4len; | 1929 | *hdr_len += l4len; |
1929 | 1930 | ||
1930 | if (skb->protocol == htons(ETH_P_IP)) { | 1931 | if (protocol == htons(ETH_P_IP)) { |
1931 | struct iphdr *iph = ip_hdr(skb); | 1932 | struct iphdr *iph = ip_hdr(skb); |
1932 | iph->tot_len = 0; | 1933 | iph->tot_len = 0; |
1933 | iph->check = 0; | 1934 | iph->check = 0; |
@@ -1958,7 +1959,7 @@ static int igbvf_tso(struct igbvf_adapter *adapter, | |||
1958 | /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */ | 1959 | /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */ |
1959 | tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT); | 1960 | tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT); |
1960 | 1961 | ||
1961 | if (skb->protocol == htons(ETH_P_IP)) | 1962 | if (protocol == htons(ETH_P_IP)) |
1962 | tu_cmd |= E1000_ADVTXD_TUCMD_IPV4; | 1963 | tu_cmd |= E1000_ADVTXD_TUCMD_IPV4; |
1963 | tu_cmd |= E1000_ADVTXD_TUCMD_L4T_TCP; | 1964 | tu_cmd |= E1000_ADVTXD_TUCMD_L4T_TCP; |
1964 | 1965 | ||
@@ -1984,7 +1985,8 @@ static int igbvf_tso(struct igbvf_adapter *adapter, | |||
1984 | 1985 | ||
1985 | static inline bool igbvf_tx_csum(struct igbvf_adapter *adapter, | 1986 | static inline bool igbvf_tx_csum(struct igbvf_adapter *adapter, |
1986 | struct igbvf_ring *tx_ring, | 1987 | struct igbvf_ring *tx_ring, |
1987 | struct sk_buff *skb, u32 tx_flags) | 1988 | struct sk_buff *skb, u32 tx_flags, |
1989 | __be16 protocol) | ||
1988 | { | 1990 | { |
1989 | struct e1000_adv_tx_context_desc *context_desc; | 1991 | struct e1000_adv_tx_context_desc *context_desc; |
1990 | unsigned int i; | 1992 | unsigned int i; |
@@ -2011,7 +2013,7 @@ static inline bool igbvf_tx_csum(struct igbvf_adapter *adapter, | |||
2011 | tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT); | 2013 | tu_cmd |= (E1000_TXD_CMD_DEXT | E1000_ADVTXD_DTYP_CTXT); |
2012 | 2014 | ||
2013 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 2015 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
2014 | switch (skb->protocol) { | 2016 | switch (protocol) { |
2015 | case htons(ETH_P_IP): | 2017 | case htons(ETH_P_IP): |
2016 | tu_cmd |= E1000_ADVTXD_TUCMD_IPV4; | 2018 | tu_cmd |= E1000_ADVTXD_TUCMD_IPV4; |
2017 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) | 2019 | if (ip_hdr(skb)->protocol == IPPROTO_TCP) |
@@ -2211,6 +2213,7 @@ static netdev_tx_t igbvf_xmit_frame_ring_adv(struct sk_buff *skb, | |||
2211 | u8 hdr_len = 0; | 2213 | u8 hdr_len = 0; |
2212 | int count = 0; | 2214 | int count = 0; |
2213 | int tso = 0; | 2215 | int tso = 0; |
2216 | __be16 protocol = vlan_get_protocol(skb); | ||
2214 | 2217 | ||
2215 | if (test_bit(__IGBVF_DOWN, &adapter->state)) { | 2218 | if (test_bit(__IGBVF_DOWN, &adapter->state)) { |
2216 | dev_kfree_skb_any(skb); | 2219 | dev_kfree_skb_any(skb); |
@@ -2239,13 +2242,13 @@ static netdev_tx_t igbvf_xmit_frame_ring_adv(struct sk_buff *skb, | |||
2239 | tx_flags |= (vlan_tx_tag_get(skb) << IGBVF_TX_FLAGS_VLAN_SHIFT); | 2242 | tx_flags |= (vlan_tx_tag_get(skb) << IGBVF_TX_FLAGS_VLAN_SHIFT); |
2240 | } | 2243 | } |
2241 | 2244 | ||
2242 | if (skb->protocol == htons(ETH_P_IP)) | 2245 | if (protocol == htons(ETH_P_IP)) |
2243 | tx_flags |= IGBVF_TX_FLAGS_IPV4; | 2246 | tx_flags |= IGBVF_TX_FLAGS_IPV4; |
2244 | 2247 | ||
2245 | first = tx_ring->next_to_use; | 2248 | first = tx_ring->next_to_use; |
2246 | 2249 | ||
2247 | tso = skb_is_gso(skb) ? | 2250 | tso = skb_is_gso(skb) ? |
2248 | igbvf_tso(adapter, tx_ring, skb, tx_flags, &hdr_len) : 0; | 2251 | igbvf_tso(adapter, tx_ring, skb, tx_flags, &hdr_len, protocol) : 0; |
2249 | if (unlikely(tso < 0)) { | 2252 | if (unlikely(tso < 0)) { |
2250 | dev_kfree_skb_any(skb); | 2253 | dev_kfree_skb_any(skb); |
2251 | return NETDEV_TX_OK; | 2254 | return NETDEV_TX_OK; |
@@ -2253,7 +2256,7 @@ static netdev_tx_t igbvf_xmit_frame_ring_adv(struct sk_buff *skb, | |||
2253 | 2256 | ||
2254 | if (tso) | 2257 | if (tso) |
2255 | tx_flags |= IGBVF_TX_FLAGS_TSO; | 2258 | tx_flags |= IGBVF_TX_FLAGS_TSO; |
2256 | else if (igbvf_tx_csum(adapter, tx_ring, skb, tx_flags) && | 2259 | else if (igbvf_tx_csum(adapter, tx_ring, skb, tx_flags, protocol) && |
2257 | (skb->ip_summed == CHECKSUM_PARTIAL)) | 2260 | (skb->ip_summed == CHECKSUM_PARTIAL)) |
2258 | tx_flags |= IGBVF_TX_FLAGS_CSUM; | 2261 | tx_flags |= IGBVF_TX_FLAGS_CSUM; |
2259 | 2262 | ||
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 2ed2c7de2304..67b02bde179e 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | |||
@@ -7227,11 +7227,11 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, | |||
7227 | if (!vhdr) | 7227 | if (!vhdr) |
7228 | goto out_drop; | 7228 | goto out_drop; |
7229 | 7229 | ||
7230 | protocol = vhdr->h_vlan_encapsulated_proto; | ||
7231 | tx_flags |= ntohs(vhdr->h_vlan_TCI) << | 7230 | tx_flags |= ntohs(vhdr->h_vlan_TCI) << |
7232 | IXGBE_TX_FLAGS_VLAN_SHIFT; | 7231 | IXGBE_TX_FLAGS_VLAN_SHIFT; |
7233 | tx_flags |= IXGBE_TX_FLAGS_SW_VLAN; | 7232 | tx_flags |= IXGBE_TX_FLAGS_SW_VLAN; |
7234 | } | 7233 | } |
7234 | protocol = vlan_get_protocol(skb); | ||
7235 | 7235 | ||
7236 | if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && | 7236 | if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && |
7237 | adapter->ptp_clock && | 7237 | adapter->ptp_clock && |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index 62a0d8e0f17d..38c7a0be8197 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
@@ -3099,7 +3099,7 @@ static int ixgbevf_tso(struct ixgbevf_ring *tx_ring, | |||
3099 | /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */ | 3099 | /* ADV DTYP TUCMD MKRLOC/ISCSIHEDLEN */ |
3100 | type_tucmd = IXGBE_ADVTXD_TUCMD_L4T_TCP; | 3100 | type_tucmd = IXGBE_ADVTXD_TUCMD_L4T_TCP; |
3101 | 3101 | ||
3102 | if (skb->protocol == htons(ETH_P_IP)) { | 3102 | if (first->protocol == htons(ETH_P_IP)) { |
3103 | struct iphdr *iph = ip_hdr(skb); | 3103 | struct iphdr *iph = ip_hdr(skb); |
3104 | iph->tot_len = 0; | 3104 | iph->tot_len = 0; |
3105 | iph->check = 0; | 3105 | iph->check = 0; |
@@ -3156,7 +3156,7 @@ static void ixgbevf_tx_csum(struct ixgbevf_ring *tx_ring, | |||
3156 | 3156 | ||
3157 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 3157 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
3158 | u8 l4_hdr = 0; | 3158 | u8 l4_hdr = 0; |
3159 | switch (skb->protocol) { | 3159 | switch (first->protocol) { |
3160 | case htons(ETH_P_IP): | 3160 | case htons(ETH_P_IP): |
3161 | vlan_macip_lens |= skb_network_header_len(skb); | 3161 | vlan_macip_lens |= skb_network_header_len(skb); |
3162 | type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4; | 3162 | type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index bdd4eea2247c..210691c89b6c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
@@ -235,7 +235,8 @@ do { \ | |||
235 | extern int mlx4_log_num_mgm_entry_size; | 235 | extern int mlx4_log_num_mgm_entry_size; |
236 | extern int log_mtts_per_seg; | 236 | extern int log_mtts_per_seg; |
237 | 237 | ||
238 | #define MLX4_MAX_NUM_SLAVES (MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF) | 238 | #define MLX4_MAX_NUM_SLAVES (min(MLX4_MAX_NUM_PF + MLX4_MAX_NUM_VF, \ |
239 | MLX4_MFUNC_MAX)) | ||
239 | #define ALL_SLAVES 0xff | 240 | #define ALL_SLAVES 0xff |
240 | 241 | ||
241 | struct mlx4_bitmap { | 242 | struct mlx4_bitmap { |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index 18e5de72e9b4..4e1f58cf19ce 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
@@ -967,7 +967,12 @@ static int qlcnic_poll(struct napi_struct *napi, int budget) | |||
967 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, | 967 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, |
968 | budget); | 968 | budget); |
969 | work_done = qlcnic_process_rcv_ring(sds_ring, budget); | 969 | work_done = qlcnic_process_rcv_ring(sds_ring, budget); |
970 | if ((work_done < budget) && tx_complete) { | 970 | |
971 | /* Check if we need a repoll */ | ||
972 | if (!tx_complete) | ||
973 | work_done = budget; | ||
974 | |||
975 | if (work_done < budget) { | ||
971 | napi_complete(&sds_ring->napi); | 976 | napi_complete(&sds_ring->napi); |
972 | if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { | 977 | if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { |
973 | qlcnic_enable_sds_intr(adapter, sds_ring); | 978 | qlcnic_enable_sds_intr(adapter, sds_ring); |
@@ -992,6 +997,9 @@ static int qlcnic_tx_poll(struct napi_struct *napi, int budget) | |||
992 | napi_complete(&tx_ring->napi); | 997 | napi_complete(&tx_ring->napi); |
993 | if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) | 998 | if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) |
994 | qlcnic_enable_tx_intr(adapter, tx_ring); | 999 | qlcnic_enable_tx_intr(adapter, tx_ring); |
1000 | } else { | ||
1001 | /* As qlcnic_process_cmd_ring() returned 0, we need a repoll*/ | ||
1002 | work_done = budget; | ||
995 | } | 1003 | } |
996 | 1004 | ||
997 | return work_done; | 1005 | return work_done; |
@@ -1950,7 +1958,12 @@ static int qlcnic_83xx_msix_sriov_vf_poll(struct napi_struct *napi, int budget) | |||
1950 | 1958 | ||
1951 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget); | 1959 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget); |
1952 | work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget); | 1960 | work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget); |
1953 | if ((work_done < budget) && tx_complete) { | 1961 | |
1962 | /* Check if we need a repoll */ | ||
1963 | if (!tx_complete) | ||
1964 | work_done = budget; | ||
1965 | |||
1966 | if (work_done < budget) { | ||
1954 | napi_complete(&sds_ring->napi); | 1967 | napi_complete(&sds_ring->napi); |
1955 | qlcnic_enable_sds_intr(adapter, sds_ring); | 1968 | qlcnic_enable_sds_intr(adapter, sds_ring); |
1956 | } | 1969 | } |
@@ -1973,7 +1986,12 @@ static int qlcnic_83xx_poll(struct napi_struct *napi, int budget) | |||
1973 | 1986 | ||
1974 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget); | 1987 | tx_complete = qlcnic_process_cmd_ring(adapter, tx_ring, budget); |
1975 | work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget); | 1988 | work_done = qlcnic_83xx_process_rcv_ring(sds_ring, budget); |
1976 | if ((work_done < budget) && tx_complete) { | 1989 | |
1990 | /* Check if we need a repoll */ | ||
1991 | if (!tx_complete) | ||
1992 | work_done = budget; | ||
1993 | |||
1994 | if (work_done < budget) { | ||
1977 | napi_complete(&sds_ring->napi); | 1995 | napi_complete(&sds_ring->napi); |
1978 | qlcnic_enable_sds_intr(adapter, sds_ring); | 1996 | qlcnic_enable_sds_intr(adapter, sds_ring); |
1979 | } | 1997 | } |
@@ -1995,6 +2013,9 @@ static int qlcnic_83xx_msix_tx_poll(struct napi_struct *napi, int budget) | |||
1995 | napi_complete(&tx_ring->napi); | 2013 | napi_complete(&tx_ring->napi); |
1996 | if (test_bit(__QLCNIC_DEV_UP , &adapter->state)) | 2014 | if (test_bit(__QLCNIC_DEV_UP , &adapter->state)) |
1997 | qlcnic_enable_tx_intr(adapter, tx_ring); | 2015 | qlcnic_enable_tx_intr(adapter, tx_ring); |
2016 | } else { | ||
2017 | /* need a repoll */ | ||
2018 | work_done = budget; | ||
1998 | } | 2019 | } |
1999 | 2020 | ||
2000 | return work_done; | 2021 | return work_done; |
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c index 6c904a6cad2a..ef5aed3b1225 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c | |||
@@ -2351,23 +2351,29 @@ static int qlge_update_hw_vlan_features(struct net_device *ndev, | |||
2351 | { | 2351 | { |
2352 | struct ql_adapter *qdev = netdev_priv(ndev); | 2352 | struct ql_adapter *qdev = netdev_priv(ndev); |
2353 | int status = 0; | 2353 | int status = 0; |
2354 | bool need_restart = netif_running(ndev); | ||
2354 | 2355 | ||
2355 | status = ql_adapter_down(qdev); | 2356 | if (need_restart) { |
2356 | if (status) { | 2357 | status = ql_adapter_down(qdev); |
2357 | netif_err(qdev, link, qdev->ndev, | 2358 | if (status) { |
2358 | "Failed to bring down the adapter\n"); | 2359 | netif_err(qdev, link, qdev->ndev, |
2359 | return status; | 2360 | "Failed to bring down the adapter\n"); |
2361 | return status; | ||
2362 | } | ||
2360 | } | 2363 | } |
2361 | 2364 | ||
2362 | /* update the features with resent change */ | 2365 | /* update the features with resent change */ |
2363 | ndev->features = features; | 2366 | ndev->features = features; |
2364 | 2367 | ||
2365 | status = ql_adapter_up(qdev); | 2368 | if (need_restart) { |
2366 | if (status) { | 2369 | status = ql_adapter_up(qdev); |
2367 | netif_err(qdev, link, qdev->ndev, | 2370 | if (status) { |
2368 | "Failed to bring up the adapter\n"); | 2371 | netif_err(qdev, link, qdev->ndev, |
2369 | return status; | 2372 | "Failed to bring up the adapter\n"); |
2373 | return status; | ||
2374 | } | ||
2370 | } | 2375 | } |
2376 | |||
2371 | return status; | 2377 | return status; |
2372 | } | 2378 | } |
2373 | 2379 | ||
diff --git a/drivers/net/ethernet/sun/sunvnet.c b/drivers/net/ethernet/sun/sunvnet.c index d2835bf7b4fb..3699b98d5b2c 100644 --- a/drivers/net/ethernet/sun/sunvnet.c +++ b/drivers/net/ethernet/sun/sunvnet.c | |||
@@ -1119,6 +1119,7 @@ static inline struct sk_buff *vnet_skb_shape(struct sk_buff *skb, int ncookies) | |||
1119 | skb_shinfo(nskb)->gso_size = skb_shinfo(skb)->gso_size; | 1119 | skb_shinfo(nskb)->gso_size = skb_shinfo(skb)->gso_size; |
1120 | skb_shinfo(nskb)->gso_type = skb_shinfo(skb)->gso_type; | 1120 | skb_shinfo(nskb)->gso_type = skb_shinfo(skb)->gso_type; |
1121 | } | 1121 | } |
1122 | nskb->queue_mapping = skb->queue_mapping; | ||
1122 | dev_kfree_skb(skb); | 1123 | dev_kfree_skb(skb); |
1123 | skb = nskb; | 1124 | skb = nskb; |
1124 | } | 1125 | } |
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 9f49c0129a78..7cd4eb38abfa 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c | |||
@@ -716,7 +716,7 @@ int netvsc_send(struct hv_device *device, | |||
716 | u64 req_id; | 716 | u64 req_id; |
717 | unsigned int section_index = NETVSC_INVALID_INDEX; | 717 | unsigned int section_index = NETVSC_INVALID_INDEX; |
718 | u32 msg_size = 0; | 718 | u32 msg_size = 0; |
719 | struct sk_buff *skb; | 719 | struct sk_buff *skb = NULL; |
720 | u16 q_idx = packet->q_idx; | 720 | u16 q_idx = packet->q_idx; |
721 | 721 | ||
722 | 722 | ||
@@ -743,8 +743,6 @@ int netvsc_send(struct hv_device *device, | |||
743 | packet); | 743 | packet); |
744 | skb = (struct sk_buff *) | 744 | skb = (struct sk_buff *) |
745 | (unsigned long)packet->send_completion_tid; | 745 | (unsigned long)packet->send_completion_tid; |
746 | if (skb) | ||
747 | dev_kfree_skb_any(skb); | ||
748 | packet->page_buf_cnt = 0; | 746 | packet->page_buf_cnt = 0; |
749 | } | 747 | } |
750 | } | 748 | } |
@@ -810,6 +808,13 @@ int netvsc_send(struct hv_device *device, | |||
810 | packet, ret); | 808 | packet, ret); |
811 | } | 809 | } |
812 | 810 | ||
811 | if (ret != 0) { | ||
812 | if (section_index != NETVSC_INVALID_INDEX) | ||
813 | netvsc_free_send_slot(net_device, section_index); | ||
814 | } else if (skb) { | ||
815 | dev_kfree_skb_any(skb); | ||
816 | } | ||
817 | |||
813 | return ret; | 818 | return ret; |
814 | } | 819 | } |
815 | 820 | ||
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index 7df221788cd4..919f4fccc322 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/fs.h> | 17 | #include <linux/fs.h> |
18 | #include <linux/uio.h> | 18 | #include <linux/uio.h> |
19 | 19 | ||
20 | #include <net/ipv6.h> | ||
21 | #include <net/net_namespace.h> | 20 | #include <net/net_namespace.h> |
22 | #include <net/rtnetlink.h> | 21 | #include <net/rtnetlink.h> |
23 | #include <net/sock.h> | 22 | #include <net/sock.h> |
@@ -81,7 +80,7 @@ static struct cdev macvtap_cdev; | |||
81 | static const struct proto_ops macvtap_socket_ops; | 80 | static const struct proto_ops macvtap_socket_ops; |
82 | 81 | ||
83 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ | 82 | #define TUN_OFFLOADS (NETIF_F_HW_CSUM | NETIF_F_TSO_ECN | NETIF_F_TSO | \ |
84 | NETIF_F_TSO6) | 83 | NETIF_F_TSO6 | NETIF_F_UFO) |
85 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) | 84 | #define RX_OFFLOADS (NETIF_F_GRO | NETIF_F_LRO) |
86 | #define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG) | 85 | #define TAP_FEATURES (NETIF_F_GSO | NETIF_F_SG) |
87 | 86 | ||
@@ -586,11 +585,7 @@ static int macvtap_skb_from_vnet_hdr(struct macvtap_queue *q, | |||
586 | gso_type = SKB_GSO_TCPV6; | 585 | gso_type = SKB_GSO_TCPV6; |
587 | break; | 586 | break; |
588 | case VIRTIO_NET_HDR_GSO_UDP: | 587 | case VIRTIO_NET_HDR_GSO_UDP: |
589 | pr_warn_once("macvtap: %s: using disabled UFO feature; please fix this program\n", | ||
590 | current->comm); | ||
591 | gso_type = SKB_GSO_UDP; | 588 | gso_type = SKB_GSO_UDP; |
592 | if (skb->protocol == htons(ETH_P_IPV6)) | ||
593 | ipv6_proxy_select_ident(skb); | ||
594 | break; | 589 | break; |
595 | default: | 590 | default: |
596 | return -EINVAL; | 591 | return -EINVAL; |
@@ -636,6 +631,8 @@ static void macvtap_skb_to_vnet_hdr(struct macvtap_queue *q, | |||
636 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; | 631 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4; |
637 | else if (sinfo->gso_type & SKB_GSO_TCPV6) | 632 | else if (sinfo->gso_type & SKB_GSO_TCPV6) |
638 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 633 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
634 | else if (sinfo->gso_type & SKB_GSO_UDP) | ||
635 | vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP; | ||
639 | else | 636 | else |
640 | BUG(); | 637 | BUG(); |
641 | if (sinfo->gso_type & SKB_GSO_TCP_ECN) | 638 | if (sinfo->gso_type & SKB_GSO_TCP_ECN) |
@@ -965,6 +962,9 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg) | |||
965 | if (arg & TUN_F_TSO6) | 962 | if (arg & TUN_F_TSO6) |
966 | feature_mask |= NETIF_F_TSO6; | 963 | feature_mask |= NETIF_F_TSO6; |
967 | } | 964 | } |
965 | |||
966 | if (arg & TUN_F_UFO) | ||
967 | feature_mask |= NETIF_F_UFO; | ||
968 | } | 968 | } |
969 | 969 | ||
970 | /* tun/tap driver inverts the usage for TSO offloads, where | 970 | /* tun/tap driver inverts the usage for TSO offloads, where |
@@ -975,7 +975,7 @@ static int set_offload(struct macvtap_queue *q, unsigned long arg) | |||
975 | * When user space turns off TSO, we turn off GSO/LRO so that | 975 | * When user space turns off TSO, we turn off GSO/LRO so that |
976 | * user-space will not receive TSO frames. | 976 | * user-space will not receive TSO frames. |
977 | */ | 977 | */ |
978 | if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6)) | 978 | if (feature_mask & (NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_UFO)) |
979 | features |= RX_OFFLOADS; | 979 | features |= RX_OFFLOADS; |
980 | else | 980 | else |
981 | features &= ~RX_OFFLOADS; | 981 | features &= ~RX_OFFLOADS; |
@@ -1090,7 +1090,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd, | |||
1090 | case TUNSETOFFLOAD: | 1090 | case TUNSETOFFLOAD: |
1091 | /* let the user check for future flags */ | 1091 | /* let the user check for future flags */ |
1092 | if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | | 1092 | if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | |
1093 | TUN_F_TSO_ECN)) | 1093 | TUN_F_TSO_ECN | TUN_F_UFO)) |
1094 | return -EINVAL; | 1094 | return -EINVAL; |
1095 | 1095 | ||
1096 | rtnl_lock(); | 1096 | rtnl_lock(); |
diff --git a/drivers/net/ppp/ppp_deflate.c b/drivers/net/ppp/ppp_deflate.c index 602c625d95d5..b5edc7f96a39 100644 --- a/drivers/net/ppp/ppp_deflate.c +++ b/drivers/net/ppp/ppp_deflate.c | |||
@@ -246,7 +246,7 @@ static int z_compress(void *arg, unsigned char *rptr, unsigned char *obuf, | |||
246 | /* | 246 | /* |
247 | * See if we managed to reduce the size of the packet. | 247 | * See if we managed to reduce the size of the packet. |
248 | */ | 248 | */ |
249 | if (olen < isize) { | 249 | if (olen < isize && olen <= osize) { |
250 | state->stats.comp_bytes += olen; | 250 | state->stats.comp_bytes += olen; |
251 | state->stats.comp_packets++; | 251 | state->stats.comp_packets++; |
252 | } else { | 252 | } else { |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 8c8dc16839a7..10f9e4021b5a 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -65,7 +65,6 @@ | |||
65 | #include <linux/nsproxy.h> | 65 | #include <linux/nsproxy.h> |
66 | #include <linux/virtio_net.h> | 66 | #include <linux/virtio_net.h> |
67 | #include <linux/rcupdate.h> | 67 | #include <linux/rcupdate.h> |
68 | #include <net/ipv6.h> | ||
69 | #include <net/net_namespace.h> | 68 | #include <net/net_namespace.h> |
70 | #include <net/netns/generic.h> | 69 | #include <net/netns/generic.h> |
71 | #include <net/rtnetlink.h> | 70 | #include <net/rtnetlink.h> |
@@ -187,7 +186,7 @@ struct tun_struct { | |||
187 | struct net_device *dev; | 186 | struct net_device *dev; |
188 | netdev_features_t set_features; | 187 | netdev_features_t set_features; |
189 | #define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \ | 188 | #define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \ |
190 | NETIF_F_TSO6) | 189 | NETIF_F_TSO6|NETIF_F_UFO) |
191 | 190 | ||
192 | int vnet_hdr_sz; | 191 | int vnet_hdr_sz; |
193 | int sndbuf; | 192 | int sndbuf; |
@@ -1167,8 +1166,6 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
1167 | break; | 1166 | break; |
1168 | } | 1167 | } |
1169 | 1168 | ||
1170 | skb_reset_network_header(skb); | ||
1171 | |||
1172 | if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) { | 1169 | if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) { |
1173 | pr_debug("GSO!\n"); | 1170 | pr_debug("GSO!\n"); |
1174 | switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { | 1171 | switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) { |
@@ -1179,20 +1176,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
1179 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; | 1176 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; |
1180 | break; | 1177 | break; |
1181 | case VIRTIO_NET_HDR_GSO_UDP: | 1178 | case VIRTIO_NET_HDR_GSO_UDP: |
1182 | { | ||
1183 | static bool warned; | ||
1184 | |||
1185 | if (!warned) { | ||
1186 | warned = true; | ||
1187 | netdev_warn(tun->dev, | ||
1188 | "%s: using disabled UFO feature; please fix this program\n", | ||
1189 | current->comm); | ||
1190 | } | ||
1191 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | 1179 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; |
1192 | if (skb->protocol == htons(ETH_P_IPV6)) | ||
1193 | ipv6_proxy_select_ident(skb); | ||
1194 | break; | 1180 | break; |
1195 | } | ||
1196 | default: | 1181 | default: |
1197 | tun->dev->stats.rx_frame_errors++; | 1182 | tun->dev->stats.rx_frame_errors++; |
1198 | kfree_skb(skb); | 1183 | kfree_skb(skb); |
@@ -1221,6 +1206,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, | |||
1221 | skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; | 1206 | skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; |
1222 | } | 1207 | } |
1223 | 1208 | ||
1209 | skb_reset_network_header(skb); | ||
1224 | skb_probe_transport_header(skb, 0); | 1210 | skb_probe_transport_header(skb, 0); |
1225 | 1211 | ||
1226 | rxhash = skb_get_hash(skb); | 1212 | rxhash = skb_get_hash(skb); |
@@ -1298,6 +1284,8 @@ static ssize_t tun_put_user(struct tun_struct *tun, | |||
1298 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; | 1284 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; |
1299 | else if (sinfo->gso_type & SKB_GSO_TCPV6) | 1285 | else if (sinfo->gso_type & SKB_GSO_TCPV6) |
1300 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 1286 | gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
1287 | else if (sinfo->gso_type & SKB_GSO_UDP) | ||
1288 | gso.gso_type = VIRTIO_NET_HDR_GSO_UDP; | ||
1301 | else { | 1289 | else { |
1302 | pr_err("unexpected GSO type: " | 1290 | pr_err("unexpected GSO type: " |
1303 | "0x%x, gso_size %d, hdr_len %d\n", | 1291 | "0x%x, gso_size %d, hdr_len %d\n", |
@@ -1746,6 +1734,11 @@ static int set_offload(struct tun_struct *tun, unsigned long arg) | |||
1746 | features |= NETIF_F_TSO6; | 1734 | features |= NETIF_F_TSO6; |
1747 | arg &= ~(TUN_F_TSO4|TUN_F_TSO6); | 1735 | arg &= ~(TUN_F_TSO4|TUN_F_TSO6); |
1748 | } | 1736 | } |
1737 | |||
1738 | if (arg & TUN_F_UFO) { | ||
1739 | features |= NETIF_F_UFO; | ||
1740 | arg &= ~TUN_F_UFO; | ||
1741 | } | ||
1749 | } | 1742 | } |
1750 | 1743 | ||
1751 | /* This gives the user a way to test for new features in future by | 1744 | /* This gives the user a way to test for new features in future by |
diff --git a/drivers/net/usb/sr9700.c b/drivers/net/usb/sr9700.c index 99b69af14274..4a1e9c489f1f 100644 --- a/drivers/net/usb/sr9700.c +++ b/drivers/net/usb/sr9700.c | |||
@@ -77,7 +77,7 @@ static int wait_phy_eeprom_ready(struct usbnet *dev, int phy) | |||
77 | int ret; | 77 | int ret; |
78 | 78 | ||
79 | udelay(1); | 79 | udelay(1); |
80 | ret = sr_read_reg(dev, EPCR, &tmp); | 80 | ret = sr_read_reg(dev, SR_EPCR, &tmp); |
81 | if (ret < 0) | 81 | if (ret < 0) |
82 | return ret; | 82 | return ret; |
83 | 83 | ||
@@ -98,15 +98,15 @@ static int sr_share_read_word(struct usbnet *dev, int phy, u8 reg, | |||
98 | 98 | ||
99 | mutex_lock(&dev->phy_mutex); | 99 | mutex_lock(&dev->phy_mutex); |
100 | 100 | ||
101 | sr_write_reg(dev, EPAR, phy ? (reg | EPAR_PHY_ADR) : reg); | 101 | sr_write_reg(dev, SR_EPAR, phy ? (reg | EPAR_PHY_ADR) : reg); |
102 | sr_write_reg(dev, EPCR, phy ? (EPCR_EPOS | EPCR_ERPRR) : EPCR_ERPRR); | 102 | sr_write_reg(dev, SR_EPCR, phy ? (EPCR_EPOS | EPCR_ERPRR) : EPCR_ERPRR); |
103 | 103 | ||
104 | ret = wait_phy_eeprom_ready(dev, phy); | 104 | ret = wait_phy_eeprom_ready(dev, phy); |
105 | if (ret < 0) | 105 | if (ret < 0) |
106 | goto out_unlock; | 106 | goto out_unlock; |
107 | 107 | ||
108 | sr_write_reg(dev, EPCR, 0x0); | 108 | sr_write_reg(dev, SR_EPCR, 0x0); |
109 | ret = sr_read(dev, EPDR, 2, value); | 109 | ret = sr_read(dev, SR_EPDR, 2, value); |
110 | 110 | ||
111 | netdev_dbg(dev->net, "read shared %d 0x%02x returned 0x%04x, %d\n", | 111 | netdev_dbg(dev->net, "read shared %d 0x%02x returned 0x%04x, %d\n", |
112 | phy, reg, *value, ret); | 112 | phy, reg, *value, ret); |
@@ -123,19 +123,19 @@ static int sr_share_write_word(struct usbnet *dev, int phy, u8 reg, | |||
123 | 123 | ||
124 | mutex_lock(&dev->phy_mutex); | 124 | mutex_lock(&dev->phy_mutex); |
125 | 125 | ||
126 | ret = sr_write(dev, EPDR, 2, &value); | 126 | ret = sr_write(dev, SR_EPDR, 2, &value); |
127 | if (ret < 0) | 127 | if (ret < 0) |
128 | goto out_unlock; | 128 | goto out_unlock; |
129 | 129 | ||
130 | sr_write_reg(dev, EPAR, phy ? (reg | EPAR_PHY_ADR) : reg); | 130 | sr_write_reg(dev, SR_EPAR, phy ? (reg | EPAR_PHY_ADR) : reg); |
131 | sr_write_reg(dev, EPCR, phy ? (EPCR_WEP | EPCR_EPOS | EPCR_ERPRW) : | 131 | sr_write_reg(dev, SR_EPCR, phy ? (EPCR_WEP | EPCR_EPOS | EPCR_ERPRW) : |
132 | (EPCR_WEP | EPCR_ERPRW)); | 132 | (EPCR_WEP | EPCR_ERPRW)); |
133 | 133 | ||
134 | ret = wait_phy_eeprom_ready(dev, phy); | 134 | ret = wait_phy_eeprom_ready(dev, phy); |
135 | if (ret < 0) | 135 | if (ret < 0) |
136 | goto out_unlock; | 136 | goto out_unlock; |
137 | 137 | ||
138 | sr_write_reg(dev, EPCR, 0x0); | 138 | sr_write_reg(dev, SR_EPCR, 0x0); |
139 | 139 | ||
140 | out_unlock: | 140 | out_unlock: |
141 | mutex_unlock(&dev->phy_mutex); | 141 | mutex_unlock(&dev->phy_mutex); |
@@ -188,7 +188,7 @@ static int sr_mdio_read(struct net_device *netdev, int phy_id, int loc) | |||
188 | if (loc == MII_BMSR) { | 188 | if (loc == MII_BMSR) { |
189 | u8 value; | 189 | u8 value; |
190 | 190 | ||
191 | sr_read_reg(dev, NSR, &value); | 191 | sr_read_reg(dev, SR_NSR, &value); |
192 | if (value & NSR_LINKST) | 192 | if (value & NSR_LINKST) |
193 | rc = 1; | 193 | rc = 1; |
194 | } | 194 | } |
@@ -228,7 +228,7 @@ static u32 sr9700_get_link(struct net_device *netdev) | |||
228 | int rc = 0; | 228 | int rc = 0; |
229 | 229 | ||
230 | /* Get the Link Status directly */ | 230 | /* Get the Link Status directly */ |
231 | sr_read_reg(dev, NSR, &value); | 231 | sr_read_reg(dev, SR_NSR, &value); |
232 | if (value & NSR_LINKST) | 232 | if (value & NSR_LINKST) |
233 | rc = 1; | 233 | rc = 1; |
234 | 234 | ||
@@ -281,8 +281,8 @@ static void sr9700_set_multicast(struct net_device *netdev) | |||
281 | } | 281 | } |
282 | } | 282 | } |
283 | 283 | ||
284 | sr_write_async(dev, MAR, SR_MCAST_SIZE, hashes); | 284 | sr_write_async(dev, SR_MAR, SR_MCAST_SIZE, hashes); |
285 | sr_write_reg_async(dev, RCR, rx_ctl); | 285 | sr_write_reg_async(dev, SR_RCR, rx_ctl); |
286 | } | 286 | } |
287 | 287 | ||
288 | static int sr9700_set_mac_address(struct net_device *netdev, void *p) | 288 | static int sr9700_set_mac_address(struct net_device *netdev, void *p) |
@@ -297,7 +297,7 @@ static int sr9700_set_mac_address(struct net_device *netdev, void *p) | |||
297 | } | 297 | } |
298 | 298 | ||
299 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); | 299 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); |
300 | sr_write_async(dev, PAR, 6, netdev->dev_addr); | 300 | sr_write_async(dev, SR_PAR, 6, netdev->dev_addr); |
301 | 301 | ||
302 | return 0; | 302 | return 0; |
303 | } | 303 | } |
@@ -340,7 +340,7 @@ static int sr9700_bind(struct usbnet *dev, struct usb_interface *intf) | |||
340 | mii->phy_id_mask = 0x1f; | 340 | mii->phy_id_mask = 0x1f; |
341 | mii->reg_num_mask = 0x1f; | 341 | mii->reg_num_mask = 0x1f; |
342 | 342 | ||
343 | sr_write_reg(dev, NCR, NCR_RST); | 343 | sr_write_reg(dev, SR_NCR, NCR_RST); |
344 | udelay(20); | 344 | udelay(20); |
345 | 345 | ||
346 | /* read MAC | 346 | /* read MAC |
@@ -348,17 +348,17 @@ static int sr9700_bind(struct usbnet *dev, struct usb_interface *intf) | |||
348 | * EEPROM automatically to PAR. In case there is no EEPROM externally, | 348 | * EEPROM automatically to PAR. In case there is no EEPROM externally, |
349 | * a default MAC address is stored in PAR for making chip work properly. | 349 | * a default MAC address is stored in PAR for making chip work properly. |
350 | */ | 350 | */ |
351 | if (sr_read(dev, PAR, ETH_ALEN, netdev->dev_addr) < 0) { | 351 | if (sr_read(dev, SR_PAR, ETH_ALEN, netdev->dev_addr) < 0) { |
352 | netdev_err(netdev, "Error reading MAC address\n"); | 352 | netdev_err(netdev, "Error reading MAC address\n"); |
353 | ret = -ENODEV; | 353 | ret = -ENODEV; |
354 | goto out; | 354 | goto out; |
355 | } | 355 | } |
356 | 356 | ||
357 | /* power up and reset phy */ | 357 | /* power up and reset phy */ |
358 | sr_write_reg(dev, PRR, PRR_PHY_RST); | 358 | sr_write_reg(dev, SR_PRR, PRR_PHY_RST); |
359 | /* at least 10ms, here 20ms for safe */ | 359 | /* at least 10ms, here 20ms for safe */ |
360 | mdelay(20); | 360 | mdelay(20); |
361 | sr_write_reg(dev, PRR, 0); | 361 | sr_write_reg(dev, SR_PRR, 0); |
362 | /* at least 1ms, here 2ms for reading right register */ | 362 | /* at least 1ms, here 2ms for reading right register */ |
363 | udelay(2 * 1000); | 363 | udelay(2 * 1000); |
364 | 364 | ||
diff --git a/drivers/net/usb/sr9700.h b/drivers/net/usb/sr9700.h index fd687c575e74..258b030277e7 100644 --- a/drivers/net/usb/sr9700.h +++ b/drivers/net/usb/sr9700.h | |||
@@ -14,13 +14,13 @@ | |||
14 | /* sr9700 spec. register table on Linux platform */ | 14 | /* sr9700 spec. register table on Linux platform */ |
15 | 15 | ||
16 | /* Network Control Reg */ | 16 | /* Network Control Reg */ |
17 | #define NCR 0x00 | 17 | #define SR_NCR 0x00 |
18 | #define NCR_RST (1 << 0) | 18 | #define NCR_RST (1 << 0) |
19 | #define NCR_LBK (3 << 1) | 19 | #define NCR_LBK (3 << 1) |
20 | #define NCR_FDX (1 << 3) | 20 | #define NCR_FDX (1 << 3) |
21 | #define NCR_WAKEEN (1 << 6) | 21 | #define NCR_WAKEEN (1 << 6) |
22 | /* Network Status Reg */ | 22 | /* Network Status Reg */ |
23 | #define NSR 0x01 | 23 | #define SR_NSR 0x01 |
24 | #define NSR_RXRDY (1 << 0) | 24 | #define NSR_RXRDY (1 << 0) |
25 | #define NSR_RXOV (1 << 1) | 25 | #define NSR_RXOV (1 << 1) |
26 | #define NSR_TX1END (1 << 2) | 26 | #define NSR_TX1END (1 << 2) |
@@ -30,7 +30,7 @@ | |||
30 | #define NSR_LINKST (1 << 6) | 30 | #define NSR_LINKST (1 << 6) |
31 | #define NSR_SPEED (1 << 7) | 31 | #define NSR_SPEED (1 << 7) |
32 | /* Tx Control Reg */ | 32 | /* Tx Control Reg */ |
33 | #define TCR 0x02 | 33 | #define SR_TCR 0x02 |
34 | #define TCR_CRC_DIS (1 << 1) | 34 | #define TCR_CRC_DIS (1 << 1) |
35 | #define TCR_PAD_DIS (1 << 2) | 35 | #define TCR_PAD_DIS (1 << 2) |
36 | #define TCR_LC_CARE (1 << 3) | 36 | #define TCR_LC_CARE (1 << 3) |
@@ -38,7 +38,7 @@ | |||
38 | #define TCR_EXCECM (1 << 5) | 38 | #define TCR_EXCECM (1 << 5) |
39 | #define TCR_LF_EN (1 << 6) | 39 | #define TCR_LF_EN (1 << 6) |
40 | /* Tx Status Reg for Packet Index 1 */ | 40 | /* Tx Status Reg for Packet Index 1 */ |
41 | #define TSR1 0x03 | 41 | #define SR_TSR1 0x03 |
42 | #define TSR1_EC (1 << 2) | 42 | #define TSR1_EC (1 << 2) |
43 | #define TSR1_COL (1 << 3) | 43 | #define TSR1_COL (1 << 3) |
44 | #define TSR1_LC (1 << 4) | 44 | #define TSR1_LC (1 << 4) |
@@ -46,7 +46,7 @@ | |||
46 | #define TSR1_LOC (1 << 6) | 46 | #define TSR1_LOC (1 << 6) |
47 | #define TSR1_TLF (1 << 7) | 47 | #define TSR1_TLF (1 << 7) |
48 | /* Tx Status Reg for Packet Index 2 */ | 48 | /* Tx Status Reg for Packet Index 2 */ |
49 | #define TSR2 0x04 | 49 | #define SR_TSR2 0x04 |
50 | #define TSR2_EC (1 << 2) | 50 | #define TSR2_EC (1 << 2) |
51 | #define TSR2_COL (1 << 3) | 51 | #define TSR2_COL (1 << 3) |
52 | #define TSR2_LC (1 << 4) | 52 | #define TSR2_LC (1 << 4) |
@@ -54,7 +54,7 @@ | |||
54 | #define TSR2_LOC (1 << 6) | 54 | #define TSR2_LOC (1 << 6) |
55 | #define TSR2_TLF (1 << 7) | 55 | #define TSR2_TLF (1 << 7) |
56 | /* Rx Control Reg*/ | 56 | /* Rx Control Reg*/ |
57 | #define RCR 0x05 | 57 | #define SR_RCR 0x05 |
58 | #define RCR_RXEN (1 << 0) | 58 | #define RCR_RXEN (1 << 0) |
59 | #define RCR_PRMSC (1 << 1) | 59 | #define RCR_PRMSC (1 << 1) |
60 | #define RCR_RUNT (1 << 2) | 60 | #define RCR_RUNT (1 << 2) |
@@ -62,87 +62,87 @@ | |||
62 | #define RCR_DIS_CRC (1 << 4) | 62 | #define RCR_DIS_CRC (1 << 4) |
63 | #define RCR_DIS_LONG (1 << 5) | 63 | #define RCR_DIS_LONG (1 << 5) |
64 | /* Rx Status Reg */ | 64 | /* Rx Status Reg */ |
65 | #define RSR 0x06 | 65 | #define SR_RSR 0x06 |
66 | #define RSR_AE (1 << 2) | 66 | #define RSR_AE (1 << 2) |
67 | #define RSR_MF (1 << 6) | 67 | #define RSR_MF (1 << 6) |
68 | #define RSR_RF (1 << 7) | 68 | #define RSR_RF (1 << 7) |
69 | /* Rx Overflow Counter Reg */ | 69 | /* Rx Overflow Counter Reg */ |
70 | #define ROCR 0x07 | 70 | #define SR_ROCR 0x07 |
71 | #define ROCR_ROC (0x7F << 0) | 71 | #define ROCR_ROC (0x7F << 0) |
72 | #define ROCR_RXFU (1 << 7) | 72 | #define ROCR_RXFU (1 << 7) |
73 | /* Back Pressure Threshold Reg */ | 73 | /* Back Pressure Threshold Reg */ |
74 | #define BPTR 0x08 | 74 | #define SR_BPTR 0x08 |
75 | #define BPTR_JPT (0x0F << 0) | 75 | #define BPTR_JPT (0x0F << 0) |
76 | #define BPTR_BPHW (0x0F << 4) | 76 | #define BPTR_BPHW (0x0F << 4) |
77 | /* Flow Control Threshold Reg */ | 77 | /* Flow Control Threshold Reg */ |
78 | #define FCTR 0x09 | 78 | #define SR_FCTR 0x09 |
79 | #define FCTR_LWOT (0x0F << 0) | 79 | #define FCTR_LWOT (0x0F << 0) |
80 | #define FCTR_HWOT (0x0F << 4) | 80 | #define FCTR_HWOT (0x0F << 4) |
81 | /* rx/tx Flow Control Reg */ | 81 | /* rx/tx Flow Control Reg */ |
82 | #define FCR 0x0A | 82 | #define SR_FCR 0x0A |
83 | #define FCR_FLCE (1 << 0) | 83 | #define FCR_FLCE (1 << 0) |
84 | #define FCR_BKPA (1 << 4) | 84 | #define FCR_BKPA (1 << 4) |
85 | #define FCR_TXPEN (1 << 5) | 85 | #define FCR_TXPEN (1 << 5) |
86 | #define FCR_TXPF (1 << 6) | 86 | #define FCR_TXPF (1 << 6) |
87 | #define FCR_TXP0 (1 << 7) | 87 | #define FCR_TXP0 (1 << 7) |
88 | /* Eeprom & Phy Control Reg */ | 88 | /* Eeprom & Phy Control Reg */ |
89 | #define EPCR 0x0B | 89 | #define SR_EPCR 0x0B |
90 | #define EPCR_ERRE (1 << 0) | 90 | #define EPCR_ERRE (1 << 0) |
91 | #define EPCR_ERPRW (1 << 1) | 91 | #define EPCR_ERPRW (1 << 1) |
92 | #define EPCR_ERPRR (1 << 2) | 92 | #define EPCR_ERPRR (1 << 2) |
93 | #define EPCR_EPOS (1 << 3) | 93 | #define EPCR_EPOS (1 << 3) |
94 | #define EPCR_WEP (1 << 4) | 94 | #define EPCR_WEP (1 << 4) |
95 | /* Eeprom & Phy Address Reg */ | 95 | /* Eeprom & Phy Address Reg */ |
96 | #define EPAR 0x0C | 96 | #define SR_EPAR 0x0C |
97 | #define EPAR_EROA (0x3F << 0) | 97 | #define EPAR_EROA (0x3F << 0) |
98 | #define EPAR_PHY_ADR_MASK (0x03 << 6) | 98 | #define EPAR_PHY_ADR_MASK (0x03 << 6) |
99 | #define EPAR_PHY_ADR (0x01 << 6) | 99 | #define EPAR_PHY_ADR (0x01 << 6) |
100 | /* Eeprom & Phy Data Reg */ | 100 | /* Eeprom & Phy Data Reg */ |
101 | #define EPDR 0x0D /* 0x0D ~ 0x0E for Data Reg Low & High */ | 101 | #define SR_EPDR 0x0D /* 0x0D ~ 0x0E for Data Reg Low & High */ |
102 | /* Wakeup Control Reg */ | 102 | /* Wakeup Control Reg */ |
103 | #define WCR 0x0F | 103 | #define SR_WCR 0x0F |
104 | #define WCR_MAGICST (1 << 0) | 104 | #define WCR_MAGICST (1 << 0) |
105 | #define WCR_LINKST (1 << 2) | 105 | #define WCR_LINKST (1 << 2) |
106 | #define WCR_MAGICEN (1 << 3) | 106 | #define WCR_MAGICEN (1 << 3) |
107 | #define WCR_LINKEN (1 << 5) | 107 | #define WCR_LINKEN (1 << 5) |
108 | /* Physical Address Reg */ | 108 | /* Physical Address Reg */ |
109 | #define PAR 0x10 /* 0x10 ~ 0x15 6 bytes for PAR */ | 109 | #define SR_PAR 0x10 /* 0x10 ~ 0x15 6 bytes for PAR */ |
110 | /* Multicast Address Reg */ | 110 | /* Multicast Address Reg */ |
111 | #define MAR 0x16 /* 0x16 ~ 0x1D 8 bytes for MAR */ | 111 | #define SR_MAR 0x16 /* 0x16 ~ 0x1D 8 bytes for MAR */ |
112 | /* 0x1e unused */ | 112 | /* 0x1e unused */ |
113 | /* Phy Reset Reg */ | 113 | /* Phy Reset Reg */ |
114 | #define PRR 0x1F | 114 | #define SR_PRR 0x1F |
115 | #define PRR_PHY_RST (1 << 0) | 115 | #define PRR_PHY_RST (1 << 0) |
116 | /* Tx sdram Write Pointer Address Low */ | 116 | /* Tx sdram Write Pointer Address Low */ |
117 | #define TWPAL 0x20 | 117 | #define SR_TWPAL 0x20 |
118 | /* Tx sdram Write Pointer Address High */ | 118 | /* Tx sdram Write Pointer Address High */ |
119 | #define TWPAH 0x21 | 119 | #define SR_TWPAH 0x21 |
120 | /* Tx sdram Read Pointer Address Low */ | 120 | /* Tx sdram Read Pointer Address Low */ |
121 | #define TRPAL 0x22 | 121 | #define SR_TRPAL 0x22 |
122 | /* Tx sdram Read Pointer Address High */ | 122 | /* Tx sdram Read Pointer Address High */ |
123 | #define TRPAH 0x23 | 123 | #define SR_TRPAH 0x23 |
124 | /* Rx sdram Write Pointer Address Low */ | 124 | /* Rx sdram Write Pointer Address Low */ |
125 | #define RWPAL 0x24 | 125 | #define SR_RWPAL 0x24 |
126 | /* Rx sdram Write Pointer Address High */ | 126 | /* Rx sdram Write Pointer Address High */ |
127 | #define RWPAH 0x25 | 127 | #define SR_RWPAH 0x25 |
128 | /* Rx sdram Read Pointer Address Low */ | 128 | /* Rx sdram Read Pointer Address Low */ |
129 | #define RRPAL 0x26 | 129 | #define SR_RRPAL 0x26 |
130 | /* Rx sdram Read Pointer Address High */ | 130 | /* Rx sdram Read Pointer Address High */ |
131 | #define RRPAH 0x27 | 131 | #define SR_RRPAH 0x27 |
132 | /* Vendor ID register */ | 132 | /* Vendor ID register */ |
133 | #define VID 0x28 /* 0x28 ~ 0x29 2 bytes for VID */ | 133 | #define SR_VID 0x28 /* 0x28 ~ 0x29 2 bytes for VID */ |
134 | /* Product ID register */ | 134 | /* Product ID register */ |
135 | #define PID 0x2A /* 0x2A ~ 0x2B 2 bytes for PID */ | 135 | #define SR_PID 0x2A /* 0x2A ~ 0x2B 2 bytes for PID */ |
136 | /* CHIP Revision register */ | 136 | /* CHIP Revision register */ |
137 | #define CHIPR 0x2C | 137 | #define SR_CHIPR 0x2C |
138 | /* 0x2D --> 0xEF unused */ | 138 | /* 0x2D --> 0xEF unused */ |
139 | /* USB Device Address */ | 139 | /* USB Device Address */ |
140 | #define USBDA 0xF0 | 140 | #define SR_USBDA 0xF0 |
141 | #define USBDA_USBFA (0x7F << 0) | 141 | #define USBDA_USBFA (0x7F << 0) |
142 | /* RX packet Counter Reg */ | 142 | /* RX packet Counter Reg */ |
143 | #define RXC 0xF1 | 143 | #define SR_RXC 0xF1 |
144 | /* Tx packet Counter & USB Status Reg */ | 144 | /* Tx packet Counter & USB Status Reg */ |
145 | #define TXC_USBS 0xF2 | 145 | #define SR_TXC_USBS 0xF2 |
146 | #define TXC_USBS_TXC0 (1 << 0) | 146 | #define TXC_USBS_TXC0 (1 << 0) |
147 | #define TXC_USBS_TXC1 (1 << 1) | 147 | #define TXC_USBS_TXC1 (1 << 1) |
148 | #define TXC_USBS_TXC2 (1 << 2) | 148 | #define TXC_USBS_TXC2 (1 << 2) |
@@ -150,7 +150,7 @@ | |||
150 | #define TXC_USBS_SUSFLAG (1 << 6) | 150 | #define TXC_USBS_SUSFLAG (1 << 6) |
151 | #define TXC_USBS_RXFAULT (1 << 7) | 151 | #define TXC_USBS_RXFAULT (1 << 7) |
152 | /* USB Control register */ | 152 | /* USB Control register */ |
153 | #define USBC 0xF4 | 153 | #define SR_USBC 0xF4 |
154 | #define USBC_EP3NAK (1 << 4) | 154 | #define USBC_EP3NAK (1 << 4) |
155 | #define USBC_EP3ACK (1 << 5) | 155 | #define USBC_EP3ACK (1 << 5) |
156 | 156 | ||
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 5ca97713bfb3..059fdf1bf5ee 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -490,17 +490,8 @@ static void receive_buf(struct virtnet_info *vi, struct receive_queue *rq, | |||
490 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; | 490 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; |
491 | break; | 491 | break; |
492 | case VIRTIO_NET_HDR_GSO_UDP: | 492 | case VIRTIO_NET_HDR_GSO_UDP: |
493 | { | ||
494 | static bool warned; | ||
495 | |||
496 | if (!warned) { | ||
497 | warned = true; | ||
498 | netdev_warn(dev, | ||
499 | "host using disabled UFO feature; please fix it\n"); | ||
500 | } | ||
501 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | 493 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; |
502 | break; | 494 | break; |
503 | } | ||
504 | case VIRTIO_NET_HDR_GSO_TCPV6: | 495 | case VIRTIO_NET_HDR_GSO_TCPV6: |
505 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; | 496 | skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; |
506 | break; | 497 | break; |
@@ -888,6 +879,8 @@ static int xmit_skb(struct send_queue *sq, struct sk_buff *skb) | |||
888 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; | 879 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV4; |
889 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) | 880 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_TCPV6) |
890 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; | 881 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; |
882 | else if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) | ||
883 | hdr->hdr.gso_type = VIRTIO_NET_HDR_GSO_UDP; | ||
891 | else | 884 | else |
892 | BUG(); | 885 | BUG(); |
893 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_ECN) | 886 | if (skb_shinfo(skb)->gso_type & SKB_GSO_TCP_ECN) |
@@ -1748,7 +1741,7 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
1748 | dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST; | 1741 | dev->features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST; |
1749 | 1742 | ||
1750 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) { | 1743 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GSO)) { |
1751 | dev->hw_features |= NETIF_F_TSO | 1744 | dev->hw_features |= NETIF_F_TSO | NETIF_F_UFO |
1752 | | NETIF_F_TSO_ECN | NETIF_F_TSO6; | 1745 | | NETIF_F_TSO_ECN | NETIF_F_TSO6; |
1753 | } | 1746 | } |
1754 | /* Individual feature bits: what can host handle? */ | 1747 | /* Individual feature bits: what can host handle? */ |
@@ -1758,9 +1751,11 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
1758 | dev->hw_features |= NETIF_F_TSO6; | 1751 | dev->hw_features |= NETIF_F_TSO6; |
1759 | if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN)) | 1752 | if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_ECN)) |
1760 | dev->hw_features |= NETIF_F_TSO_ECN; | 1753 | dev->hw_features |= NETIF_F_TSO_ECN; |
1754 | if (virtio_has_feature(vdev, VIRTIO_NET_F_HOST_UFO)) | ||
1755 | dev->hw_features |= NETIF_F_UFO; | ||
1761 | 1756 | ||
1762 | if (gso) | 1757 | if (gso) |
1763 | dev->features |= dev->hw_features & NETIF_F_ALL_TSO; | 1758 | dev->features |= dev->hw_features & (NETIF_F_ALL_TSO|NETIF_F_UFO); |
1764 | /* (!csum && gso) case will be fixed by register_netdev() */ | 1759 | /* (!csum && gso) case will be fixed by register_netdev() */ |
1765 | } | 1760 | } |
1766 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM)) | 1761 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_CSUM)) |
@@ -1798,7 +1793,8 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
1798 | /* If we can receive ANY GSO packets, we must allocate large ones. */ | 1793 | /* If we can receive ANY GSO packets, we must allocate large ones. */ |
1799 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || | 1794 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || |
1800 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || | 1795 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || |
1801 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN)) | 1796 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN) || |
1797 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UFO)) | ||
1802 | vi->big_packets = true; | 1798 | vi->big_packets = true; |
1803 | 1799 | ||
1804 | if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) | 1800 | if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) |
@@ -1994,9 +1990,9 @@ static struct virtio_device_id id_table[] = { | |||
1994 | static unsigned int features[] = { | 1990 | static unsigned int features[] = { |
1995 | VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, | 1991 | VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, |
1996 | VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, | 1992 | VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, |
1997 | VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_TSO6, | 1993 | VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, |
1998 | VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, | 1994 | VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, |
1999 | VIRTIO_NET_F_GUEST_ECN, | 1995 | VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, |
2000 | VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, | 1996 | VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, |
2001 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, | 1997 | VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, |
2002 | VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, | 1998 | VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 7fbd89fbe107..a8c755dcab14 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -2432,10 +2432,10 @@ static void vxlan_sock_work(struct work_struct *work) | |||
2432 | dev_put(vxlan->dev); | 2432 | dev_put(vxlan->dev); |
2433 | } | 2433 | } |
2434 | 2434 | ||
2435 | static int vxlan_newlink(struct net *net, struct net_device *dev, | 2435 | static int vxlan_newlink(struct net *src_net, struct net_device *dev, |
2436 | struct nlattr *tb[], struct nlattr *data[]) | 2436 | struct nlattr *tb[], struct nlattr *data[]) |
2437 | { | 2437 | { |
2438 | struct vxlan_net *vn = net_generic(net, vxlan_net_id); | 2438 | struct vxlan_net *vn = net_generic(src_net, vxlan_net_id); |
2439 | struct vxlan_dev *vxlan = netdev_priv(dev); | 2439 | struct vxlan_dev *vxlan = netdev_priv(dev); |
2440 | struct vxlan_rdst *dst = &vxlan->default_dst; | 2440 | struct vxlan_rdst *dst = &vxlan->default_dst; |
2441 | __u32 vni; | 2441 | __u32 vni; |
@@ -2445,7 +2445,7 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
2445 | if (!data[IFLA_VXLAN_ID]) | 2445 | if (!data[IFLA_VXLAN_ID]) |
2446 | return -EINVAL; | 2446 | return -EINVAL; |
2447 | 2447 | ||
2448 | vxlan->net = dev_net(dev); | 2448 | vxlan->net = src_net; |
2449 | 2449 | ||
2450 | vni = nla_get_u32(data[IFLA_VXLAN_ID]); | 2450 | vni = nla_get_u32(data[IFLA_VXLAN_ID]); |
2451 | dst->remote_vni = vni; | 2451 | dst->remote_vni = vni; |
@@ -2481,7 +2481,7 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
2481 | if (data[IFLA_VXLAN_LINK] && | 2481 | if (data[IFLA_VXLAN_LINK] && |
2482 | (dst->remote_ifindex = nla_get_u32(data[IFLA_VXLAN_LINK]))) { | 2482 | (dst->remote_ifindex = nla_get_u32(data[IFLA_VXLAN_LINK]))) { |
2483 | struct net_device *lowerdev | 2483 | struct net_device *lowerdev |
2484 | = __dev_get_by_index(net, dst->remote_ifindex); | 2484 | = __dev_get_by_index(src_net, dst->remote_ifindex); |
2485 | 2485 | ||
2486 | if (!lowerdev) { | 2486 | if (!lowerdev) { |
2487 | pr_info("ifindex %d does not exist\n", dst->remote_ifindex); | 2487 | pr_info("ifindex %d does not exist\n", dst->remote_ifindex); |
@@ -2557,7 +2557,7 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
2557 | nla_get_u8(data[IFLA_VXLAN_UDP_ZERO_CSUM6_RX])) | 2557 | nla_get_u8(data[IFLA_VXLAN_UDP_ZERO_CSUM6_RX])) |
2558 | vxlan->flags |= VXLAN_F_UDP_ZERO_CSUM6_RX; | 2558 | vxlan->flags |= VXLAN_F_UDP_ZERO_CSUM6_RX; |
2559 | 2559 | ||
2560 | if (vxlan_find_vni(net, vni, use_ipv6 ? AF_INET6 : AF_INET, | 2560 | if (vxlan_find_vni(src_net, vni, use_ipv6 ? AF_INET6 : AF_INET, |
2561 | vxlan->dst_port)) { | 2561 | vxlan->dst_port)) { |
2562 | pr_info("duplicate VNI %u\n", vni); | 2562 | pr_info("duplicate VNI %u\n", vni); |
2563 | return -EEXIST; | 2563 | return -EEXIST; |
diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index 94e234975c61..a2fdd15f285a 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig | |||
@@ -25,7 +25,7 @@ if WAN | |||
25 | # There is no way to detect a comtrol sv11 - force it modular for now. | 25 | # There is no way to detect a comtrol sv11 - force it modular for now. |
26 | config HOSTESS_SV11 | 26 | config HOSTESS_SV11 |
27 | tristate "Comtrol Hostess SV-11 support" | 27 | tristate "Comtrol Hostess SV-11 support" |
28 | depends on ISA && m && ISA_DMA_API && INET && HDLC | 28 | depends on ISA && m && ISA_DMA_API && INET && HDLC && VIRT_TO_BUS |
29 | help | 29 | help |
30 | Driver for Comtrol Hostess SV-11 network card which | 30 | Driver for Comtrol Hostess SV-11 network card which |
31 | operates on low speed synchronous serial links at up to | 31 | operates on low speed synchronous serial links at up to |
@@ -37,7 +37,7 @@ config HOSTESS_SV11 | |||
37 | # The COSA/SRP driver has not been tested as non-modular yet. | 37 | # The COSA/SRP driver has not been tested as non-modular yet. |
38 | config COSA | 38 | config COSA |
39 | tristate "COSA/SRP sync serial boards support" | 39 | tristate "COSA/SRP sync serial boards support" |
40 | depends on ISA && m && ISA_DMA_API && HDLC | 40 | depends on ISA && m && ISA_DMA_API && HDLC && VIRT_TO_BUS |
41 | ---help--- | 41 | ---help--- |
42 | Driver for COSA and SRP synchronous serial boards. | 42 | Driver for COSA and SRP synchronous serial boards. |
43 | 43 | ||
@@ -87,7 +87,7 @@ config LANMEDIA | |||
87 | # There is no way to detect a Sealevel board. Force it modular | 87 | # There is no way to detect a Sealevel board. Force it modular |
88 | config SEALEVEL_4021 | 88 | config SEALEVEL_4021 |
89 | tristate "Sealevel Systems 4021 support" | 89 | tristate "Sealevel Systems 4021 support" |
90 | depends on ISA && m && ISA_DMA_API && INET && HDLC | 90 | depends on ISA && m && ISA_DMA_API && INET && HDLC && VIRT_TO_BUS |
91 | help | 91 | help |
92 | This is a driver for the Sealevel Systems ACB 56 serial I/O adapter. | 92 | This is a driver for the Sealevel Systems ACB 56 serial I/O adapter. |
93 | 93 | ||
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 9259a732e8a4..037f74f0fcf6 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c | |||
@@ -578,6 +578,7 @@ int xenvif_connect(struct xenvif_queue *queue, unsigned long tx_ring_ref, | |||
578 | goto err_rx_unbind; | 578 | goto err_rx_unbind; |
579 | } | 579 | } |
580 | queue->task = task; | 580 | queue->task = task; |
581 | get_task_struct(task); | ||
581 | 582 | ||
582 | task = kthread_create(xenvif_dealloc_kthread, | 583 | task = kthread_create(xenvif_dealloc_kthread, |
583 | (void *)queue, "%s-dealloc", queue->name); | 584 | (void *)queue, "%s-dealloc", queue->name); |
@@ -634,6 +635,7 @@ void xenvif_disconnect(struct xenvif *vif) | |||
634 | 635 | ||
635 | if (queue->task) { | 636 | if (queue->task) { |
636 | kthread_stop(queue->task); | 637 | kthread_stop(queue->task); |
638 | put_task_struct(queue->task); | ||
637 | queue->task = NULL; | 639 | queue->task = NULL; |
638 | } | 640 | } |
639 | 641 | ||
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 908e65e9b821..c8ce701a7efb 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
@@ -2109,8 +2109,7 @@ int xenvif_kthread_guest_rx(void *data) | |||
2109 | */ | 2109 | */ |
2110 | if (unlikely(vif->disabled && queue->id == 0)) { | 2110 | if (unlikely(vif->disabled && queue->id == 0)) { |
2111 | xenvif_carrier_off(vif); | 2111 | xenvif_carrier_off(vif); |
2112 | xenvif_rx_queue_purge(queue); | 2112 | break; |
2113 | continue; | ||
2114 | } | 2113 | } |
2115 | 2114 | ||
2116 | if (!skb_queue_empty(&queue->rx_queue)) | 2115 | if (!skb_queue_empty(&queue->rx_queue)) |
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index df781cdf13c1..17ca98657a28 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c | |||
@@ -283,6 +283,9 @@ static int dw_msi_setup_irq(struct msi_controller *chip, struct pci_dev *pdev, | |||
283 | struct msi_msg msg; | 283 | struct msi_msg msg; |
284 | struct pcie_port *pp = sys_to_pcie(pdev->bus->sysdata); | 284 | struct pcie_port *pp = sys_to_pcie(pdev->bus->sysdata); |
285 | 285 | ||
286 | if (desc->msi_attrib.is_msix) | ||
287 | return -EINVAL; | ||
288 | |||
286 | irq = assign_irq(1, desc, &pos); | 289 | irq = assign_irq(1, desc, &pos); |
287 | if (irq < 0) | 290 | if (irq < 0) |
288 | return irq; | 291 | return irq; |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index e52356aa09b8..903d5078b5ed 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -324,18 +324,52 @@ static void quirk_s3_64M(struct pci_dev *dev) | |||
324 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); | 324 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M); |
325 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M); | 325 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M); |
326 | 326 | ||
327 | static void quirk_io(struct pci_dev *dev, int pos, unsigned size, | ||
328 | const char *name) | ||
329 | { | ||
330 | u32 region; | ||
331 | struct pci_bus_region bus_region; | ||
332 | struct resource *res = dev->resource + pos; | ||
333 | |||
334 | pci_read_config_dword(dev, PCI_BASE_ADDRESS_0 + (pos << 2), ®ion); | ||
335 | |||
336 | if (!region) | ||
337 | return; | ||
338 | |||
339 | res->name = pci_name(dev); | ||
340 | res->flags = region & ~PCI_BASE_ADDRESS_IO_MASK; | ||
341 | res->flags |= | ||
342 | (IORESOURCE_IO | IORESOURCE_PCI_FIXED | IORESOURCE_SIZEALIGN); | ||
343 | region &= ~(size - 1); | ||
344 | |||
345 | /* Convert from PCI bus to resource space */ | ||
346 | bus_region.start = region; | ||
347 | bus_region.end = region + size - 1; | ||
348 | pcibios_bus_to_resource(dev->bus, res, &bus_region); | ||
349 | |||
350 | dev_info(&dev->dev, FW_BUG "%s quirk: reg 0x%x: %pR\n", | ||
351 | name, PCI_BASE_ADDRESS_0 + (pos << 2), res); | ||
352 | } | ||
353 | |||
327 | /* | 354 | /* |
328 | * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS | 355 | * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS |
329 | * ver. 1.33 20070103) don't set the correct ISA PCI region header info. | 356 | * ver. 1.33 20070103) don't set the correct ISA PCI region header info. |
330 | * BAR0 should be 8 bytes; instead, it may be set to something like 8k | 357 | * BAR0 should be 8 bytes; instead, it may be set to something like 8k |
331 | * (which conflicts w/ BAR1's memory range). | 358 | * (which conflicts w/ BAR1's memory range). |
359 | * | ||
360 | * CS553x's ISA PCI BARs may also be read-only (ref: | ||
361 | * https://bugzilla.kernel.org/show_bug.cgi?id=85991 - Comment #4 forward). | ||
332 | */ | 362 | */ |
333 | static void quirk_cs5536_vsa(struct pci_dev *dev) | 363 | static void quirk_cs5536_vsa(struct pci_dev *dev) |
334 | { | 364 | { |
365 | static char *name = "CS5536 ISA bridge"; | ||
366 | |||
335 | if (pci_resource_len(dev, 0) != 8) { | 367 | if (pci_resource_len(dev, 0) != 8) { |
336 | struct resource *res = &dev->resource[0]; | 368 | quirk_io(dev, 0, 8, name); /* SMB */ |
337 | res->end = res->start + 8 - 1; | 369 | quirk_io(dev, 1, 256, name); /* GPIO */ |
338 | dev_info(&dev->dev, "CS5536 ISA bridge bug detected (incorrect header); workaround applied\n"); | 370 | quirk_io(dev, 2, 64, name); /* MFGPT */ |
371 | dev_info(&dev->dev, "%s bug detected (incorrect header); workaround applied\n", | ||
372 | name); | ||
339 | } | 373 | } |
340 | } | 374 | } |
341 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa); | 375 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CS5536_ISA, quirk_cs5536_vsa); |
diff --git a/drivers/scsi/device_handler/scsi_dh.c b/drivers/scsi/device_handler/scsi_dh.c index 1dba62c5cf6a..1efebc9eedfb 100644 --- a/drivers/scsi/device_handler/scsi_dh.c +++ b/drivers/scsi/device_handler/scsi_dh.c | |||
@@ -136,11 +136,12 @@ static void __detach_handler (struct kref *kref) | |||
136 | struct scsi_device_handler *scsi_dh = scsi_dh_data->scsi_dh; | 136 | struct scsi_device_handler *scsi_dh = scsi_dh_data->scsi_dh; |
137 | struct scsi_device *sdev = scsi_dh_data->sdev; | 137 | struct scsi_device *sdev = scsi_dh_data->sdev; |
138 | 138 | ||
139 | scsi_dh->detach(sdev); | ||
140 | |||
139 | spin_lock_irq(sdev->request_queue->queue_lock); | 141 | spin_lock_irq(sdev->request_queue->queue_lock); |
140 | sdev->scsi_dh_data = NULL; | 142 | sdev->scsi_dh_data = NULL; |
141 | spin_unlock_irq(sdev->request_queue->queue_lock); | 143 | spin_unlock_irq(sdev->request_queue->queue_lock); |
142 | 144 | ||
143 | scsi_dh->detach(sdev); | ||
144 | sdev_printk(KERN_NOTICE, sdev, "%s: Detached\n", scsi_dh->name); | 145 | sdev_printk(KERN_NOTICE, sdev, "%s: Detached\n", scsi_dh->name); |
145 | module_put(scsi_dh->module); | 146 | module_put(scsi_dh->module); |
146 | } | 147 | } |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 399516925d80..05ea0d49a3a3 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -2800,9 +2800,11 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
2800 | */ | 2800 | */ |
2801 | sd_set_flush_flag(sdkp); | 2801 | sd_set_flush_flag(sdkp); |
2802 | 2802 | ||
2803 | max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), | 2803 | max_xfer = sdkp->max_xfer_blocks; |
2804 | sdkp->max_xfer_blocks); | ||
2805 | max_xfer <<= ilog2(sdp->sector_size) - 9; | 2804 | max_xfer <<= ilog2(sdp->sector_size) - 9; |
2805 | |||
2806 | max_xfer = min_not_zero(queue_max_hw_sectors(sdkp->disk->queue), | ||
2807 | max_xfer); | ||
2806 | blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer); | 2808 | blk_queue_max_hw_sectors(sdkp->disk->queue, max_xfer); |
2807 | set_capacity(disk, sdkp->capacity); | 2809 | set_capacity(disk, sdkp->capacity); |
2808 | sd_config_write_same(sdkp); | 2810 | sd_config_write_same(sdkp); |
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c index 4cda994d3f40..9b80d54d4ddb 100644 --- a/drivers/spi/spi-fsl-dspi.c +++ b/drivers/spi/spi-fsl-dspi.c | |||
@@ -342,8 +342,7 @@ static int dspi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) | |||
342 | /* Only alloc on first setup */ | 342 | /* Only alloc on first setup */ |
343 | chip = spi_get_ctldata(spi); | 343 | chip = spi_get_ctldata(spi); |
344 | if (chip == NULL) { | 344 | if (chip == NULL) { |
345 | chip = devm_kzalloc(&spi->dev, sizeof(struct chip_data), | 345 | chip = kzalloc(sizeof(struct chip_data), GFP_KERNEL); |
346 | GFP_KERNEL); | ||
347 | if (!chip) | 346 | if (!chip) |
348 | return -ENOMEM; | 347 | return -ENOMEM; |
349 | } | 348 | } |
@@ -382,6 +381,16 @@ static int dspi_setup(struct spi_device *spi) | |||
382 | return dspi_setup_transfer(spi, NULL); | 381 | return dspi_setup_transfer(spi, NULL); |
383 | } | 382 | } |
384 | 383 | ||
384 | static void dspi_cleanup(struct spi_device *spi) | ||
385 | { | ||
386 | struct chip_data *chip = spi_get_ctldata((struct spi_device *)spi); | ||
387 | |||
388 | dev_dbg(&spi->dev, "spi_device %u.%u cleanup\n", | ||
389 | spi->master->bus_num, spi->chip_select); | ||
390 | |||
391 | kfree(chip); | ||
392 | } | ||
393 | |||
385 | static irqreturn_t dspi_interrupt(int irq, void *dev_id) | 394 | static irqreturn_t dspi_interrupt(int irq, void *dev_id) |
386 | { | 395 | { |
387 | struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; | 396 | struct fsl_dspi *dspi = (struct fsl_dspi *)dev_id; |
@@ -467,6 +476,7 @@ static int dspi_probe(struct platform_device *pdev) | |||
467 | dspi->bitbang.master->setup = dspi_setup; | 476 | dspi->bitbang.master->setup = dspi_setup; |
468 | dspi->bitbang.master->dev.of_node = pdev->dev.of_node; | 477 | dspi->bitbang.master->dev.of_node = pdev->dev.of_node; |
469 | 478 | ||
479 | master->cleanup = dspi_cleanup; | ||
470 | master->mode_bits = SPI_CPOL | SPI_CPHA; | 480 | master->mode_bits = SPI_CPOL | SPI_CPHA; |
471 | master->bits_per_word_mask = SPI_BPW_MASK(4) | SPI_BPW_MASK(8) | | 481 | master->bits_per_word_mask = SPI_BPW_MASK(4) | SPI_BPW_MASK(8) | |
472 | SPI_BPW_MASK(16); | 482 | SPI_BPW_MASK(16); |
diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 961b97d43b43..fe1b7699fab6 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c | |||
@@ -823,6 +823,10 @@ static int spi_imx_sdma_init(struct device *dev, struct spi_imx_data *spi_imx, | |||
823 | struct dma_slave_config slave_config = {}; | 823 | struct dma_slave_config slave_config = {}; |
824 | int ret; | 824 | int ret; |
825 | 825 | ||
826 | /* use pio mode for i.mx6dl chip TKT238285 */ | ||
827 | if (of_machine_is_compatible("fsl,imx6dl")) | ||
828 | return 0; | ||
829 | |||
826 | /* Prepare for TX DMA: */ | 830 | /* Prepare for TX DMA: */ |
827 | master->dma_tx = dma_request_slave_channel(dev, "tx"); | 831 | master->dma_tx = dma_request_slave_channel(dev, "tx"); |
828 | if (!master->dma_tx) { | 832 | if (!master->dma_tx) { |
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index d415d69dc237..9484d5652ca5 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -650,8 +650,10 @@ static void handle_rx(struct vhost_net *net) | |||
650 | break; | 650 | break; |
651 | } | 651 | } |
652 | /* TODO: Should check and handle checksum. */ | 652 | /* TODO: Should check and handle checksum. */ |
653 | |||
654 | hdr.num_buffers = cpu_to_vhost16(vq, headcount); | ||
653 | if (likely(mergeable) && | 655 | if (likely(mergeable) && |
654 | memcpy_toiovecend(nvq->hdr, (unsigned char *)&headcount, | 656 | memcpy_toiovecend(nvq->hdr, (void *)&hdr.num_buffers, |
655 | offsetof(typeof(hdr), num_buffers), | 657 | offsetof(typeof(hdr), num_buffers), |
656 | sizeof hdr.num_buffers)) { | 658 | sizeof hdr.num_buffers)) { |
657 | vq_err(vq, "Failed num_buffers write"); | 659 | vq_err(vq, "Failed num_buffers write"); |
@@ -1140,6 +1140,13 @@ static long aio_read_events_ring(struct kioctx *ctx, | |||
1140 | long ret = 0; | 1140 | long ret = 0; |
1141 | int copy_ret; | 1141 | int copy_ret; |
1142 | 1142 | ||
1143 | /* | ||
1144 | * The mutex can block and wake us up and that will cause | ||
1145 | * wait_event_interruptible_hrtimeout() to schedule without sleeping | ||
1146 | * and repeat. This should be rare enough that it doesn't cause | ||
1147 | * peformance issues. See the comment in read_events() for more detail. | ||
1148 | */ | ||
1149 | sched_annotate_sleep(); | ||
1143 | mutex_lock(&ctx->ring_lock); | 1150 | mutex_lock(&ctx->ring_lock); |
1144 | 1151 | ||
1145 | /* Access to ->ring_pages here is protected by ctx->ring_lock. */ | 1152 | /* Access to ->ring_pages here is protected by ctx->ring_lock. */ |
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index 9a02da16f2be..1a9585d4380a 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c | |||
@@ -2591,6 +2591,7 @@ int btrfs_sync_log(struct btrfs_trans_handle *trans, | |||
2591 | } | 2591 | } |
2592 | 2592 | ||
2593 | if (log_root_tree->log_transid_committed >= root_log_ctx.log_transid) { | 2593 | if (log_root_tree->log_transid_committed >= root_log_ctx.log_transid) { |
2594 | blk_finish_plug(&plug); | ||
2594 | mutex_unlock(&log_root_tree->log_mutex); | 2595 | mutex_unlock(&log_root_tree->log_mutex); |
2595 | ret = root_log_ctx.log_ret; | 2596 | ret = root_log_ctx.log_ret; |
2596 | goto out; | 2597 | goto out; |
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 9c56ef776407..7febcf2475c5 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c | |||
@@ -606,9 +606,11 @@ cifs_security_flags_handle_must_flags(unsigned int *flags) | |||
606 | *flags = CIFSSEC_MUST_NTLMV2; | 606 | *flags = CIFSSEC_MUST_NTLMV2; |
607 | else if ((*flags & CIFSSEC_MUST_NTLM) == CIFSSEC_MUST_NTLM) | 607 | else if ((*flags & CIFSSEC_MUST_NTLM) == CIFSSEC_MUST_NTLM) |
608 | *flags = CIFSSEC_MUST_NTLM; | 608 | *flags = CIFSSEC_MUST_NTLM; |
609 | else if ((*flags & CIFSSEC_MUST_LANMAN) == CIFSSEC_MUST_LANMAN) | 609 | else if (CIFSSEC_MUST_LANMAN && |
610 | (*flags & CIFSSEC_MUST_LANMAN) == CIFSSEC_MUST_LANMAN) | ||
610 | *flags = CIFSSEC_MUST_LANMAN; | 611 | *flags = CIFSSEC_MUST_LANMAN; |
611 | else if ((*flags & CIFSSEC_MUST_PLNTXT) == CIFSSEC_MUST_PLNTXT) | 612 | else if (CIFSSEC_MUST_PLNTXT && |
613 | (*flags & CIFSSEC_MUST_PLNTXT) == CIFSSEC_MUST_PLNTXT) | ||
612 | *flags = CIFSSEC_MUST_PLNTXT; | 614 | *flags = CIFSSEC_MUST_PLNTXT; |
613 | 615 | ||
614 | *flags |= signflags; | 616 | *flags |= signflags; |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 96b7e9b7706d..74f12877493a 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -366,6 +366,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) | |||
366 | struct cifsLockInfo *li, *tmp; | 366 | struct cifsLockInfo *li, *tmp; |
367 | struct cifs_fid fid; | 367 | struct cifs_fid fid; |
368 | struct cifs_pending_open open; | 368 | struct cifs_pending_open open; |
369 | bool oplock_break_cancelled; | ||
369 | 370 | ||
370 | spin_lock(&cifs_file_list_lock); | 371 | spin_lock(&cifs_file_list_lock); |
371 | if (--cifs_file->count > 0) { | 372 | if (--cifs_file->count > 0) { |
@@ -397,7 +398,7 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) | |||
397 | } | 398 | } |
398 | spin_unlock(&cifs_file_list_lock); | 399 | spin_unlock(&cifs_file_list_lock); |
399 | 400 | ||
400 | cancel_work_sync(&cifs_file->oplock_break); | 401 | oplock_break_cancelled = cancel_work_sync(&cifs_file->oplock_break); |
401 | 402 | ||
402 | if (!tcon->need_reconnect && !cifs_file->invalidHandle) { | 403 | if (!tcon->need_reconnect && !cifs_file->invalidHandle) { |
403 | struct TCP_Server_Info *server = tcon->ses->server; | 404 | struct TCP_Server_Info *server = tcon->ses->server; |
@@ -409,6 +410,9 @@ void cifsFileInfo_put(struct cifsFileInfo *cifs_file) | |||
409 | _free_xid(xid); | 410 | _free_xid(xid); |
410 | } | 411 | } |
411 | 412 | ||
413 | if (oplock_break_cancelled) | ||
414 | cifs_done_oplock_break(cifsi); | ||
415 | |||
412 | cifs_del_pending_open(&open); | 416 | cifs_del_pending_open(&open); |
413 | 417 | ||
414 | /* | 418 | /* |
diff --git a/fs/cifs/smbencrypt.c b/fs/cifs/smbencrypt.c index 6c1566366a66..a4232ec4f2ba 100644 --- a/fs/cifs/smbencrypt.c +++ b/fs/cifs/smbencrypt.c | |||
@@ -221,7 +221,7 @@ E_md4hash(const unsigned char *passwd, unsigned char *p16, | |||
221 | } | 221 | } |
222 | 222 | ||
223 | rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__le16)); | 223 | rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__le16)); |
224 | memset(wpwd, 0, 129 * sizeof(__le16)); | 224 | memzero_explicit(wpwd, sizeof(wpwd)); |
225 | 225 | ||
226 | return rc; | 226 | return rc; |
227 | } | 227 | } |
diff --git a/fs/nilfs2/nilfs.h b/fs/nilfs2/nilfs.h index 91093cd74f0d..385704027575 100644 --- a/fs/nilfs2/nilfs.h +++ b/fs/nilfs2/nilfs.h | |||
@@ -141,7 +141,6 @@ enum { | |||
141 | * @ti_save: Backup of journal_info field of task_struct | 141 | * @ti_save: Backup of journal_info field of task_struct |
142 | * @ti_flags: Flags | 142 | * @ti_flags: Flags |
143 | * @ti_count: Nest level | 143 | * @ti_count: Nest level |
144 | * @ti_garbage: List of inode to be put when releasing semaphore | ||
145 | */ | 144 | */ |
146 | struct nilfs_transaction_info { | 145 | struct nilfs_transaction_info { |
147 | u32 ti_magic; | 146 | u32 ti_magic; |
@@ -150,7 +149,6 @@ struct nilfs_transaction_info { | |||
150 | one of other filesystems has a bug. */ | 149 | one of other filesystems has a bug. */ |
151 | unsigned short ti_flags; | 150 | unsigned short ti_flags; |
152 | unsigned short ti_count; | 151 | unsigned short ti_count; |
153 | struct list_head ti_garbage; | ||
154 | }; | 152 | }; |
155 | 153 | ||
156 | /* ti_magic */ | 154 | /* ti_magic */ |
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index 7ef18fc656c2..469086b9f99b 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c | |||
@@ -305,7 +305,6 @@ static void nilfs_transaction_lock(struct super_block *sb, | |||
305 | ti->ti_count = 0; | 305 | ti->ti_count = 0; |
306 | ti->ti_save = cur_ti; | 306 | ti->ti_save = cur_ti; |
307 | ti->ti_magic = NILFS_TI_MAGIC; | 307 | ti->ti_magic = NILFS_TI_MAGIC; |
308 | INIT_LIST_HEAD(&ti->ti_garbage); | ||
309 | current->journal_info = ti; | 308 | current->journal_info = ti; |
310 | 309 | ||
311 | for (;;) { | 310 | for (;;) { |
@@ -332,8 +331,6 @@ static void nilfs_transaction_unlock(struct super_block *sb) | |||
332 | 331 | ||
333 | up_write(&nilfs->ns_segctor_sem); | 332 | up_write(&nilfs->ns_segctor_sem); |
334 | current->journal_info = ti->ti_save; | 333 | current->journal_info = ti->ti_save; |
335 | if (!list_empty(&ti->ti_garbage)) | ||
336 | nilfs_dispose_list(nilfs, &ti->ti_garbage, 0); | ||
337 | } | 334 | } |
338 | 335 | ||
339 | static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci, | 336 | static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci, |
@@ -746,6 +743,15 @@ static void nilfs_dispose_list(struct the_nilfs *nilfs, | |||
746 | } | 743 | } |
747 | } | 744 | } |
748 | 745 | ||
746 | static void nilfs_iput_work_func(struct work_struct *work) | ||
747 | { | ||
748 | struct nilfs_sc_info *sci = container_of(work, struct nilfs_sc_info, | ||
749 | sc_iput_work); | ||
750 | struct the_nilfs *nilfs = sci->sc_super->s_fs_info; | ||
751 | |||
752 | nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 0); | ||
753 | } | ||
754 | |||
749 | static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs, | 755 | static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs, |
750 | struct nilfs_root *root) | 756 | struct nilfs_root *root) |
751 | { | 757 | { |
@@ -1900,8 +1906,8 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci, | |||
1900 | static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, | 1906 | static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, |
1901 | struct the_nilfs *nilfs) | 1907 | struct the_nilfs *nilfs) |
1902 | { | 1908 | { |
1903 | struct nilfs_transaction_info *ti = current->journal_info; | ||
1904 | struct nilfs_inode_info *ii, *n; | 1909 | struct nilfs_inode_info *ii, *n; |
1910 | int defer_iput = false; | ||
1905 | 1911 | ||
1906 | spin_lock(&nilfs->ns_inode_lock); | 1912 | spin_lock(&nilfs->ns_inode_lock); |
1907 | list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) { | 1913 | list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) { |
@@ -1912,9 +1918,24 @@ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci, | |||
1912 | clear_bit(NILFS_I_BUSY, &ii->i_state); | 1918 | clear_bit(NILFS_I_BUSY, &ii->i_state); |
1913 | brelse(ii->i_bh); | 1919 | brelse(ii->i_bh); |
1914 | ii->i_bh = NULL; | 1920 | ii->i_bh = NULL; |
1915 | list_move_tail(&ii->i_dirty, &ti->ti_garbage); | 1921 | list_del_init(&ii->i_dirty); |
1922 | if (!ii->vfs_inode.i_nlink) { | ||
1923 | /* | ||
1924 | * Defer calling iput() to avoid a deadlock | ||
1925 | * over I_SYNC flag for inodes with i_nlink == 0 | ||
1926 | */ | ||
1927 | list_add_tail(&ii->i_dirty, &sci->sc_iput_queue); | ||
1928 | defer_iput = true; | ||
1929 | } else { | ||
1930 | spin_unlock(&nilfs->ns_inode_lock); | ||
1931 | iput(&ii->vfs_inode); | ||
1932 | spin_lock(&nilfs->ns_inode_lock); | ||
1933 | } | ||
1916 | } | 1934 | } |
1917 | spin_unlock(&nilfs->ns_inode_lock); | 1935 | spin_unlock(&nilfs->ns_inode_lock); |
1936 | |||
1937 | if (defer_iput) | ||
1938 | schedule_work(&sci->sc_iput_work); | ||
1918 | } | 1939 | } |
1919 | 1940 | ||
1920 | /* | 1941 | /* |
@@ -2583,6 +2604,8 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb, | |||
2583 | INIT_LIST_HEAD(&sci->sc_segbufs); | 2604 | INIT_LIST_HEAD(&sci->sc_segbufs); |
2584 | INIT_LIST_HEAD(&sci->sc_write_logs); | 2605 | INIT_LIST_HEAD(&sci->sc_write_logs); |
2585 | INIT_LIST_HEAD(&sci->sc_gc_inodes); | 2606 | INIT_LIST_HEAD(&sci->sc_gc_inodes); |
2607 | INIT_LIST_HEAD(&sci->sc_iput_queue); | ||
2608 | INIT_WORK(&sci->sc_iput_work, nilfs_iput_work_func); | ||
2586 | init_timer(&sci->sc_timer); | 2609 | init_timer(&sci->sc_timer); |
2587 | 2610 | ||
2588 | sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT; | 2611 | sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT; |
@@ -2609,6 +2632,8 @@ static void nilfs_segctor_write_out(struct nilfs_sc_info *sci) | |||
2609 | ret = nilfs_segctor_construct(sci, SC_LSEG_SR); | 2632 | ret = nilfs_segctor_construct(sci, SC_LSEG_SR); |
2610 | nilfs_transaction_unlock(sci->sc_super); | 2633 | nilfs_transaction_unlock(sci->sc_super); |
2611 | 2634 | ||
2635 | flush_work(&sci->sc_iput_work); | ||
2636 | |||
2612 | } while (ret && retrycount-- > 0); | 2637 | } while (ret && retrycount-- > 0); |
2613 | } | 2638 | } |
2614 | 2639 | ||
@@ -2633,6 +2658,9 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) | |||
2633 | || sci->sc_seq_request != sci->sc_seq_done); | 2658 | || sci->sc_seq_request != sci->sc_seq_done); |
2634 | spin_unlock(&sci->sc_state_lock); | 2659 | spin_unlock(&sci->sc_state_lock); |
2635 | 2660 | ||
2661 | if (flush_work(&sci->sc_iput_work)) | ||
2662 | flag = true; | ||
2663 | |||
2636 | if (flag || !nilfs_segctor_confirm(sci)) | 2664 | if (flag || !nilfs_segctor_confirm(sci)) |
2637 | nilfs_segctor_write_out(sci); | 2665 | nilfs_segctor_write_out(sci); |
2638 | 2666 | ||
@@ -2642,6 +2670,12 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci) | |||
2642 | nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1); | 2670 | nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1); |
2643 | } | 2671 | } |
2644 | 2672 | ||
2673 | if (!list_empty(&sci->sc_iput_queue)) { | ||
2674 | nilfs_warning(sci->sc_super, __func__, | ||
2675 | "iput queue is not empty\n"); | ||
2676 | nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 1); | ||
2677 | } | ||
2678 | |||
2645 | WARN_ON(!list_empty(&sci->sc_segbufs)); | 2679 | WARN_ON(!list_empty(&sci->sc_segbufs)); |
2646 | WARN_ON(!list_empty(&sci->sc_write_logs)); | 2680 | WARN_ON(!list_empty(&sci->sc_write_logs)); |
2647 | 2681 | ||
diff --git a/fs/nilfs2/segment.h b/fs/nilfs2/segment.h index 38a1d0013314..a48d6de1e02c 100644 --- a/fs/nilfs2/segment.h +++ b/fs/nilfs2/segment.h | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
27 | #include <linux/fs.h> | 27 | #include <linux/fs.h> |
28 | #include <linux/buffer_head.h> | 28 | #include <linux/buffer_head.h> |
29 | #include <linux/workqueue.h> | ||
29 | #include <linux/nilfs2_fs.h> | 30 | #include <linux/nilfs2_fs.h> |
30 | #include "nilfs.h" | 31 | #include "nilfs.h" |
31 | 32 | ||
@@ -92,6 +93,8 @@ struct nilfs_segsum_pointer { | |||
92 | * @sc_nblk_inc: Block count of current generation | 93 | * @sc_nblk_inc: Block count of current generation |
93 | * @sc_dirty_files: List of files to be written | 94 | * @sc_dirty_files: List of files to be written |
94 | * @sc_gc_inodes: List of GC inodes having blocks to be written | 95 | * @sc_gc_inodes: List of GC inodes having blocks to be written |
96 | * @sc_iput_queue: list of inodes for which iput should be done | ||
97 | * @sc_iput_work: work struct to defer iput call | ||
95 | * @sc_freesegs: array of segment numbers to be freed | 98 | * @sc_freesegs: array of segment numbers to be freed |
96 | * @sc_nfreesegs: number of segments on @sc_freesegs | 99 | * @sc_nfreesegs: number of segments on @sc_freesegs |
97 | * @sc_dsync_inode: inode whose data pages are written for a sync operation | 100 | * @sc_dsync_inode: inode whose data pages are written for a sync operation |
@@ -135,6 +138,8 @@ struct nilfs_sc_info { | |||
135 | 138 | ||
136 | struct list_head sc_dirty_files; | 139 | struct list_head sc_dirty_files; |
137 | struct list_head sc_gc_inodes; | 140 | struct list_head sc_gc_inodes; |
141 | struct list_head sc_iput_queue; | ||
142 | struct work_struct sc_iput_work; | ||
138 | 143 | ||
139 | __u64 *sc_freesegs; | 144 | __u64 *sc_freesegs; |
140 | size_t sc_nfreesegs; | 145 | size_t sc_nfreesegs; |
diff --git a/include/acpi/acbuffer.h b/include/acpi/acbuffer.h index d5ec6c87810f..6b040f4ddfab 100644 --- a/include/acpi/acbuffer.h +++ b/include/acpi/acbuffer.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acconfig.h b/include/acpi/acconfig.h index 5a0a3e5daf85..03aacfb3e98b 100644 --- a/include/acpi/acconfig.h +++ b/include/acpi/acconfig.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h index 8b06e4c1dd5d..11c3a011dcbf 100644 --- a/include/acpi/acexcep.h +++ b/include/acpi/acexcep.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acnames.h b/include/acpi/acnames.h index 7461327e14e4..273de709495c 100644 --- a/include/acpi/acnames.h +++ b/include/acpi/acnames.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acoutput.h b/include/acpi/acoutput.h index 1baae6edda89..9318a87ee39a 100644 --- a/include/acpi/acoutput.h +++ b/include/acpi/acoutput.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acpi.h b/include/acpi/acpi.h index a08e55a263c9..b0bb30ebb807 100644 --- a/include/acpi/acpi.h +++ b/include/acpi/acpi.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index 03b3e6d405ff..0bc78df66d4b 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h | |||
@@ -7,7 +7,7 @@ | |||
7 | *****************************************************************************/ | 7 | *****************************************************************************/ |
8 | 8 | ||
9 | /* | 9 | /* |
10 | * Copyright (C) 2000 - 2014, Intel Corp. | 10 | * Copyright (C) 2000 - 2015, Intel Corp. |
11 | * All rights reserved. | 11 | * All rights reserved. |
12 | * | 12 | * |
13 | * Redistribution and use in source and binary forms, with or without | 13 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 5dd21bc18ce6..d56f5d722138 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -46,7 +46,7 @@ | |||
46 | 46 | ||
47 | /* Current ACPICA subsystem version in YYYYMMDD format */ | 47 | /* Current ACPICA subsystem version in YYYYMMDD format */ |
48 | 48 | ||
49 | #define ACPI_CA_VERSION 0x20141107 | 49 | #define ACPI_CA_VERSION 0x20150204 |
50 | 50 | ||
51 | #include <acpi/acconfig.h> | 51 | #include <acpi/acconfig.h> |
52 | #include <acpi/actypes.h> | 52 | #include <acpi/actypes.h> |
@@ -569,6 +569,14 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status | |||
569 | address, | 569 | address, |
570 | void *context)) | 570 | void *context)) |
571 | ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status | 571 | ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status |
572 | acpi_install_gpe_raw_handler(acpi_handle | ||
573 | gpe_device, | ||
574 | u32 gpe_number, | ||
575 | u32 type, | ||
576 | acpi_gpe_handler | ||
577 | address, | ||
578 | void *context)) | ||
579 | ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status | ||
572 | acpi_remove_gpe_handler(acpi_handle gpe_device, | 580 | acpi_remove_gpe_handler(acpi_handle gpe_device, |
573 | u32 gpe_number, | 581 | u32 gpe_number, |
574 | acpi_gpe_handler | 582 | acpi_gpe_handler |
diff --git a/include/acpi/acrestyp.h b/include/acpi/acrestyp.h index 0b75e01212c7..ebe242638591 100644 --- a/include/acpi/acrestyp.h +++ b/include/acpi/acrestyp.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/actbl.h b/include/acpi/actbl.h index bee19d8170c5..d4081fef1095 100644 --- a/include/acpi/actbl.h +++ b/include/acpi/actbl.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/actbl1.h b/include/acpi/actbl1.h index 29e79370641d..b80b0e6dabc5 100644 --- a/include/acpi/actbl1.h +++ b/include/acpi/actbl1.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h index ecff62405f17..f06d75e5fa54 100644 --- a/include/acpi/actbl2.h +++ b/include/acpi/actbl2.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/actbl3.h b/include/acpi/actbl3.h index 5480cb2236bf..440ca8104b43 100644 --- a/include/acpi/actbl3.h +++ b/include/acpi/actbl3.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index bbef17368e49..b034f1068dfe 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -744,7 +744,7 @@ typedef u32 acpi_event_status; | |||
744 | /* | 744 | /* |
745 | * GPE info flags - Per GPE | 745 | * GPE info flags - Per GPE |
746 | * +-------+-+-+---+ | 746 | * +-------+-+-+---+ |
747 | * | 7:4 |3|2|1:0| | 747 | * | 7:5 |4|3|2:0| |
748 | * +-------+-+-+---+ | 748 | * +-------+-+-+---+ |
749 | * | | | | | 749 | * | | | | |
750 | * | | | +-- Type of dispatch:to method, handler, notify, or none | 750 | * | | | +-- Type of dispatch:to method, handler, notify, or none |
@@ -756,13 +756,15 @@ typedef u32 acpi_event_status; | |||
756 | #define ACPI_GPE_DISPATCH_METHOD (u8) 0x01 | 756 | #define ACPI_GPE_DISPATCH_METHOD (u8) 0x01 |
757 | #define ACPI_GPE_DISPATCH_HANDLER (u8) 0x02 | 757 | #define ACPI_GPE_DISPATCH_HANDLER (u8) 0x02 |
758 | #define ACPI_GPE_DISPATCH_NOTIFY (u8) 0x03 | 758 | #define ACPI_GPE_DISPATCH_NOTIFY (u8) 0x03 |
759 | #define ACPI_GPE_DISPATCH_MASK (u8) 0x03 | 759 | #define ACPI_GPE_DISPATCH_RAW_HANDLER (u8) 0x04 |
760 | #define ACPI_GPE_DISPATCH_MASK (u8) 0x07 | ||
761 | #define ACPI_GPE_DISPATCH_TYPE(flags) ((u8) ((flags) & ACPI_GPE_DISPATCH_MASK)) | ||
760 | 762 | ||
761 | #define ACPI_GPE_LEVEL_TRIGGERED (u8) 0x04 | 763 | #define ACPI_GPE_LEVEL_TRIGGERED (u8) 0x08 |
762 | #define ACPI_GPE_EDGE_TRIGGERED (u8) 0x00 | 764 | #define ACPI_GPE_EDGE_TRIGGERED (u8) 0x00 |
763 | #define ACPI_GPE_XRUPT_TYPE_MASK (u8) 0x04 | 765 | #define ACPI_GPE_XRUPT_TYPE_MASK (u8) 0x08 |
764 | 766 | ||
765 | #define ACPI_GPE_CAN_WAKE (u8) 0x08 | 767 | #define ACPI_GPE_CAN_WAKE (u8) 0x10 |
766 | 768 | ||
767 | /* | 769 | /* |
768 | * Flags for GPE and Lock interfaces | 770 | * Flags for GPE and Lock interfaces |
diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h index 5f8cc1fa3278..ad74dc51d5b7 100644 --- a/include/acpi/platform/acenv.h +++ b/include/acpi/platform/acenv.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/platform/acenvex.h b/include/acpi/platform/acenvex.h index 2b612384c994..71e5ec5b07a3 100644 --- a/include/acpi/platform/acenvex.h +++ b/include/acpi/platform/acenvex.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/platform/acgcc.h b/include/acpi/platform/acgcc.h index 384875da3713..f54de0a63558 100644 --- a/include/acpi/platform/acgcc.h +++ b/include/acpi/platform/acgcc.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h index 1ba7c190c2cc..74ba46c8157a 100644 --- a/include/acpi/platform/aclinux.h +++ b/include/acpi/platform/aclinux.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/acpi/platform/aclinuxex.h b/include/acpi/platform/aclinuxex.h index 568d4b886712..acedc3f026de 100644 --- a/include/acpi/platform/aclinuxex.h +++ b/include/acpi/platform/aclinuxex.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index 515a35e2a48a..960e666c51e4 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
@@ -472,27 +472,59 @@ static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) | |||
472 | /** | 472 | /** |
473 | * vlan_get_protocol - get protocol EtherType. | 473 | * vlan_get_protocol - get protocol EtherType. |
474 | * @skb: skbuff to query | 474 | * @skb: skbuff to query |
475 | * @type: first vlan protocol | ||
476 | * @depth: buffer to store length of eth and vlan tags in bytes | ||
475 | * | 477 | * |
476 | * Returns the EtherType of the packet, regardless of whether it is | 478 | * Returns the EtherType of the packet, regardless of whether it is |
477 | * vlan encapsulated (normal or hardware accelerated) or not. | 479 | * vlan encapsulated (normal or hardware accelerated) or not. |
478 | */ | 480 | */ |
479 | static inline __be16 vlan_get_protocol(const struct sk_buff *skb) | 481 | static inline __be16 __vlan_get_protocol(struct sk_buff *skb, __be16 type, |
482 | int *depth) | ||
480 | { | 483 | { |
481 | __be16 protocol = 0; | 484 | unsigned int vlan_depth = skb->mac_len; |
482 | 485 | ||
483 | if (vlan_tx_tag_present(skb) || | 486 | /* if type is 802.1Q/AD then the header should already be |
484 | skb->protocol != cpu_to_be16(ETH_P_8021Q)) | 487 | * present at mac_len - VLAN_HLEN (if mac_len > 0), or at |
485 | protocol = skb->protocol; | 488 | * ETH_HLEN otherwise |
486 | else { | 489 | */ |
487 | __be16 proto, *protop; | 490 | if (type == htons(ETH_P_8021Q) || type == htons(ETH_P_8021AD)) { |
488 | protop = skb_header_pointer(skb, offsetof(struct vlan_ethhdr, | 491 | if (vlan_depth) { |
489 | h_vlan_encapsulated_proto), | 492 | if (WARN_ON(vlan_depth < VLAN_HLEN)) |
490 | sizeof(proto), &proto); | 493 | return 0; |
491 | if (likely(protop)) | 494 | vlan_depth -= VLAN_HLEN; |
492 | protocol = *protop; | 495 | } else { |
496 | vlan_depth = ETH_HLEN; | ||
497 | } | ||
498 | do { | ||
499 | struct vlan_hdr *vh; | ||
500 | |||
501 | if (unlikely(!pskb_may_pull(skb, | ||
502 | vlan_depth + VLAN_HLEN))) | ||
503 | return 0; | ||
504 | |||
505 | vh = (struct vlan_hdr *)(skb->data + vlan_depth); | ||
506 | type = vh->h_vlan_encapsulated_proto; | ||
507 | vlan_depth += VLAN_HLEN; | ||
508 | } while (type == htons(ETH_P_8021Q) || | ||
509 | type == htons(ETH_P_8021AD)); | ||
493 | } | 510 | } |
494 | 511 | ||
495 | return protocol; | 512 | if (depth) |
513 | *depth = vlan_depth; | ||
514 | |||
515 | return type; | ||
516 | } | ||
517 | |||
518 | /** | ||
519 | * vlan_get_protocol - get protocol EtherType. | ||
520 | * @skb: skbuff to query | ||
521 | * | ||
522 | * Returns the EtherType of the packet, regardless of whether it is | ||
523 | * vlan encapsulated (normal or hardware accelerated) or not. | ||
524 | */ | ||
525 | static inline __be16 vlan_get_protocol(struct sk_buff *skb) | ||
526 | { | ||
527 | return __vlan_get_protocol(skb, skb->protocol, NULL); | ||
496 | } | 528 | } |
497 | 529 | ||
498 | static inline void vlan_set_encap_proto(struct sk_buff *skb, | 530 | static inline void vlan_set_encap_proto(struct sk_buff *skb, |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 25c791e295fd..5f3a9aa7225d 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
@@ -97,7 +97,7 @@ enum { | |||
97 | MLX4_MAX_NUM_PF = 16, | 97 | MLX4_MAX_NUM_PF = 16, |
98 | MLX4_MAX_NUM_VF = 126, | 98 | MLX4_MAX_NUM_VF = 126, |
99 | MLX4_MAX_NUM_VF_P_PORT = 64, | 99 | MLX4_MAX_NUM_VF_P_PORT = 64, |
100 | MLX4_MFUNC_MAX = 80, | 100 | MLX4_MFUNC_MAX = 128, |
101 | MLX4_MAX_EQ_NUM = 1024, | 101 | MLX4_MAX_EQ_NUM = 1024, |
102 | MLX4_MFUNC_EQ_NUM = 4, | 102 | MLX4_MFUNC_EQ_NUM = 4, |
103 | MLX4_MFUNC_MAX_EQES = 8, | 103 | MLX4_MFUNC_MAX_EQES = 8, |
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index e08e21e5f601..c72851328ca9 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
@@ -173,7 +173,7 @@ extern void syscall_unregfunc(void); | |||
173 | TP_PROTO(data_proto), \ | 173 | TP_PROTO(data_proto), \ |
174 | TP_ARGS(data_args), \ | 174 | TP_ARGS(data_args), \ |
175 | TP_CONDITION(cond),,); \ | 175 | TP_CONDITION(cond),,); \ |
176 | if (IS_ENABLED(CONFIG_LOCKDEP)) { \ | 176 | if (IS_ENABLED(CONFIG_LOCKDEP) && (cond)) { \ |
177 | rcu_read_lock_sched_notrace(); \ | 177 | rcu_read_lock_sched_notrace(); \ |
178 | rcu_dereference_sched(__tracepoint_##name.funcs);\ | 178 | rcu_dereference_sched(__tracepoint_##name.funcs);\ |
179 | rcu_read_unlock_sched_notrace(); \ | 179 | rcu_read_unlock_sched_notrace(); \ |
diff --git a/include/linux/wait.h b/include/linux/wait.h index 2232ed16635a..37423e0e1379 100644 --- a/include/linux/wait.h +++ b/include/linux/wait.h | |||
@@ -363,7 +363,6 @@ do { \ | |||
363 | */ | 363 | */ |
364 | #define wait_event_cmd(wq, condition, cmd1, cmd2) \ | 364 | #define wait_event_cmd(wq, condition, cmd1, cmd2) \ |
365 | do { \ | 365 | do { \ |
366 | might_sleep(); \ | ||
367 | if (condition) \ | 366 | if (condition) \ |
368 | break; \ | 367 | break; \ |
369 | __wait_event_cmd(wq, condition, cmd1, cmd2); \ | 368 | __wait_event_cmd(wq, condition, cmd1, cmd2); \ |
diff --git a/include/net/flow_keys.h b/include/net/flow_keys.h index 7ee2df083542..dc8fd81412bf 100644 --- a/include/net/flow_keys.h +++ b/include/net/flow_keys.h | |||
@@ -22,9 +22,9 @@ struct flow_keys { | |||
22 | __be32 ports; | 22 | __be32 ports; |
23 | __be16 port16[2]; | 23 | __be16 port16[2]; |
24 | }; | 24 | }; |
25 | u16 thoff; | 25 | u16 thoff; |
26 | u16 n_proto; | 26 | __be16 n_proto; |
27 | u8 ip_proto; | 27 | u8 ip_proto; |
28 | }; | 28 | }; |
29 | 29 | ||
30 | bool __skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow, | 30 | bool __skb_flow_dissect(const struct sk_buff *skb, struct flow_keys *flow, |
diff --git a/include/net/ip.h b/include/net/ip.h index f7cbd703d15d..09cf5aebb283 100644 --- a/include/net/ip.h +++ b/include/net/ip.h | |||
@@ -181,7 +181,7 @@ static inline __u8 ip_reply_arg_flowi_flags(const struct ip_reply_arg *arg) | |||
181 | return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0; | 181 | return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0; |
182 | } | 182 | } |
183 | 183 | ||
184 | void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | 184 | void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, |
185 | const struct ip_options *sopt, | 185 | const struct ip_options *sopt, |
186 | __be32 daddr, __be32 saddr, | 186 | __be32 daddr, __be32 saddr, |
187 | const struct ip_reply_arg *arg, | 187 | const struct ip_reply_arg *arg, |
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 4292929392b0..6e416f6d3e3c 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -671,6 +671,9 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add | |||
671 | return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); | 671 | return __ipv6_addr_diff(a1, a2, sizeof(struct in6_addr)); |
672 | } | 672 | } |
673 | 673 | ||
674 | u32 __ipv6_select_ident(u32 hashrnd, struct in6_addr *dst, | ||
675 | struct in6_addr *src); | ||
676 | void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt); | ||
674 | void ipv6_proxy_select_ident(struct sk_buff *skb); | 677 | void ipv6_proxy_select_ident(struct sk_buff *skb); |
675 | 678 | ||
676 | int ip6_dst_hoplimit(struct dst_entry *dst); | 679 | int ip6_dst_hoplimit(struct dst_entry *dst); |
@@ -708,7 +711,7 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, | |||
708 | __be32 flowlabel, bool autolabel) | 711 | __be32 flowlabel, bool autolabel) |
709 | { | 712 | { |
710 | if (!flowlabel && (autolabel || net->ipv6.sysctl.auto_flowlabels)) { | 713 | if (!flowlabel && (autolabel || net->ipv6.sysctl.auto_flowlabels)) { |
711 | __be32 hash; | 714 | u32 hash; |
712 | 715 | ||
713 | hash = skb_get_hash(skb); | 716 | hash = skb_get_hash(skb); |
714 | 717 | ||
@@ -718,7 +721,7 @@ static inline __be32 ip6_make_flowlabel(struct net *net, struct sk_buff *skb, | |||
718 | */ | 721 | */ |
719 | hash ^= hash >> 12; | 722 | hash ^= hash >> 12; |
720 | 723 | ||
721 | flowlabel = hash & IPV6_FLOWLABEL_MASK; | 724 | flowlabel = (__force __be32)hash & IPV6_FLOWLABEL_MASK; |
722 | } | 725 | } |
723 | 726 | ||
724 | return flowlabel; | 727 | return flowlabel; |
diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h index 3ae969e3acf0..9eaaa7884586 100644 --- a/include/net/netfilter/nf_tables.h +++ b/include/net/netfilter/nf_tables.h | |||
@@ -530,6 +530,8 @@ enum nft_chain_type { | |||
530 | 530 | ||
531 | int nft_chain_validate_dependency(const struct nft_chain *chain, | 531 | int nft_chain_validate_dependency(const struct nft_chain *chain, |
532 | enum nft_chain_type type); | 532 | enum nft_chain_type type); |
533 | int nft_chain_validate_hooks(const struct nft_chain *chain, | ||
534 | unsigned int hook_flags); | ||
533 | 535 | ||
534 | struct nft_stats { | 536 | struct nft_stats { |
535 | u64 bytes; | 537 | u64 bytes; |
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 24945cefc4fd..0ffef1a38efc 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
@@ -52,6 +52,7 @@ struct netns_ipv4 { | |||
52 | struct inet_peer_base *peers; | 52 | struct inet_peer_base *peers; |
53 | struct tcpm_hash_bucket *tcp_metrics_hash; | 53 | struct tcpm_hash_bucket *tcp_metrics_hash; |
54 | unsigned int tcp_metrics_hash_log; | 54 | unsigned int tcp_metrics_hash_log; |
55 | struct sock * __percpu *tcp_sk; | ||
55 | struct netns_frags frags; | 56 | struct netns_frags frags; |
56 | #ifdef CONFIG_NETFILTER | 57 | #ifdef CONFIG_NETFILTER |
57 | struct xt_table *iptable_filter; | 58 | struct xt_table *iptable_filter; |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index 3d282cbb66bf..c605d305c577 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
@@ -79,6 +79,9 @@ struct Qdisc { | |||
79 | struct netdev_queue *dev_queue; | 79 | struct netdev_queue *dev_queue; |
80 | 80 | ||
81 | struct gnet_stats_rate_est64 rate_est; | 81 | struct gnet_stats_rate_est64 rate_est; |
82 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; | ||
83 | struct gnet_stats_queue __percpu *cpu_qstats; | ||
84 | |||
82 | struct Qdisc *next_sched; | 85 | struct Qdisc *next_sched; |
83 | struct sk_buff *gso_skb; | 86 | struct sk_buff *gso_skb; |
84 | /* | 87 | /* |
@@ -86,15 +89,9 @@ struct Qdisc { | |||
86 | */ | 89 | */ |
87 | unsigned long state; | 90 | unsigned long state; |
88 | struct sk_buff_head q; | 91 | struct sk_buff_head q; |
89 | union { | 92 | struct gnet_stats_basic_packed bstats; |
90 | struct gnet_stats_basic_packed bstats; | ||
91 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; | ||
92 | } __packed; | ||
93 | unsigned int __state; | 93 | unsigned int __state; |
94 | union { | 94 | struct gnet_stats_queue qstats; |
95 | struct gnet_stats_queue qstats; | ||
96 | struct gnet_stats_queue __percpu *cpu_qstats; | ||
97 | } __packed; | ||
98 | struct rcu_head rcu_head; | 95 | struct rcu_head rcu_head; |
99 | int padded; | 96 | int padded; |
100 | atomic_t refcnt; | 97 | atomic_t refcnt; |
diff --git a/include/net/tcp.h b/include/net/tcp.h index f50f29faf76f..9d9111ef43ae 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
@@ -834,8 +834,8 @@ void tcp_get_available_congestion_control(char *buf, size_t len); | |||
834 | void tcp_get_allowed_congestion_control(char *buf, size_t len); | 834 | void tcp_get_allowed_congestion_control(char *buf, size_t len); |
835 | int tcp_set_allowed_congestion_control(char *allowed); | 835 | int tcp_set_allowed_congestion_control(char *allowed); |
836 | int tcp_set_congestion_control(struct sock *sk, const char *name); | 836 | int tcp_set_congestion_control(struct sock *sk, const char *name); |
837 | void tcp_slow_start(struct tcp_sock *tp, u32 acked); | 837 | u32 tcp_slow_start(struct tcp_sock *tp, u32 acked); |
838 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w); | 838 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked); |
839 | 839 | ||
840 | u32 tcp_reno_ssthresh(struct sock *sk); | 840 | u32 tcp_reno_ssthresh(struct sock *sk); |
841 | void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked); | 841 | void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked); |
diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index 0d74f1de99aa..65994a19e840 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h | |||
@@ -1707,10 +1707,7 @@ static inline int ib_copy_from_udata(void *dest, struct ib_udata *udata, size_t | |||
1707 | 1707 | ||
1708 | static inline int ib_copy_to_udata(struct ib_udata *udata, void *src, size_t len) | 1708 | static inline int ib_copy_to_udata(struct ib_udata *udata, void *src, size_t len) |
1709 | { | 1709 | { |
1710 | size_t copy_sz; | 1710 | return copy_to_user(udata->outbuf, src, len) ? -EFAULT : 0; |
1711 | |||
1712 | copy_sz = min_t(size_t, len, udata->outlen); | ||
1713 | return copy_to_user(udata->outbuf, src, copy_sz) ? -EFAULT : 0; | ||
1714 | } | 1711 | } |
1715 | 1712 | ||
1716 | /** | 1713 | /** |
diff --git a/include/sound/ak4113.h b/include/sound/ak4113.h index 2609048c1d44..3a34f6edc2d1 100644 --- a/include/sound/ak4113.h +++ b/include/sound/ak4113.h | |||
@@ -286,7 +286,7 @@ struct ak4113 { | |||
286 | ak4113_write_t *write; | 286 | ak4113_write_t *write; |
287 | ak4113_read_t *read; | 287 | ak4113_read_t *read; |
288 | void *private_data; | 288 | void *private_data; |
289 | unsigned int init:1; | 289 | atomic_t wq_processing; |
290 | spinlock_t lock; | 290 | spinlock_t lock; |
291 | unsigned char regmap[AK4113_WRITABLE_REGS]; | 291 | unsigned char regmap[AK4113_WRITABLE_REGS]; |
292 | struct snd_kcontrol *kctls[AK4113_CONTROLS]; | 292 | struct snd_kcontrol *kctls[AK4113_CONTROLS]; |
diff --git a/include/sound/ak4114.h b/include/sound/ak4114.h index 52f02a60dba7..069299a88915 100644 --- a/include/sound/ak4114.h +++ b/include/sound/ak4114.h | |||
@@ -168,7 +168,7 @@ struct ak4114 { | |||
168 | ak4114_write_t * write; | 168 | ak4114_write_t * write; |
169 | ak4114_read_t * read; | 169 | ak4114_read_t * read; |
170 | void * private_data; | 170 | void * private_data; |
171 | unsigned int init: 1; | 171 | atomic_t wq_processing; |
172 | spinlock_t lock; | 172 | spinlock_t lock; |
173 | unsigned char regmap[6]; | 173 | unsigned char regmap[6]; |
174 | unsigned char txcsb[5]; | 174 | unsigned char txcsb[5]; |
diff --git a/include/sound/soc.h b/include/sound/soc.h index b4fca9aed2a2..ac8b333acb4d 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -498,6 +498,7 @@ int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned int reg, | |||
498 | unsigned int mask, unsigned int value); | 498 | unsigned int mask, unsigned int value); |
499 | 499 | ||
500 | #ifdef CONFIG_SND_SOC_AC97_BUS | 500 | #ifdef CONFIG_SND_SOC_AC97_BUS |
501 | struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec); | ||
501 | struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec); | 502 | struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec); |
502 | void snd_soc_free_ac97_codec(struct snd_ac97 *ac97); | 503 | void snd_soc_free_ac97_codec(struct snd_ac97 *ac97); |
503 | 504 | ||
diff --git a/include/trace/events/tlb.h b/include/trace/events/tlb.h index 13391d288107..0e7635765153 100644 --- a/include/trace/events/tlb.h +++ b/include/trace/events/tlb.h | |||
@@ -13,11 +13,13 @@ | |||
13 | { TLB_LOCAL_SHOOTDOWN, "local shootdown" }, \ | 13 | { TLB_LOCAL_SHOOTDOWN, "local shootdown" }, \ |
14 | { TLB_LOCAL_MM_SHOOTDOWN, "local mm shootdown" } | 14 | { TLB_LOCAL_MM_SHOOTDOWN, "local mm shootdown" } |
15 | 15 | ||
16 | TRACE_EVENT(tlb_flush, | 16 | TRACE_EVENT_CONDITION(tlb_flush, |
17 | 17 | ||
18 | TP_PROTO(int reason, unsigned long pages), | 18 | TP_PROTO(int reason, unsigned long pages), |
19 | TP_ARGS(reason, pages), | 19 | TP_ARGS(reason, pages), |
20 | 20 | ||
21 | TP_CONDITION(cpu_online(smp_processor_id())), | ||
22 | |||
21 | TP_STRUCT__entry( | 23 | TP_STRUCT__entry( |
22 | __field( int, reason) | 24 | __field( int, reason) |
23 | __field(unsigned long, pages) | 25 | __field(unsigned long, pages) |
diff --git a/include/uapi/rdma/ib_user_verbs.h b/include/uapi/rdma/ib_user_verbs.h index 4275b961bf60..867cc5084afb 100644 --- a/include/uapi/rdma/ib_user_verbs.h +++ b/include/uapi/rdma/ib_user_verbs.h | |||
@@ -90,7 +90,6 @@ enum { | |||
90 | }; | 90 | }; |
91 | 91 | ||
92 | enum { | 92 | enum { |
93 | IB_USER_VERBS_EX_CMD_QUERY_DEVICE = IB_USER_VERBS_CMD_QUERY_DEVICE, | ||
94 | IB_USER_VERBS_EX_CMD_CREATE_FLOW = IB_USER_VERBS_CMD_THRESHOLD, | 93 | IB_USER_VERBS_EX_CMD_CREATE_FLOW = IB_USER_VERBS_CMD_THRESHOLD, |
95 | IB_USER_VERBS_EX_CMD_DESTROY_FLOW, | 94 | IB_USER_VERBS_EX_CMD_DESTROY_FLOW, |
96 | }; | 95 | }; |
@@ -202,32 +201,6 @@ struct ib_uverbs_query_device_resp { | |||
202 | __u8 reserved[4]; | 201 | __u8 reserved[4]; |
203 | }; | 202 | }; |
204 | 203 | ||
205 | enum { | ||
206 | IB_USER_VERBS_EX_QUERY_DEVICE_ODP = 1ULL << 0, | ||
207 | }; | ||
208 | |||
209 | struct ib_uverbs_ex_query_device { | ||
210 | __u32 comp_mask; | ||
211 | __u32 reserved; | ||
212 | }; | ||
213 | |||
214 | struct ib_uverbs_odp_caps { | ||
215 | __u64 general_caps; | ||
216 | struct { | ||
217 | __u32 rc_odp_caps; | ||
218 | __u32 uc_odp_caps; | ||
219 | __u32 ud_odp_caps; | ||
220 | } per_transport_caps; | ||
221 | __u32 reserved; | ||
222 | }; | ||
223 | |||
224 | struct ib_uverbs_ex_query_device_resp { | ||
225 | struct ib_uverbs_query_device_resp base; | ||
226 | __u32 comp_mask; | ||
227 | __u32 reserved; | ||
228 | struct ib_uverbs_odp_caps odp_caps; | ||
229 | }; | ||
230 | |||
231 | struct ib_uverbs_query_port { | 204 | struct ib_uverbs_query_port { |
232 | __u64 response; | 205 | __u64 response; |
233 | __u8 port_num; | 206 | __u8 port_num; |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index e628cb11b560..5eab11d4b747 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -1814,6 +1814,10 @@ void __dl_clear_params(struct task_struct *p) | |||
1814 | dl_se->dl_period = 0; | 1814 | dl_se->dl_period = 0; |
1815 | dl_se->flags = 0; | 1815 | dl_se->flags = 0; |
1816 | dl_se->dl_bw = 0; | 1816 | dl_se->dl_bw = 0; |
1817 | |||
1818 | dl_se->dl_throttled = 0; | ||
1819 | dl_se->dl_new = 1; | ||
1820 | dl_se->dl_yielded = 0; | ||
1817 | } | 1821 | } |
1818 | 1822 | ||
1819 | /* | 1823 | /* |
@@ -1839,7 +1843,7 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) | |||
1839 | #endif | 1843 | #endif |
1840 | 1844 | ||
1841 | RB_CLEAR_NODE(&p->dl.rb_node); | 1845 | RB_CLEAR_NODE(&p->dl.rb_node); |
1842 | hrtimer_init(&p->dl.dl_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 1846 | init_dl_task_timer(&p->dl); |
1843 | __dl_clear_params(p); | 1847 | __dl_clear_params(p); |
1844 | 1848 | ||
1845 | INIT_LIST_HEAD(&p->rt.run_list); | 1849 | INIT_LIST_HEAD(&p->rt.run_list); |
@@ -2049,6 +2053,9 @@ static inline int dl_bw_cpus(int i) | |||
2049 | * allocated bandwidth to reflect the new situation. | 2053 | * allocated bandwidth to reflect the new situation. |
2050 | * | 2054 | * |
2051 | * This function is called while holding p's rq->lock. | 2055 | * This function is called while holding p's rq->lock. |
2056 | * | ||
2057 | * XXX we should delay bw change until the task's 0-lag point, see | ||
2058 | * __setparam_dl(). | ||
2052 | */ | 2059 | */ |
2053 | static int dl_overflow(struct task_struct *p, int policy, | 2060 | static int dl_overflow(struct task_struct *p, int policy, |
2054 | const struct sched_attr *attr) | 2061 | const struct sched_attr *attr) |
@@ -3251,15 +3258,31 @@ __setparam_dl(struct task_struct *p, const struct sched_attr *attr) | |||
3251 | { | 3258 | { |
3252 | struct sched_dl_entity *dl_se = &p->dl; | 3259 | struct sched_dl_entity *dl_se = &p->dl; |
3253 | 3260 | ||
3254 | init_dl_task_timer(dl_se); | ||
3255 | dl_se->dl_runtime = attr->sched_runtime; | 3261 | dl_se->dl_runtime = attr->sched_runtime; |
3256 | dl_se->dl_deadline = attr->sched_deadline; | 3262 | dl_se->dl_deadline = attr->sched_deadline; |
3257 | dl_se->dl_period = attr->sched_period ?: dl_se->dl_deadline; | 3263 | dl_se->dl_period = attr->sched_period ?: dl_se->dl_deadline; |
3258 | dl_se->flags = attr->sched_flags; | 3264 | dl_se->flags = attr->sched_flags; |
3259 | dl_se->dl_bw = to_ratio(dl_se->dl_period, dl_se->dl_runtime); | 3265 | dl_se->dl_bw = to_ratio(dl_se->dl_period, dl_se->dl_runtime); |
3260 | dl_se->dl_throttled = 0; | 3266 | |
3261 | dl_se->dl_new = 1; | 3267 | /* |
3262 | dl_se->dl_yielded = 0; | 3268 | * Changing the parameters of a task is 'tricky' and we're not doing |
3269 | * the correct thing -- also see task_dead_dl() and switched_from_dl(). | ||
3270 | * | ||
3271 | * What we SHOULD do is delay the bandwidth release until the 0-lag | ||
3272 | * point. This would include retaining the task_struct until that time | ||
3273 | * and change dl_overflow() to not immediately decrement the current | ||
3274 | * amount. | ||
3275 | * | ||
3276 | * Instead we retain the current runtime/deadline and let the new | ||
3277 | * parameters take effect after the current reservation period lapses. | ||
3278 | * This is safe (albeit pessimistic) because the 0-lag point is always | ||
3279 | * before the current scheduling deadline. | ||
3280 | * | ||
3281 | * We can still have temporary overloads because we do not delay the | ||
3282 | * change in bandwidth until that time; so admission control is | ||
3283 | * not on the safe side. It does however guarantee tasks will never | ||
3284 | * consume more than promised. | ||
3285 | */ | ||
3263 | } | 3286 | } |
3264 | 3287 | ||
3265 | /* | 3288 | /* |
@@ -4642,6 +4665,9 @@ int cpuset_cpumask_can_shrink(const struct cpumask *cur, | |||
4642 | struct dl_bw *cur_dl_b; | 4665 | struct dl_bw *cur_dl_b; |
4643 | unsigned long flags; | 4666 | unsigned long flags; |
4644 | 4667 | ||
4668 | if (!cpumask_weight(cur)) | ||
4669 | return ret; | ||
4670 | |||
4645 | rcu_read_lock_sched(); | 4671 | rcu_read_lock_sched(); |
4646 | cur_dl_b = dl_bw_of(cpumask_any(cur)); | 4672 | cur_dl_b = dl_bw_of(cpumask_any(cur)); |
4647 | trial_cpus = cpumask_weight(trial); | 4673 | trial_cpus = cpumask_weight(trial); |
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index b52092f2636d..726470d47f87 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c | |||
@@ -1094,6 +1094,7 @@ static void task_dead_dl(struct task_struct *p) | |||
1094 | * Since we are TASK_DEAD we won't slip out of the domain! | 1094 | * Since we are TASK_DEAD we won't slip out of the domain! |
1095 | */ | 1095 | */ |
1096 | raw_spin_lock_irq(&dl_b->lock); | 1096 | raw_spin_lock_irq(&dl_b->lock); |
1097 | /* XXX we should retain the bw until 0-lag */ | ||
1097 | dl_b->total_bw -= p->dl.dl_bw; | 1098 | dl_b->total_bw -= p->dl.dl_bw; |
1098 | raw_spin_unlock_irq(&dl_b->lock); | 1099 | raw_spin_unlock_irq(&dl_b->lock); |
1099 | 1100 | ||
@@ -1614,8 +1615,8 @@ static void cancel_dl_timer(struct rq *rq, struct task_struct *p) | |||
1614 | 1615 | ||
1615 | static void switched_from_dl(struct rq *rq, struct task_struct *p) | 1616 | static void switched_from_dl(struct rq *rq, struct task_struct *p) |
1616 | { | 1617 | { |
1618 | /* XXX we should retain the bw until 0-lag */ | ||
1617 | cancel_dl_timer(rq, p); | 1619 | cancel_dl_timer(rq, p); |
1618 | |||
1619 | __dl_clear_params(p); | 1620 | __dl_clear_params(p); |
1620 | 1621 | ||
1621 | /* | 1622 | /* |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 40667cbf371b..fe331fc391f5 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
@@ -1730,7 +1730,7 @@ static int preferred_group_nid(struct task_struct *p, int nid) | |||
1730 | nodes = node_online_map; | 1730 | nodes = node_online_map; |
1731 | for (dist = sched_max_numa_distance; dist > LOCAL_DISTANCE; dist--) { | 1731 | for (dist = sched_max_numa_distance; dist > LOCAL_DISTANCE; dist--) { |
1732 | unsigned long max_faults = 0; | 1732 | unsigned long max_faults = 0; |
1733 | nodemask_t max_group; | 1733 | nodemask_t max_group = NODE_MASK_NONE; |
1734 | int a, b; | 1734 | int a, b; |
1735 | 1735 | ||
1736 | /* Are there nodes at this distance from each other? */ | 1736 | /* Are there nodes at this distance from each other? */ |
diff --git a/kernel/smpboot.c b/kernel/smpboot.c index f032fb5284e3..40190f28db35 100644 --- a/kernel/smpboot.c +++ b/kernel/smpboot.c | |||
@@ -280,6 +280,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread) | |||
280 | unsigned int cpu; | 280 | unsigned int cpu; |
281 | int ret = 0; | 281 | int ret = 0; |
282 | 282 | ||
283 | get_online_cpus(); | ||
283 | mutex_lock(&smpboot_threads_lock); | 284 | mutex_lock(&smpboot_threads_lock); |
284 | for_each_online_cpu(cpu) { | 285 | for_each_online_cpu(cpu) { |
285 | ret = __smpboot_create_thread(plug_thread, cpu); | 286 | ret = __smpboot_create_thread(plug_thread, cpu); |
@@ -292,6 +293,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread) | |||
292 | list_add(&plug_thread->list, &hotplug_threads); | 293 | list_add(&plug_thread->list, &hotplug_threads); |
293 | out: | 294 | out: |
294 | mutex_unlock(&smpboot_threads_lock); | 295 | mutex_unlock(&smpboot_threads_lock); |
296 | put_online_cpus(); | ||
295 | return ret; | 297 | return ret; |
296 | } | 298 | } |
297 | EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread); | 299 | EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread); |
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c index 37e50aadd471..d8c724cda37b 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c | |||
@@ -122,7 +122,7 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) | |||
122 | mono = ktime_get_update_offsets_tick(&off_real, &off_boot, &off_tai); | 122 | mono = ktime_get_update_offsets_tick(&off_real, &off_boot, &off_tai); |
123 | boot = ktime_add(mono, off_boot); | 123 | boot = ktime_add(mono, off_boot); |
124 | xtim = ktime_add(mono, off_real); | 124 | xtim = ktime_add(mono, off_real); |
125 | tai = ktime_add(xtim, off_tai); | 125 | tai = ktime_add(mono, off_tai); |
126 | 126 | ||
127 | base->clock_base[HRTIMER_BASE_REALTIME].softirq_time = xtim; | 127 | base->clock_base[HRTIMER_BASE_REALTIME].softirq_time = xtim; |
128 | base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = mono; | 128 | base->clock_base[HRTIMER_BASE_MONOTONIC].softirq_time = mono; |
diff --git a/lib/checksum.c b/lib/checksum.c index 129775eb6de6..8b39e86dbab5 100644 --- a/lib/checksum.c +++ b/lib/checksum.c | |||
@@ -181,6 +181,15 @@ csum_partial_copy(const void *src, void *dst, int len, __wsum sum) | |||
181 | EXPORT_SYMBOL(csum_partial_copy); | 181 | EXPORT_SYMBOL(csum_partial_copy); |
182 | 182 | ||
183 | #ifndef csum_tcpudp_nofold | 183 | #ifndef csum_tcpudp_nofold |
184 | static inline u32 from64to32(u64 x) | ||
185 | { | ||
186 | /* add up 32-bit and 32-bit for 32+c bit */ | ||
187 | x = (x & 0xffffffff) + (x >> 32); | ||
188 | /* add up carry.. */ | ||
189 | x = (x & 0xffffffff) + (x >> 32); | ||
190 | return (u32)x; | ||
191 | } | ||
192 | |||
184 | __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, | 193 | __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, |
185 | unsigned short len, | 194 | unsigned short len, |
186 | unsigned short proto, | 195 | unsigned short proto, |
@@ -195,8 +204,7 @@ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, | |||
195 | #else | 204 | #else |
196 | s += (proto + len) << 8; | 205 | s += (proto + len) << 8; |
197 | #endif | 206 | #endif |
198 | s += (s >> 32); | 207 | return (__force __wsum)from64to32(s); |
199 | return (__force __wsum)s; | ||
200 | } | 208 | } |
201 | EXPORT_SYMBOL(csum_tcpudp_nofold); | 209 | EXPORT_SYMBOL(csum_tcpudp_nofold); |
202 | #endif | 210 | #endif |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 683b4782019b..2f6893c2f01b 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -5773,7 +5773,7 @@ void mem_cgroup_uncharge_list(struct list_head *page_list) | |||
5773 | * mem_cgroup_migrate - migrate a charge to another page | 5773 | * mem_cgroup_migrate - migrate a charge to another page |
5774 | * @oldpage: currently charged page | 5774 | * @oldpage: currently charged page |
5775 | * @newpage: page to transfer the charge to | 5775 | * @newpage: page to transfer the charge to |
5776 | * @lrucare: both pages might be on the LRU already | 5776 | * @lrucare: either or both pages might be on the LRU already |
5777 | * | 5777 | * |
5778 | * Migrate the charge from @oldpage to @newpage. | 5778 | * Migrate the charge from @oldpage to @newpage. |
5779 | * | 5779 | * |
diff --git a/mm/nommu.c b/mm/nommu.c index b51eadf6d952..28bd8c4dff6f 100644 --- a/mm/nommu.c +++ b/mm/nommu.c | |||
@@ -59,6 +59,7 @@ | |||
59 | #endif | 59 | #endif |
60 | 60 | ||
61 | void *high_memory; | 61 | void *high_memory; |
62 | EXPORT_SYMBOL(high_memory); | ||
62 | struct page *mem_map; | 63 | struct page *mem_map; |
63 | unsigned long max_mapnr; | 64 | unsigned long max_mapnr; |
64 | unsigned long highest_memmap_pfn; | 65 | unsigned long highest_memmap_pfn; |
diff --git a/mm/pagewalk.c b/mm/pagewalk.c index ad83195521f2..b264bda46e1b 100644 --- a/mm/pagewalk.c +++ b/mm/pagewalk.c | |||
@@ -199,7 +199,10 @@ int walk_page_range(unsigned long addr, unsigned long end, | |||
199 | */ | 199 | */ |
200 | if ((vma->vm_start <= addr) && | 200 | if ((vma->vm_start <= addr) && |
201 | (vma->vm_flags & VM_PFNMAP)) { | 201 | (vma->vm_flags & VM_PFNMAP)) { |
202 | next = vma->vm_end; | 202 | if (walk->pte_hole) |
203 | err = walk->pte_hole(addr, next, walk); | ||
204 | if (err) | ||
205 | break; | ||
203 | pgd = pgd_offset(walk->mm, next); | 206 | pgd = pgd_offset(walk->mm, next); |
204 | continue; | 207 | continue; |
205 | } | 208 | } |
diff --git a/mm/shmem.c b/mm/shmem.c index 73ba1df7c8ba..993e6ba689cc 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -1013,7 +1013,7 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp, | |||
1013 | */ | 1013 | */ |
1014 | oldpage = newpage; | 1014 | oldpage = newpage; |
1015 | } else { | 1015 | } else { |
1016 | mem_cgroup_migrate(oldpage, newpage, false); | 1016 | mem_cgroup_migrate(oldpage, newpage, true); |
1017 | lru_cache_add_anon(newpage); | 1017 | lru_cache_add_anon(newpage); |
1018 | *pagep = newpage; | 1018 | *pagep = newpage; |
1019 | } | 1019 | } |
diff --git a/net/bridge/netfilter/nft_reject_bridge.c b/net/bridge/netfilter/nft_reject_bridge.c index b0330aecbf97..3244aead0926 100644 --- a/net/bridge/netfilter/nft_reject_bridge.c +++ b/net/bridge/netfilter/nft_reject_bridge.c | |||
@@ -265,22 +265,12 @@ out: | |||
265 | data[NFT_REG_VERDICT].verdict = NF_DROP; | 265 | data[NFT_REG_VERDICT].verdict = NF_DROP; |
266 | } | 266 | } |
267 | 267 | ||
268 | static int nft_reject_bridge_validate_hooks(const struct nft_chain *chain) | 268 | static int nft_reject_bridge_validate(const struct nft_ctx *ctx, |
269 | const struct nft_expr *expr, | ||
270 | const struct nft_data **data) | ||
269 | { | 271 | { |
270 | struct nft_base_chain *basechain; | 272 | return nft_chain_validate_hooks(ctx->chain, (1 << NF_BR_PRE_ROUTING) | |
271 | 273 | (1 << NF_BR_LOCAL_IN)); | |
272 | if (chain->flags & NFT_BASE_CHAIN) { | ||
273 | basechain = nft_base_chain(chain); | ||
274 | |||
275 | switch (basechain->ops[0].hooknum) { | ||
276 | case NF_BR_PRE_ROUTING: | ||
277 | case NF_BR_LOCAL_IN: | ||
278 | break; | ||
279 | default: | ||
280 | return -EOPNOTSUPP; | ||
281 | } | ||
282 | } | ||
283 | return 0; | ||
284 | } | 274 | } |
285 | 275 | ||
286 | static int nft_reject_bridge_init(const struct nft_ctx *ctx, | 276 | static int nft_reject_bridge_init(const struct nft_ctx *ctx, |
@@ -290,7 +280,7 @@ static int nft_reject_bridge_init(const struct nft_ctx *ctx, | |||
290 | struct nft_reject *priv = nft_expr_priv(expr); | 280 | struct nft_reject *priv = nft_expr_priv(expr); |
291 | int icmp_code, err; | 281 | int icmp_code, err; |
292 | 282 | ||
293 | err = nft_reject_bridge_validate_hooks(ctx->chain); | 283 | err = nft_reject_bridge_validate(ctx, expr, NULL); |
294 | if (err < 0) | 284 | if (err < 0) |
295 | return err; | 285 | return err; |
296 | 286 | ||
@@ -341,13 +331,6 @@ nla_put_failure: | |||
341 | return -1; | 331 | return -1; |
342 | } | 332 | } |
343 | 333 | ||
344 | static int nft_reject_bridge_validate(const struct nft_ctx *ctx, | ||
345 | const struct nft_expr *expr, | ||
346 | const struct nft_data **data) | ||
347 | { | ||
348 | return nft_reject_bridge_validate_hooks(ctx->chain); | ||
349 | } | ||
350 | |||
351 | static struct nft_expr_type nft_reject_bridge_type; | 334 | static struct nft_expr_type nft_reject_bridge_type; |
352 | static const struct nft_expr_ops nft_reject_bridge_ops = { | 335 | static const struct nft_expr_ops nft_reject_bridge_ops = { |
353 | .type = &nft_reject_bridge_type, | 336 | .type = &nft_reject_bridge_type, |
diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c index 4589ff67bfa9..67a4a36febd1 100644 --- a/net/caif/chnl_net.c +++ b/net/caif/chnl_net.c | |||
@@ -470,7 +470,6 @@ static int ipcaif_newlink(struct net *src_net, struct net_device *dev, | |||
470 | ASSERT_RTNL(); | 470 | ASSERT_RTNL(); |
471 | caifdev = netdev_priv(dev); | 471 | caifdev = netdev_priv(dev); |
472 | caif_netlink_parms(data, &caifdev->conn_req); | 472 | caif_netlink_parms(data, &caifdev->conn_req); |
473 | dev_net_set(caifdev->netdev, src_net); | ||
474 | 473 | ||
475 | ret = register_netdevice(dev); | 474 | ret = register_netdevice(dev); |
476 | if (ret) | 475 | if (ret) |
diff --git a/net/core/dev.c b/net/core/dev.c index 171420e75b03..7fe82929f509 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2352,7 +2352,6 @@ EXPORT_SYMBOL(skb_checksum_help); | |||
2352 | 2352 | ||
2353 | __be16 skb_network_protocol(struct sk_buff *skb, int *depth) | 2353 | __be16 skb_network_protocol(struct sk_buff *skb, int *depth) |
2354 | { | 2354 | { |
2355 | unsigned int vlan_depth = skb->mac_len; | ||
2356 | __be16 type = skb->protocol; | 2355 | __be16 type = skb->protocol; |
2357 | 2356 | ||
2358 | /* Tunnel gso handlers can set protocol to ethernet. */ | 2357 | /* Tunnel gso handlers can set protocol to ethernet. */ |
@@ -2366,35 +2365,7 @@ __be16 skb_network_protocol(struct sk_buff *skb, int *depth) | |||
2366 | type = eth->h_proto; | 2365 | type = eth->h_proto; |
2367 | } | 2366 | } |
2368 | 2367 | ||
2369 | /* if skb->protocol is 802.1Q/AD then the header should already be | 2368 | return __vlan_get_protocol(skb, type, depth); |
2370 | * present at mac_len - VLAN_HLEN (if mac_len > 0), or at | ||
2371 | * ETH_HLEN otherwise | ||
2372 | */ | ||
2373 | if (type == htons(ETH_P_8021Q) || type == htons(ETH_P_8021AD)) { | ||
2374 | if (vlan_depth) { | ||
2375 | if (WARN_ON(vlan_depth < VLAN_HLEN)) | ||
2376 | return 0; | ||
2377 | vlan_depth -= VLAN_HLEN; | ||
2378 | } else { | ||
2379 | vlan_depth = ETH_HLEN; | ||
2380 | } | ||
2381 | do { | ||
2382 | struct vlan_hdr *vh; | ||
2383 | |||
2384 | if (unlikely(!pskb_may_pull(skb, | ||
2385 | vlan_depth + VLAN_HLEN))) | ||
2386 | return 0; | ||
2387 | |||
2388 | vh = (struct vlan_hdr *)(skb->data + vlan_depth); | ||
2389 | type = vh->h_vlan_encapsulated_proto; | ||
2390 | vlan_depth += VLAN_HLEN; | ||
2391 | } while (type == htons(ETH_P_8021Q) || | ||
2392 | type == htons(ETH_P_8021AD)); | ||
2393 | } | ||
2394 | |||
2395 | *depth = vlan_depth; | ||
2396 | |||
2397 | return type; | ||
2398 | } | 2369 | } |
2399 | 2370 | ||
2400 | /** | 2371 | /** |
@@ -5323,7 +5294,7 @@ void netdev_upper_dev_unlink(struct net_device *dev, | |||
5323 | } | 5294 | } |
5324 | EXPORT_SYMBOL(netdev_upper_dev_unlink); | 5295 | EXPORT_SYMBOL(netdev_upper_dev_unlink); |
5325 | 5296 | ||
5326 | void netdev_adjacent_add_links(struct net_device *dev) | 5297 | static void netdev_adjacent_add_links(struct net_device *dev) |
5327 | { | 5298 | { |
5328 | struct netdev_adjacent *iter; | 5299 | struct netdev_adjacent *iter; |
5329 | 5300 | ||
@@ -5348,7 +5319,7 @@ void netdev_adjacent_add_links(struct net_device *dev) | |||
5348 | } | 5319 | } |
5349 | } | 5320 | } |
5350 | 5321 | ||
5351 | void netdev_adjacent_del_links(struct net_device *dev) | 5322 | static void netdev_adjacent_del_links(struct net_device *dev) |
5352 | { | 5323 | { |
5353 | struct netdev_adjacent *iter; | 5324 | struct netdev_adjacent *iter; |
5354 | 5325 | ||
@@ -6656,7 +6627,7 @@ struct netdev_queue *dev_ingress_queue_create(struct net_device *dev) | |||
6656 | if (!queue) | 6627 | if (!queue) |
6657 | return NULL; | 6628 | return NULL; |
6658 | netdev_init_one_queue(dev, queue, NULL); | 6629 | netdev_init_one_queue(dev, queue, NULL); |
6659 | queue->qdisc = &noop_qdisc; | 6630 | RCU_INIT_POINTER(queue->qdisc, &noop_qdisc); |
6660 | queue->qdisc_sleeping = &noop_qdisc; | 6631 | queue->qdisc_sleeping = &noop_qdisc; |
6661 | rcu_assign_pointer(dev->ingress_queue, queue); | 6632 | rcu_assign_pointer(dev->ingress_queue, queue); |
6662 | #endif | 6633 | #endif |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 9cf6fe9ddc0c..446cbaf81185 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -2895,12 +2895,16 @@ static int rtnl_bridge_notify(struct net_device *dev, u16 flags) | |||
2895 | goto errout; | 2895 | goto errout; |
2896 | } | 2896 | } |
2897 | 2897 | ||
2898 | if (!skb->len) | ||
2899 | goto errout; | ||
2900 | |||
2898 | rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); | 2901 | rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC); |
2899 | return 0; | 2902 | return 0; |
2900 | errout: | 2903 | errout: |
2901 | WARN_ON(err == -EMSGSIZE); | 2904 | WARN_ON(err == -EMSGSIZE); |
2902 | kfree_skb(skb); | 2905 | kfree_skb(skb); |
2903 | rtnl_set_sk_err(net, RTNLGRP_LINK, err); | 2906 | if (err) |
2907 | rtnl_set_sk_err(net, RTNLGRP_LINK, err); | ||
2904 | return err; | 2908 | return err; |
2905 | } | 2909 | } |
2906 | 2910 | ||
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index b50861b22b6b..c373c0708d97 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -1506,23 +1506,8 @@ static int ip_reply_glue_bits(void *dptr, char *to, int offset, | |||
1506 | /* | 1506 | /* |
1507 | * Generic function to send a packet as reply to another packet. | 1507 | * Generic function to send a packet as reply to another packet. |
1508 | * Used to send some TCP resets/acks so far. | 1508 | * Used to send some TCP resets/acks so far. |
1509 | * | ||
1510 | * Use a fake percpu inet socket to avoid false sharing and contention. | ||
1511 | */ | 1509 | */ |
1512 | static DEFINE_PER_CPU(struct inet_sock, unicast_sock) = { | 1510 | void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, |
1513 | .sk = { | ||
1514 | .__sk_common = { | ||
1515 | .skc_refcnt = ATOMIC_INIT(1), | ||
1516 | }, | ||
1517 | .sk_wmem_alloc = ATOMIC_INIT(1), | ||
1518 | .sk_allocation = GFP_ATOMIC, | ||
1519 | .sk_flags = (1UL << SOCK_USE_WRITE_QUEUE), | ||
1520 | }, | ||
1521 | .pmtudisc = IP_PMTUDISC_WANT, | ||
1522 | .uc_ttl = -1, | ||
1523 | }; | ||
1524 | |||
1525 | void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | ||
1526 | const struct ip_options *sopt, | 1511 | const struct ip_options *sopt, |
1527 | __be32 daddr, __be32 saddr, | 1512 | __be32 daddr, __be32 saddr, |
1528 | const struct ip_reply_arg *arg, | 1513 | const struct ip_reply_arg *arg, |
@@ -1532,9 +1517,8 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | |||
1532 | struct ipcm_cookie ipc; | 1517 | struct ipcm_cookie ipc; |
1533 | struct flowi4 fl4; | 1518 | struct flowi4 fl4; |
1534 | struct rtable *rt = skb_rtable(skb); | 1519 | struct rtable *rt = skb_rtable(skb); |
1520 | struct net *net = sock_net(sk); | ||
1535 | struct sk_buff *nskb; | 1521 | struct sk_buff *nskb; |
1536 | struct sock *sk; | ||
1537 | struct inet_sock *inet; | ||
1538 | int err; | 1522 | int err; |
1539 | 1523 | ||
1540 | if (__ip_options_echo(&replyopts.opt.opt, skb, sopt)) | 1524 | if (__ip_options_echo(&replyopts.opt.opt, skb, sopt)) |
@@ -1565,15 +1549,11 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | |||
1565 | if (IS_ERR(rt)) | 1549 | if (IS_ERR(rt)) |
1566 | return; | 1550 | return; |
1567 | 1551 | ||
1568 | inet = &get_cpu_var(unicast_sock); | 1552 | inet_sk(sk)->tos = arg->tos; |
1569 | 1553 | ||
1570 | inet->tos = arg->tos; | ||
1571 | sk = &inet->sk; | ||
1572 | sk->sk_priority = skb->priority; | 1554 | sk->sk_priority = skb->priority; |
1573 | sk->sk_protocol = ip_hdr(skb)->protocol; | 1555 | sk->sk_protocol = ip_hdr(skb)->protocol; |
1574 | sk->sk_bound_dev_if = arg->bound_dev_if; | 1556 | sk->sk_bound_dev_if = arg->bound_dev_if; |
1575 | sock_net_set(sk, net); | ||
1576 | __skb_queue_head_init(&sk->sk_write_queue); | ||
1577 | sk->sk_sndbuf = sysctl_wmem_default; | 1557 | sk->sk_sndbuf = sysctl_wmem_default; |
1578 | err = ip_append_data(sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, | 1558 | err = ip_append_data(sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base, |
1579 | len, 0, &ipc, &rt, MSG_DONTWAIT); | 1559 | len, 0, &ipc, &rt, MSG_DONTWAIT); |
@@ -1589,13 +1569,10 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, | |||
1589 | arg->csumoffset) = csum_fold(csum_add(nskb->csum, | 1569 | arg->csumoffset) = csum_fold(csum_add(nskb->csum, |
1590 | arg->csum)); | 1570 | arg->csum)); |
1591 | nskb->ip_summed = CHECKSUM_NONE; | 1571 | nskb->ip_summed = CHECKSUM_NONE; |
1592 | skb_orphan(nskb); | ||
1593 | skb_set_queue_mapping(nskb, skb_get_queue_mapping(skb)); | 1572 | skb_set_queue_mapping(nskb, skb_get_queue_mapping(skb)); |
1594 | ip_push_pending_frames(sk, &fl4); | 1573 | ip_push_pending_frames(sk, &fl4); |
1595 | } | 1574 | } |
1596 | out: | 1575 | out: |
1597 | put_cpu_var(unicast_sock); | ||
1598 | |||
1599 | ip_rt_put(rt); | 1576 | ip_rt_put(rt); |
1600 | } | 1577 | } |
1601 | 1578 | ||
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index d58dd0ec3e53..52e1f2bf0ca2 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -966,6 +966,9 @@ static void __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu) | |||
966 | if (dst->dev->mtu < mtu) | 966 | if (dst->dev->mtu < mtu) |
967 | return; | 967 | return; |
968 | 968 | ||
969 | if (rt->rt_pmtu && rt->rt_pmtu < mtu) | ||
970 | return; | ||
971 | |||
969 | if (mtu < ip_rt_min_pmtu) | 972 | if (mtu < ip_rt_min_pmtu) |
970 | mtu = ip_rt_min_pmtu; | 973 | mtu = ip_rt_min_pmtu; |
971 | 974 | ||
diff --git a/net/ipv4/tcp_bic.c b/net/ipv4/tcp_bic.c index bb395d46a389..c037644eafb7 100644 --- a/net/ipv4/tcp_bic.c +++ b/net/ipv4/tcp_bic.c | |||
@@ -150,7 +150,7 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
150 | tcp_slow_start(tp, acked); | 150 | tcp_slow_start(tp, acked); |
151 | else { | 151 | else { |
152 | bictcp_update(ca, tp->snd_cwnd); | 152 | bictcp_update(ca, tp->snd_cwnd); |
153 | tcp_cong_avoid_ai(tp, ca->cnt); | 153 | tcp_cong_avoid_ai(tp, ca->cnt, 1); |
154 | } | 154 | } |
155 | } | 155 | } |
156 | 156 | ||
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 27ead0dd16bc..8670e68e2ce6 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c | |||
@@ -291,26 +291,32 @@ int tcp_set_congestion_control(struct sock *sk, const char *name) | |||
291 | * ABC caps N to 2. Slow start exits when cwnd grows over ssthresh and | 291 | * ABC caps N to 2. Slow start exits when cwnd grows over ssthresh and |
292 | * returns the leftover acks to adjust cwnd in congestion avoidance mode. | 292 | * returns the leftover acks to adjust cwnd in congestion avoidance mode. |
293 | */ | 293 | */ |
294 | void tcp_slow_start(struct tcp_sock *tp, u32 acked) | 294 | u32 tcp_slow_start(struct tcp_sock *tp, u32 acked) |
295 | { | 295 | { |
296 | u32 cwnd = tp->snd_cwnd + acked; | 296 | u32 cwnd = tp->snd_cwnd + acked; |
297 | 297 | ||
298 | if (cwnd > tp->snd_ssthresh) | 298 | if (cwnd > tp->snd_ssthresh) |
299 | cwnd = tp->snd_ssthresh + 1; | 299 | cwnd = tp->snd_ssthresh + 1; |
300 | acked -= cwnd - tp->snd_cwnd; | ||
300 | tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); | 301 | tp->snd_cwnd = min(cwnd, tp->snd_cwnd_clamp); |
302 | |||
303 | return acked; | ||
301 | } | 304 | } |
302 | EXPORT_SYMBOL_GPL(tcp_slow_start); | 305 | EXPORT_SYMBOL_GPL(tcp_slow_start); |
303 | 306 | ||
304 | /* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd (or alternative w) */ | 307 | /* In theory this is tp->snd_cwnd += 1 / tp->snd_cwnd (or alternative w), |
305 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w) | 308 | * for every packet that was ACKed. |
309 | */ | ||
310 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked) | ||
306 | { | 311 | { |
312 | tp->snd_cwnd_cnt += acked; | ||
307 | if (tp->snd_cwnd_cnt >= w) { | 313 | if (tp->snd_cwnd_cnt >= w) { |
308 | if (tp->snd_cwnd < tp->snd_cwnd_clamp) | 314 | u32 delta = tp->snd_cwnd_cnt / w; |
309 | tp->snd_cwnd++; | 315 | |
310 | tp->snd_cwnd_cnt = 0; | 316 | tp->snd_cwnd_cnt -= delta * w; |
311 | } else { | 317 | tp->snd_cwnd += delta; |
312 | tp->snd_cwnd_cnt++; | ||
313 | } | 318 | } |
319 | tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_cwnd_clamp); | ||
314 | } | 320 | } |
315 | EXPORT_SYMBOL_GPL(tcp_cong_avoid_ai); | 321 | EXPORT_SYMBOL_GPL(tcp_cong_avoid_ai); |
316 | 322 | ||
@@ -329,11 +335,13 @@ void tcp_reno_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
329 | return; | 335 | return; |
330 | 336 | ||
331 | /* In "safe" area, increase. */ | 337 | /* In "safe" area, increase. */ |
332 | if (tp->snd_cwnd <= tp->snd_ssthresh) | 338 | if (tp->snd_cwnd <= tp->snd_ssthresh) { |
333 | tcp_slow_start(tp, acked); | 339 | acked = tcp_slow_start(tp, acked); |
340 | if (!acked) | ||
341 | return; | ||
342 | } | ||
334 | /* In dangerous area, increase slowly. */ | 343 | /* In dangerous area, increase slowly. */ |
335 | else | 344 | tcp_cong_avoid_ai(tp, tp->snd_cwnd, acked); |
336 | tcp_cong_avoid_ai(tp, tp->snd_cwnd); | ||
337 | } | 345 | } |
338 | EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid); | 346 | EXPORT_SYMBOL_GPL(tcp_reno_cong_avoid); |
339 | 347 | ||
diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index 6b6002416a73..4b276d1ed980 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c | |||
@@ -93,9 +93,7 @@ struct bictcp { | |||
93 | u32 epoch_start; /* beginning of an epoch */ | 93 | u32 epoch_start; /* beginning of an epoch */ |
94 | u32 ack_cnt; /* number of acks */ | 94 | u32 ack_cnt; /* number of acks */ |
95 | u32 tcp_cwnd; /* estimated tcp cwnd */ | 95 | u32 tcp_cwnd; /* estimated tcp cwnd */ |
96 | #define ACK_RATIO_SHIFT 4 | 96 | u16 unused; |
97 | #define ACK_RATIO_LIMIT (32u << ACK_RATIO_SHIFT) | ||
98 | u16 delayed_ack; /* estimate the ratio of Packets/ACKs << 4 */ | ||
99 | u8 sample_cnt; /* number of samples to decide curr_rtt */ | 97 | u8 sample_cnt; /* number of samples to decide curr_rtt */ |
100 | u8 found; /* the exit point is found? */ | 98 | u8 found; /* the exit point is found? */ |
101 | u32 round_start; /* beginning of each round */ | 99 | u32 round_start; /* beginning of each round */ |
@@ -114,7 +112,6 @@ static inline void bictcp_reset(struct bictcp *ca) | |||
114 | ca->bic_K = 0; | 112 | ca->bic_K = 0; |
115 | ca->delay_min = 0; | 113 | ca->delay_min = 0; |
116 | ca->epoch_start = 0; | 114 | ca->epoch_start = 0; |
117 | ca->delayed_ack = 2 << ACK_RATIO_SHIFT; | ||
118 | ca->ack_cnt = 0; | 115 | ca->ack_cnt = 0; |
119 | ca->tcp_cwnd = 0; | 116 | ca->tcp_cwnd = 0; |
120 | ca->found = 0; | 117 | ca->found = 0; |
@@ -205,23 +202,30 @@ static u32 cubic_root(u64 a) | |||
205 | /* | 202 | /* |
206 | * Compute congestion window to use. | 203 | * Compute congestion window to use. |
207 | */ | 204 | */ |
208 | static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | 205 | static inline void bictcp_update(struct bictcp *ca, u32 cwnd, u32 acked) |
209 | { | 206 | { |
210 | u32 delta, bic_target, max_cnt; | 207 | u32 delta, bic_target, max_cnt; |
211 | u64 offs, t; | 208 | u64 offs, t; |
212 | 209 | ||
213 | ca->ack_cnt++; /* count the number of ACKs */ | 210 | ca->ack_cnt += acked; /* count the number of ACKed packets */ |
214 | 211 | ||
215 | if (ca->last_cwnd == cwnd && | 212 | if (ca->last_cwnd == cwnd && |
216 | (s32)(tcp_time_stamp - ca->last_time) <= HZ / 32) | 213 | (s32)(tcp_time_stamp - ca->last_time) <= HZ / 32) |
217 | return; | 214 | return; |
218 | 215 | ||
216 | /* The CUBIC function can update ca->cnt at most once per jiffy. | ||
217 | * On all cwnd reduction events, ca->epoch_start is set to 0, | ||
218 | * which will force a recalculation of ca->cnt. | ||
219 | */ | ||
220 | if (ca->epoch_start && tcp_time_stamp == ca->last_time) | ||
221 | goto tcp_friendliness; | ||
222 | |||
219 | ca->last_cwnd = cwnd; | 223 | ca->last_cwnd = cwnd; |
220 | ca->last_time = tcp_time_stamp; | 224 | ca->last_time = tcp_time_stamp; |
221 | 225 | ||
222 | if (ca->epoch_start == 0) { | 226 | if (ca->epoch_start == 0) { |
223 | ca->epoch_start = tcp_time_stamp; /* record beginning */ | 227 | ca->epoch_start = tcp_time_stamp; /* record beginning */ |
224 | ca->ack_cnt = 1; /* start counting */ | 228 | ca->ack_cnt = acked; /* start counting */ |
225 | ca->tcp_cwnd = cwnd; /* syn with cubic */ | 229 | ca->tcp_cwnd = cwnd; /* syn with cubic */ |
226 | 230 | ||
227 | if (ca->last_max_cwnd <= cwnd) { | 231 | if (ca->last_max_cwnd <= cwnd) { |
@@ -283,6 +287,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
283 | if (ca->last_max_cwnd == 0 && ca->cnt > 20) | 287 | if (ca->last_max_cwnd == 0 && ca->cnt > 20) |
284 | ca->cnt = 20; /* increase cwnd 5% per RTT */ | 288 | ca->cnt = 20; /* increase cwnd 5% per RTT */ |
285 | 289 | ||
290 | tcp_friendliness: | ||
286 | /* TCP Friendly */ | 291 | /* TCP Friendly */ |
287 | if (tcp_friendliness) { | 292 | if (tcp_friendliness) { |
288 | u32 scale = beta_scale; | 293 | u32 scale = beta_scale; |
@@ -301,7 +306,6 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
301 | } | 306 | } |
302 | } | 307 | } |
303 | 308 | ||
304 | ca->cnt = (ca->cnt << ACK_RATIO_SHIFT) / ca->delayed_ack; | ||
305 | if (ca->cnt == 0) /* cannot be zero */ | 309 | if (ca->cnt == 0) /* cannot be zero */ |
306 | ca->cnt = 1; | 310 | ca->cnt = 1; |
307 | } | 311 | } |
@@ -317,11 +321,12 @@ static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
317 | if (tp->snd_cwnd <= tp->snd_ssthresh) { | 321 | if (tp->snd_cwnd <= tp->snd_ssthresh) { |
318 | if (hystart && after(ack, ca->end_seq)) | 322 | if (hystart && after(ack, ca->end_seq)) |
319 | bictcp_hystart_reset(sk); | 323 | bictcp_hystart_reset(sk); |
320 | tcp_slow_start(tp, acked); | 324 | acked = tcp_slow_start(tp, acked); |
321 | } else { | 325 | if (!acked) |
322 | bictcp_update(ca, tp->snd_cwnd); | 326 | return; |
323 | tcp_cong_avoid_ai(tp, ca->cnt); | ||
324 | } | 327 | } |
328 | bictcp_update(ca, tp->snd_cwnd, acked); | ||
329 | tcp_cong_avoid_ai(tp, ca->cnt, acked); | ||
325 | } | 330 | } |
326 | 331 | ||
327 | static u32 bictcp_recalc_ssthresh(struct sock *sk) | 332 | static u32 bictcp_recalc_ssthresh(struct sock *sk) |
@@ -411,20 +416,10 @@ static void hystart_update(struct sock *sk, u32 delay) | |||
411 | */ | 416 | */ |
412 | static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us) | 417 | static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us) |
413 | { | 418 | { |
414 | const struct inet_connection_sock *icsk = inet_csk(sk); | ||
415 | const struct tcp_sock *tp = tcp_sk(sk); | 419 | const struct tcp_sock *tp = tcp_sk(sk); |
416 | struct bictcp *ca = inet_csk_ca(sk); | 420 | struct bictcp *ca = inet_csk_ca(sk); |
417 | u32 delay; | 421 | u32 delay; |
418 | 422 | ||
419 | if (icsk->icsk_ca_state == TCP_CA_Open) { | ||
420 | u32 ratio = ca->delayed_ack; | ||
421 | |||
422 | ratio -= ca->delayed_ack >> ACK_RATIO_SHIFT; | ||
423 | ratio += cnt; | ||
424 | |||
425 | ca->delayed_ack = clamp(ratio, 1U, ACK_RATIO_LIMIT); | ||
426 | } | ||
427 | |||
428 | /* Some calls are for duplicates without timetamps */ | 423 | /* Some calls are for duplicates without timetamps */ |
429 | if (rtt_us < 0) | 424 | if (rtt_us < 0) |
430 | return; | 425 | return; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index a3f72d7fc06c..d22f54482bab 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -683,7 +683,8 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb) | |||
683 | arg.bound_dev_if = sk->sk_bound_dev_if; | 683 | arg.bound_dev_if = sk->sk_bound_dev_if; |
684 | 684 | ||
685 | arg.tos = ip_hdr(skb)->tos; | 685 | arg.tos = ip_hdr(skb)->tos; |
686 | ip_send_unicast_reply(net, skb, &TCP_SKB_CB(skb)->header.h4.opt, | 686 | ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk), |
687 | skb, &TCP_SKB_CB(skb)->header.h4.opt, | ||
687 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, | 688 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, |
688 | &arg, arg.iov[0].iov_len); | 689 | &arg, arg.iov[0].iov_len); |
689 | 690 | ||
@@ -767,7 +768,8 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack, | |||
767 | if (oif) | 768 | if (oif) |
768 | arg.bound_dev_if = oif; | 769 | arg.bound_dev_if = oif; |
769 | arg.tos = tos; | 770 | arg.tos = tos; |
770 | ip_send_unicast_reply(net, skb, &TCP_SKB_CB(skb)->header.h4.opt, | 771 | ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk), |
772 | skb, &TCP_SKB_CB(skb)->header.h4.opt, | ||
771 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, | 773 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, |
772 | &arg, arg.iov[0].iov_len); | 774 | &arg, arg.iov[0].iov_len); |
773 | 775 | ||
@@ -2428,14 +2430,39 @@ struct proto tcp_prot = { | |||
2428 | }; | 2430 | }; |
2429 | EXPORT_SYMBOL(tcp_prot); | 2431 | EXPORT_SYMBOL(tcp_prot); |
2430 | 2432 | ||
2433 | static void __net_exit tcp_sk_exit(struct net *net) | ||
2434 | { | ||
2435 | int cpu; | ||
2436 | |||
2437 | for_each_possible_cpu(cpu) | ||
2438 | inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv4.tcp_sk, cpu)); | ||
2439 | free_percpu(net->ipv4.tcp_sk); | ||
2440 | } | ||
2441 | |||
2431 | static int __net_init tcp_sk_init(struct net *net) | 2442 | static int __net_init tcp_sk_init(struct net *net) |
2432 | { | 2443 | { |
2444 | int res, cpu; | ||
2445 | |||
2446 | net->ipv4.tcp_sk = alloc_percpu(struct sock *); | ||
2447 | if (!net->ipv4.tcp_sk) | ||
2448 | return -ENOMEM; | ||
2449 | |||
2450 | for_each_possible_cpu(cpu) { | ||
2451 | struct sock *sk; | ||
2452 | |||
2453 | res = inet_ctl_sock_create(&sk, PF_INET, SOCK_RAW, | ||
2454 | IPPROTO_TCP, net); | ||
2455 | if (res) | ||
2456 | goto fail; | ||
2457 | *per_cpu_ptr(net->ipv4.tcp_sk, cpu) = sk; | ||
2458 | } | ||
2433 | net->ipv4.sysctl_tcp_ecn = 2; | 2459 | net->ipv4.sysctl_tcp_ecn = 2; |
2434 | return 0; | 2460 | return 0; |
2435 | } | ||
2436 | 2461 | ||
2437 | static void __net_exit tcp_sk_exit(struct net *net) | 2462 | fail: |
2438 | { | 2463 | tcp_sk_exit(net); |
2464 | |||
2465 | return res; | ||
2439 | } | 2466 | } |
2440 | 2467 | ||
2441 | static void __net_exit tcp_sk_exit_batch(struct list_head *net_exit_list) | 2468 | static void __net_exit tcp_sk_exit_batch(struct list_head *net_exit_list) |
diff --git a/net/ipv4/tcp_scalable.c b/net/ipv4/tcp_scalable.c index 6824afb65d93..333bcb2415ff 100644 --- a/net/ipv4/tcp_scalable.c +++ b/net/ipv4/tcp_scalable.c | |||
@@ -25,7 +25,8 @@ static void tcp_scalable_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
25 | if (tp->snd_cwnd <= tp->snd_ssthresh) | 25 | if (tp->snd_cwnd <= tp->snd_ssthresh) |
26 | tcp_slow_start(tp, acked); | 26 | tcp_slow_start(tp, acked); |
27 | else | 27 | else |
28 | tcp_cong_avoid_ai(tp, min(tp->snd_cwnd, TCP_SCALABLE_AI_CNT)); | 28 | tcp_cong_avoid_ai(tp, min(tp->snd_cwnd, TCP_SCALABLE_AI_CNT), |
29 | 1); | ||
29 | } | 30 | } |
30 | 31 | ||
31 | static u32 tcp_scalable_ssthresh(struct sock *sk) | 32 | static u32 tcp_scalable_ssthresh(struct sock *sk) |
diff --git a/net/ipv4/tcp_veno.c b/net/ipv4/tcp_veno.c index a4d2d2d88dca..112151eeee45 100644 --- a/net/ipv4/tcp_veno.c +++ b/net/ipv4/tcp_veno.c | |||
@@ -159,7 +159,7 @@ static void tcp_veno_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
159 | /* In the "non-congestive state", increase cwnd | 159 | /* In the "non-congestive state", increase cwnd |
160 | * every rtt. | 160 | * every rtt. |
161 | */ | 161 | */ |
162 | tcp_cong_avoid_ai(tp, tp->snd_cwnd); | 162 | tcp_cong_avoid_ai(tp, tp->snd_cwnd, 1); |
163 | } else { | 163 | } else { |
164 | /* In the "congestive state", increase cwnd | 164 | /* In the "congestive state", increase cwnd |
165 | * every other rtt. | 165 | * every other rtt. |
diff --git a/net/ipv4/tcp_yeah.c b/net/ipv4/tcp_yeah.c index cd7273218598..17d35662930d 100644 --- a/net/ipv4/tcp_yeah.c +++ b/net/ipv4/tcp_yeah.c | |||
@@ -92,7 +92,7 @@ static void tcp_yeah_cong_avoid(struct sock *sk, u32 ack, u32 acked) | |||
92 | 92 | ||
93 | } else { | 93 | } else { |
94 | /* Reno */ | 94 | /* Reno */ |
95 | tcp_cong_avoid_ai(tp, tp->snd_cwnd); | 95 | tcp_cong_avoid_ai(tp, tp->snd_cwnd, 1); |
96 | } | 96 | } |
97 | 97 | ||
98 | /* The key players are v_vegas.beg_snd_una and v_beg_snd_nxt. | 98 | /* The key players are v_vegas.beg_snd_una and v_beg_snd_nxt. |
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 13cda4c6313b..01ccc28a686f 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c | |||
@@ -417,7 +417,7 @@ static void ip6gre_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
417 | if (code == ICMPV6_HDR_FIELD) | 417 | if (code == ICMPV6_HDR_FIELD) |
418 | teli = ip6_tnl_parse_tlv_enc_lim(skb, skb->data); | 418 | teli = ip6_tnl_parse_tlv_enc_lim(skb, skb->data); |
419 | 419 | ||
420 | if (teli && teli == info - 2) { | 420 | if (teli && teli == be32_to_cpu(info) - 2) { |
421 | tel = (struct ipv6_tlv_tnl_enc_lim *) &skb->data[teli]; | 421 | tel = (struct ipv6_tlv_tnl_enc_lim *) &skb->data[teli]; |
422 | if (tel->encap_limit == 0) { | 422 | if (tel->encap_limit == 0) { |
423 | net_warn_ratelimited("%s: Too small encapsulation limit or routing loop in tunnel!\n", | 423 | net_warn_ratelimited("%s: Too small encapsulation limit or routing loop in tunnel!\n", |
@@ -429,7 +429,7 @@ static void ip6gre_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
429 | } | 429 | } |
430 | break; | 430 | break; |
431 | case ICMPV6_PKT_TOOBIG: | 431 | case ICMPV6_PKT_TOOBIG: |
432 | mtu = info - offset; | 432 | mtu = be32_to_cpu(info) - offset; |
433 | if (mtu < IPV6_MIN_MTU) | 433 | if (mtu < IPV6_MIN_MTU) |
434 | mtu = IPV6_MIN_MTU; | 434 | mtu = IPV6_MIN_MTU; |
435 | t->dev->mtu = mtu; | 435 | t->dev->mtu = mtu; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index ce69a12ae48c..d28f2a2efb32 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -537,20 +537,6 @@ static void ip6_copy_metadata(struct sk_buff *to, struct sk_buff *from) | |||
537 | skb_copy_secmark(to, from); | 537 | skb_copy_secmark(to, from); |
538 | } | 538 | } |
539 | 539 | ||
540 | static void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt) | ||
541 | { | ||
542 | static u32 ip6_idents_hashrnd __read_mostly; | ||
543 | u32 hash, id; | ||
544 | |||
545 | net_get_random_once(&ip6_idents_hashrnd, sizeof(ip6_idents_hashrnd)); | ||
546 | |||
547 | hash = __ipv6_addr_jhash(&rt->rt6i_dst.addr, ip6_idents_hashrnd); | ||
548 | hash = __ipv6_addr_jhash(&rt->rt6i_src.addr, hash); | ||
549 | |||
550 | id = ip_idents_reserve(hash, 1); | ||
551 | fhdr->identification = htonl(id); | ||
552 | } | ||
553 | |||
554 | int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | 540 | int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) |
555 | { | 541 | { |
556 | struct sk_buff *frag; | 542 | struct sk_buff *frag; |
diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c index 97f41a3e68d9..54520a0bd5e3 100644 --- a/net/ipv6/output_core.c +++ b/net/ipv6/output_core.c | |||
@@ -9,6 +9,24 @@ | |||
9 | #include <net/addrconf.h> | 9 | #include <net/addrconf.h> |
10 | #include <net/secure_seq.h> | 10 | #include <net/secure_seq.h> |
11 | 11 | ||
12 | u32 __ipv6_select_ident(u32 hashrnd, struct in6_addr *dst, struct in6_addr *src) | ||
13 | { | ||
14 | u32 hash, id; | ||
15 | |||
16 | hash = __ipv6_addr_jhash(dst, hashrnd); | ||
17 | hash = __ipv6_addr_jhash(src, hash); | ||
18 | |||
19 | /* Treat id of 0 as unset and if we get 0 back from ip_idents_reserve, | ||
20 | * set the hight order instead thus minimizing possible future | ||
21 | * collisions. | ||
22 | */ | ||
23 | id = ip_idents_reserve(hash, 1); | ||
24 | if (unlikely(!id)) | ||
25 | id = 1 << 31; | ||
26 | |||
27 | return id; | ||
28 | } | ||
29 | |||
12 | /* This function exists only for tap drivers that must support broken | 30 | /* This function exists only for tap drivers that must support broken |
13 | * clients requesting UFO without specifying an IPv6 fragment ID. | 31 | * clients requesting UFO without specifying an IPv6 fragment ID. |
14 | * | 32 | * |
@@ -22,7 +40,7 @@ void ipv6_proxy_select_ident(struct sk_buff *skb) | |||
22 | static u32 ip6_proxy_idents_hashrnd __read_mostly; | 40 | static u32 ip6_proxy_idents_hashrnd __read_mostly; |
23 | struct in6_addr buf[2]; | 41 | struct in6_addr buf[2]; |
24 | struct in6_addr *addrs; | 42 | struct in6_addr *addrs; |
25 | u32 hash, id; | 43 | u32 id; |
26 | 44 | ||
27 | addrs = skb_header_pointer(skb, | 45 | addrs = skb_header_pointer(skb, |
28 | skb_network_offset(skb) + | 46 | skb_network_offset(skb) + |
@@ -34,14 +52,25 @@ void ipv6_proxy_select_ident(struct sk_buff *skb) | |||
34 | net_get_random_once(&ip6_proxy_idents_hashrnd, | 52 | net_get_random_once(&ip6_proxy_idents_hashrnd, |
35 | sizeof(ip6_proxy_idents_hashrnd)); | 53 | sizeof(ip6_proxy_idents_hashrnd)); |
36 | 54 | ||
37 | hash = __ipv6_addr_jhash(&addrs[1], ip6_proxy_idents_hashrnd); | 55 | id = __ipv6_select_ident(ip6_proxy_idents_hashrnd, |
38 | hash = __ipv6_addr_jhash(&addrs[0], hash); | 56 | &addrs[1], &addrs[0]); |
39 | 57 | skb_shinfo(skb)->ip6_frag_id = id; | |
40 | id = ip_idents_reserve(hash, 1); | ||
41 | skb_shinfo(skb)->ip6_frag_id = htonl(id); | ||
42 | } | 58 | } |
43 | EXPORT_SYMBOL_GPL(ipv6_proxy_select_ident); | 59 | EXPORT_SYMBOL_GPL(ipv6_proxy_select_ident); |
44 | 60 | ||
61 | void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt) | ||
62 | { | ||
63 | static u32 ip6_idents_hashrnd __read_mostly; | ||
64 | u32 id; | ||
65 | |||
66 | net_get_random_once(&ip6_idents_hashrnd, sizeof(ip6_idents_hashrnd)); | ||
67 | |||
68 | id = __ipv6_select_ident(ip6_idents_hashrnd, &rt->rt6i_dst.addr, | ||
69 | &rt->rt6i_src.addr); | ||
70 | fhdr->identification = htonl(id); | ||
71 | } | ||
72 | EXPORT_SYMBOL(ipv6_select_ident); | ||
73 | |||
45 | int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) | 74 | int ip6_find_1stfragopt(struct sk_buff *skb, u8 **nexthdr) |
46 | { | 75 | { |
47 | u16 offset = sizeof(struct ipv6hdr); | 76 | u16 offset = sizeof(struct ipv6hdr); |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 213546bd6d5d..cdbfe5af6187 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -1506,12 +1506,12 @@ static bool ipip6_netlink_encap_parms(struct nlattr *data[], | |||
1506 | 1506 | ||
1507 | if (data[IFLA_IPTUN_ENCAP_SPORT]) { | 1507 | if (data[IFLA_IPTUN_ENCAP_SPORT]) { |
1508 | ret = true; | 1508 | ret = true; |
1509 | ipencap->sport = nla_get_u16(data[IFLA_IPTUN_ENCAP_SPORT]); | 1509 | ipencap->sport = nla_get_be16(data[IFLA_IPTUN_ENCAP_SPORT]); |
1510 | } | 1510 | } |
1511 | 1511 | ||
1512 | if (data[IFLA_IPTUN_ENCAP_DPORT]) { | 1512 | if (data[IFLA_IPTUN_ENCAP_DPORT]) { |
1513 | ret = true; | 1513 | ret = true; |
1514 | ipencap->dport = nla_get_u16(data[IFLA_IPTUN_ENCAP_DPORT]); | 1514 | ipencap->dport = nla_get_be16(data[IFLA_IPTUN_ENCAP_DPORT]); |
1515 | } | 1515 | } |
1516 | 1516 | ||
1517 | return ret; | 1517 | return ret; |
@@ -1707,9 +1707,9 @@ static int ipip6_fill_info(struct sk_buff *skb, const struct net_device *dev) | |||
1707 | 1707 | ||
1708 | if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, | 1708 | if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, |
1709 | tunnel->encap.type) || | 1709 | tunnel->encap.type) || |
1710 | nla_put_u16(skb, IFLA_IPTUN_ENCAP_SPORT, | 1710 | nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, |
1711 | tunnel->encap.sport) || | 1711 | tunnel->encap.sport) || |
1712 | nla_put_u16(skb, IFLA_IPTUN_ENCAP_DPORT, | 1712 | nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, |
1713 | tunnel->encap.dport) || | 1713 | tunnel->encap.dport) || |
1714 | nla_put_u16(skb, IFLA_IPTUN_ENCAP_FLAGS, | 1714 | nla_put_u16(skb, IFLA_IPTUN_ENCAP_FLAGS, |
1715 | tunnel->encap.flags)) | 1715 | tunnel->encap.flags)) |
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c index b6aa8ed18257..a56276996b72 100644 --- a/net/ipv6/udp_offload.c +++ b/net/ipv6/udp_offload.c | |||
@@ -52,6 +52,10 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
52 | 52 | ||
53 | skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss); | 53 | skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss); |
54 | 54 | ||
55 | /* Set the IPv6 fragment id if not set yet */ | ||
56 | if (!skb_shinfo(skb)->ip6_frag_id) | ||
57 | ipv6_proxy_select_ident(skb); | ||
58 | |||
55 | segs = NULL; | 59 | segs = NULL; |
56 | goto out; | 60 | goto out; |
57 | } | 61 | } |
@@ -108,7 +112,11 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
108 | fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen); | 112 | fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen); |
109 | fptr->nexthdr = nexthdr; | 113 | fptr->nexthdr = nexthdr; |
110 | fptr->reserved = 0; | 114 | fptr->reserved = 0; |
111 | fptr->identification = skb_shinfo(skb)->ip6_frag_id; | 115 | if (skb_shinfo(skb)->ip6_frag_id) |
116 | fptr->identification = skb_shinfo(skb)->ip6_frag_id; | ||
117 | else | ||
118 | ipv6_select_ident(fptr, | ||
119 | (struct rt6_info *)skb_dst(skb)); | ||
112 | 120 | ||
113 | /* Fragment the skb. ipv6 header and the remaining fields of the | 121 | /* Fragment the skb. ipv6 header and the remaining fields of the |
114 | * fragment header are updated in ipv6_gso_segment() | 122 | * fragment header are updated in ipv6_gso_segment() |
diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c index 990decba1fe4..b87ca32efa0b 100644 --- a/net/netfilter/ipvs/ip_vs_core.c +++ b/net/netfilter/ipvs/ip_vs_core.c | |||
@@ -659,16 +659,24 @@ static inline int ip_vs_gather_frags(struct sk_buff *skb, u_int32_t user) | |||
659 | return err; | 659 | return err; |
660 | } | 660 | } |
661 | 661 | ||
662 | static int ip_vs_route_me_harder(int af, struct sk_buff *skb) | 662 | static int ip_vs_route_me_harder(int af, struct sk_buff *skb, |
663 | unsigned int hooknum) | ||
663 | { | 664 | { |
665 | if (!sysctl_snat_reroute(skb)) | ||
666 | return 0; | ||
667 | /* Reroute replies only to remote clients (FORWARD and LOCAL_OUT) */ | ||
668 | if (NF_INET_LOCAL_IN == hooknum) | ||
669 | return 0; | ||
664 | #ifdef CONFIG_IP_VS_IPV6 | 670 | #ifdef CONFIG_IP_VS_IPV6 |
665 | if (af == AF_INET6) { | 671 | if (af == AF_INET6) { |
666 | if (sysctl_snat_reroute(skb) && ip6_route_me_harder(skb) != 0) | 672 | struct dst_entry *dst = skb_dst(skb); |
673 | |||
674 | if (dst->dev && !(dst->dev->flags & IFF_LOOPBACK) && | ||
675 | ip6_route_me_harder(skb) != 0) | ||
667 | return 1; | 676 | return 1; |
668 | } else | 677 | } else |
669 | #endif | 678 | #endif |
670 | if ((sysctl_snat_reroute(skb) || | 679 | if (!(skb_rtable(skb)->rt_flags & RTCF_LOCAL) && |
671 | skb_rtable(skb)->rt_flags & RTCF_LOCAL) && | ||
672 | ip_route_me_harder(skb, RTN_LOCAL) != 0) | 680 | ip_route_me_harder(skb, RTN_LOCAL) != 0) |
673 | return 1; | 681 | return 1; |
674 | 682 | ||
@@ -791,7 +799,8 @@ static int handle_response_icmp(int af, struct sk_buff *skb, | |||
791 | union nf_inet_addr *snet, | 799 | union nf_inet_addr *snet, |
792 | __u8 protocol, struct ip_vs_conn *cp, | 800 | __u8 protocol, struct ip_vs_conn *cp, |
793 | struct ip_vs_protocol *pp, | 801 | struct ip_vs_protocol *pp, |
794 | unsigned int offset, unsigned int ihl) | 802 | unsigned int offset, unsigned int ihl, |
803 | unsigned int hooknum) | ||
795 | { | 804 | { |
796 | unsigned int verdict = NF_DROP; | 805 | unsigned int verdict = NF_DROP; |
797 | 806 | ||
@@ -821,7 +830,7 @@ static int handle_response_icmp(int af, struct sk_buff *skb, | |||
821 | #endif | 830 | #endif |
822 | ip_vs_nat_icmp(skb, pp, cp, 1); | 831 | ip_vs_nat_icmp(skb, pp, cp, 1); |
823 | 832 | ||
824 | if (ip_vs_route_me_harder(af, skb)) | 833 | if (ip_vs_route_me_harder(af, skb, hooknum)) |
825 | goto out; | 834 | goto out; |
826 | 835 | ||
827 | /* do the statistics and put it back */ | 836 | /* do the statistics and put it back */ |
@@ -916,7 +925,7 @@ static int ip_vs_out_icmp(struct sk_buff *skb, int *related, | |||
916 | 925 | ||
917 | snet.ip = iph->saddr; | 926 | snet.ip = iph->saddr; |
918 | return handle_response_icmp(AF_INET, skb, &snet, cih->protocol, cp, | 927 | return handle_response_icmp(AF_INET, skb, &snet, cih->protocol, cp, |
919 | pp, ciph.len, ihl); | 928 | pp, ciph.len, ihl, hooknum); |
920 | } | 929 | } |
921 | 930 | ||
922 | #ifdef CONFIG_IP_VS_IPV6 | 931 | #ifdef CONFIG_IP_VS_IPV6 |
@@ -981,7 +990,8 @@ static int ip_vs_out_icmp_v6(struct sk_buff *skb, int *related, | |||
981 | snet.in6 = ciph.saddr.in6; | 990 | snet.in6 = ciph.saddr.in6; |
982 | writable = ciph.len; | 991 | writable = ciph.len; |
983 | return handle_response_icmp(AF_INET6, skb, &snet, ciph.protocol, cp, | 992 | return handle_response_icmp(AF_INET6, skb, &snet, ciph.protocol, cp, |
984 | pp, writable, sizeof(struct ipv6hdr)); | 993 | pp, writable, sizeof(struct ipv6hdr), |
994 | hooknum); | ||
985 | } | 995 | } |
986 | #endif | 996 | #endif |
987 | 997 | ||
@@ -1040,7 +1050,8 @@ static inline bool is_new_conn(const struct sk_buff *skb, | |||
1040 | */ | 1050 | */ |
1041 | static unsigned int | 1051 | static unsigned int |
1042 | handle_response(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd, | 1052 | handle_response(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd, |
1043 | struct ip_vs_conn *cp, struct ip_vs_iphdr *iph) | 1053 | struct ip_vs_conn *cp, struct ip_vs_iphdr *iph, |
1054 | unsigned int hooknum) | ||
1044 | { | 1055 | { |
1045 | struct ip_vs_protocol *pp = pd->pp; | 1056 | struct ip_vs_protocol *pp = pd->pp; |
1046 | 1057 | ||
@@ -1078,7 +1089,7 @@ handle_response(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd, | |||
1078 | * if it came from this machine itself. So re-compute | 1089 | * if it came from this machine itself. So re-compute |
1079 | * the routing information. | 1090 | * the routing information. |
1080 | */ | 1091 | */ |
1081 | if (ip_vs_route_me_harder(af, skb)) | 1092 | if (ip_vs_route_me_harder(af, skb, hooknum)) |
1082 | goto drop; | 1093 | goto drop; |
1083 | 1094 | ||
1084 | IP_VS_DBG_PKT(10, af, pp, skb, 0, "After SNAT"); | 1095 | IP_VS_DBG_PKT(10, af, pp, skb, 0, "After SNAT"); |
@@ -1181,7 +1192,7 @@ ip_vs_out(unsigned int hooknum, struct sk_buff *skb, int af) | |||
1181 | cp = pp->conn_out_get(af, skb, &iph, 0); | 1192 | cp = pp->conn_out_get(af, skb, &iph, 0); |
1182 | 1193 | ||
1183 | if (likely(cp)) | 1194 | if (likely(cp)) |
1184 | return handle_response(af, skb, pd, cp, &iph); | 1195 | return handle_response(af, skb, pd, cp, &iph, hooknum); |
1185 | if (sysctl_nat_icmp_send(net) && | 1196 | if (sysctl_nat_icmp_send(net) && |
1186 | (pp->protocol == IPPROTO_TCP || | 1197 | (pp->protocol == IPPROTO_TCP || |
1187 | pp->protocol == IPPROTO_UDP || | 1198 | pp->protocol == IPPROTO_UDP || |
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index 3b3ddb4fb9ee..1ff04bcd4871 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c | |||
@@ -1134,9 +1134,11 @@ static struct nft_stats __percpu *nft_stats_alloc(const struct nlattr *attr) | |||
1134 | /* Restore old counters on this cpu, no problem. Per-cpu statistics | 1134 | /* Restore old counters on this cpu, no problem. Per-cpu statistics |
1135 | * are not exposed to userspace. | 1135 | * are not exposed to userspace. |
1136 | */ | 1136 | */ |
1137 | preempt_disable(); | ||
1137 | stats = this_cpu_ptr(newstats); | 1138 | stats = this_cpu_ptr(newstats); |
1138 | stats->bytes = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_BYTES])); | 1139 | stats->bytes = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_BYTES])); |
1139 | stats->pkts = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_PACKETS])); | 1140 | stats->pkts = be64_to_cpu(nla_get_be64(tb[NFTA_COUNTER_PACKETS])); |
1141 | preempt_enable(); | ||
1140 | 1142 | ||
1141 | return newstats; | 1143 | return newstats; |
1142 | } | 1144 | } |
@@ -1262,8 +1264,10 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb, | |||
1262 | nft_ctx_init(&ctx, skb, nlh, afi, table, chain, nla); | 1264 | nft_ctx_init(&ctx, skb, nlh, afi, table, chain, nla); |
1263 | trans = nft_trans_alloc(&ctx, NFT_MSG_NEWCHAIN, | 1265 | trans = nft_trans_alloc(&ctx, NFT_MSG_NEWCHAIN, |
1264 | sizeof(struct nft_trans_chain)); | 1266 | sizeof(struct nft_trans_chain)); |
1265 | if (trans == NULL) | 1267 | if (trans == NULL) { |
1268 | free_percpu(stats); | ||
1266 | return -ENOMEM; | 1269 | return -ENOMEM; |
1270 | } | ||
1267 | 1271 | ||
1268 | nft_trans_chain_stats(trans) = stats; | 1272 | nft_trans_chain_stats(trans) = stats; |
1269 | nft_trans_chain_update(trans) = true; | 1273 | nft_trans_chain_update(trans) = true; |
@@ -1319,8 +1323,10 @@ static int nf_tables_newchain(struct sock *nlsk, struct sk_buff *skb, | |||
1319 | hookfn = type->hooks[hooknum]; | 1323 | hookfn = type->hooks[hooknum]; |
1320 | 1324 | ||
1321 | basechain = kzalloc(sizeof(*basechain), GFP_KERNEL); | 1325 | basechain = kzalloc(sizeof(*basechain), GFP_KERNEL); |
1322 | if (basechain == NULL) | 1326 | if (basechain == NULL) { |
1327 | module_put(type->owner); | ||
1323 | return -ENOMEM; | 1328 | return -ENOMEM; |
1329 | } | ||
1324 | 1330 | ||
1325 | if (nla[NFTA_CHAIN_COUNTERS]) { | 1331 | if (nla[NFTA_CHAIN_COUNTERS]) { |
1326 | stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]); | 1332 | stats = nft_stats_alloc(nla[NFTA_CHAIN_COUNTERS]); |
@@ -3753,6 +3759,24 @@ int nft_chain_validate_dependency(const struct nft_chain *chain, | |||
3753 | } | 3759 | } |
3754 | EXPORT_SYMBOL_GPL(nft_chain_validate_dependency); | 3760 | EXPORT_SYMBOL_GPL(nft_chain_validate_dependency); |
3755 | 3761 | ||
3762 | int nft_chain_validate_hooks(const struct nft_chain *chain, | ||
3763 | unsigned int hook_flags) | ||
3764 | { | ||
3765 | struct nft_base_chain *basechain; | ||
3766 | |||
3767 | if (chain->flags & NFT_BASE_CHAIN) { | ||
3768 | basechain = nft_base_chain(chain); | ||
3769 | |||
3770 | if ((1 << basechain->ops[0].hooknum) & hook_flags) | ||
3771 | return 0; | ||
3772 | |||
3773 | return -EOPNOTSUPP; | ||
3774 | } | ||
3775 | |||
3776 | return 0; | ||
3777 | } | ||
3778 | EXPORT_SYMBOL_GPL(nft_chain_validate_hooks); | ||
3779 | |||
3756 | /* | 3780 | /* |
3757 | * Loop detection - walk through the ruleset beginning at the destination chain | 3781 | * Loop detection - walk through the ruleset beginning at the destination chain |
3758 | * of a new jump until either the source chain is reached (loop) or all | 3782 | * of a new jump until either the source chain is reached (loop) or all |
diff --git a/net/netfilter/nft_masq.c b/net/netfilter/nft_masq.c index d1ffd5eb3a9b..9aea747b43ea 100644 --- a/net/netfilter/nft_masq.c +++ b/net/netfilter/nft_masq.c | |||
@@ -21,6 +21,21 @@ const struct nla_policy nft_masq_policy[NFTA_MASQ_MAX + 1] = { | |||
21 | }; | 21 | }; |
22 | EXPORT_SYMBOL_GPL(nft_masq_policy); | 22 | EXPORT_SYMBOL_GPL(nft_masq_policy); |
23 | 23 | ||
24 | int nft_masq_validate(const struct nft_ctx *ctx, | ||
25 | const struct nft_expr *expr, | ||
26 | const struct nft_data **data) | ||
27 | { | ||
28 | int err; | ||
29 | |||
30 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | ||
31 | if (err < 0) | ||
32 | return err; | ||
33 | |||
34 | return nft_chain_validate_hooks(ctx->chain, | ||
35 | (1 << NF_INET_POST_ROUTING)); | ||
36 | } | ||
37 | EXPORT_SYMBOL_GPL(nft_masq_validate); | ||
38 | |||
24 | int nft_masq_init(const struct nft_ctx *ctx, | 39 | int nft_masq_init(const struct nft_ctx *ctx, |
25 | const struct nft_expr *expr, | 40 | const struct nft_expr *expr, |
26 | const struct nlattr * const tb[]) | 41 | const struct nlattr * const tb[]) |
@@ -28,8 +43,8 @@ int nft_masq_init(const struct nft_ctx *ctx, | |||
28 | struct nft_masq *priv = nft_expr_priv(expr); | 43 | struct nft_masq *priv = nft_expr_priv(expr); |
29 | int err; | 44 | int err; |
30 | 45 | ||
31 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | 46 | err = nft_masq_validate(ctx, expr, NULL); |
32 | if (err < 0) | 47 | if (err) |
33 | return err; | 48 | return err; |
34 | 49 | ||
35 | if (tb[NFTA_MASQ_FLAGS] == NULL) | 50 | if (tb[NFTA_MASQ_FLAGS] == NULL) |
@@ -60,12 +75,5 @@ nla_put_failure: | |||
60 | } | 75 | } |
61 | EXPORT_SYMBOL_GPL(nft_masq_dump); | 76 | EXPORT_SYMBOL_GPL(nft_masq_dump); |
62 | 77 | ||
63 | int nft_masq_validate(const struct nft_ctx *ctx, const struct nft_expr *expr, | ||
64 | const struct nft_data **data) | ||
65 | { | ||
66 | return nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | ||
67 | } | ||
68 | EXPORT_SYMBOL_GPL(nft_masq_validate); | ||
69 | |||
70 | MODULE_LICENSE("GPL"); | 78 | MODULE_LICENSE("GPL"); |
71 | MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>"); | 79 | MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>"); |
diff --git a/net/netfilter/nft_nat.c b/net/netfilter/nft_nat.c index aff54fb1c8a0..a0837c6c9283 100644 --- a/net/netfilter/nft_nat.c +++ b/net/netfilter/nft_nat.c | |||
@@ -88,17 +88,40 @@ static const struct nla_policy nft_nat_policy[NFTA_NAT_MAX + 1] = { | |||
88 | [NFTA_NAT_FLAGS] = { .type = NLA_U32 }, | 88 | [NFTA_NAT_FLAGS] = { .type = NLA_U32 }, |
89 | }; | 89 | }; |
90 | 90 | ||
91 | static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr, | 91 | static int nft_nat_validate(const struct nft_ctx *ctx, |
92 | const struct nlattr * const tb[]) | 92 | const struct nft_expr *expr, |
93 | const struct nft_data **data) | ||
93 | { | 94 | { |
94 | struct nft_nat *priv = nft_expr_priv(expr); | 95 | struct nft_nat *priv = nft_expr_priv(expr); |
95 | u32 family; | ||
96 | int err; | 96 | int err; |
97 | 97 | ||
98 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | 98 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); |
99 | if (err < 0) | 99 | if (err < 0) |
100 | return err; | 100 | return err; |
101 | 101 | ||
102 | switch (priv->type) { | ||
103 | case NFT_NAT_SNAT: | ||
104 | err = nft_chain_validate_hooks(ctx->chain, | ||
105 | (1 << NF_INET_POST_ROUTING) | | ||
106 | (1 << NF_INET_LOCAL_IN)); | ||
107 | break; | ||
108 | case NFT_NAT_DNAT: | ||
109 | err = nft_chain_validate_hooks(ctx->chain, | ||
110 | (1 << NF_INET_PRE_ROUTING) | | ||
111 | (1 << NF_INET_LOCAL_OUT)); | ||
112 | break; | ||
113 | } | ||
114 | |||
115 | return err; | ||
116 | } | ||
117 | |||
118 | static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr, | ||
119 | const struct nlattr * const tb[]) | ||
120 | { | ||
121 | struct nft_nat *priv = nft_expr_priv(expr); | ||
122 | u32 family; | ||
123 | int err; | ||
124 | |||
102 | if (tb[NFTA_NAT_TYPE] == NULL || | 125 | if (tb[NFTA_NAT_TYPE] == NULL || |
103 | (tb[NFTA_NAT_REG_ADDR_MIN] == NULL && | 126 | (tb[NFTA_NAT_REG_ADDR_MIN] == NULL && |
104 | tb[NFTA_NAT_REG_PROTO_MIN] == NULL)) | 127 | tb[NFTA_NAT_REG_PROTO_MIN] == NULL)) |
@@ -115,6 +138,10 @@ static int nft_nat_init(const struct nft_ctx *ctx, const struct nft_expr *expr, | |||
115 | return -EINVAL; | 138 | return -EINVAL; |
116 | } | 139 | } |
117 | 140 | ||
141 | err = nft_nat_validate(ctx, expr, NULL); | ||
142 | if (err < 0) | ||
143 | return err; | ||
144 | |||
118 | if (tb[NFTA_NAT_FAMILY] == NULL) | 145 | if (tb[NFTA_NAT_FAMILY] == NULL) |
119 | return -EINVAL; | 146 | return -EINVAL; |
120 | 147 | ||
@@ -219,13 +246,6 @@ nla_put_failure: | |||
219 | return -1; | 246 | return -1; |
220 | } | 247 | } |
221 | 248 | ||
222 | static int nft_nat_validate(const struct nft_ctx *ctx, | ||
223 | const struct nft_expr *expr, | ||
224 | const struct nft_data **data) | ||
225 | { | ||
226 | return nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | ||
227 | } | ||
228 | |||
229 | static struct nft_expr_type nft_nat_type; | 249 | static struct nft_expr_type nft_nat_type; |
230 | static const struct nft_expr_ops nft_nat_ops = { | 250 | static const struct nft_expr_ops nft_nat_ops = { |
231 | .type = &nft_nat_type, | 251 | .type = &nft_nat_type, |
diff --git a/net/netfilter/nft_redir.c b/net/netfilter/nft_redir.c index 9e8093f28311..d7e9e93a4e90 100644 --- a/net/netfilter/nft_redir.c +++ b/net/netfilter/nft_redir.c | |||
@@ -23,6 +23,22 @@ const struct nla_policy nft_redir_policy[NFTA_REDIR_MAX + 1] = { | |||
23 | }; | 23 | }; |
24 | EXPORT_SYMBOL_GPL(nft_redir_policy); | 24 | EXPORT_SYMBOL_GPL(nft_redir_policy); |
25 | 25 | ||
26 | int nft_redir_validate(const struct nft_ctx *ctx, | ||
27 | const struct nft_expr *expr, | ||
28 | const struct nft_data **data) | ||
29 | { | ||
30 | int err; | ||
31 | |||
32 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | ||
33 | if (err < 0) | ||
34 | return err; | ||
35 | |||
36 | return nft_chain_validate_hooks(ctx->chain, | ||
37 | (1 << NF_INET_PRE_ROUTING) | | ||
38 | (1 << NF_INET_LOCAL_OUT)); | ||
39 | } | ||
40 | EXPORT_SYMBOL_GPL(nft_redir_validate); | ||
41 | |||
26 | int nft_redir_init(const struct nft_ctx *ctx, | 42 | int nft_redir_init(const struct nft_ctx *ctx, |
27 | const struct nft_expr *expr, | 43 | const struct nft_expr *expr, |
28 | const struct nlattr * const tb[]) | 44 | const struct nlattr * const tb[]) |
@@ -30,7 +46,7 @@ int nft_redir_init(const struct nft_ctx *ctx, | |||
30 | struct nft_redir *priv = nft_expr_priv(expr); | 46 | struct nft_redir *priv = nft_expr_priv(expr); |
31 | int err; | 47 | int err; |
32 | 48 | ||
33 | err = nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | 49 | err = nft_redir_validate(ctx, expr, NULL); |
34 | if (err < 0) | 50 | if (err < 0) |
35 | return err; | 51 | return err; |
36 | 52 | ||
@@ -88,12 +104,5 @@ nla_put_failure: | |||
88 | } | 104 | } |
89 | EXPORT_SYMBOL_GPL(nft_redir_dump); | 105 | EXPORT_SYMBOL_GPL(nft_redir_dump); |
90 | 106 | ||
91 | int nft_redir_validate(const struct nft_ctx *ctx, const struct nft_expr *expr, | ||
92 | const struct nft_data **data) | ||
93 | { | ||
94 | return nft_chain_validate_dependency(ctx->chain, NFT_CHAIN_T_NAT); | ||
95 | } | ||
96 | EXPORT_SYMBOL_GPL(nft_redir_validate); | ||
97 | |||
98 | MODULE_LICENSE("GPL"); | 107 | MODULE_LICENSE("GPL"); |
99 | MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>"); | 108 | MODULE_AUTHOR("Arturo Borrero Gonzalez <arturo.borrero.glez@gmail.com>"); |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 02fdde28dada..75532efa51cd 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -1438,7 +1438,7 @@ static void netlink_undo_bind(int group, long unsigned int groups, | |||
1438 | 1438 | ||
1439 | for (undo = 0; undo < group; undo++) | 1439 | for (undo = 0; undo < group; undo++) |
1440 | if (test_bit(undo, &groups)) | 1440 | if (test_bit(undo, &groups)) |
1441 | nlk->netlink_unbind(sock_net(sk), undo); | 1441 | nlk->netlink_unbind(sock_net(sk), undo + 1); |
1442 | } | 1442 | } |
1443 | 1443 | ||
1444 | static int netlink_bind(struct socket *sock, struct sockaddr *addr, | 1444 | static int netlink_bind(struct socket *sock, struct sockaddr *addr, |
@@ -1476,7 +1476,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, | |||
1476 | for (group = 0; group < nlk->ngroups; group++) { | 1476 | for (group = 0; group < nlk->ngroups; group++) { |
1477 | if (!test_bit(group, &groups)) | 1477 | if (!test_bit(group, &groups)) |
1478 | continue; | 1478 | continue; |
1479 | err = nlk->netlink_bind(net, group); | 1479 | err = nlk->netlink_bind(net, group + 1); |
1480 | if (!err) | 1480 | if (!err) |
1481 | continue; | 1481 | continue; |
1482 | netlink_undo_bind(group, groups, sk); | 1482 | netlink_undo_bind(group, groups, sk); |
diff --git a/net/rds/sysctl.c b/net/rds/sysctl.c index c3b0cd43eb56..c173f69e1479 100644 --- a/net/rds/sysctl.c +++ b/net/rds/sysctl.c | |||
@@ -71,14 +71,14 @@ static struct ctl_table rds_sysctl_rds_table[] = { | |||
71 | { | 71 | { |
72 | .procname = "max_unacked_packets", | 72 | .procname = "max_unacked_packets", |
73 | .data = &rds_sysctl_max_unacked_packets, | 73 | .data = &rds_sysctl_max_unacked_packets, |
74 | .maxlen = sizeof(unsigned long), | 74 | .maxlen = sizeof(int), |
75 | .mode = 0644, | 75 | .mode = 0644, |
76 | .proc_handler = proc_dointvec, | 76 | .proc_handler = proc_dointvec, |
77 | }, | 77 | }, |
78 | { | 78 | { |
79 | .procname = "max_unacked_bytes", | 79 | .procname = "max_unacked_bytes", |
80 | .data = &rds_sysctl_max_unacked_bytes, | 80 | .data = &rds_sysctl_max_unacked_bytes, |
81 | .maxlen = sizeof(unsigned long), | 81 | .maxlen = sizeof(int), |
82 | .mode = 0644, | 82 | .mode = 0644, |
83 | .proc_handler = proc_dointvec, | 83 | .proc_handler = proc_dointvec, |
84 | }, | 84 | }, |
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index aad6a679fb13..baef987fe2c0 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
@@ -556,8 +556,9 @@ void tcf_exts_change(struct tcf_proto *tp, struct tcf_exts *dst, | |||
556 | } | 556 | } |
557 | EXPORT_SYMBOL(tcf_exts_change); | 557 | EXPORT_SYMBOL(tcf_exts_change); |
558 | 558 | ||
559 | #define tcf_exts_first_act(ext) \ | 559 | #define tcf_exts_first_act(ext) \ |
560 | list_first_entry(&(exts)->actions, struct tc_action, list) | 560 | list_first_entry_or_null(&(exts)->actions, \ |
561 | struct tc_action, list) | ||
561 | 562 | ||
562 | int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts) | 563 | int tcf_exts_dump(struct sk_buff *skb, struct tcf_exts *exts) |
563 | { | 564 | { |
@@ -603,7 +604,7 @@ int tcf_exts_dump_stats(struct sk_buff *skb, struct tcf_exts *exts) | |||
603 | { | 604 | { |
604 | #ifdef CONFIG_NET_CLS_ACT | 605 | #ifdef CONFIG_NET_CLS_ACT |
605 | struct tc_action *a = tcf_exts_first_act(exts); | 606 | struct tc_action *a = tcf_exts_first_act(exts); |
606 | if (tcf_action_copy_stats(skb, a, 1) < 0) | 607 | if (a != NULL && tcf_action_copy_stats(skb, a, 1) < 0) |
607 | return -1; | 608 | return -1; |
608 | #endif | 609 | #endif |
609 | return 0; | 610 | return 0; |
diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c index 9b05924cc386..333cd94ba381 100644 --- a/net/sched/sch_fq.c +++ b/net/sched/sch_fq.c | |||
@@ -670,8 +670,14 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt) | |||
670 | if (tb[TCA_FQ_FLOW_PLIMIT]) | 670 | if (tb[TCA_FQ_FLOW_PLIMIT]) |
671 | q->flow_plimit = nla_get_u32(tb[TCA_FQ_FLOW_PLIMIT]); | 671 | q->flow_plimit = nla_get_u32(tb[TCA_FQ_FLOW_PLIMIT]); |
672 | 672 | ||
673 | if (tb[TCA_FQ_QUANTUM]) | 673 | if (tb[TCA_FQ_QUANTUM]) { |
674 | q->quantum = nla_get_u32(tb[TCA_FQ_QUANTUM]); | 674 | u32 quantum = nla_get_u32(tb[TCA_FQ_QUANTUM]); |
675 | |||
676 | if (quantum > 0) | ||
677 | q->quantum = quantum; | ||
678 | else | ||
679 | err = -EINVAL; | ||
680 | } | ||
675 | 681 | ||
676 | if (tb[TCA_FQ_INITIAL_QUANTUM]) | 682 | if (tb[TCA_FQ_INITIAL_QUANTUM]) |
677 | q->initial_quantum = nla_get_u32(tb[TCA_FQ_INITIAL_QUANTUM]); | 683 | q->initial_quantum = nla_get_u32(tb[TCA_FQ_INITIAL_QUANTUM]); |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index e49e231cef52..06320c8c1c86 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
@@ -2608,7 +2608,7 @@ do_addr_param: | |||
2608 | 2608 | ||
2609 | addr_param = param.v + sizeof(sctp_addip_param_t); | 2609 | addr_param = param.v + sizeof(sctp_addip_param_t); |
2610 | 2610 | ||
2611 | af = sctp_get_af_specific(param_type2af(param.p->type)); | 2611 | af = sctp_get_af_specific(param_type2af(addr_param->p.type)); |
2612 | if (af == NULL) | 2612 | if (af == NULL) |
2613 | break; | 2613 | break; |
2614 | 2614 | ||
diff --git a/sound/i2c/other/ak4113.c b/sound/i2c/other/ak4113.c index 1a3a6fa27158..c6bba99a90b2 100644 --- a/sound/i2c/other/ak4113.c +++ b/sound/i2c/other/ak4113.c | |||
@@ -56,8 +56,7 @@ static inline unsigned char reg_read(struct ak4113 *ak4113, unsigned char reg) | |||
56 | 56 | ||
57 | static void snd_ak4113_free(struct ak4113 *chip) | 57 | static void snd_ak4113_free(struct ak4113 *chip) |
58 | { | 58 | { |
59 | chip->init = 1; /* don't schedule new work */ | 59 | atomic_inc(&chip->wq_processing); /* don't schedule new work */ |
60 | mb(); | ||
61 | cancel_delayed_work_sync(&chip->work); | 60 | cancel_delayed_work_sync(&chip->work); |
62 | kfree(chip); | 61 | kfree(chip); |
63 | } | 62 | } |
@@ -89,6 +88,7 @@ int snd_ak4113_create(struct snd_card *card, ak4113_read_t *read, | |||
89 | chip->write = write; | 88 | chip->write = write; |
90 | chip->private_data = private_data; | 89 | chip->private_data = private_data; |
91 | INIT_DELAYED_WORK(&chip->work, ak4113_stats); | 90 | INIT_DELAYED_WORK(&chip->work, ak4113_stats); |
91 | atomic_set(&chip->wq_processing, 0); | ||
92 | 92 | ||
93 | for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++) | 93 | for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++) |
94 | chip->regmap[reg] = pgm[reg]; | 94 | chip->regmap[reg] = pgm[reg]; |
@@ -139,13 +139,11 @@ static void ak4113_init_regs(struct ak4113 *chip) | |||
139 | 139 | ||
140 | void snd_ak4113_reinit(struct ak4113 *chip) | 140 | void snd_ak4113_reinit(struct ak4113 *chip) |
141 | { | 141 | { |
142 | chip->init = 1; | 142 | if (atomic_inc_return(&chip->wq_processing) == 1) |
143 | mb(); | 143 | cancel_delayed_work_sync(&chip->work); |
144 | flush_delayed_work(&chip->work); | ||
145 | ak4113_init_regs(chip); | 144 | ak4113_init_regs(chip); |
146 | /* bring up statistics / event queing */ | 145 | /* bring up statistics / event queing */ |
147 | chip->init = 0; | 146 | if (atomic_dec_and_test(&chip->wq_processing)) |
148 | if (chip->kctls[0]) | ||
149 | schedule_delayed_work(&chip->work, HZ / 10); | 147 | schedule_delayed_work(&chip->work, HZ / 10); |
150 | } | 148 | } |
151 | EXPORT_SYMBOL_GPL(snd_ak4113_reinit); | 149 | EXPORT_SYMBOL_GPL(snd_ak4113_reinit); |
@@ -632,8 +630,9 @@ static void ak4113_stats(struct work_struct *work) | |||
632 | { | 630 | { |
633 | struct ak4113 *chip = container_of(work, struct ak4113, work.work); | 631 | struct ak4113 *chip = container_of(work, struct ak4113, work.work); |
634 | 632 | ||
635 | if (!chip->init) | 633 | if (atomic_inc_return(&chip->wq_processing) == 1) |
636 | snd_ak4113_check_rate_and_errors(chip, chip->check_flags); | 634 | snd_ak4113_check_rate_and_errors(chip, chip->check_flags); |
637 | 635 | ||
638 | schedule_delayed_work(&chip->work, HZ / 10); | 636 | if (atomic_dec_and_test(&chip->wq_processing)) |
637 | schedule_delayed_work(&chip->work, HZ / 10); | ||
639 | } | 638 | } |
diff --git a/sound/i2c/other/ak4114.c b/sound/i2c/other/ak4114.c index c7f56339415d..b70e6eccbd03 100644 --- a/sound/i2c/other/ak4114.c +++ b/sound/i2c/other/ak4114.c | |||
@@ -66,8 +66,7 @@ static void reg_dump(struct ak4114 *ak4114) | |||
66 | 66 | ||
67 | static void snd_ak4114_free(struct ak4114 *chip) | 67 | static void snd_ak4114_free(struct ak4114 *chip) |
68 | { | 68 | { |
69 | chip->init = 1; /* don't schedule new work */ | 69 | atomic_inc(&chip->wq_processing); /* don't schedule new work */ |
70 | mb(); | ||
71 | cancel_delayed_work_sync(&chip->work); | 70 | cancel_delayed_work_sync(&chip->work); |
72 | kfree(chip); | 71 | kfree(chip); |
73 | } | 72 | } |
@@ -100,6 +99,7 @@ int snd_ak4114_create(struct snd_card *card, | |||
100 | chip->write = write; | 99 | chip->write = write; |
101 | chip->private_data = private_data; | 100 | chip->private_data = private_data; |
102 | INIT_DELAYED_WORK(&chip->work, ak4114_stats); | 101 | INIT_DELAYED_WORK(&chip->work, ak4114_stats); |
102 | atomic_set(&chip->wq_processing, 0); | ||
103 | 103 | ||
104 | for (reg = 0; reg < 6; reg++) | 104 | for (reg = 0; reg < 6; reg++) |
105 | chip->regmap[reg] = pgm[reg]; | 105 | chip->regmap[reg] = pgm[reg]; |
@@ -152,13 +152,11 @@ static void ak4114_init_regs(struct ak4114 *chip) | |||
152 | 152 | ||
153 | void snd_ak4114_reinit(struct ak4114 *chip) | 153 | void snd_ak4114_reinit(struct ak4114 *chip) |
154 | { | 154 | { |
155 | chip->init = 1; | 155 | if (atomic_inc_return(&chip->wq_processing) == 1) |
156 | mb(); | 156 | cancel_delayed_work_sync(&chip->work); |
157 | flush_delayed_work(&chip->work); | ||
158 | ak4114_init_regs(chip); | 157 | ak4114_init_regs(chip); |
159 | /* bring up statistics / event queing */ | 158 | /* bring up statistics / event queing */ |
160 | chip->init = 0; | 159 | if (atomic_dec_and_test(&chip->wq_processing)) |
161 | if (chip->kctls[0]) | ||
162 | schedule_delayed_work(&chip->work, HZ / 10); | 160 | schedule_delayed_work(&chip->work, HZ / 10); |
163 | } | 161 | } |
164 | 162 | ||
@@ -612,10 +610,10 @@ static void ak4114_stats(struct work_struct *work) | |||
612 | { | 610 | { |
613 | struct ak4114 *chip = container_of(work, struct ak4114, work.work); | 611 | struct ak4114 *chip = container_of(work, struct ak4114, work.work); |
614 | 612 | ||
615 | if (!chip->init) | 613 | if (atomic_inc_return(&chip->wq_processing) == 1) |
616 | snd_ak4114_check_rate_and_errors(chip, chip->check_flags); | 614 | snd_ak4114_check_rate_and_errors(chip, chip->check_flags); |
617 | 615 | if (atomic_dec_and_test(&chip->wq_processing)) | |
618 | schedule_delayed_work(&chip->work, HZ / 10); | 616 | schedule_delayed_work(&chip->work, HZ / 10); |
619 | } | 617 | } |
620 | 618 | ||
621 | EXPORT_SYMBOL(snd_ak4114_create); | 619 | EXPORT_SYMBOL(snd_ak4114_create); |
diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index 99ff35e2a25d..35e44e463cfe 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c | |||
@@ -348,7 +348,6 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
348 | struct atmel_pcm_dma_params *dma_params; | 348 | struct atmel_pcm_dma_params *dma_params; |
349 | int dir, channels, bits; | 349 | int dir, channels, bits; |
350 | u32 tfmr, rfmr, tcmr, rcmr; | 350 | u32 tfmr, rfmr, tcmr, rcmr; |
351 | int start_event; | ||
352 | int ret; | 351 | int ret; |
353 | int fslen, fslen_ext; | 352 | int fslen, fslen_ext; |
354 | 353 | ||
@@ -457,19 +456,10 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
457 | * The SSC transmit clock is obtained from the BCLK signal on | 456 | * The SSC transmit clock is obtained from the BCLK signal on |
458 | * on the TK line, and the SSC receive clock is | 457 | * on the TK line, and the SSC receive clock is |
459 | * generated from the transmit clock. | 458 | * generated from the transmit clock. |
460 | * | ||
461 | * For single channel data, one sample is transferred | ||
462 | * on the falling edge of the LRC clock. | ||
463 | * For two channel data, one sample is | ||
464 | * transferred on both edges of the LRC clock. | ||
465 | */ | 459 | */ |
466 | start_event = ((channels == 1) | ||
467 | ? SSC_START_FALLING_RF | ||
468 | : SSC_START_EDGE_RF); | ||
469 | |||
470 | rcmr = SSC_BF(RCMR_PERIOD, 0) | 460 | rcmr = SSC_BF(RCMR_PERIOD, 0) |
471 | | SSC_BF(RCMR_STTDLY, START_DELAY) | 461 | | SSC_BF(RCMR_STTDLY, START_DELAY) |
472 | | SSC_BF(RCMR_START, start_event) | 462 | | SSC_BF(RCMR_START, SSC_START_FALLING_RF) |
473 | | SSC_BF(RCMR_CKI, SSC_CKI_RISING) | 463 | | SSC_BF(RCMR_CKI, SSC_CKI_RISING) |
474 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) | 464 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) |
475 | | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? | 465 | | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? |
@@ -478,14 +468,14 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
478 | rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE) | 468 | rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE) |
479 | | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE) | 469 | | SSC_BF(RFMR_FSOS, SSC_FSOS_NONE) |
480 | | SSC_BF(RFMR_FSLEN, 0) | 470 | | SSC_BF(RFMR_FSLEN, 0) |
481 | | SSC_BF(RFMR_DATNB, 0) | 471 | | SSC_BF(RFMR_DATNB, (channels - 1)) |
482 | | SSC_BIT(RFMR_MSBF) | 472 | | SSC_BIT(RFMR_MSBF) |
483 | | SSC_BF(RFMR_LOOP, 0) | 473 | | SSC_BF(RFMR_LOOP, 0) |
484 | | SSC_BF(RFMR_DATLEN, (bits - 1)); | 474 | | SSC_BF(RFMR_DATLEN, (bits - 1)); |
485 | 475 | ||
486 | tcmr = SSC_BF(TCMR_PERIOD, 0) | 476 | tcmr = SSC_BF(TCMR_PERIOD, 0) |
487 | | SSC_BF(TCMR_STTDLY, START_DELAY) | 477 | | SSC_BF(TCMR_STTDLY, START_DELAY) |
488 | | SSC_BF(TCMR_START, start_event) | 478 | | SSC_BF(TCMR_START, SSC_START_FALLING_RF) |
489 | | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) | 479 | | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) |
490 | | SSC_BF(TCMR_CKO, SSC_CKO_NONE) | 480 | | SSC_BF(TCMR_CKO, SSC_CKO_NONE) |
491 | | SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ? | 481 | | SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ? |
@@ -495,7 +485,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
495 | | SSC_BF(TFMR_FSDEN, 0) | 485 | | SSC_BF(TFMR_FSDEN, 0) |
496 | | SSC_BF(TFMR_FSOS, SSC_FSOS_NONE) | 486 | | SSC_BF(TFMR_FSOS, SSC_FSOS_NONE) |
497 | | SSC_BF(TFMR_FSLEN, 0) | 487 | | SSC_BF(TFMR_FSLEN, 0) |
498 | | SSC_BF(TFMR_DATNB, 0) | 488 | | SSC_BF(TFMR_DATNB, (channels - 1)) |
499 | | SSC_BIT(TFMR_MSBF) | 489 | | SSC_BIT(TFMR_MSBF) |
500 | | SSC_BF(TFMR_DATDEF, 0) | 490 | | SSC_BF(TFMR_DATDEF, 0) |
501 | | SSC_BF(TFMR_DATLEN, (bits - 1)); | 491 | | SSC_BF(TFMR_DATLEN, (bits - 1)); |
@@ -512,7 +502,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
512 | rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period) | 502 | rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period) |
513 | | SSC_BF(RCMR_STTDLY, 1) | 503 | | SSC_BF(RCMR_STTDLY, 1) |
514 | | SSC_BF(RCMR_START, SSC_START_RISING_RF) | 504 | | SSC_BF(RCMR_START, SSC_START_RISING_RF) |
515 | | SSC_BF(RCMR_CKI, SSC_CKI_RISING) | 505 | | SSC_BF(RCMR_CKI, SSC_CKI_FALLING) |
516 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) | 506 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) |
517 | | SSC_BF(RCMR_CKS, SSC_CKS_DIV); | 507 | | SSC_BF(RCMR_CKS, SSC_CKS_DIV); |
518 | 508 | ||
@@ -527,7 +517,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
527 | tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period) | 517 | tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period) |
528 | | SSC_BF(TCMR_STTDLY, 1) | 518 | | SSC_BF(TCMR_STTDLY, 1) |
529 | | SSC_BF(TCMR_START, SSC_START_RISING_RF) | 519 | | SSC_BF(TCMR_START, SSC_START_RISING_RF) |
530 | | SSC_BF(TCMR_CKI, SSC_CKI_RISING) | 520 | | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) |
531 | | SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS) | 521 | | SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS) |
532 | | SSC_BF(TCMR_CKS, SSC_CKS_DIV); | 522 | | SSC_BF(TCMR_CKS, SSC_CKS_DIV); |
533 | 523 | ||
@@ -556,7 +546,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream, | |||
556 | rcmr = SSC_BF(RCMR_PERIOD, 0) | 546 | rcmr = SSC_BF(RCMR_PERIOD, 0) |
557 | | SSC_BF(RCMR_STTDLY, START_DELAY) | 547 | | SSC_BF(RCMR_STTDLY, START_DELAY) |
558 | | SSC_BF(RCMR_START, SSC_START_RISING_RF) | 548 | | SSC_BF(RCMR_START, SSC_START_RISING_RF) |
559 | | SSC_BF(RCMR_CKI, SSC_CKI_RISING) | 549 | | SSC_BF(RCMR_CKI, SSC_CKI_FALLING) |
560 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) | 550 | | SSC_BF(RCMR_CKO, SSC_CKO_NONE) |
561 | | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? | 551 | | SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? |
562 | SSC_CKS_PIN : SSC_CKS_CLOCK); | 552 | SSC_CKS_PIN : SSC_CKS_CLOCK); |
diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c index c3f2decd643c..1ff726c29249 100644 --- a/sound/soc/codecs/rt5640.c +++ b/sound/soc/codecs/rt5640.c | |||
@@ -2124,6 +2124,7 @@ MODULE_DEVICE_TABLE(of, rt5640_of_match); | |||
2124 | static struct acpi_device_id rt5640_acpi_match[] = { | 2124 | static struct acpi_device_id rt5640_acpi_match[] = { |
2125 | { "INT33CA", 0 }, | 2125 | { "INT33CA", 0 }, |
2126 | { "10EC5640", 0 }, | 2126 | { "10EC5640", 0 }, |
2127 | { "10EC5642", 0 }, | ||
2127 | { }, | 2128 | { }, |
2128 | }; | 2129 | }; |
2129 | MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match); | 2130 | MODULE_DEVICE_TABLE(acpi, rt5640_acpi_match); |
diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c index 29cf7ce610f4..aa98be32bb60 100644 --- a/sound/soc/codecs/sgtl5000.c +++ b/sound/soc/codecs/sgtl5000.c | |||
@@ -483,21 +483,21 @@ static int sgtl5000_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | |||
483 | /* setting i2s data format */ | 483 | /* setting i2s data format */ |
484 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { | 484 | switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { |
485 | case SND_SOC_DAIFMT_DSP_A: | 485 | case SND_SOC_DAIFMT_DSP_A: |
486 | i2sctl |= SGTL5000_I2S_MODE_PCM; | 486 | i2sctl |= SGTL5000_I2S_MODE_PCM << SGTL5000_I2S_MODE_SHIFT; |
487 | break; | 487 | break; |
488 | case SND_SOC_DAIFMT_DSP_B: | 488 | case SND_SOC_DAIFMT_DSP_B: |
489 | i2sctl |= SGTL5000_I2S_MODE_PCM; | 489 | i2sctl |= SGTL5000_I2S_MODE_PCM << SGTL5000_I2S_MODE_SHIFT; |
490 | i2sctl |= SGTL5000_I2S_LRALIGN; | 490 | i2sctl |= SGTL5000_I2S_LRALIGN; |
491 | break; | 491 | break; |
492 | case SND_SOC_DAIFMT_I2S: | 492 | case SND_SOC_DAIFMT_I2S: |
493 | i2sctl |= SGTL5000_I2S_MODE_I2S_LJ; | 493 | i2sctl |= SGTL5000_I2S_MODE_I2S_LJ << SGTL5000_I2S_MODE_SHIFT; |
494 | break; | 494 | break; |
495 | case SND_SOC_DAIFMT_RIGHT_J: | 495 | case SND_SOC_DAIFMT_RIGHT_J: |
496 | i2sctl |= SGTL5000_I2S_MODE_RJ; | 496 | i2sctl |= SGTL5000_I2S_MODE_RJ << SGTL5000_I2S_MODE_SHIFT; |
497 | i2sctl |= SGTL5000_I2S_LRPOL; | 497 | i2sctl |= SGTL5000_I2S_LRPOL; |
498 | break; | 498 | break; |
499 | case SND_SOC_DAIFMT_LEFT_J: | 499 | case SND_SOC_DAIFMT_LEFT_J: |
500 | i2sctl |= SGTL5000_I2S_MODE_I2S_LJ; | 500 | i2sctl |= SGTL5000_I2S_MODE_I2S_LJ << SGTL5000_I2S_MODE_SHIFT; |
501 | i2sctl |= SGTL5000_I2S_LRALIGN; | 501 | i2sctl |= SGTL5000_I2S_LRALIGN; |
502 | break; | 502 | break; |
503 | default: | 503 | default: |
@@ -1462,6 +1462,9 @@ static int sgtl5000_i2c_probe(struct i2c_client *client, | |||
1462 | if (ret) | 1462 | if (ret) |
1463 | return ret; | 1463 | return ret; |
1464 | 1464 | ||
1465 | /* Need 8 clocks before I2C accesses */ | ||
1466 | udelay(1); | ||
1467 | |||
1465 | /* read chip information */ | 1468 | /* read chip information */ |
1466 | ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, ®); | 1469 | ret = regmap_read(sgtl5000->regmap, SGTL5000_CHIP_ID, ®); |
1467 | if (ret) | 1470 | if (ret) |
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index b7ebce054b4e..dd222b10ce13 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c | |||
@@ -1046,7 +1046,7 @@ static int aic3x_prepare(struct snd_pcm_substream *substream, | |||
1046 | delay += aic3x->tdm_delay; | 1046 | delay += aic3x->tdm_delay; |
1047 | 1047 | ||
1048 | /* Configure data delay */ | 1048 | /* Configure data delay */ |
1049 | snd_soc_write(codec, AIC3X_ASD_INTF_CTRLC, aic3x->tdm_delay); | 1049 | snd_soc_write(codec, AIC3X_ASD_INTF_CTRLC, delay); |
1050 | 1050 | ||
1051 | return 0; | 1051 | return 0; |
1052 | } | 1052 | } |
diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c index b9211b42f6e9..b115ed815db9 100644 --- a/sound/soc/codecs/wm8731.c +++ b/sound/soc/codecs/wm8731.c | |||
@@ -717,6 +717,8 @@ static int wm8731_i2c_probe(struct i2c_client *i2c, | |||
717 | if (wm8731 == NULL) | 717 | if (wm8731 == NULL) |
718 | return -ENOMEM; | 718 | return -ENOMEM; |
719 | 719 | ||
720 | mutex_init(&wm8731->lock); | ||
721 | |||
720 | wm8731->regmap = devm_regmap_init_i2c(i2c, &wm8731_regmap); | 722 | wm8731->regmap = devm_regmap_init_i2c(i2c, &wm8731_regmap); |
721 | if (IS_ERR(wm8731->regmap)) { | 723 | if (IS_ERR(wm8731->regmap)) { |
722 | ret = PTR_ERR(wm8731->regmap); | 724 | ret = PTR_ERR(wm8731->regmap); |
diff --git a/sound/soc/codecs/wm9705.c b/sound/soc/codecs/wm9705.c index 3eddb18fefd1..5cc457ef8894 100644 --- a/sound/soc/codecs/wm9705.c +++ b/sound/soc/codecs/wm9705.c | |||
@@ -344,23 +344,27 @@ static int wm9705_soc_probe(struct snd_soc_codec *codec) | |||
344 | struct snd_ac97 *ac97; | 344 | struct snd_ac97 *ac97; |
345 | int ret = 0; | 345 | int ret = 0; |
346 | 346 | ||
347 | ac97 = snd_soc_new_ac97_codec(codec); | 347 | ac97 = snd_soc_alloc_ac97_codec(codec); |
348 | if (IS_ERR(ac97)) { | 348 | if (IS_ERR(ac97)) { |
349 | ret = PTR_ERR(ac97); | 349 | ret = PTR_ERR(ac97); |
350 | dev_err(codec->dev, "Failed to register AC97 codec\n"); | 350 | dev_err(codec->dev, "Failed to register AC97 codec\n"); |
351 | return ret; | 351 | return ret; |
352 | } | 352 | } |
353 | 353 | ||
354 | snd_soc_codec_set_drvdata(codec, ac97); | ||
355 | |||
356 | ret = wm9705_reset(codec); | 354 | ret = wm9705_reset(codec); |
357 | if (ret) | 355 | if (ret) |
358 | goto reset_err; | 356 | goto err_put_device; |
357 | |||
358 | ret = device_add(&ac97->dev); | ||
359 | if (ret) | ||
360 | goto err_put_device; | ||
361 | |||
362 | snd_soc_codec_set_drvdata(codec, ac97); | ||
359 | 363 | ||
360 | return 0; | 364 | return 0; |
361 | 365 | ||
362 | reset_err: | 366 | err_put_device: |
363 | snd_soc_free_ac97_codec(ac97); | 367 | put_device(&ac97->dev); |
364 | return ret; | 368 | return ret; |
365 | } | 369 | } |
366 | 370 | ||
diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index e04643d2bb24..9517571e820d 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c | |||
@@ -666,7 +666,7 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec) | |||
666 | struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); | 666 | struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); |
667 | int ret = 0; | 667 | int ret = 0; |
668 | 668 | ||
669 | wm9712->ac97 = snd_soc_new_ac97_codec(codec); | 669 | wm9712->ac97 = snd_soc_alloc_ac97_codec(codec); |
670 | if (IS_ERR(wm9712->ac97)) { | 670 | if (IS_ERR(wm9712->ac97)) { |
671 | ret = PTR_ERR(wm9712->ac97); | 671 | ret = PTR_ERR(wm9712->ac97); |
672 | dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret); | 672 | dev_err(codec->dev, "Failed to register AC97 codec: %d\n", ret); |
@@ -675,15 +675,19 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec) | |||
675 | 675 | ||
676 | ret = wm9712_reset(codec, 0); | 676 | ret = wm9712_reset(codec, 0); |
677 | if (ret < 0) | 677 | if (ret < 0) |
678 | goto reset_err; | 678 | goto err_put_device; |
679 | |||
680 | ret = device_add(&wm9712->ac97->dev); | ||
681 | if (ret) | ||
682 | goto err_put_device; | ||
679 | 683 | ||
680 | /* set alc mux to none */ | 684 | /* set alc mux to none */ |
681 | ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000); | 685 | ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000); |
682 | 686 | ||
683 | return 0; | 687 | return 0; |
684 | 688 | ||
685 | reset_err: | 689 | err_put_device: |
686 | snd_soc_free_ac97_codec(wm9712->ac97); | 690 | put_device(&wm9712->ac97->dev); |
687 | return ret; | 691 | return ret; |
688 | } | 692 | } |
689 | 693 | ||
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c index 71b9d5b0734d..6ab1122a3872 100644 --- a/sound/soc/codecs/wm9713.c +++ b/sound/soc/codecs/wm9713.c | |||
@@ -1225,7 +1225,7 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) | |||
1225 | struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); | 1225 | struct wm9713_priv *wm9713 = snd_soc_codec_get_drvdata(codec); |
1226 | int ret = 0, reg; | 1226 | int ret = 0, reg; |
1227 | 1227 | ||
1228 | wm9713->ac97 = snd_soc_new_ac97_codec(codec); | 1228 | wm9713->ac97 = snd_soc_alloc_ac97_codec(codec); |
1229 | if (IS_ERR(wm9713->ac97)) | 1229 | if (IS_ERR(wm9713->ac97)) |
1230 | return PTR_ERR(wm9713->ac97); | 1230 | return PTR_ERR(wm9713->ac97); |
1231 | 1231 | ||
@@ -1234,7 +1234,11 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) | |||
1234 | wm9713_reset(codec, 0); | 1234 | wm9713_reset(codec, 0); |
1235 | ret = wm9713_reset(codec, 1); | 1235 | ret = wm9713_reset(codec, 1); |
1236 | if (ret < 0) | 1236 | if (ret < 0) |
1237 | goto reset_err; | 1237 | goto err_put_device; |
1238 | |||
1239 | ret = device_add(&wm9713->ac97->dev); | ||
1240 | if (ret) | ||
1241 | goto err_put_device; | ||
1238 | 1242 | ||
1239 | /* unmute the adc - move to kcontrol */ | 1243 | /* unmute the adc - move to kcontrol */ |
1240 | reg = ac97_read(codec, AC97_CD) & 0x7fff; | 1244 | reg = ac97_read(codec, AC97_CD) & 0x7fff; |
@@ -1242,8 +1246,8 @@ static int wm9713_soc_probe(struct snd_soc_codec *codec) | |||
1242 | 1246 | ||
1243 | return 0; | 1247 | return 0; |
1244 | 1248 | ||
1245 | reset_err: | 1249 | err_put_device: |
1246 | snd_soc_free_ac97_codec(wm9713->ac97); | 1250 | put_device(&wm9713->ac97->dev); |
1247 | return ret; | 1251 | return ret; |
1248 | } | 1252 | } |
1249 | 1253 | ||
diff --git a/sound/soc/intel/sst-haswell-ipc.c b/sound/soc/intel/sst-haswell-ipc.c index 5bf14040c24a..8156cc1accb7 100644 --- a/sound/soc/intel/sst-haswell-ipc.c +++ b/sound/soc/intel/sst-haswell-ipc.c | |||
@@ -651,11 +651,11 @@ static void hsw_notification_work(struct work_struct *work) | |||
651 | } | 651 | } |
652 | 652 | ||
653 | /* tell DSP that notification has been handled */ | 653 | /* tell DSP that notification has been handled */ |
654 | sst_dsp_shim_update_bits_unlocked(hsw->dsp, SST_IPCD, | 654 | sst_dsp_shim_update_bits(hsw->dsp, SST_IPCD, |
655 | SST_IPCD_BUSY | SST_IPCD_DONE, SST_IPCD_DONE); | 655 | SST_IPCD_BUSY | SST_IPCD_DONE, SST_IPCD_DONE); |
656 | 656 | ||
657 | /* unmask busy interrupt */ | 657 | /* unmask busy interrupt */ |
658 | sst_dsp_shim_update_bits_unlocked(hsw->dsp, SST_IMRX, SST_IMRX_BUSY, 0); | 658 | sst_dsp_shim_update_bits(hsw->dsp, SST_IMRX, SST_IMRX_BUSY, 0); |
659 | } | 659 | } |
660 | 660 | ||
661 | static struct ipc_message *reply_find_msg(struct sst_hsw *hsw, u32 header) | 661 | static struct ipc_message *reply_find_msg(struct sst_hsw *hsw, u32 header) |
diff --git a/sound/soc/intel/sst/sst_acpi.c b/sound/soc/intel/sst/sst_acpi.c index 2ac72eb5e75d..b3360139c41a 100644 --- a/sound/soc/intel/sst/sst_acpi.c +++ b/sound/soc/intel/sst/sst_acpi.c | |||
@@ -350,7 +350,7 @@ static struct sst_machines sst_acpi_bytcr[] = { | |||
350 | 350 | ||
351 | /* Cherryview-based platforms: CherryTrail and Braswell */ | 351 | /* Cherryview-based platforms: CherryTrail and Braswell */ |
352 | static struct sst_machines sst_acpi_chv[] = { | 352 | static struct sst_machines sst_acpi_chv[] = { |
353 | {"10EC5670", "cht-bsw", "cht-bsw-rt5672", NULL, "fw_sst_22a8.bin", | 353 | {"10EC5670", "cht-bsw", "cht-bsw-rt5672", NULL, "intel/fw_sst_22a8.bin", |
354 | &chv_platform_data }, | 354 | &chv_platform_data }, |
355 | {}, | 355 | {}, |
356 | }; | 356 | }; |
diff --git a/sound/soc/soc-ac97.c b/sound/soc/soc-ac97.c index 2e10e9a38376..08d7259bbaab 100644 --- a/sound/soc/soc-ac97.c +++ b/sound/soc/soc-ac97.c | |||
@@ -48,15 +48,18 @@ static void soc_ac97_device_release(struct device *dev) | |||
48 | } | 48 | } |
49 | 49 | ||
50 | /** | 50 | /** |
51 | * snd_soc_new_ac97_codec - initailise AC97 device | 51 | * snd_soc_alloc_ac97_codec() - Allocate new a AC'97 device |
52 | * @codec: audio codec | 52 | * @codec: The CODEC for which to create the AC'97 device |
53 | * | 53 | * |
54 | * Initialises AC97 codec resources for use by ad-hoc devices only. | 54 | * Allocated a new snd_ac97 device and intializes it, but does not yet register |
55 | * it. The caller is responsible to either call device_add(&ac97->dev) to | ||
56 | * register the device, or to call put_device(&ac97->dev) to free the device. | ||
57 | * | ||
58 | * Returns: A snd_ac97 device or a PTR_ERR in case of an error. | ||
55 | */ | 59 | */ |
56 | struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec) | 60 | struct snd_ac97 *snd_soc_alloc_ac97_codec(struct snd_soc_codec *codec) |
57 | { | 61 | { |
58 | struct snd_ac97 *ac97; | 62 | struct snd_ac97 *ac97; |
59 | int ret; | ||
60 | 63 | ||
61 | ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL); | 64 | ac97 = kzalloc(sizeof(struct snd_ac97), GFP_KERNEL); |
62 | if (ac97 == NULL) | 65 | if (ac97 == NULL) |
@@ -73,7 +76,28 @@ struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec) | |||
73 | codec->component.card->snd_card->number, 0, | 76 | codec->component.card->snd_card->number, 0, |
74 | codec->component.name); | 77 | codec->component.name); |
75 | 78 | ||
76 | ret = device_register(&ac97->dev); | 79 | device_initialize(&ac97->dev); |
80 | |||
81 | return ac97; | ||
82 | } | ||
83 | EXPORT_SYMBOL(snd_soc_alloc_ac97_codec); | ||
84 | |||
85 | /** | ||
86 | * snd_soc_new_ac97_codec - initailise AC97 device | ||
87 | * @codec: audio codec | ||
88 | * | ||
89 | * Initialises AC97 codec resources for use by ad-hoc devices only. | ||
90 | */ | ||
91 | struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec) | ||
92 | { | ||
93 | struct snd_ac97 *ac97; | ||
94 | int ret; | ||
95 | |||
96 | ac97 = snd_soc_alloc_ac97_codec(codec); | ||
97 | if (IS_ERR(ac97)) | ||
98 | return ac97; | ||
99 | |||
100 | ret = device_add(&ac97->dev); | ||
77 | if (ret) { | 101 | if (ret) { |
78 | put_device(&ac97->dev); | 102 | put_device(&ac97->dev); |
79 | return ERR_PTR(ret); | 103 | return ERR_PTR(ret); |
diff --git a/tools/lib/lockdep/.gitignore b/tools/lib/lockdep/.gitignore new file mode 100644 index 000000000000..cc0e7a9f99e3 --- /dev/null +++ b/tools/lib/lockdep/.gitignore | |||
@@ -0,0 +1 @@ | |||
liblockdep.so.* | |||
diff --git a/tools/lib/lockdep/Makefile b/tools/lib/lockdep/Makefile index 52f9279c6c13..4b866c54f624 100644 --- a/tools/lib/lockdep/Makefile +++ b/tools/lib/lockdep/Makefile | |||
@@ -104,7 +104,7 @@ N = | |||
104 | 104 | ||
105 | export Q VERBOSE | 105 | export Q VERBOSE |
106 | 106 | ||
107 | INCLUDES = -I. -I/usr/local/include -I./uinclude -I./include -I../../include $(CONFIG_INCLUDES) | 107 | INCLUDES = -I. -I./uinclude -I./include -I../../include $(CONFIG_INCLUDES) |
108 | 108 | ||
109 | # Set compile option CFLAGS if not set elsewhere | 109 | # Set compile option CFLAGS if not set elsewhere |
110 | CFLAGS ?= -g -DCONFIG_LOCKDEP -DCONFIG_STACKTRACE -DCONFIG_PROVE_LOCKING -DBITS_PER_LONG=__WORDSIZE -DLIBLOCKDEP_VERSION='"$(LIBLOCKDEP_VERSION)"' -rdynamic -O0 -g | 110 | CFLAGS ?= -g -DCONFIG_LOCKDEP -DCONFIG_STACKTRACE -DCONFIG_PROVE_LOCKING -DBITS_PER_LONG=__WORDSIZE -DLIBLOCKDEP_VERSION='"$(LIBLOCKDEP_VERSION)"' -rdynamic -O0 -g |
diff --git a/tools/power/acpi/common/cmfsize.c b/tools/power/acpi/common/cmfsize.c index f4b953354ff7..eec688041500 100644 --- a/tools/power/acpi/common/cmfsize.c +++ b/tools/power/acpi/common/cmfsize.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/tools/power/acpi/common/getopt.c b/tools/power/acpi/common/getopt.c index 2f0f34a36db4..5da129e10aa2 100644 --- a/tools/power/acpi/common/getopt.c +++ b/tools/power/acpi/common/getopt.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/tools/power/acpi/os_specific/service_layers/oslibcfs.c b/tools/power/acpi/os_specific/service_layers/oslibcfs.c index c13ff9c51d74..b51e40a9a120 100644 --- a/tools/power/acpi/os_specific/service_layers/oslibcfs.c +++ b/tools/power/acpi/os_specific/service_layers/oslibcfs.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/tools/power/acpi/os_specific/service_layers/oslinuxtbl.c b/tools/power/acpi/os_specific/service_layers/oslinuxtbl.c index 0dc2485dedf5..92f1fd700344 100644 --- a/tools/power/acpi/os_specific/service_layers/oslinuxtbl.c +++ b/tools/power/acpi/os_specific/service_layers/oslinuxtbl.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/tools/power/acpi/os_specific/service_layers/osunixdir.c b/tools/power/acpi/os_specific/service_layers/osunixdir.c index 733f9e490fc4..e153fcb12b1a 100644 --- a/tools/power/acpi/os_specific/service_layers/osunixdir.c +++ b/tools/power/acpi/os_specific/service_layers/osunixdir.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/tools/power/acpi/os_specific/service_layers/osunixmap.c b/tools/power/acpi/os_specific/service_layers/osunixmap.c index 99b47b6194a3..3853a7350440 100644 --- a/tools/power/acpi/os_specific/service_layers/osunixmap.c +++ b/tools/power/acpi/os_specific/service_layers/osunixmap.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/tools/power/acpi/os_specific/service_layers/osunixxf.c b/tools/power/acpi/os_specific/service_layers/osunixxf.c index 7ccb073f8316..6858c0893c91 100644 --- a/tools/power/acpi/os_specific/service_layers/osunixxf.c +++ b/tools/power/acpi/os_specific/service_layers/osunixxf.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/tools/power/acpi/tools/acpidump/acpidump.h b/tools/power/acpi/tools/acpidump/acpidump.h index a2d37d610639..84bdef0136cb 100644 --- a/tools/power/acpi/tools/acpidump/acpidump.h +++ b/tools/power/acpi/tools/acpidump/acpidump.h | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/tools/power/acpi/tools/acpidump/apdump.c b/tools/power/acpi/tools/acpidump/apdump.c index 24d32968802d..c736adf5fb55 100644 --- a/tools/power/acpi/tools/acpidump/apdump.c +++ b/tools/power/acpi/tools/acpidump/apdump.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/tools/power/acpi/tools/acpidump/apfiles.c b/tools/power/acpi/tools/acpidump/apfiles.c index d470046a6d81..8f2fe168228e 100644 --- a/tools/power/acpi/tools/acpidump/apfiles.c +++ b/tools/power/acpi/tools/acpidump/apfiles.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/tools/power/acpi/tools/acpidump/apmain.c b/tools/power/acpi/tools/acpidump/apmain.c index 853b4da22c3e..d0ba6535f5af 100644 --- a/tools/power/acpi/tools/acpidump/apmain.c +++ b/tools/power/acpi/tools/acpidump/apmain.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2014, Intel Corp. | 8 | * Copyright (C) 2000 - 2015, Intel Corp. |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |