diff options
369 files changed, 8019 insertions, 2198 deletions
diff --git a/Documentation/bcache.txt b/Documentation/bcache.txt index 77db8809bd96..b3a7e7d384f6 100644 --- a/Documentation/bcache.txt +++ b/Documentation/bcache.txt | |||
@@ -319,7 +319,10 @@ cache<0..n> | |||
319 | Symlink to each of the cache devices comprising this cache set. | 319 | Symlink to each of the cache devices comprising this cache set. |
320 | 320 | ||
321 | cache_available_percent | 321 | cache_available_percent |
322 | Percentage of cache device free. | 322 | Percentage of cache device which doesn't contain dirty data, and could |
323 | potentially be used for writeback. This doesn't mean this space isn't used | ||
324 | for clean cached data; the unused statistic (in priority_stats) is typically | ||
325 | much lower. | ||
323 | 326 | ||
324 | clear_stats | 327 | clear_stats |
325 | Clears the statistics associated with this cache | 328 | Clears the statistics associated with this cache |
@@ -423,8 +426,11 @@ nbuckets | |||
423 | Total buckets in this cache | 426 | Total buckets in this cache |
424 | 427 | ||
425 | priority_stats | 428 | priority_stats |
426 | Statistics about how recently data in the cache has been accessed. This can | 429 | Statistics about how recently data in the cache has been accessed. |
427 | reveal your working set size. | 430 | This can reveal your working set size. Unused is the percentage of |
431 | the cache that doesn't contain any data. Metadata is bcache's | ||
432 | metadata overhead. Average is the average priority of cache buckets. | ||
433 | Next is a list of quantiles with the priority threshold of each. | ||
428 | 434 | ||
429 | written | 435 | written |
430 | Sum of all data that has been written to the cache; comparison with | 436 | Sum of all data that has been written to the cache; comparison with |
diff --git a/Documentation/devices.txt b/Documentation/devices.txt index 08f01e79c41a..b9015912bca6 100644 --- a/Documentation/devices.txt +++ b/Documentation/devices.txt | |||
@@ -498,12 +498,8 @@ Your cooperation is appreciated. | |||
498 | 498 | ||
499 | Each device type has 5 bits (32 minors). | 499 | Each device type has 5 bits (32 minors). |
500 | 500 | ||
501 | 13 block 8-bit MFM/RLL/IDE controller | 501 | 13 block Previously used for the XT disk (/dev/xdN) |
502 | 0 = /dev/xda First XT disk whole disk | 502 | Deleted in kernel v3.9. |
503 | 64 = /dev/xdb Second XT disk whole disk | ||
504 | |||
505 | Partitions are handled in the same way as IDE disks | ||
506 | (see major number 3). | ||
507 | 503 | ||
508 | 14 char Open Sound System (OSS) | 504 | 14 char Open Sound System (OSS) |
509 | 0 = /dev/mixer Mixer control | 505 | 0 = /dev/mixer Mixer control |
diff --git a/Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt b/Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt index 2a3feabd3b22..34c1505774bf 100644 --- a/Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt +++ b/Documentation/devicetree/bindings/rtc/atmel,at91rm9200-rtc.txt | |||
@@ -1,7 +1,7 @@ | |||
1 | Atmel AT91RM9200 Real Time Clock | 1 | Atmel AT91RM9200 Real Time Clock |
2 | 2 | ||
3 | Required properties: | 3 | Required properties: |
4 | - compatible: should be: "atmel,at91rm9200-rtc" | 4 | - compatible: should be: "atmel,at91rm9200-rtc" or "atmel,at91sam9x5-rtc" |
5 | - reg: physical base address of the controller and length of memory mapped | 5 | - reg: physical base address of the controller and length of memory mapped |
6 | region. | 6 | region. |
7 | - interrupts: rtc alarm/event interrupt | 7 | - interrupts: rtc alarm/event interrupt |
diff --git a/Documentation/dmatest.txt b/Documentation/dmatest.txt index 279ac0a8c5b1..132a094c7bc3 100644 --- a/Documentation/dmatest.txt +++ b/Documentation/dmatest.txt | |||
@@ -34,7 +34,7 @@ command: | |||
34 | After a while you will start to get messages about current status or error like | 34 | After a while you will start to get messages about current status or error like |
35 | in the original code. | 35 | in the original code. |
36 | 36 | ||
37 | Note that running a new test will stop any in progress test. | 37 | Note that running a new test will not stop any in progress test. |
38 | 38 | ||
39 | The following command should return actual state of the test. | 39 | The following command should return actual state of the test. |
40 | % cat /sys/kernel/debug/dmatest/run | 40 | % cat /sys/kernel/debug/dmatest/run |
@@ -52,8 +52,8 @@ To wait for test done the user may perform a busy loop that checks the state. | |||
52 | 52 | ||
53 | The module parameters that is supplied to the kernel command line will be used | 53 | The module parameters that is supplied to the kernel command line will be used |
54 | for the first performed test. After user gets a control, the test could be | 54 | for the first performed test. After user gets a control, the test could be |
55 | interrupted or re-run with same or different parameters. For the details see | 55 | re-run with the same or different parameters. For the details see the above |
56 | the above section "Part 2 - When dmatest is built as a module..." | 56 | section "Part 2 - When dmatest is built as a module..." |
57 | 57 | ||
58 | In both cases the module parameters are used as initial values for the test case. | 58 | In both cases the module parameters are used as initial values for the test case. |
59 | You always could check them at run-time by running | 59 | You always could check them at run-time by running |
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 6e3b18a8afc6..2fe6e767b3d6 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -3351,9 +3351,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
3351 | plus one apbt timer for broadcast timer. | 3351 | plus one apbt timer for broadcast timer. |
3352 | x86_mrst_timer=apbt_only | lapic_and_apbt | 3352 | x86_mrst_timer=apbt_only | lapic_and_apbt |
3353 | 3353 | ||
3354 | xd= [HW,XT] Original XT pre-IDE (RLL encoded) disks. | ||
3355 | xd_geo= See header of drivers/block/xd.c. | ||
3356 | |||
3357 | xen_emul_unplug= [HW,X86,XEN] | 3354 | xen_emul_unplug= [HW,X86,XEN] |
3358 | Unplug Xen emulated devices | 3355 | Unplug Xen emulated devices |
3359 | Format: [unplug0,][unplug1] | 3356 | Format: [unplug0,][unplug1] |
diff --git a/Documentation/m68k/kernel-options.txt b/Documentation/m68k/kernel-options.txt index 97d45f276fe6..eaf32a1fd0b1 100644 --- a/Documentation/m68k/kernel-options.txt +++ b/Documentation/m68k/kernel-options.txt | |||
@@ -80,8 +80,6 @@ Valid names are: | |||
80 | /dev/sdd: -> 0x0830 (forth SCSI disk) | 80 | /dev/sdd: -> 0x0830 (forth SCSI disk) |
81 | /dev/sde: -> 0x0840 (fifth SCSI disk) | 81 | /dev/sde: -> 0x0840 (fifth SCSI disk) |
82 | /dev/fd : -> 0x0200 (floppy disk) | 82 | /dev/fd : -> 0x0200 (floppy disk) |
83 | /dev/xda: -> 0x0c00 (first XT disk, unused in Linux/m68k) | ||
84 | /dev/xdb: -> 0x0c40 (second XT disk, unused in Linux/m68k) | ||
85 | 83 | ||
86 | The name must be followed by a decimal number, that stands for the | 84 | The name must be followed by a decimal number, that stands for the |
87 | partition number. Internally, the value of the number is just | 85 | partition number. Internally, the value of the number is just |
diff --git a/MAINTAINERS b/MAINTAINERS index 0518ec49467b..60d6a3393500 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -2895,8 +2895,8 @@ F: drivers/media/dvb-frontends/ec100* | |||
2895 | 2895 | ||
2896 | ECRYPT FILE SYSTEM | 2896 | ECRYPT FILE SYSTEM |
2897 | M: Tyler Hicks <tyhicks@canonical.com> | 2897 | M: Tyler Hicks <tyhicks@canonical.com> |
2898 | M: Dustin Kirkland <dustin.kirkland@gazzang.com> | ||
2899 | L: ecryptfs@vger.kernel.org | 2898 | L: ecryptfs@vger.kernel.org |
2899 | W: http://ecryptfs.org | ||
2900 | W: https://launchpad.net/ecryptfs | 2900 | W: https://launchpad.net/ecryptfs |
2901 | S: Supported | 2901 | S: Supported |
2902 | F: Documentation/filesystems/ecryptfs.txt | 2902 | F: Documentation/filesystems/ecryptfs.txt |
@@ -4453,6 +4453,16 @@ S: Maintained | |||
4453 | F: drivers/scsi/*iscsi* | 4453 | F: drivers/scsi/*iscsi* |
4454 | F: include/scsi/*iscsi* | 4454 | F: include/scsi/*iscsi* |
4455 | 4455 | ||
4456 | ISCSI EXTENSIONS FOR RDMA (ISER) INITIATOR | ||
4457 | M: Or Gerlitz <ogerlitz@mellanox.com> | ||
4458 | M: Roi Dayan <roid@mellanox.com> | ||
4459 | L: linux-rdma@vger.kernel.org | ||
4460 | S: Supported | ||
4461 | W: http://www.openfabrics.org | ||
4462 | W: www.open-iscsi.org | ||
4463 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ | ||
4464 | F: drivers/infiniband/ulp/iser | ||
4465 | |||
4456 | ISDN SUBSYSTEM | 4466 | ISDN SUBSYSTEM |
4457 | M: Karsten Keil <isdn@linux-pingi.de> | 4467 | M: Karsten Keil <isdn@linux-pingi.de> |
4458 | L: isdn4linux@listserv.isdn4linux.de (subscribers-only) | 4468 | L: isdn4linux@listserv.isdn4linux.de (subscribers-only) |
@@ -5761,7 +5771,7 @@ M: Matthew Wilcox <willy@linux.intel.com> | |||
5761 | L: linux-nvme@lists.infradead.org | 5771 | L: linux-nvme@lists.infradead.org |
5762 | T: git git://git.infradead.org/users/willy/linux-nvme.git | 5772 | T: git git://git.infradead.org/users/willy/linux-nvme.git |
5763 | S: Supported | 5773 | S: Supported |
5764 | F: drivers/block/nvme.c | 5774 | F: drivers/block/nvme* |
5765 | F: include/linux/nvme.h | 5775 | F: include/linux/nvme.h |
5766 | 5776 | ||
5767 | OMAP SUPPORT | 5777 | OMAP SUPPORT |
@@ -7619,7 +7629,7 @@ F: drivers/clk/spear/ | |||
7619 | SPI SUBSYSTEM | 7629 | SPI SUBSYSTEM |
7620 | M: Mark Brown <broonie@kernel.org> | 7630 | M: Mark Brown <broonie@kernel.org> |
7621 | M: Grant Likely <grant.likely@linaro.org> | 7631 | M: Grant Likely <grant.likely@linaro.org> |
7622 | L: spi-devel-general@lists.sourceforge.net | 7632 | L: linux-spi@vger.kernel.org |
7623 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git | 7633 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git |
7624 | Q: http://patchwork.kernel.org/project/spi-devel-general/list/ | 7634 | Q: http://patchwork.kernel.org/project/spi-devel-general/list/ |
7625 | S: Maintained | 7635 | S: Maintained |
@@ -8999,7 +9009,7 @@ S: Maintained | |||
8999 | F: drivers/net/wireless/wl3501* | 9009 | F: drivers/net/wireless/wl3501* |
9000 | 9010 | ||
9001 | WM97XX TOUCHSCREEN DRIVERS | 9011 | WM97XX TOUCHSCREEN DRIVERS |
9002 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> | 9012 | M: Mark Brown <broonie@kernel.org> |
9003 | M: Liam Girdwood <lrg@slimlogic.co.uk> | 9013 | M: Liam Girdwood <lrg@slimlogic.co.uk> |
9004 | L: linux-input@vger.kernel.org | 9014 | L: linux-input@vger.kernel.org |
9005 | T: git git://opensource.wolfsonmicro.com/linux-2.6-touch | 9015 | T: git git://opensource.wolfsonmicro.com/linux-2.6-touch |
@@ -9009,7 +9019,6 @@ F: drivers/input/touchscreen/*wm97* | |||
9009 | F: include/linux/wm97xx.h | 9019 | F: include/linux/wm97xx.h |
9010 | 9020 | ||
9011 | WOLFSON MICROELECTRONICS DRIVERS | 9021 | WOLFSON MICROELECTRONICS DRIVERS |
9012 | M: Mark Brown <broonie@opensource.wolfsonmicro.com> | ||
9013 | L: patches@opensource.wolfsonmicro.com | 9022 | L: patches@opensource.wolfsonmicro.com |
9014 | T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc | 9023 | T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc |
9015 | T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus | 9024 | T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 3 | 1 | VERSION = 3 |
2 | PATCHLEVEL = 10 | 2 | PATCHLEVEL = 10 |
3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
4 | EXTRAVERSION = -rc4 | 4 | EXTRAVERSION = -rc6 |
5 | NAME = Unicycling Gorilla | 5 | NAME = Unicycling Gorilla |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index 3580d57ea218..79e9bdbfc491 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile | |||
@@ -124,7 +124,7 @@ KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) | |||
124 | endif | 124 | endif |
125 | 125 | ||
126 | ccflags-y := -fpic -mno-single-pic-base -fno-builtin -I$(obj) | 126 | ccflags-y := -fpic -mno-single-pic-base -fno-builtin -I$(obj) |
127 | asflags-y := -Wa,-march=all -DZIMAGE | 127 | asflags-y := -DZIMAGE |
128 | 128 | ||
129 | # Supply kernel BSS size to the decompressor via a linker symbol. | 129 | # Supply kernel BSS size to the decompressor via a linker symbol. |
130 | KBSS_SZ = $(shell $(CROSS_COMPILE)size $(obj)/../../../../vmlinux | \ | 130 | KBSS_SZ = $(shell $(CROSS_COMPILE)size $(obj)/../../../../vmlinux | \ |
diff --git a/arch/arm/boot/compressed/debug.S b/arch/arm/boot/compressed/debug.S index 6e8382d5b7a4..5392ee63338f 100644 --- a/arch/arm/boot/compressed/debug.S +++ b/arch/arm/boot/compressed/debug.S | |||
@@ -1,6 +1,8 @@ | |||
1 | #include <linux/linkage.h> | 1 | #include <linux/linkage.h> |
2 | #include <asm/assembler.h> | 2 | #include <asm/assembler.h> |
3 | 3 | ||
4 | #ifndef CONFIG_DEBUG_SEMIHOSTING | ||
5 | |||
4 | #include CONFIG_DEBUG_LL_INCLUDE | 6 | #include CONFIG_DEBUG_LL_INCLUDE |
5 | 7 | ||
6 | ENTRY(putc) | 8 | ENTRY(putc) |
@@ -10,3 +12,29 @@ ENTRY(putc) | |||
10 | busyuart r3, r1 | 12 | busyuart r3, r1 |
11 | mov pc, lr | 13 | mov pc, lr |
12 | ENDPROC(putc) | 14 | ENDPROC(putc) |
15 | |||
16 | #else | ||
17 | |||
18 | ENTRY(putc) | ||
19 | adr r1, 1f | ||
20 | ldmia r1, {r2, r3} | ||
21 | add r2, r2, r1 | ||
22 | ldr r1, [r2, r3] | ||
23 | strb r0, [r1] | ||
24 | mov r0, #0x03 @ SYS_WRITEC | ||
25 | ARM( svc #0x123456 ) | ||
26 | THUMB( svc #0xab ) | ||
27 | mov pc, lr | ||
28 | .align 2 | ||
29 | 1: .word _GLOBAL_OFFSET_TABLE_ - . | ||
30 | .word semi_writec_buf(GOT) | ||
31 | ENDPROC(putc) | ||
32 | |||
33 | .bss | ||
34 | .global semi_writec_buf | ||
35 | .type semi_writec_buf, %object | ||
36 | semi_writec_buf: | ||
37 | .space 4 | ||
38 | .size semi_writec_buf, 4 | ||
39 | |||
40 | #endif | ||
diff --git a/arch/arm/boot/compressed/head-sa1100.S b/arch/arm/boot/compressed/head-sa1100.S index 6179d94dd5c6..3115e313d9f6 100644 --- a/arch/arm/boot/compressed/head-sa1100.S +++ b/arch/arm/boot/compressed/head-sa1100.S | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <asm/mach-types.h> | 11 | #include <asm/mach-types.h> |
12 | 12 | ||
13 | .section ".start", "ax" | 13 | .section ".start", "ax" |
14 | .arch armv4 | ||
14 | 15 | ||
15 | __SA1100_start: | 16 | __SA1100_start: |
16 | 17 | ||
diff --git a/arch/arm/boot/compressed/head-shark.S b/arch/arm/boot/compressed/head-shark.S index 089c560e07f1..92b56897ed64 100644 --- a/arch/arm/boot/compressed/head-shark.S +++ b/arch/arm/boot/compressed/head-shark.S | |||
@@ -18,6 +18,7 @@ | |||
18 | 18 | ||
19 | .section ".start", "ax" | 19 | .section ".start", "ax" |
20 | 20 | ||
21 | .arch armv4 | ||
21 | b __beginning | 22 | b __beginning |
22 | 23 | ||
23 | __ofw_data: .long 0 @ the number of memory blocks | 24 | __ofw_data: .long 0 @ the number of memory blocks |
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index fe4d9c3ad761..032a8d987148 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/linkage.h> | 11 | #include <linux/linkage.h> |
12 | #include <asm/assembler.h> | 12 | #include <asm/assembler.h> |
13 | 13 | ||
14 | .arch armv7-a | ||
14 | /* | 15 | /* |
15 | * Debugging stuff | 16 | * Debugging stuff |
16 | * | 17 | * |
@@ -805,8 +806,8 @@ call_cache_fn: adr r12, proc_types | |||
805 | .align 2 | 806 | .align 2 |
806 | .type proc_types,#object | 807 | .type proc_types,#object |
807 | proc_types: | 808 | proc_types: |
808 | .word 0x00000000 @ old ARM ID | 809 | .word 0x41000000 @ old ARM ID |
809 | .word 0x0000f000 | 810 | .word 0xff00f000 |
810 | mov pc, lr | 811 | mov pc, lr |
811 | THUMB( nop ) | 812 | THUMB( nop ) |
812 | mov pc, lr | 813 | mov pc, lr |
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi index 1460d9b88adf..8e1248f01fab 100644 --- a/arch/arm/boot/dts/am33xx.dtsi +++ b/arch/arm/boot/dts/am33xx.dtsi | |||
@@ -409,8 +409,8 @@ | |||
409 | ti,hwmods = "gpmc"; | 409 | ti,hwmods = "gpmc"; |
410 | reg = <0x50000000 0x2000>; | 410 | reg = <0x50000000 0x2000>; |
411 | interrupts = <100>; | 411 | interrupts = <100>; |
412 | num-cs = <7>; | 412 | gpmc,num-cs = <7>; |
413 | num-waitpins = <2>; | 413 | gpmc,num-waitpins = <2>; |
414 | #address-cells = <2>; | 414 | #address-cells = <2>; |
415 | #size-cells = <1>; | 415 | #size-cells = <1>; |
416 | status = "disabled"; | 416 | status = "disabled"; |
diff --git a/arch/arm/boot/dts/armada-xp-gp.dts b/arch/arm/boot/dts/armada-xp-gp.dts index 3ee63d128e27..76db557adbe7 100644 --- a/arch/arm/boot/dts/armada-xp-gp.dts +++ b/arch/arm/boot/dts/armada-xp-gp.dts | |||
@@ -39,8 +39,9 @@ | |||
39 | }; | 39 | }; |
40 | 40 | ||
41 | soc { | 41 | soc { |
42 | ranges = <0 0 0xd0000000 0x100000 | 42 | ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */ |
43 | 0xf0000000 0 0xf0000000 0x1000000>; | 43 | 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */ |
44 | 0xf0000000 0 0xf0000000 0x1000000 /* Device Bus, NOR 16MiB */>; | ||
44 | 45 | ||
45 | internal-regs { | 46 | internal-regs { |
46 | serial@12000 { | 47 | serial@12000 { |
diff --git a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts index 46b785064dd8..fdea75c73411 100644 --- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts +++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts | |||
@@ -27,8 +27,9 @@ | |||
27 | }; | 27 | }; |
28 | 28 | ||
29 | soc { | 29 | soc { |
30 | ranges = <0 0 0xd0000000 0x100000 | 30 | ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */ |
31 | 0xf0000000 0 0xf0000000 0x8000000>; | 31 | 0xe0000000 0 0xe0000000 0x8100000 /* PCIe */ |
32 | 0xf0000000 0 0xf0000000 0x8000000 /* Device Bus, NOR 128MiB */>; | ||
32 | 33 | ||
33 | internal-regs { | 34 | internal-regs { |
34 | serial@12000 { | 35 | serial@12000 { |
diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi index f0052dccf9a8..1e12aeff403b 100644 --- a/arch/arm/boot/dts/bcm2835.dtsi +++ b/arch/arm/boot/dts/bcm2835.dtsi | |||
@@ -44,6 +44,7 @@ | |||
44 | reg = <0x7e201000 0x1000>; | 44 | reg = <0x7e201000 0x1000>; |
45 | interrupts = <2 25>; | 45 | interrupts = <2 25>; |
46 | clock-frequency = <3000000>; | 46 | clock-frequency = <3000000>; |
47 | arm,primecell-periphid = <0x00241011>; | ||
47 | }; | 48 | }; |
48 | 49 | ||
49 | gpio: gpio { | 50 | gpio: gpio { |
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi index d2550e0bca24..701153992c69 100644 --- a/arch/arm/boot/dts/imx25.dtsi +++ b/arch/arm/boot/dts/imx25.dtsi | |||
@@ -141,8 +141,8 @@ | |||
141 | #size-cells = <0>; | 141 | #size-cells = <0>; |
142 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | 142 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; |
143 | reg = <0x43fa4000 0x4000>; | 143 | reg = <0x43fa4000 0x4000>; |
144 | clocks = <&clks 62>; | 144 | clocks = <&clks 62>, <&clks 62>; |
145 | clock-names = "ipg"; | 145 | clock-names = "ipg", "per"; |
146 | interrupts = <14>; | 146 | interrupts = <14>; |
147 | status = "disabled"; | 147 | status = "disabled"; |
148 | }; | 148 | }; |
@@ -182,8 +182,8 @@ | |||
182 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | 182 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; |
183 | reg = <0x50004000 0x4000>; | 183 | reg = <0x50004000 0x4000>; |
184 | interrupts = <0>; | 184 | interrupts = <0>; |
185 | clocks = <&clks 80>; | 185 | clocks = <&clks 80>, <&clks 80>; |
186 | clock-names = "ipg"; | 186 | clock-names = "ipg", "per"; |
187 | status = "disabled"; | 187 | status = "disabled"; |
188 | }; | 188 | }; |
189 | 189 | ||
@@ -210,8 +210,8 @@ | |||
210 | #size-cells = <0>; | 210 | #size-cells = <0>; |
211 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | 211 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; |
212 | reg = <0x50010000 0x4000>; | 212 | reg = <0x50010000 0x4000>; |
213 | clocks = <&clks 79>; | 213 | clocks = <&clks 79>, <&clks 79>; |
214 | clock-names = "ipg"; | 214 | clock-names = "ipg", "per"; |
215 | interrupts = <13>; | 215 | interrupts = <13>; |
216 | status = "disabled"; | 216 | status = "disabled"; |
217 | }; | 217 | }; |
diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi index ff4bd4873edf..75bd11386516 100644 --- a/arch/arm/boot/dts/imx27.dtsi +++ b/arch/arm/boot/dts/imx27.dtsi | |||
@@ -131,7 +131,7 @@ | |||
131 | compatible = "fsl,imx27-cspi"; | 131 | compatible = "fsl,imx27-cspi"; |
132 | reg = <0x1000e000 0x1000>; | 132 | reg = <0x1000e000 0x1000>; |
133 | interrupts = <16>; | 133 | interrupts = <16>; |
134 | clocks = <&clks 53>, <&clks 0>; | 134 | clocks = <&clks 53>, <&clks 53>; |
135 | clock-names = "ipg", "per"; | 135 | clock-names = "ipg", "per"; |
136 | status = "disabled"; | 136 | status = "disabled"; |
137 | }; | 137 | }; |
@@ -142,7 +142,7 @@ | |||
142 | compatible = "fsl,imx27-cspi"; | 142 | compatible = "fsl,imx27-cspi"; |
143 | reg = <0x1000f000 0x1000>; | 143 | reg = <0x1000f000 0x1000>; |
144 | interrupts = <15>; | 144 | interrupts = <15>; |
145 | clocks = <&clks 52>, <&clks 0>; | 145 | clocks = <&clks 52>, <&clks 52>; |
146 | clock-names = "ipg", "per"; | 146 | clock-names = "ipg", "per"; |
147 | status = "disabled"; | 147 | status = "disabled"; |
148 | }; | 148 | }; |
@@ -223,7 +223,7 @@ | |||
223 | compatible = "fsl,imx27-cspi"; | 223 | compatible = "fsl,imx27-cspi"; |
224 | reg = <0x10017000 0x1000>; | 224 | reg = <0x10017000 0x1000>; |
225 | interrupts = <6>; | 225 | interrupts = <6>; |
226 | clocks = <&clks 51>, <&clks 0>; | 226 | clocks = <&clks 51>, <&clks 51>; |
227 | clock-names = "ipg", "per"; | 227 | clock-names = "ipg", "per"; |
228 | status = "disabled"; | 228 | status = "disabled"; |
229 | }; | 229 | }; |
diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi index 21bb786c5b31..53fdde69bbf4 100644 --- a/arch/arm/boot/dts/imx51.dtsi +++ b/arch/arm/boot/dts/imx51.dtsi | |||
@@ -631,7 +631,7 @@ | |||
631 | compatible = "fsl,imx51-cspi", "fsl,imx35-cspi"; | 631 | compatible = "fsl,imx51-cspi", "fsl,imx35-cspi"; |
632 | reg = <0x83fc0000 0x4000>; | 632 | reg = <0x83fc0000 0x4000>; |
633 | interrupts = <38>; | 633 | interrupts = <38>; |
634 | clocks = <&clks 55>, <&clks 0>; | 634 | clocks = <&clks 55>, <&clks 55>; |
635 | clock-names = "ipg", "per"; | 635 | clock-names = "ipg", "per"; |
636 | status = "disabled"; | 636 | status = "disabled"; |
637 | }; | 637 | }; |
diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index 845982eaac22..eb83aa039b8b 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi | |||
@@ -714,7 +714,7 @@ | |||
714 | compatible = "fsl,imx53-cspi", "fsl,imx35-cspi"; | 714 | compatible = "fsl,imx53-cspi", "fsl,imx35-cspi"; |
715 | reg = <0x63fc0000 0x4000>; | 715 | reg = <0x63fc0000 0x4000>; |
716 | interrupts = <38>; | 716 | interrupts = <38>; |
717 | clocks = <&clks 55>, <&clks 0>; | 717 | clocks = <&clks 55>, <&clks 55>; |
718 | clock-names = "ipg", "per"; | 718 | clock-names = "ipg", "per"; |
719 | status = "disabled"; | 719 | status = "disabled"; |
720 | }; | 720 | }; |
diff --git a/arch/arm/boot/dts/omap4-panda-common.dtsi b/arch/arm/boot/dts/omap4-panda-common.dtsi index 03bd60deb52b..eeb734e25709 100644 --- a/arch/arm/boot/dts/omap4-panda-common.dtsi +++ b/arch/arm/boot/dts/omap4-panda-common.dtsi | |||
@@ -56,9 +56,23 @@ | |||
56 | }; | 56 | }; |
57 | }; | 57 | }; |
58 | 58 | ||
59 | &omap4_pmx_wkup { | ||
60 | pinctrl-names = "default"; | ||
61 | pinctrl-0 = < | ||
62 | &twl6030_wkup_pins | ||
63 | >; | ||
64 | |||
65 | twl6030_wkup_pins: pinmux_twl6030_wkup_pins { | ||
66 | pinctrl-single,pins = < | ||
67 | 0x14 0x2 /* fref_clk0_out.sys_drm_msecure OUTPUT | MODE2 */ | ||
68 | >; | ||
69 | }; | ||
70 | }; | ||
71 | |||
59 | &omap4_pmx_core { | 72 | &omap4_pmx_core { |
60 | pinctrl-names = "default"; | 73 | pinctrl-names = "default"; |
61 | pinctrl-0 = < | 74 | pinctrl-0 = < |
75 | &twl6030_pins | ||
62 | &twl6040_pins | 76 | &twl6040_pins |
63 | &mcpdm_pins | 77 | &mcpdm_pins |
64 | &mcbsp1_pins | 78 | &mcbsp1_pins |
@@ -66,6 +80,12 @@ | |||
66 | &tpd12s015_pins | 80 | &tpd12s015_pins |
67 | >; | 81 | >; |
68 | 82 | ||
83 | twl6030_pins: pinmux_twl6030_pins { | ||
84 | pinctrl-single,pins = < | ||
85 | 0x15e 0x4118 /* sys_nirq1.sys_nirq1 OMAP_WAKEUP_EN | INPUT_PULLUP | MODE0 */ | ||
86 | >; | ||
87 | }; | ||
88 | |||
69 | twl6040_pins: pinmux_twl6040_pins { | 89 | twl6040_pins: pinmux_twl6040_pins { |
70 | pinctrl-single,pins = < | 90 | pinctrl-single,pins = < |
71 | 0xe0 0x3 /* hdq_sio.gpio_127 OUTPUT | MODE3 */ | 91 | 0xe0 0x3 /* hdq_sio.gpio_127 OUTPUT | MODE3 */ |
diff --git a/arch/arm/boot/dts/omap4-sdp.dts b/arch/arm/boot/dts/omap4-sdp.dts index a35d9cd58063..98505a2ef162 100644 --- a/arch/arm/boot/dts/omap4-sdp.dts +++ b/arch/arm/boot/dts/omap4-sdp.dts | |||
@@ -142,9 +142,23 @@ | |||
142 | }; | 142 | }; |
143 | }; | 143 | }; |
144 | 144 | ||
145 | &omap4_pmx_wkup { | ||
146 | pinctrl-names = "default"; | ||
147 | pinctrl-0 = < | ||
148 | &twl6030_wkup_pins | ||
149 | >; | ||
150 | |||
151 | twl6030_wkup_pins: pinmux_twl6030_wkup_pins { | ||
152 | pinctrl-single,pins = < | ||
153 | 0x14 0x2 /* fref_clk0_out.sys_drm_msecure OUTPUT | MODE2 */ | ||
154 | >; | ||
155 | }; | ||
156 | }; | ||
157 | |||
145 | &omap4_pmx_core { | 158 | &omap4_pmx_core { |
146 | pinctrl-names = "default"; | 159 | pinctrl-names = "default"; |
147 | pinctrl-0 = < | 160 | pinctrl-0 = < |
161 | &twl6030_pins | ||
148 | &twl6040_pins | 162 | &twl6040_pins |
149 | &mcpdm_pins | 163 | &mcpdm_pins |
150 | &dmic_pins | 164 | &dmic_pins |
@@ -179,6 +193,12 @@ | |||
179 | >; | 193 | >; |
180 | }; | 194 | }; |
181 | 195 | ||
196 | twl6030_pins: pinmux_twl6030_pins { | ||
197 | pinctrl-single,pins = < | ||
198 | 0x15e 0x4118 /* sys_nirq1.sys_nirq1 OMAP_WAKEUP_EN | INPUT_PULLUP | MODE0 */ | ||
199 | >; | ||
200 | }; | ||
201 | |||
182 | twl6040_pins: pinmux_twl6040_pins { | 202 | twl6040_pins: pinmux_twl6040_pins { |
183 | pinctrl-single,pins = < | 203 | pinctrl-single,pins = < |
184 | 0xe0 0x3 /* hdq_sio.gpio_127 OUTPUT | MODE3 */ | 204 | 0xe0 0x3 /* hdq_sio.gpio_127 OUTPUT | MODE3 */ |
diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi index 3dd7ff825828..635cae283011 100644 --- a/arch/arm/boot/dts/omap5.dtsi +++ b/arch/arm/boot/dts/omap5.dtsi | |||
@@ -538,6 +538,7 @@ | |||
538 | interrupts = <0 41 0x4>; | 538 | interrupts = <0 41 0x4>; |
539 | ti,hwmods = "timer5"; | 539 | ti,hwmods = "timer5"; |
540 | ti,timer-dsp; | 540 | ti,timer-dsp; |
541 | ti,timer-pwm; | ||
541 | }; | 542 | }; |
542 | 543 | ||
543 | timer6: timer@4013a000 { | 544 | timer6: timer@4013a000 { |
@@ -574,6 +575,7 @@ | |||
574 | reg = <0x4803e000 0x80>; | 575 | reg = <0x4803e000 0x80>; |
575 | interrupts = <0 45 0x4>; | 576 | interrupts = <0 45 0x4>; |
576 | ti,hwmods = "timer9"; | 577 | ti,hwmods = "timer9"; |
578 | ti,timer-pwm; | ||
577 | }; | 579 | }; |
578 | 580 | ||
579 | timer10: timer@48086000 { | 581 | timer10: timer@48086000 { |
@@ -581,6 +583,7 @@ | |||
581 | reg = <0x48086000 0x80>; | 583 | reg = <0x48086000 0x80>; |
582 | interrupts = <0 46 0x4>; | 584 | interrupts = <0 46 0x4>; |
583 | ti,hwmods = "timer10"; | 585 | ti,hwmods = "timer10"; |
586 | ti,timer-pwm; | ||
584 | }; | 587 | }; |
585 | 588 | ||
586 | timer11: timer@48088000 { | 589 | timer11: timer@48088000 { |
diff --git a/arch/arm/include/asm/percpu.h b/arch/arm/include/asm/percpu.h index 968c0a14e0a3..209e6504922e 100644 --- a/arch/arm/include/asm/percpu.h +++ b/arch/arm/include/asm/percpu.h | |||
@@ -30,8 +30,15 @@ static inline void set_my_cpu_offset(unsigned long off) | |||
30 | static inline unsigned long __my_cpu_offset(void) | 30 | static inline unsigned long __my_cpu_offset(void) |
31 | { | 31 | { |
32 | unsigned long off; | 32 | unsigned long off; |
33 | /* Read TPIDRPRW */ | 33 | register unsigned long *sp asm ("sp"); |
34 | asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : : "memory"); | 34 | |
35 | /* | ||
36 | * Read TPIDRPRW. | ||
37 | * We want to allow caching the value, so avoid using volatile and | ||
38 | * instead use a fake stack read to hazard against barrier(). | ||
39 | */ | ||
40 | asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : "Q" (*sp)); | ||
41 | |||
35 | return off; | 42 | return off; |
36 | } | 43 | } |
37 | #define __my_cpu_offset __my_cpu_offset() | 44 | #define __my_cpu_offset __my_cpu_offset() |
diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c index f10316b4ecdc..c5a59546a256 100644 --- a/arch/arm/kernel/topology.c +++ b/arch/arm/kernel/topology.c | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #include <linux/cpu.h> | 14 | #include <linux/cpu.h> |
15 | #include <linux/cpumask.h> | 15 | #include <linux/cpumask.h> |
16 | #include <linux/export.h> | ||
16 | #include <linux/init.h> | 17 | #include <linux/init.h> |
17 | #include <linux/percpu.h> | 18 | #include <linux/percpu.h> |
18 | #include <linux/node.h> | 19 | #include <linux/node.h> |
@@ -200,6 +201,7 @@ static inline void update_cpu_power(unsigned int cpuid, unsigned int mpidr) {} | |||
200 | * cpu topology table | 201 | * cpu topology table |
201 | */ | 202 | */ |
202 | struct cputopo_arm cpu_topology[NR_CPUS]; | 203 | struct cputopo_arm cpu_topology[NR_CPUS]; |
204 | EXPORT_SYMBOL_GPL(cpu_topology); | ||
203 | 205 | ||
204 | const struct cpumask *cpu_coregroup_mask(int cpu) | 206 | const struct cpumask *cpu_coregroup_mask(int cpu) |
205 | { | 207 | { |
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 027c9e7f0d13..f7e504b7874d 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c | |||
@@ -386,6 +386,8 @@ int __init exynos_fdt_map_chipid(unsigned long node, const char *uname, | |||
386 | 386 | ||
387 | void __init exynos_init_io(struct map_desc *mach_desc, int size) | 387 | void __init exynos_init_io(struct map_desc *mach_desc, int size) |
388 | { | 388 | { |
389 | debug_ll_io_init(); | ||
390 | |||
389 | #ifdef CONFIG_OF | 391 | #ifdef CONFIG_OF |
390 | if (initial_boot_params) | 392 | if (initial_boot_params) |
391 | of_scan_flat_dt(exynos_fdt_map_chipid, NULL); | 393 | of_scan_flat_dt(exynos_fdt_map_chipid, NULL); |
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index dda9a2bd3acb..4e3148ce852d 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
@@ -181,14 +181,14 @@ static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", "osc", "dummy", | |||
181 | static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "pll2_bus", }; | 181 | static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "pll2_bus", }; |
182 | static const char *periph_sels[] = { "periph_pre", "periph_clk2", }; | 182 | static const char *periph_sels[] = { "periph_pre", "periph_clk2", }; |
183 | static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", }; | 183 | static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", }; |
184 | static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | 184 | static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "periph", "pll3_pfd1_540m", }; |
185 | static const char *audio_sels[] = { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd3_454m", "pll3_usb_otg", }; | 185 | static const char *audio_sels[] = { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd3_454m", "pll3_usb_otg", }; |
186 | static const char *gpu_axi_sels[] = { "axi", "ahb", }; | 186 | static const char *gpu_axi_sels[] = { "axi", "ahb", }; |
187 | static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", }; | 187 | static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", }; |
188 | static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", }; | 188 | static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", }; |
189 | static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll3_pfd0_720m", }; | 189 | static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll3_pfd0_720m", }; |
190 | static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; | 190 | static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; |
191 | static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", }; | 191 | static const char *ldb_di_sels[] = { "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", }; |
192 | static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | 192 | static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; |
193 | static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | 193 | static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; |
194 | static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | 194 | static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; |
diff --git a/arch/arm/mach-kirkwood/board-ts219.c b/arch/arm/mach-kirkwood/board-ts219.c index acb0187c7ee1..4695d5f35fc9 100644 --- a/arch/arm/mach-kirkwood/board-ts219.c +++ b/arch/arm/mach-kirkwood/board-ts219.c | |||
@@ -41,13 +41,3 @@ void __init qnap_dt_ts219_init(void) | |||
41 | 41 | ||
42 | pm_power_off = qnap_tsx1x_power_off; | 42 | pm_power_off = qnap_tsx1x_power_off; |
43 | } | 43 | } |
44 | |||
45 | /* FIXME: Will not work with DT. Maybe use MPP40_GPIO? */ | ||
46 | static int __init ts219_pci_init(void) | ||
47 | { | ||
48 | if (machine_is_ts219()) | ||
49 | kirkwood_pcie_init(KW_PCIE0); | ||
50 | |||
51 | return 0; | ||
52 | } | ||
53 | subsys_initcall(ts219_pci_init); | ||
diff --git a/arch/arm/mach-kirkwood/mpp.c b/arch/arm/mach-kirkwood/mpp.c index 827cde42414f..e96fd71abd76 100644 --- a/arch/arm/mach-kirkwood/mpp.c +++ b/arch/arm/mach-kirkwood/mpp.c | |||
@@ -22,9 +22,10 @@ static unsigned int __init kirkwood_variant(void) | |||
22 | 22 | ||
23 | kirkwood_pcie_id(&dev, &rev); | 23 | kirkwood_pcie_id(&dev, &rev); |
24 | 24 | ||
25 | if ((dev == MV88F6281_DEV_ID && rev >= MV88F6281_REV_A0) || | 25 | if (dev == MV88F6281_DEV_ID && rev >= MV88F6281_REV_A0) |
26 | (dev == MV88F6282_DEV_ID)) | ||
27 | return MPP_F6281_MASK; | 26 | return MPP_F6281_MASK; |
27 | if (dev == MV88F6282_DEV_ID) | ||
28 | return MPP_F6282_MASK; | ||
28 | if (dev == MV88F6192_DEV_ID && rev >= MV88F6192_REV_A0) | 29 | if (dev == MV88F6192_DEV_ID && rev >= MV88F6192_REV_A0) |
29 | return MPP_F6192_MASK; | 30 | return MPP_F6192_MASK; |
30 | if (dev == MV88F6180_DEV_ID) | 31 | if (dev == MV88F6180_DEV_ID) |
diff --git a/arch/arm/mach-mvebu/coherency_ll.S b/arch/arm/mach-mvebu/coherency_ll.S index 53e8391192cd..5476669ba905 100644 --- a/arch/arm/mach-mvebu/coherency_ll.S +++ b/arch/arm/mach-mvebu/coherency_ll.S | |||
@@ -32,15 +32,21 @@ ENTRY(ll_set_cpu_coherent) | |||
32 | 32 | ||
33 | /* Add CPU to SMP group - Atomic */ | 33 | /* Add CPU to SMP group - Atomic */ |
34 | add r3, r0, #ARMADA_XP_CFB_CTL_REG_OFFSET | 34 | add r3, r0, #ARMADA_XP_CFB_CTL_REG_OFFSET |
35 | ldr r2, [r3] | 35 | 1: |
36 | ldrex r2, [r3] | ||
36 | orr r2, r2, r1 | 37 | orr r2, r2, r1 |
37 | str r2, [r3] | 38 | strex r0, r2, [r3] |
39 | cmp r0, #0 | ||
40 | bne 1b | ||
38 | 41 | ||
39 | /* Enable coherency on CPU - Atomic */ | 42 | /* Enable coherency on CPU - Atomic */ |
40 | add r3, r0, #ARMADA_XP_CFB_CFG_REG_OFFSET | 43 | add r3, r3, #ARMADA_XP_CFB_CFG_REG_OFFSET |
41 | ldr r2, [r3] | 44 | 1: |
45 | ldrex r2, [r3] | ||
42 | orr r2, r2, r1 | 46 | orr r2, r2, r1 |
43 | str r2, [r3] | 47 | strex r0, r2, [r3] |
48 | cmp r0, #0 | ||
49 | bne 1b | ||
44 | 50 | ||
45 | dsb | 51 | dsb |
46 | 52 | ||
diff --git a/arch/arm/mach-omap2/clock36xx.c b/arch/arm/mach-omap2/clock36xx.c index 8f3bf4e50908..bbd6a3f717e6 100644 --- a/arch/arm/mach-omap2/clock36xx.c +++ b/arch/arm/mach-omap2/clock36xx.c | |||
@@ -20,11 +20,12 @@ | |||
20 | 20 | ||
21 | #include <linux/kernel.h> | 21 | #include <linux/kernel.h> |
22 | #include <linux/clk.h> | 22 | #include <linux/clk.h> |
23 | #include <linux/clk-provider.h> | ||
23 | #include <linux/io.h> | 24 | #include <linux/io.h> |
24 | 25 | ||
25 | #include "clock.h" | 26 | #include "clock.h" |
26 | #include "clock36xx.h" | 27 | #include "clock36xx.h" |
27 | 28 | #define to_clk_divider(_hw) container_of(_hw, struct clk_divider, hw) | |
28 | 29 | ||
29 | /** | 30 | /** |
30 | * omap36xx_pwrdn_clk_enable_with_hsdiv_restore - enable clocks suffering | 31 | * omap36xx_pwrdn_clk_enable_with_hsdiv_restore - enable clocks suffering |
@@ -39,29 +40,28 @@ | |||
39 | */ | 40 | */ |
40 | int omap36xx_pwrdn_clk_enable_with_hsdiv_restore(struct clk_hw *clk) | 41 | int omap36xx_pwrdn_clk_enable_with_hsdiv_restore(struct clk_hw *clk) |
41 | { | 42 | { |
42 | struct clk_hw_omap *parent; | 43 | struct clk_divider *parent; |
43 | struct clk_hw *parent_hw; | 44 | struct clk_hw *parent_hw; |
44 | u32 dummy_v, orig_v, clksel_shift; | 45 | u32 dummy_v, orig_v; |
45 | int ret; | 46 | int ret; |
46 | 47 | ||
47 | /* Clear PWRDN bit of HSDIVIDER */ | 48 | /* Clear PWRDN bit of HSDIVIDER */ |
48 | ret = omap2_dflt_clk_enable(clk); | 49 | ret = omap2_dflt_clk_enable(clk); |
49 | 50 | ||
50 | parent_hw = __clk_get_hw(__clk_get_parent(clk->clk)); | 51 | parent_hw = __clk_get_hw(__clk_get_parent(clk->clk)); |
51 | parent = to_clk_hw_omap(parent_hw); | 52 | parent = to_clk_divider(parent_hw); |
52 | 53 | ||
53 | /* Restore the dividers */ | 54 | /* Restore the dividers */ |
54 | if (!ret) { | 55 | if (!ret) { |
55 | clksel_shift = __ffs(parent->clksel_mask); | 56 | orig_v = __raw_readl(parent->reg); |
56 | orig_v = __raw_readl(parent->clksel_reg); | ||
57 | dummy_v = orig_v; | 57 | dummy_v = orig_v; |
58 | 58 | ||
59 | /* Write any other value different from the Read value */ | 59 | /* Write any other value different from the Read value */ |
60 | dummy_v ^= (1 << clksel_shift); | 60 | dummy_v ^= (1 << parent->shift); |
61 | __raw_writel(dummy_v, parent->clksel_reg); | 61 | __raw_writel(dummy_v, parent->reg); |
62 | 62 | ||
63 | /* Write the original divider */ | 63 | /* Write the original divider */ |
64 | __raw_writel(orig_v, parent->clksel_reg); | 64 | __raw_writel(orig_v, parent->reg); |
65 | } | 65 | } |
66 | 66 | ||
67 | return ret; | 67 | return ret; |
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c index 075f7cc51026..69337af748cc 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c | |||
@@ -2007,6 +2007,13 @@ static struct omap_hwmod am33xx_uart1_hwmod = { | |||
2007 | }, | 2007 | }, |
2008 | }; | 2008 | }; |
2009 | 2009 | ||
2010 | /* uart2 */ | ||
2011 | static struct omap_hwmod_dma_info uart2_edma_reqs[] = { | ||
2012 | { .name = "tx", .dma_req = 28, }, | ||
2013 | { .name = "rx", .dma_req = 29, }, | ||
2014 | { .dma_req = -1 } | ||
2015 | }; | ||
2016 | |||
2010 | static struct omap_hwmod_irq_info am33xx_uart2_irqs[] = { | 2017 | static struct omap_hwmod_irq_info am33xx_uart2_irqs[] = { |
2011 | { .irq = 73 + OMAP_INTC_START, }, | 2018 | { .irq = 73 + OMAP_INTC_START, }, |
2012 | { .irq = -1 }, | 2019 | { .irq = -1 }, |
@@ -2018,7 +2025,7 @@ static struct omap_hwmod am33xx_uart2_hwmod = { | |||
2018 | .clkdm_name = "l4ls_clkdm", | 2025 | .clkdm_name = "l4ls_clkdm", |
2019 | .flags = HWMOD_SWSUP_SIDLE_ACT, | 2026 | .flags = HWMOD_SWSUP_SIDLE_ACT, |
2020 | .mpu_irqs = am33xx_uart2_irqs, | 2027 | .mpu_irqs = am33xx_uart2_irqs, |
2021 | .sdma_reqs = uart1_edma_reqs, | 2028 | .sdma_reqs = uart2_edma_reqs, |
2022 | .main_clk = "dpll_per_m2_div4_ck", | 2029 | .main_clk = "dpll_per_m2_div4_ck", |
2023 | .prcm = { | 2030 | .prcm = { |
2024 | .omap4 = { | 2031 | .omap4 = { |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index c01859398b54..5a2d8034c8de 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -546,8 +546,10 @@ static void __init prcm_setup_regs(void) | |||
546 | /* Clear any pending PRCM interrupts */ | 546 | /* Clear any pending PRCM interrupts */ |
547 | omap2_prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); | 547 | omap2_prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); |
548 | 548 | ||
549 | if (omap3_has_iva()) | 549 | /* |
550 | omap3_iva_idle(); | 550 | * We need to idle iva2_pwrdm even on am3703 with no iva2. |
551 | */ | ||
552 | omap3_iva_idle(); | ||
551 | 553 | ||
552 | omap3_d2d_idle(); | 554 | omap3_d2d_idle(); |
553 | } | 555 | } |
diff --git a/arch/arm/mach-prima2/pm.c b/arch/arm/mach-prima2/pm.c index 9936c180bf01..8f595c0cc8d9 100644 --- a/arch/arm/mach-prima2/pm.c +++ b/arch/arm/mach-prima2/pm.c | |||
@@ -101,8 +101,10 @@ static int __init sirfsoc_of_pwrc_init(void) | |||
101 | struct device_node *np; | 101 | struct device_node *np; |
102 | 102 | ||
103 | np = of_find_matching_node(NULL, pwrc_ids); | 103 | np = of_find_matching_node(NULL, pwrc_ids); |
104 | if (!np) | 104 | if (!np) { |
105 | panic("unable to find compatible pwrc node in dtb\n"); | 105 | pr_err("unable to find compatible sirf pwrc node in dtb\n"); |
106 | return -ENOENT; | ||
107 | } | ||
106 | 108 | ||
107 | /* | 109 | /* |
108 | * pwrc behind rtciobrg is not located in memory space | 110 | * pwrc behind rtciobrg is not located in memory space |
diff --git a/arch/arm/mach-prima2/rstc.c b/arch/arm/mach-prima2/rstc.c index 435019ca0a48..d5e0cbc934c0 100644 --- a/arch/arm/mach-prima2/rstc.c +++ b/arch/arm/mach-prima2/rstc.c | |||
@@ -28,8 +28,10 @@ static int __init sirfsoc_of_rstc_init(void) | |||
28 | struct device_node *np; | 28 | struct device_node *np; |
29 | 29 | ||
30 | np = of_find_matching_node(NULL, rstc_ids); | 30 | np = of_find_matching_node(NULL, rstc_ids); |
31 | if (!np) | 31 | if (!np) { |
32 | panic("unable to find compatible rstc node in dtb\n"); | 32 | pr_err("unable to find compatible sirf rstc node in dtb\n"); |
33 | return -ENOENT; | ||
34 | } | ||
33 | 35 | ||
34 | sirfsoc_rstc_base = of_iomap(np, 0); | 36 | sirfsoc_rstc_base = of_iomap(np, 0); |
35 | if (!sirfsoc_rstc_base) | 37 | if (!sirfsoc_rstc_base) |
diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index fdf3894b1cc3..9696f3646864 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c | |||
@@ -252,7 +252,7 @@ static struct sh_timer_config cmt10_platform_data = { | |||
252 | .name = "CMT10", | 252 | .name = "CMT10", |
253 | .channel_offset = 0x10, | 253 | .channel_offset = 0x10, |
254 | .timer_bit = 0, | 254 | .timer_bit = 0, |
255 | .clockevent_rating = 125, | 255 | .clockevent_rating = 80, |
256 | .clocksource_rating = 125, | 256 | .clocksource_rating = 125, |
257 | }; | 257 | }; |
258 | 258 | ||
diff --git a/arch/arm/mach-ux500/board-mop500-regulators.c b/arch/arm/mach-ux500/board-mop500-regulators.c index 33c353bc1c4a..d6b7c8556fa1 100644 --- a/arch/arm/mach-ux500/board-mop500-regulators.c +++ b/arch/arm/mach-ux500/board-mop500-regulators.c | |||
@@ -374,6 +374,7 @@ static struct ab8500_regulator_reg_init ab8500_reg_init[] = { | |||
374 | static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | 374 | static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { |
375 | /* supplies to the display/camera */ | 375 | /* supplies to the display/camera */ |
376 | [AB8500_LDO_AUX1] = { | 376 | [AB8500_LDO_AUX1] = { |
377 | .supply_regulator = "ab8500-ext-supply3", | ||
377 | .constraints = { | 378 | .constraints = { |
378 | .name = "V-DISPLAY", | 379 | .name = "V-DISPLAY", |
379 | .min_uV = 2800000, | 380 | .min_uV = 2800000, |
@@ -387,6 +388,7 @@ static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
387 | }, | 388 | }, |
388 | /* supplies to the on-board eMMC */ | 389 | /* supplies to the on-board eMMC */ |
389 | [AB8500_LDO_AUX2] = { | 390 | [AB8500_LDO_AUX2] = { |
391 | .supply_regulator = "ab8500-ext-supply3", | ||
390 | .constraints = { | 392 | .constraints = { |
391 | .name = "V-eMMC1", | 393 | .name = "V-eMMC1", |
392 | .min_uV = 1100000, | 394 | .min_uV = 1100000, |
@@ -402,6 +404,7 @@ static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
402 | }, | 404 | }, |
403 | /* supply for VAUX3, supplies to SDcard slots */ | 405 | /* supply for VAUX3, supplies to SDcard slots */ |
404 | [AB8500_LDO_AUX3] = { | 406 | [AB8500_LDO_AUX3] = { |
407 | .supply_regulator = "ab8500-ext-supply3", | ||
405 | .constraints = { | 408 | .constraints = { |
406 | .name = "V-MMC-SD", | 409 | .name = "V-MMC-SD", |
407 | .min_uV = 1100000, | 410 | .min_uV = 1100000, |
diff --git a/arch/arm/mach-ux500/cpuidle.c b/arch/arm/mach-ux500/cpuidle.c index 317a2be129fb..a45dd09daed9 100644 --- a/arch/arm/mach-ux500/cpuidle.c +++ b/arch/arm/mach-ux500/cpuidle.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <asm/proc-fns.h> | 21 | #include <asm/proc-fns.h> |
22 | 22 | ||
23 | #include "db8500-regs.h" | 23 | #include "db8500-regs.h" |
24 | #include "id.h" | ||
24 | 25 | ||
25 | static atomic_t master = ATOMIC_INIT(0); | 26 | static atomic_t master = ATOMIC_INIT(0); |
26 | static DEFINE_SPINLOCK(master_lock); | 27 | static DEFINE_SPINLOCK(master_lock); |
@@ -114,6 +115,9 @@ static struct cpuidle_driver ux500_idle_driver = { | |||
114 | 115 | ||
115 | int __init ux500_idle_init(void) | 116 | int __init ux500_idle_init(void) |
116 | { | 117 | { |
118 | if (!(cpu_is_u8500_family() || cpu_is_ux540_family())) | ||
119 | return -ENODEV; | ||
120 | |||
117 | /* Configure wake up reasons */ | 121 | /* Configure wake up reasons */ |
118 | prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) | | 122 | prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) | |
119 | PRCMU_WAKEUP(ABB)); | 123 | PRCMU_WAKEUP(ABB)); |
diff --git a/arch/arm/plat-samsung/include/plat/uncompress.h b/arch/arm/plat-samsung/include/plat/uncompress.h index 438b24846e7f..02b66d723d1a 100644 --- a/arch/arm/plat-samsung/include/plat/uncompress.h +++ b/arch/arm/plat-samsung/include/plat/uncompress.h | |||
@@ -66,6 +66,9 @@ uart_rd(unsigned int reg) | |||
66 | 66 | ||
67 | static void putc(int ch) | 67 | static void putc(int ch) |
68 | { | 68 | { |
69 | if (!config_enabled(CONFIG_DEBUG_LL)) | ||
70 | return; | ||
71 | |||
69 | if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) { | 72 | if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) { |
70 | int level; | 73 | int level; |
71 | 74 | ||
@@ -118,7 +121,12 @@ static void arch_decomp_error(const char *x) | |||
118 | #ifdef CONFIG_S3C_BOOT_UART_FORCE_FIFO | 121 | #ifdef CONFIG_S3C_BOOT_UART_FORCE_FIFO |
119 | static inline void arch_enable_uart_fifo(void) | 122 | static inline void arch_enable_uart_fifo(void) |
120 | { | 123 | { |
121 | u32 fifocon = uart_rd(S3C2410_UFCON); | 124 | u32 fifocon; |
125 | |||
126 | if (!config_enabled(CONFIG_DEBUG_LL)) | ||
127 | return; | ||
128 | |||
129 | fifocon = uart_rd(S3C2410_UFCON); | ||
122 | 130 | ||
123 | if (!(fifocon & S3C2410_UFCON_FIFOMODE)) { | 131 | if (!(fifocon & S3C2410_UFCON_FIFOMODE)) { |
124 | fifocon |= S3C2410_UFCON_RESETBOTH; | 132 | fifocon |= S3C2410_UFCON_RESETBOTH; |
diff --git a/arch/arm/plat-samsung/pm.c b/arch/arm/plat-samsung/pm.c index 53210ec4e8ec..bd7124c87fea 100644 --- a/arch/arm/plat-samsung/pm.c +++ b/arch/arm/plat-samsung/pm.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/suspend.h> | 16 | #include <linux/suspend.h> |
17 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
19 | #include <linux/of.h> | ||
19 | #include <linux/serial_core.h> | 20 | #include <linux/serial_core.h> |
20 | #include <linux/io.h> | 21 | #include <linux/io.h> |
21 | 22 | ||
@@ -261,7 +262,8 @@ static int s3c_pm_enter(suspend_state_t state) | |||
261 | * require a full power-cycle) | 262 | * require a full power-cycle) |
262 | */ | 263 | */ |
263 | 264 | ||
264 | if (!any_allowed(s3c_irqwake_intmask, s3c_irqwake_intallow) && | 265 | if (!of_have_populated_dt() && |
266 | !any_allowed(s3c_irqwake_intmask, s3c_irqwake_intallow) && | ||
265 | !any_allowed(s3c_irqwake_eintmask, s3c_irqwake_eintallow)) { | 267 | !any_allowed(s3c_irqwake_eintmask, s3c_irqwake_eintallow)) { |
266 | printk(KERN_ERR "%s: No wake-up sources!\n", __func__); | 268 | printk(KERN_ERR "%s: No wake-up sources!\n", __func__); |
267 | printk(KERN_ERR "%s: Aborting sleep\n", __func__); | 269 | printk(KERN_ERR "%s: Aborting sleep\n", __func__); |
@@ -270,8 +272,11 @@ static int s3c_pm_enter(suspend_state_t state) | |||
270 | 272 | ||
271 | /* save all necessary core registers not covered by the drivers */ | 273 | /* save all necessary core registers not covered by the drivers */ |
272 | 274 | ||
273 | samsung_pm_save_gpios(); | 275 | if (!of_have_populated_dt()) { |
274 | samsung_pm_saved_gpios(); | 276 | samsung_pm_save_gpios(); |
277 | samsung_pm_saved_gpios(); | ||
278 | } | ||
279 | |||
275 | s3c_pm_save_uarts(); | 280 | s3c_pm_save_uarts(); |
276 | s3c_pm_save_core(); | 281 | s3c_pm_save_core(); |
277 | 282 | ||
@@ -310,8 +315,11 @@ static int s3c_pm_enter(suspend_state_t state) | |||
310 | 315 | ||
311 | s3c_pm_restore_core(); | 316 | s3c_pm_restore_core(); |
312 | s3c_pm_restore_uarts(); | 317 | s3c_pm_restore_uarts(); |
313 | samsung_pm_restore_gpios(); | 318 | |
314 | s3c_pm_restored_gpios(); | 319 | if (!of_have_populated_dt()) { |
320 | samsung_pm_restore_gpios(); | ||
321 | s3c_pm_restored_gpios(); | ||
322 | } | ||
315 | 323 | ||
316 | s3c_pm_debug_init(); | 324 | s3c_pm_debug_init(); |
317 | 325 | ||
diff --git a/arch/m68k/include/asm/gpio.h b/arch/m68k/include/asm/gpio.h index 8cc83431805b..2f6eec1e34b4 100644 --- a/arch/m68k/include/asm/gpio.h +++ b/arch/m68k/include/asm/gpio.h | |||
@@ -86,6 +86,7 @@ static inline int gpio_cansleep(unsigned gpio) | |||
86 | return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio); | 86 | return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio); |
87 | } | 87 | } |
88 | 88 | ||
89 | #ifndef CONFIG_GPIOLIB | ||
89 | static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) | 90 | static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) |
90 | { | 91 | { |
91 | int err; | 92 | int err; |
@@ -105,5 +106,5 @@ static inline int gpio_request_one(unsigned gpio, unsigned long flags, const cha | |||
105 | 106 | ||
106 | return err; | 107 | return err; |
107 | } | 108 | } |
108 | 109 | #endif /* !CONFIG_GPIOLIB */ | |
109 | #endif | 110 | #endif |
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c index b0baa299f899..01b1b3f94feb 100644 --- a/arch/mips/cavium-octeon/setup.c +++ b/arch/mips/cavium-octeon/setup.c | |||
@@ -428,13 +428,16 @@ static void octeon_restart(char *command) | |||
428 | */ | 428 | */ |
429 | static void octeon_kill_core(void *arg) | 429 | static void octeon_kill_core(void *arg) |
430 | { | 430 | { |
431 | mb(); | 431 | if (octeon_is_simulation()) |
432 | if (octeon_is_simulation()) { | ||
433 | /* The simulator needs the watchdog to stop for dead cores */ | ||
434 | cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0); | ||
435 | /* A break instruction causes the simulator stop a core */ | 432 | /* A break instruction causes the simulator stop a core */ |
436 | asm volatile ("sync\nbreak"); | 433 | asm volatile ("break" ::: "memory"); |
437 | } | 434 | |
435 | local_irq_disable(); | ||
436 | /* Disable watchdog on this core. */ | ||
437 | cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0); | ||
438 | /* Spin in a low power mode. */ | ||
439 | while (true) | ||
440 | asm volatile ("wait" ::: "memory"); | ||
438 | } | 441 | } |
439 | 442 | ||
440 | 443 | ||
diff --git a/arch/mips/include/asm/mmu_context.h b/arch/mips/include/asm/mmu_context.h index 820116067c10..516e6e9a5594 100644 --- a/arch/mips/include/asm/mmu_context.h +++ b/arch/mips/include/asm/mmu_context.h | |||
@@ -117,7 +117,7 @@ get_new_mmu_context(struct mm_struct *mm, unsigned long cpu) | |||
117 | if (! ((asid += ASID_INC) & ASID_MASK) ) { | 117 | if (! ((asid += ASID_INC) & ASID_MASK) ) { |
118 | if (cpu_has_vtag_icache) | 118 | if (cpu_has_vtag_icache) |
119 | flush_icache_all(); | 119 | flush_icache_all(); |
120 | #ifdef CONFIG_VIRTUALIZATION | 120 | #ifdef CONFIG_KVM |
121 | kvm_local_flush_tlb_all(); /* start new asid cycle */ | 121 | kvm_local_flush_tlb_all(); /* start new asid cycle */ |
122 | #else | 122 | #else |
123 | local_flush_tlb_all(); /* start new asid cycle */ | 123 | local_flush_tlb_all(); /* start new asid cycle */ |
diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h index a3186f2bb8a0..5e6cd0947393 100644 --- a/arch/mips/include/asm/ptrace.h +++ b/arch/mips/include/asm/ptrace.h | |||
@@ -16,6 +16,38 @@ | |||
16 | #include <asm/isadep.h> | 16 | #include <asm/isadep.h> |
17 | #include <uapi/asm/ptrace.h> | 17 | #include <uapi/asm/ptrace.h> |
18 | 18 | ||
19 | /* | ||
20 | * This struct defines the way the registers are stored on the stack during a | ||
21 | * system call/exception. As usual the registers k0/k1 aren't being saved. | ||
22 | */ | ||
23 | struct pt_regs { | ||
24 | #ifdef CONFIG_32BIT | ||
25 | /* Pad bytes for argument save space on the stack. */ | ||
26 | unsigned long pad0[6]; | ||
27 | #endif | ||
28 | |||
29 | /* Saved main processor registers. */ | ||
30 | unsigned long regs[32]; | ||
31 | |||
32 | /* Saved special registers. */ | ||
33 | unsigned long cp0_status; | ||
34 | unsigned long hi; | ||
35 | unsigned long lo; | ||
36 | #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||
37 | unsigned long acx; | ||
38 | #endif | ||
39 | unsigned long cp0_badvaddr; | ||
40 | unsigned long cp0_cause; | ||
41 | unsigned long cp0_epc; | ||
42 | #ifdef CONFIG_MIPS_MT_SMTC | ||
43 | unsigned long cp0_tcstatus; | ||
44 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
45 | #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||
46 | unsigned long long mpl[3]; /* MTM{0,1,2} */ | ||
47 | unsigned long long mtp[3]; /* MTP{0,1,2} */ | ||
48 | #endif | ||
49 | } __aligned(8); | ||
50 | |||
19 | struct task_struct; | 51 | struct task_struct; |
20 | 52 | ||
21 | extern int ptrace_getregs(struct task_struct *child, __s64 __user *data); | 53 | extern int ptrace_getregs(struct task_struct *child, __s64 __user *data); |
diff --git a/arch/mips/include/uapi/asm/kvm.h b/arch/mips/include/uapi/asm/kvm.h index 3f424f5217da..f09ff5ae2059 100644 --- a/arch/mips/include/uapi/asm/kvm.h +++ b/arch/mips/include/uapi/asm/kvm.h | |||
@@ -58,56 +58,53 @@ struct kvm_fpu { | |||
58 | * bits[2..0] - Register 'sel' index. | 58 | * bits[2..0] - Register 'sel' index. |
59 | * bits[7..3] - Register 'rd' index. | 59 | * bits[7..3] - Register 'rd' index. |
60 | * bits[15..8] - Must be zero. | 60 | * bits[15..8] - Must be zero. |
61 | * bits[63..16] - 1 -> CP0 registers. | 61 | * bits[31..16] - 1 -> CP0 registers. |
62 | * bits[51..32] - Must be zero. | ||
63 | * bits[63..52] - As per linux/kvm.h | ||
62 | * | 64 | * |
63 | * Other sets registers may be added in the future. Each set would | 65 | * Other sets registers may be added in the future. Each set would |
64 | * have its own identifier in bits[63..16]. | 66 | * have its own identifier in bits[31..16]. |
65 | * | ||
66 | * The addr field of struct kvm_one_reg must point to an aligned | ||
67 | * 64-bit wide location. For registers that are narrower than | ||
68 | * 64-bits, the value is stored in the low order bits of the location, | ||
69 | * and sign extended to 64-bits. | ||
70 | * | 67 | * |
71 | * The registers defined in struct kvm_regs are also accessible, the | 68 | * The registers defined in struct kvm_regs are also accessible, the |
72 | * id values for these are below. | 69 | * id values for these are below. |
73 | */ | 70 | */ |
74 | 71 | ||
75 | #define KVM_REG_MIPS_R0 0 | 72 | #define KVM_REG_MIPS_R0 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 0) |
76 | #define KVM_REG_MIPS_R1 1 | 73 | #define KVM_REG_MIPS_R1 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 1) |
77 | #define KVM_REG_MIPS_R2 2 | 74 | #define KVM_REG_MIPS_R2 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 2) |
78 | #define KVM_REG_MIPS_R3 3 | 75 | #define KVM_REG_MIPS_R3 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 3) |
79 | #define KVM_REG_MIPS_R4 4 | 76 | #define KVM_REG_MIPS_R4 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 4) |
80 | #define KVM_REG_MIPS_R5 5 | 77 | #define KVM_REG_MIPS_R5 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 5) |
81 | #define KVM_REG_MIPS_R6 6 | 78 | #define KVM_REG_MIPS_R6 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 6) |
82 | #define KVM_REG_MIPS_R7 7 | 79 | #define KVM_REG_MIPS_R7 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 7) |
83 | #define KVM_REG_MIPS_R8 8 | 80 | #define KVM_REG_MIPS_R8 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 8) |
84 | #define KVM_REG_MIPS_R9 9 | 81 | #define KVM_REG_MIPS_R9 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 9) |
85 | #define KVM_REG_MIPS_R10 10 | 82 | #define KVM_REG_MIPS_R10 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 10) |
86 | #define KVM_REG_MIPS_R11 11 | 83 | #define KVM_REG_MIPS_R11 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 11) |
87 | #define KVM_REG_MIPS_R12 12 | 84 | #define KVM_REG_MIPS_R12 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 12) |
88 | #define KVM_REG_MIPS_R13 13 | 85 | #define KVM_REG_MIPS_R13 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 13) |
89 | #define KVM_REG_MIPS_R14 14 | 86 | #define KVM_REG_MIPS_R14 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 14) |
90 | #define KVM_REG_MIPS_R15 15 | 87 | #define KVM_REG_MIPS_R15 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 15) |
91 | #define KVM_REG_MIPS_R16 16 | 88 | #define KVM_REG_MIPS_R16 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 16) |
92 | #define KVM_REG_MIPS_R17 17 | 89 | #define KVM_REG_MIPS_R17 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 17) |
93 | #define KVM_REG_MIPS_R18 18 | 90 | #define KVM_REG_MIPS_R18 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 18) |
94 | #define KVM_REG_MIPS_R19 19 | 91 | #define KVM_REG_MIPS_R19 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 19) |
95 | #define KVM_REG_MIPS_R20 20 | 92 | #define KVM_REG_MIPS_R20 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 20) |
96 | #define KVM_REG_MIPS_R21 21 | 93 | #define KVM_REG_MIPS_R21 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 21) |
97 | #define KVM_REG_MIPS_R22 22 | 94 | #define KVM_REG_MIPS_R22 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 22) |
98 | #define KVM_REG_MIPS_R23 23 | 95 | #define KVM_REG_MIPS_R23 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 23) |
99 | #define KVM_REG_MIPS_R24 24 | 96 | #define KVM_REG_MIPS_R24 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 24) |
100 | #define KVM_REG_MIPS_R25 25 | 97 | #define KVM_REG_MIPS_R25 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 25) |
101 | #define KVM_REG_MIPS_R26 26 | 98 | #define KVM_REG_MIPS_R26 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 26) |
102 | #define KVM_REG_MIPS_R27 27 | 99 | #define KVM_REG_MIPS_R27 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 27) |
103 | #define KVM_REG_MIPS_R28 28 | 100 | #define KVM_REG_MIPS_R28 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 28) |
104 | #define KVM_REG_MIPS_R29 29 | 101 | #define KVM_REG_MIPS_R29 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 29) |
105 | #define KVM_REG_MIPS_R30 30 | 102 | #define KVM_REG_MIPS_R30 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 30) |
106 | #define KVM_REG_MIPS_R31 31 | 103 | #define KVM_REG_MIPS_R31 (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 31) |
107 | 104 | ||
108 | #define KVM_REG_MIPS_HI 32 | 105 | #define KVM_REG_MIPS_HI (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 32) |
109 | #define KVM_REG_MIPS_LO 33 | 106 | #define KVM_REG_MIPS_LO (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 33) |
110 | #define KVM_REG_MIPS_PC 34 | 107 | #define KVM_REG_MIPS_PC (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 34) |
111 | 108 | ||
112 | /* | 109 | /* |
113 | * KVM MIPS specific structures and definitions | 110 | * KVM MIPS specific structures and definitions |
diff --git a/arch/mips/include/uapi/asm/ptrace.h b/arch/mips/include/uapi/asm/ptrace.h index 4d58d8468705..b26f7e317279 100644 --- a/arch/mips/include/uapi/asm/ptrace.h +++ b/arch/mips/include/uapi/asm/ptrace.h | |||
@@ -22,16 +22,12 @@ | |||
22 | #define DSP_CONTROL 77 | 22 | #define DSP_CONTROL 77 |
23 | #define ACX 78 | 23 | #define ACX 78 |
24 | 24 | ||
25 | #ifndef __KERNEL__ | ||
25 | /* | 26 | /* |
26 | * This struct defines the way the registers are stored on the stack during a | 27 | * This struct defines the way the registers are stored on the stack during a |
27 | * system call/exception. As usual the registers k0/k1 aren't being saved. | 28 | * system call/exception. As usual the registers k0/k1 aren't being saved. |
28 | */ | 29 | */ |
29 | struct pt_regs { | 30 | struct pt_regs { |
30 | #ifdef CONFIG_32BIT | ||
31 | /* Pad bytes for argument save space on the stack. */ | ||
32 | unsigned long pad0[6]; | ||
33 | #endif | ||
34 | |||
35 | /* Saved main processor registers. */ | 31 | /* Saved main processor registers. */ |
36 | unsigned long regs[32]; | 32 | unsigned long regs[32]; |
37 | 33 | ||
@@ -39,20 +35,11 @@ struct pt_regs { | |||
39 | unsigned long cp0_status; | 35 | unsigned long cp0_status; |
40 | unsigned long hi; | 36 | unsigned long hi; |
41 | unsigned long lo; | 37 | unsigned long lo; |
42 | #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||
43 | unsigned long acx; | ||
44 | #endif | ||
45 | unsigned long cp0_badvaddr; | 38 | unsigned long cp0_badvaddr; |
46 | unsigned long cp0_cause; | 39 | unsigned long cp0_cause; |
47 | unsigned long cp0_epc; | 40 | unsigned long cp0_epc; |
48 | #ifdef CONFIG_MIPS_MT_SMTC | ||
49 | unsigned long cp0_tcstatus; | ||
50 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
51 | #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||
52 | unsigned long long mpl[3]; /* MTM{0,1,2} */ | ||
53 | unsigned long long mtp[3]; /* MTP{0,1,2} */ | ||
54 | #endif | ||
55 | } __attribute__ ((aligned (8))); | 41 | } __attribute__ ((aligned (8))); |
42 | #endif /* __KERNEL__ */ | ||
56 | 43 | ||
57 | /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ | 44 | /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ |
58 | #define PTRACE_GETREGS 12 | 45 | #define PTRACE_GETREGS 12 |
diff --git a/arch/mips/kernel/binfmt_elfn32.c b/arch/mips/kernel/binfmt_elfn32.c index e06f777e9c49..1188e00bb120 100644 --- a/arch/mips/kernel/binfmt_elfn32.c +++ b/arch/mips/kernel/binfmt_elfn32.c | |||
@@ -119,4 +119,15 @@ MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)"); | |||
119 | #undef TASK_SIZE | 119 | #undef TASK_SIZE |
120 | #define TASK_SIZE TASK_SIZE32 | 120 | #define TASK_SIZE TASK_SIZE32 |
121 | 121 | ||
122 | #undef cputime_to_timeval | ||
123 | #define cputime_to_timeval cputime_to_compat_timeval | ||
124 | static __inline__ void | ||
125 | cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value) | ||
126 | { | ||
127 | unsigned long jiffies = cputime_to_jiffies(cputime); | ||
128 | |||
129 | value->tv_usec = (jiffies % HZ) * (1000000L / HZ); | ||
130 | value->tv_sec = jiffies / HZ; | ||
131 | } | ||
132 | |||
122 | #include "../../../fs/binfmt_elf.c" | 133 | #include "../../../fs/binfmt_elf.c" |
diff --git a/arch/mips/kernel/binfmt_elfo32.c b/arch/mips/kernel/binfmt_elfo32.c index 97c5a1668e53..202e581e6096 100644 --- a/arch/mips/kernel/binfmt_elfo32.c +++ b/arch/mips/kernel/binfmt_elfo32.c | |||
@@ -162,4 +162,15 @@ MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)"); | |||
162 | #undef TASK_SIZE | 162 | #undef TASK_SIZE |
163 | #define TASK_SIZE TASK_SIZE32 | 163 | #define TASK_SIZE TASK_SIZE32 |
164 | 164 | ||
165 | #undef cputime_to_timeval | ||
166 | #define cputime_to_timeval cputime_to_compat_timeval | ||
167 | static __inline__ void | ||
168 | cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value) | ||
169 | { | ||
170 | unsigned long jiffies = cputime_to_jiffies(cputime); | ||
171 | |||
172 | value->tv_usec = (jiffies % HZ) * (1000000L / HZ); | ||
173 | value->tv_sec = jiffies / HZ; | ||
174 | } | ||
175 | |||
165 | #include "../../../fs/binfmt_elf.c" | 176 | #include "../../../fs/binfmt_elf.c" |
diff --git a/arch/mips/kernel/ftrace.c b/arch/mips/kernel/ftrace.c index cf5509f13dd5..dba90ec0dc38 100644 --- a/arch/mips/kernel/ftrace.c +++ b/arch/mips/kernel/ftrace.c | |||
@@ -25,12 +25,16 @@ | |||
25 | #define MCOUNT_OFFSET_INSNS 4 | 25 | #define MCOUNT_OFFSET_INSNS 4 |
26 | #endif | 26 | #endif |
27 | 27 | ||
28 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
29 | |||
28 | /* Arch override because MIPS doesn't need to run this from stop_machine() */ | 30 | /* Arch override because MIPS doesn't need to run this from stop_machine() */ |
29 | void arch_ftrace_update_code(int command) | 31 | void arch_ftrace_update_code(int command) |
30 | { | 32 | { |
31 | ftrace_modify_all_code(command); | 33 | ftrace_modify_all_code(command); |
32 | } | 34 | } |
33 | 35 | ||
36 | #endif | ||
37 | |||
34 | /* | 38 | /* |
35 | * Check if the address is in kernel space | 39 | * Check if the address is in kernel space |
36 | * | 40 | * |
diff --git a/arch/mips/kernel/idle.c b/arch/mips/kernel/idle.c index 3b09b888afa9..0c655deeea4a 100644 --- a/arch/mips/kernel/idle.c +++ b/arch/mips/kernel/idle.c | |||
@@ -93,26 +93,27 @@ static void rm7k_wait_irqoff(void) | |||
93 | } | 93 | } |
94 | 94 | ||
95 | /* | 95 | /* |
96 | * The Au1xxx wait is available only if using 32khz counter or | 96 | * Au1 'wait' is only useful when the 32kHz counter is used as timer, |
97 | * external timer source, but specifically not CP0 Counter. | 97 | * since coreclock (and the cp0 counter) stops upon executing it. Only an |
98 | * alchemy/common/time.c may override cpu_wait! | 98 | * interrupt can wake it, so they must be enabled before entering idle modes. |
99 | */ | 99 | */ |
100 | static void au1k_wait(void) | 100 | static void au1k_wait(void) |
101 | { | 101 | { |
102 | unsigned long c0status = read_c0_status() | 1; /* irqs on */ | ||
103 | |||
102 | __asm__( | 104 | __asm__( |
103 | " .set mips3 \n" | 105 | " .set mips3 \n" |
104 | " cache 0x14, 0(%0) \n" | 106 | " cache 0x14, 0(%0) \n" |
105 | " cache 0x14, 32(%0) \n" | 107 | " cache 0x14, 32(%0) \n" |
106 | " sync \n" | 108 | " sync \n" |
107 | " nop \n" | 109 | " mtc0 %1, $12 \n" /* wr c0status */ |
108 | " wait \n" | 110 | " wait \n" |
109 | " nop \n" | 111 | " nop \n" |
110 | " nop \n" | 112 | " nop \n" |
111 | " nop \n" | 113 | " nop \n" |
112 | " nop \n" | 114 | " nop \n" |
113 | " .set mips0 \n" | 115 | " .set mips0 \n" |
114 | : : "r" (au1k_wait)); | 116 | : : "r" (au1k_wait), "r" (c0status)); |
115 | local_irq_enable(); | ||
116 | } | 117 | } |
117 | 118 | ||
118 | static int __initdata nowait; | 119 | static int __initdata nowait; |
diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c index 93c070b41b0d..6fa198db8999 100644 --- a/arch/mips/kernel/rtlx.c +++ b/arch/mips/kernel/rtlx.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <asm/processor.h> | 40 | #include <asm/processor.h> |
41 | #include <asm/vpe.h> | 41 | #include <asm/vpe.h> |
42 | #include <asm/rtlx.h> | 42 | #include <asm/rtlx.h> |
43 | #include <asm/setup.h> | ||
43 | 44 | ||
44 | static struct rtlx_info *rtlx; | 45 | static struct rtlx_info *rtlx; |
45 | static int major; | 46 | static int major; |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index e3be67012d78..a75ae40184aa 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -897,22 +897,24 @@ out_sigsegv: | |||
897 | 897 | ||
898 | asmlinkage void do_tr(struct pt_regs *regs) | 898 | asmlinkage void do_tr(struct pt_regs *regs) |
899 | { | 899 | { |
900 | unsigned int opcode, tcode = 0; | 900 | u32 opcode, tcode = 0; |
901 | u16 instr[2]; | 901 | u16 instr[2]; |
902 | unsigned long epc = exception_epc(regs); | 902 | unsigned long epc = msk_isa16_mode(exception_epc(regs)); |
903 | 903 | ||
904 | if ((__get_user(instr[0], (u16 __user *)msk_isa16_mode(epc))) || | 904 | if (get_isa16_mode(regs->cp0_epc)) { |
905 | (__get_user(instr[1], (u16 __user *)msk_isa16_mode(epc + 2)))) | 905 | if (__get_user(instr[0], (u16 __user *)(epc + 0)) || |
906 | __get_user(instr[1], (u16 __user *)(epc + 2))) | ||
906 | goto out_sigsegv; | 907 | goto out_sigsegv; |
907 | opcode = (instr[0] << 16) | instr[1]; | 908 | opcode = (instr[0] << 16) | instr[1]; |
908 | 909 | /* Immediate versions don't provide a code. */ | |
909 | /* Immediate versions don't provide a code. */ | 910 | if (!(opcode & OPCODE)) |
910 | if (!(opcode & OPCODE)) { | 911 | tcode = (opcode >> 12) & ((1 << 4) - 1); |
911 | if (get_isa16_mode(regs->cp0_epc)) | 912 | } else { |
912 | /* microMIPS */ | 913 | if (__get_user(opcode, (u32 __user *)epc)) |
913 | tcode = (opcode >> 12) & 0x1f; | 914 | goto out_sigsegv; |
914 | else | 915 | /* Immediate versions don't provide a code. */ |
915 | tcode = ((opcode >> 6) & ((1 << 10) - 1)); | 916 | if (!(opcode & OPCODE)) |
917 | tcode = (opcode >> 6) & ((1 << 10) - 1); | ||
916 | } | 918 | } |
917 | 919 | ||
918 | do_trap_or_bp(regs, tcode, "Trap"); | 920 | do_trap_or_bp(regs, tcode, "Trap"); |
diff --git a/arch/mips/kvm/kvm_mips.c b/arch/mips/kvm/kvm_mips.c index d934b017f479..dd203e59e6fd 100644 --- a/arch/mips/kvm/kvm_mips.c +++ b/arch/mips/kvm/kvm_mips.c | |||
@@ -485,29 +485,35 @@ kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, | |||
485 | return -ENOIOCTLCMD; | 485 | return -ENOIOCTLCMD; |
486 | } | 486 | } |
487 | 487 | ||
488 | #define KVM_REG_MIPS_CP0_INDEX (0x10000 + 8 * 0 + 0) | 488 | #define MIPS_CP0_32(_R, _S) \ |
489 | #define KVM_REG_MIPS_CP0_ENTRYLO0 (0x10000 + 8 * 2 + 0) | 489 | (KVM_REG_MIPS | KVM_REG_SIZE_U32 | 0x10000 | (8 * (_R) + (_S))) |
490 | #define KVM_REG_MIPS_CP0_ENTRYLO1 (0x10000 + 8 * 3 + 0) | 490 | |
491 | #define KVM_REG_MIPS_CP0_CONTEXT (0x10000 + 8 * 4 + 0) | 491 | #define MIPS_CP0_64(_R, _S) \ |
492 | #define KVM_REG_MIPS_CP0_USERLOCAL (0x10000 + 8 * 4 + 2) | 492 | (KVM_REG_MIPS | KVM_REG_SIZE_U64 | 0x10000 | (8 * (_R) + (_S))) |
493 | #define KVM_REG_MIPS_CP0_PAGEMASK (0x10000 + 8 * 5 + 0) | 493 | |
494 | #define KVM_REG_MIPS_CP0_PAGEGRAIN (0x10000 + 8 * 5 + 1) | 494 | #define KVM_REG_MIPS_CP0_INDEX MIPS_CP0_32(0, 0) |
495 | #define KVM_REG_MIPS_CP0_WIRED (0x10000 + 8 * 6 + 0) | 495 | #define KVM_REG_MIPS_CP0_ENTRYLO0 MIPS_CP0_64(2, 0) |
496 | #define KVM_REG_MIPS_CP0_HWRENA (0x10000 + 8 * 7 + 0) | 496 | #define KVM_REG_MIPS_CP0_ENTRYLO1 MIPS_CP0_64(3, 0) |
497 | #define KVM_REG_MIPS_CP0_BADVADDR (0x10000 + 8 * 8 + 0) | 497 | #define KVM_REG_MIPS_CP0_CONTEXT MIPS_CP0_64(4, 0) |
498 | #define KVM_REG_MIPS_CP0_COUNT (0x10000 + 8 * 9 + 0) | 498 | #define KVM_REG_MIPS_CP0_USERLOCAL MIPS_CP0_64(4, 2) |
499 | #define KVM_REG_MIPS_CP0_ENTRYHI (0x10000 + 8 * 10 + 0) | 499 | #define KVM_REG_MIPS_CP0_PAGEMASK MIPS_CP0_32(5, 0) |
500 | #define KVM_REG_MIPS_CP0_COMPARE (0x10000 + 8 * 11 + 0) | 500 | #define KVM_REG_MIPS_CP0_PAGEGRAIN MIPS_CP0_32(5, 1) |
501 | #define KVM_REG_MIPS_CP0_STATUS (0x10000 + 8 * 12 + 0) | 501 | #define KVM_REG_MIPS_CP0_WIRED MIPS_CP0_32(6, 0) |
502 | #define KVM_REG_MIPS_CP0_CAUSE (0x10000 + 8 * 13 + 0) | 502 | #define KVM_REG_MIPS_CP0_HWRENA MIPS_CP0_32(7, 0) |
503 | #define KVM_REG_MIPS_CP0_EBASE (0x10000 + 8 * 15 + 1) | 503 | #define KVM_REG_MIPS_CP0_BADVADDR MIPS_CP0_64(8, 0) |
504 | #define KVM_REG_MIPS_CP0_CONFIG (0x10000 + 8 * 16 + 0) | 504 | #define KVM_REG_MIPS_CP0_COUNT MIPS_CP0_32(9, 0) |
505 | #define KVM_REG_MIPS_CP0_CONFIG1 (0x10000 + 8 * 16 + 1) | 505 | #define KVM_REG_MIPS_CP0_ENTRYHI MIPS_CP0_64(10, 0) |
506 | #define KVM_REG_MIPS_CP0_CONFIG2 (0x10000 + 8 * 16 + 2) | 506 | #define KVM_REG_MIPS_CP0_COMPARE MIPS_CP0_32(11, 0) |
507 | #define KVM_REG_MIPS_CP0_CONFIG3 (0x10000 + 8 * 16 + 3) | 507 | #define KVM_REG_MIPS_CP0_STATUS MIPS_CP0_32(12, 0) |
508 | #define KVM_REG_MIPS_CP0_CONFIG7 (0x10000 + 8 * 16 + 7) | 508 | #define KVM_REG_MIPS_CP0_CAUSE MIPS_CP0_32(13, 0) |
509 | #define KVM_REG_MIPS_CP0_XCONTEXT (0x10000 + 8 * 20 + 0) | 509 | #define KVM_REG_MIPS_CP0_EBASE MIPS_CP0_64(15, 1) |
510 | #define KVM_REG_MIPS_CP0_ERROREPC (0x10000 + 8 * 30 + 0) | 510 | #define KVM_REG_MIPS_CP0_CONFIG MIPS_CP0_32(16, 0) |
511 | #define KVM_REG_MIPS_CP0_CONFIG1 MIPS_CP0_32(16, 1) | ||
512 | #define KVM_REG_MIPS_CP0_CONFIG2 MIPS_CP0_32(16, 2) | ||
513 | #define KVM_REG_MIPS_CP0_CONFIG3 MIPS_CP0_32(16, 3) | ||
514 | #define KVM_REG_MIPS_CP0_CONFIG7 MIPS_CP0_32(16, 7) | ||
515 | #define KVM_REG_MIPS_CP0_XCONTEXT MIPS_CP0_64(20, 0) | ||
516 | #define KVM_REG_MIPS_CP0_ERROREPC MIPS_CP0_64(30, 0) | ||
511 | 517 | ||
512 | static u64 kvm_mips_get_one_regs[] = { | 518 | static u64 kvm_mips_get_one_regs[] = { |
513 | KVM_REG_MIPS_R0, | 519 | KVM_REG_MIPS_R0, |
@@ -567,8 +573,6 @@ static u64 kvm_mips_get_one_regs[] = { | |||
567 | static int kvm_mips_get_reg(struct kvm_vcpu *vcpu, | 573 | static int kvm_mips_get_reg(struct kvm_vcpu *vcpu, |
568 | const struct kvm_one_reg *reg) | 574 | const struct kvm_one_reg *reg) |
569 | { | 575 | { |
570 | u64 __user *uaddr = (u64 __user *)(long)reg->addr; | ||
571 | |||
572 | struct mips_coproc *cop0 = vcpu->arch.cop0; | 576 | struct mips_coproc *cop0 = vcpu->arch.cop0; |
573 | s64 v; | 577 | s64 v; |
574 | 578 | ||
@@ -631,18 +635,39 @@ static int kvm_mips_get_reg(struct kvm_vcpu *vcpu, | |||
631 | default: | 635 | default: |
632 | return -EINVAL; | 636 | return -EINVAL; |
633 | } | 637 | } |
634 | return put_user(v, uaddr); | 638 | if ((reg->id & KVM_REG_SIZE_MASK) == KVM_REG_SIZE_U64) { |
639 | u64 __user *uaddr64 = (u64 __user *)(long)reg->addr; | ||
640 | return put_user(v, uaddr64); | ||
641 | } else if ((reg->id & KVM_REG_SIZE_MASK) == KVM_REG_SIZE_U32) { | ||
642 | u32 __user *uaddr32 = (u32 __user *)(long)reg->addr; | ||
643 | u32 v32 = (u32)v; | ||
644 | return put_user(v32, uaddr32); | ||
645 | } else { | ||
646 | return -EINVAL; | ||
647 | } | ||
635 | } | 648 | } |
636 | 649 | ||
637 | static int kvm_mips_set_reg(struct kvm_vcpu *vcpu, | 650 | static int kvm_mips_set_reg(struct kvm_vcpu *vcpu, |
638 | const struct kvm_one_reg *reg) | 651 | const struct kvm_one_reg *reg) |
639 | { | 652 | { |
640 | u64 __user *uaddr = (u64 __user *)(long)reg->addr; | ||
641 | struct mips_coproc *cop0 = vcpu->arch.cop0; | 653 | struct mips_coproc *cop0 = vcpu->arch.cop0; |
642 | u64 v; | 654 | u64 v; |
643 | 655 | ||
644 | if (get_user(v, uaddr) != 0) | 656 | if ((reg->id & KVM_REG_SIZE_MASK) == KVM_REG_SIZE_U64) { |
645 | return -EFAULT; | 657 | u64 __user *uaddr64 = (u64 __user *)(long)reg->addr; |
658 | |||
659 | if (get_user(v, uaddr64) != 0) | ||
660 | return -EFAULT; | ||
661 | } else if ((reg->id & KVM_REG_SIZE_MASK) == KVM_REG_SIZE_U32) { | ||
662 | u32 __user *uaddr32 = (u32 __user *)(long)reg->addr; | ||
663 | s32 v32; | ||
664 | |||
665 | if (get_user(v32, uaddr32) != 0) | ||
666 | return -EFAULT; | ||
667 | v = (s64)v32; | ||
668 | } else { | ||
669 | return -EINVAL; | ||
670 | } | ||
646 | 671 | ||
647 | switch (reg->id) { | 672 | switch (reg->id) { |
648 | case KVM_REG_MIPS_R0: | 673 | case KVM_REG_MIPS_R0: |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index ce9818eef7d3..afeef93f81a7 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
@@ -301,10 +301,6 @@ static u32 tlb_handler[128] __cpuinitdata; | |||
301 | static struct uasm_label labels[128] __cpuinitdata; | 301 | static struct uasm_label labels[128] __cpuinitdata; |
302 | static struct uasm_reloc relocs[128] __cpuinitdata; | 302 | static struct uasm_reloc relocs[128] __cpuinitdata; |
303 | 303 | ||
304 | #ifdef CONFIG_64BIT | ||
305 | static int check_for_high_segbits __cpuinitdata; | ||
306 | #endif | ||
307 | |||
308 | static int check_for_high_segbits __cpuinitdata; | 304 | static int check_for_high_segbits __cpuinitdata; |
309 | 305 | ||
310 | static unsigned int kscratch_used_mask __cpuinitdata; | 306 | static unsigned int kscratch_used_mask __cpuinitdata; |
diff --git a/arch/mips/ralink/of.c b/arch/mips/ralink/of.c index fb1569580def..6b5f3406f414 100644 --- a/arch/mips/ralink/of.c +++ b/arch/mips/ralink/of.c | |||
@@ -88,7 +88,7 @@ void __init plat_mem_setup(void) | |||
88 | __dt_setup_arch(&__dtb_start); | 88 | __dt_setup_arch(&__dtb_start); |
89 | 89 | ||
90 | if (soc_info.mem_size) | 90 | if (soc_info.mem_size) |
91 | add_memory_region(soc_info.mem_base, soc_info.mem_size, | 91 | add_memory_region(soc_info.mem_base, soc_info.mem_size * SZ_1M, |
92 | BOOT_MEM_RAM); | 92 | BOOT_MEM_RAM); |
93 | else | 93 | else |
94 | detect_memory_region(soc_info.mem_base, | 94 | detect_memory_region(soc_info.mem_base, |
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index 26807e5aff51..6f3887d884d2 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h | |||
@@ -176,6 +176,7 @@ extern const char *powerpc_base_platform; | |||
176 | #define CPU_FTR_CFAR LONG_ASM_CONST(0x0100000000000000) | 176 | #define CPU_FTR_CFAR LONG_ASM_CONST(0x0100000000000000) |
177 | #define CPU_FTR_HAS_PPR LONG_ASM_CONST(0x0200000000000000) | 177 | #define CPU_FTR_HAS_PPR LONG_ASM_CONST(0x0200000000000000) |
178 | #define CPU_FTR_DAWR LONG_ASM_CONST(0x0400000000000000) | 178 | #define CPU_FTR_DAWR LONG_ASM_CONST(0x0400000000000000) |
179 | #define CPU_FTR_DABRX LONG_ASM_CONST(0x0800000000000000) | ||
179 | 180 | ||
180 | #ifndef __ASSEMBLY__ | 181 | #ifndef __ASSEMBLY__ |
181 | 182 | ||
@@ -394,19 +395,20 @@ extern const char *powerpc_base_platform; | |||
394 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_201 | \ | 395 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_201 | \ |
395 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP | CPU_FTR_MMCRA | \ | 396 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP | CPU_FTR_MMCRA | \ |
396 | CPU_FTR_CP_USE_DCBTZ | CPU_FTR_STCX_CHECKS_ADDRESS | \ | 397 | CPU_FTR_CP_USE_DCBTZ | CPU_FTR_STCX_CHECKS_ADDRESS | \ |
397 | CPU_FTR_HVMODE) | 398 | CPU_FTR_HVMODE | CPU_FTR_DABRX) |
398 | #define CPU_FTRS_POWER5 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 399 | #define CPU_FTRS_POWER5 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
399 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 400 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
400 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 401 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
401 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_PURR | \ | 402 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_PURR | \ |
402 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB) | 403 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_DABRX) |
403 | #define CPU_FTRS_POWER6 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 404 | #define CPU_FTRS_POWER6 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
404 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 405 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
405 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 406 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
406 | CPU_FTR_COHERENT_ICACHE | \ | 407 | CPU_FTR_COHERENT_ICACHE | \ |
407 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ | 408 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ |
408 | CPU_FTR_DSCR | CPU_FTR_UNALIGNED_LD_STD | \ | 409 | CPU_FTR_DSCR | CPU_FTR_UNALIGNED_LD_STD | \ |
409 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_CFAR) | 410 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_CFAR | \ |
411 | CPU_FTR_DABRX) | ||
410 | #define CPU_FTRS_POWER7 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 412 | #define CPU_FTRS_POWER7 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
411 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ | 413 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ |
412 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 414 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
@@ -415,7 +417,7 @@ extern const char *powerpc_base_platform; | |||
415 | CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \ | 417 | CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \ |
416 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ | 418 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ |
417 | CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | \ | 419 | CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | \ |
418 | CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR) | 420 | CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR | CPU_FTR_DABRX) |
419 | #define CPU_FTRS_POWER8 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 421 | #define CPU_FTRS_POWER8 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
420 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ | 422 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ |
421 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 423 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
@@ -430,14 +432,15 @@ extern const char *powerpc_base_platform; | |||
430 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | 432 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ |
431 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | 433 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ |
432 | CPU_FTR_PAUSE_ZERO | CPU_FTR_CELL_TB_BUG | CPU_FTR_CP_USE_DCBTZ | \ | 434 | CPU_FTR_PAUSE_ZERO | CPU_FTR_CELL_TB_BUG | CPU_FTR_CP_USE_DCBTZ | \ |
433 | CPU_FTR_UNALIGNED_LD_STD) | 435 | CPU_FTR_UNALIGNED_LD_STD | CPU_FTR_DABRX) |
434 | #define CPU_FTRS_PA6T (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | 436 | #define CPU_FTRS_PA6T (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ |
435 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | \ | 437 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | \ |
436 | CPU_FTR_PURR | CPU_FTR_REAL_LE) | 438 | CPU_FTR_PURR | CPU_FTR_REAL_LE | CPU_FTR_DABRX) |
437 | #define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | CPU_FTR_PPCAS_ARCH_V2) | 439 | #define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | CPU_FTR_PPCAS_ARCH_V2) |
438 | 440 | ||
439 | #define CPU_FTRS_A2 (CPU_FTR_USE_TB | CPU_FTR_SMT | CPU_FTR_DBELL | \ | 441 | #define CPU_FTRS_A2 (CPU_FTR_USE_TB | CPU_FTR_SMT | CPU_FTR_DBELL | \ |
440 | CPU_FTR_NOEXECUTE | CPU_FTR_NODSISRALIGN | CPU_FTR_ICSWX) | 442 | CPU_FTR_NOEXECUTE | CPU_FTR_NODSISRALIGN | \ |
443 | CPU_FTR_ICSWX | CPU_FTR_DABRX ) | ||
441 | 444 | ||
442 | #ifdef __powerpc64__ | 445 | #ifdef __powerpc64__ |
443 | #ifdef CONFIG_PPC_BOOK3E | 446 | #ifdef CONFIG_PPC_BOOK3E |
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h index 8e5fae8beaf6..46793b58a761 100644 --- a/arch/powerpc/include/asm/exception-64s.h +++ b/arch/powerpc/include/asm/exception-64s.h | |||
@@ -513,7 +513,7 @@ label##_common: \ | |||
513 | */ | 513 | */ |
514 | #define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr) \ | 514 | #define STD_EXCEPTION_COMMON_ASYNC(trap, label, hdlr) \ |
515 | EXCEPTION_COMMON(trap, label, hdlr, ret_from_except_lite, \ | 515 | EXCEPTION_COMMON(trap, label, hdlr, ret_from_except_lite, \ |
516 | FINISH_NAP;RUNLATCH_ON;DISABLE_INTS) | 516 | FINISH_NAP;DISABLE_INTS;RUNLATCH_ON) |
517 | 517 | ||
518 | /* | 518 | /* |
519 | * When the idle code in power4_idle puts the CPU into NAP mode, | 519 | * When the idle code in power4_idle puts the CPU into NAP mode, |
diff --git a/arch/powerpc/include/asm/kvm_asm.h b/arch/powerpc/include/asm/kvm_asm.h index b9dd382cb349..851bac7afa4b 100644 --- a/arch/powerpc/include/asm/kvm_asm.h +++ b/arch/powerpc/include/asm/kvm_asm.h | |||
@@ -54,8 +54,16 @@ | |||
54 | #define BOOKE_INTERRUPT_DEBUG 15 | 54 | #define BOOKE_INTERRUPT_DEBUG 15 |
55 | 55 | ||
56 | /* E500 */ | 56 | /* E500 */ |
57 | #define BOOKE_INTERRUPT_SPE_UNAVAIL 32 | 57 | #define BOOKE_INTERRUPT_SPE_ALTIVEC_UNAVAIL 32 |
58 | #define BOOKE_INTERRUPT_SPE_FP_DATA 33 | 58 | #define BOOKE_INTERRUPT_SPE_FP_DATA_ALTIVEC_ASSIST 33 |
59 | /* | ||
60 | * TODO: Unify 32-bit and 64-bit kernel exception handlers to use same defines | ||
61 | */ | ||
62 | #define BOOKE_INTERRUPT_SPE_UNAVAIL BOOKE_INTERRUPT_SPE_ALTIVEC_UNAVAIL | ||
63 | #define BOOKE_INTERRUPT_SPE_FP_DATA BOOKE_INTERRUPT_SPE_FP_DATA_ALTIVEC_ASSIST | ||
64 | #define BOOKE_INTERRUPT_ALTIVEC_UNAVAIL BOOKE_INTERRUPT_SPE_ALTIVEC_UNAVAIL | ||
65 | #define BOOKE_INTERRUPT_ALTIVEC_ASSIST \ | ||
66 | BOOKE_INTERRUPT_SPE_FP_DATA_ALTIVEC_ASSIST | ||
59 | #define BOOKE_INTERRUPT_SPE_FP_ROUND 34 | 67 | #define BOOKE_INTERRUPT_SPE_FP_ROUND 34 |
60 | #define BOOKE_INTERRUPT_PERFORMANCE_MONITOR 35 | 68 | #define BOOKE_INTERRUPT_PERFORMANCE_MONITOR 35 |
61 | #define BOOKE_INTERRUPT_DOORBELL 36 | 69 | #define BOOKE_INTERRUPT_DOORBELL 36 |
@@ -67,10 +75,6 @@ | |||
67 | #define BOOKE_INTERRUPT_HV_SYSCALL 40 | 75 | #define BOOKE_INTERRUPT_HV_SYSCALL 40 |
68 | #define BOOKE_INTERRUPT_HV_PRIV 41 | 76 | #define BOOKE_INTERRUPT_HV_PRIV 41 |
69 | 77 | ||
70 | /* altivec */ | ||
71 | #define BOOKE_INTERRUPT_ALTIVEC_UNAVAIL 42 | ||
72 | #define BOOKE_INTERRUPT_ALTIVEC_ASSIST 43 | ||
73 | |||
74 | /* book3s */ | 78 | /* book3s */ |
75 | 79 | ||
76 | #define BOOK3S_INTERRUPT_SYSTEM_RESET 0x100 | 80 | #define BOOK3S_INTERRUPT_SYSTEM_RESET 0x100 |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 1f0937d7d4b5..2a45d0f04385 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -452,8 +452,8 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
452 | .mmu_features = MMU_FTRS_POWER8, | 452 | .mmu_features = MMU_FTRS_POWER8, |
453 | .icache_bsize = 128, | 453 | .icache_bsize = 128, |
454 | .dcache_bsize = 128, | 454 | .dcache_bsize = 128, |
455 | .oprofile_type = PPC_OPROFILE_POWER4, | 455 | .oprofile_type = PPC_OPROFILE_INVALID, |
456 | .oprofile_cpu_type = 0, | 456 | .oprofile_cpu_type = "ppc64/ibm-compat-v1", |
457 | .cpu_setup = __setup_cpu_power8, | 457 | .cpu_setup = __setup_cpu_power8, |
458 | .cpu_restore = __restore_cpu_power8, | 458 | .cpu_restore = __restore_cpu_power8, |
459 | .platform = "power8", | 459 | .platform = "power8", |
@@ -506,8 +506,8 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
506 | .dcache_bsize = 128, | 506 | .dcache_bsize = 128, |
507 | .num_pmcs = 6, | 507 | .num_pmcs = 6, |
508 | .pmc_type = PPC_PMC_IBM, | 508 | .pmc_type = PPC_PMC_IBM, |
509 | .oprofile_cpu_type = 0, | 509 | .oprofile_cpu_type = "ppc64/power8", |
510 | .oprofile_type = PPC_OPROFILE_POWER4, | 510 | .oprofile_type = PPC_OPROFILE_INVALID, |
511 | .cpu_setup = __setup_cpu_power8, | 511 | .cpu_setup = __setup_cpu_power8, |
512 | .cpu_restore = __restore_cpu_power8, | 512 | .cpu_restore = __restore_cpu_power8, |
513 | .platform = "power8", | 513 | .platform = "power8", |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 246b11c4fe7e..8741c854e03d 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -465,20 +465,6 @@ BEGIN_FTR_SECTION | |||
465 | std r0, THREAD_EBBHR(r3) | 465 | std r0, THREAD_EBBHR(r3) |
466 | mfspr r0, SPRN_EBBRR | 466 | mfspr r0, SPRN_EBBRR |
467 | std r0, THREAD_EBBRR(r3) | 467 | std r0, THREAD_EBBRR(r3) |
468 | |||
469 | /* PMU registers made user read/(write) by EBB */ | ||
470 | mfspr r0, SPRN_SIAR | ||
471 | std r0, THREAD_SIAR(r3) | ||
472 | mfspr r0, SPRN_SDAR | ||
473 | std r0, THREAD_SDAR(r3) | ||
474 | mfspr r0, SPRN_SIER | ||
475 | std r0, THREAD_SIER(r3) | ||
476 | mfspr r0, SPRN_MMCR0 | ||
477 | std r0, THREAD_MMCR0(r3) | ||
478 | mfspr r0, SPRN_MMCR2 | ||
479 | std r0, THREAD_MMCR2(r3) | ||
480 | mfspr r0, SPRN_MMCRA | ||
481 | std r0, THREAD_MMCRA(r3) | ||
482 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | 468 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
483 | #endif | 469 | #endif |
484 | 470 | ||
@@ -581,20 +567,6 @@ BEGIN_FTR_SECTION | |||
581 | ld r0, THREAD_EBBRR(r4) | 567 | ld r0, THREAD_EBBRR(r4) |
582 | mtspr SPRN_EBBRR, r0 | 568 | mtspr SPRN_EBBRR, r0 |
583 | 569 | ||
584 | /* PMU registers made user read/(write) by EBB */ | ||
585 | ld r0, THREAD_SIAR(r4) | ||
586 | mtspr SPRN_SIAR, r0 | ||
587 | ld r0, THREAD_SDAR(r4) | ||
588 | mtspr SPRN_SDAR, r0 | ||
589 | ld r0, THREAD_SIER(r4) | ||
590 | mtspr SPRN_SIER, r0 | ||
591 | ld r0, THREAD_MMCR0(r4) | ||
592 | mtspr SPRN_MMCR0, r0 | ||
593 | ld r0, THREAD_MMCR2(r4) | ||
594 | mtspr SPRN_MMCR2, r0 | ||
595 | ld r0, THREAD_MMCRA(r4) | ||
596 | mtspr SPRN_MMCRA, r0 | ||
597 | |||
598 | ld r0,THREAD_TAR(r4) | 570 | ld r0,THREAD_TAR(r4) |
599 | mtspr SPRN_TAR,r0 | 571 | mtspr SPRN_TAR,r0 |
600 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) | 572 | END_FTR_SECTION_IFSET(CPU_FTR_ARCH_207S) |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index e6eba1bf61ad..40e4a17c8ba0 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -454,38 +454,14 @@ BEGIN_FTR_SECTION | |||
454 | xori r10,r10,(MSR_FE0|MSR_FE1) | 454 | xori r10,r10,(MSR_FE0|MSR_FE1) |
455 | mtmsrd r10 | 455 | mtmsrd r10 |
456 | sync | 456 | sync |
457 | fmr 0,0 | 457 | |
458 | fmr 1,1 | 458 | #define FMR2(n) fmr (n), (n) ; fmr n+1, n+1 |
459 | fmr 2,2 | 459 | #define FMR4(n) FMR2(n) ; FMR2(n+2) |
460 | fmr 3,3 | 460 | #define FMR8(n) FMR4(n) ; FMR4(n+4) |
461 | fmr 4,4 | 461 | #define FMR16(n) FMR8(n) ; FMR8(n+8) |
462 | fmr 5,5 | 462 | #define FMR32(n) FMR16(n) ; FMR16(n+16) |
463 | fmr 6,6 | 463 | FMR32(0) |
464 | fmr 7,7 | 464 | |
465 | fmr 8,8 | ||
466 | fmr 9,9 | ||
467 | fmr 10,10 | ||
468 | fmr 11,11 | ||
469 | fmr 12,12 | ||
470 | fmr 13,13 | ||
471 | fmr 14,14 | ||
472 | fmr 15,15 | ||
473 | fmr 16,16 | ||
474 | fmr 17,17 | ||
475 | fmr 18,18 | ||
476 | fmr 19,19 | ||
477 | fmr 20,20 | ||
478 | fmr 21,21 | ||
479 | fmr 22,22 | ||
480 | fmr 23,23 | ||
481 | fmr 24,24 | ||
482 | fmr 25,25 | ||
483 | fmr 26,26 | ||
484 | fmr 27,27 | ||
485 | fmr 28,28 | ||
486 | fmr 29,29 | ||
487 | fmr 30,30 | ||
488 | fmr 31,31 | ||
489 | FTR_SECTION_ELSE | 465 | FTR_SECTION_ELSE |
490 | /* | 466 | /* |
491 | * To denormalise we need to move a copy of the register to itself. | 467 | * To denormalise we need to move a copy of the register to itself. |
@@ -495,39 +471,25 @@ FTR_SECTION_ELSE | |||
495 | oris r10,r10,MSR_VSX@h | 471 | oris r10,r10,MSR_VSX@h |
496 | mtmsrd r10 | 472 | mtmsrd r10 |
497 | sync | 473 | sync |
498 | XVCPSGNDP(0,0,0) | 474 | |
499 | XVCPSGNDP(1,1,1) | 475 | #define XVCPSGNDP2(n) XVCPSGNDP(n,n,n) ; XVCPSGNDP(n+1,n+1,n+1) |
500 | XVCPSGNDP(2,2,2) | 476 | #define XVCPSGNDP4(n) XVCPSGNDP2(n) ; XVCPSGNDP2(n+2) |
501 | XVCPSGNDP(3,3,3) | 477 | #define XVCPSGNDP8(n) XVCPSGNDP4(n) ; XVCPSGNDP4(n+4) |
502 | XVCPSGNDP(4,4,4) | 478 | #define XVCPSGNDP16(n) XVCPSGNDP8(n) ; XVCPSGNDP8(n+8) |
503 | XVCPSGNDP(5,5,5) | 479 | #define XVCPSGNDP32(n) XVCPSGNDP16(n) ; XVCPSGNDP16(n+16) |
504 | XVCPSGNDP(6,6,6) | 480 | XVCPSGNDP32(0) |
505 | XVCPSGNDP(7,7,7) | 481 | |
506 | XVCPSGNDP(8,8,8) | ||
507 | XVCPSGNDP(9,9,9) | ||
508 | XVCPSGNDP(10,10,10) | ||
509 | XVCPSGNDP(11,11,11) | ||
510 | XVCPSGNDP(12,12,12) | ||
511 | XVCPSGNDP(13,13,13) | ||
512 | XVCPSGNDP(14,14,14) | ||
513 | XVCPSGNDP(15,15,15) | ||
514 | XVCPSGNDP(16,16,16) | ||
515 | XVCPSGNDP(17,17,17) | ||
516 | XVCPSGNDP(18,18,18) | ||
517 | XVCPSGNDP(19,19,19) | ||
518 | XVCPSGNDP(20,20,20) | ||
519 | XVCPSGNDP(21,21,21) | ||
520 | XVCPSGNDP(22,22,22) | ||
521 | XVCPSGNDP(23,23,23) | ||
522 | XVCPSGNDP(24,24,24) | ||
523 | XVCPSGNDP(25,25,25) | ||
524 | XVCPSGNDP(26,26,26) | ||
525 | XVCPSGNDP(27,27,27) | ||
526 | XVCPSGNDP(28,28,28) | ||
527 | XVCPSGNDP(29,29,29) | ||
528 | XVCPSGNDP(30,30,30) | ||
529 | XVCPSGNDP(31,31,31) | ||
530 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206) | 482 | ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206) |
483 | |||
484 | BEGIN_FTR_SECTION | ||
485 | b denorm_done | ||
486 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) | ||
487 | /* | ||
488 | * To denormalise we need to move a copy of the register to itself. | ||
489 | * For POWER8 we need to do that for all 64 VSX registers | ||
490 | */ | ||
491 | XVCPSGNDP32(32) | ||
492 | denorm_done: | ||
531 | mtspr SPRN_HSRR0,r11 | 493 | mtspr SPRN_HSRR0,r11 |
532 | mtcrf 0x80,r9 | 494 | mtcrf 0x80,r9 |
533 | ld r9,PACA_EXGEN+EX_R9(r13) | 495 | ld r9,PACA_EXGEN+EX_R9(r13) |
@@ -721,7 +683,7 @@ machine_check_common: | |||
721 | STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) | 683 | STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) |
722 | STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) | 684 | STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) |
723 | STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception) | 685 | STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception) |
724 | STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception) | 686 | STD_EXCEPTION_COMMON(0xe40, emulation_assist, .emulation_assist_interrupt) |
725 | STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception) | 687 | STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception) |
726 | #ifdef CONFIG_PPC_DOORBELL | 688 | #ifdef CONFIG_PPC_DOORBELL |
727 | STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception) | 689 | STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception) |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 5cbcf4d5a808..ea185e0b3cae 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -162,7 +162,7 @@ notrace unsigned int __check_irq_replay(void) | |||
162 | * in case we also had a rollover while hard disabled | 162 | * in case we also had a rollover while hard disabled |
163 | */ | 163 | */ |
164 | local_paca->irq_happened &= ~PACA_IRQ_DEC; | 164 | local_paca->irq_happened &= ~PACA_IRQ_DEC; |
165 | if (decrementer_check_overflow()) | 165 | if ((happened & PACA_IRQ_DEC) || decrementer_check_overflow()) |
166 | return 0x900; | 166 | return 0x900; |
167 | 167 | ||
168 | /* Finally check if an external interrupt happened */ | 168 | /* Finally check if an external interrupt happened */ |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 7f2273cc3c7d..eabeec991016 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -827,6 +827,7 @@ static void pcibios_fixup_resources(struct pci_dev *dev) | |||
827 | } | 827 | } |
828 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { | 828 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { |
829 | struct resource *res = dev->resource + i; | 829 | struct resource *res = dev->resource + i; |
830 | struct pci_bus_region reg; | ||
830 | if (!res->flags) | 831 | if (!res->flags) |
831 | continue; | 832 | continue; |
832 | 833 | ||
@@ -835,8 +836,9 @@ static void pcibios_fixup_resources(struct pci_dev *dev) | |||
835 | * at 0 as unset as well, except if PCI_PROBE_ONLY is also set | 836 | * at 0 as unset as well, except if PCI_PROBE_ONLY is also set |
836 | * since in that case, we don't want to re-assign anything | 837 | * since in that case, we don't want to re-assign anything |
837 | */ | 838 | */ |
839 | pcibios_resource_to_bus(dev, ®, res); | ||
838 | if (pci_has_flag(PCI_REASSIGN_ALL_RSRC) || | 840 | if (pci_has_flag(PCI_REASSIGN_ALL_RSRC) || |
839 | (res->start == 0 && !pci_has_flag(PCI_PROBE_ONLY))) { | 841 | (reg.start == 0 && !pci_has_flag(PCI_PROBE_ONLY))) { |
840 | /* Only print message if not re-assigning */ | 842 | /* Only print message if not re-assigning */ |
841 | if (!pci_has_flag(PCI_REASSIGN_ALL_RSRC)) | 843 | if (!pci_has_flag(PCI_REASSIGN_ALL_RSRC)) |
842 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] " | 844 | pr_debug("PCI:%s Resource %d %016llx-%016llx [%x] " |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index a902723fdc69..076d1242507a 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -399,7 +399,8 @@ static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) | |||
399 | static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) | 399 | static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) |
400 | { | 400 | { |
401 | mtspr(SPRN_DABR, dabr); | 401 | mtspr(SPRN_DABR, dabr); |
402 | mtspr(SPRN_DABRX, dabrx); | 402 | if (cpu_has_feature(CPU_FTR_DABRX)) |
403 | mtspr(SPRN_DABRX, dabrx); | ||
403 | return 0; | 404 | return 0; |
404 | } | 405 | } |
405 | #else | 406 | #else |
@@ -1368,7 +1369,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) | |||
1368 | 1369 | ||
1369 | #ifdef CONFIG_PPC64 | 1370 | #ifdef CONFIG_PPC64 |
1370 | /* Called with hard IRQs off */ | 1371 | /* Called with hard IRQs off */ |
1371 | void __ppc64_runlatch_on(void) | 1372 | void notrace __ppc64_runlatch_on(void) |
1372 | { | 1373 | { |
1373 | struct thread_info *ti = current_thread_info(); | 1374 | struct thread_info *ti = current_thread_info(); |
1374 | unsigned long ctrl; | 1375 | unsigned long ctrl; |
@@ -1381,7 +1382,7 @@ void __ppc64_runlatch_on(void) | |||
1381 | } | 1382 | } |
1382 | 1383 | ||
1383 | /* Called with hard IRQs off */ | 1384 | /* Called with hard IRQs off */ |
1384 | void __ppc64_runlatch_off(void) | 1385 | void notrace __ppc64_runlatch_off(void) |
1385 | { | 1386 | { |
1386 | struct thread_info *ti = current_thread_info(); | 1387 | struct thread_info *ti = current_thread_info(); |
1387 | unsigned long ctrl; | 1388 | unsigned long ctrl; |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index f18c79c324ef..c0e5caf8ccc7 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -1165,6 +1165,16 @@ bail: | |||
1165 | exception_exit(prev_state); | 1165 | exception_exit(prev_state); |
1166 | } | 1166 | } |
1167 | 1167 | ||
1168 | /* | ||
1169 | * This occurs when running in hypervisor mode on POWER6 or later | ||
1170 | * and an illegal instruction is encountered. | ||
1171 | */ | ||
1172 | void __kprobes emulation_assist_interrupt(struct pt_regs *regs) | ||
1173 | { | ||
1174 | regs->msr |= REASON_ILLEGAL; | ||
1175 | program_check_exception(regs); | ||
1176 | } | ||
1177 | |||
1168 | void alignment_exception(struct pt_regs *regs) | 1178 | void alignment_exception(struct pt_regs *regs) |
1169 | { | 1179 | { |
1170 | enum ctx_state prev_state = exception_enter(); | 1180 | enum ctx_state prev_state = exception_enter(); |
diff --git a/arch/powerpc/kvm/44x_tlb.c b/arch/powerpc/kvm/44x_tlb.c index 5dd3ab469976..ed0385448148 100644 --- a/arch/powerpc/kvm/44x_tlb.c +++ b/arch/powerpc/kvm/44x_tlb.c | |||
@@ -441,6 +441,7 @@ int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws) | |||
441 | struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu); | 441 | struct kvmppc_vcpu_44x *vcpu_44x = to_44x(vcpu); |
442 | struct kvmppc_44x_tlbe *tlbe; | 442 | struct kvmppc_44x_tlbe *tlbe; |
443 | unsigned int gtlb_index; | 443 | unsigned int gtlb_index; |
444 | int idx; | ||
444 | 445 | ||
445 | gtlb_index = kvmppc_get_gpr(vcpu, ra); | 446 | gtlb_index = kvmppc_get_gpr(vcpu, ra); |
446 | if (gtlb_index >= KVM44x_GUEST_TLB_SIZE) { | 447 | if (gtlb_index >= KVM44x_GUEST_TLB_SIZE) { |
@@ -473,6 +474,8 @@ int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws) | |||
473 | return EMULATE_FAIL; | 474 | return EMULATE_FAIL; |
474 | } | 475 | } |
475 | 476 | ||
477 | idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
478 | |||
476 | if (tlbe_is_host_safe(vcpu, tlbe)) { | 479 | if (tlbe_is_host_safe(vcpu, tlbe)) { |
477 | gva_t eaddr; | 480 | gva_t eaddr; |
478 | gpa_t gpaddr; | 481 | gpa_t gpaddr; |
@@ -489,6 +492,8 @@ int kvmppc_44x_emul_tlbwe(struct kvm_vcpu *vcpu, u8 ra, u8 rs, u8 ws) | |||
489 | kvmppc_mmu_map(vcpu, eaddr, gpaddr, gtlb_index); | 492 | kvmppc_mmu_map(vcpu, eaddr, gpaddr, gtlb_index); |
490 | } | 493 | } |
491 | 494 | ||
495 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
496 | |||
492 | trace_kvm_gtlb_write(gtlb_index, tlbe->tid, tlbe->word0, tlbe->word1, | 497 | trace_kvm_gtlb_write(gtlb_index, tlbe->tid, tlbe->word0, tlbe->word1, |
493 | tlbe->word2); | 498 | tlbe->word2); |
494 | 499 | ||
diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index 1020119226db..5cd7ad0c1176 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c | |||
@@ -832,6 +832,18 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
832 | { | 832 | { |
833 | int r = RESUME_HOST; | 833 | int r = RESUME_HOST; |
834 | int s; | 834 | int s; |
835 | int idx; | ||
836 | |||
837 | #ifdef CONFIG_PPC64 | ||
838 | WARN_ON(local_paca->irq_happened != 0); | ||
839 | #endif | ||
840 | |||
841 | /* | ||
842 | * We enter with interrupts disabled in hardware, but | ||
843 | * we need to call hard_irq_disable anyway to ensure that | ||
844 | * the software state is kept in sync. | ||
845 | */ | ||
846 | hard_irq_disable(); | ||
835 | 847 | ||
836 | /* update before a new last_exit_type is rewritten */ | 848 | /* update before a new last_exit_type is rewritten */ |
837 | kvmppc_update_timing_stats(vcpu); | 849 | kvmppc_update_timing_stats(vcpu); |
@@ -1053,6 +1065,8 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
1053 | break; | 1065 | break; |
1054 | } | 1066 | } |
1055 | 1067 | ||
1068 | idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
1069 | |||
1056 | gpaddr = kvmppc_mmu_xlate(vcpu, gtlb_index, eaddr); | 1070 | gpaddr = kvmppc_mmu_xlate(vcpu, gtlb_index, eaddr); |
1057 | gfn = gpaddr >> PAGE_SHIFT; | 1071 | gfn = gpaddr >> PAGE_SHIFT; |
1058 | 1072 | ||
@@ -1075,6 +1089,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
1075 | kvmppc_account_exit(vcpu, MMIO_EXITS); | 1089 | kvmppc_account_exit(vcpu, MMIO_EXITS); |
1076 | } | 1090 | } |
1077 | 1091 | ||
1092 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
1078 | break; | 1093 | break; |
1079 | } | 1094 | } |
1080 | 1095 | ||
@@ -1098,6 +1113,8 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
1098 | 1113 | ||
1099 | kvmppc_account_exit(vcpu, ITLB_VIRT_MISS_EXITS); | 1114 | kvmppc_account_exit(vcpu, ITLB_VIRT_MISS_EXITS); |
1100 | 1115 | ||
1116 | idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
1117 | |||
1101 | gpaddr = kvmppc_mmu_xlate(vcpu, gtlb_index, eaddr); | 1118 | gpaddr = kvmppc_mmu_xlate(vcpu, gtlb_index, eaddr); |
1102 | gfn = gpaddr >> PAGE_SHIFT; | 1119 | gfn = gpaddr >> PAGE_SHIFT; |
1103 | 1120 | ||
@@ -1114,6 +1131,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu, | |||
1114 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_MACHINE_CHECK); | 1131 | kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_MACHINE_CHECK); |
1115 | } | 1132 | } |
1116 | 1133 | ||
1134 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
1117 | break; | 1135 | break; |
1118 | } | 1136 | } |
1119 | 1137 | ||
diff --git a/arch/powerpc/kvm/e500_mmu.c b/arch/powerpc/kvm/e500_mmu.c index c41a5a96b558..6d6f153b6c1d 100644 --- a/arch/powerpc/kvm/e500_mmu.c +++ b/arch/powerpc/kvm/e500_mmu.c | |||
@@ -396,6 +396,7 @@ int kvmppc_e500_emul_tlbwe(struct kvm_vcpu *vcpu) | |||
396 | struct kvm_book3e_206_tlb_entry *gtlbe; | 396 | struct kvm_book3e_206_tlb_entry *gtlbe; |
397 | int tlbsel, esel; | 397 | int tlbsel, esel; |
398 | int recal = 0; | 398 | int recal = 0; |
399 | int idx; | ||
399 | 400 | ||
400 | tlbsel = get_tlb_tlbsel(vcpu); | 401 | tlbsel = get_tlb_tlbsel(vcpu); |
401 | esel = get_tlb_esel(vcpu, tlbsel); | 402 | esel = get_tlb_esel(vcpu, tlbsel); |
@@ -430,6 +431,8 @@ int kvmppc_e500_emul_tlbwe(struct kvm_vcpu *vcpu) | |||
430 | kvmppc_set_tlb1map_range(vcpu, gtlbe); | 431 | kvmppc_set_tlb1map_range(vcpu, gtlbe); |
431 | } | 432 | } |
432 | 433 | ||
434 | idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
435 | |||
433 | /* Invalidate shadow mappings for the about-to-be-clobbered TLBE. */ | 436 | /* Invalidate shadow mappings for the about-to-be-clobbered TLBE. */ |
434 | if (tlbe_is_host_safe(vcpu, gtlbe)) { | 437 | if (tlbe_is_host_safe(vcpu, gtlbe)) { |
435 | u64 eaddr = get_tlb_eaddr(gtlbe); | 438 | u64 eaddr = get_tlb_eaddr(gtlbe); |
@@ -444,6 +447,8 @@ int kvmppc_e500_emul_tlbwe(struct kvm_vcpu *vcpu) | |||
444 | kvmppc_mmu_map(vcpu, eaddr, raddr, index_of(tlbsel, esel)); | 447 | kvmppc_mmu_map(vcpu, eaddr, raddr, index_of(tlbsel, esel)); |
445 | } | 448 | } |
446 | 449 | ||
450 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
451 | |||
447 | kvmppc_set_exit_type(vcpu, EMULATED_TLBWE_EXITS); | 452 | kvmppc_set_exit_type(vcpu, EMULATED_TLBWE_EXITS); |
448 | return EMULATE_DONE; | 453 | return EMULATE_DONE; |
449 | } | 454 | } |
diff --git a/arch/powerpc/kvm/e500mc.c b/arch/powerpc/kvm/e500mc.c index 753cc99eff2b..19c8379575f7 100644 --- a/arch/powerpc/kvm/e500mc.c +++ b/arch/powerpc/kvm/e500mc.c | |||
@@ -177,8 +177,6 @@ int kvmppc_core_check_processor_compat(void) | |||
177 | r = 0; | 177 | r = 0; |
178 | else if (strcmp(cur_cpu_spec->cpu_name, "e5500") == 0) | 178 | else if (strcmp(cur_cpu_spec->cpu_name, "e5500") == 0) |
179 | r = 0; | 179 | r = 0; |
180 | else if (strcmp(cur_cpu_spec->cpu_name, "e6500") == 0) | ||
181 | r = 0; | ||
182 | else | 180 | else |
183 | r = -ENOTSUPP; | 181 | r = -ENOTSUPP; |
184 | 182 | ||
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 845c867444e6..29c6482890c8 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c | |||
@@ -1758,7 +1758,7 @@ static void perf_event_interrupt(struct pt_regs *regs) | |||
1758 | } | 1758 | } |
1759 | } | 1759 | } |
1760 | } | 1760 | } |
1761 | if ((!found) && printk_ratelimit()) | 1761 | if (!found && !nmi && printk_ratelimit()) |
1762 | printk(KERN_WARNING "Can't find PMC that caused IRQ\n"); | 1762 | printk(KERN_WARNING "Can't find PMC that caused IRQ\n"); |
1763 | 1763 | ||
1764 | /* | 1764 | /* |
diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c index 19506f935737..b456b157d33d 100644 --- a/arch/powerpc/platforms/pseries/eeh_pseries.c +++ b/arch/powerpc/platforms/pseries/eeh_pseries.c | |||
@@ -83,7 +83,11 @@ static int pseries_eeh_init(void) | |||
83 | ibm_configure_pe = rtas_token("ibm,configure-pe"); | 83 | ibm_configure_pe = rtas_token("ibm,configure-pe"); |
84 | ibm_configure_bridge = rtas_token("ibm,configure-bridge"); | 84 | ibm_configure_bridge = rtas_token("ibm,configure-bridge"); |
85 | 85 | ||
86 | /* necessary sanity check */ | 86 | /* |
87 | * Necessary sanity check. We needn't check "get-config-addr-info" | ||
88 | * and its variant since the old firmware probably support address | ||
89 | * of domain/bus/slot/function for EEH RTAS operations. | ||
90 | */ | ||
87 | if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE) { | 91 | if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE) { |
88 | pr_warning("%s: RTAS service <ibm,set-eeh-option> invalid\n", | 92 | pr_warning("%s: RTAS service <ibm,set-eeh-option> invalid\n", |
89 | __func__); | 93 | __func__); |
@@ -102,12 +106,6 @@ static int pseries_eeh_init(void) | |||
102 | pr_warning("%s: RTAS service <ibm,slot-error-detail> invalid\n", | 106 | pr_warning("%s: RTAS service <ibm,slot-error-detail> invalid\n", |
103 | __func__); | 107 | __func__); |
104 | return -EINVAL; | 108 | return -EINVAL; |
105 | } else if (ibm_get_config_addr_info2 == RTAS_UNKNOWN_SERVICE && | ||
106 | ibm_get_config_addr_info == RTAS_UNKNOWN_SERVICE) { | ||
107 | pr_warning("%s: RTAS service <ibm,get-config-addr-info2> and " | ||
108 | "<ibm,get-config-addr-info> invalid\n", | ||
109 | __func__); | ||
110 | return -EINVAL; | ||
111 | } else if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE && | 109 | } else if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE && |
112 | ibm_configure_bridge == RTAS_UNKNOWN_SERVICE) { | 110 | ibm_configure_bridge == RTAS_UNKNOWN_SERVICE) { |
113 | pr_warning("%s: RTAS service <ibm,configure-pe> and " | 111 | pr_warning("%s: RTAS service <ibm,configure-pe> and " |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index ac01463038f1..e8b6e5b8932c 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
@@ -623,7 +623,7 @@ static inline pgste_t pgste_get_lock(pte_t *ptep) | |||
623 | " csg %0,%1,%2\n" | 623 | " csg %0,%1,%2\n" |
624 | " jl 0b\n" | 624 | " jl 0b\n" |
625 | : "=&d" (old), "=&d" (new), "=Q" (ptep[PTRS_PER_PTE]) | 625 | : "=&d" (old), "=&d" (new), "=Q" (ptep[PTRS_PER_PTE]) |
626 | : "Q" (ptep[PTRS_PER_PTE]) : "cc"); | 626 | : "Q" (ptep[PTRS_PER_PTE]) : "cc", "memory"); |
627 | #endif | 627 | #endif |
628 | return __pgste(new); | 628 | return __pgste(new); |
629 | } | 629 | } |
@@ -635,11 +635,19 @@ static inline void pgste_set_unlock(pte_t *ptep, pgste_t pgste) | |||
635 | " nihh %1,0xff7f\n" /* clear RCP_PCL_BIT */ | 635 | " nihh %1,0xff7f\n" /* clear RCP_PCL_BIT */ |
636 | " stg %1,%0\n" | 636 | " stg %1,%0\n" |
637 | : "=Q" (ptep[PTRS_PER_PTE]) | 637 | : "=Q" (ptep[PTRS_PER_PTE]) |
638 | : "d" (pgste_val(pgste)), "Q" (ptep[PTRS_PER_PTE]) : "cc"); | 638 | : "d" (pgste_val(pgste)), "Q" (ptep[PTRS_PER_PTE]) |
639 | : "cc", "memory"); | ||
639 | preempt_enable(); | 640 | preempt_enable(); |
640 | #endif | 641 | #endif |
641 | } | 642 | } |
642 | 643 | ||
644 | static inline void pgste_set(pte_t *ptep, pgste_t pgste) | ||
645 | { | ||
646 | #ifdef CONFIG_PGSTE | ||
647 | *(pgste_t *)(ptep + PTRS_PER_PTE) = pgste; | ||
648 | #endif | ||
649 | } | ||
650 | |||
643 | static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste) | 651 | static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste) |
644 | { | 652 | { |
645 | #ifdef CONFIG_PGSTE | 653 | #ifdef CONFIG_PGSTE |
@@ -704,17 +712,19 @@ static inline void pgste_set_key(pte_t *ptep, pgste_t pgste, pte_t entry) | |||
704 | { | 712 | { |
705 | #ifdef CONFIG_PGSTE | 713 | #ifdef CONFIG_PGSTE |
706 | unsigned long address; | 714 | unsigned long address; |
707 | unsigned long okey, nkey; | 715 | unsigned long nkey; |
708 | 716 | ||
709 | if (pte_val(entry) & _PAGE_INVALID) | 717 | if (pte_val(entry) & _PAGE_INVALID) |
710 | return; | 718 | return; |
719 | VM_BUG_ON(!(pte_val(*ptep) & _PAGE_INVALID)); | ||
711 | address = pte_val(entry) & PAGE_MASK; | 720 | address = pte_val(entry) & PAGE_MASK; |
712 | okey = nkey = page_get_storage_key(address); | 721 | /* |
713 | nkey &= ~(_PAGE_ACC_BITS | _PAGE_FP_BIT); | 722 | * Set page access key and fetch protection bit from pgste. |
714 | /* Set page access key and fetch protection bit from pgste */ | 723 | * The guest C/R information is still in the PGSTE, set real |
715 | nkey |= (pgste_val(pgste) & (RCP_ACC_BITS | RCP_FP_BIT)) >> 56; | 724 | * key C/R to 0. |
716 | if (okey != nkey) | 725 | */ |
717 | page_set_storage_key(address, nkey, 0); | 726 | nkey = (pgste_val(pgste) & (RCP_ACC_BITS | RCP_FP_BIT)) >> 56; |
727 | page_set_storage_key(address, nkey, 0); | ||
718 | #endif | 728 | #endif |
719 | } | 729 | } |
720 | 730 | ||
@@ -1099,8 +1109,10 @@ static inline pte_t ptep_modify_prot_start(struct mm_struct *mm, | |||
1099 | if (!mm_exclusive(mm)) | 1109 | if (!mm_exclusive(mm)) |
1100 | __ptep_ipte(address, ptep); | 1110 | __ptep_ipte(address, ptep); |
1101 | 1111 | ||
1102 | if (mm_has_pgste(mm)) | 1112 | if (mm_has_pgste(mm)) { |
1103 | pgste = pgste_update_all(&pte, pgste); | 1113 | pgste = pgste_update_all(&pte, pgste); |
1114 | pgste_set(ptep, pgste); | ||
1115 | } | ||
1104 | return pte; | 1116 | return pte; |
1105 | } | 1117 | } |
1106 | 1118 | ||
diff --git a/arch/s390/kernel/dumpstack.c b/arch/s390/kernel/dumpstack.c index 298297477257..87acc38f73c6 100644 --- a/arch/s390/kernel/dumpstack.c +++ b/arch/s390/kernel/dumpstack.c | |||
@@ -74,6 +74,8 @@ __show_trace(unsigned long sp, unsigned long low, unsigned long high) | |||
74 | 74 | ||
75 | static void show_trace(struct task_struct *task, unsigned long *stack) | 75 | static void show_trace(struct task_struct *task, unsigned long *stack) |
76 | { | 76 | { |
77 | const unsigned long frame_size = | ||
78 | STACK_FRAME_OVERHEAD + sizeof(struct pt_regs); | ||
77 | register unsigned long __r15 asm ("15"); | 79 | register unsigned long __r15 asm ("15"); |
78 | unsigned long sp; | 80 | unsigned long sp; |
79 | 81 | ||
@@ -82,11 +84,13 @@ static void show_trace(struct task_struct *task, unsigned long *stack) | |||
82 | sp = task ? task->thread.ksp : __r15; | 84 | sp = task ? task->thread.ksp : __r15; |
83 | printk("Call Trace:\n"); | 85 | printk("Call Trace:\n"); |
84 | #ifdef CONFIG_CHECK_STACK | 86 | #ifdef CONFIG_CHECK_STACK |
85 | sp = __show_trace(sp, S390_lowcore.panic_stack - 4096, | 87 | sp = __show_trace(sp, |
86 | S390_lowcore.panic_stack); | 88 | S390_lowcore.panic_stack + frame_size - 4096, |
89 | S390_lowcore.panic_stack + frame_size); | ||
87 | #endif | 90 | #endif |
88 | sp = __show_trace(sp, S390_lowcore.async_stack - ASYNC_SIZE, | 91 | sp = __show_trace(sp, |
89 | S390_lowcore.async_stack); | 92 | S390_lowcore.async_stack + frame_size - ASYNC_SIZE, |
93 | S390_lowcore.async_stack + frame_size); | ||
90 | if (task) | 94 | if (task) |
91 | __show_trace(sp, (unsigned long) task_stack_page(task), | 95 | __show_trace(sp, (unsigned long) task_stack_page(task), |
92 | (unsigned long) task_stack_page(task) + THREAD_SIZE); | 96 | (unsigned long) task_stack_page(task) + THREAD_SIZE); |
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index f7fb58903f6a..408e866ae548 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c | |||
@@ -311,3 +311,67 @@ void measurement_alert_subclass_unregister(void) | |||
311 | spin_unlock(&ma_subclass_lock); | 311 | spin_unlock(&ma_subclass_lock); |
312 | } | 312 | } |
313 | EXPORT_SYMBOL(measurement_alert_subclass_unregister); | 313 | EXPORT_SYMBOL(measurement_alert_subclass_unregister); |
314 | |||
315 | void synchronize_irq(unsigned int irq) | ||
316 | { | ||
317 | /* | ||
318 | * Not needed, the handler is protected by a lock and IRQs that occur | ||
319 | * after the handler is deleted are just NOPs. | ||
320 | */ | ||
321 | } | ||
322 | EXPORT_SYMBOL_GPL(synchronize_irq); | ||
323 | |||
324 | #ifndef CONFIG_PCI | ||
325 | |||
326 | /* Only PCI devices have dynamically-defined IRQ handlers */ | ||
327 | |||
328 | int request_irq(unsigned int irq, irq_handler_t handler, | ||
329 | unsigned long irqflags, const char *devname, void *dev_id) | ||
330 | { | ||
331 | return -EINVAL; | ||
332 | } | ||
333 | EXPORT_SYMBOL_GPL(request_irq); | ||
334 | |||
335 | void free_irq(unsigned int irq, void *dev_id) | ||
336 | { | ||
337 | WARN_ON(1); | ||
338 | } | ||
339 | EXPORT_SYMBOL_GPL(free_irq); | ||
340 | |||
341 | void enable_irq(unsigned int irq) | ||
342 | { | ||
343 | WARN_ON(1); | ||
344 | } | ||
345 | EXPORT_SYMBOL_GPL(enable_irq); | ||
346 | |||
347 | void disable_irq(unsigned int irq) | ||
348 | { | ||
349 | WARN_ON(1); | ||
350 | } | ||
351 | EXPORT_SYMBOL_GPL(disable_irq); | ||
352 | |||
353 | #endif /* !CONFIG_PCI */ | ||
354 | |||
355 | void disable_irq_nosync(unsigned int irq) | ||
356 | { | ||
357 | disable_irq(irq); | ||
358 | } | ||
359 | EXPORT_SYMBOL_GPL(disable_irq_nosync); | ||
360 | |||
361 | unsigned long probe_irq_on(void) | ||
362 | { | ||
363 | return 0; | ||
364 | } | ||
365 | EXPORT_SYMBOL_GPL(probe_irq_on); | ||
366 | |||
367 | int probe_irq_off(unsigned long val) | ||
368 | { | ||
369 | return 0; | ||
370 | } | ||
371 | EXPORT_SYMBOL_GPL(probe_irq_off); | ||
372 | |||
373 | unsigned int probe_irq_mask(unsigned long val) | ||
374 | { | ||
375 | return val; | ||
376 | } | ||
377 | EXPORT_SYMBOL_GPL(probe_irq_mask); | ||
diff --git a/arch/s390/kernel/sclp.S b/arch/s390/kernel/sclp.S index b6506ee32a36..29bd7bec4176 100644 --- a/arch/s390/kernel/sclp.S +++ b/arch/s390/kernel/sclp.S | |||
@@ -225,7 +225,7 @@ _sclp_print: | |||
225 | ahi %r2,1 | 225 | ahi %r2,1 |
226 | ltr %r0,%r0 # end of string? | 226 | ltr %r0,%r0 # end of string? |
227 | jz .LfinalizemtoS4 | 227 | jz .LfinalizemtoS4 |
228 | chi %r0,0x15 # end of line (NL)? | 228 | chi %r0,0x0a # end of line (NL)? |
229 | jz .LfinalizemtoS4 | 229 | jz .LfinalizemtoS4 |
230 | stc %r0,0(%r6,%r7) # copy to mto | 230 | stc %r0,0(%r6,%r7) # copy to mto |
231 | la %r11,0(%r6,%r7) | 231 | la %r11,0(%r6,%r7) |
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index e6f15b5d8b7d..f1e5be85d592 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c | |||
@@ -302,15 +302,6 @@ static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len) | |||
302 | return rc; | 302 | return rc; |
303 | } | 303 | } |
304 | 304 | ||
305 | void synchronize_irq(unsigned int irq) | ||
306 | { | ||
307 | /* | ||
308 | * Not needed, the handler is protected by a lock and IRQs that occur | ||
309 | * after the handler is deleted are just NOPs. | ||
310 | */ | ||
311 | } | ||
312 | EXPORT_SYMBOL_GPL(synchronize_irq); | ||
313 | |||
314 | void enable_irq(unsigned int irq) | 305 | void enable_irq(unsigned int irq) |
315 | { | 306 | { |
316 | struct msi_desc *msi = irq_get_msi_desc(irq); | 307 | struct msi_desc *msi = irq_get_msi_desc(irq); |
@@ -327,30 +318,6 @@ void disable_irq(unsigned int irq) | |||
327 | } | 318 | } |
328 | EXPORT_SYMBOL_GPL(disable_irq); | 319 | EXPORT_SYMBOL_GPL(disable_irq); |
329 | 320 | ||
330 | void disable_irq_nosync(unsigned int irq) | ||
331 | { | ||
332 | disable_irq(irq); | ||
333 | } | ||
334 | EXPORT_SYMBOL_GPL(disable_irq_nosync); | ||
335 | |||
336 | unsigned long probe_irq_on(void) | ||
337 | { | ||
338 | return 0; | ||
339 | } | ||
340 | EXPORT_SYMBOL_GPL(probe_irq_on); | ||
341 | |||
342 | int probe_irq_off(unsigned long val) | ||
343 | { | ||
344 | return 0; | ||
345 | } | ||
346 | EXPORT_SYMBOL_GPL(probe_irq_off); | ||
347 | |||
348 | unsigned int probe_irq_mask(unsigned long val) | ||
349 | { | ||
350 | return val; | ||
351 | } | ||
352 | EXPORT_SYMBOL_GPL(probe_irq_mask); | ||
353 | |||
354 | void pcibios_fixup_bus(struct pci_bus *bus) | 321 | void pcibios_fixup_bus(struct pci_bus *bus) |
355 | { | 322 | { |
356 | } | 323 | } |
diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c index 9f20566b0773..79cc0d1a477d 100644 --- a/arch/sparc/kernel/prom_common.c +++ b/arch/sparc/kernel/prom_common.c | |||
@@ -54,6 +54,7 @@ EXPORT_SYMBOL(of_set_property_mutex); | |||
54 | int of_set_property(struct device_node *dp, const char *name, void *val, int len) | 54 | int of_set_property(struct device_node *dp, const char *name, void *val, int len) |
55 | { | 55 | { |
56 | struct property **prevp; | 56 | struct property **prevp; |
57 | unsigned long flags; | ||
57 | void *new_val; | 58 | void *new_val; |
58 | int err; | 59 | int err; |
59 | 60 | ||
@@ -64,7 +65,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len | |||
64 | err = -ENODEV; | 65 | err = -ENODEV; |
65 | 66 | ||
66 | mutex_lock(&of_set_property_mutex); | 67 | mutex_lock(&of_set_property_mutex); |
67 | raw_spin_lock(&devtree_lock); | 68 | raw_spin_lock_irqsave(&devtree_lock, flags); |
68 | prevp = &dp->properties; | 69 | prevp = &dp->properties; |
69 | while (*prevp) { | 70 | while (*prevp) { |
70 | struct property *prop = *prevp; | 71 | struct property *prop = *prevp; |
@@ -91,7 +92,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len | |||
91 | } | 92 | } |
92 | prevp = &(*prevp)->next; | 93 | prevp = &(*prevp)->next; |
93 | } | 94 | } |
94 | raw_spin_unlock(&devtree_lock); | 95 | raw_spin_unlock_irqrestore(&devtree_lock, flags); |
95 | mutex_unlock(&of_set_property_mutex); | 96 | mutex_unlock(&of_set_property_mutex); |
96 | 97 | ||
97 | /* XXX Upate procfs if necessary... */ | 98 | /* XXX Upate procfs if necessary... */ |
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index 35ee62fccf98..c205035a6b96 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c | |||
@@ -251,51 +251,6 @@ static void find_bits(unsigned long mask, u8 *pos, u8 *size) | |||
251 | *size = len; | 251 | *size = len; |
252 | } | 252 | } |
253 | 253 | ||
254 | static efi_status_t setup_efi_vars(struct boot_params *params) | ||
255 | { | ||
256 | struct setup_data *data; | ||
257 | struct efi_var_bootdata *efidata; | ||
258 | u64 store_size, remaining_size, var_size; | ||
259 | efi_status_t status; | ||
260 | |||
261 | if (sys_table->runtime->hdr.revision < EFI_2_00_SYSTEM_TABLE_REVISION) | ||
262 | return EFI_UNSUPPORTED; | ||
263 | |||
264 | data = (struct setup_data *)(unsigned long)params->hdr.setup_data; | ||
265 | |||
266 | while (data && data->next) | ||
267 | data = (struct setup_data *)(unsigned long)data->next; | ||
268 | |||
269 | status = efi_call_phys4((void *)sys_table->runtime->query_variable_info, | ||
270 | EFI_VARIABLE_NON_VOLATILE | | ||
271 | EFI_VARIABLE_BOOTSERVICE_ACCESS | | ||
272 | EFI_VARIABLE_RUNTIME_ACCESS, &store_size, | ||
273 | &remaining_size, &var_size); | ||
274 | |||
275 | if (status != EFI_SUCCESS) | ||
276 | return status; | ||
277 | |||
278 | status = efi_call_phys3(sys_table->boottime->allocate_pool, | ||
279 | EFI_LOADER_DATA, sizeof(*efidata), &efidata); | ||
280 | |||
281 | if (status != EFI_SUCCESS) | ||
282 | return status; | ||
283 | |||
284 | efidata->data.type = SETUP_EFI_VARS; | ||
285 | efidata->data.len = sizeof(struct efi_var_bootdata) - | ||
286 | sizeof(struct setup_data); | ||
287 | efidata->data.next = 0; | ||
288 | efidata->store_size = store_size; | ||
289 | efidata->remaining_size = remaining_size; | ||
290 | efidata->max_var_size = var_size; | ||
291 | |||
292 | if (data) | ||
293 | data->next = (unsigned long)efidata; | ||
294 | else | ||
295 | params->hdr.setup_data = (unsigned long)efidata; | ||
296 | |||
297 | } | ||
298 | |||
299 | static efi_status_t setup_efi_pci(struct boot_params *params) | 254 | static efi_status_t setup_efi_pci(struct boot_params *params) |
300 | { | 255 | { |
301 | efi_pci_io_protocol *pci; | 256 | efi_pci_io_protocol *pci; |
@@ -1202,8 +1157,6 @@ struct boot_params *efi_main(void *handle, efi_system_table_t *_table, | |||
1202 | 1157 | ||
1203 | setup_graphics(boot_params); | 1158 | setup_graphics(boot_params); |
1204 | 1159 | ||
1205 | setup_efi_vars(boot_params); | ||
1206 | |||
1207 | setup_efi_pci(boot_params); | 1160 | setup_efi_pci(boot_params); |
1208 | 1161 | ||
1209 | status = efi_call_phys3(sys_table->boottime->allocate_pool, | 1162 | status = efi_call_phys3(sys_table->boottime->allocate_pool, |
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 2fb5d5884e23..60c89f30c727 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h | |||
@@ -102,13 +102,6 @@ extern void efi_call_phys_epilog(void); | |||
102 | extern void efi_unmap_memmap(void); | 102 | extern void efi_unmap_memmap(void); |
103 | extern void efi_memory_uc(u64 addr, unsigned long size); | 103 | extern void efi_memory_uc(u64 addr, unsigned long size); |
104 | 104 | ||
105 | struct efi_var_bootdata { | ||
106 | struct setup_data data; | ||
107 | u64 store_size; | ||
108 | u64 remaining_size; | ||
109 | u64 max_var_size; | ||
110 | }; | ||
111 | |||
112 | #ifdef CONFIG_EFI | 105 | #ifdef CONFIG_EFI |
113 | 106 | ||
114 | static inline bool efi_is_native(void) | 107 | static inline bool efi_is_native(void) |
diff --git a/arch/x86/include/uapi/asm/bootparam.h b/arch/x86/include/uapi/asm/bootparam.h index 08744242b8d2..c15ddaf90710 100644 --- a/arch/x86/include/uapi/asm/bootparam.h +++ b/arch/x86/include/uapi/asm/bootparam.h | |||
@@ -6,7 +6,6 @@ | |||
6 | #define SETUP_E820_EXT 1 | 6 | #define SETUP_E820_EXT 1 |
7 | #define SETUP_DTB 2 | 7 | #define SETUP_DTB 2 |
8 | #define SETUP_PCI 3 | 8 | #define SETUP_PCI 3 |
9 | #define SETUP_EFI_VARS 4 | ||
10 | 9 | ||
11 | /* ram_size flags */ | 10 | /* ram_size flags */ |
12 | #define RAMDISK_IMAGE_START_MASK 0x07FF | 11 | #define RAMDISK_IMAGE_START_MASK 0x07FF |
diff --git a/arch/x86/kernel/relocate_kernel_64.S b/arch/x86/kernel/relocate_kernel_64.S index 7a6f3b3be3cf..f2bb9c96720a 100644 --- a/arch/x86/kernel/relocate_kernel_64.S +++ b/arch/x86/kernel/relocate_kernel_64.S | |||
@@ -160,7 +160,7 @@ identity_mapped: | |||
160 | xorq %rbp, %rbp | 160 | xorq %rbp, %rbp |
161 | xorq %r8, %r8 | 161 | xorq %r8, %r8 |
162 | xorq %r9, %r9 | 162 | xorq %r9, %r9 |
163 | xorq %r10, %r9 | 163 | xorq %r10, %r10 |
164 | xorq %r11, %r11 | 164 | xorq %r11, %r11 |
165 | xorq %r12, %r12 | 165 | xorq %r12, %r12 |
166 | xorq %r13, %r13 | 166 | xorq %r13, %r13 |
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index eaac1743def7..1f34e9219775 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
@@ -277,6 +277,9 @@ static int __meminit split_mem_range(struct map_range *mr, int nr_range, | |||
277 | end_pfn = limit_pfn; | 277 | end_pfn = limit_pfn; |
278 | nr_range = save_mr(mr, nr_range, start_pfn, end_pfn, 0); | 278 | nr_range = save_mr(mr, nr_range, start_pfn, end_pfn, 0); |
279 | 279 | ||
280 | if (!after_bootmem) | ||
281 | adjust_range_page_size_mask(mr, nr_range); | ||
282 | |||
280 | /* try to merge same page size and continuous */ | 283 | /* try to merge same page size and continuous */ |
281 | for (i = 0; nr_range > 1 && i < nr_range - 1; i++) { | 284 | for (i = 0; nr_range > 1 && i < nr_range - 1; i++) { |
282 | unsigned long old_start; | 285 | unsigned long old_start; |
@@ -291,9 +294,6 @@ static int __meminit split_mem_range(struct map_range *mr, int nr_range, | |||
291 | nr_range--; | 294 | nr_range--; |
292 | } | 295 | } |
293 | 296 | ||
294 | if (!after_bootmem) | ||
295 | adjust_range_page_size_mask(mr, nr_range); | ||
296 | |||
297 | for (i = 0; i < nr_range; i++) | 297 | for (i = 0; i < nr_range; i++) |
298 | printk(KERN_DEBUG " [mem %#010lx-%#010lx] page %s\n", | 298 | printk(KERN_DEBUG " [mem %#010lx-%#010lx] page %s\n", |
299 | mr[i].start, mr[i].end - 1, | 299 | mr[i].start, mr[i].end - 1, |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 82089d8b1954..5ae2eb09419e 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
@@ -42,7 +42,6 @@ | |||
42 | #include <linux/io.h> | 42 | #include <linux/io.h> |
43 | #include <linux/reboot.h> | 43 | #include <linux/reboot.h> |
44 | #include <linux/bcd.h> | 44 | #include <linux/bcd.h> |
45 | #include <linux/ucs2_string.h> | ||
46 | 45 | ||
47 | #include <asm/setup.h> | 46 | #include <asm/setup.h> |
48 | #include <asm/efi.h> | 47 | #include <asm/efi.h> |
@@ -54,12 +53,12 @@ | |||
54 | 53 | ||
55 | #define EFI_DEBUG 1 | 54 | #define EFI_DEBUG 1 |
56 | 55 | ||
57 | /* | 56 | #define EFI_MIN_RESERVE 5120 |
58 | * There's some additional metadata associated with each | 57 | |
59 | * variable. Intel's reference implementation is 60 bytes - bump that | 58 | #define EFI_DUMMY_GUID \ |
60 | * to account for potential alignment constraints | 59 | EFI_GUID(0x4424ac57, 0xbe4b, 0x47dd, 0x9e, 0x97, 0xed, 0x50, 0xf0, 0x9f, 0x92, 0xa9) |
61 | */ | 60 | |
62 | #define VAR_METADATA_SIZE 64 | 61 | static efi_char16_t efi_dummy_name[6] = { 'D', 'U', 'M', 'M', 'Y', 0 }; |
63 | 62 | ||
64 | struct efi __read_mostly efi = { | 63 | struct efi __read_mostly efi = { |
65 | .mps = EFI_INVALID_TABLE_ADDR, | 64 | .mps = EFI_INVALID_TABLE_ADDR, |
@@ -79,13 +78,6 @@ struct efi_memory_map memmap; | |||
79 | static struct efi efi_phys __initdata; | 78 | static struct efi efi_phys __initdata; |
80 | static efi_system_table_t efi_systab __initdata; | 79 | static efi_system_table_t efi_systab __initdata; |
81 | 80 | ||
82 | static u64 efi_var_store_size; | ||
83 | static u64 efi_var_remaining_size; | ||
84 | static u64 efi_var_max_var_size; | ||
85 | static u64 boot_used_size; | ||
86 | static u64 boot_var_size; | ||
87 | static u64 active_size; | ||
88 | |||
89 | unsigned long x86_efi_facility; | 81 | unsigned long x86_efi_facility; |
90 | 82 | ||
91 | /* | 83 | /* |
@@ -188,53 +180,8 @@ static efi_status_t virt_efi_get_next_variable(unsigned long *name_size, | |||
188 | efi_char16_t *name, | 180 | efi_char16_t *name, |
189 | efi_guid_t *vendor) | 181 | efi_guid_t *vendor) |
190 | { | 182 | { |
191 | efi_status_t status; | 183 | return efi_call_virt3(get_next_variable, |
192 | static bool finished = false; | 184 | name_size, name, vendor); |
193 | static u64 var_size; | ||
194 | |||
195 | status = efi_call_virt3(get_next_variable, | ||
196 | name_size, name, vendor); | ||
197 | |||
198 | if (status == EFI_NOT_FOUND) { | ||
199 | finished = true; | ||
200 | if (var_size < boot_used_size) { | ||
201 | boot_var_size = boot_used_size - var_size; | ||
202 | active_size += boot_var_size; | ||
203 | } else { | ||
204 | printk(KERN_WARNING FW_BUG "efi: Inconsistent initial sizes\n"); | ||
205 | } | ||
206 | } | ||
207 | |||
208 | if (boot_used_size && !finished) { | ||
209 | unsigned long size = 0; | ||
210 | u32 attr; | ||
211 | efi_status_t s; | ||
212 | void *tmp; | ||
213 | |||
214 | s = virt_efi_get_variable(name, vendor, &attr, &size, NULL); | ||
215 | |||
216 | if (s != EFI_BUFFER_TOO_SMALL || !size) | ||
217 | return status; | ||
218 | |||
219 | tmp = kmalloc(size, GFP_ATOMIC); | ||
220 | |||
221 | if (!tmp) | ||
222 | return status; | ||
223 | |||
224 | s = virt_efi_get_variable(name, vendor, &attr, &size, tmp); | ||
225 | |||
226 | if (s == EFI_SUCCESS && (attr & EFI_VARIABLE_NON_VOLATILE)) { | ||
227 | var_size += size; | ||
228 | var_size += ucs2_strsize(name, 1024); | ||
229 | active_size += size; | ||
230 | active_size += VAR_METADATA_SIZE; | ||
231 | active_size += ucs2_strsize(name, 1024); | ||
232 | } | ||
233 | |||
234 | kfree(tmp); | ||
235 | } | ||
236 | |||
237 | return status; | ||
238 | } | 185 | } |
239 | 186 | ||
240 | static efi_status_t virt_efi_set_variable(efi_char16_t *name, | 187 | static efi_status_t virt_efi_set_variable(efi_char16_t *name, |
@@ -243,34 +190,9 @@ static efi_status_t virt_efi_set_variable(efi_char16_t *name, | |||
243 | unsigned long data_size, | 190 | unsigned long data_size, |
244 | void *data) | 191 | void *data) |
245 | { | 192 | { |
246 | efi_status_t status; | 193 | return efi_call_virt5(set_variable, |
247 | u32 orig_attr = 0; | 194 | name, vendor, attr, |
248 | unsigned long orig_size = 0; | 195 | data_size, data); |
249 | |||
250 | status = virt_efi_get_variable(name, vendor, &orig_attr, &orig_size, | ||
251 | NULL); | ||
252 | |||
253 | if (status != EFI_BUFFER_TOO_SMALL) | ||
254 | orig_size = 0; | ||
255 | |||
256 | status = efi_call_virt5(set_variable, | ||
257 | name, vendor, attr, | ||
258 | data_size, data); | ||
259 | |||
260 | if (status == EFI_SUCCESS) { | ||
261 | if (orig_size) { | ||
262 | active_size -= orig_size; | ||
263 | active_size -= ucs2_strsize(name, 1024); | ||
264 | active_size -= VAR_METADATA_SIZE; | ||
265 | } | ||
266 | if (data_size) { | ||
267 | active_size += data_size; | ||
268 | active_size += ucs2_strsize(name, 1024); | ||
269 | active_size += VAR_METADATA_SIZE; | ||
270 | } | ||
271 | } | ||
272 | |||
273 | return status; | ||
274 | } | 196 | } |
275 | 197 | ||
276 | static efi_status_t virt_efi_query_variable_info(u32 attr, | 198 | static efi_status_t virt_efi_query_variable_info(u32 attr, |
@@ -786,9 +708,6 @@ void __init efi_init(void) | |||
786 | char vendor[100] = "unknown"; | 708 | char vendor[100] = "unknown"; |
787 | int i = 0; | 709 | int i = 0; |
788 | void *tmp; | 710 | void *tmp; |
789 | struct setup_data *data; | ||
790 | struct efi_var_bootdata *efi_var_data; | ||
791 | u64 pa_data; | ||
792 | 711 | ||
793 | #ifdef CONFIG_X86_32 | 712 | #ifdef CONFIG_X86_32 |
794 | if (boot_params.efi_info.efi_systab_hi || | 713 | if (boot_params.efi_info.efi_systab_hi || |
@@ -806,22 +725,6 @@ void __init efi_init(void) | |||
806 | if (efi_systab_init(efi_phys.systab)) | 725 | if (efi_systab_init(efi_phys.systab)) |
807 | return; | 726 | return; |
808 | 727 | ||
809 | pa_data = boot_params.hdr.setup_data; | ||
810 | while (pa_data) { | ||
811 | data = early_ioremap(pa_data, sizeof(*efi_var_data)); | ||
812 | if (data->type == SETUP_EFI_VARS) { | ||
813 | efi_var_data = (struct efi_var_bootdata *)data; | ||
814 | |||
815 | efi_var_store_size = efi_var_data->store_size; | ||
816 | efi_var_remaining_size = efi_var_data->remaining_size; | ||
817 | efi_var_max_var_size = efi_var_data->max_var_size; | ||
818 | } | ||
819 | pa_data = data->next; | ||
820 | early_iounmap(data, sizeof(*efi_var_data)); | ||
821 | } | ||
822 | |||
823 | boot_used_size = efi_var_store_size - efi_var_remaining_size; | ||
824 | |||
825 | set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility); | 728 | set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility); |
826 | 729 | ||
827 | /* | 730 | /* |
@@ -1085,6 +988,13 @@ void __init efi_enter_virtual_mode(void) | |||
1085 | runtime_code_page_mkexec(); | 988 | runtime_code_page_mkexec(); |
1086 | 989 | ||
1087 | kfree(new_memmap); | 990 | kfree(new_memmap); |
991 | |||
992 | /* clean DUMMY object */ | ||
993 | efi.set_variable(efi_dummy_name, &EFI_DUMMY_GUID, | ||
994 | EFI_VARIABLE_NON_VOLATILE | | ||
995 | EFI_VARIABLE_BOOTSERVICE_ACCESS | | ||
996 | EFI_VARIABLE_RUNTIME_ACCESS, | ||
997 | 0, NULL); | ||
1088 | } | 998 | } |
1089 | 999 | ||
1090 | /* | 1000 | /* |
@@ -1136,33 +1046,65 @@ efi_status_t efi_query_variable_store(u32 attributes, unsigned long size) | |||
1136 | efi_status_t status; | 1046 | efi_status_t status; |
1137 | u64 storage_size, remaining_size, max_size; | 1047 | u64 storage_size, remaining_size, max_size; |
1138 | 1048 | ||
1049 | if (!(attributes & EFI_VARIABLE_NON_VOLATILE)) | ||
1050 | return 0; | ||
1051 | |||
1139 | status = efi.query_variable_info(attributes, &storage_size, | 1052 | status = efi.query_variable_info(attributes, &storage_size, |
1140 | &remaining_size, &max_size); | 1053 | &remaining_size, &max_size); |
1141 | if (status != EFI_SUCCESS) | 1054 | if (status != EFI_SUCCESS) |
1142 | return status; | 1055 | return status; |
1143 | 1056 | ||
1144 | if (!max_size && remaining_size > size) | ||
1145 | printk_once(KERN_ERR FW_BUG "Broken EFI implementation" | ||
1146 | " is returning MaxVariableSize=0\n"); | ||
1147 | /* | 1057 | /* |
1148 | * Some firmware implementations refuse to boot if there's insufficient | 1058 | * Some firmware implementations refuse to boot if there's insufficient |
1149 | * space in the variable store. We account for that by refusing the | 1059 | * space in the variable store. We account for that by refusing the |
1150 | * write if permitting it would reduce the available space to under | 1060 | * write if permitting it would reduce the available space to under |
1151 | * 50%. However, some firmware won't reclaim variable space until | 1061 | * 5KB. This figure was provided by Samsung, so should be safe. |
1152 | * after the used (not merely the actively used) space drops below | ||
1153 | * a threshold. We can approximate that case with the value calculated | ||
1154 | * above. If both the firmware and our calculations indicate that the | ||
1155 | * available space would drop below 50%, refuse the write. | ||
1156 | */ | 1062 | */ |
1063 | if ((remaining_size - size < EFI_MIN_RESERVE) && | ||
1064 | !efi_no_storage_paranoia) { | ||
1065 | |||
1066 | /* | ||
1067 | * Triggering garbage collection may require that the firmware | ||
1068 | * generate a real EFI_OUT_OF_RESOURCES error. We can force | ||
1069 | * that by attempting to use more space than is available. | ||
1070 | */ | ||
1071 | unsigned long dummy_size = remaining_size + 1024; | ||
1072 | void *dummy = kmalloc(dummy_size, GFP_ATOMIC); | ||
1073 | |||
1074 | status = efi.set_variable(efi_dummy_name, &EFI_DUMMY_GUID, | ||
1075 | EFI_VARIABLE_NON_VOLATILE | | ||
1076 | EFI_VARIABLE_BOOTSERVICE_ACCESS | | ||
1077 | EFI_VARIABLE_RUNTIME_ACCESS, | ||
1078 | dummy_size, dummy); | ||
1079 | |||
1080 | if (status == EFI_SUCCESS) { | ||
1081 | /* | ||
1082 | * This should have failed, so if it didn't make sure | ||
1083 | * that we delete it... | ||
1084 | */ | ||
1085 | efi.set_variable(efi_dummy_name, &EFI_DUMMY_GUID, | ||
1086 | EFI_VARIABLE_NON_VOLATILE | | ||
1087 | EFI_VARIABLE_BOOTSERVICE_ACCESS | | ||
1088 | EFI_VARIABLE_RUNTIME_ACCESS, | ||
1089 | 0, dummy); | ||
1090 | } | ||
1157 | 1091 | ||
1158 | if (!storage_size || size > remaining_size || | 1092 | /* |
1159 | (max_size && size > max_size)) | 1093 | * The runtime code may now have triggered a garbage collection |
1160 | return EFI_OUT_OF_RESOURCES; | 1094 | * run, so check the variable info again |
1095 | */ | ||
1096 | status = efi.query_variable_info(attributes, &storage_size, | ||
1097 | &remaining_size, &max_size); | ||
1161 | 1098 | ||
1162 | if (!efi_no_storage_paranoia && | 1099 | if (status != EFI_SUCCESS) |
1163 | ((active_size + size + VAR_METADATA_SIZE > storage_size / 2) && | 1100 | return status; |
1164 | (remaining_size - size < storage_size / 2))) | 1101 | |
1165 | return EFI_OUT_OF_RESOURCES; | 1102 | /* |
1103 | * There still isn't enough room, so return an error | ||
1104 | */ | ||
1105 | if (remaining_size - size < EFI_MIN_RESERVE) | ||
1106 | return EFI_OUT_OF_RESOURCES; | ||
1107 | } | ||
1166 | 1108 | ||
1167 | return EFI_SUCCESS; | 1109 | return EFI_SUCCESS; |
1168 | } | 1110 | } |
diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c index 590be1090892..f7bab68a4b83 100644 --- a/arch/x86/tools/relocs.c +++ b/arch/x86/tools/relocs.c | |||
@@ -42,9 +42,6 @@ static const char * const sym_regex_kernel[S_NSYMTYPES] = { | |||
42 | "^(xen_irq_disable_direct_reloc$|" | 42 | "^(xen_irq_disable_direct_reloc$|" |
43 | "xen_save_fl_direct_reloc$|" | 43 | "xen_save_fl_direct_reloc$|" |
44 | "VDSO|" | 44 | "VDSO|" |
45 | #if ELF_BITS == 64 | ||
46 | "__vvar_page|" | ||
47 | #endif | ||
48 | "__crc_)", | 45 | "__crc_)", |
49 | 46 | ||
50 | /* | 47 | /* |
@@ -72,6 +69,7 @@ static const char * const sym_regex_kernel[S_NSYMTYPES] = { | |||
72 | "__per_cpu_load|" | 69 | "__per_cpu_load|" |
73 | "init_per_cpu__.*|" | 70 | "init_per_cpu__.*|" |
74 | "__end_rodata_hpage_align|" | 71 | "__end_rodata_hpage_align|" |
72 | "__vvar_page|" | ||
75 | #endif | 73 | #endif |
76 | "_end)$" | 74 | "_end)$" |
77 | }; | 75 | }; |
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c index fb44426fe931..d99cae8147d1 100644 --- a/arch/x86/xen/smp.c +++ b/arch/x86/xen/smp.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
18 | #include <linux/smp.h> | 18 | #include <linux/smp.h> |
19 | #include <linux/irq_work.h> | 19 | #include <linux/irq_work.h> |
20 | #include <linux/tick.h> | ||
20 | 21 | ||
21 | #include <asm/paravirt.h> | 22 | #include <asm/paravirt.h> |
22 | #include <asm/desc.h> | 23 | #include <asm/desc.h> |
@@ -447,6 +448,13 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */ | |||
447 | play_dead_common(); | 448 | play_dead_common(); |
448 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); | 449 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); |
449 | cpu_bringup(); | 450 | cpu_bringup(); |
451 | /* | ||
452 | * commit 4b0c0f294 (tick: Cleanup NOHZ per cpu data on cpu down) | ||
453 | * clears certain data that the cpu_idle loop (which called us | ||
454 | * and that we return from) expects. The only way to get that | ||
455 | * data back is to call: | ||
456 | */ | ||
457 | tick_nohz_idle_enter(); | ||
450 | } | 458 | } |
451 | 459 | ||
452 | #else /* !CONFIG_HOTPLUG_CPU */ | 460 | #else /* !CONFIG_HOTPLUG_CPU */ |
diff --git a/block/blk-core.c b/block/blk-core.c index 33c33bc99ddd..d5745b5833c9 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -3164,7 +3164,7 @@ void blk_post_runtime_resume(struct request_queue *q, int err) | |||
3164 | q->rpm_status = RPM_ACTIVE; | 3164 | q->rpm_status = RPM_ACTIVE; |
3165 | __blk_run_queue(q); | 3165 | __blk_run_queue(q); |
3166 | pm_runtime_mark_last_busy(q->dev); | 3166 | pm_runtime_mark_last_busy(q->dev); |
3167 | pm_runtime_autosuspend(q->dev); | 3167 | pm_request_autosuspend(q->dev); |
3168 | } else { | 3168 | } else { |
3169 | q->rpm_status = RPM_SUSPENDED; | 3169 | q->rpm_status = RPM_SUSPENDED; |
3170 | } | 3170 | } |
diff --git a/crypto/Kconfig b/crypto/Kconfig index 622d8a48cbe9..bf8148e74e73 100644 --- a/crypto/Kconfig +++ b/crypto/Kconfig | |||
@@ -823,6 +823,7 @@ config CRYPTO_BLOWFISH_X86_64 | |||
823 | config CRYPTO_BLOWFISH_AVX2_X86_64 | 823 | config CRYPTO_BLOWFISH_AVX2_X86_64 |
824 | tristate "Blowfish cipher algorithm (x86_64/AVX2)" | 824 | tristate "Blowfish cipher algorithm (x86_64/AVX2)" |
825 | depends on X86 && 64BIT | 825 | depends on X86 && 64BIT |
826 | depends on BROKEN | ||
826 | select CRYPTO_ALGAPI | 827 | select CRYPTO_ALGAPI |
827 | select CRYPTO_CRYPTD | 828 | select CRYPTO_CRYPTD |
828 | select CRYPTO_ABLK_HELPER_X86 | 829 | select CRYPTO_ABLK_HELPER_X86 |
@@ -1299,6 +1300,7 @@ config CRYPTO_TWOFISH_AVX_X86_64 | |||
1299 | config CRYPTO_TWOFISH_AVX2_X86_64 | 1300 | config CRYPTO_TWOFISH_AVX2_X86_64 |
1300 | tristate "Twofish cipher algorithm (x86_64/AVX2)" | 1301 | tristate "Twofish cipher algorithm (x86_64/AVX2)" |
1301 | depends on X86 && 64BIT | 1302 | depends on X86 && 64BIT |
1303 | depends on BROKEN | ||
1302 | select CRYPTO_ALGAPI | 1304 | select CRYPTO_ALGAPI |
1303 | select CRYPTO_CRYPTD | 1305 | select CRYPTO_CRYPTD |
1304 | select CRYPTO_ABLK_HELPER_X86 | 1306 | select CRYPTO_ABLK_HELPER_X86 |
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index 403baf4dffc1..fcd7d91cec34 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c | |||
@@ -919,13 +919,14 @@ static int ghes_probe(struct platform_device *ghes_dev) | |||
919 | break; | 919 | break; |
920 | case ACPI_HEST_NOTIFY_EXTERNAL: | 920 | case ACPI_HEST_NOTIFY_EXTERNAL: |
921 | /* External interrupt vector is GSI */ | 921 | /* External interrupt vector is GSI */ |
922 | if (acpi_gsi_to_irq(generic->notify.vector, &ghes->irq)) { | 922 | rc = acpi_gsi_to_irq(generic->notify.vector, &ghes->irq); |
923 | if (rc) { | ||
923 | pr_err(GHES_PFX "Failed to map GSI to IRQ for generic hardware error source: %d\n", | 924 | pr_err(GHES_PFX "Failed to map GSI to IRQ for generic hardware error source: %d\n", |
924 | generic->header.source_id); | 925 | generic->header.source_id); |
925 | goto err_edac_unreg; | 926 | goto err_edac_unreg; |
926 | } | 927 | } |
927 | if (request_irq(ghes->irq, ghes_irq_func, | 928 | rc = request_irq(ghes->irq, ghes_irq_func, 0, "GHES IRQ", ghes); |
928 | 0, "GHES IRQ", ghes)) { | 929 | if (rc) { |
929 | pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n", | 930 | pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n", |
930 | generic->header.source_id); | 931 | generic->header.source_id); |
931 | goto err_edac_unreg; | 932 | goto err_edac_unreg; |
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index bc493aa3af19..318fa32a141e 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
@@ -278,11 +278,13 @@ int acpi_bus_init_power(struct acpi_device *device) | |||
278 | if (result) | 278 | if (result) |
279 | return result; | 279 | return result; |
280 | } else if (state == ACPI_STATE_UNKNOWN) { | 280 | } else if (state == ACPI_STATE_UNKNOWN) { |
281 | /* No power resources and missing _PSC? Try to force D0. */ | 281 | /* |
282 | * No power resources and missing _PSC? Cross fingers and make | ||
283 | * it D0 in hope that this is what the BIOS put the device into. | ||
284 | * [We tried to force D0 here by executing _PS0, but that broke | ||
285 | * Toshiba P870-303 in a nasty way.] | ||
286 | */ | ||
282 | state = ACPI_STATE_D0; | 287 | state = ACPI_STATE_D0; |
283 | result = acpi_dev_pm_explicit_set(device, state); | ||
284 | if (result) | ||
285 | return result; | ||
286 | } | 288 | } |
287 | device->power.state = state; | 289 | device->power.state = state; |
288 | return 0; | 290 | return 0; |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 44225cb15f3a..b14ac46948c9 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -1017,11 +1017,8 @@ acpi_bus_driver_init(struct acpi_device *device, struct acpi_driver *driver) | |||
1017 | return -ENOSYS; | 1017 | return -ENOSYS; |
1018 | 1018 | ||
1019 | result = driver->ops.add(device); | 1019 | result = driver->ops.add(device); |
1020 | if (result) { | 1020 | if (result) |
1021 | device->driver = NULL; | ||
1022 | device->driver_data = NULL; | ||
1023 | return result; | 1021 | return result; |
1024 | } | ||
1025 | 1022 | ||
1026 | device->driver = driver; | 1023 | device->driver = driver; |
1027 | 1024 | ||
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 5b32e15a65ce..440eadf2d32c 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
@@ -458,12 +458,28 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
458 | }, | 458 | }, |
459 | { | 459 | { |
460 | .callback = video_ignore_initial_backlight, | 460 | .callback = video_ignore_initial_backlight, |
461 | .ident = "HP Pavilion g6 Notebook PC", | ||
462 | .matches = { | ||
463 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
464 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"), | ||
465 | }, | ||
466 | }, | ||
467 | { | ||
468 | .callback = video_ignore_initial_backlight, | ||
461 | .ident = "HP 1000 Notebook PC", | 469 | .ident = "HP 1000 Notebook PC", |
462 | .matches = { | 470 | .matches = { |
463 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | 471 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
464 | DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"), | 472 | DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"), |
465 | }, | 473 | }, |
466 | }, | 474 | }, |
475 | { | ||
476 | .callback = video_ignore_initial_backlight, | ||
477 | .ident = "HP Pavilion m4", | ||
478 | .matches = { | ||
479 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
480 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"), | ||
481 | }, | ||
482 | }, | ||
467 | {} | 483 | {} |
468 | }; | 484 | }; |
469 | 485 | ||
@@ -1706,6 +1722,9 @@ static int acpi_video_bus_add(struct acpi_device *device) | |||
1706 | int error; | 1722 | int error; |
1707 | acpi_status status; | 1723 | acpi_status status; |
1708 | 1724 | ||
1725 | if (device->handler) | ||
1726 | return -EINVAL; | ||
1727 | |||
1709 | status = acpi_walk_namespace(ACPI_TYPE_DEVICE, | 1728 | status = acpi_walk_namespace(ACPI_TYPE_DEVICE, |
1710 | device->parent->handle, 1, | 1729 | device->parent->handle, 1, |
1711 | acpi_video_bus_match, NULL, | 1730 | acpi_video_bus_match, NULL, |
diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c index aa0875f6f1b7..02f490bad30f 100644 --- a/drivers/base/regmap/regcache-rbtree.c +++ b/drivers/base/regmap/regcache-rbtree.c | |||
@@ -143,7 +143,7 @@ static int rbtree_show(struct seq_file *s, void *ignored) | |||
143 | int registers = 0; | 143 | int registers = 0; |
144 | int this_registers, average; | 144 | int this_registers, average; |
145 | 145 | ||
146 | map->lock(map); | 146 | map->lock(map->lock_arg); |
147 | 147 | ||
148 | mem_size = sizeof(*rbtree_ctx); | 148 | mem_size = sizeof(*rbtree_ctx); |
149 | mem_size += BITS_TO_LONGS(map->cache_present_nbits) * sizeof(long); | 149 | mem_size += BITS_TO_LONGS(map->cache_present_nbits) * sizeof(long); |
@@ -170,7 +170,7 @@ static int rbtree_show(struct seq_file *s, void *ignored) | |||
170 | seq_printf(s, "%d nodes, %d registers, average %d registers, used %zu bytes\n", | 170 | seq_printf(s, "%d nodes, %d registers, average %d registers, used %zu bytes\n", |
171 | nodes, registers, average, mem_size); | 171 | nodes, registers, average, mem_size); |
172 | 172 | ||
173 | map->unlock(map); | 173 | map->unlock(map->lock_arg); |
174 | 174 | ||
175 | return 0; | 175 | return 0; |
176 | } | 176 | } |
@@ -391,8 +391,6 @@ static int regcache_rbtree_sync(struct regmap *map, unsigned int min, | |||
391 | for (node = rb_first(&rbtree_ctx->root); node; node = rb_next(node)) { | 391 | for (node = rb_first(&rbtree_ctx->root); node; node = rb_next(node)) { |
392 | rbnode = rb_entry(node, struct regcache_rbtree_node, node); | 392 | rbnode = rb_entry(node, struct regcache_rbtree_node, node); |
393 | 393 | ||
394 | if (rbnode->base_reg < min) | ||
395 | continue; | ||
396 | if (rbnode->base_reg > max) | 394 | if (rbnode->base_reg > max) |
397 | break; | 395 | break; |
398 | if (rbnode->base_reg + rbnode->blklen < min) | 396 | if (rbnode->base_reg + rbnode->blklen < min) |
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c index 75923f2396bd..507ee2da0f6e 100644 --- a/drivers/base/regmap/regcache.c +++ b/drivers/base/regmap/regcache.c | |||
@@ -270,7 +270,7 @@ int regcache_sync(struct regmap *map) | |||
270 | 270 | ||
271 | BUG_ON(!map->cache_ops || !map->cache_ops->sync); | 271 | BUG_ON(!map->cache_ops || !map->cache_ops->sync); |
272 | 272 | ||
273 | map->lock(map); | 273 | map->lock(map->lock_arg); |
274 | /* Remember the initial bypass state */ | 274 | /* Remember the initial bypass state */ |
275 | bypass = map->cache_bypass; | 275 | bypass = map->cache_bypass; |
276 | dev_dbg(map->dev, "Syncing %s cache\n", | 276 | dev_dbg(map->dev, "Syncing %s cache\n", |
@@ -306,7 +306,7 @@ out: | |||
306 | trace_regcache_sync(map->dev, name, "stop"); | 306 | trace_regcache_sync(map->dev, name, "stop"); |
307 | /* Restore the bypass state */ | 307 | /* Restore the bypass state */ |
308 | map->cache_bypass = bypass; | 308 | map->cache_bypass = bypass; |
309 | map->unlock(map); | 309 | map->unlock(map->lock_arg); |
310 | 310 | ||
311 | return ret; | 311 | return ret; |
312 | } | 312 | } |
@@ -333,7 +333,7 @@ int regcache_sync_region(struct regmap *map, unsigned int min, | |||
333 | 333 | ||
334 | BUG_ON(!map->cache_ops || !map->cache_ops->sync); | 334 | BUG_ON(!map->cache_ops || !map->cache_ops->sync); |
335 | 335 | ||
336 | map->lock(map); | 336 | map->lock(map->lock_arg); |
337 | 337 | ||
338 | /* Remember the initial bypass state */ | 338 | /* Remember the initial bypass state */ |
339 | bypass = map->cache_bypass; | 339 | bypass = map->cache_bypass; |
@@ -352,7 +352,7 @@ out: | |||
352 | trace_regcache_sync(map->dev, name, "stop region"); | 352 | trace_regcache_sync(map->dev, name, "stop region"); |
353 | /* Restore the bypass state */ | 353 | /* Restore the bypass state */ |
354 | map->cache_bypass = bypass; | 354 | map->cache_bypass = bypass; |
355 | map->unlock(map); | 355 | map->unlock(map->lock_arg); |
356 | 356 | ||
357 | return ret; | 357 | return ret; |
358 | } | 358 | } |
@@ -372,11 +372,11 @@ EXPORT_SYMBOL_GPL(regcache_sync_region); | |||
372 | */ | 372 | */ |
373 | void regcache_cache_only(struct regmap *map, bool enable) | 373 | void regcache_cache_only(struct regmap *map, bool enable) |
374 | { | 374 | { |
375 | map->lock(map); | 375 | map->lock(map->lock_arg); |
376 | WARN_ON(map->cache_bypass && enable); | 376 | WARN_ON(map->cache_bypass && enable); |
377 | map->cache_only = enable; | 377 | map->cache_only = enable; |
378 | trace_regmap_cache_only(map->dev, enable); | 378 | trace_regmap_cache_only(map->dev, enable); |
379 | map->unlock(map); | 379 | map->unlock(map->lock_arg); |
380 | } | 380 | } |
381 | EXPORT_SYMBOL_GPL(regcache_cache_only); | 381 | EXPORT_SYMBOL_GPL(regcache_cache_only); |
382 | 382 | ||
@@ -391,9 +391,9 @@ EXPORT_SYMBOL_GPL(regcache_cache_only); | |||
391 | */ | 391 | */ |
392 | void regcache_mark_dirty(struct regmap *map) | 392 | void regcache_mark_dirty(struct regmap *map) |
393 | { | 393 | { |
394 | map->lock(map); | 394 | map->lock(map->lock_arg); |
395 | map->cache_dirty = true; | 395 | map->cache_dirty = true; |
396 | map->unlock(map); | 396 | map->unlock(map->lock_arg); |
397 | } | 397 | } |
398 | EXPORT_SYMBOL_GPL(regcache_mark_dirty); | 398 | EXPORT_SYMBOL_GPL(regcache_mark_dirty); |
399 | 399 | ||
@@ -410,11 +410,11 @@ EXPORT_SYMBOL_GPL(regcache_mark_dirty); | |||
410 | */ | 410 | */ |
411 | void regcache_cache_bypass(struct regmap *map, bool enable) | 411 | void regcache_cache_bypass(struct regmap *map, bool enable) |
412 | { | 412 | { |
413 | map->lock(map); | 413 | map->lock(map->lock_arg); |
414 | WARN_ON(map->cache_only && enable); | 414 | WARN_ON(map->cache_only && enable); |
415 | map->cache_bypass = enable; | 415 | map->cache_bypass = enable; |
416 | trace_regmap_cache_bypass(map->dev, enable); | 416 | trace_regmap_cache_bypass(map->dev, enable); |
417 | map->unlock(map); | 417 | map->unlock(map->lock_arg); |
418 | } | 418 | } |
419 | EXPORT_SYMBOL_GPL(regcache_cache_bypass); | 419 | EXPORT_SYMBOL_GPL(regcache_cache_bypass); |
420 | 420 | ||
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c index 23b701f5fd2f..975719bc3450 100644 --- a/drivers/base/regmap/regmap-debugfs.c +++ b/drivers/base/regmap/regmap-debugfs.c | |||
@@ -265,6 +265,7 @@ static ssize_t regmap_map_write_file(struct file *file, | |||
265 | char *start = buf; | 265 | char *start = buf; |
266 | unsigned long reg, value; | 266 | unsigned long reg, value; |
267 | struct regmap *map = file->private_data; | 267 | struct regmap *map = file->private_data; |
268 | int ret; | ||
268 | 269 | ||
269 | buf_size = min(count, (sizeof(buf)-1)); | 270 | buf_size = min(count, (sizeof(buf)-1)); |
270 | if (copy_from_user(buf, user_buf, buf_size)) | 271 | if (copy_from_user(buf, user_buf, buf_size)) |
@@ -282,7 +283,9 @@ static ssize_t regmap_map_write_file(struct file *file, | |||
282 | /* Userspace has been fiddling around behind the kernel's back */ | 283 | /* Userspace has been fiddling around behind the kernel's back */ |
283 | add_taint(TAINT_USER, LOCKDEP_NOW_UNRELIABLE); | 284 | add_taint(TAINT_USER, LOCKDEP_NOW_UNRELIABLE); |
284 | 285 | ||
285 | regmap_write(map, reg, value); | 286 | ret = regmap_write(map, reg, value); |
287 | if (ret < 0) | ||
288 | return ret; | ||
286 | return buf_size; | 289 | return buf_size; |
287 | } | 290 | } |
288 | #else | 291 | #else |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 6374dc103521..62b6c2cc80b5 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -168,8 +168,6 @@ static irqreturn_t do_cciss_msix_intr(int irq, void *dev_id); | |||
168 | static int cciss_open(struct block_device *bdev, fmode_t mode); | 168 | static int cciss_open(struct block_device *bdev, fmode_t mode); |
169 | static int cciss_unlocked_open(struct block_device *bdev, fmode_t mode); | 169 | static int cciss_unlocked_open(struct block_device *bdev, fmode_t mode); |
170 | static void cciss_release(struct gendisk *disk, fmode_t mode); | 170 | static void cciss_release(struct gendisk *disk, fmode_t mode); |
171 | static int do_ioctl(struct block_device *bdev, fmode_t mode, | ||
172 | unsigned int cmd, unsigned long arg); | ||
173 | static int cciss_ioctl(struct block_device *bdev, fmode_t mode, | 171 | static int cciss_ioctl(struct block_device *bdev, fmode_t mode, |
174 | unsigned int cmd, unsigned long arg); | 172 | unsigned int cmd, unsigned long arg); |
175 | static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); | 173 | static int cciss_getgeo(struct block_device *bdev, struct hd_geometry *geo); |
@@ -235,7 +233,7 @@ static const struct block_device_operations cciss_fops = { | |||
235 | .owner = THIS_MODULE, | 233 | .owner = THIS_MODULE, |
236 | .open = cciss_unlocked_open, | 234 | .open = cciss_unlocked_open, |
237 | .release = cciss_release, | 235 | .release = cciss_release, |
238 | .ioctl = do_ioctl, | 236 | .ioctl = cciss_ioctl, |
239 | .getgeo = cciss_getgeo, | 237 | .getgeo = cciss_getgeo, |
240 | #ifdef CONFIG_COMPAT | 238 | #ifdef CONFIG_COMPAT |
241 | .compat_ioctl = cciss_compat_ioctl, | 239 | .compat_ioctl = cciss_compat_ioctl, |
@@ -1143,16 +1141,6 @@ static void cciss_release(struct gendisk *disk, fmode_t mode) | |||
1143 | mutex_unlock(&cciss_mutex); | 1141 | mutex_unlock(&cciss_mutex); |
1144 | } | 1142 | } |
1145 | 1143 | ||
1146 | static int do_ioctl(struct block_device *bdev, fmode_t mode, | ||
1147 | unsigned cmd, unsigned long arg) | ||
1148 | { | ||
1149 | int ret; | ||
1150 | mutex_lock(&cciss_mutex); | ||
1151 | ret = cciss_ioctl(bdev, mode, cmd, arg); | ||
1152 | mutex_unlock(&cciss_mutex); | ||
1153 | return ret; | ||
1154 | } | ||
1155 | |||
1156 | #ifdef CONFIG_COMPAT | 1144 | #ifdef CONFIG_COMPAT |
1157 | 1145 | ||
1158 | static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, | 1146 | static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, |
@@ -1179,7 +1167,7 @@ static int cciss_compat_ioctl(struct block_device *bdev, fmode_t mode, | |||
1179 | case CCISS_REGNEWD: | 1167 | case CCISS_REGNEWD: |
1180 | case CCISS_RESCANDISK: | 1168 | case CCISS_RESCANDISK: |
1181 | case CCISS_GETLUNINFO: | 1169 | case CCISS_GETLUNINFO: |
1182 | return do_ioctl(bdev, mode, cmd, arg); | 1170 | return cciss_ioctl(bdev, mode, cmd, arg); |
1183 | 1171 | ||
1184 | case CCISS_PASSTHRU32: | 1172 | case CCISS_PASSTHRU32: |
1185 | return cciss_ioctl32_passthru(bdev, mode, cmd, arg); | 1173 | return cciss_ioctl32_passthru(bdev, mode, cmd, arg); |
@@ -1219,7 +1207,7 @@ static int cciss_ioctl32_passthru(struct block_device *bdev, fmode_t mode, | |||
1219 | if (err) | 1207 | if (err) |
1220 | return -EFAULT; | 1208 | return -EFAULT; |
1221 | 1209 | ||
1222 | err = do_ioctl(bdev, mode, CCISS_PASSTHRU, (unsigned long)p); | 1210 | err = cciss_ioctl(bdev, mode, CCISS_PASSTHRU, (unsigned long)p); |
1223 | if (err) | 1211 | if (err) |
1224 | return err; | 1212 | return err; |
1225 | err |= | 1213 | err |= |
@@ -1261,7 +1249,7 @@ static int cciss_ioctl32_big_passthru(struct block_device *bdev, fmode_t mode, | |||
1261 | if (err) | 1249 | if (err) |
1262 | return -EFAULT; | 1250 | return -EFAULT; |
1263 | 1251 | ||
1264 | err = do_ioctl(bdev, mode, CCISS_BIG_PASSTHRU, (unsigned long)p); | 1252 | err = cciss_ioctl(bdev, mode, CCISS_BIG_PASSTHRU, (unsigned long)p); |
1265 | if (err) | 1253 | if (err) |
1266 | return err; | 1254 | return err; |
1267 | err |= | 1255 | err |= |
@@ -1311,11 +1299,14 @@ static int cciss_getpciinfo(ctlr_info_t *h, void __user *argp) | |||
1311 | static int cciss_getintinfo(ctlr_info_t *h, void __user *argp) | 1299 | static int cciss_getintinfo(ctlr_info_t *h, void __user *argp) |
1312 | { | 1300 | { |
1313 | cciss_coalint_struct intinfo; | 1301 | cciss_coalint_struct intinfo; |
1302 | unsigned long flags; | ||
1314 | 1303 | ||
1315 | if (!argp) | 1304 | if (!argp) |
1316 | return -EINVAL; | 1305 | return -EINVAL; |
1306 | spin_lock_irqsave(&h->lock, flags); | ||
1317 | intinfo.delay = readl(&h->cfgtable->HostWrite.CoalIntDelay); | 1307 | intinfo.delay = readl(&h->cfgtable->HostWrite.CoalIntDelay); |
1318 | intinfo.count = readl(&h->cfgtable->HostWrite.CoalIntCount); | 1308 | intinfo.count = readl(&h->cfgtable->HostWrite.CoalIntCount); |
1309 | spin_unlock_irqrestore(&h->lock, flags); | ||
1319 | if (copy_to_user | 1310 | if (copy_to_user |
1320 | (argp, &intinfo, sizeof(cciss_coalint_struct))) | 1311 | (argp, &intinfo, sizeof(cciss_coalint_struct))) |
1321 | return -EFAULT; | 1312 | return -EFAULT; |
@@ -1356,12 +1347,15 @@ static int cciss_setintinfo(ctlr_info_t *h, void __user *argp) | |||
1356 | static int cciss_getnodename(ctlr_info_t *h, void __user *argp) | 1347 | static int cciss_getnodename(ctlr_info_t *h, void __user *argp) |
1357 | { | 1348 | { |
1358 | NodeName_type NodeName; | 1349 | NodeName_type NodeName; |
1350 | unsigned long flags; | ||
1359 | int i; | 1351 | int i; |
1360 | 1352 | ||
1361 | if (!argp) | 1353 | if (!argp) |
1362 | return -EINVAL; | 1354 | return -EINVAL; |
1355 | spin_lock_irqsave(&h->lock, flags); | ||
1363 | for (i = 0; i < 16; i++) | 1356 | for (i = 0; i < 16; i++) |
1364 | NodeName[i] = readb(&h->cfgtable->ServerName[i]); | 1357 | NodeName[i] = readb(&h->cfgtable->ServerName[i]); |
1358 | spin_unlock_irqrestore(&h->lock, flags); | ||
1365 | if (copy_to_user(argp, NodeName, sizeof(NodeName_type))) | 1359 | if (copy_to_user(argp, NodeName, sizeof(NodeName_type))) |
1366 | return -EFAULT; | 1360 | return -EFAULT; |
1367 | return 0; | 1361 | return 0; |
@@ -1398,10 +1392,13 @@ static int cciss_setnodename(ctlr_info_t *h, void __user *argp) | |||
1398 | static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) | 1392 | static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) |
1399 | { | 1393 | { |
1400 | Heartbeat_type heartbeat; | 1394 | Heartbeat_type heartbeat; |
1395 | unsigned long flags; | ||
1401 | 1396 | ||
1402 | if (!argp) | 1397 | if (!argp) |
1403 | return -EINVAL; | 1398 | return -EINVAL; |
1399 | spin_lock_irqsave(&h->lock, flags); | ||
1404 | heartbeat = readl(&h->cfgtable->HeartBeat); | 1400 | heartbeat = readl(&h->cfgtable->HeartBeat); |
1401 | spin_unlock_irqrestore(&h->lock, flags); | ||
1405 | if (copy_to_user(argp, &heartbeat, sizeof(Heartbeat_type))) | 1402 | if (copy_to_user(argp, &heartbeat, sizeof(Heartbeat_type))) |
1406 | return -EFAULT; | 1403 | return -EFAULT; |
1407 | return 0; | 1404 | return 0; |
@@ -1410,10 +1407,13 @@ static int cciss_getheartbeat(ctlr_info_t *h, void __user *argp) | |||
1410 | static int cciss_getbustypes(ctlr_info_t *h, void __user *argp) | 1407 | static int cciss_getbustypes(ctlr_info_t *h, void __user *argp) |
1411 | { | 1408 | { |
1412 | BusTypes_type BusTypes; | 1409 | BusTypes_type BusTypes; |
1410 | unsigned long flags; | ||
1413 | 1411 | ||
1414 | if (!argp) | 1412 | if (!argp) |
1415 | return -EINVAL; | 1413 | return -EINVAL; |
1414 | spin_lock_irqsave(&h->lock, flags); | ||
1416 | BusTypes = readl(&h->cfgtable->BusTypes); | 1415 | BusTypes = readl(&h->cfgtable->BusTypes); |
1416 | spin_unlock_irqrestore(&h->lock, flags); | ||
1417 | if (copy_to_user(argp, &BusTypes, sizeof(BusTypes_type))) | 1417 | if (copy_to_user(argp, &BusTypes, sizeof(BusTypes_type))) |
1418 | return -EFAULT; | 1418 | return -EFAULT; |
1419 | return 0; | 1419 | return 0; |
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index 847107ef0cce..20dd52a2f92f 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c | |||
@@ -3002,7 +3002,8 @@ static int mtip_hw_debugfs_init(struct driver_data *dd) | |||
3002 | 3002 | ||
3003 | static void mtip_hw_debugfs_exit(struct driver_data *dd) | 3003 | static void mtip_hw_debugfs_exit(struct driver_data *dd) |
3004 | { | 3004 | { |
3005 | debugfs_remove_recursive(dd->dfs_node); | 3005 | if (dd->dfs_node) |
3006 | debugfs_remove_recursive(dd->dfs_node); | ||
3006 | } | 3007 | } |
3007 | 3008 | ||
3008 | 3009 | ||
@@ -3863,7 +3864,7 @@ static void mtip_make_request(struct request_queue *queue, struct bio *bio) | |||
3863 | struct driver_data *dd = queue->queuedata; | 3864 | struct driver_data *dd = queue->queuedata; |
3864 | struct scatterlist *sg; | 3865 | struct scatterlist *sg; |
3865 | struct bio_vec *bvec; | 3866 | struct bio_vec *bvec; |
3866 | int nents = 0; | 3867 | int i, nents = 0; |
3867 | int tag = 0, unaligned = 0; | 3868 | int tag = 0, unaligned = 0; |
3868 | 3869 | ||
3869 | if (unlikely(dd->dd_flag & MTIP_DDF_STOP_IO)) { | 3870 | if (unlikely(dd->dd_flag & MTIP_DDF_STOP_IO)) { |
@@ -3921,11 +3922,12 @@ static void mtip_make_request(struct request_queue *queue, struct bio *bio) | |||
3921 | } | 3922 | } |
3922 | 3923 | ||
3923 | /* Create the scatter list for this bio. */ | 3924 | /* Create the scatter list for this bio. */ |
3924 | bio_for_each_segment(bvec, bio, nents) { | 3925 | bio_for_each_segment(bvec, bio, i) { |
3925 | sg_set_page(&sg[nents], | 3926 | sg_set_page(&sg[nents], |
3926 | bvec->bv_page, | 3927 | bvec->bv_page, |
3927 | bvec->bv_len, | 3928 | bvec->bv_len, |
3928 | bvec->bv_offset); | 3929 | bvec->bv_offset); |
3930 | nents++; | ||
3929 | } | 3931 | } |
3930 | 3932 | ||
3931 | /* Issue the read/write. */ | 3933 | /* Issue the read/write. */ |
diff --git a/drivers/block/nvme-core.c b/drivers/block/nvme-core.c index 8efdfaa44a59..ce79a590b45b 100644 --- a/drivers/block/nvme-core.c +++ b/drivers/block/nvme-core.c | |||
@@ -629,7 +629,7 @@ static int nvme_submit_bio_queue(struct nvme_queue *nvmeq, struct nvme_ns *ns, | |||
629 | struct nvme_command *cmnd; | 629 | struct nvme_command *cmnd; |
630 | struct nvme_iod *iod; | 630 | struct nvme_iod *iod; |
631 | enum dma_data_direction dma_dir; | 631 | enum dma_data_direction dma_dir; |
632 | int cmdid, length, result = -ENOMEM; | 632 | int cmdid, length, result; |
633 | u16 control; | 633 | u16 control; |
634 | u32 dsmgmt; | 634 | u32 dsmgmt; |
635 | int psegs = bio_phys_segments(ns->queue, bio); | 635 | int psegs = bio_phys_segments(ns->queue, bio); |
@@ -640,6 +640,7 @@ static int nvme_submit_bio_queue(struct nvme_queue *nvmeq, struct nvme_ns *ns, | |||
640 | return result; | 640 | return result; |
641 | } | 641 | } |
642 | 642 | ||
643 | result = -ENOMEM; | ||
643 | iod = nvme_alloc_iod(psegs, bio->bi_size, GFP_ATOMIC); | 644 | iod = nvme_alloc_iod(psegs, bio->bi_size, GFP_ATOMIC); |
644 | if (!iod) | 645 | if (!iod) |
645 | goto nomem; | 646 | goto nomem; |
@@ -977,6 +978,8 @@ static void nvme_cancel_ios(struct nvme_queue *nvmeq, bool timeout) | |||
977 | 978 | ||
978 | if (timeout && !time_after(now, info[cmdid].timeout)) | 979 | if (timeout && !time_after(now, info[cmdid].timeout)) |
979 | continue; | 980 | continue; |
981 | if (info[cmdid].ctx == CMD_CTX_CANCELLED) | ||
982 | continue; | ||
980 | dev_warn(nvmeq->q_dmadev, "Cancelling I/O %d\n", cmdid); | 983 | dev_warn(nvmeq->q_dmadev, "Cancelling I/O %d\n", cmdid); |
981 | ctx = cancel_cmdid(nvmeq, cmdid, &fn); | 984 | ctx = cancel_cmdid(nvmeq, cmdid, &fn); |
982 | fn(nvmeq->dev, ctx, &cqe); | 985 | fn(nvmeq->dev, ctx, &cqe); |
@@ -1206,7 +1209,7 @@ struct nvme_iod *nvme_map_user_pages(struct nvme_dev *dev, int write, | |||
1206 | 1209 | ||
1207 | if (addr & 3) | 1210 | if (addr & 3) |
1208 | return ERR_PTR(-EINVAL); | 1211 | return ERR_PTR(-EINVAL); |
1209 | if (!length) | 1212 | if (!length || length > INT_MAX - PAGE_SIZE) |
1210 | return ERR_PTR(-EINVAL); | 1213 | return ERR_PTR(-EINVAL); |
1211 | 1214 | ||
1212 | offset = offset_in_page(addr); | 1215 | offset = offset_in_page(addr); |
@@ -1227,7 +1230,8 @@ struct nvme_iod *nvme_map_user_pages(struct nvme_dev *dev, int write, | |||
1227 | sg_init_table(sg, count); | 1230 | sg_init_table(sg, count); |
1228 | for (i = 0; i < count; i++) { | 1231 | for (i = 0; i < count; i++) { |
1229 | sg_set_page(&sg[i], pages[i], | 1232 | sg_set_page(&sg[i], pages[i], |
1230 | min_t(int, length, PAGE_SIZE - offset), offset); | 1233 | min_t(unsigned, length, PAGE_SIZE - offset), |
1234 | offset); | ||
1231 | length -= (PAGE_SIZE - offset); | 1235 | length -= (PAGE_SIZE - offset); |
1232 | offset = 0; | 1236 | offset = 0; |
1233 | } | 1237 | } |
@@ -1435,7 +1439,7 @@ static int nvme_user_admin_cmd(struct nvme_dev *dev, | |||
1435 | nvme_free_iod(dev, iod); | 1439 | nvme_free_iod(dev, iod); |
1436 | } | 1440 | } |
1437 | 1441 | ||
1438 | if (!status && copy_to_user(&ucmd->result, &cmd.result, | 1442 | if ((status >= 0) && copy_to_user(&ucmd->result, &cmd.result, |
1439 | sizeof(cmd.result))) | 1443 | sizeof(cmd.result))) |
1440 | status = -EFAULT; | 1444 | status = -EFAULT; |
1441 | 1445 | ||
@@ -1633,7 +1637,8 @@ static int set_queue_count(struct nvme_dev *dev, int count) | |||
1633 | 1637 | ||
1634 | static int nvme_setup_io_queues(struct nvme_dev *dev) | 1638 | static int nvme_setup_io_queues(struct nvme_dev *dev) |
1635 | { | 1639 | { |
1636 | int result, cpu, i, nr_io_queues, db_bar_size, q_depth; | 1640 | struct pci_dev *pdev = dev->pci_dev; |
1641 | int result, cpu, i, nr_io_queues, db_bar_size, q_depth, q_count; | ||
1637 | 1642 | ||
1638 | nr_io_queues = num_online_cpus(); | 1643 | nr_io_queues = num_online_cpus(); |
1639 | result = set_queue_count(dev, nr_io_queues); | 1644 | result = set_queue_count(dev, nr_io_queues); |
@@ -1642,14 +1647,14 @@ static int nvme_setup_io_queues(struct nvme_dev *dev) | |||
1642 | if (result < nr_io_queues) | 1647 | if (result < nr_io_queues) |
1643 | nr_io_queues = result; | 1648 | nr_io_queues = result; |
1644 | 1649 | ||
1650 | q_count = nr_io_queues; | ||
1645 | /* Deregister the admin queue's interrupt */ | 1651 | /* Deregister the admin queue's interrupt */ |
1646 | free_irq(dev->entry[0].vector, dev->queues[0]); | 1652 | free_irq(dev->entry[0].vector, dev->queues[0]); |
1647 | 1653 | ||
1648 | db_bar_size = 4096 + ((nr_io_queues + 1) << (dev->db_stride + 3)); | 1654 | db_bar_size = 4096 + ((nr_io_queues + 1) << (dev->db_stride + 3)); |
1649 | if (db_bar_size > 8192) { | 1655 | if (db_bar_size > 8192) { |
1650 | iounmap(dev->bar); | 1656 | iounmap(dev->bar); |
1651 | dev->bar = ioremap(pci_resource_start(dev->pci_dev, 0), | 1657 | dev->bar = ioremap(pci_resource_start(pdev, 0), db_bar_size); |
1652 | db_bar_size); | ||
1653 | dev->dbs = ((void __iomem *)dev->bar) + 4096; | 1658 | dev->dbs = ((void __iomem *)dev->bar) + 4096; |
1654 | dev->queues[0]->q_db = dev->dbs; | 1659 | dev->queues[0]->q_db = dev->dbs; |
1655 | } | 1660 | } |
@@ -1657,19 +1662,36 @@ static int nvme_setup_io_queues(struct nvme_dev *dev) | |||
1657 | for (i = 0; i < nr_io_queues; i++) | 1662 | for (i = 0; i < nr_io_queues; i++) |
1658 | dev->entry[i].entry = i; | 1663 | dev->entry[i].entry = i; |
1659 | for (;;) { | 1664 | for (;;) { |
1660 | result = pci_enable_msix(dev->pci_dev, dev->entry, | 1665 | result = pci_enable_msix(pdev, dev->entry, nr_io_queues); |
1661 | nr_io_queues); | ||
1662 | if (result == 0) { | 1666 | if (result == 0) { |
1663 | break; | 1667 | break; |
1664 | } else if (result > 0) { | 1668 | } else if (result > 0) { |
1665 | nr_io_queues = result; | 1669 | nr_io_queues = result; |
1666 | continue; | 1670 | continue; |
1667 | } else { | 1671 | } else { |
1668 | nr_io_queues = 1; | 1672 | nr_io_queues = 0; |
1669 | break; | 1673 | break; |
1670 | } | 1674 | } |
1671 | } | 1675 | } |
1672 | 1676 | ||
1677 | if (nr_io_queues == 0) { | ||
1678 | nr_io_queues = q_count; | ||
1679 | for (;;) { | ||
1680 | result = pci_enable_msi_block(pdev, nr_io_queues); | ||
1681 | if (result == 0) { | ||
1682 | for (i = 0; i < nr_io_queues; i++) | ||
1683 | dev->entry[i].vector = i + pdev->irq; | ||
1684 | break; | ||
1685 | } else if (result > 0) { | ||
1686 | nr_io_queues = result; | ||
1687 | continue; | ||
1688 | } else { | ||
1689 | nr_io_queues = 1; | ||
1690 | break; | ||
1691 | } | ||
1692 | } | ||
1693 | } | ||
1694 | |||
1673 | result = queue_request_irq(dev, dev->queues[0], "nvme admin"); | 1695 | result = queue_request_irq(dev, dev->queues[0], "nvme admin"); |
1674 | /* XXX: handle failure here */ | 1696 | /* XXX: handle failure here */ |
1675 | 1697 | ||
@@ -1850,7 +1872,10 @@ static void nvme_free_dev(struct kref *kref) | |||
1850 | { | 1872 | { |
1851 | struct nvme_dev *dev = container_of(kref, struct nvme_dev, kref); | 1873 | struct nvme_dev *dev = container_of(kref, struct nvme_dev, kref); |
1852 | nvme_dev_remove(dev); | 1874 | nvme_dev_remove(dev); |
1853 | pci_disable_msix(dev->pci_dev); | 1875 | if (dev->pci_dev->msi_enabled) |
1876 | pci_disable_msi(dev->pci_dev); | ||
1877 | else if (dev->pci_dev->msix_enabled) | ||
1878 | pci_disable_msix(dev->pci_dev); | ||
1854 | iounmap(dev->bar); | 1879 | iounmap(dev->bar); |
1855 | nvme_release_instance(dev); | 1880 | nvme_release_instance(dev); |
1856 | nvme_release_prp_pools(dev); | 1881 | nvme_release_prp_pools(dev); |
@@ -1923,8 +1948,14 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1923 | INIT_LIST_HEAD(&dev->namespaces); | 1948 | INIT_LIST_HEAD(&dev->namespaces); |
1924 | dev->pci_dev = pdev; | 1949 | dev->pci_dev = pdev; |
1925 | pci_set_drvdata(pdev, dev); | 1950 | pci_set_drvdata(pdev, dev); |
1926 | dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)); | 1951 | |
1927 | dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64)); | 1952 | if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(64))) |
1953 | dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64)); | ||
1954 | else if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) | ||
1955 | dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); | ||
1956 | else | ||
1957 | goto disable; | ||
1958 | |||
1928 | result = nvme_set_instance(dev); | 1959 | result = nvme_set_instance(dev); |
1929 | if (result) | 1960 | if (result) |
1930 | goto disable; | 1961 | goto disable; |
@@ -1977,7 +2008,10 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1977 | unmap: | 2008 | unmap: |
1978 | iounmap(dev->bar); | 2009 | iounmap(dev->bar); |
1979 | disable_msix: | 2010 | disable_msix: |
1980 | pci_disable_msix(pdev); | 2011 | if (dev->pci_dev->msi_enabled) |
2012 | pci_disable_msi(dev->pci_dev); | ||
2013 | else if (dev->pci_dev->msix_enabled) | ||
2014 | pci_disable_msix(dev->pci_dev); | ||
1981 | nvme_release_instance(dev); | 2015 | nvme_release_instance(dev); |
1982 | nvme_release_prp_pools(dev); | 2016 | nvme_release_prp_pools(dev); |
1983 | disable: | 2017 | disable: |
diff --git a/drivers/block/nvme-scsi.c b/drivers/block/nvme-scsi.c index fed54b039893..102de2f52b5c 100644 --- a/drivers/block/nvme-scsi.c +++ b/drivers/block/nvme-scsi.c | |||
@@ -44,7 +44,6 @@ | |||
44 | #include <linux/sched.h> | 44 | #include <linux/sched.h> |
45 | #include <linux/slab.h> | 45 | #include <linux/slab.h> |
46 | #include <linux/types.h> | 46 | #include <linux/types.h> |
47 | #include <linux/version.h> | ||
48 | #include <scsi/sg.h> | 47 | #include <scsi/sg.h> |
49 | #include <scsi/scsi.h> | 48 | #include <scsi/scsi.h> |
50 | 49 | ||
@@ -1654,7 +1653,7 @@ static void nvme_trans_modesel_save_bd(struct nvme_ns *ns, u8 *parm_list, | |||
1654 | } | 1653 | } |
1655 | } | 1654 | } |
1656 | 1655 | ||
1657 | static u16 nvme_trans_modesel_get_mp(struct nvme_ns *ns, struct sg_io_hdr *hdr, | 1656 | static int nvme_trans_modesel_get_mp(struct nvme_ns *ns, struct sg_io_hdr *hdr, |
1658 | u8 *mode_page, u8 page_code) | 1657 | u8 *mode_page, u8 page_code) |
1659 | { | 1658 | { |
1660 | int res = SNTI_TRANSLATION_SUCCESS; | 1659 | int res = SNTI_TRANSLATION_SUCCESS; |
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 3c08983e600a..f5d0ea11d9fd 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c | |||
@@ -83,7 +83,8 @@ | |||
83 | 83 | ||
84 | #define MAX_SPEED 0xffff | 84 | #define MAX_SPEED 0xffff |
85 | 85 | ||
86 | #define ZONE(sector, pd) (((sector) + (pd)->offset) & ~((pd)->settings.size - 1)) | 86 | #define ZONE(sector, pd) (((sector) + (pd)->offset) & \ |
87 | ~(sector_t)((pd)->settings.size - 1)) | ||
87 | 88 | ||
88 | static DEFINE_MUTEX(pktcdvd_mutex); | 89 | static DEFINE_MUTEX(pktcdvd_mutex); |
89 | static struct pktcdvd_device *pkt_devs[MAX_WRITERS]; | 90 | static struct pktcdvd_device *pkt_devs[MAX_WRITERS]; |
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index d6d314027b5d..3063452e55da 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
@@ -519,8 +519,8 @@ static const struct block_device_operations rbd_bd_ops = { | |||
519 | }; | 519 | }; |
520 | 520 | ||
521 | /* | 521 | /* |
522 | * Initialize an rbd client instance. | 522 | * Initialize an rbd client instance. Success or not, this function |
523 | * We own *ceph_opts. | 523 | * consumes ceph_opts. |
524 | */ | 524 | */ |
525 | static struct rbd_client *rbd_client_create(struct ceph_options *ceph_opts) | 525 | static struct rbd_client *rbd_client_create(struct ceph_options *ceph_opts) |
526 | { | 526 | { |
@@ -675,7 +675,8 @@ static int parse_rbd_opts_token(char *c, void *private) | |||
675 | 675 | ||
676 | /* | 676 | /* |
677 | * Get a ceph client with specific addr and configuration, if one does | 677 | * Get a ceph client with specific addr and configuration, if one does |
678 | * not exist create it. | 678 | * not exist create it. Either way, ceph_opts is consumed by this |
679 | * function. | ||
679 | */ | 680 | */ |
680 | static struct rbd_client *rbd_get_client(struct ceph_options *ceph_opts) | 681 | static struct rbd_client *rbd_get_client(struct ceph_options *ceph_opts) |
681 | { | 682 | { |
@@ -4697,8 +4698,10 @@ out: | |||
4697 | return ret; | 4698 | return ret; |
4698 | } | 4699 | } |
4699 | 4700 | ||
4700 | /* Undo whatever state changes are made by v1 or v2 image probe */ | 4701 | /* |
4701 | 4702 | * Undo whatever state changes are made by v1 or v2 header info | |
4703 | * call. | ||
4704 | */ | ||
4702 | static void rbd_dev_unprobe(struct rbd_device *rbd_dev) | 4705 | static void rbd_dev_unprobe(struct rbd_device *rbd_dev) |
4703 | { | 4706 | { |
4704 | struct rbd_image_header *header; | 4707 | struct rbd_image_header *header; |
@@ -4902,9 +4905,10 @@ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping) | |||
4902 | int tmp; | 4905 | int tmp; |
4903 | 4906 | ||
4904 | /* | 4907 | /* |
4905 | * Get the id from the image id object. If it's not a | 4908 | * Get the id from the image id object. Unless there's an |
4906 | * format 2 image, we'll get ENOENT back, and we'll assume | 4909 | * error, rbd_dev->spec->image_id will be filled in with |
4907 | * it's a format 1 image. | 4910 | * a dynamically-allocated string, and rbd_dev->image_format |
4911 | * will be set to either 1 or 2. | ||
4908 | */ | 4912 | */ |
4909 | ret = rbd_dev_image_id(rbd_dev); | 4913 | ret = rbd_dev_image_id(rbd_dev); |
4910 | if (ret) | 4914 | if (ret) |
@@ -4992,7 +4996,6 @@ static ssize_t rbd_add(struct bus_type *bus, | |||
4992 | rc = PTR_ERR(rbdc); | 4996 | rc = PTR_ERR(rbdc); |
4993 | goto err_out_args; | 4997 | goto err_out_args; |
4994 | } | 4998 | } |
4995 | ceph_opts = NULL; /* rbd_dev client now owns this */ | ||
4996 | 4999 | ||
4997 | /* pick the pool */ | 5000 | /* pick the pool */ |
4998 | osdc = &rbdc->client->osdc; | 5001 | osdc = &rbdc->client->osdc; |
@@ -5027,18 +5030,18 @@ static ssize_t rbd_add(struct bus_type *bus, | |||
5027 | rbd_dev->mapping.read_only = read_only; | 5030 | rbd_dev->mapping.read_only = read_only; |
5028 | 5031 | ||
5029 | rc = rbd_dev_device_setup(rbd_dev); | 5032 | rc = rbd_dev_device_setup(rbd_dev); |
5030 | if (!rc) | 5033 | if (rc) { |
5031 | return count; | 5034 | rbd_dev_image_release(rbd_dev); |
5035 | goto err_out_module; | ||
5036 | } | ||
5037 | |||
5038 | return count; | ||
5032 | 5039 | ||
5033 | rbd_dev_image_release(rbd_dev); | ||
5034 | err_out_rbd_dev: | 5040 | err_out_rbd_dev: |
5035 | rbd_dev_destroy(rbd_dev); | 5041 | rbd_dev_destroy(rbd_dev); |
5036 | err_out_client: | 5042 | err_out_client: |
5037 | rbd_put_client(rbdc); | 5043 | rbd_put_client(rbdc); |
5038 | err_out_args: | 5044 | err_out_args: |
5039 | if (ceph_opts) | ||
5040 | ceph_destroy_options(ceph_opts); | ||
5041 | kfree(rbd_opts); | ||
5042 | rbd_spec_put(spec); | 5045 | rbd_spec_put(spec); |
5043 | err_out_module: | 5046 | err_out_module: |
5044 | module_put(THIS_MODULE); | 5047 | module_put(THIS_MODULE); |
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig index fdfd61a2d523..11a6104a1e4f 100644 --- a/drivers/bluetooth/Kconfig +++ b/drivers/bluetooth/Kconfig | |||
@@ -201,7 +201,7 @@ config BT_MRVL | |||
201 | The core driver to support Marvell Bluetooth devices. | 201 | The core driver to support Marvell Bluetooth devices. |
202 | 202 | ||
203 | This driver is required if you want to support | 203 | This driver is required if you want to support |
204 | Marvell Bluetooth devices, such as 8688/8787/8797. | 204 | Marvell Bluetooth devices, such as 8688/8787/8797/8897. |
205 | 205 | ||
206 | Say Y here to compile Marvell Bluetooth driver | 206 | Say Y here to compile Marvell Bluetooth driver |
207 | into the kernel or say M to compile it as module. | 207 | into the kernel or say M to compile it as module. |
@@ -214,7 +214,7 @@ config BT_MRVL_SDIO | |||
214 | The driver for Marvell Bluetooth chipsets with SDIO interface. | 214 | The driver for Marvell Bluetooth chipsets with SDIO interface. |
215 | 215 | ||
216 | This driver is required if you want to use Marvell Bluetooth | 216 | This driver is required if you want to use Marvell Bluetooth |
217 | devices with SDIO interface. Currently SD8688/SD8787/SD8797 | 217 | devices with SDIO interface. Currently SD8688/SD8787/SD8797/SD8897 |
218 | chipsets are supported. | 218 | chipsets are supported. |
219 | 219 | ||
220 | Say Y here to compile support for Marvell BT-over-SDIO driver | 220 | Say Y here to compile support for Marvell BT-over-SDIO driver |
diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c index 3a4343b3bd6d..9a9f51875df5 100644 --- a/drivers/bluetooth/btmrvl_main.c +++ b/drivers/bluetooth/btmrvl_main.c | |||
@@ -498,6 +498,10 @@ static int btmrvl_service_main_thread(void *data) | |||
498 | add_wait_queue(&thread->wait_q, &wait); | 498 | add_wait_queue(&thread->wait_q, &wait); |
499 | 499 | ||
500 | set_current_state(TASK_INTERRUPTIBLE); | 500 | set_current_state(TASK_INTERRUPTIBLE); |
501 | if (kthread_should_stop()) { | ||
502 | BT_DBG("main_thread: break from main thread"); | ||
503 | break; | ||
504 | } | ||
501 | 505 | ||
502 | if (adapter->wakeup_tries || | 506 | if (adapter->wakeup_tries || |
503 | ((!adapter->int_count) && | 507 | ((!adapter->int_count) && |
@@ -513,11 +517,6 @@ static int btmrvl_service_main_thread(void *data) | |||
513 | 517 | ||
514 | BT_DBG("main_thread woke up"); | 518 | BT_DBG("main_thread woke up"); |
515 | 519 | ||
516 | if (kthread_should_stop()) { | ||
517 | BT_DBG("main_thread: break from main thread"); | ||
518 | break; | ||
519 | } | ||
520 | |||
521 | spin_lock_irqsave(&priv->driver_lock, flags); | 520 | spin_lock_irqsave(&priv->driver_lock, flags); |
522 | if (adapter->int_count) { | 521 | if (adapter->int_count) { |
523 | adapter->int_count = 0; | 522 | adapter->int_count = 0; |
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c index c63488c54f4a..13693b7a0d5c 100644 --- a/drivers/bluetooth/btmrvl_sdio.c +++ b/drivers/bluetooth/btmrvl_sdio.c | |||
@@ -82,6 +82,23 @@ static const struct btmrvl_sdio_card_reg btmrvl_reg_87xx = { | |||
82 | .io_port_2 = 0x7a, | 82 | .io_port_2 = 0x7a, |
83 | }; | 83 | }; |
84 | 84 | ||
85 | static const struct btmrvl_sdio_card_reg btmrvl_reg_88xx = { | ||
86 | .cfg = 0x00, | ||
87 | .host_int_mask = 0x02, | ||
88 | .host_intstatus = 0x03, | ||
89 | .card_status = 0x50, | ||
90 | .sq_read_base_addr_a0 = 0x60, | ||
91 | .sq_read_base_addr_a1 = 0x61, | ||
92 | .card_revision = 0xbc, | ||
93 | .card_fw_status0 = 0xc0, | ||
94 | .card_fw_status1 = 0xc1, | ||
95 | .card_rx_len = 0xc2, | ||
96 | .card_rx_unit = 0xc3, | ||
97 | .io_port_0 = 0xd8, | ||
98 | .io_port_1 = 0xd9, | ||
99 | .io_port_2 = 0xda, | ||
100 | }; | ||
101 | |||
85 | static const struct btmrvl_sdio_device btmrvl_sdio_sd8688 = { | 102 | static const struct btmrvl_sdio_device btmrvl_sdio_sd8688 = { |
86 | .helper = "mrvl/sd8688_helper.bin", | 103 | .helper = "mrvl/sd8688_helper.bin", |
87 | .firmware = "mrvl/sd8688.bin", | 104 | .firmware = "mrvl/sd8688.bin", |
@@ -103,6 +120,13 @@ static const struct btmrvl_sdio_device btmrvl_sdio_sd8797 = { | |||
103 | .sd_blksz_fw_dl = 256, | 120 | .sd_blksz_fw_dl = 256, |
104 | }; | 121 | }; |
105 | 122 | ||
123 | static const struct btmrvl_sdio_device btmrvl_sdio_sd8897 = { | ||
124 | .helper = NULL, | ||
125 | .firmware = "mrvl/sd8897_uapsta.bin", | ||
126 | .reg = &btmrvl_reg_88xx, | ||
127 | .sd_blksz_fw_dl = 256, | ||
128 | }; | ||
129 | |||
106 | static const struct sdio_device_id btmrvl_sdio_ids[] = { | 130 | static const struct sdio_device_id btmrvl_sdio_ids[] = { |
107 | /* Marvell SD8688 Bluetooth device */ | 131 | /* Marvell SD8688 Bluetooth device */ |
108 | { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x9105), | 132 | { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x9105), |
@@ -116,6 +140,9 @@ static const struct sdio_device_id btmrvl_sdio_ids[] = { | |||
116 | /* Marvell SD8797 Bluetooth device */ | 140 | /* Marvell SD8797 Bluetooth device */ |
117 | { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912A), | 141 | { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912A), |
118 | .driver_data = (unsigned long) &btmrvl_sdio_sd8797 }, | 142 | .driver_data = (unsigned long) &btmrvl_sdio_sd8797 }, |
143 | /* Marvell SD8897 Bluetooth device */ | ||
144 | { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912E), | ||
145 | .driver_data = (unsigned long) &btmrvl_sdio_sd8897 }, | ||
119 | 146 | ||
120 | { } /* Terminating entry */ | 147 | { } /* Terminating entry */ |
121 | }; | 148 | }; |
@@ -1194,3 +1221,4 @@ MODULE_FIRMWARE("mrvl/sd8688_helper.bin"); | |||
1194 | MODULE_FIRMWARE("mrvl/sd8688.bin"); | 1221 | MODULE_FIRMWARE("mrvl/sd8688.bin"); |
1195 | MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin"); | 1222 | MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin"); |
1196 | MODULE_FIRMWARE("mrvl/sd8797_uapsta.bin"); | 1223 | MODULE_FIRMWARE("mrvl/sd8797_uapsta.bin"); |
1224 | MODULE_FIRMWARE("mrvl/sd8897_uapsta.bin"); | ||
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 11b8b4b54ceb..edc089e9d0c4 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c | |||
@@ -347,11 +347,11 @@ static u32 get_cur_val(const struct cpumask *mask) | |||
347 | switch (per_cpu(acfreq_data, cpumask_first(mask))->cpu_feature) { | 347 | switch (per_cpu(acfreq_data, cpumask_first(mask))->cpu_feature) { |
348 | case SYSTEM_INTEL_MSR_CAPABLE: | 348 | case SYSTEM_INTEL_MSR_CAPABLE: |
349 | cmd.type = SYSTEM_INTEL_MSR_CAPABLE; | 349 | cmd.type = SYSTEM_INTEL_MSR_CAPABLE; |
350 | cmd.addr.msr.reg = MSR_IA32_PERF_STATUS; | 350 | cmd.addr.msr.reg = MSR_IA32_PERF_CTL; |
351 | break; | 351 | break; |
352 | case SYSTEM_AMD_MSR_CAPABLE: | 352 | case SYSTEM_AMD_MSR_CAPABLE: |
353 | cmd.type = SYSTEM_AMD_MSR_CAPABLE; | 353 | cmd.type = SYSTEM_AMD_MSR_CAPABLE; |
354 | cmd.addr.msr.reg = MSR_AMD_PERF_STATUS; | 354 | cmd.addr.msr.reg = MSR_AMD_PERF_CTL; |
355 | break; | 355 | break; |
356 | case SYSTEM_IO_CAPABLE: | 356 | case SYSTEM_IO_CAPABLE: |
357 | cmd.type = SYSTEM_IO_CAPABLE; | 357 | cmd.type = SYSTEM_IO_CAPABLE; |
diff --git a/drivers/cpufreq/cpufreq-cpu0.c b/drivers/cpufreq/cpufreq-cpu0.c index a64eb8b70444..ad1fde277661 100644 --- a/drivers/cpufreq/cpufreq-cpu0.c +++ b/drivers/cpufreq/cpufreq-cpu0.c | |||
@@ -45,7 +45,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, | |||
45 | struct cpufreq_freqs freqs; | 45 | struct cpufreq_freqs freqs; |
46 | struct opp *opp; | 46 | struct opp *opp; |
47 | unsigned long volt = 0, volt_old = 0, tol = 0; | 47 | unsigned long volt = 0, volt_old = 0, tol = 0; |
48 | long freq_Hz; | 48 | long freq_Hz, freq_exact; |
49 | unsigned int index; | 49 | unsigned int index; |
50 | int ret; | 50 | int ret; |
51 | 51 | ||
@@ -60,6 +60,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, | |||
60 | freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000); | 60 | freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000); |
61 | if (freq_Hz < 0) | 61 | if (freq_Hz < 0) |
62 | freq_Hz = freq_table[index].frequency * 1000; | 62 | freq_Hz = freq_table[index].frequency * 1000; |
63 | freq_exact = freq_Hz; | ||
63 | freqs.new = freq_Hz / 1000; | 64 | freqs.new = freq_Hz / 1000; |
64 | freqs.old = clk_get_rate(cpu_clk) / 1000; | 65 | freqs.old = clk_get_rate(cpu_clk) / 1000; |
65 | 66 | ||
@@ -98,7 +99,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, | |||
98 | } | 99 | } |
99 | } | 100 | } |
100 | 101 | ||
101 | ret = clk_set_rate(cpu_clk, freqs.new * 1000); | 102 | ret = clk_set_rate(cpu_clk, freq_exact); |
102 | if (ret) { | 103 | if (ret) { |
103 | pr_err("failed to set clock rate: %d\n", ret); | 104 | pr_err("failed to set clock rate: %d\n", ret); |
104 | if (cpu_reg) | 105 | if (cpu_reg) |
diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c index 5af40ad82d23..dc9b72e25c1a 100644 --- a/drivers/cpufreq/cpufreq_governor.c +++ b/drivers/cpufreq/cpufreq_governor.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/tick.h> | 26 | #include <linux/tick.h> |
27 | #include <linux/types.h> | 27 | #include <linux/types.h> |
28 | #include <linux/workqueue.h> | 28 | #include <linux/workqueue.h> |
29 | #include <linux/cpu.h> | ||
29 | 30 | ||
30 | #include "cpufreq_governor.h" | 31 | #include "cpufreq_governor.h" |
31 | 32 | ||
@@ -180,8 +181,10 @@ void gov_queue_work(struct dbs_data *dbs_data, struct cpufreq_policy *policy, | |||
180 | if (!all_cpus) { | 181 | if (!all_cpus) { |
181 | __gov_queue_work(smp_processor_id(), dbs_data, delay); | 182 | __gov_queue_work(smp_processor_id(), dbs_data, delay); |
182 | } else { | 183 | } else { |
184 | get_online_cpus(); | ||
183 | for_each_cpu(i, policy->cpus) | 185 | for_each_cpu(i, policy->cpus) |
184 | __gov_queue_work(i, dbs_data, delay); | 186 | __gov_queue_work(i, dbs_data, delay); |
187 | put_online_cpus(); | ||
185 | } | 188 | } |
186 | } | 189 | } |
187 | EXPORT_SYMBOL_GPL(gov_queue_work); | 190 | EXPORT_SYMBOL_GPL(gov_queue_work); |
diff --git a/drivers/crypto/sahara.c b/drivers/crypto/sahara.c index a97bb6c1596c..c3dc1c04a5df 100644 --- a/drivers/crypto/sahara.c +++ b/drivers/crypto/sahara.c | |||
@@ -863,7 +863,7 @@ static struct of_device_id sahara_dt_ids[] = { | |||
863 | { .compatible = "fsl,imx27-sahara" }, | 863 | { .compatible = "fsl,imx27-sahara" }, |
864 | { /* sentinel */ } | 864 | { /* sentinel */ } |
865 | }; | 865 | }; |
866 | MODULE_DEVICE_TABLE(platform, sahara_dt_ids); | 866 | MODULE_DEVICE_TABLE(of, sahara_dt_ids); |
867 | 867 | ||
868 | static int sahara_probe(struct platform_device *pdev) | 868 | static int sahara_probe(struct platform_device *pdev) |
869 | { | 869 | { |
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index d8ce4ecfef18..e88ded2c8d2f 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c | |||
@@ -716,8 +716,7 @@ static int dmatest_func(void *data) | |||
716 | } | 716 | } |
717 | dma_async_issue_pending(chan); | 717 | dma_async_issue_pending(chan); |
718 | 718 | ||
719 | wait_event_freezable_timeout(done_wait, | 719 | wait_event_freezable_timeout(done_wait, done.done, |
720 | done.done || kthread_should_stop(), | ||
721 | msecs_to_jiffies(params->timeout)); | 720 | msecs_to_jiffies(params->timeout)); |
722 | 721 | ||
723 | status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); | 722 | status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); |
@@ -997,7 +996,6 @@ static void stop_threaded_test(struct dmatest_info *info) | |||
997 | static int __restart_threaded_test(struct dmatest_info *info, bool run) | 996 | static int __restart_threaded_test(struct dmatest_info *info, bool run) |
998 | { | 997 | { |
999 | struct dmatest_params *params = &info->params; | 998 | struct dmatest_params *params = &info->params; |
1000 | int ret; | ||
1001 | 999 | ||
1002 | /* Stop any running test first */ | 1000 | /* Stop any running test first */ |
1003 | __stop_threaded_test(info); | 1001 | __stop_threaded_test(info); |
@@ -1012,13 +1010,23 @@ static int __restart_threaded_test(struct dmatest_info *info, bool run) | |||
1012 | memcpy(params, &info->dbgfs_params, sizeof(*params)); | 1010 | memcpy(params, &info->dbgfs_params, sizeof(*params)); |
1013 | 1011 | ||
1014 | /* Run test with new parameters */ | 1012 | /* Run test with new parameters */ |
1015 | ret = __run_threaded_test(info); | 1013 | return __run_threaded_test(info); |
1016 | if (ret) { | 1014 | } |
1017 | __stop_threaded_test(info); | 1015 | |
1018 | pr_err("dmatest: Can't run test\n"); | 1016 | static bool __is_threaded_test_run(struct dmatest_info *info) |
1017 | { | ||
1018 | struct dmatest_chan *dtc; | ||
1019 | |||
1020 | list_for_each_entry(dtc, &info->channels, node) { | ||
1021 | struct dmatest_thread *thread; | ||
1022 | |||
1023 | list_for_each_entry(thread, &dtc->threads, node) { | ||
1024 | if (!thread->done) | ||
1025 | return true; | ||
1026 | } | ||
1019 | } | 1027 | } |
1020 | 1028 | ||
1021 | return ret; | 1029 | return false; |
1022 | } | 1030 | } |
1023 | 1031 | ||
1024 | static ssize_t dtf_write_string(void *to, size_t available, loff_t *ppos, | 1032 | static ssize_t dtf_write_string(void *to, size_t available, loff_t *ppos, |
@@ -1091,22 +1099,10 @@ static ssize_t dtf_read_run(struct file *file, char __user *user_buf, | |||
1091 | { | 1099 | { |
1092 | struct dmatest_info *info = file->private_data; | 1100 | struct dmatest_info *info = file->private_data; |
1093 | char buf[3]; | 1101 | char buf[3]; |
1094 | struct dmatest_chan *dtc; | ||
1095 | bool alive = false; | ||
1096 | 1102 | ||
1097 | mutex_lock(&info->lock); | 1103 | mutex_lock(&info->lock); |
1098 | list_for_each_entry(dtc, &info->channels, node) { | ||
1099 | struct dmatest_thread *thread; | ||
1100 | |||
1101 | list_for_each_entry(thread, &dtc->threads, node) { | ||
1102 | if (!thread->done) { | ||
1103 | alive = true; | ||
1104 | break; | ||
1105 | } | ||
1106 | } | ||
1107 | } | ||
1108 | 1104 | ||
1109 | if (alive) { | 1105 | if (__is_threaded_test_run(info)) { |
1110 | buf[0] = 'Y'; | 1106 | buf[0] = 'Y'; |
1111 | } else { | 1107 | } else { |
1112 | __stop_threaded_test(info); | 1108 | __stop_threaded_test(info); |
@@ -1132,7 +1128,12 @@ static ssize_t dtf_write_run(struct file *file, const char __user *user_buf, | |||
1132 | 1128 | ||
1133 | if (strtobool(buf, &bv) == 0) { | 1129 | if (strtobool(buf, &bv) == 0) { |
1134 | mutex_lock(&info->lock); | 1130 | mutex_lock(&info->lock); |
1135 | ret = __restart_threaded_test(info, bv); | 1131 | |
1132 | if (__is_threaded_test_run(info)) | ||
1133 | ret = -EBUSY; | ||
1134 | else | ||
1135 | ret = __restart_threaded_test(info, bv); | ||
1136 | |||
1136 | mutex_unlock(&info->lock); | 1137 | mutex_unlock(&info->lock); |
1137 | } | 1138 | } |
1138 | 1139 | ||
diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c index 1734feec47b1..71bf4ec300ea 100644 --- a/drivers/dma/ste_dma40.c +++ b/drivers/dma/ste_dma40.c | |||
@@ -1566,10 +1566,12 @@ static void dma_tc_handle(struct d40_chan *d40c) | |||
1566 | return; | 1566 | return; |
1567 | } | 1567 | } |
1568 | 1568 | ||
1569 | if (d40_queue_start(d40c) == NULL) | 1569 | if (d40_queue_start(d40c) == NULL) { |
1570 | d40c->busy = false; | 1570 | d40c->busy = false; |
1571 | pm_runtime_mark_last_busy(d40c->base->dev); | 1571 | |
1572 | pm_runtime_put_autosuspend(d40c->base->dev); | 1572 | pm_runtime_mark_last_busy(d40c->base->dev); |
1573 | pm_runtime_put_autosuspend(d40c->base->dev); | ||
1574 | } | ||
1573 | 1575 | ||
1574 | d40_desc_remove(d40d); | 1576 | d40_desc_remove(d40d); |
1575 | d40_desc_done(d40c, d40d); | 1577 | d40_desc_done(d40c, d40d); |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index a6a8643a6a77..8bcce7866d36 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
@@ -1054,7 +1054,7 @@ EXPORT_SYMBOL(drm_vblank_off); | |||
1054 | */ | 1054 | */ |
1055 | void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) | 1055 | void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) |
1056 | { | 1056 | { |
1057 | /* vblank is not initialized (IRQ not installed ?) */ | 1057 | /* vblank is not initialized (IRQ not installed ?), or has been freed */ |
1058 | if (!dev->num_crtcs) | 1058 | if (!dev->num_crtcs) |
1059 | return; | 1059 | return; |
1060 | /* | 1060 | /* |
@@ -1076,6 +1076,10 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc) | |||
1076 | { | 1076 | { |
1077 | unsigned long irqflags; | 1077 | unsigned long irqflags; |
1078 | 1078 | ||
1079 | /* vblank is not initialized (IRQ not installed ?), or has been freed */ | ||
1080 | if (!dev->num_crtcs) | ||
1081 | return; | ||
1082 | |||
1079 | if (dev->vblank_inmodeset[crtc]) { | 1083 | if (dev->vblank_inmodeset[crtc]) { |
1080 | spin_lock_irqsave(&dev->vbl_lock, irqflags); | 1084 | spin_lock_irqsave(&dev->vbl_lock, irqflags); |
1081 | dev->vblank_disable_allowed = 1; | 1085 | dev->vblank_disable_allowed = 1; |
diff --git a/drivers/gpu/drm/gma500/cdv_intel_display.c b/drivers/gpu/drm/gma500/cdv_intel_display.c index 3cfd0931fbfb..82430ad8ba62 100644 --- a/drivers/gpu/drm/gma500/cdv_intel_display.c +++ b/drivers/gpu/drm/gma500/cdv_intel_display.c | |||
@@ -1462,7 +1462,7 @@ static int cdv_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
1462 | size_t addr = 0; | 1462 | size_t addr = 0; |
1463 | struct gtt_range *gt; | 1463 | struct gtt_range *gt; |
1464 | struct drm_gem_object *obj; | 1464 | struct drm_gem_object *obj; |
1465 | int ret; | 1465 | int ret = 0; |
1466 | 1466 | ||
1467 | /* if we want to turn of the cursor ignore width and height */ | 1467 | /* if we want to turn of the cursor ignore width and height */ |
1468 | if (!handle) { | 1468 | if (!handle) { |
@@ -1499,7 +1499,8 @@ static int cdv_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
1499 | 1499 | ||
1500 | if (obj->size < width * height * 4) { | 1500 | if (obj->size < width * height * 4) { |
1501 | dev_dbg(dev->dev, "buffer is to small\n"); | 1501 | dev_dbg(dev->dev, "buffer is to small\n"); |
1502 | return -ENOMEM; | 1502 | ret = -ENOMEM; |
1503 | goto unref_cursor; | ||
1503 | } | 1504 | } |
1504 | 1505 | ||
1505 | gt = container_of(obj, struct gtt_range, gem); | 1506 | gt = container_of(obj, struct gtt_range, gem); |
@@ -1508,7 +1509,7 @@ static int cdv_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
1508 | ret = psb_gtt_pin(gt); | 1509 | ret = psb_gtt_pin(gt); |
1509 | if (ret) { | 1510 | if (ret) { |
1510 | dev_err(dev->dev, "Can not pin down handle 0x%x\n", handle); | 1511 | dev_err(dev->dev, "Can not pin down handle 0x%x\n", handle); |
1511 | return ret; | 1512 | goto unref_cursor; |
1512 | } | 1513 | } |
1513 | 1514 | ||
1514 | addr = gt->offset; /* Or resource.start ??? */ | 1515 | addr = gt->offset; /* Or resource.start ??? */ |
@@ -1532,9 +1533,14 @@ static int cdv_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
1532 | struct gtt_range, gem); | 1533 | struct gtt_range, gem); |
1533 | psb_gtt_unpin(gt); | 1534 | psb_gtt_unpin(gt); |
1534 | drm_gem_object_unreference(psb_intel_crtc->cursor_obj); | 1535 | drm_gem_object_unreference(psb_intel_crtc->cursor_obj); |
1535 | psb_intel_crtc->cursor_obj = obj; | ||
1536 | } | 1536 | } |
1537 | return 0; | 1537 | |
1538 | psb_intel_crtc->cursor_obj = obj; | ||
1539 | return ret; | ||
1540 | |||
1541 | unref_cursor: | ||
1542 | drm_gem_object_unreference(obj); | ||
1543 | return ret; | ||
1538 | } | 1544 | } |
1539 | 1545 | ||
1540 | static int cdv_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | 1546 | static int cdv_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) |
@@ -1750,6 +1756,19 @@ static void cdv_intel_crtc_destroy(struct drm_crtc *crtc) | |||
1750 | kfree(psb_intel_crtc); | 1756 | kfree(psb_intel_crtc); |
1751 | } | 1757 | } |
1752 | 1758 | ||
1759 | static void cdv_intel_crtc_disable(struct drm_crtc *crtc) | ||
1760 | { | ||
1761 | struct gtt_range *gt; | ||
1762 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||
1763 | |||
1764 | crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); | ||
1765 | |||
1766 | if (crtc->fb) { | ||
1767 | gt = to_psb_fb(crtc->fb)->gtt; | ||
1768 | psb_gtt_unpin(gt); | ||
1769 | } | ||
1770 | } | ||
1771 | |||
1753 | const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { | 1772 | const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { |
1754 | .dpms = cdv_intel_crtc_dpms, | 1773 | .dpms = cdv_intel_crtc_dpms, |
1755 | .mode_fixup = cdv_intel_crtc_mode_fixup, | 1774 | .mode_fixup = cdv_intel_crtc_mode_fixup, |
@@ -1757,6 +1776,7 @@ const struct drm_crtc_helper_funcs cdv_intel_helper_funcs = { | |||
1757 | .mode_set_base = cdv_intel_pipe_set_base, | 1776 | .mode_set_base = cdv_intel_pipe_set_base, |
1758 | .prepare = cdv_intel_crtc_prepare, | 1777 | .prepare = cdv_intel_crtc_prepare, |
1759 | .commit = cdv_intel_crtc_commit, | 1778 | .commit = cdv_intel_crtc_commit, |
1779 | .disable = cdv_intel_crtc_disable, | ||
1760 | }; | 1780 | }; |
1761 | 1781 | ||
1762 | const struct drm_crtc_funcs cdv_intel_crtc_funcs = { | 1782 | const struct drm_crtc_funcs cdv_intel_crtc_funcs = { |
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c index 1534e220097a..8b1b6d923abe 100644 --- a/drivers/gpu/drm/gma500/framebuffer.c +++ b/drivers/gpu/drm/gma500/framebuffer.c | |||
@@ -121,8 +121,8 @@ static int psbfb_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
121 | unsigned long address; | 121 | unsigned long address; |
122 | int ret; | 122 | int ret; |
123 | unsigned long pfn; | 123 | unsigned long pfn; |
124 | /* FIXME: assumes fb at stolen base which may not be true */ | 124 | unsigned long phys_addr = (unsigned long)dev_priv->stolen_base + |
125 | unsigned long phys_addr = (unsigned long)dev_priv->stolen_base; | 125 | psbfb->gtt->offset; |
126 | 126 | ||
127 | page_num = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; | 127 | page_num = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; |
128 | address = (unsigned long)vmf->virtual_address - (vmf->pgoff << PAGE_SHIFT); | 128 | address = (unsigned long)vmf->virtual_address - (vmf->pgoff << PAGE_SHIFT); |
diff --git a/drivers/gpu/drm/gma500/psb_intel_display.c b/drivers/gpu/drm/gma500/psb_intel_display.c index 6e8f42b61ff6..6666493789d1 100644 --- a/drivers/gpu/drm/gma500/psb_intel_display.c +++ b/drivers/gpu/drm/gma500/psb_intel_display.c | |||
@@ -843,7 +843,7 @@ static int psb_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
843 | struct gtt_range *cursor_gt = psb_intel_crtc->cursor_gt; | 843 | struct gtt_range *cursor_gt = psb_intel_crtc->cursor_gt; |
844 | struct drm_gem_object *obj; | 844 | struct drm_gem_object *obj; |
845 | void *tmp_dst, *tmp_src; | 845 | void *tmp_dst, *tmp_src; |
846 | int ret, i, cursor_pages; | 846 | int ret = 0, i, cursor_pages; |
847 | 847 | ||
848 | /* if we want to turn of the cursor ignore width and height */ | 848 | /* if we want to turn of the cursor ignore width and height */ |
849 | if (!handle) { | 849 | if (!handle) { |
@@ -880,7 +880,8 @@ static int psb_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
880 | 880 | ||
881 | if (obj->size < width * height * 4) { | 881 | if (obj->size < width * height * 4) { |
882 | dev_dbg(dev->dev, "buffer is to small\n"); | 882 | dev_dbg(dev->dev, "buffer is to small\n"); |
883 | return -ENOMEM; | 883 | ret = -ENOMEM; |
884 | goto unref_cursor; | ||
884 | } | 885 | } |
885 | 886 | ||
886 | gt = container_of(obj, struct gtt_range, gem); | 887 | gt = container_of(obj, struct gtt_range, gem); |
@@ -889,13 +890,14 @@ static int psb_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
889 | ret = psb_gtt_pin(gt); | 890 | ret = psb_gtt_pin(gt); |
890 | if (ret) { | 891 | if (ret) { |
891 | dev_err(dev->dev, "Can not pin down handle 0x%x\n", handle); | 892 | dev_err(dev->dev, "Can not pin down handle 0x%x\n", handle); |
892 | return ret; | 893 | goto unref_cursor; |
893 | } | 894 | } |
894 | 895 | ||
895 | if (dev_priv->ops->cursor_needs_phys) { | 896 | if (dev_priv->ops->cursor_needs_phys) { |
896 | if (cursor_gt == NULL) { | 897 | if (cursor_gt == NULL) { |
897 | dev_err(dev->dev, "No hardware cursor mem available"); | 898 | dev_err(dev->dev, "No hardware cursor mem available"); |
898 | return -ENOMEM; | 899 | ret = -ENOMEM; |
900 | goto unref_cursor; | ||
899 | } | 901 | } |
900 | 902 | ||
901 | /* Prevent overflow */ | 903 | /* Prevent overflow */ |
@@ -936,9 +938,14 @@ static int psb_intel_crtc_cursor_set(struct drm_crtc *crtc, | |||
936 | struct gtt_range, gem); | 938 | struct gtt_range, gem); |
937 | psb_gtt_unpin(gt); | 939 | psb_gtt_unpin(gt); |
938 | drm_gem_object_unreference(psb_intel_crtc->cursor_obj); | 940 | drm_gem_object_unreference(psb_intel_crtc->cursor_obj); |
939 | psb_intel_crtc->cursor_obj = obj; | ||
940 | } | 941 | } |
941 | return 0; | 942 | |
943 | psb_intel_crtc->cursor_obj = obj; | ||
944 | return ret; | ||
945 | |||
946 | unref_cursor: | ||
947 | drm_gem_object_unreference(obj); | ||
948 | return ret; | ||
942 | } | 949 | } |
943 | 950 | ||
944 | static int psb_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) | 951 | static int psb_intel_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) |
@@ -1150,6 +1157,19 @@ static void psb_intel_crtc_destroy(struct drm_crtc *crtc) | |||
1150 | kfree(psb_intel_crtc); | 1157 | kfree(psb_intel_crtc); |
1151 | } | 1158 | } |
1152 | 1159 | ||
1160 | static void psb_intel_crtc_disable(struct drm_crtc *crtc) | ||
1161 | { | ||
1162 | struct gtt_range *gt; | ||
1163 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||
1164 | |||
1165 | crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); | ||
1166 | |||
1167 | if (crtc->fb) { | ||
1168 | gt = to_psb_fb(crtc->fb)->gtt; | ||
1169 | psb_gtt_unpin(gt); | ||
1170 | } | ||
1171 | } | ||
1172 | |||
1153 | const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { | 1173 | const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { |
1154 | .dpms = psb_intel_crtc_dpms, | 1174 | .dpms = psb_intel_crtc_dpms, |
1155 | .mode_fixup = psb_intel_crtc_mode_fixup, | 1175 | .mode_fixup = psb_intel_crtc_mode_fixup, |
@@ -1157,6 +1177,7 @@ const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { | |||
1157 | .mode_set_base = psb_intel_pipe_set_base, | 1177 | .mode_set_base = psb_intel_pipe_set_base, |
1158 | .prepare = psb_intel_crtc_prepare, | 1178 | .prepare = psb_intel_crtc_prepare, |
1159 | .commit = psb_intel_crtc_commit, | 1179 | .commit = psb_intel_crtc_commit, |
1180 | .disable = psb_intel_crtc_disable, | ||
1160 | }; | 1181 | }; |
1161 | 1182 | ||
1162 | const struct drm_crtc_funcs psb_intel_crtc_funcs = { | 1183 | const struct drm_crtc_funcs psb_intel_crtc_funcs = { |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index a6cf8e843973..970ad17c99ab 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
@@ -91,14 +91,11 @@ i915_gem_wait_for_error(struct i915_gpu_error *error) | |||
91 | { | 91 | { |
92 | int ret; | 92 | int ret; |
93 | 93 | ||
94 | #define EXIT_COND (!i915_reset_in_progress(error)) | 94 | #define EXIT_COND (!i915_reset_in_progress(error) || \ |
95 | i915_terminally_wedged(error)) | ||
95 | if (EXIT_COND) | 96 | if (EXIT_COND) |
96 | return 0; | 97 | return 0; |
97 | 98 | ||
98 | /* GPU is already declared terminally dead, give up. */ | ||
99 | if (i915_terminally_wedged(error)) | ||
100 | return -EIO; | ||
101 | |||
102 | /* | 99 | /* |
103 | * Only wait 10 seconds for the gpu reset to complete to avoid hanging | 100 | * Only wait 10 seconds for the gpu reset to complete to avoid hanging |
104 | * userspace. If it takes that long something really bad is going on and | 101 | * userspace. If it takes that long something really bad is going on and |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index ad1117bebd7e..56746dcac40f 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -7937,6 +7937,11 @@ intel_modeset_check_state(struct drm_device *dev) | |||
7937 | memset(&pipe_config, 0, sizeof(pipe_config)); | 7937 | memset(&pipe_config, 0, sizeof(pipe_config)); |
7938 | active = dev_priv->display.get_pipe_config(crtc, | 7938 | active = dev_priv->display.get_pipe_config(crtc, |
7939 | &pipe_config); | 7939 | &pipe_config); |
7940 | |||
7941 | /* hw state is inconsistent with the pipe A quirk */ | ||
7942 | if (crtc->pipe == PIPE_A && dev_priv->quirks & QUIRK_PIPEA_FORCE) | ||
7943 | active = crtc->active; | ||
7944 | |||
7940 | WARN(crtc->active != active, | 7945 | WARN(crtc->active != active, |
7941 | "crtc active state doesn't match with hw state " | 7946 | "crtc active state doesn't match with hw state " |
7942 | "(expected %i, found %i)\n", crtc->active, active); | 7947 | "(expected %i, found %i)\n", crtc->active, active); |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index f36f1baabd5a..29412cc89c7a 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -815,10 +815,10 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
815 | }, | 815 | }, |
816 | { | 816 | { |
817 | .callback = intel_no_lvds_dmi_callback, | 817 | .callback = intel_no_lvds_dmi_callback, |
818 | .ident = "Hewlett-Packard HP t5740e Thin Client", | 818 | .ident = "Hewlett-Packard HP t5740", |
819 | .matches = { | 819 | .matches = { |
820 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | 820 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
821 | DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"), | 821 | DMI_MATCH(DMI_PRODUCT_NAME, " t5740"), |
822 | }, | 822 | }, |
823 | }, | 823 | }, |
824 | { | 824 | { |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index d15428404b9a..d4ea6c265ce1 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
@@ -1776,11 +1776,14 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) | |||
1776 | * Assume that the preferred modes are | 1776 | * Assume that the preferred modes are |
1777 | * arranged in priority order. | 1777 | * arranged in priority order. |
1778 | */ | 1778 | */ |
1779 | intel_ddc_get_modes(connector, intel_sdvo->i2c); | 1779 | intel_ddc_get_modes(connector, &intel_sdvo->ddc); |
1780 | if (list_empty(&connector->probed_modes) == false) | ||
1781 | goto end; | ||
1782 | 1780 | ||
1783 | /* Fetch modes from VBT */ | 1781 | /* |
1782 | * Fetch modes from VBT. For SDVO prefer the VBT mode since some | ||
1783 | * SDVO->LVDS transcoders can't cope with the EDID mode. Since | ||
1784 | * drm_mode_probed_add adds the mode at the head of the list we add it | ||
1785 | * last. | ||
1786 | */ | ||
1784 | if (dev_priv->sdvo_lvds_vbt_mode != NULL) { | 1787 | if (dev_priv->sdvo_lvds_vbt_mode != NULL) { |
1785 | newmode = drm_mode_duplicate(connector->dev, | 1788 | newmode = drm_mode_duplicate(connector->dev, |
1786 | dev_priv->sdvo_lvds_vbt_mode); | 1789 | dev_priv->sdvo_lvds_vbt_mode); |
@@ -1792,7 +1795,6 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) | |||
1792 | } | 1795 | } |
1793 | } | 1796 | } |
1794 | 1797 | ||
1795 | end: | ||
1796 | list_for_each_entry(newmode, &connector->probed_modes, head) { | 1798 | list_for_each_entry(newmode, &connector->probed_modes, head) { |
1797 | if (newmode->type & DRM_MODE_TYPE_PREFERRED) { | 1799 | if (newmode->type & DRM_MODE_TYPE_PREFERRED) { |
1798 | intel_sdvo->sdvo_lvds_fixed_mode = | 1800 | intel_sdvo->sdvo_lvds_fixed_mode = |
@@ -2790,12 +2792,6 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
2790 | SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915; | 2792 | SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915; |
2791 | } | 2793 | } |
2792 | 2794 | ||
2793 | /* Only enable the hotplug irq if we need it, to work around noisy | ||
2794 | * hotplug lines. | ||
2795 | */ | ||
2796 | if (intel_sdvo->hotplug_active) | ||
2797 | intel_encoder->hpd_pin = HPD_SDVO_B ? HPD_SDVO_B : HPD_SDVO_C; | ||
2798 | |||
2799 | intel_encoder->compute_config = intel_sdvo_compute_config; | 2795 | intel_encoder->compute_config = intel_sdvo_compute_config; |
2800 | intel_encoder->disable = intel_disable_sdvo; | 2796 | intel_encoder->disable = intel_disable_sdvo; |
2801 | intel_encoder->mode_set = intel_sdvo_mode_set; | 2797 | intel_encoder->mode_set = intel_sdvo_mode_set; |
@@ -2814,6 +2810,14 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
2814 | goto err_output; | 2810 | goto err_output; |
2815 | } | 2811 | } |
2816 | 2812 | ||
2813 | /* Only enable the hotplug irq if we need it, to work around noisy | ||
2814 | * hotplug lines. | ||
2815 | */ | ||
2816 | if (intel_sdvo->hotplug_active) { | ||
2817 | intel_encoder->hpd_pin = | ||
2818 | intel_sdvo->is_sdvob ? HPD_SDVO_B : HPD_SDVO_C; | ||
2819 | } | ||
2820 | |||
2817 | /* | 2821 | /* |
2818 | * Cloning SDVO with anything is often impossible, since the SDVO | 2822 | * Cloning SDVO with anything is often impossible, since the SDVO |
2819 | * encoder can request a special input timing mode. And even if that's | 2823 | * encoder can request a special input timing mode. And even if that's |
diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c index 77b8a45fb10a..ee66badc8bb6 100644 --- a/drivers/gpu/drm/mgag200/mgag200_mode.c +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c | |||
@@ -1034,13 +1034,14 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc, | |||
1034 | else | 1034 | else |
1035 | hi_pri_lvl = 5; | 1035 | hi_pri_lvl = 5; |
1036 | 1036 | ||
1037 | WREG8(0x1fde, 0x06); | 1037 | WREG8(MGAREG_CRTCEXT_INDEX, 0x06); |
1038 | WREG8(0x1fdf, hi_pri_lvl); | 1038 | WREG8(MGAREG_CRTCEXT_DATA, hi_pri_lvl); |
1039 | } else { | 1039 | } else { |
1040 | WREG8(MGAREG_CRTCEXT_INDEX, 0x06); | ||
1040 | if (mdev->reg_1e24 >= 0x01) | 1041 | if (mdev->reg_1e24 >= 0x01) |
1041 | WREG8(0x1fdf, 0x03); | 1042 | WREG8(MGAREG_CRTCEXT_DATA, 0x03); |
1042 | else | 1043 | else |
1043 | WREG8(0x1fdf, 0x04); | 1044 | WREG8(MGAREG_CRTCEXT_DATA, 0x04); |
1044 | } | 1045 | } |
1045 | } | 1046 | } |
1046 | return 0; | 1047 | return 0; |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c index d0817d94454c..f02fd9f443ff 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c | |||
@@ -50,11 +50,16 @@ nv50_dac_sense(struct nv50_disp_priv *priv, int or, u32 loadval) | |||
50 | { | 50 | { |
51 | const u32 doff = (or * 0x800); | 51 | const u32 doff = (or * 0x800); |
52 | int load = -EINVAL; | 52 | int load = -EINVAL; |
53 | nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80150000); | ||
54 | nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000); | ||
53 | nv_wr32(priv, 0x61a00c + doff, 0x00100000 | loadval); | 55 | nv_wr32(priv, 0x61a00c + doff, 0x00100000 | loadval); |
54 | udelay(9500); | 56 | mdelay(9); |
57 | udelay(500); | ||
55 | nv_wr32(priv, 0x61a00c + doff, 0x80000000); | 58 | nv_wr32(priv, 0x61a00c + doff, 0x80000000); |
56 | load = (nv_rd32(priv, 0x61a00c + doff) & 0x38000000) >> 27; | 59 | load = (nv_rd32(priv, 0x61a00c + doff) & 0x38000000) >> 27; |
57 | nv_wr32(priv, 0x61a00c + doff, 0x00000000); | 60 | nv_wr32(priv, 0x61a00c + doff, 0x00000000); |
61 | nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80550000); | ||
62 | nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000); | ||
58 | return load; | 63 | return load; |
59 | } | 64 | } |
60 | 65 | ||
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c b/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c index 0d36bdc51417..7fdade6e604d 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c | |||
@@ -55,6 +55,10 @@ nv84_hdmi_ctrl(struct nv50_disp_priv *priv, int head, int or, u32 data) | |||
55 | nv_wr32(priv, 0x616510 + hoff, 0x00000000); | 55 | nv_wr32(priv, 0x616510 + hoff, 0x00000000); |
56 | nv_mask(priv, 0x616500 + hoff, 0x00000001, 0x00000001); | 56 | nv_mask(priv, 0x616500 + hoff, 0x00000001, 0x00000001); |
57 | 57 | ||
58 | nv_mask(priv, 0x6165d0 + hoff, 0x00070001, 0x00010001); /* SPARE, HW_CTS */ | ||
59 | nv_mask(priv, 0x616568 + hoff, 0x00010101, 0x00000000); /* ACR_CTRL, ?? */ | ||
60 | nv_mask(priv, 0x616578 + hoff, 0x80000000, 0x80000000); /* ACR_0441_ENABLE */ | ||
61 | |||
58 | /* ??? */ | 62 | /* ??? */ |
59 | nv_mask(priv, 0x61733c, 0x00100000, 0x00100000); /* RESETF */ | 63 | nv_mask(priv, 0x61733c, 0x00100000, 0x00100000); /* RESETF */ |
60 | nv_mask(priv, 0x61733c, 0x10000000, 0x10000000); /* LOOKUP_EN */ | 64 | nv_mask(priv, 0x61733c, 0x10000000, 0x10000000); /* LOOKUP_EN */ |
diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c index 89bf459d584b..e9b8217d0075 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c | |||
@@ -40,14 +40,13 @@ | |||
40 | * FIFO channel objects | 40 | * FIFO channel objects |
41 | ******************************************************************************/ | 41 | ******************************************************************************/ |
42 | 42 | ||
43 | void | 43 | static void |
44 | nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) | 44 | nv50_fifo_playlist_update_locked(struct nv50_fifo_priv *priv) |
45 | { | 45 | { |
46 | struct nouveau_bar *bar = nouveau_bar(priv); | 46 | struct nouveau_bar *bar = nouveau_bar(priv); |
47 | struct nouveau_gpuobj *cur; | 47 | struct nouveau_gpuobj *cur; |
48 | int i, p; | 48 | int i, p; |
49 | 49 | ||
50 | mutex_lock(&nv_subdev(priv)->mutex); | ||
51 | cur = priv->playlist[priv->cur_playlist]; | 50 | cur = priv->playlist[priv->cur_playlist]; |
52 | priv->cur_playlist = !priv->cur_playlist; | 51 | priv->cur_playlist = !priv->cur_playlist; |
53 | 52 | ||
@@ -61,6 +60,13 @@ nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) | |||
61 | nv_wr32(priv, 0x0032f4, cur->addr >> 12); | 60 | nv_wr32(priv, 0x0032f4, cur->addr >> 12); |
62 | nv_wr32(priv, 0x0032ec, p); | 61 | nv_wr32(priv, 0x0032ec, p); |
63 | nv_wr32(priv, 0x002500, 0x00000101); | 62 | nv_wr32(priv, 0x002500, 0x00000101); |
63 | } | ||
64 | |||
65 | void | ||
66 | nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) | ||
67 | { | ||
68 | mutex_lock(&nv_subdev(priv)->mutex); | ||
69 | nv50_fifo_playlist_update_locked(priv); | ||
64 | mutex_unlock(&nv_subdev(priv)->mutex); | 70 | mutex_unlock(&nv_subdev(priv)->mutex); |
65 | } | 71 | } |
66 | 72 | ||
@@ -489,7 +495,7 @@ nv50_fifo_init(struct nouveau_object *object) | |||
489 | 495 | ||
490 | for (i = 0; i < 128; i++) | 496 | for (i = 0; i < 128; i++) |
491 | nv_wr32(priv, 0x002600 + (i * 4), 0x00000000); | 497 | nv_wr32(priv, 0x002600 + (i * 4), 0x00000000); |
492 | nv50_fifo_playlist_update(priv); | 498 | nv50_fifo_playlist_update_locked(priv); |
493 | 499 | ||
494 | nv_wr32(priv, 0x003200, 0x00000001); | 500 | nv_wr32(priv, 0x003200, 0x00000001); |
495 | nv_wr32(priv, 0x003250, 0x00000001); | 501 | nv_wr32(priv, 0x003250, 0x00000001); |
diff --git a/drivers/gpu/drm/nouveau/core/include/core/class.h b/drivers/gpu/drm/nouveau/core/include/core/class.h index 0a393f7f055f..5a5961b6a6a3 100644 --- a/drivers/gpu/drm/nouveau/core/include/core/class.h +++ b/drivers/gpu/drm/nouveau/core/include/core/class.h | |||
@@ -218,7 +218,7 @@ struct nv04_display_class { | |||
218 | #define NV50_DISP_DAC_PWR_STATE 0x00000040 | 218 | #define NV50_DISP_DAC_PWR_STATE 0x00000040 |
219 | #define NV50_DISP_DAC_PWR_STATE_ON 0x00000000 | 219 | #define NV50_DISP_DAC_PWR_STATE_ON 0x00000000 |
220 | #define NV50_DISP_DAC_PWR_STATE_OFF 0x00000040 | 220 | #define NV50_DISP_DAC_PWR_STATE_OFF 0x00000040 |
221 | #define NV50_DISP_DAC_LOAD 0x0002000c | 221 | #define NV50_DISP_DAC_LOAD 0x00020100 |
222 | #define NV50_DISP_DAC_LOAD_VALUE 0x00000007 | 222 | #define NV50_DISP_DAC_LOAD_VALUE 0x00000007 |
223 | 223 | ||
224 | #define NV50_DISP_PIOR_MTHD 0x00030000 | 224 | #define NV50_DISP_PIOR_MTHD 0x00030000 |
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index ebf0a683305e..dd5e01f89f28 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
@@ -1554,7 +1554,9 @@ nv50_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector) | |||
1554 | { | 1554 | { |
1555 | struct nv50_disp *disp = nv50_disp(encoder->dev); | 1555 | struct nv50_disp *disp = nv50_disp(encoder->dev); |
1556 | int ret, or = nouveau_encoder(encoder)->or; | 1556 | int ret, or = nouveau_encoder(encoder)->or; |
1557 | u32 load = 0; | 1557 | u32 load = nouveau_drm(encoder->dev)->vbios.dactestval; |
1558 | if (load == 0) | ||
1559 | load = 340; | ||
1558 | 1560 | ||
1559 | ret = nv_exec(disp->core, NV50_DISP_DAC_LOAD + or, &load, sizeof(load)); | 1561 | ret = nv_exec(disp->core, NV50_DISP_DAC_LOAD + or, &load, sizeof(load)); |
1560 | if (ret || load != 7) | 1562 | if (ret || load != 7) |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index 44a7da66e081..8406c8251fbf 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -667,6 +667,8 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
667 | int | 667 | int |
668 | atombios_get_encoder_mode(struct drm_encoder *encoder) | 668 | atombios_get_encoder_mode(struct drm_encoder *encoder) |
669 | { | 669 | { |
670 | struct drm_device *dev = encoder->dev; | ||
671 | struct radeon_device *rdev = dev->dev_private; | ||
670 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 672 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
671 | struct drm_connector *connector; | 673 | struct drm_connector *connector; |
672 | struct radeon_connector *radeon_connector; | 674 | struct radeon_connector *radeon_connector; |
@@ -693,7 +695,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
693 | case DRM_MODE_CONNECTOR_DVII: | 695 | case DRM_MODE_CONNECTOR_DVII: |
694 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ | 696 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ |
695 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && | 697 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
696 | radeon_audio) | 698 | radeon_audio && |
699 | !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||
697 | return ATOM_ENCODER_MODE_HDMI; | 700 | return ATOM_ENCODER_MODE_HDMI; |
698 | else if (radeon_connector->use_digital) | 701 | else if (radeon_connector->use_digital) |
699 | return ATOM_ENCODER_MODE_DVI; | 702 | return ATOM_ENCODER_MODE_DVI; |
@@ -704,7 +707,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
704 | case DRM_MODE_CONNECTOR_HDMIA: | 707 | case DRM_MODE_CONNECTOR_HDMIA: |
705 | default: | 708 | default: |
706 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && | 709 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
707 | radeon_audio) | 710 | radeon_audio && |
711 | !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||
708 | return ATOM_ENCODER_MODE_HDMI; | 712 | return ATOM_ENCODER_MODE_HDMI; |
709 | else | 713 | else |
710 | return ATOM_ENCODER_MODE_DVI; | 714 | return ATOM_ENCODER_MODE_DVI; |
@@ -718,7 +722,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
718 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | 722 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) |
719 | return ATOM_ENCODER_MODE_DP; | 723 | return ATOM_ENCODER_MODE_DP; |
720 | else if (drm_detect_hdmi_monitor(radeon_connector->edid) && | 724 | else if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
721 | radeon_audio) | 725 | radeon_audio && |
726 | !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||
722 | return ATOM_ENCODER_MODE_HDMI; | 727 | return ATOM_ENCODER_MODE_HDMI; |
723 | else | 728 | else |
724 | return ATOM_ENCODER_MODE_DVI; | 729 | return ATOM_ENCODER_MODE_DVI; |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 8546e3b333b4..0f89ce3d02b9 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -4754,6 +4754,12 @@ static int evergreen_startup(struct radeon_device *rdev) | |||
4754 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; | 4754 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; |
4755 | 4755 | ||
4756 | /* Enable IRQ */ | 4756 | /* Enable IRQ */ |
4757 | if (!rdev->irq.installed) { | ||
4758 | r = radeon_irq_kms_init(rdev); | ||
4759 | if (r) | ||
4760 | return r; | ||
4761 | } | ||
4762 | |||
4757 | r = r600_irq_init(rdev); | 4763 | r = r600_irq_init(rdev); |
4758 | if (r) { | 4764 | if (r) { |
4759 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 4765 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
@@ -4923,10 +4929,6 @@ int evergreen_init(struct radeon_device *rdev) | |||
4923 | if (r) | 4929 | if (r) |
4924 | return r; | 4930 | return r; |
4925 | 4931 | ||
4926 | r = radeon_irq_kms_init(rdev); | ||
4927 | if (r) | ||
4928 | return r; | ||
4929 | |||
4930 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | 4932 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
4931 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | 4933 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
4932 | 4934 | ||
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 7969c0c8ec20..84583302b081 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -2025,6 +2025,12 @@ static int cayman_startup(struct radeon_device *rdev) | |||
2025 | } | 2025 | } |
2026 | 2026 | ||
2027 | /* Enable IRQ */ | 2027 | /* Enable IRQ */ |
2028 | if (!rdev->irq.installed) { | ||
2029 | r = radeon_irq_kms_init(rdev); | ||
2030 | if (r) | ||
2031 | return r; | ||
2032 | } | ||
2033 | |||
2028 | r = r600_irq_init(rdev); | 2034 | r = r600_irq_init(rdev); |
2029 | if (r) { | 2035 | if (r) { |
2030 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 2036 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
@@ -2190,10 +2196,6 @@ int cayman_init(struct radeon_device *rdev) | |||
2190 | if (r) | 2196 | if (r) |
2191 | return r; | 2197 | return r; |
2192 | 2198 | ||
2193 | r = radeon_irq_kms_init(rdev); | ||
2194 | if (r) | ||
2195 | return r; | ||
2196 | |||
2197 | ring->ring_obj = NULL; | 2199 | ring->ring_obj = NULL; |
2198 | r600_ring_init(rdev, ring, 1024 * 1024); | 2200 | r600_ring_init(rdev, ring, 1024 * 1024); |
2199 | 2201 | ||
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 4973bff37fec..d0314ecbd7c1 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -3869,6 +3869,12 @@ static int r100_startup(struct radeon_device *rdev) | |||
3869 | } | 3869 | } |
3870 | 3870 | ||
3871 | /* Enable IRQ */ | 3871 | /* Enable IRQ */ |
3872 | if (!rdev->irq.installed) { | ||
3873 | r = radeon_irq_kms_init(rdev); | ||
3874 | if (r) | ||
3875 | return r; | ||
3876 | } | ||
3877 | |||
3872 | r100_irq_set(rdev); | 3878 | r100_irq_set(rdev); |
3873 | rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 3879 | rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
3874 | /* 1M ring buffer */ | 3880 | /* 1M ring buffer */ |
@@ -4024,9 +4030,6 @@ int r100_init(struct radeon_device *rdev) | |||
4024 | r = radeon_fence_driver_init(rdev); | 4030 | r = radeon_fence_driver_init(rdev); |
4025 | if (r) | 4031 | if (r) |
4026 | return r; | 4032 | return r; |
4027 | r = radeon_irq_kms_init(rdev); | ||
4028 | if (r) | ||
4029 | return r; | ||
4030 | /* Memory manager */ | 4033 | /* Memory manager */ |
4031 | r = radeon_bo_init(rdev); | 4034 | r = radeon_bo_init(rdev); |
4032 | if (r) | 4035 | if (r) |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index c60350e6872d..b9b776f1e582 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
@@ -1382,6 +1382,12 @@ static int r300_startup(struct radeon_device *rdev) | |||
1382 | } | 1382 | } |
1383 | 1383 | ||
1384 | /* Enable IRQ */ | 1384 | /* Enable IRQ */ |
1385 | if (!rdev->irq.installed) { | ||
1386 | r = radeon_irq_kms_init(rdev); | ||
1387 | if (r) | ||
1388 | return r; | ||
1389 | } | ||
1390 | |||
1385 | r100_irq_set(rdev); | 1391 | r100_irq_set(rdev); |
1386 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 1392 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
1387 | /* 1M ring buffer */ | 1393 | /* 1M ring buffer */ |
@@ -1516,9 +1522,6 @@ int r300_init(struct radeon_device *rdev) | |||
1516 | r = radeon_fence_driver_init(rdev); | 1522 | r = radeon_fence_driver_init(rdev); |
1517 | if (r) | 1523 | if (r) |
1518 | return r; | 1524 | return r; |
1519 | r = radeon_irq_kms_init(rdev); | ||
1520 | if (r) | ||
1521 | return r; | ||
1522 | /* Memory manager */ | 1525 | /* Memory manager */ |
1523 | r = radeon_bo_init(rdev); | 1526 | r = radeon_bo_init(rdev); |
1524 | if (r) | 1527 | if (r) |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index 6fce2eb4dd16..4e796ecf9ea4 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
@@ -265,6 +265,12 @@ static int r420_startup(struct radeon_device *rdev) | |||
265 | } | 265 | } |
266 | 266 | ||
267 | /* Enable IRQ */ | 267 | /* Enable IRQ */ |
268 | if (!rdev->irq.installed) { | ||
269 | r = radeon_irq_kms_init(rdev); | ||
270 | if (r) | ||
271 | return r; | ||
272 | } | ||
273 | |||
268 | r100_irq_set(rdev); | 274 | r100_irq_set(rdev); |
269 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 275 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
270 | /* 1M ring buffer */ | 276 | /* 1M ring buffer */ |
@@ -411,10 +417,6 @@ int r420_init(struct radeon_device *rdev) | |||
411 | if (r) { | 417 | if (r) { |
412 | return r; | 418 | return r; |
413 | } | 419 | } |
414 | r = radeon_irq_kms_init(rdev); | ||
415 | if (r) { | ||
416 | return r; | ||
417 | } | ||
418 | /* Memory manager */ | 420 | /* Memory manager */ |
419 | r = radeon_bo_init(rdev); | 421 | r = radeon_bo_init(rdev); |
420 | if (r) { | 422 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index f795a4e092cb..e1aece73b370 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
@@ -194,6 +194,12 @@ static int r520_startup(struct radeon_device *rdev) | |||
194 | } | 194 | } |
195 | 195 | ||
196 | /* Enable IRQ */ | 196 | /* Enable IRQ */ |
197 | if (!rdev->irq.installed) { | ||
198 | r = radeon_irq_kms_init(rdev); | ||
199 | if (r) | ||
200 | return r; | ||
201 | } | ||
202 | |||
197 | rs600_irq_set(rdev); | 203 | rs600_irq_set(rdev); |
198 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 204 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
199 | /* 1M ring buffer */ | 205 | /* 1M ring buffer */ |
@@ -297,9 +303,6 @@ int r520_init(struct radeon_device *rdev) | |||
297 | r = radeon_fence_driver_init(rdev); | 303 | r = radeon_fence_driver_init(rdev); |
298 | if (r) | 304 | if (r) |
299 | return r; | 305 | return r; |
300 | r = radeon_irq_kms_init(rdev); | ||
301 | if (r) | ||
302 | return r; | ||
303 | /* Memory manager */ | 306 | /* Memory manager */ |
304 | r = radeon_bo_init(rdev); | 307 | r = radeon_bo_init(rdev); |
305 | if (r) | 308 | if (r) |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index b45e64848677..0e5341695922 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -1046,6 +1046,24 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev) | |||
1046 | return -1; | 1046 | return -1; |
1047 | } | 1047 | } |
1048 | 1048 | ||
1049 | uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg) | ||
1050 | { | ||
1051 | uint32_t r; | ||
1052 | |||
1053 | WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg)); | ||
1054 | r = RREG32(R_0028FC_MC_DATA); | ||
1055 | WREG32(R_0028F8_MC_INDEX, ~C_0028F8_MC_IND_ADDR); | ||
1056 | return r; | ||
1057 | } | ||
1058 | |||
1059 | void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | ||
1060 | { | ||
1061 | WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg) | | ||
1062 | S_0028F8_MC_IND_WR_EN(1)); | ||
1063 | WREG32(R_0028FC_MC_DATA, v); | ||
1064 | WREG32(R_0028F8_MC_INDEX, 0x7F); | ||
1065 | } | ||
1066 | |||
1049 | static void r600_mc_program(struct radeon_device *rdev) | 1067 | static void r600_mc_program(struct radeon_device *rdev) |
1050 | { | 1068 | { |
1051 | struct rv515_mc_save save; | 1069 | struct rv515_mc_save save; |
@@ -1181,6 +1199,8 @@ static int r600_mc_init(struct radeon_device *rdev) | |||
1181 | { | 1199 | { |
1182 | u32 tmp; | 1200 | u32 tmp; |
1183 | int chansize, numchan; | 1201 | int chansize, numchan; |
1202 | uint32_t h_addr, l_addr; | ||
1203 | unsigned long long k8_addr; | ||
1184 | 1204 | ||
1185 | /* Get VRAM informations */ | 1205 | /* Get VRAM informations */ |
1186 | rdev->mc.vram_is_ddr = true; | 1206 | rdev->mc.vram_is_ddr = true; |
@@ -1221,7 +1241,30 @@ static int r600_mc_init(struct radeon_device *rdev) | |||
1221 | if (rdev->flags & RADEON_IS_IGP) { | 1241 | if (rdev->flags & RADEON_IS_IGP) { |
1222 | rs690_pm_info(rdev); | 1242 | rs690_pm_info(rdev); |
1223 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | 1243 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); |
1244 | |||
1245 | if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { | ||
1246 | /* Use K8 direct mapping for fast fb access. */ | ||
1247 | rdev->fastfb_working = false; | ||
1248 | h_addr = G_000012_K8_ADDR_EXT(RREG32_MC(R_000012_MC_MISC_UMA_CNTL)); | ||
1249 | l_addr = RREG32_MC(R_000011_K8_FB_LOCATION); | ||
1250 | k8_addr = ((unsigned long long)h_addr) << 32 | l_addr; | ||
1251 | #if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) | ||
1252 | if (k8_addr + rdev->mc.visible_vram_size < 0x100000000ULL) | ||
1253 | #endif | ||
1254 | { | ||
1255 | /* FastFB shall be used with UMA memory. Here it is simply disabled when sideport | ||
1256 | * memory is present. | ||
1257 | */ | ||
1258 | if (rdev->mc.igp_sideport_enabled == false && radeon_fastfb == 1) { | ||
1259 | DRM_INFO("Direct mapping: aper base at 0x%llx, replaced by direct mapping base 0x%llx.\n", | ||
1260 | (unsigned long long)rdev->mc.aper_base, k8_addr); | ||
1261 | rdev->mc.aper_base = (resource_size_t)k8_addr; | ||
1262 | rdev->fastfb_working = true; | ||
1263 | } | ||
1264 | } | ||
1265 | } | ||
1224 | } | 1266 | } |
1267 | |||
1225 | radeon_update_bandwidth_info(rdev); | 1268 | radeon_update_bandwidth_info(rdev); |
1226 | return 0; | 1269 | return 0; |
1227 | } | 1270 | } |
@@ -3202,6 +3245,12 @@ static int r600_startup(struct radeon_device *rdev) | |||
3202 | } | 3245 | } |
3203 | 3246 | ||
3204 | /* Enable IRQ */ | 3247 | /* Enable IRQ */ |
3248 | if (!rdev->irq.installed) { | ||
3249 | r = radeon_irq_kms_init(rdev); | ||
3250 | if (r) | ||
3251 | return r; | ||
3252 | } | ||
3253 | |||
3205 | r = r600_irq_init(rdev); | 3254 | r = r600_irq_init(rdev); |
3206 | if (r) { | 3255 | if (r) { |
3207 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 3256 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
@@ -3356,10 +3405,6 @@ int r600_init(struct radeon_device *rdev) | |||
3356 | if (r) | 3405 | if (r) |
3357 | return r; | 3406 | return r; |
3358 | 3407 | ||
3359 | r = radeon_irq_kms_init(rdev); | ||
3360 | if (r) | ||
3361 | return r; | ||
3362 | |||
3363 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | 3408 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
3364 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | 3409 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
3365 | 3410 | ||
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index acb146c06973..79df558f8c40 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -1342,6 +1342,14 @@ | |||
1342 | #define PACKET3_STRMOUT_BASE_UPDATE 0x72 /* r7xx */ | 1342 | #define PACKET3_STRMOUT_BASE_UPDATE 0x72 /* r7xx */ |
1343 | #define PACKET3_SURFACE_BASE_UPDATE 0x73 | 1343 | #define PACKET3_SURFACE_BASE_UPDATE 0x73 |
1344 | 1344 | ||
1345 | #define R_000011_K8_FB_LOCATION 0x11 | ||
1346 | #define R_000012_MC_MISC_UMA_CNTL 0x12 | ||
1347 | #define G_000012_K8_ADDR_EXT(x) (((x) >> 0) & 0xFF) | ||
1348 | #define R_0028F8_MC_INDEX 0x28F8 | ||
1349 | #define S_0028F8_MC_IND_ADDR(x) (((x) & 0x1FF) << 0) | ||
1350 | #define C_0028F8_MC_IND_ADDR 0xFFFFFE00 | ||
1351 | #define S_0028F8_MC_IND_WR_EN(x) (((x) & 0x1) << 9) | ||
1352 | #define R_0028FC_MC_DATA 0x28FC | ||
1345 | 1353 | ||
1346 | #define R_008020_GRBM_SOFT_RESET 0x8020 | 1354 | #define R_008020_GRBM_SOFT_RESET 0x8020 |
1347 | #define S_008020_SOFT_RESET_CP(x) (((x) & 1) << 0) | 1355 | #define S_008020_SOFT_RESET_CP(x) (((x) & 1) << 0) |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 06b8c19ab19e..a2802b47ee95 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
@@ -122,6 +122,10 @@ static void radeon_register_accessor_init(struct radeon_device *rdev) | |||
122 | rdev->mc_rreg = &rs600_mc_rreg; | 122 | rdev->mc_rreg = &rs600_mc_rreg; |
123 | rdev->mc_wreg = &rs600_mc_wreg; | 123 | rdev->mc_wreg = &rs600_mc_wreg; |
124 | } | 124 | } |
125 | if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { | ||
126 | rdev->mc_rreg = &rs780_mc_rreg; | ||
127 | rdev->mc_wreg = &rs780_mc_wreg; | ||
128 | } | ||
125 | if (rdev->family >= CHIP_R600) { | 129 | if (rdev->family >= CHIP_R600) { |
126 | rdev->pciep_rreg = &r600_pciep_rreg; | 130 | rdev->pciep_rreg = &r600_pciep_rreg; |
127 | rdev->pciep_wreg = &r600_pciep_wreg; | 131 | rdev->pciep_wreg = &r600_pciep_wreg; |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 2c87365d345f..a72759ede753 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
@@ -347,6 +347,8 @@ extern bool r600_gui_idle(struct radeon_device *rdev); | |||
347 | extern void r600_pm_misc(struct radeon_device *rdev); | 347 | extern void r600_pm_misc(struct radeon_device *rdev); |
348 | extern void r600_pm_init_profile(struct radeon_device *rdev); | 348 | extern void r600_pm_init_profile(struct radeon_device *rdev); |
349 | extern void rs780_pm_init_profile(struct radeon_device *rdev); | 349 | extern void rs780_pm_init_profile(struct radeon_device *rdev); |
350 | extern uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg); | ||
351 | extern void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | ||
350 | extern void r600_pm_get_dynpm_state(struct radeon_device *rdev); | 352 | extern void r600_pm_get_dynpm_state(struct radeon_device *rdev); |
351 | extern void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes); | 353 | extern void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes); |
352 | extern int r600_get_pcie_lanes(struct radeon_device *rdev); | 354 | extern int r600_get_pcie_lanes(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 73051ce3121e..233a9b9fa1f7 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
@@ -417,6 +417,12 @@ static int rs400_startup(struct radeon_device *rdev) | |||
417 | } | 417 | } |
418 | 418 | ||
419 | /* Enable IRQ */ | 419 | /* Enable IRQ */ |
420 | if (!rdev->irq.installed) { | ||
421 | r = radeon_irq_kms_init(rdev); | ||
422 | if (r) | ||
423 | return r; | ||
424 | } | ||
425 | |||
420 | r100_irq_set(rdev); | 426 | r100_irq_set(rdev); |
421 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 427 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
422 | /* 1M ring buffer */ | 428 | /* 1M ring buffer */ |
@@ -535,9 +541,6 @@ int rs400_init(struct radeon_device *rdev) | |||
535 | r = radeon_fence_driver_init(rdev); | 541 | r = radeon_fence_driver_init(rdev); |
536 | if (r) | 542 | if (r) |
537 | return r; | 543 | return r; |
538 | r = radeon_irq_kms_init(rdev); | ||
539 | if (r) | ||
540 | return r; | ||
541 | /* Memory manager */ | 544 | /* Memory manager */ |
542 | r = radeon_bo_init(rdev); | 545 | r = radeon_bo_init(rdev); |
543 | if (r) | 546 | if (r) |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 46fa1b07c560..670b555d2ca2 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
@@ -923,6 +923,12 @@ static int rs600_startup(struct radeon_device *rdev) | |||
923 | } | 923 | } |
924 | 924 | ||
925 | /* Enable IRQ */ | 925 | /* Enable IRQ */ |
926 | if (!rdev->irq.installed) { | ||
927 | r = radeon_irq_kms_init(rdev); | ||
928 | if (r) | ||
929 | return r; | ||
930 | } | ||
931 | |||
926 | rs600_irq_set(rdev); | 932 | rs600_irq_set(rdev); |
927 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 933 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
928 | /* 1M ring buffer */ | 934 | /* 1M ring buffer */ |
@@ -1047,9 +1053,6 @@ int rs600_init(struct radeon_device *rdev) | |||
1047 | r = radeon_fence_driver_init(rdev); | 1053 | r = radeon_fence_driver_init(rdev); |
1048 | if (r) | 1054 | if (r) |
1049 | return r; | 1055 | return r; |
1050 | r = radeon_irq_kms_init(rdev); | ||
1051 | if (r) | ||
1052 | return r; | ||
1053 | /* Memory manager */ | 1056 | /* Memory manager */ |
1054 | r = radeon_bo_init(rdev); | 1057 | r = radeon_bo_init(rdev); |
1055 | if (r) | 1058 | if (r) |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index ab4c86cfd552..55880d5962c3 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
@@ -651,6 +651,12 @@ static int rs690_startup(struct radeon_device *rdev) | |||
651 | } | 651 | } |
652 | 652 | ||
653 | /* Enable IRQ */ | 653 | /* Enable IRQ */ |
654 | if (!rdev->irq.installed) { | ||
655 | r = radeon_irq_kms_init(rdev); | ||
656 | if (r) | ||
657 | return r; | ||
658 | } | ||
659 | |||
654 | rs600_irq_set(rdev); | 660 | rs600_irq_set(rdev); |
655 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 661 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
656 | /* 1M ring buffer */ | 662 | /* 1M ring buffer */ |
@@ -776,9 +782,6 @@ int rs690_init(struct radeon_device *rdev) | |||
776 | r = radeon_fence_driver_init(rdev); | 782 | r = radeon_fence_driver_init(rdev); |
777 | if (r) | 783 | if (r) |
778 | return r; | 784 | return r; |
779 | r = radeon_irq_kms_init(rdev); | ||
780 | if (r) | ||
781 | return r; | ||
782 | /* Memory manager */ | 785 | /* Memory manager */ |
783 | r = radeon_bo_init(rdev); | 786 | r = radeon_bo_init(rdev); |
784 | if (r) | 787 | if (r) |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index ffcba730c57c..21c7d7b26e55 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
@@ -532,6 +532,12 @@ static int rv515_startup(struct radeon_device *rdev) | |||
532 | } | 532 | } |
533 | 533 | ||
534 | /* Enable IRQ */ | 534 | /* Enable IRQ */ |
535 | if (!rdev->irq.installed) { | ||
536 | r = radeon_irq_kms_init(rdev); | ||
537 | if (r) | ||
538 | return r; | ||
539 | } | ||
540 | |||
535 | rs600_irq_set(rdev); | 541 | rs600_irq_set(rdev); |
536 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 542 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
537 | /* 1M ring buffer */ | 543 | /* 1M ring buffer */ |
@@ -662,9 +668,6 @@ int rv515_init(struct radeon_device *rdev) | |||
662 | r = radeon_fence_driver_init(rdev); | 668 | r = radeon_fence_driver_init(rdev); |
663 | if (r) | 669 | if (r) |
664 | return r; | 670 | return r; |
665 | r = radeon_irq_kms_init(rdev); | ||
666 | if (r) | ||
667 | return r; | ||
668 | /* Memory manager */ | 671 | /* Memory manager */ |
669 | r = radeon_bo_init(rdev); | 672 | r = radeon_bo_init(rdev); |
670 | if (r) | 673 | if (r) |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 08aef24afe40..4a62ad2e5399 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -1887,6 +1887,12 @@ static int rv770_startup(struct radeon_device *rdev) | |||
1887 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; | 1887 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; |
1888 | 1888 | ||
1889 | /* Enable IRQ */ | 1889 | /* Enable IRQ */ |
1890 | if (!rdev->irq.installed) { | ||
1891 | r = radeon_irq_kms_init(rdev); | ||
1892 | if (r) | ||
1893 | return r; | ||
1894 | } | ||
1895 | |||
1890 | r = r600_irq_init(rdev); | 1896 | r = r600_irq_init(rdev); |
1891 | if (r) { | 1897 | if (r) { |
1892 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 1898 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
@@ -2045,10 +2051,6 @@ int rv770_init(struct radeon_device *rdev) | |||
2045 | if (r) | 2051 | if (r) |
2046 | return r; | 2052 | return r; |
2047 | 2053 | ||
2048 | r = radeon_irq_kms_init(rdev); | ||
2049 | if (r) | ||
2050 | return r; | ||
2051 | |||
2052 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | 2054 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
2053 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | 2055 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
2054 | 2056 | ||
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index d1ba9d88f311..a1b0da6b5808 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -5350,6 +5350,12 @@ static int si_startup(struct radeon_device *rdev) | |||
5350 | } | 5350 | } |
5351 | 5351 | ||
5352 | /* Enable IRQ */ | 5352 | /* Enable IRQ */ |
5353 | if (!rdev->irq.installed) { | ||
5354 | r = radeon_irq_kms_init(rdev); | ||
5355 | if (r) | ||
5356 | return r; | ||
5357 | } | ||
5358 | |||
5353 | r = si_irq_init(rdev); | 5359 | r = si_irq_init(rdev); |
5354 | if (r) { | 5360 | if (r) { |
5355 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 5361 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
@@ -5533,10 +5539,6 @@ int si_init(struct radeon_device *rdev) | |||
5533 | if (r) | 5539 | if (r) |
5534 | return r; | 5540 | return r; |
5535 | 5541 | ||
5536 | r = radeon_irq_kms_init(rdev); | ||
5537 | if (r) | ||
5538 | return r; | ||
5539 | |||
5540 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; | 5542 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
5541 | ring->ring_obj = NULL; | 5543 | ring->ring_obj = NULL; |
5542 | r600_ring_init(rdev, ring, 1024 * 1024); | 5544 | r600_ring_init(rdev, ring, 1024 * 1024); |
diff --git a/drivers/gpu/drm/tilcdc/Kconfig b/drivers/gpu/drm/tilcdc/Kconfig index e461e9972455..7a4d10106906 100644 --- a/drivers/gpu/drm/tilcdc/Kconfig +++ b/drivers/gpu/drm/tilcdc/Kconfig | |||
@@ -6,6 +6,7 @@ config DRM_TILCDC | |||
6 | select DRM_GEM_CMA_HELPER | 6 | select DRM_GEM_CMA_HELPER |
7 | select VIDEOMODE_HELPERS | 7 | select VIDEOMODE_HELPERS |
8 | select BACKLIGHT_CLASS_DEVICE | 8 | select BACKLIGHT_CLASS_DEVICE |
9 | select BACKLIGHT_LCD_SUPPORT | ||
9 | help | 10 | help |
10 | Choose this option if you have an TI SoC with LCDC display | 11 | Choose this option if you have an TI SoC with LCDC display |
11 | controller, for example AM33xx in beagle-bone, DA8xx, or | 12 | controller, for example AM33xx in beagle-bone, DA8xx, or |
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c index dc3ae5c56f56..d39a5cede0b0 100644 --- a/drivers/hid/hid-multitouch.c +++ b/drivers/hid/hid-multitouch.c | |||
@@ -264,9 +264,12 @@ static struct mt_class mt_classes[] = { | |||
264 | static void mt_free_input_name(struct hid_input *hi) | 264 | static void mt_free_input_name(struct hid_input *hi) |
265 | { | 265 | { |
266 | struct hid_device *hdev = hi->report->device; | 266 | struct hid_device *hdev = hi->report->device; |
267 | const char *name = hi->input->name; | ||
267 | 268 | ||
268 | if (hi->input->name != hdev->name) | 269 | if (name != hdev->name) { |
269 | kfree(hi->input->name); | 270 | hi->input->name = hdev->name; |
271 | kfree(name); | ||
272 | } | ||
270 | } | 273 | } |
271 | 274 | ||
272 | static ssize_t mt_show_quirks(struct device *dev, | 275 | static ssize_t mt_show_quirks(struct device *dev, |
@@ -1040,11 +1043,11 @@ static void mt_remove(struct hid_device *hdev) | |||
1040 | struct hid_input *hi; | 1043 | struct hid_input *hi; |
1041 | 1044 | ||
1042 | sysfs_remove_group(&hdev->dev.kobj, &mt_attribute_group); | 1045 | sysfs_remove_group(&hdev->dev.kobj, &mt_attribute_group); |
1043 | hid_hw_stop(hdev); | ||
1044 | |||
1045 | list_for_each_entry(hi, &hdev->inputs, list) | 1046 | list_for_each_entry(hi, &hdev->inputs, list) |
1046 | mt_free_input_name(hi); | 1047 | mt_free_input_name(hi); |
1047 | 1048 | ||
1049 | hid_hw_stop(hdev); | ||
1050 | |||
1048 | kfree(td); | 1051 | kfree(td); |
1049 | hid_set_drvdata(hdev, NULL); | 1052 | hid_set_drvdata(hdev, NULL); |
1050 | } | 1053 | } |
diff --git a/drivers/hwmon/adm1021.c b/drivers/hwmon/adm1021.c index 7e76922a4ba9..f920619cd6da 100644 --- a/drivers/hwmon/adm1021.c +++ b/drivers/hwmon/adm1021.c | |||
@@ -331,26 +331,68 @@ static int adm1021_detect(struct i2c_client *client, | |||
331 | man_id = i2c_smbus_read_byte_data(client, ADM1021_REG_MAN_ID); | 331 | man_id = i2c_smbus_read_byte_data(client, ADM1021_REG_MAN_ID); |
332 | dev_id = i2c_smbus_read_byte_data(client, ADM1021_REG_DEV_ID); | 332 | dev_id = i2c_smbus_read_byte_data(client, ADM1021_REG_DEV_ID); |
333 | 333 | ||
334 | if (man_id < 0 || dev_id < 0) | ||
335 | return -ENODEV; | ||
336 | |||
334 | if (man_id == 0x4d && dev_id == 0x01) | 337 | if (man_id == 0x4d && dev_id == 0x01) |
335 | type_name = "max1617a"; | 338 | type_name = "max1617a"; |
336 | else if (man_id == 0x41) { | 339 | else if (man_id == 0x41) { |
337 | if ((dev_id & 0xF0) == 0x30) | 340 | if ((dev_id & 0xF0) == 0x30) |
338 | type_name = "adm1023"; | 341 | type_name = "adm1023"; |
339 | else | 342 | else if ((dev_id & 0xF0) == 0x00) |
340 | type_name = "adm1021"; | 343 | type_name = "adm1021"; |
344 | else | ||
345 | return -ENODEV; | ||
341 | } else if (man_id == 0x49) | 346 | } else if (man_id == 0x49) |
342 | type_name = "thmc10"; | 347 | type_name = "thmc10"; |
343 | else if (man_id == 0x23) | 348 | else if (man_id == 0x23) |
344 | type_name = "gl523sm"; | 349 | type_name = "gl523sm"; |
345 | else if (man_id == 0x54) | 350 | else if (man_id == 0x54) |
346 | type_name = "mc1066"; | 351 | type_name = "mc1066"; |
347 | /* LM84 Mfr ID in a different place, and it has more unused bits */ | 352 | else { |
348 | else if (conv_rate == 0x00 | 353 | int lte, rte, lhi, rhi, llo, rlo; |
349 | && (config & 0x7F) == 0x00 | 354 | |
350 | && (status & 0xAB) == 0x00) | 355 | /* extra checks for LM84 and MAX1617 to avoid misdetections */ |
351 | type_name = "lm84"; | 356 | |
352 | else | 357 | llo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(0)); |
353 | type_name = "max1617"; | 358 | rlo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(1)); |
359 | |||
360 | /* fail if any of the additional register reads failed */ | ||
361 | if (llo < 0 || rlo < 0) | ||
362 | return -ENODEV; | ||
363 | |||
364 | lte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(0)); | ||
365 | rte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(1)); | ||
366 | lhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(0)); | ||
367 | rhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(1)); | ||
368 | |||
369 | /* | ||
370 | * Fail for negative temperatures and negative high limits. | ||
371 | * This check also catches read errors on the tested registers. | ||
372 | */ | ||
373 | if ((s8)lte < 0 || (s8)rte < 0 || (s8)lhi < 0 || (s8)rhi < 0) | ||
374 | return -ENODEV; | ||
375 | |||
376 | /* fail if all registers hold the same value */ | ||
377 | if (lte == rte && lte == lhi && lte == rhi && lte == llo | ||
378 | && lte == rlo) | ||
379 | return -ENODEV; | ||
380 | |||
381 | /* | ||
382 | * LM84 Mfr ID is in a different place, | ||
383 | * and it has more unused bits. | ||
384 | */ | ||
385 | if (conv_rate == 0x00 | ||
386 | && (config & 0x7F) == 0x00 | ||
387 | && (status & 0xAB) == 0x00) { | ||
388 | type_name = "lm84"; | ||
389 | } else { | ||
390 | /* fail if low limits are larger than high limits */ | ||
391 | if ((s8)llo > lhi || (s8)rlo > rhi) | ||
392 | return -ENODEV; | ||
393 | type_name = "max1617"; | ||
394 | } | ||
395 | } | ||
354 | 396 | ||
355 | pr_debug("Detected chip %s at adapter %d, address 0x%02x.\n", | 397 | pr_debug("Detected chip %s at adapter %d, address 0x%02x.\n", |
356 | type_name, i2c_adapter_id(adapter), client->addr); | 398 | type_name, i2c_adapter_id(adapter), client->addr); |
diff --git a/drivers/infiniband/hw/qib/qib_keys.c b/drivers/infiniband/hw/qib/qib_keys.c index 81c7b73695d2..3b9afccaaade 100644 --- a/drivers/infiniband/hw/qib/qib_keys.c +++ b/drivers/infiniband/hw/qib/qib_keys.c | |||
@@ -61,7 +61,7 @@ int qib_alloc_lkey(struct qib_mregion *mr, int dma_region) | |||
61 | if (dma_region) { | 61 | if (dma_region) { |
62 | struct qib_mregion *tmr; | 62 | struct qib_mregion *tmr; |
63 | 63 | ||
64 | tmr = rcu_dereference(dev->dma_mr); | 64 | tmr = rcu_access_pointer(dev->dma_mr); |
65 | if (!tmr) { | 65 | if (!tmr) { |
66 | qib_get_mr(mr); | 66 | qib_get_mr(mr); |
67 | rcu_assign_pointer(dev->dma_mr, mr); | 67 | rcu_assign_pointer(dev->dma_mr, mr); |
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c index f19b0998a53c..2e84ef859c5b 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.c +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c | |||
@@ -5,6 +5,7 @@ | |||
5 | * Copyright (C) 2004 Alex Aizman | 5 | * Copyright (C) 2004 Alex Aizman |
6 | * Copyright (C) 2005 Mike Christie | 6 | * Copyright (C) 2005 Mike Christie |
7 | * Copyright (c) 2005, 2006 Voltaire, Inc. All rights reserved. | 7 | * Copyright (c) 2005, 2006 Voltaire, Inc. All rights reserved. |
8 | * Copyright (c) 2013 Mellanox Technologies. All rights reserved. | ||
8 | * maintained by openib-general@openib.org | 9 | * maintained by openib-general@openib.org |
9 | * | 10 | * |
10 | * This software is available to you under a choice of one of two | 11 | * This software is available to you under a choice of one of two |
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h index 06f578cde75b..4f069c0d4c04 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.h +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h | |||
@@ -8,6 +8,7 @@ | |||
8 | * | 8 | * |
9 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. | 9 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. |
10 | * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. | 10 | * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. |
11 | * Copyright (c) 2013 Mellanox Technologies. All rights reserved. | ||
11 | * | 12 | * |
12 | * This software is available to you under a choice of one of two | 13 | * This software is available to you under a choice of one of two |
13 | * licenses. You may choose to be licensed under the terms of the GNU | 14 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c index a00ccd1ca333..b6d81a86c976 100644 --- a/drivers/infiniband/ulp/iser/iser_initiator.c +++ b/drivers/infiniband/ulp/iser/iser_initiator.c | |||
@@ -1,5 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. | 2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. |
3 | * Copyright (c) 2013 Mellanox Technologies. All rights reserved. | ||
3 | * | 4 | * |
4 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 6 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c index 68ebb7fe072a..7827baf455a1 100644 --- a/drivers/infiniband/ulp/iser/iser_memory.c +++ b/drivers/infiniband/ulp/iser/iser_memory.c | |||
@@ -1,5 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. | 2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. |
3 | * Copyright (c) 2013 Mellanox Technologies. All rights reserved. | ||
3 | * | 4 | * |
4 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 6 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index 5278916c3103..2c4941d0656b 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. | 2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. |
3 | * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. | 3 | * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. |
4 | * Copyright (c) 2013 Mellanox Technologies. All rights reserved. | ||
4 | * | 5 | * |
5 | * This software is available to you under a choice of one of two | 6 | * This software is available to you under a choice of one of two |
6 | * licenses. You may choose to be licensed under the terms of the GNU | 7 | * licenses. You may choose to be licensed under the terms of the GNU |
@@ -292,10 +293,10 @@ out_err: | |||
292 | } | 293 | } |
293 | 294 | ||
294 | /** | 295 | /** |
295 | * releases the FMR pool, QP and CMA ID objects, returns 0 on success, | 296 | * releases the FMR pool and QP objects, returns 0 on success, |
296 | * -1 on failure | 297 | * -1 on failure |
297 | */ | 298 | */ |
298 | static int iser_free_ib_conn_res(struct iser_conn *ib_conn, int can_destroy_id) | 299 | static int iser_free_ib_conn_res(struct iser_conn *ib_conn) |
299 | { | 300 | { |
300 | int cq_index; | 301 | int cq_index; |
301 | BUG_ON(ib_conn == NULL); | 302 | BUG_ON(ib_conn == NULL); |
@@ -314,13 +315,9 @@ static int iser_free_ib_conn_res(struct iser_conn *ib_conn, int can_destroy_id) | |||
314 | 315 | ||
315 | rdma_destroy_qp(ib_conn->cma_id); | 316 | rdma_destroy_qp(ib_conn->cma_id); |
316 | } | 317 | } |
317 | /* if cma handler context, the caller acts s.t the cma destroy the id */ | ||
318 | if (ib_conn->cma_id != NULL && can_destroy_id) | ||
319 | rdma_destroy_id(ib_conn->cma_id); | ||
320 | 318 | ||
321 | ib_conn->fmr_pool = NULL; | 319 | ib_conn->fmr_pool = NULL; |
322 | ib_conn->qp = NULL; | 320 | ib_conn->qp = NULL; |
323 | ib_conn->cma_id = NULL; | ||
324 | kfree(ib_conn->page_vec); | 321 | kfree(ib_conn->page_vec); |
325 | 322 | ||
326 | if (ib_conn->login_buf) { | 323 | if (ib_conn->login_buf) { |
@@ -415,11 +412,16 @@ static void iser_conn_release(struct iser_conn *ib_conn, int can_destroy_id) | |||
415 | list_del(&ib_conn->conn_list); | 412 | list_del(&ib_conn->conn_list); |
416 | mutex_unlock(&ig.connlist_mutex); | 413 | mutex_unlock(&ig.connlist_mutex); |
417 | iser_free_rx_descriptors(ib_conn); | 414 | iser_free_rx_descriptors(ib_conn); |
418 | iser_free_ib_conn_res(ib_conn, can_destroy_id); | 415 | iser_free_ib_conn_res(ib_conn); |
419 | ib_conn->device = NULL; | 416 | ib_conn->device = NULL; |
420 | /* on EVENT_ADDR_ERROR there's no device yet for this conn */ | 417 | /* on EVENT_ADDR_ERROR there's no device yet for this conn */ |
421 | if (device != NULL) | 418 | if (device != NULL) |
422 | iser_device_try_release(device); | 419 | iser_device_try_release(device); |
420 | /* if cma handler context, the caller actually destroy the id */ | ||
421 | if (ib_conn->cma_id != NULL && can_destroy_id) { | ||
422 | rdma_destroy_id(ib_conn->cma_id); | ||
423 | ib_conn->cma_id = NULL; | ||
424 | } | ||
423 | iscsi_destroy_endpoint(ib_conn->ep); | 425 | iscsi_destroy_endpoint(ib_conn->ep); |
424 | } | 426 | } |
425 | 427 | ||
diff --git a/drivers/irqchip/irq-mxs.c b/drivers/irqchip/irq-mxs.c index 29889bbdcc6d..63b3d4eb0ef7 100644 --- a/drivers/irqchip/irq-mxs.c +++ b/drivers/irqchip/irq-mxs.c | |||
@@ -76,16 +76,10 @@ asmlinkage void __exception_irq_entry icoll_handle_irq(struct pt_regs *regs) | |||
76 | { | 76 | { |
77 | u32 irqnr; | 77 | u32 irqnr; |
78 | 78 | ||
79 | do { | 79 | irqnr = __raw_readl(icoll_base + HW_ICOLL_STAT_OFFSET); |
80 | irqnr = __raw_readl(icoll_base + HW_ICOLL_STAT_OFFSET); | 80 | __raw_writel(irqnr, icoll_base + HW_ICOLL_VECTOR); |
81 | if (irqnr != 0x7f) { | 81 | irqnr = irq_find_mapping(icoll_domain, irqnr); |
82 | __raw_writel(irqnr, icoll_base + HW_ICOLL_VECTOR); | 82 | handle_IRQ(irqnr, regs); |
83 | irqnr = irq_find_mapping(icoll_domain, irqnr); | ||
84 | handle_IRQ(irqnr, regs); | ||
85 | continue; | ||
86 | } | ||
87 | break; | ||
88 | } while (1); | ||
89 | } | 83 | } |
90 | 84 | ||
91 | static int icoll_irq_domain_map(struct irq_domain *d, unsigned int virq, | 85 | static int icoll_irq_domain_map(struct irq_domain *d, unsigned int virq, |
diff --git a/drivers/irqchip/irq-versatile-fpga.c b/drivers/irqchip/irq-versatile-fpga.c index 065b7a31a478..47a52ab580d8 100644 --- a/drivers/irqchip/irq-versatile-fpga.c +++ b/drivers/irqchip/irq-versatile-fpga.c | |||
@@ -119,7 +119,7 @@ static int fpga_irqdomain_map(struct irq_domain *d, unsigned int irq, | |||
119 | 119 | ||
120 | /* Skip invalid IRQs, only register handlers for the real ones */ | 120 | /* Skip invalid IRQs, only register handlers for the real ones */ |
121 | if (!(f->valid & BIT(hwirq))) | 121 | if (!(f->valid & BIT(hwirq))) |
122 | return -ENOTSUPP; | 122 | return -EPERM; |
123 | irq_set_chip_data(irq, f); | 123 | irq_set_chip_data(irq, f); |
124 | irq_set_chip_and_handler(irq, &f->chip, | 124 | irq_set_chip_and_handler(irq, &f->chip, |
125 | handle_level_irq); | 125 | handle_level_irq); |
diff --git a/drivers/irqchip/irq-vic.c b/drivers/irqchip/irq-vic.c index 884d11c7355f..2bbb00404cf5 100644 --- a/drivers/irqchip/irq-vic.c +++ b/drivers/irqchip/irq-vic.c | |||
@@ -197,7 +197,7 @@ static int vic_irqdomain_map(struct irq_domain *d, unsigned int irq, | |||
197 | 197 | ||
198 | /* Skip invalid IRQs, only register handlers for the real ones */ | 198 | /* Skip invalid IRQs, only register handlers for the real ones */ |
199 | if (!(v->valid_sources & (1 << hwirq))) | 199 | if (!(v->valid_sources & (1 << hwirq))) |
200 | return -ENOTSUPP; | 200 | return -EPERM; |
201 | irq_set_chip_and_handler(irq, &vic_chip, handle_level_irq); | 201 | irq_set_chip_and_handler(irq, &vic_chip, handle_level_irq); |
202 | irq_set_chip_data(irq, v->base); | 202 | irq_set_chip_data(irq, v->base); |
203 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); | 203 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); |
diff --git a/drivers/md/bcache/Kconfig b/drivers/md/bcache/Kconfig index 05c220d05e23..f950c9d29f3e 100644 --- a/drivers/md/bcache/Kconfig +++ b/drivers/md/bcache/Kconfig | |||
@@ -1,7 +1,6 @@ | |||
1 | 1 | ||
2 | config BCACHE | 2 | config BCACHE |
3 | tristate "Block device as cache" | 3 | tristate "Block device as cache" |
4 | select CLOSURES | ||
5 | ---help--- | 4 | ---help--- |
6 | Allows a block device to be used as cache for other devices; uses | 5 | Allows a block device to be used as cache for other devices; uses |
7 | a btree for indexing and the layout is optimized for SSDs. | 6 | a btree for indexing and the layout is optimized for SSDs. |
diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index 340146d7c17f..d3e15b42a4ab 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h | |||
@@ -1241,7 +1241,7 @@ void bch_cache_set_stop(struct cache_set *); | |||
1241 | struct cache_set *bch_cache_set_alloc(struct cache_sb *); | 1241 | struct cache_set *bch_cache_set_alloc(struct cache_sb *); |
1242 | void bch_btree_cache_free(struct cache_set *); | 1242 | void bch_btree_cache_free(struct cache_set *); |
1243 | int bch_btree_cache_alloc(struct cache_set *); | 1243 | int bch_btree_cache_alloc(struct cache_set *); |
1244 | void bch_writeback_init_cached_dev(struct cached_dev *); | 1244 | void bch_cached_dev_writeback_init(struct cached_dev *); |
1245 | void bch_moving_init_cache_set(struct cache_set *); | 1245 | void bch_moving_init_cache_set(struct cache_set *); |
1246 | 1246 | ||
1247 | void bch_cache_allocator_exit(struct cache *ca); | 1247 | void bch_cache_allocator_exit(struct cache *ca); |
diff --git a/drivers/md/bcache/stats.c b/drivers/md/bcache/stats.c index 64e679449c2a..b8730e714d69 100644 --- a/drivers/md/bcache/stats.c +++ b/drivers/md/bcache/stats.c | |||
@@ -93,24 +93,6 @@ static struct attribute *bch_stats_files[] = { | |||
93 | }; | 93 | }; |
94 | static KTYPE(bch_stats); | 94 | static KTYPE(bch_stats); |
95 | 95 | ||
96 | static void scale_accounting(unsigned long data); | ||
97 | |||
98 | void bch_cache_accounting_init(struct cache_accounting *acc, | ||
99 | struct closure *parent) | ||
100 | { | ||
101 | kobject_init(&acc->total.kobj, &bch_stats_ktype); | ||
102 | kobject_init(&acc->five_minute.kobj, &bch_stats_ktype); | ||
103 | kobject_init(&acc->hour.kobj, &bch_stats_ktype); | ||
104 | kobject_init(&acc->day.kobj, &bch_stats_ktype); | ||
105 | |||
106 | closure_init(&acc->cl, parent); | ||
107 | init_timer(&acc->timer); | ||
108 | acc->timer.expires = jiffies + accounting_delay; | ||
109 | acc->timer.data = (unsigned long) acc; | ||
110 | acc->timer.function = scale_accounting; | ||
111 | add_timer(&acc->timer); | ||
112 | } | ||
113 | |||
114 | int bch_cache_accounting_add_kobjs(struct cache_accounting *acc, | 96 | int bch_cache_accounting_add_kobjs(struct cache_accounting *acc, |
115 | struct kobject *parent) | 97 | struct kobject *parent) |
116 | { | 98 | { |
@@ -244,3 +226,19 @@ void bch_mark_sectors_bypassed(struct search *s, int sectors) | |||
244 | atomic_add(sectors, &dc->accounting.collector.sectors_bypassed); | 226 | atomic_add(sectors, &dc->accounting.collector.sectors_bypassed); |
245 | atomic_add(sectors, &s->op.c->accounting.collector.sectors_bypassed); | 227 | atomic_add(sectors, &s->op.c->accounting.collector.sectors_bypassed); |
246 | } | 228 | } |
229 | |||
230 | void bch_cache_accounting_init(struct cache_accounting *acc, | ||
231 | struct closure *parent) | ||
232 | { | ||
233 | kobject_init(&acc->total.kobj, &bch_stats_ktype); | ||
234 | kobject_init(&acc->five_minute.kobj, &bch_stats_ktype); | ||
235 | kobject_init(&acc->hour.kobj, &bch_stats_ktype); | ||
236 | kobject_init(&acc->day.kobj, &bch_stats_ktype); | ||
237 | |||
238 | closure_init(&acc->cl, parent); | ||
239 | init_timer(&acc->timer); | ||
240 | acc->timer.expires = jiffies + accounting_delay; | ||
241 | acc->timer.data = (unsigned long) acc; | ||
242 | acc->timer.function = scale_accounting; | ||
243 | add_timer(&acc->timer); | ||
244 | } | ||
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c index c8046bc4aa57..f88e2b653a3f 100644 --- a/drivers/md/bcache/super.c +++ b/drivers/md/bcache/super.c | |||
@@ -634,11 +634,10 @@ static int open_dev(struct block_device *b, fmode_t mode) | |||
634 | return 0; | 634 | return 0; |
635 | } | 635 | } |
636 | 636 | ||
637 | static int release_dev(struct gendisk *b, fmode_t mode) | 637 | static void release_dev(struct gendisk *b, fmode_t mode) |
638 | { | 638 | { |
639 | struct bcache_device *d = b->private_data; | 639 | struct bcache_device *d = b->private_data; |
640 | closure_put(&d->cl); | 640 | closure_put(&d->cl); |
641 | return 0; | ||
642 | } | 641 | } |
643 | 642 | ||
644 | static int ioctl_dev(struct block_device *b, fmode_t mode, | 643 | static int ioctl_dev(struct block_device *b, fmode_t mode, |
@@ -732,8 +731,7 @@ static void bcache_device_free(struct bcache_device *d) | |||
732 | 731 | ||
733 | if (d->c) | 732 | if (d->c) |
734 | bcache_device_detach(d); | 733 | bcache_device_detach(d); |
735 | 734 | if (d->disk && d->disk->flags & GENHD_FL_UP) | |
736 | if (d->disk) | ||
737 | del_gendisk(d->disk); | 735 | del_gendisk(d->disk); |
738 | if (d->disk && d->disk->queue) | 736 | if (d->disk && d->disk->queue) |
739 | blk_cleanup_queue(d->disk->queue); | 737 | blk_cleanup_queue(d->disk->queue); |
@@ -756,12 +754,9 @@ static int bcache_device_init(struct bcache_device *d, unsigned block_size) | |||
756 | if (!(d->bio_split = bioset_create(4, offsetof(struct bbio, bio))) || | 754 | if (!(d->bio_split = bioset_create(4, offsetof(struct bbio, bio))) || |
757 | !(d->unaligned_bvec = mempool_create_kmalloc_pool(1, | 755 | !(d->unaligned_bvec = mempool_create_kmalloc_pool(1, |
758 | sizeof(struct bio_vec) * BIO_MAX_PAGES)) || | 756 | sizeof(struct bio_vec) * BIO_MAX_PAGES)) || |
759 | bio_split_pool_init(&d->bio_split_hook)) | 757 | bio_split_pool_init(&d->bio_split_hook) || |
760 | 758 | !(d->disk = alloc_disk(1)) || | |
761 | return -ENOMEM; | 759 | !(q = blk_alloc_queue(GFP_KERNEL))) |
762 | |||
763 | d->disk = alloc_disk(1); | ||
764 | if (!d->disk) | ||
765 | return -ENOMEM; | 760 | return -ENOMEM; |
766 | 761 | ||
767 | snprintf(d->disk->disk_name, DISK_NAME_LEN, "bcache%i", bcache_minor); | 762 | snprintf(d->disk->disk_name, DISK_NAME_LEN, "bcache%i", bcache_minor); |
@@ -771,10 +766,6 @@ static int bcache_device_init(struct bcache_device *d, unsigned block_size) | |||
771 | d->disk->fops = &bcache_ops; | 766 | d->disk->fops = &bcache_ops; |
772 | d->disk->private_data = d; | 767 | d->disk->private_data = d; |
773 | 768 | ||
774 | q = blk_alloc_queue(GFP_KERNEL); | ||
775 | if (!q) | ||
776 | return -ENOMEM; | ||
777 | |||
778 | blk_queue_make_request(q, NULL); | 769 | blk_queue_make_request(q, NULL); |
779 | d->disk->queue = q; | 770 | d->disk->queue = q; |
780 | q->queuedata = d; | 771 | q->queuedata = d; |
@@ -999,14 +990,17 @@ static void cached_dev_free(struct closure *cl) | |||
999 | 990 | ||
1000 | mutex_lock(&bch_register_lock); | 991 | mutex_lock(&bch_register_lock); |
1001 | 992 | ||
1002 | bd_unlink_disk_holder(dc->bdev, dc->disk.disk); | 993 | if (atomic_read(&dc->running)) |
994 | bd_unlink_disk_holder(dc->bdev, dc->disk.disk); | ||
1003 | bcache_device_free(&dc->disk); | 995 | bcache_device_free(&dc->disk); |
1004 | list_del(&dc->list); | 996 | list_del(&dc->list); |
1005 | 997 | ||
1006 | mutex_unlock(&bch_register_lock); | 998 | mutex_unlock(&bch_register_lock); |
1007 | 999 | ||
1008 | if (!IS_ERR_OR_NULL(dc->bdev)) { | 1000 | if (!IS_ERR_OR_NULL(dc->bdev)) { |
1009 | blk_sync_queue(bdev_get_queue(dc->bdev)); | 1001 | if (dc->bdev->bd_disk) |
1002 | blk_sync_queue(bdev_get_queue(dc->bdev)); | ||
1003 | |||
1010 | blkdev_put(dc->bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); | 1004 | blkdev_put(dc->bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); |
1011 | } | 1005 | } |
1012 | 1006 | ||
@@ -1028,73 +1022,67 @@ static void cached_dev_flush(struct closure *cl) | |||
1028 | 1022 | ||
1029 | static int cached_dev_init(struct cached_dev *dc, unsigned block_size) | 1023 | static int cached_dev_init(struct cached_dev *dc, unsigned block_size) |
1030 | { | 1024 | { |
1031 | int err; | 1025 | int ret; |
1032 | struct io *io; | 1026 | struct io *io; |
1033 | 1027 | struct request_queue *q = bdev_get_queue(dc->bdev); | |
1034 | closure_init(&dc->disk.cl, NULL); | ||
1035 | set_closure_fn(&dc->disk.cl, cached_dev_flush, system_wq); | ||
1036 | 1028 | ||
1037 | __module_get(THIS_MODULE); | 1029 | __module_get(THIS_MODULE); |
1038 | INIT_LIST_HEAD(&dc->list); | 1030 | INIT_LIST_HEAD(&dc->list); |
1031 | closure_init(&dc->disk.cl, NULL); | ||
1032 | set_closure_fn(&dc->disk.cl, cached_dev_flush, system_wq); | ||
1039 | kobject_init(&dc->disk.kobj, &bch_cached_dev_ktype); | 1033 | kobject_init(&dc->disk.kobj, &bch_cached_dev_ktype); |
1040 | |||
1041 | bch_cache_accounting_init(&dc->accounting, &dc->disk.cl); | ||
1042 | |||
1043 | err = bcache_device_init(&dc->disk, block_size); | ||
1044 | if (err) | ||
1045 | goto err; | ||
1046 | |||
1047 | spin_lock_init(&dc->io_lock); | ||
1048 | closure_init_unlocked(&dc->sb_write); | ||
1049 | INIT_WORK(&dc->detach, cached_dev_detach_finish); | 1034 | INIT_WORK(&dc->detach, cached_dev_detach_finish); |
1035 | closure_init_unlocked(&dc->sb_write); | ||
1036 | INIT_LIST_HEAD(&dc->io_lru); | ||
1037 | spin_lock_init(&dc->io_lock); | ||
1038 | bch_cache_accounting_init(&dc->accounting, &dc->disk.cl); | ||
1050 | 1039 | ||
1051 | dc->sequential_merge = true; | 1040 | dc->sequential_merge = true; |
1052 | dc->sequential_cutoff = 4 << 20; | 1041 | dc->sequential_cutoff = 4 << 20; |
1053 | 1042 | ||
1054 | INIT_LIST_HEAD(&dc->io_lru); | ||
1055 | dc->sb_bio.bi_max_vecs = 1; | ||
1056 | dc->sb_bio.bi_io_vec = dc->sb_bio.bi_inline_vecs; | ||
1057 | |||
1058 | for (io = dc->io; io < dc->io + RECENT_IO; io++) { | 1043 | for (io = dc->io; io < dc->io + RECENT_IO; io++) { |
1059 | list_add(&io->lru, &dc->io_lru); | 1044 | list_add(&io->lru, &dc->io_lru); |
1060 | hlist_add_head(&io->hash, dc->io_hash + RECENT_IO); | 1045 | hlist_add_head(&io->hash, dc->io_hash + RECENT_IO); |
1061 | } | 1046 | } |
1062 | 1047 | ||
1063 | bch_writeback_init_cached_dev(dc); | 1048 | ret = bcache_device_init(&dc->disk, block_size); |
1049 | if (ret) | ||
1050 | return ret; | ||
1051 | |||
1052 | set_capacity(dc->disk.disk, | ||
1053 | dc->bdev->bd_part->nr_sects - dc->sb.data_offset); | ||
1054 | |||
1055 | dc->disk.disk->queue->backing_dev_info.ra_pages = | ||
1056 | max(dc->disk.disk->queue->backing_dev_info.ra_pages, | ||
1057 | q->backing_dev_info.ra_pages); | ||
1058 | |||
1059 | bch_cached_dev_request_init(dc); | ||
1060 | bch_cached_dev_writeback_init(dc); | ||
1064 | return 0; | 1061 | return 0; |
1065 | err: | ||
1066 | bcache_device_stop(&dc->disk); | ||
1067 | return err; | ||
1068 | } | 1062 | } |
1069 | 1063 | ||
1070 | /* Cached device - bcache superblock */ | 1064 | /* Cached device - bcache superblock */ |
1071 | 1065 | ||
1072 | static const char *register_bdev(struct cache_sb *sb, struct page *sb_page, | 1066 | static void register_bdev(struct cache_sb *sb, struct page *sb_page, |
1073 | struct block_device *bdev, | 1067 | struct block_device *bdev, |
1074 | struct cached_dev *dc) | 1068 | struct cached_dev *dc) |
1075 | { | 1069 | { |
1076 | char name[BDEVNAME_SIZE]; | 1070 | char name[BDEVNAME_SIZE]; |
1077 | const char *err = "cannot allocate memory"; | 1071 | const char *err = "cannot allocate memory"; |
1078 | struct gendisk *g; | ||
1079 | struct cache_set *c; | 1072 | struct cache_set *c; |
1080 | 1073 | ||
1081 | if (!dc || cached_dev_init(dc, sb->block_size << 9) != 0) | ||
1082 | return err; | ||
1083 | |||
1084 | memcpy(&dc->sb, sb, sizeof(struct cache_sb)); | 1074 | memcpy(&dc->sb, sb, sizeof(struct cache_sb)); |
1085 | dc->sb_bio.bi_io_vec[0].bv_page = sb_page; | ||
1086 | dc->bdev = bdev; | 1075 | dc->bdev = bdev; |
1087 | dc->bdev->bd_holder = dc; | 1076 | dc->bdev->bd_holder = dc; |
1088 | 1077 | ||
1089 | g = dc->disk.disk; | 1078 | bio_init(&dc->sb_bio); |
1090 | 1079 | dc->sb_bio.bi_max_vecs = 1; | |
1091 | set_capacity(g, dc->bdev->bd_part->nr_sects - dc->sb.data_offset); | 1080 | dc->sb_bio.bi_io_vec = dc->sb_bio.bi_inline_vecs; |
1092 | 1081 | dc->sb_bio.bi_io_vec[0].bv_page = sb_page; | |
1093 | g->queue->backing_dev_info.ra_pages = | 1082 | get_page(sb_page); |
1094 | max(g->queue->backing_dev_info.ra_pages, | ||
1095 | bdev->bd_queue->backing_dev_info.ra_pages); | ||
1096 | 1083 | ||
1097 | bch_cached_dev_request_init(dc); | 1084 | if (cached_dev_init(dc, sb->block_size << 9)) |
1085 | goto err; | ||
1098 | 1086 | ||
1099 | err = "error creating kobject"; | 1087 | err = "error creating kobject"; |
1100 | if (kobject_add(&dc->disk.kobj, &part_to_dev(bdev->bd_part)->kobj, | 1088 | if (kobject_add(&dc->disk.kobj, &part_to_dev(bdev->bd_part)->kobj, |
@@ -1103,6 +1091,8 @@ static const char *register_bdev(struct cache_sb *sb, struct page *sb_page, | |||
1103 | if (bch_cache_accounting_add_kobjs(&dc->accounting, &dc->disk.kobj)) | 1091 | if (bch_cache_accounting_add_kobjs(&dc->accounting, &dc->disk.kobj)) |
1104 | goto err; | 1092 | goto err; |
1105 | 1093 | ||
1094 | pr_info("registered backing device %s", bdevname(bdev, name)); | ||
1095 | |||
1106 | list_add(&dc->list, &uncached_devices); | 1096 | list_add(&dc->list, &uncached_devices); |
1107 | list_for_each_entry(c, &bch_cache_sets, list) | 1097 | list_for_each_entry(c, &bch_cache_sets, list) |
1108 | bch_cached_dev_attach(dc, c); | 1098 | bch_cached_dev_attach(dc, c); |
@@ -1111,15 +1101,10 @@ static const char *register_bdev(struct cache_sb *sb, struct page *sb_page, | |||
1111 | BDEV_STATE(&dc->sb) == BDEV_STATE_STALE) | 1101 | BDEV_STATE(&dc->sb) == BDEV_STATE_STALE) |
1112 | bch_cached_dev_run(dc); | 1102 | bch_cached_dev_run(dc); |
1113 | 1103 | ||
1114 | return NULL; | 1104 | return; |
1115 | err: | 1105 | err: |
1116 | kobject_put(&dc->disk.kobj); | ||
1117 | pr_notice("error opening %s: %s", bdevname(bdev, name), err); | 1106 | pr_notice("error opening %s: %s", bdevname(bdev, name), err); |
1118 | /* | 1107 | bcache_device_stop(&dc->disk); |
1119 | * Return NULL instead of an error because kobject_put() cleans | ||
1120 | * everything up | ||
1121 | */ | ||
1122 | return NULL; | ||
1123 | } | 1108 | } |
1124 | 1109 | ||
1125 | /* Flash only volumes */ | 1110 | /* Flash only volumes */ |
@@ -1717,20 +1702,11 @@ static int cache_alloc(struct cache_sb *sb, struct cache *ca) | |||
1717 | size_t free; | 1702 | size_t free; |
1718 | struct bucket *b; | 1703 | struct bucket *b; |
1719 | 1704 | ||
1720 | if (!ca) | ||
1721 | return -ENOMEM; | ||
1722 | |||
1723 | __module_get(THIS_MODULE); | 1705 | __module_get(THIS_MODULE); |
1724 | kobject_init(&ca->kobj, &bch_cache_ktype); | 1706 | kobject_init(&ca->kobj, &bch_cache_ktype); |
1725 | 1707 | ||
1726 | memcpy(&ca->sb, sb, sizeof(struct cache_sb)); | ||
1727 | |||
1728 | INIT_LIST_HEAD(&ca->discards); | 1708 | INIT_LIST_HEAD(&ca->discards); |
1729 | 1709 | ||
1730 | bio_init(&ca->sb_bio); | ||
1731 | ca->sb_bio.bi_max_vecs = 1; | ||
1732 | ca->sb_bio.bi_io_vec = ca->sb_bio.bi_inline_vecs; | ||
1733 | |||
1734 | bio_init(&ca->journal.bio); | 1710 | bio_init(&ca->journal.bio); |
1735 | ca->journal.bio.bi_max_vecs = 8; | 1711 | ca->journal.bio.bi_max_vecs = 8; |
1736 | ca->journal.bio.bi_io_vec = ca->journal.bio.bi_inline_vecs; | 1712 | ca->journal.bio.bi_io_vec = ca->journal.bio.bi_inline_vecs; |
@@ -1742,18 +1718,17 @@ static int cache_alloc(struct cache_sb *sb, struct cache *ca) | |||
1742 | !init_fifo(&ca->free_inc, free << 2, GFP_KERNEL) || | 1718 | !init_fifo(&ca->free_inc, free << 2, GFP_KERNEL) || |
1743 | !init_fifo(&ca->unused, free << 2, GFP_KERNEL) || | 1719 | !init_fifo(&ca->unused, free << 2, GFP_KERNEL) || |
1744 | !init_heap(&ca->heap, free << 3, GFP_KERNEL) || | 1720 | !init_heap(&ca->heap, free << 3, GFP_KERNEL) || |
1745 | !(ca->buckets = vmalloc(sizeof(struct bucket) * | 1721 | !(ca->buckets = vzalloc(sizeof(struct bucket) * |
1746 | ca->sb.nbuckets)) || | 1722 | ca->sb.nbuckets)) || |
1747 | !(ca->prio_buckets = kzalloc(sizeof(uint64_t) * prio_buckets(ca) * | 1723 | !(ca->prio_buckets = kzalloc(sizeof(uint64_t) * prio_buckets(ca) * |
1748 | 2, GFP_KERNEL)) || | 1724 | 2, GFP_KERNEL)) || |
1749 | !(ca->disk_buckets = alloc_bucket_pages(GFP_KERNEL, ca)) || | 1725 | !(ca->disk_buckets = alloc_bucket_pages(GFP_KERNEL, ca)) || |
1750 | !(ca->alloc_workqueue = alloc_workqueue("bch_allocator", 0, 1)) || | 1726 | !(ca->alloc_workqueue = alloc_workqueue("bch_allocator", 0, 1)) || |
1751 | bio_split_pool_init(&ca->bio_split_hook)) | 1727 | bio_split_pool_init(&ca->bio_split_hook)) |
1752 | goto err; | 1728 | return -ENOMEM; |
1753 | 1729 | ||
1754 | ca->prio_last_buckets = ca->prio_buckets + prio_buckets(ca); | 1730 | ca->prio_last_buckets = ca->prio_buckets + prio_buckets(ca); |
1755 | 1731 | ||
1756 | memset(ca->buckets, 0, ca->sb.nbuckets * sizeof(struct bucket)); | ||
1757 | for_each_bucket(b, ca) | 1732 | for_each_bucket(b, ca) |
1758 | atomic_set(&b->pin, 0); | 1733 | atomic_set(&b->pin, 0); |
1759 | 1734 | ||
@@ -1766,22 +1741,28 @@ err: | |||
1766 | return -ENOMEM; | 1741 | return -ENOMEM; |
1767 | } | 1742 | } |
1768 | 1743 | ||
1769 | static const char *register_cache(struct cache_sb *sb, struct page *sb_page, | 1744 | static void register_cache(struct cache_sb *sb, struct page *sb_page, |
1770 | struct block_device *bdev, struct cache *ca) | 1745 | struct block_device *bdev, struct cache *ca) |
1771 | { | 1746 | { |
1772 | char name[BDEVNAME_SIZE]; | 1747 | char name[BDEVNAME_SIZE]; |
1773 | const char *err = "cannot allocate memory"; | 1748 | const char *err = "cannot allocate memory"; |
1774 | 1749 | ||
1775 | if (cache_alloc(sb, ca) != 0) | 1750 | memcpy(&ca->sb, sb, sizeof(struct cache_sb)); |
1776 | return err; | ||
1777 | |||
1778 | ca->sb_bio.bi_io_vec[0].bv_page = sb_page; | ||
1779 | ca->bdev = bdev; | 1751 | ca->bdev = bdev; |
1780 | ca->bdev->bd_holder = ca; | 1752 | ca->bdev->bd_holder = ca; |
1781 | 1753 | ||
1754 | bio_init(&ca->sb_bio); | ||
1755 | ca->sb_bio.bi_max_vecs = 1; | ||
1756 | ca->sb_bio.bi_io_vec = ca->sb_bio.bi_inline_vecs; | ||
1757 | ca->sb_bio.bi_io_vec[0].bv_page = sb_page; | ||
1758 | get_page(sb_page); | ||
1759 | |||
1782 | if (blk_queue_discard(bdev_get_queue(ca->bdev))) | 1760 | if (blk_queue_discard(bdev_get_queue(ca->bdev))) |
1783 | ca->discard = CACHE_DISCARD(&ca->sb); | 1761 | ca->discard = CACHE_DISCARD(&ca->sb); |
1784 | 1762 | ||
1763 | if (cache_alloc(sb, ca) != 0) | ||
1764 | goto err; | ||
1765 | |||
1785 | err = "error creating kobject"; | 1766 | err = "error creating kobject"; |
1786 | if (kobject_add(&ca->kobj, &part_to_dev(bdev->bd_part)->kobj, "bcache")) | 1767 | if (kobject_add(&ca->kobj, &part_to_dev(bdev->bd_part)->kobj, "bcache")) |
1787 | goto err; | 1768 | goto err; |
@@ -1791,15 +1772,10 @@ static const char *register_cache(struct cache_sb *sb, struct page *sb_page, | |||
1791 | goto err; | 1772 | goto err; |
1792 | 1773 | ||
1793 | pr_info("registered cache device %s", bdevname(bdev, name)); | 1774 | pr_info("registered cache device %s", bdevname(bdev, name)); |
1794 | 1775 | return; | |
1795 | return NULL; | ||
1796 | err: | 1776 | err: |
1777 | pr_notice("error opening %s: %s", bdevname(bdev, name), err); | ||
1797 | kobject_put(&ca->kobj); | 1778 | kobject_put(&ca->kobj); |
1798 | pr_info("error opening %s: %s", bdevname(bdev, name), err); | ||
1799 | /* Return NULL instead of an error because kobject_put() cleans | ||
1800 | * everything up | ||
1801 | */ | ||
1802 | return NULL; | ||
1803 | } | 1779 | } |
1804 | 1780 | ||
1805 | /* Global interfaces/init */ | 1781 | /* Global interfaces/init */ |
@@ -1833,12 +1809,15 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, | |||
1833 | bdev = blkdev_get_by_path(strim(path), | 1809 | bdev = blkdev_get_by_path(strim(path), |
1834 | FMODE_READ|FMODE_WRITE|FMODE_EXCL, | 1810 | FMODE_READ|FMODE_WRITE|FMODE_EXCL, |
1835 | sb); | 1811 | sb); |
1836 | if (bdev == ERR_PTR(-EBUSY)) | 1812 | if (IS_ERR(bdev)) { |
1837 | err = "device busy"; | 1813 | if (bdev == ERR_PTR(-EBUSY)) |
1838 | 1814 | err = "device busy"; | |
1839 | if (IS_ERR(bdev) || | ||
1840 | set_blocksize(bdev, 4096)) | ||
1841 | goto err; | 1815 | goto err; |
1816 | } | ||
1817 | |||
1818 | err = "failed to set blocksize"; | ||
1819 | if (set_blocksize(bdev, 4096)) | ||
1820 | goto err_close; | ||
1842 | 1821 | ||
1843 | err = read_super(sb, bdev, &sb_page); | 1822 | err = read_super(sb, bdev, &sb_page); |
1844 | if (err) | 1823 | if (err) |
@@ -1846,33 +1825,33 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, | |||
1846 | 1825 | ||
1847 | if (SB_IS_BDEV(sb)) { | 1826 | if (SB_IS_BDEV(sb)) { |
1848 | struct cached_dev *dc = kzalloc(sizeof(*dc), GFP_KERNEL); | 1827 | struct cached_dev *dc = kzalloc(sizeof(*dc), GFP_KERNEL); |
1828 | if (!dc) | ||
1829 | goto err_close; | ||
1849 | 1830 | ||
1850 | err = register_bdev(sb, sb_page, bdev, dc); | 1831 | register_bdev(sb, sb_page, bdev, dc); |
1851 | } else { | 1832 | } else { |
1852 | struct cache *ca = kzalloc(sizeof(*ca), GFP_KERNEL); | 1833 | struct cache *ca = kzalloc(sizeof(*ca), GFP_KERNEL); |
1834 | if (!ca) | ||
1835 | goto err_close; | ||
1853 | 1836 | ||
1854 | err = register_cache(sb, sb_page, bdev, ca); | 1837 | register_cache(sb, sb_page, bdev, ca); |
1855 | } | 1838 | } |
1856 | 1839 | out: | |
1857 | if (err) { | 1840 | if (sb_page) |
1858 | /* register_(bdev|cache) will only return an error if they | ||
1859 | * didn't get far enough to create the kobject - if they did, | ||
1860 | * the kobject destructor will do this cleanup. | ||
1861 | */ | ||
1862 | put_page(sb_page); | 1841 | put_page(sb_page); |
1863 | err_close: | ||
1864 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); | ||
1865 | err: | ||
1866 | if (attr != &ksysfs_register_quiet) | ||
1867 | pr_info("error opening %s: %s", path, err); | ||
1868 | ret = -EINVAL; | ||
1869 | } | ||
1870 | |||
1871 | kfree(sb); | 1842 | kfree(sb); |
1872 | kfree(path); | 1843 | kfree(path); |
1873 | mutex_unlock(&bch_register_lock); | 1844 | mutex_unlock(&bch_register_lock); |
1874 | module_put(THIS_MODULE); | 1845 | module_put(THIS_MODULE); |
1875 | return ret; | 1846 | return ret; |
1847 | |||
1848 | err_close: | ||
1849 | blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL); | ||
1850 | err: | ||
1851 | if (attr != &ksysfs_register_quiet) | ||
1852 | pr_info("error opening %s: %s", path, err); | ||
1853 | ret = -EINVAL; | ||
1854 | goto out; | ||
1876 | } | 1855 | } |
1877 | 1856 | ||
1878 | static int bcache_reboot(struct notifier_block *n, unsigned long code, void *x) | 1857 | static int bcache_reboot(struct notifier_block *n, unsigned long code, void *x) |
diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c index 93e7e31a4bd3..2714ed3991d1 100644 --- a/drivers/md/bcache/writeback.c +++ b/drivers/md/bcache/writeback.c | |||
@@ -375,7 +375,7 @@ err: | |||
375 | refill_dirty(cl); | 375 | refill_dirty(cl); |
376 | } | 376 | } |
377 | 377 | ||
378 | void bch_writeback_init_cached_dev(struct cached_dev *dc) | 378 | void bch_cached_dev_writeback_init(struct cached_dev *dc) |
379 | { | 379 | { |
380 | closure_init_unlocked(&dc->writeback); | 380 | closure_init_unlocked(&dc->writeback); |
381 | init_rwsem(&dc->writeback_lock); | 381 | init_rwsem(&dc->writeback_lock); |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 681d1099a2d5..9b82377a833b 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -5268,8 +5268,8 @@ static void md_clean(struct mddev *mddev) | |||
5268 | 5268 | ||
5269 | static void __md_stop_writes(struct mddev *mddev) | 5269 | static void __md_stop_writes(struct mddev *mddev) |
5270 | { | 5270 | { |
5271 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | ||
5271 | if (mddev->sync_thread) { | 5272 | if (mddev->sync_thread) { |
5272 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | ||
5273 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); | 5273 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
5274 | md_reap_sync_thread(mddev); | 5274 | md_reap_sync_thread(mddev); |
5275 | } | 5275 | } |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 55951182af73..6e17f8181c4b 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -417,7 +417,17 @@ static void raid1_end_write_request(struct bio *bio, int error) | |||
417 | 417 | ||
418 | r1_bio->bios[mirror] = NULL; | 418 | r1_bio->bios[mirror] = NULL; |
419 | to_put = bio; | 419 | to_put = bio; |
420 | set_bit(R1BIO_Uptodate, &r1_bio->state); | 420 | /* |
421 | * Do not set R1BIO_Uptodate if the current device is | ||
422 | * rebuilding or Faulty. This is because we cannot use | ||
423 | * such device for properly reading the data back (we could | ||
424 | * potentially use it, if the current write would have felt | ||
425 | * before rdev->recovery_offset, but for simplicity we don't | ||
426 | * check this here. | ||
427 | */ | ||
428 | if (test_bit(In_sync, &conf->mirrors[mirror].rdev->flags) && | ||
429 | !test_bit(Faulty, &conf->mirrors[mirror].rdev->flags)) | ||
430 | set_bit(R1BIO_Uptodate, &r1_bio->state); | ||
421 | 431 | ||
422 | /* Maybe we can clear some bad blocks. */ | 432 | /* Maybe we can clear some bad blocks. */ |
423 | if (is_badblock(conf->mirrors[mirror].rdev, | 433 | if (is_badblock(conf->mirrors[mirror].rdev, |
@@ -870,17 +880,17 @@ static void allow_barrier(struct r1conf *conf) | |||
870 | wake_up(&conf->wait_barrier); | 880 | wake_up(&conf->wait_barrier); |
871 | } | 881 | } |
872 | 882 | ||
873 | static void freeze_array(struct r1conf *conf) | 883 | static void freeze_array(struct r1conf *conf, int extra) |
874 | { | 884 | { |
875 | /* stop syncio and normal IO and wait for everything to | 885 | /* stop syncio and normal IO and wait for everything to |
876 | * go quite. | 886 | * go quite. |
877 | * We increment barrier and nr_waiting, and then | 887 | * We increment barrier and nr_waiting, and then |
878 | * wait until nr_pending match nr_queued+1 | 888 | * wait until nr_pending match nr_queued+extra |
879 | * This is called in the context of one normal IO request | 889 | * This is called in the context of one normal IO request |
880 | * that has failed. Thus any sync request that might be pending | 890 | * that has failed. Thus any sync request that might be pending |
881 | * will be blocked by nr_pending, and we need to wait for | 891 | * will be blocked by nr_pending, and we need to wait for |
882 | * pending IO requests to complete or be queued for re-try. | 892 | * pending IO requests to complete or be queued for re-try. |
883 | * Thus the number queued (nr_queued) plus this request (1) | 893 | * Thus the number queued (nr_queued) plus this request (extra) |
884 | * must match the number of pending IOs (nr_pending) before | 894 | * must match the number of pending IOs (nr_pending) before |
885 | * we continue. | 895 | * we continue. |
886 | */ | 896 | */ |
@@ -888,7 +898,7 @@ static void freeze_array(struct r1conf *conf) | |||
888 | conf->barrier++; | 898 | conf->barrier++; |
889 | conf->nr_waiting++; | 899 | conf->nr_waiting++; |
890 | wait_event_lock_irq_cmd(conf->wait_barrier, | 900 | wait_event_lock_irq_cmd(conf->wait_barrier, |
891 | conf->nr_pending == conf->nr_queued+1, | 901 | conf->nr_pending == conf->nr_queued+extra, |
892 | conf->resync_lock, | 902 | conf->resync_lock, |
893 | flush_pending_writes(conf)); | 903 | flush_pending_writes(conf)); |
894 | spin_unlock_irq(&conf->resync_lock); | 904 | spin_unlock_irq(&conf->resync_lock); |
@@ -1544,8 +1554,8 @@ static int raid1_add_disk(struct mddev *mddev, struct md_rdev *rdev) | |||
1544 | * we wait for all outstanding requests to complete. | 1554 | * we wait for all outstanding requests to complete. |
1545 | */ | 1555 | */ |
1546 | synchronize_sched(); | 1556 | synchronize_sched(); |
1547 | raise_barrier(conf); | 1557 | freeze_array(conf, 0); |
1548 | lower_barrier(conf); | 1558 | unfreeze_array(conf); |
1549 | clear_bit(Unmerged, &rdev->flags); | 1559 | clear_bit(Unmerged, &rdev->flags); |
1550 | } | 1560 | } |
1551 | md_integrity_add_rdev(rdev, mddev); | 1561 | md_integrity_add_rdev(rdev, mddev); |
@@ -1595,11 +1605,11 @@ static int raid1_remove_disk(struct mddev *mddev, struct md_rdev *rdev) | |||
1595 | */ | 1605 | */ |
1596 | struct md_rdev *repl = | 1606 | struct md_rdev *repl = |
1597 | conf->mirrors[conf->raid_disks + number].rdev; | 1607 | conf->mirrors[conf->raid_disks + number].rdev; |
1598 | raise_barrier(conf); | 1608 | freeze_array(conf, 0); |
1599 | clear_bit(Replacement, &repl->flags); | 1609 | clear_bit(Replacement, &repl->flags); |
1600 | p->rdev = repl; | 1610 | p->rdev = repl; |
1601 | conf->mirrors[conf->raid_disks + number].rdev = NULL; | 1611 | conf->mirrors[conf->raid_disks + number].rdev = NULL; |
1602 | lower_barrier(conf); | 1612 | unfreeze_array(conf); |
1603 | clear_bit(WantReplacement, &rdev->flags); | 1613 | clear_bit(WantReplacement, &rdev->flags); |
1604 | } else | 1614 | } else |
1605 | clear_bit(WantReplacement, &rdev->flags); | 1615 | clear_bit(WantReplacement, &rdev->flags); |
@@ -2195,7 +2205,7 @@ static void handle_read_error(struct r1conf *conf, struct r1bio *r1_bio) | |||
2195 | * frozen | 2205 | * frozen |
2196 | */ | 2206 | */ |
2197 | if (mddev->ro == 0) { | 2207 | if (mddev->ro == 0) { |
2198 | freeze_array(conf); | 2208 | freeze_array(conf, 1); |
2199 | fix_read_error(conf, r1_bio->read_disk, | 2209 | fix_read_error(conf, r1_bio->read_disk, |
2200 | r1_bio->sector, r1_bio->sectors); | 2210 | r1_bio->sector, r1_bio->sectors); |
2201 | unfreeze_array(conf); | 2211 | unfreeze_array(conf); |
@@ -2780,8 +2790,8 @@ static int run(struct mddev *mddev) | |||
2780 | return PTR_ERR(conf); | 2790 | return PTR_ERR(conf); |
2781 | 2791 | ||
2782 | if (mddev->queue) | 2792 | if (mddev->queue) |
2783 | blk_queue_max_write_same_sectors(mddev->queue, | 2793 | blk_queue_max_write_same_sectors(mddev->queue, 0); |
2784 | mddev->chunk_sectors); | 2794 | |
2785 | rdev_for_each(rdev, mddev) { | 2795 | rdev_for_each(rdev, mddev) { |
2786 | if (!mddev->gendisk) | 2796 | if (!mddev->gendisk) |
2787 | continue; | 2797 | continue; |
@@ -2963,7 +2973,7 @@ static int raid1_reshape(struct mddev *mddev) | |||
2963 | return -ENOMEM; | 2973 | return -ENOMEM; |
2964 | } | 2974 | } |
2965 | 2975 | ||
2966 | raise_barrier(conf); | 2976 | freeze_array(conf, 0); |
2967 | 2977 | ||
2968 | /* ok, everything is stopped */ | 2978 | /* ok, everything is stopped */ |
2969 | oldpool = conf->r1bio_pool; | 2979 | oldpool = conf->r1bio_pool; |
@@ -2994,7 +3004,7 @@ static int raid1_reshape(struct mddev *mddev) | |||
2994 | conf->raid_disks = mddev->raid_disks = raid_disks; | 3004 | conf->raid_disks = mddev->raid_disks = raid_disks; |
2995 | mddev->delta_disks = 0; | 3005 | mddev->delta_disks = 0; |
2996 | 3006 | ||
2997 | lower_barrier(conf); | 3007 | unfreeze_array(conf); |
2998 | 3008 | ||
2999 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 3009 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
3000 | md_wakeup_thread(mddev->thread); | 3010 | md_wakeup_thread(mddev->thread); |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 59d4daa5f4c7..6ddae2501b9a 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -490,7 +490,17 @@ static void raid10_end_write_request(struct bio *bio, int error) | |||
490 | sector_t first_bad; | 490 | sector_t first_bad; |
491 | int bad_sectors; | 491 | int bad_sectors; |
492 | 492 | ||
493 | set_bit(R10BIO_Uptodate, &r10_bio->state); | 493 | /* |
494 | * Do not set R10BIO_Uptodate if the current device is | ||
495 | * rebuilding or Faulty. This is because we cannot use | ||
496 | * such device for properly reading the data back (we could | ||
497 | * potentially use it, if the current write would have felt | ||
498 | * before rdev->recovery_offset, but for simplicity we don't | ||
499 | * check this here. | ||
500 | */ | ||
501 | if (test_bit(In_sync, &rdev->flags) && | ||
502 | !test_bit(Faulty, &rdev->flags)) | ||
503 | set_bit(R10BIO_Uptodate, &r10_bio->state); | ||
494 | 504 | ||
495 | /* Maybe we can clear some bad blocks. */ | 505 | /* Maybe we can clear some bad blocks. */ |
496 | if (is_badblock(rdev, | 506 | if (is_badblock(rdev, |
@@ -1055,17 +1065,17 @@ static void allow_barrier(struct r10conf *conf) | |||
1055 | wake_up(&conf->wait_barrier); | 1065 | wake_up(&conf->wait_barrier); |
1056 | } | 1066 | } |
1057 | 1067 | ||
1058 | static void freeze_array(struct r10conf *conf) | 1068 | static void freeze_array(struct r10conf *conf, int extra) |
1059 | { | 1069 | { |
1060 | /* stop syncio and normal IO and wait for everything to | 1070 | /* stop syncio and normal IO and wait for everything to |
1061 | * go quiet. | 1071 | * go quiet. |
1062 | * We increment barrier and nr_waiting, and then | 1072 | * We increment barrier and nr_waiting, and then |
1063 | * wait until nr_pending match nr_queued+1 | 1073 | * wait until nr_pending match nr_queued+extra |
1064 | * This is called in the context of one normal IO request | 1074 | * This is called in the context of one normal IO request |
1065 | * that has failed. Thus any sync request that might be pending | 1075 | * that has failed. Thus any sync request that might be pending |
1066 | * will be blocked by nr_pending, and we need to wait for | 1076 | * will be blocked by nr_pending, and we need to wait for |
1067 | * pending IO requests to complete or be queued for re-try. | 1077 | * pending IO requests to complete or be queued for re-try. |
1068 | * Thus the number queued (nr_queued) plus this request (1) | 1078 | * Thus the number queued (nr_queued) plus this request (extra) |
1069 | * must match the number of pending IOs (nr_pending) before | 1079 | * must match the number of pending IOs (nr_pending) before |
1070 | * we continue. | 1080 | * we continue. |
1071 | */ | 1081 | */ |
@@ -1073,7 +1083,7 @@ static void freeze_array(struct r10conf *conf) | |||
1073 | conf->barrier++; | 1083 | conf->barrier++; |
1074 | conf->nr_waiting++; | 1084 | conf->nr_waiting++; |
1075 | wait_event_lock_irq_cmd(conf->wait_barrier, | 1085 | wait_event_lock_irq_cmd(conf->wait_barrier, |
1076 | conf->nr_pending == conf->nr_queued+1, | 1086 | conf->nr_pending == conf->nr_queued+extra, |
1077 | conf->resync_lock, | 1087 | conf->resync_lock, |
1078 | flush_pending_writes(conf)); | 1088 | flush_pending_writes(conf)); |
1079 | 1089 | ||
@@ -1837,8 +1847,8 @@ static int raid10_add_disk(struct mddev *mddev, struct md_rdev *rdev) | |||
1837 | * we wait for all outstanding requests to complete. | 1847 | * we wait for all outstanding requests to complete. |
1838 | */ | 1848 | */ |
1839 | synchronize_sched(); | 1849 | synchronize_sched(); |
1840 | raise_barrier(conf, 0); | 1850 | freeze_array(conf, 0); |
1841 | lower_barrier(conf); | 1851 | unfreeze_array(conf); |
1842 | clear_bit(Unmerged, &rdev->flags); | 1852 | clear_bit(Unmerged, &rdev->flags); |
1843 | } | 1853 | } |
1844 | md_integrity_add_rdev(rdev, mddev); | 1854 | md_integrity_add_rdev(rdev, mddev); |
@@ -2612,7 +2622,7 @@ static void handle_read_error(struct mddev *mddev, struct r10bio *r10_bio) | |||
2612 | r10_bio->devs[slot].bio = NULL; | 2622 | r10_bio->devs[slot].bio = NULL; |
2613 | 2623 | ||
2614 | if (mddev->ro == 0) { | 2624 | if (mddev->ro == 0) { |
2615 | freeze_array(conf); | 2625 | freeze_array(conf, 1); |
2616 | fix_read_error(conf, mddev, r10_bio); | 2626 | fix_read_error(conf, mddev, r10_bio); |
2617 | unfreeze_array(conf); | 2627 | unfreeze_array(conf); |
2618 | } else | 2628 | } else |
@@ -3609,8 +3619,7 @@ static int run(struct mddev *mddev) | |||
3609 | if (mddev->queue) { | 3619 | if (mddev->queue) { |
3610 | blk_queue_max_discard_sectors(mddev->queue, | 3620 | blk_queue_max_discard_sectors(mddev->queue, |
3611 | mddev->chunk_sectors); | 3621 | mddev->chunk_sectors); |
3612 | blk_queue_max_write_same_sectors(mddev->queue, | 3622 | blk_queue_max_write_same_sectors(mddev->queue, 0); |
3613 | mddev->chunk_sectors); | ||
3614 | blk_queue_io_min(mddev->queue, chunk_size); | 3623 | blk_queue_io_min(mddev->queue, chunk_size); |
3615 | if (conf->geo.raid_disks % conf->geo.near_copies) | 3624 | if (conf->geo.raid_disks % conf->geo.near_copies) |
3616 | blk_queue_io_opt(mddev->queue, chunk_size * conf->geo.raid_disks); | 3625 | blk_queue_io_opt(mddev->queue, chunk_size * conf->geo.raid_disks); |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 9359828ffe26..05e4a105b9c7 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -664,6 +664,7 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) | |||
664 | if (test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) | 664 | if (test_bit(R5_ReadNoMerge, &sh->dev[i].flags)) |
665 | bi->bi_rw |= REQ_FLUSH; | 665 | bi->bi_rw |= REQ_FLUSH; |
666 | 666 | ||
667 | bi->bi_vcnt = 1; | ||
667 | bi->bi_io_vec[0].bv_len = STRIPE_SIZE; | 668 | bi->bi_io_vec[0].bv_len = STRIPE_SIZE; |
668 | bi->bi_io_vec[0].bv_offset = 0; | 669 | bi->bi_io_vec[0].bv_offset = 0; |
669 | bi->bi_size = STRIPE_SIZE; | 670 | bi->bi_size = STRIPE_SIZE; |
@@ -701,6 +702,7 @@ static void ops_run_io(struct stripe_head *sh, struct stripe_head_state *s) | |||
701 | else | 702 | else |
702 | rbi->bi_sector = (sh->sector | 703 | rbi->bi_sector = (sh->sector |
703 | + rrdev->data_offset); | 704 | + rrdev->data_offset); |
705 | rbi->bi_vcnt = 1; | ||
704 | rbi->bi_io_vec[0].bv_len = STRIPE_SIZE; | 706 | rbi->bi_io_vec[0].bv_len = STRIPE_SIZE; |
705 | rbi->bi_io_vec[0].bv_offset = 0; | 707 | rbi->bi_io_vec[0].bv_offset = 0; |
706 | rbi->bi_size = STRIPE_SIZE; | 708 | rbi->bi_size = STRIPE_SIZE; |
@@ -5464,7 +5466,7 @@ static int run(struct mddev *mddev) | |||
5464 | if (mddev->major_version == 0 && | 5466 | if (mddev->major_version == 0 && |
5465 | mddev->minor_version > 90) | 5467 | mddev->minor_version > 90) |
5466 | rdev->recovery_offset = reshape_offset; | 5468 | rdev->recovery_offset = reshape_offset; |
5467 | 5469 | ||
5468 | if (rdev->recovery_offset < reshape_offset) { | 5470 | if (rdev->recovery_offset < reshape_offset) { |
5469 | /* We need to check old and new layout */ | 5471 | /* We need to check old and new layout */ |
5470 | if (!only_parity(rdev->raid_disk, | 5472 | if (!only_parity(rdev->raid_disk, |
@@ -5587,6 +5589,8 @@ static int run(struct mddev *mddev) | |||
5587 | */ | 5589 | */ |
5588 | mddev->queue->limits.discard_zeroes_data = 0; | 5590 | mddev->queue->limits.discard_zeroes_data = 0; |
5589 | 5591 | ||
5592 | blk_queue_max_write_same_sectors(mddev->queue, 0); | ||
5593 | |||
5590 | rdev_for_each(rdev, mddev) { | 5594 | rdev_for_each(rdev, mddev) { |
5591 | disk_stack_limits(mddev->gendisk, rdev->bdev, | 5595 | disk_stack_limits(mddev->gendisk, rdev->bdev, |
5592 | rdev->data_offset << 9); | 5596 | rdev->data_offset << 9); |
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c index 713d89fedc46..f580d30bb784 100644 --- a/drivers/misc/mei/init.c +++ b/drivers/misc/mei/init.c | |||
@@ -197,6 +197,8 @@ void mei_stop(struct mei_device *dev) | |||
197 | { | 197 | { |
198 | dev_dbg(&dev->pdev->dev, "stopping the device.\n"); | 198 | dev_dbg(&dev->pdev->dev, "stopping the device.\n"); |
199 | 199 | ||
200 | flush_scheduled_work(); | ||
201 | |||
200 | mutex_lock(&dev->device_lock); | 202 | mutex_lock(&dev->device_lock); |
201 | 203 | ||
202 | cancel_delayed_work(&dev->timer_work); | 204 | cancel_delayed_work(&dev->timer_work); |
@@ -210,8 +212,6 @@ void mei_stop(struct mei_device *dev) | |||
210 | 212 | ||
211 | mutex_unlock(&dev->device_lock); | 213 | mutex_unlock(&dev->device_lock); |
212 | 214 | ||
213 | flush_scheduled_work(); | ||
214 | |||
215 | mei_watchdog_unregister(dev); | 215 | mei_watchdog_unregister(dev); |
216 | } | 216 | } |
217 | EXPORT_SYMBOL_GPL(mei_stop); | 217 | EXPORT_SYMBOL_GPL(mei_stop); |
diff --git a/drivers/misc/mei/nfc.c b/drivers/misc/mei/nfc.c index 3adf8a70f26e..d0c6907dfd92 100644 --- a/drivers/misc/mei/nfc.c +++ b/drivers/misc/mei/nfc.c | |||
@@ -142,6 +142,8 @@ static void mei_nfc_free(struct mei_nfc_dev *ndev) | |||
142 | mei_cl_unlink(ndev->cl_info); | 142 | mei_cl_unlink(ndev->cl_info); |
143 | kfree(ndev->cl_info); | 143 | kfree(ndev->cl_info); |
144 | } | 144 | } |
145 | |||
146 | memset(ndev, 0, sizeof(struct mei_nfc_dev)); | ||
145 | } | 147 | } |
146 | 148 | ||
147 | static int mei_nfc_build_bus_name(struct mei_nfc_dev *ndev) | 149 | static int mei_nfc_build_bus_name(struct mei_nfc_dev *ndev) |
diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c index a727464e9c3f..0f268329bd3a 100644 --- a/drivers/misc/mei/pci-me.c +++ b/drivers/misc/mei/pci-me.c | |||
@@ -325,6 +325,7 @@ static int mei_me_pci_resume(struct device *device) | |||
325 | 325 | ||
326 | mutex_lock(&dev->device_lock); | 326 | mutex_lock(&dev->device_lock); |
327 | dev->dev_state = MEI_DEV_POWER_UP; | 327 | dev->dev_state = MEI_DEV_POWER_UP; |
328 | mei_clear_interrupts(dev); | ||
328 | mei_reset(dev, 1); | 329 | mei_reset(dev, 1); |
329 | mutex_unlock(&dev->device_lock); | 330 | mutex_unlock(&dev->device_lock); |
330 | 331 | ||
diff --git a/drivers/misc/sgi-gru/grufile.c b/drivers/misc/sgi-gru/grufile.c index 44d273c5e19d..0535d1e0bc78 100644 --- a/drivers/misc/sgi-gru/grufile.c +++ b/drivers/misc/sgi-gru/grufile.c | |||
@@ -172,6 +172,7 @@ static long gru_get_config_info(unsigned long arg) | |||
172 | nodesperblade = 2; | 172 | nodesperblade = 2; |
173 | else | 173 | else |
174 | nodesperblade = 1; | 174 | nodesperblade = 1; |
175 | memset(&info, 0, sizeof(info)); | ||
175 | info.cpus = num_online_cpus(); | 176 | info.cpus = num_online_cpus(); |
176 | info.nodes = num_online_nodes(); | 177 | info.nodes = num_online_nodes(); |
177 | info.blades = info.nodes / nodesperblade; | 178 | info.blades = info.nodes / nodesperblade; |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index bc1246f6f86a..3b31c19972d4 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -725,8 +725,8 @@ static void bond_resend_igmp_join_requests(struct bonding *bond) | |||
725 | struct net_device *bond_dev, *vlan_dev, *upper_dev; | 725 | struct net_device *bond_dev, *vlan_dev, *upper_dev; |
726 | struct vlan_entry *vlan; | 726 | struct vlan_entry *vlan; |
727 | 727 | ||
728 | rcu_read_lock(); | ||
729 | read_lock(&bond->lock); | 728 | read_lock(&bond->lock); |
729 | rcu_read_lock(); | ||
730 | 730 | ||
731 | bond_dev = bond->dev; | 731 | bond_dev = bond->dev; |
732 | 732 | ||
@@ -748,12 +748,19 @@ static void bond_resend_igmp_join_requests(struct bonding *bond) | |||
748 | if (vlan_dev) | 748 | if (vlan_dev) |
749 | __bond_resend_igmp_join_requests(vlan_dev); | 749 | __bond_resend_igmp_join_requests(vlan_dev); |
750 | } | 750 | } |
751 | rcu_read_unlock(); | ||
751 | 752 | ||
752 | if (--bond->igmp_retrans > 0) | 753 | /* We use curr_slave_lock to protect against concurrent access to |
754 | * igmp_retrans from multiple running instances of this function and | ||
755 | * bond_change_active_slave | ||
756 | */ | ||
757 | write_lock_bh(&bond->curr_slave_lock); | ||
758 | if (bond->igmp_retrans > 1) { | ||
759 | bond->igmp_retrans--; | ||
753 | queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5); | 760 | queue_delayed_work(bond->wq, &bond->mcast_work, HZ/5); |
754 | 761 | } | |
762 | write_unlock_bh(&bond->curr_slave_lock); | ||
755 | read_unlock(&bond->lock); | 763 | read_unlock(&bond->lock); |
756 | rcu_read_unlock(); | ||
757 | } | 764 | } |
758 | 765 | ||
759 | static void bond_resend_igmp_join_requests_delayed(struct work_struct *work) | 766 | static void bond_resend_igmp_join_requests_delayed(struct work_struct *work) |
@@ -1901,6 +1908,10 @@ err_free: | |||
1901 | 1908 | ||
1902 | err_undo_flags: | 1909 | err_undo_flags: |
1903 | bond_compute_features(bond); | 1910 | bond_compute_features(bond); |
1911 | /* Enslave of first slave has failed and we need to fix master's mac */ | ||
1912 | if (bond->slave_cnt == 0 && | ||
1913 | ether_addr_equal(bond_dev->dev_addr, slave_dev->dev_addr)) | ||
1914 | eth_hw_addr_random(bond_dev); | ||
1904 | 1915 | ||
1905 | return res; | 1916 | return res; |
1906 | } | 1917 | } |
diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h index b38609b967b7..c990b42cf7a1 100644 --- a/drivers/net/bonding/bonding.h +++ b/drivers/net/bonding/bonding.h | |||
@@ -225,7 +225,7 @@ struct bonding { | |||
225 | rwlock_t curr_slave_lock; | 225 | rwlock_t curr_slave_lock; |
226 | u8 send_peer_notif; | 226 | u8 send_peer_notif; |
227 | s8 setup_by_slave; | 227 | s8 setup_by_slave; |
228 | s8 igmp_retrans; | 228 | u8 igmp_retrans; |
229 | #ifdef CONFIG_PROC_FS | 229 | #ifdef CONFIG_PROC_FS |
230 | struct proc_dir_entry *proc_entry; | 230 | struct proc_dir_entry *proc_entry; |
231 | char proc_file_name[IFNAMSIZ]; | 231 | char proc_file_name[IFNAMSIZ]; |
diff --git a/drivers/net/can/usb/usb_8dev.c b/drivers/net/can/usb/usb_8dev.c index 6e15ef08f301..cbd388eea682 100644 --- a/drivers/net/can/usb/usb_8dev.c +++ b/drivers/net/can/usb/usb_8dev.c | |||
@@ -977,7 +977,7 @@ static int usb_8dev_probe(struct usb_interface *intf, | |||
977 | err = usb_8dev_cmd_version(priv, &version); | 977 | err = usb_8dev_cmd_version(priv, &version); |
978 | if (err) { | 978 | if (err) { |
979 | netdev_err(netdev, "can't get firmware version\n"); | 979 | netdev_err(netdev, "can't get firmware version\n"); |
980 | goto cleanup_cmd_msg_buffer; | 980 | goto cleanup_unregister_candev; |
981 | } else { | 981 | } else { |
982 | netdev_info(netdev, | 982 | netdev_info(netdev, |
983 | "firmware: %d.%d, hardware: %d.%d\n", | 983 | "firmware: %d.%d, hardware: %d.%d\n", |
@@ -989,6 +989,9 @@ static int usb_8dev_probe(struct usb_interface *intf, | |||
989 | 989 | ||
990 | return 0; | 990 | return 0; |
991 | 991 | ||
992 | cleanup_unregister_candev: | ||
993 | unregister_netdev(priv->netdev); | ||
994 | |||
992 | cleanup_cmd_msg_buffer: | 995 | cleanup_cmd_msg_buffer: |
993 | kfree(priv->cmd_msg_buffer); | 996 | kfree(priv->cmd_msg_buffer); |
994 | 997 | ||
diff --git a/drivers/net/ethernet/atheros/Kconfig b/drivers/net/ethernet/atheros/Kconfig index 36d6abd1cfff..ad6aa1e98348 100644 --- a/drivers/net/ethernet/atheros/Kconfig +++ b/drivers/net/ethernet/atheros/Kconfig | |||
@@ -67,4 +67,22 @@ config ATL1C | |||
67 | To compile this driver as a module, choose M here. The module | 67 | To compile this driver as a module, choose M here. The module |
68 | will be called atl1c. | 68 | will be called atl1c. |
69 | 69 | ||
70 | config ALX | ||
71 | tristate "Qualcomm Atheros AR816x/AR817x support" | ||
72 | depends on PCI | ||
73 | select CRC32 | ||
74 | select NET_CORE | ||
75 | select MDIO | ||
76 | help | ||
77 | This driver supports the Qualcomm Atheros L1F ethernet adapter, | ||
78 | i.e. the following chipsets: | ||
79 | |||
80 | 1969:1091 - AR8161 Gigabit Ethernet | ||
81 | 1969:1090 - AR8162 Fast Ethernet | ||
82 | 1969:10A1 - AR8171 Gigabit Ethernet | ||
83 | 1969:10A0 - AR8172 Fast Ethernet | ||
84 | |||
85 | To compile this driver as a module, choose M here. The module | ||
86 | will be called alx. | ||
87 | |||
70 | endif # NET_VENDOR_ATHEROS | 88 | endif # NET_VENDOR_ATHEROS |
diff --git a/drivers/net/ethernet/atheros/Makefile b/drivers/net/ethernet/atheros/Makefile index e7e76fb576ff..5cf1c65bbce9 100644 --- a/drivers/net/ethernet/atheros/Makefile +++ b/drivers/net/ethernet/atheros/Makefile | |||
@@ -6,3 +6,4 @@ obj-$(CONFIG_ATL1) += atlx/ | |||
6 | obj-$(CONFIG_ATL2) += atlx/ | 6 | obj-$(CONFIG_ATL2) += atlx/ |
7 | obj-$(CONFIG_ATL1E) += atl1e/ | 7 | obj-$(CONFIG_ATL1E) += atl1e/ |
8 | obj-$(CONFIG_ATL1C) += atl1c/ | 8 | obj-$(CONFIG_ATL1C) += atl1c/ |
9 | obj-$(CONFIG_ALX) += alx/ | ||
diff --git a/drivers/net/ethernet/atheros/alx/Makefile b/drivers/net/ethernet/atheros/alx/Makefile new file mode 100644 index 000000000000..5901fa407d52 --- /dev/null +++ b/drivers/net/ethernet/atheros/alx/Makefile | |||
@@ -0,0 +1,3 @@ | |||
1 | obj-$(CONFIG_ALX) += alx.o | ||
2 | alx-objs := main.o ethtool.o hw.o | ||
3 | ccflags-y += -D__CHECK_ENDIAN__ | ||
diff --git a/drivers/net/ethernet/atheros/alx/alx.h b/drivers/net/ethernet/atheros/alx/alx.h new file mode 100644 index 000000000000..50b3ae2b143d --- /dev/null +++ b/drivers/net/ethernet/atheros/alx/alx.h | |||
@@ -0,0 +1,114 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013 Johannes Berg <johannes@sipsolutions.net> | ||
3 | * | ||
4 | * This file is free software: you may copy, redistribute and/or modify it | ||
5 | * under the terms of the GNU General Public License as published by the | ||
6 | * Free Software Foundation, either version 2 of the License, or (at your | ||
7 | * option) any later version. | ||
8 | * | ||
9 | * This file is distributed in the hope that it will be useful, but | ||
10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | * General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | * | ||
17 | * This file incorporates work covered by the following copyright and | ||
18 | * permission notice: | ||
19 | * | ||
20 | * Copyright (c) 2012 Qualcomm Atheros, Inc. | ||
21 | * | ||
22 | * Permission to use, copy, modify, and/or distribute this software for any | ||
23 | * purpose with or without fee is hereby granted, provided that the above | ||
24 | * copyright notice and this permission notice appear in all copies. | ||
25 | * | ||
26 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
27 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
28 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
29 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
30 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
31 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
32 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
33 | */ | ||
34 | |||
35 | #ifndef _ALX_H_ | ||
36 | #define _ALX_H_ | ||
37 | |||
38 | #include <linux/types.h> | ||
39 | #include <linux/etherdevice.h> | ||
40 | #include <linux/dma-mapping.h> | ||
41 | #include <linux/spinlock.h> | ||
42 | #include "hw.h" | ||
43 | |||
44 | #define ALX_WATCHDOG_TIME (5 * HZ) | ||
45 | |||
46 | struct alx_buffer { | ||
47 | struct sk_buff *skb; | ||
48 | DEFINE_DMA_UNMAP_ADDR(dma); | ||
49 | DEFINE_DMA_UNMAP_LEN(size); | ||
50 | }; | ||
51 | |||
52 | struct alx_rx_queue { | ||
53 | struct alx_rrd *rrd; | ||
54 | dma_addr_t rrd_dma; | ||
55 | |||
56 | struct alx_rfd *rfd; | ||
57 | dma_addr_t rfd_dma; | ||
58 | |||
59 | struct alx_buffer *bufs; | ||
60 | |||
61 | u16 write_idx, read_idx; | ||
62 | u16 rrd_read_idx; | ||
63 | }; | ||
64 | #define ALX_RX_ALLOC_THRESH 32 | ||
65 | |||
66 | struct alx_tx_queue { | ||
67 | struct alx_txd *tpd; | ||
68 | dma_addr_t tpd_dma; | ||
69 | struct alx_buffer *bufs; | ||
70 | u16 write_idx, read_idx; | ||
71 | }; | ||
72 | |||
73 | #define ALX_DEFAULT_TX_WORK 128 | ||
74 | |||
75 | enum alx_device_quirks { | ||
76 | ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG = BIT(0), | ||
77 | }; | ||
78 | |||
79 | struct alx_priv { | ||
80 | struct net_device *dev; | ||
81 | |||
82 | struct alx_hw hw; | ||
83 | |||
84 | /* all descriptor memory */ | ||
85 | struct { | ||
86 | dma_addr_t dma; | ||
87 | void *virt; | ||
88 | int size; | ||
89 | } descmem; | ||
90 | |||
91 | /* protect int_mask updates */ | ||
92 | spinlock_t irq_lock; | ||
93 | u32 int_mask; | ||
94 | |||
95 | int tx_ringsz; | ||
96 | int rx_ringsz; | ||
97 | int rxbuf_size; | ||
98 | |||
99 | struct napi_struct napi; | ||
100 | struct alx_tx_queue txq; | ||
101 | struct alx_rx_queue rxq; | ||
102 | |||
103 | struct work_struct link_check_wk; | ||
104 | struct work_struct reset_wk; | ||
105 | |||
106 | u16 msg_enable; | ||
107 | |||
108 | bool msi; | ||
109 | }; | ||
110 | |||
111 | extern const struct ethtool_ops alx_ethtool_ops; | ||
112 | extern const char alx_drv_name[]; | ||
113 | |||
114 | #endif | ||
diff --git a/drivers/net/ethernet/atheros/alx/ethtool.c b/drivers/net/ethernet/atheros/alx/ethtool.c new file mode 100644 index 000000000000..6fa2aec2bc81 --- /dev/null +++ b/drivers/net/ethernet/atheros/alx/ethtool.c | |||
@@ -0,0 +1,272 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013 Johannes Berg <johannes@sipsolutions.net> | ||
3 | * | ||
4 | * This file is free software: you may copy, redistribute and/or modify it | ||
5 | * under the terms of the GNU General Public License as published by the | ||
6 | * Free Software Foundation, either version 2 of the License, or (at your | ||
7 | * option) any later version. | ||
8 | * | ||
9 | * This file is distributed in the hope that it will be useful, but | ||
10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | * General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | * | ||
17 | * This file incorporates work covered by the following copyright and | ||
18 | * permission notice: | ||
19 | * | ||
20 | * Copyright (c) 2012 Qualcomm Atheros, Inc. | ||
21 | * | ||
22 | * Permission to use, copy, modify, and/or distribute this software for any | ||
23 | * purpose with or without fee is hereby granted, provided that the above | ||
24 | * copyright notice and this permission notice appear in all copies. | ||
25 | * | ||
26 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
27 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
28 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
29 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
30 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
31 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
32 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
33 | */ | ||
34 | |||
35 | #include <linux/pci.h> | ||
36 | #include <linux/ip.h> | ||
37 | #include <linux/tcp.h> | ||
38 | #include <linux/netdevice.h> | ||
39 | #include <linux/etherdevice.h> | ||
40 | #include <linux/ethtool.h> | ||
41 | #include <linux/mdio.h> | ||
42 | #include <linux/interrupt.h> | ||
43 | #include <asm/byteorder.h> | ||
44 | |||
45 | #include "alx.h" | ||
46 | #include "reg.h" | ||
47 | #include "hw.h" | ||
48 | |||
49 | |||
50 | static int alx_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | ||
51 | { | ||
52 | struct alx_priv *alx = netdev_priv(netdev); | ||
53 | struct alx_hw *hw = &alx->hw; | ||
54 | |||
55 | ecmd->supported = SUPPORTED_10baseT_Half | | ||
56 | SUPPORTED_10baseT_Full | | ||
57 | SUPPORTED_100baseT_Half | | ||
58 | SUPPORTED_100baseT_Full | | ||
59 | SUPPORTED_Autoneg | | ||
60 | SUPPORTED_TP | | ||
61 | SUPPORTED_Pause; | ||
62 | if (alx_hw_giga(hw)) | ||
63 | ecmd->supported |= SUPPORTED_1000baseT_Full; | ||
64 | |||
65 | ecmd->advertising = ADVERTISED_TP; | ||
66 | if (hw->adv_cfg & ADVERTISED_Autoneg) | ||
67 | ecmd->advertising |= hw->adv_cfg; | ||
68 | |||
69 | ecmd->port = PORT_TP; | ||
70 | ecmd->phy_address = 0; | ||
71 | if (hw->adv_cfg & ADVERTISED_Autoneg) | ||
72 | ecmd->autoneg = AUTONEG_ENABLE; | ||
73 | else | ||
74 | ecmd->autoneg = AUTONEG_DISABLE; | ||
75 | ecmd->transceiver = XCVR_INTERNAL; | ||
76 | |||
77 | if (hw->flowctrl & ALX_FC_ANEG && hw->adv_cfg & ADVERTISED_Autoneg) { | ||
78 | if (hw->flowctrl & ALX_FC_RX) { | ||
79 | ecmd->advertising |= ADVERTISED_Pause; | ||
80 | |||
81 | if (!(hw->flowctrl & ALX_FC_TX)) | ||
82 | ecmd->advertising |= ADVERTISED_Asym_Pause; | ||
83 | } else if (hw->flowctrl & ALX_FC_TX) { | ||
84 | ecmd->advertising |= ADVERTISED_Asym_Pause; | ||
85 | } | ||
86 | } | ||
87 | |||
88 | if (hw->link_speed != SPEED_UNKNOWN) { | ||
89 | ethtool_cmd_speed_set(ecmd, | ||
90 | hw->link_speed - hw->link_speed % 10); | ||
91 | ecmd->duplex = hw->link_speed % 10; | ||
92 | } else { | ||
93 | ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN); | ||
94 | ecmd->duplex = DUPLEX_UNKNOWN; | ||
95 | } | ||
96 | |||
97 | return 0; | ||
98 | } | ||
99 | |||
100 | static int alx_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | ||
101 | { | ||
102 | struct alx_priv *alx = netdev_priv(netdev); | ||
103 | struct alx_hw *hw = &alx->hw; | ||
104 | u32 adv_cfg; | ||
105 | |||
106 | ASSERT_RTNL(); | ||
107 | |||
108 | if (ecmd->autoneg == AUTONEG_ENABLE) { | ||
109 | if (ecmd->advertising & ADVERTISED_1000baseT_Half) | ||
110 | return -EINVAL; | ||
111 | adv_cfg = ecmd->advertising | ADVERTISED_Autoneg; | ||
112 | } else { | ||
113 | int speed = ethtool_cmd_speed(ecmd); | ||
114 | |||
115 | switch (speed + ecmd->duplex) { | ||
116 | case SPEED_10 + DUPLEX_HALF: | ||
117 | adv_cfg = ADVERTISED_10baseT_Half; | ||
118 | break; | ||
119 | case SPEED_10 + DUPLEX_FULL: | ||
120 | adv_cfg = ADVERTISED_10baseT_Full; | ||
121 | break; | ||
122 | case SPEED_100 + DUPLEX_HALF: | ||
123 | adv_cfg = ADVERTISED_100baseT_Half; | ||
124 | break; | ||
125 | case SPEED_100 + DUPLEX_FULL: | ||
126 | adv_cfg = ADVERTISED_100baseT_Full; | ||
127 | break; | ||
128 | default: | ||
129 | return -EINVAL; | ||
130 | } | ||
131 | } | ||
132 | |||
133 | hw->adv_cfg = adv_cfg; | ||
134 | return alx_setup_speed_duplex(hw, adv_cfg, hw->flowctrl); | ||
135 | } | ||
136 | |||
137 | static void alx_get_pauseparam(struct net_device *netdev, | ||
138 | struct ethtool_pauseparam *pause) | ||
139 | { | ||
140 | struct alx_priv *alx = netdev_priv(netdev); | ||
141 | struct alx_hw *hw = &alx->hw; | ||
142 | |||
143 | if (hw->flowctrl & ALX_FC_ANEG && | ||
144 | hw->adv_cfg & ADVERTISED_Autoneg) | ||
145 | pause->autoneg = AUTONEG_ENABLE; | ||
146 | else | ||
147 | pause->autoneg = AUTONEG_DISABLE; | ||
148 | |||
149 | if (hw->flowctrl & ALX_FC_TX) | ||
150 | pause->tx_pause = 1; | ||
151 | else | ||
152 | pause->tx_pause = 0; | ||
153 | |||
154 | if (hw->flowctrl & ALX_FC_RX) | ||
155 | pause->rx_pause = 1; | ||
156 | else | ||
157 | pause->rx_pause = 0; | ||
158 | } | ||
159 | |||
160 | |||
161 | static int alx_set_pauseparam(struct net_device *netdev, | ||
162 | struct ethtool_pauseparam *pause) | ||
163 | { | ||
164 | struct alx_priv *alx = netdev_priv(netdev); | ||
165 | struct alx_hw *hw = &alx->hw; | ||
166 | int err = 0; | ||
167 | bool reconfig_phy = false; | ||
168 | u8 fc = 0; | ||
169 | |||
170 | if (pause->tx_pause) | ||
171 | fc |= ALX_FC_TX; | ||
172 | if (pause->rx_pause) | ||
173 | fc |= ALX_FC_RX; | ||
174 | if (pause->autoneg) | ||
175 | fc |= ALX_FC_ANEG; | ||
176 | |||
177 | ASSERT_RTNL(); | ||
178 | |||
179 | /* restart auto-neg for auto-mode */ | ||
180 | if (hw->adv_cfg & ADVERTISED_Autoneg) { | ||
181 | if (!((fc ^ hw->flowctrl) & ALX_FC_ANEG)) | ||
182 | reconfig_phy = true; | ||
183 | if (fc & hw->flowctrl & ALX_FC_ANEG && | ||
184 | (fc ^ hw->flowctrl) & (ALX_FC_RX | ALX_FC_TX)) | ||
185 | reconfig_phy = true; | ||
186 | } | ||
187 | |||
188 | if (reconfig_phy) { | ||
189 | err = alx_setup_speed_duplex(hw, hw->adv_cfg, fc); | ||
190 | return err; | ||
191 | } | ||
192 | |||
193 | /* flow control on mac */ | ||
194 | if ((fc ^ hw->flowctrl) & (ALX_FC_RX | ALX_FC_TX)) | ||
195 | alx_cfg_mac_flowcontrol(hw, fc); | ||
196 | |||
197 | hw->flowctrl = fc; | ||
198 | |||
199 | return 0; | ||
200 | } | ||
201 | |||
202 | static u32 alx_get_msglevel(struct net_device *netdev) | ||
203 | { | ||
204 | struct alx_priv *alx = netdev_priv(netdev); | ||
205 | |||
206 | return alx->msg_enable; | ||
207 | } | ||
208 | |||
209 | static void alx_set_msglevel(struct net_device *netdev, u32 data) | ||
210 | { | ||
211 | struct alx_priv *alx = netdev_priv(netdev); | ||
212 | |||
213 | alx->msg_enable = data; | ||
214 | } | ||
215 | |||
216 | static void alx_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | ||
217 | { | ||
218 | struct alx_priv *alx = netdev_priv(netdev); | ||
219 | struct alx_hw *hw = &alx->hw; | ||
220 | |||
221 | wol->supported = WAKE_MAGIC | WAKE_PHY; | ||
222 | wol->wolopts = 0; | ||
223 | |||
224 | if (hw->sleep_ctrl & ALX_SLEEP_WOL_MAGIC) | ||
225 | wol->wolopts |= WAKE_MAGIC; | ||
226 | if (hw->sleep_ctrl & ALX_SLEEP_WOL_PHY) | ||
227 | wol->wolopts |= WAKE_PHY; | ||
228 | } | ||
229 | |||
230 | static int alx_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | ||
231 | { | ||
232 | struct alx_priv *alx = netdev_priv(netdev); | ||
233 | struct alx_hw *hw = &alx->hw; | ||
234 | |||
235 | if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE | | ||
236 | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)) | ||
237 | return -EOPNOTSUPP; | ||
238 | |||
239 | hw->sleep_ctrl = 0; | ||
240 | |||
241 | if (wol->wolopts & WAKE_MAGIC) | ||
242 | hw->sleep_ctrl |= ALX_SLEEP_WOL_MAGIC; | ||
243 | if (wol->wolopts & WAKE_PHY) | ||
244 | hw->sleep_ctrl |= ALX_SLEEP_WOL_PHY; | ||
245 | |||
246 | device_set_wakeup_enable(&alx->hw.pdev->dev, hw->sleep_ctrl); | ||
247 | |||
248 | return 0; | ||
249 | } | ||
250 | |||
251 | static void alx_get_drvinfo(struct net_device *netdev, | ||
252 | struct ethtool_drvinfo *drvinfo) | ||
253 | { | ||
254 | struct alx_priv *alx = netdev_priv(netdev); | ||
255 | |||
256 | strlcpy(drvinfo->driver, alx_drv_name, sizeof(drvinfo->driver)); | ||
257 | strlcpy(drvinfo->bus_info, pci_name(alx->hw.pdev), | ||
258 | sizeof(drvinfo->bus_info)); | ||
259 | } | ||
260 | |||
261 | const struct ethtool_ops alx_ethtool_ops = { | ||
262 | .get_settings = alx_get_settings, | ||
263 | .set_settings = alx_set_settings, | ||
264 | .get_pauseparam = alx_get_pauseparam, | ||
265 | .set_pauseparam = alx_set_pauseparam, | ||
266 | .get_drvinfo = alx_get_drvinfo, | ||
267 | .get_msglevel = alx_get_msglevel, | ||
268 | .set_msglevel = alx_set_msglevel, | ||
269 | .get_wol = alx_get_wol, | ||
270 | .set_wol = alx_set_wol, | ||
271 | .get_link = ethtool_op_get_link, | ||
272 | }; | ||
diff --git a/drivers/net/ethernet/atheros/alx/hw.c b/drivers/net/ethernet/atheros/alx/hw.c new file mode 100644 index 000000000000..220a16ad0e49 --- /dev/null +++ b/drivers/net/ethernet/atheros/alx/hw.c | |||
@@ -0,0 +1,1226 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013 Johannes Berg <johannes@sipsolutions.net> | ||
3 | * | ||
4 | * This file is free software: you may copy, redistribute and/or modify it | ||
5 | * under the terms of the GNU General Public License as published by the | ||
6 | * Free Software Foundation, either version 2 of the License, or (at your | ||
7 | * option) any later version. | ||
8 | * | ||
9 | * This file is distributed in the hope that it will be useful, but | ||
10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | * General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | * | ||
17 | * This file incorporates work covered by the following copyright and | ||
18 | * permission notice: | ||
19 | * | ||
20 | * Copyright (c) 2012 Qualcomm Atheros, Inc. | ||
21 | * | ||
22 | * Permission to use, copy, modify, and/or distribute this software for any | ||
23 | * purpose with or without fee is hereby granted, provided that the above | ||
24 | * copyright notice and this permission notice appear in all copies. | ||
25 | * | ||
26 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
27 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
28 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
29 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
30 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
31 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
32 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
33 | */ | ||
34 | #include <linux/etherdevice.h> | ||
35 | #include <linux/delay.h> | ||
36 | #include <linux/pci.h> | ||
37 | #include <linux/mdio.h> | ||
38 | #include "reg.h" | ||
39 | #include "hw.h" | ||
40 | |||
41 | static inline bool alx_is_rev_a(u8 rev) | ||
42 | { | ||
43 | return rev == ALX_REV_A0 || rev == ALX_REV_A1; | ||
44 | } | ||
45 | |||
46 | static int alx_wait_mdio_idle(struct alx_hw *hw) | ||
47 | { | ||
48 | u32 val; | ||
49 | int i; | ||
50 | |||
51 | for (i = 0; i < ALX_MDIO_MAX_AC_TO; i++) { | ||
52 | val = alx_read_mem32(hw, ALX_MDIO); | ||
53 | if (!(val & ALX_MDIO_BUSY)) | ||
54 | return 0; | ||
55 | udelay(10); | ||
56 | } | ||
57 | |||
58 | return -ETIMEDOUT; | ||
59 | } | ||
60 | |||
61 | static int alx_read_phy_core(struct alx_hw *hw, bool ext, u8 dev, | ||
62 | u16 reg, u16 *phy_data) | ||
63 | { | ||
64 | u32 val, clk_sel; | ||
65 | int err; | ||
66 | |||
67 | *phy_data = 0; | ||
68 | |||
69 | /* use slow clock when it's in hibernation status */ | ||
70 | clk_sel = hw->link_speed != SPEED_UNKNOWN ? | ||
71 | ALX_MDIO_CLK_SEL_25MD4 : | ||
72 | ALX_MDIO_CLK_SEL_25MD128; | ||
73 | |||
74 | if (ext) { | ||
75 | val = dev << ALX_MDIO_EXTN_DEVAD_SHIFT | | ||
76 | reg << ALX_MDIO_EXTN_REG_SHIFT; | ||
77 | alx_write_mem32(hw, ALX_MDIO_EXTN, val); | ||
78 | |||
79 | val = ALX_MDIO_SPRES_PRMBL | ALX_MDIO_START | | ||
80 | ALX_MDIO_MODE_EXT | ALX_MDIO_OP_READ | | ||
81 | clk_sel << ALX_MDIO_CLK_SEL_SHIFT; | ||
82 | } else { | ||
83 | val = ALX_MDIO_SPRES_PRMBL | | ||
84 | clk_sel << ALX_MDIO_CLK_SEL_SHIFT | | ||
85 | reg << ALX_MDIO_REG_SHIFT | | ||
86 | ALX_MDIO_START | ALX_MDIO_OP_READ; | ||
87 | } | ||
88 | alx_write_mem32(hw, ALX_MDIO, val); | ||
89 | |||
90 | err = alx_wait_mdio_idle(hw); | ||
91 | if (err) | ||
92 | return err; | ||
93 | val = alx_read_mem32(hw, ALX_MDIO); | ||
94 | *phy_data = ALX_GET_FIELD(val, ALX_MDIO_DATA); | ||
95 | return 0; | ||
96 | } | ||
97 | |||
98 | static int alx_write_phy_core(struct alx_hw *hw, bool ext, u8 dev, | ||
99 | u16 reg, u16 phy_data) | ||
100 | { | ||
101 | u32 val, clk_sel; | ||
102 | |||
103 | /* use slow clock when it's in hibernation status */ | ||
104 | clk_sel = hw->link_speed != SPEED_UNKNOWN ? | ||
105 | ALX_MDIO_CLK_SEL_25MD4 : | ||
106 | ALX_MDIO_CLK_SEL_25MD128; | ||
107 | |||
108 | if (ext) { | ||
109 | val = dev << ALX_MDIO_EXTN_DEVAD_SHIFT | | ||
110 | reg << ALX_MDIO_EXTN_REG_SHIFT; | ||
111 | alx_write_mem32(hw, ALX_MDIO_EXTN, val); | ||
112 | |||
113 | val = ALX_MDIO_SPRES_PRMBL | | ||
114 | clk_sel << ALX_MDIO_CLK_SEL_SHIFT | | ||
115 | phy_data << ALX_MDIO_DATA_SHIFT | | ||
116 | ALX_MDIO_START | ALX_MDIO_MODE_EXT; | ||
117 | } else { | ||
118 | val = ALX_MDIO_SPRES_PRMBL | | ||
119 | clk_sel << ALX_MDIO_CLK_SEL_SHIFT | | ||
120 | reg << ALX_MDIO_REG_SHIFT | | ||
121 | phy_data << ALX_MDIO_DATA_SHIFT | | ||
122 | ALX_MDIO_START; | ||
123 | } | ||
124 | alx_write_mem32(hw, ALX_MDIO, val); | ||
125 | |||
126 | return alx_wait_mdio_idle(hw); | ||
127 | } | ||
128 | |||
129 | static int __alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data) | ||
130 | { | ||
131 | return alx_read_phy_core(hw, false, 0, reg, phy_data); | ||
132 | } | ||
133 | |||
134 | static int __alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data) | ||
135 | { | ||
136 | return alx_write_phy_core(hw, false, 0, reg, phy_data); | ||
137 | } | ||
138 | |||
139 | static int __alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata) | ||
140 | { | ||
141 | return alx_read_phy_core(hw, true, dev, reg, pdata); | ||
142 | } | ||
143 | |||
144 | static int __alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data) | ||
145 | { | ||
146 | return alx_write_phy_core(hw, true, dev, reg, data); | ||
147 | } | ||
148 | |||
149 | static int __alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata) | ||
150 | { | ||
151 | int err; | ||
152 | |||
153 | err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg); | ||
154 | if (err) | ||
155 | return err; | ||
156 | |||
157 | return __alx_read_phy_reg(hw, ALX_MII_DBG_DATA, pdata); | ||
158 | } | ||
159 | |||
160 | static int __alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data) | ||
161 | { | ||
162 | int err; | ||
163 | |||
164 | err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg); | ||
165 | if (err) | ||
166 | return err; | ||
167 | |||
168 | return __alx_write_phy_reg(hw, ALX_MII_DBG_DATA, data); | ||
169 | } | ||
170 | |||
171 | int alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data) | ||
172 | { | ||
173 | int err; | ||
174 | |||
175 | spin_lock(&hw->mdio_lock); | ||
176 | err = __alx_read_phy_reg(hw, reg, phy_data); | ||
177 | spin_unlock(&hw->mdio_lock); | ||
178 | |||
179 | return err; | ||
180 | } | ||
181 | |||
182 | int alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data) | ||
183 | { | ||
184 | int err; | ||
185 | |||
186 | spin_lock(&hw->mdio_lock); | ||
187 | err = __alx_write_phy_reg(hw, reg, phy_data); | ||
188 | spin_unlock(&hw->mdio_lock); | ||
189 | |||
190 | return err; | ||
191 | } | ||
192 | |||
193 | int alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata) | ||
194 | { | ||
195 | int err; | ||
196 | |||
197 | spin_lock(&hw->mdio_lock); | ||
198 | err = __alx_read_phy_ext(hw, dev, reg, pdata); | ||
199 | spin_unlock(&hw->mdio_lock); | ||
200 | |||
201 | return err; | ||
202 | } | ||
203 | |||
204 | int alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data) | ||
205 | { | ||
206 | int err; | ||
207 | |||
208 | spin_lock(&hw->mdio_lock); | ||
209 | err = __alx_write_phy_ext(hw, dev, reg, data); | ||
210 | spin_unlock(&hw->mdio_lock); | ||
211 | |||
212 | return err; | ||
213 | } | ||
214 | |||
215 | static int alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata) | ||
216 | { | ||
217 | int err; | ||
218 | |||
219 | spin_lock(&hw->mdio_lock); | ||
220 | err = __alx_read_phy_dbg(hw, reg, pdata); | ||
221 | spin_unlock(&hw->mdio_lock); | ||
222 | |||
223 | return err; | ||
224 | } | ||
225 | |||
226 | static int alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data) | ||
227 | { | ||
228 | int err; | ||
229 | |||
230 | spin_lock(&hw->mdio_lock); | ||
231 | err = __alx_write_phy_dbg(hw, reg, data); | ||
232 | spin_unlock(&hw->mdio_lock); | ||
233 | |||
234 | return err; | ||
235 | } | ||
236 | |||
237 | static u16 alx_get_phy_config(struct alx_hw *hw) | ||
238 | { | ||
239 | u32 val; | ||
240 | u16 phy_val; | ||
241 | |||
242 | val = alx_read_mem32(hw, ALX_PHY_CTRL); | ||
243 | /* phy in reset */ | ||
244 | if ((val & ALX_PHY_CTRL_DSPRST_OUT) == 0) | ||
245 | return ALX_DRV_PHY_UNKNOWN; | ||
246 | |||
247 | val = alx_read_mem32(hw, ALX_DRV); | ||
248 | val = ALX_GET_FIELD(val, ALX_DRV_PHY); | ||
249 | if (ALX_DRV_PHY_UNKNOWN == val) | ||
250 | return ALX_DRV_PHY_UNKNOWN; | ||
251 | |||
252 | alx_read_phy_reg(hw, ALX_MII_DBG_ADDR, &phy_val); | ||
253 | if (ALX_PHY_INITED == phy_val) | ||
254 | return val; | ||
255 | |||
256 | return ALX_DRV_PHY_UNKNOWN; | ||
257 | } | ||
258 | |||
259 | static bool alx_wait_reg(struct alx_hw *hw, u32 reg, u32 wait, u32 *val) | ||
260 | { | ||
261 | u32 read; | ||
262 | int i; | ||
263 | |||
264 | for (i = 0; i < ALX_SLD_MAX_TO; i++) { | ||
265 | read = alx_read_mem32(hw, reg); | ||
266 | if ((read & wait) == 0) { | ||
267 | if (val) | ||
268 | *val = read; | ||
269 | return true; | ||
270 | } | ||
271 | mdelay(1); | ||
272 | } | ||
273 | |||
274 | return false; | ||
275 | } | ||
276 | |||
277 | static bool alx_read_macaddr(struct alx_hw *hw, u8 *addr) | ||
278 | { | ||
279 | u32 mac0, mac1; | ||
280 | |||
281 | mac0 = alx_read_mem32(hw, ALX_STAD0); | ||
282 | mac1 = alx_read_mem32(hw, ALX_STAD1); | ||
283 | |||
284 | /* addr should be big-endian */ | ||
285 | *(__be32 *)(addr + 2) = cpu_to_be32(mac0); | ||
286 | *(__be16 *)addr = cpu_to_be16(mac1); | ||
287 | |||
288 | return is_valid_ether_addr(addr); | ||
289 | } | ||
290 | |||
291 | int alx_get_perm_macaddr(struct alx_hw *hw, u8 *addr) | ||
292 | { | ||
293 | u32 val; | ||
294 | |||
295 | /* try to get it from register first */ | ||
296 | if (alx_read_macaddr(hw, addr)) | ||
297 | return 0; | ||
298 | |||
299 | /* try to load from efuse */ | ||
300 | if (!alx_wait_reg(hw, ALX_SLD, ALX_SLD_STAT | ALX_SLD_START, &val)) | ||
301 | return -EIO; | ||
302 | alx_write_mem32(hw, ALX_SLD, val | ALX_SLD_START); | ||
303 | if (!alx_wait_reg(hw, ALX_SLD, ALX_SLD_START, NULL)) | ||
304 | return -EIO; | ||
305 | if (alx_read_macaddr(hw, addr)) | ||
306 | return 0; | ||
307 | |||
308 | /* try to load from flash/eeprom (if present) */ | ||
309 | val = alx_read_mem32(hw, ALX_EFLD); | ||
310 | if (val & (ALX_EFLD_F_EXIST | ALX_EFLD_E_EXIST)) { | ||
311 | if (!alx_wait_reg(hw, ALX_EFLD, | ||
312 | ALX_EFLD_STAT | ALX_EFLD_START, &val)) | ||
313 | return -EIO; | ||
314 | alx_write_mem32(hw, ALX_EFLD, val | ALX_EFLD_START); | ||
315 | if (!alx_wait_reg(hw, ALX_EFLD, ALX_EFLD_START, NULL)) | ||
316 | return -EIO; | ||
317 | if (alx_read_macaddr(hw, addr)) | ||
318 | return 0; | ||
319 | } | ||
320 | |||
321 | return -EIO; | ||
322 | } | ||
323 | |||
324 | void alx_set_macaddr(struct alx_hw *hw, const u8 *addr) | ||
325 | { | ||
326 | u32 val; | ||
327 | |||
328 | /* for example: 00-0B-6A-F6-00-DC * STAD0=6AF600DC, STAD1=000B */ | ||
329 | val = be32_to_cpu(*(__be32 *)(addr + 2)); | ||
330 | alx_write_mem32(hw, ALX_STAD0, val); | ||
331 | val = be16_to_cpu(*(__be16 *)addr); | ||
332 | alx_write_mem32(hw, ALX_STAD1, val); | ||
333 | } | ||
334 | |||
335 | static void alx_enable_osc(struct alx_hw *hw) | ||
336 | { | ||
337 | u32 val; | ||
338 | |||
339 | /* rising edge */ | ||
340 | val = alx_read_mem32(hw, ALX_MISC); | ||
341 | alx_write_mem32(hw, ALX_MISC, val & ~ALX_MISC_INTNLOSC_OPEN); | ||
342 | alx_write_mem32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN); | ||
343 | } | ||
344 | |||
345 | static void alx_reset_osc(struct alx_hw *hw, u8 rev) | ||
346 | { | ||
347 | u32 val, val2; | ||
348 | |||
349 | /* clear Internal OSC settings, switching OSC by hw itself */ | ||
350 | val = alx_read_mem32(hw, ALX_MISC3); | ||
351 | alx_write_mem32(hw, ALX_MISC3, | ||
352 | (val & ~ALX_MISC3_25M_BY_SW) | | ||
353 | ALX_MISC3_25M_NOTO_INTNL); | ||
354 | |||
355 | /* 25M clk from chipset may be unstable 1s after de-assert of | ||
356 | * PERST, driver need re-calibrate before enter Sleep for WoL | ||
357 | */ | ||
358 | val = alx_read_mem32(hw, ALX_MISC); | ||
359 | if (rev >= ALX_REV_B0) { | ||
360 | /* restore over current protection def-val, | ||
361 | * this val could be reset by MAC-RST | ||
362 | */ | ||
363 | ALX_SET_FIELD(val, ALX_MISC_PSW_OCP, ALX_MISC_PSW_OCP_DEF); | ||
364 | /* a 0->1 change will update the internal val of osc */ | ||
365 | val &= ~ALX_MISC_INTNLOSC_OPEN; | ||
366 | alx_write_mem32(hw, ALX_MISC, val); | ||
367 | alx_write_mem32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN); | ||
368 | /* hw will automatically dis OSC after cab. */ | ||
369 | val2 = alx_read_mem32(hw, ALX_MSIC2); | ||
370 | val2 &= ~ALX_MSIC2_CALB_START; | ||
371 | alx_write_mem32(hw, ALX_MSIC2, val2); | ||
372 | alx_write_mem32(hw, ALX_MSIC2, val2 | ALX_MSIC2_CALB_START); | ||
373 | } else { | ||
374 | val &= ~ALX_MISC_INTNLOSC_OPEN; | ||
375 | /* disable isolate for rev A devices */ | ||
376 | if (alx_is_rev_a(rev)) | ||
377 | val &= ~ALX_MISC_ISO_EN; | ||
378 | |||
379 | alx_write_mem32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN); | ||
380 | alx_write_mem32(hw, ALX_MISC, val); | ||
381 | } | ||
382 | |||
383 | udelay(20); | ||
384 | } | ||
385 | |||
386 | static int alx_stop_mac(struct alx_hw *hw) | ||
387 | { | ||
388 | u32 rxq, txq, val; | ||
389 | u16 i; | ||
390 | |||
391 | rxq = alx_read_mem32(hw, ALX_RXQ0); | ||
392 | alx_write_mem32(hw, ALX_RXQ0, rxq & ~ALX_RXQ0_EN); | ||
393 | txq = alx_read_mem32(hw, ALX_TXQ0); | ||
394 | alx_write_mem32(hw, ALX_TXQ0, txq & ~ALX_TXQ0_EN); | ||
395 | |||
396 | udelay(40); | ||
397 | |||
398 | hw->rx_ctrl &= ~(ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_TX_EN); | ||
399 | alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl); | ||
400 | |||
401 | for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) { | ||
402 | val = alx_read_mem32(hw, ALX_MAC_STS); | ||
403 | if (!(val & ALX_MAC_STS_IDLE)) | ||
404 | return 0; | ||
405 | udelay(10); | ||
406 | } | ||
407 | |||
408 | return -ETIMEDOUT; | ||
409 | } | ||
410 | |||
411 | int alx_reset_mac(struct alx_hw *hw) | ||
412 | { | ||
413 | u32 val, pmctrl; | ||
414 | int i, ret; | ||
415 | u8 rev; | ||
416 | bool a_cr; | ||
417 | |||
418 | pmctrl = 0; | ||
419 | rev = alx_hw_revision(hw); | ||
420 | a_cr = alx_is_rev_a(rev) && alx_hw_with_cr(hw); | ||
421 | |||
422 | /* disable all interrupts, RXQ/TXQ */ | ||
423 | alx_write_mem32(hw, ALX_MSIX_MASK, 0xFFFFFFFF); | ||
424 | alx_write_mem32(hw, ALX_IMR, 0); | ||
425 | alx_write_mem32(hw, ALX_ISR, ALX_ISR_DIS); | ||
426 | |||
427 | ret = alx_stop_mac(hw); | ||
428 | if (ret) | ||
429 | return ret; | ||
430 | |||
431 | /* mac reset workaroud */ | ||
432 | alx_write_mem32(hw, ALX_RFD_PIDX, 1); | ||
433 | |||
434 | /* dis l0s/l1 before mac reset */ | ||
435 | if (a_cr) { | ||
436 | pmctrl = alx_read_mem32(hw, ALX_PMCTRL); | ||
437 | if (pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN)) | ||
438 | alx_write_mem32(hw, ALX_PMCTRL, | ||
439 | pmctrl & ~(ALX_PMCTRL_L1_EN | | ||
440 | ALX_PMCTRL_L0S_EN)); | ||
441 | } | ||
442 | |||
443 | /* reset whole mac safely */ | ||
444 | val = alx_read_mem32(hw, ALX_MASTER); | ||
445 | alx_write_mem32(hw, ALX_MASTER, | ||
446 | val | ALX_MASTER_DMA_MAC_RST | ALX_MASTER_OOB_DIS); | ||
447 | |||
448 | /* make sure it's real idle */ | ||
449 | udelay(10); | ||
450 | for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) { | ||
451 | val = alx_read_mem32(hw, ALX_RFD_PIDX); | ||
452 | if (val == 0) | ||
453 | break; | ||
454 | udelay(10); | ||
455 | } | ||
456 | for (; i < ALX_DMA_MAC_RST_TO; i++) { | ||
457 | val = alx_read_mem32(hw, ALX_MASTER); | ||
458 | if ((val & ALX_MASTER_DMA_MAC_RST) == 0) | ||
459 | break; | ||
460 | udelay(10); | ||
461 | } | ||
462 | if (i == ALX_DMA_MAC_RST_TO) | ||
463 | return -EIO; | ||
464 | udelay(10); | ||
465 | |||
466 | if (a_cr) { | ||
467 | alx_write_mem32(hw, ALX_MASTER, val | ALX_MASTER_PCLKSEL_SRDS); | ||
468 | /* restore l0s / l1 */ | ||
469 | if (pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN)) | ||
470 | alx_write_mem32(hw, ALX_PMCTRL, pmctrl); | ||
471 | } | ||
472 | |||
473 | alx_reset_osc(hw, rev); | ||
474 | |||
475 | /* clear Internal OSC settings, switching OSC by hw itself, | ||
476 | * disable isolate for rev A devices | ||
477 | */ | ||
478 | val = alx_read_mem32(hw, ALX_MISC3); | ||
479 | alx_write_mem32(hw, ALX_MISC3, | ||
480 | (val & ~ALX_MISC3_25M_BY_SW) | | ||
481 | ALX_MISC3_25M_NOTO_INTNL); | ||
482 | val = alx_read_mem32(hw, ALX_MISC); | ||
483 | val &= ~ALX_MISC_INTNLOSC_OPEN; | ||
484 | if (alx_is_rev_a(rev)) | ||
485 | val &= ~ALX_MISC_ISO_EN; | ||
486 | alx_write_mem32(hw, ALX_MISC, val); | ||
487 | udelay(20); | ||
488 | |||
489 | /* driver control speed/duplex, hash-alg */ | ||
490 | alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl); | ||
491 | |||
492 | val = alx_read_mem32(hw, ALX_SERDES); | ||
493 | alx_write_mem32(hw, ALX_SERDES, | ||
494 | val | ALX_SERDES_MACCLK_SLWDWN | | ||
495 | ALX_SERDES_PHYCLK_SLWDWN); | ||
496 | |||
497 | return 0; | ||
498 | } | ||
499 | |||
500 | void alx_reset_phy(struct alx_hw *hw) | ||
501 | { | ||
502 | int i; | ||
503 | u32 val; | ||
504 | u16 phy_val; | ||
505 | |||
506 | /* (DSP)reset PHY core */ | ||
507 | val = alx_read_mem32(hw, ALX_PHY_CTRL); | ||
508 | val &= ~(ALX_PHY_CTRL_DSPRST_OUT | ALX_PHY_CTRL_IDDQ | | ||
509 | ALX_PHY_CTRL_GATE_25M | ALX_PHY_CTRL_POWER_DOWN | | ||
510 | ALX_PHY_CTRL_CLS); | ||
511 | val |= ALX_PHY_CTRL_RST_ANALOG; | ||
512 | |||
513 | val |= (ALX_PHY_CTRL_HIB_PULSE | ALX_PHY_CTRL_HIB_EN); | ||
514 | alx_write_mem32(hw, ALX_PHY_CTRL, val); | ||
515 | udelay(10); | ||
516 | alx_write_mem32(hw, ALX_PHY_CTRL, val | ALX_PHY_CTRL_DSPRST_OUT); | ||
517 | |||
518 | for (i = 0; i < ALX_PHY_CTRL_DSPRST_TO; i++) | ||
519 | udelay(10); | ||
520 | |||
521 | /* phy power saving & hib */ | ||
522 | alx_write_phy_dbg(hw, ALX_MIIDBG_LEGCYPS, ALX_LEGCYPS_DEF); | ||
523 | alx_write_phy_dbg(hw, ALX_MIIDBG_SYSMODCTRL, | ||
524 | ALX_SYSMODCTRL_IECHOADJ_DEF); | ||
525 | alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_VDRVBIAS, | ||
526 | ALX_VDRVBIAS_DEF); | ||
527 | |||
528 | /* EEE advertisement */ | ||
529 | val = alx_read_mem32(hw, ALX_LPI_CTRL); | ||
530 | alx_write_mem32(hw, ALX_LPI_CTRL, val & ~ALX_LPI_CTRL_EN); | ||
531 | alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_LOCAL_EEEADV, 0); | ||
532 | |||
533 | /* phy power saving */ | ||
534 | alx_write_phy_dbg(hw, ALX_MIIDBG_TST10BTCFG, ALX_TST10BTCFG_DEF); | ||
535 | alx_write_phy_dbg(hw, ALX_MIIDBG_SRDSYSMOD, ALX_SRDSYSMOD_DEF); | ||
536 | alx_write_phy_dbg(hw, ALX_MIIDBG_TST100BTCFG, ALX_TST100BTCFG_DEF); | ||
537 | alx_write_phy_dbg(hw, ALX_MIIDBG_ANACTRL, ALX_ANACTRL_DEF); | ||
538 | alx_read_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, &phy_val); | ||
539 | alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, | ||
540 | phy_val & ~ALX_GREENCFG2_GATE_DFSE_EN); | ||
541 | /* rtl8139c, 120m issue */ | ||
542 | alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_NLP78, | ||
543 | ALX_MIIEXT_NLP78_120M_DEF); | ||
544 | alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_S3DIG10, | ||
545 | ALX_MIIEXT_S3DIG10_DEF); | ||
546 | |||
547 | if (hw->lnk_patch) { | ||
548 | /* Turn off half amplitude */ | ||
549 | alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3, | ||
550 | &phy_val); | ||
551 | alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3, | ||
552 | phy_val | ALX_CLDCTRL3_BP_CABLE1TH_DET_GT); | ||
553 | /* Turn off Green feature */ | ||
554 | alx_read_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, &phy_val); | ||
555 | alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, | ||
556 | phy_val | ALX_GREENCFG2_BP_GREEN); | ||
557 | /* Turn off half Bias */ | ||
558 | alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5, | ||
559 | &phy_val); | ||
560 | alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5, | ||
561 | phy_val | ALX_CLDCTRL5_BP_VD_HLFBIAS); | ||
562 | } | ||
563 | |||
564 | /* set phy interrupt mask */ | ||
565 | alx_write_phy_reg(hw, ALX_MII_IER, ALX_IER_LINK_UP | ALX_IER_LINK_DOWN); | ||
566 | } | ||
567 | |||
568 | #define ALX_PCI_CMD (PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO) | ||
569 | |||
570 | void alx_reset_pcie(struct alx_hw *hw) | ||
571 | { | ||
572 | u8 rev = alx_hw_revision(hw); | ||
573 | u32 val; | ||
574 | u16 val16; | ||
575 | |||
576 | /* Workaround for PCI problem when BIOS sets MMRBC incorrectly. */ | ||
577 | pci_read_config_word(hw->pdev, PCI_COMMAND, &val16); | ||
578 | if (!(val16 & ALX_PCI_CMD) || (val16 & PCI_COMMAND_INTX_DISABLE)) { | ||
579 | val16 = (val16 | ALX_PCI_CMD) & ~PCI_COMMAND_INTX_DISABLE; | ||
580 | pci_write_config_word(hw->pdev, PCI_COMMAND, val16); | ||
581 | } | ||
582 | |||
583 | /* clear WoL setting/status */ | ||
584 | val = alx_read_mem32(hw, ALX_WOL0); | ||
585 | alx_write_mem32(hw, ALX_WOL0, 0); | ||
586 | |||
587 | val = alx_read_mem32(hw, ALX_PDLL_TRNS1); | ||
588 | alx_write_mem32(hw, ALX_PDLL_TRNS1, val & ~ALX_PDLL_TRNS1_D3PLLOFF_EN); | ||
589 | |||
590 | /* mask some pcie error bits */ | ||
591 | val = alx_read_mem32(hw, ALX_UE_SVRT); | ||
592 | val &= ~(ALX_UE_SVRT_DLPROTERR | ALX_UE_SVRT_FCPROTERR); | ||
593 | alx_write_mem32(hw, ALX_UE_SVRT, val); | ||
594 | |||
595 | /* wol 25M & pclk */ | ||
596 | val = alx_read_mem32(hw, ALX_MASTER); | ||
597 | if (alx_is_rev_a(rev) && alx_hw_with_cr(hw)) { | ||
598 | if ((val & ALX_MASTER_WAKEN_25M) == 0 || | ||
599 | (val & ALX_MASTER_PCLKSEL_SRDS) == 0) | ||
600 | alx_write_mem32(hw, ALX_MASTER, | ||
601 | val | ALX_MASTER_PCLKSEL_SRDS | | ||
602 | ALX_MASTER_WAKEN_25M); | ||
603 | } else { | ||
604 | if ((val & ALX_MASTER_WAKEN_25M) == 0 || | ||
605 | (val & ALX_MASTER_PCLKSEL_SRDS) != 0) | ||
606 | alx_write_mem32(hw, ALX_MASTER, | ||
607 | (val & ~ALX_MASTER_PCLKSEL_SRDS) | | ||
608 | ALX_MASTER_WAKEN_25M); | ||
609 | } | ||
610 | |||
611 | /* ASPM setting */ | ||
612 | alx_enable_aspm(hw, true, true); | ||
613 | |||
614 | udelay(10); | ||
615 | } | ||
616 | |||
617 | void alx_start_mac(struct alx_hw *hw) | ||
618 | { | ||
619 | u32 mac, txq, rxq; | ||
620 | |||
621 | rxq = alx_read_mem32(hw, ALX_RXQ0); | ||
622 | alx_write_mem32(hw, ALX_RXQ0, rxq | ALX_RXQ0_EN); | ||
623 | txq = alx_read_mem32(hw, ALX_TXQ0); | ||
624 | alx_write_mem32(hw, ALX_TXQ0, txq | ALX_TXQ0_EN); | ||
625 | |||
626 | mac = hw->rx_ctrl; | ||
627 | if (hw->link_speed % 10 == DUPLEX_FULL) | ||
628 | mac |= ALX_MAC_CTRL_FULLD; | ||
629 | else | ||
630 | mac &= ~ALX_MAC_CTRL_FULLD; | ||
631 | ALX_SET_FIELD(mac, ALX_MAC_CTRL_SPEED, | ||
632 | hw->link_speed >= SPEED_1000 ? ALX_MAC_CTRL_SPEED_1000 : | ||
633 | ALX_MAC_CTRL_SPEED_10_100); | ||
634 | mac |= ALX_MAC_CTRL_TX_EN | ALX_MAC_CTRL_RX_EN; | ||
635 | hw->rx_ctrl = mac; | ||
636 | alx_write_mem32(hw, ALX_MAC_CTRL, mac); | ||
637 | } | ||
638 | |||
639 | void alx_cfg_mac_flowcontrol(struct alx_hw *hw, u8 fc) | ||
640 | { | ||
641 | if (fc & ALX_FC_RX) | ||
642 | hw->rx_ctrl |= ALX_MAC_CTRL_RXFC_EN; | ||
643 | else | ||
644 | hw->rx_ctrl &= ~ALX_MAC_CTRL_RXFC_EN; | ||
645 | |||
646 | if (fc & ALX_FC_TX) | ||
647 | hw->rx_ctrl |= ALX_MAC_CTRL_TXFC_EN; | ||
648 | else | ||
649 | hw->rx_ctrl &= ~ALX_MAC_CTRL_TXFC_EN; | ||
650 | |||
651 | alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl); | ||
652 | } | ||
653 | |||
654 | void alx_enable_aspm(struct alx_hw *hw, bool l0s_en, bool l1_en) | ||
655 | { | ||
656 | u32 pmctrl; | ||
657 | u8 rev = alx_hw_revision(hw); | ||
658 | |||
659 | pmctrl = alx_read_mem32(hw, ALX_PMCTRL); | ||
660 | |||
661 | ALX_SET_FIELD(pmctrl, ALX_PMCTRL_LCKDET_TIMER, | ||
662 | ALX_PMCTRL_LCKDET_TIMER_DEF); | ||
663 | pmctrl |= ALX_PMCTRL_RCVR_WT_1US | | ||
664 | ALX_PMCTRL_L1_CLKSW_EN | | ||
665 | ALX_PMCTRL_L1_SRDSRX_PWD; | ||
666 | ALX_SET_FIELD(pmctrl, ALX_PMCTRL_L1REQ_TO, ALX_PMCTRL_L1REG_TO_DEF); | ||
667 | ALX_SET_FIELD(pmctrl, ALX_PMCTRL_L1_TIMER, ALX_PMCTRL_L1_TIMER_16US); | ||
668 | pmctrl &= ~(ALX_PMCTRL_L1_SRDS_EN | | ||
669 | ALX_PMCTRL_L1_SRDSPLL_EN | | ||
670 | ALX_PMCTRL_L1_BUFSRX_EN | | ||
671 | ALX_PMCTRL_SADLY_EN | | ||
672 | ALX_PMCTRL_HOTRST_WTEN| | ||
673 | ALX_PMCTRL_L0S_EN | | ||
674 | ALX_PMCTRL_L1_EN | | ||
675 | ALX_PMCTRL_ASPM_FCEN | | ||
676 | ALX_PMCTRL_TXL1_AFTER_L0S | | ||
677 | ALX_PMCTRL_RXL1_AFTER_L0S); | ||
678 | if (alx_is_rev_a(rev) && alx_hw_with_cr(hw)) | ||
679 | pmctrl |= ALX_PMCTRL_L1_SRDS_EN | ALX_PMCTRL_L1_SRDSPLL_EN; | ||
680 | |||
681 | if (l0s_en) | ||
682 | pmctrl |= (ALX_PMCTRL_L0S_EN | ALX_PMCTRL_ASPM_FCEN); | ||
683 | if (l1_en) | ||
684 | pmctrl |= (ALX_PMCTRL_L1_EN | ALX_PMCTRL_ASPM_FCEN); | ||
685 | |||
686 | alx_write_mem32(hw, ALX_PMCTRL, pmctrl); | ||
687 | } | ||
688 | |||
689 | |||
690 | static u32 ethadv_to_hw_cfg(struct alx_hw *hw, u32 ethadv_cfg) | ||
691 | { | ||
692 | u32 cfg = 0; | ||
693 | |||
694 | if (ethadv_cfg & ADVERTISED_Autoneg) { | ||
695 | cfg |= ALX_DRV_PHY_AUTO; | ||
696 | if (ethadv_cfg & ADVERTISED_10baseT_Half) | ||
697 | cfg |= ALX_DRV_PHY_10; | ||
698 | if (ethadv_cfg & ADVERTISED_10baseT_Full) | ||
699 | cfg |= ALX_DRV_PHY_10 | ALX_DRV_PHY_DUPLEX; | ||
700 | if (ethadv_cfg & ADVERTISED_100baseT_Half) | ||
701 | cfg |= ALX_DRV_PHY_100; | ||
702 | if (ethadv_cfg & ADVERTISED_100baseT_Full) | ||
703 | cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX; | ||
704 | if (ethadv_cfg & ADVERTISED_1000baseT_Half) | ||
705 | cfg |= ALX_DRV_PHY_1000; | ||
706 | if (ethadv_cfg & ADVERTISED_1000baseT_Full) | ||
707 | cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX; | ||
708 | if (ethadv_cfg & ADVERTISED_Pause) | ||
709 | cfg |= ADVERTISE_PAUSE_CAP; | ||
710 | if (ethadv_cfg & ADVERTISED_Asym_Pause) | ||
711 | cfg |= ADVERTISE_PAUSE_ASYM; | ||
712 | } else { | ||
713 | switch (ethadv_cfg) { | ||
714 | case ADVERTISED_10baseT_Half: | ||
715 | cfg |= ALX_DRV_PHY_10; | ||
716 | break; | ||
717 | case ADVERTISED_100baseT_Half: | ||
718 | cfg |= ALX_DRV_PHY_100; | ||
719 | break; | ||
720 | case ADVERTISED_10baseT_Full: | ||
721 | cfg |= ALX_DRV_PHY_10 | ALX_DRV_PHY_DUPLEX; | ||
722 | break; | ||
723 | case ADVERTISED_100baseT_Full: | ||
724 | cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX; | ||
725 | break; | ||
726 | } | ||
727 | } | ||
728 | |||
729 | return cfg; | ||
730 | } | ||
731 | |||
732 | int alx_setup_speed_duplex(struct alx_hw *hw, u32 ethadv, u8 flowctrl) | ||
733 | { | ||
734 | u16 adv, giga, cr; | ||
735 | u32 val; | ||
736 | int err = 0; | ||
737 | |||
738 | alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, 0); | ||
739 | val = alx_read_mem32(hw, ALX_DRV); | ||
740 | ALX_SET_FIELD(val, ALX_DRV_PHY, 0); | ||
741 | |||
742 | if (ethadv & ADVERTISED_Autoneg) { | ||
743 | adv = ADVERTISE_CSMA; | ||
744 | adv |= ethtool_adv_to_mii_adv_t(ethadv); | ||
745 | |||
746 | if (flowctrl & ALX_FC_ANEG) { | ||
747 | if (flowctrl & ALX_FC_RX) { | ||
748 | adv |= ADVERTISED_Pause; | ||
749 | if (!(flowctrl & ALX_FC_TX)) | ||
750 | adv |= ADVERTISED_Asym_Pause; | ||
751 | } else if (flowctrl & ALX_FC_TX) { | ||
752 | adv |= ADVERTISED_Asym_Pause; | ||
753 | } | ||
754 | } | ||
755 | giga = 0; | ||
756 | if (alx_hw_giga(hw)) | ||
757 | giga = ethtool_adv_to_mii_ctrl1000_t(ethadv); | ||
758 | |||
759 | cr = BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART; | ||
760 | |||
761 | if (alx_write_phy_reg(hw, MII_ADVERTISE, adv) || | ||
762 | alx_write_phy_reg(hw, MII_CTRL1000, giga) || | ||
763 | alx_write_phy_reg(hw, MII_BMCR, cr)) | ||
764 | err = -EBUSY; | ||
765 | } else { | ||
766 | cr = BMCR_RESET; | ||
767 | if (ethadv == ADVERTISED_100baseT_Half || | ||
768 | ethadv == ADVERTISED_100baseT_Full) | ||
769 | cr |= BMCR_SPEED100; | ||
770 | if (ethadv == ADVERTISED_10baseT_Full || | ||
771 | ethadv == ADVERTISED_100baseT_Full) | ||
772 | cr |= BMCR_FULLDPLX; | ||
773 | |||
774 | err = alx_write_phy_reg(hw, MII_BMCR, cr); | ||
775 | } | ||
776 | |||
777 | if (!err) { | ||
778 | alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, ALX_PHY_INITED); | ||
779 | val |= ethadv_to_hw_cfg(hw, ethadv); | ||
780 | } | ||
781 | |||
782 | alx_write_mem32(hw, ALX_DRV, val); | ||
783 | |||
784 | return err; | ||
785 | } | ||
786 | |||
787 | |||
788 | void alx_post_phy_link(struct alx_hw *hw) | ||
789 | { | ||
790 | u16 phy_val, len, agc; | ||
791 | u8 revid = alx_hw_revision(hw); | ||
792 | bool adj_th = revid == ALX_REV_B0; | ||
793 | int speed; | ||
794 | |||
795 | if (hw->link_speed == SPEED_UNKNOWN) | ||
796 | speed = SPEED_UNKNOWN; | ||
797 | else | ||
798 | speed = hw->link_speed - hw->link_speed % 10; | ||
799 | |||
800 | if (revid != ALX_REV_B0 && !alx_is_rev_a(revid)) | ||
801 | return; | ||
802 | |||
803 | /* 1000BT/AZ, wrong cable length */ | ||
804 | if (speed != SPEED_UNKNOWN) { | ||
805 | alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL6, | ||
806 | &phy_val); | ||
807 | len = ALX_GET_FIELD(phy_val, ALX_CLDCTRL6_CAB_LEN); | ||
808 | alx_read_phy_dbg(hw, ALX_MIIDBG_AGC, &phy_val); | ||
809 | agc = ALX_GET_FIELD(phy_val, ALX_AGC_2_VGA); | ||
810 | |||
811 | if ((speed == SPEED_1000 && | ||
812 | (len > ALX_CLDCTRL6_CAB_LEN_SHORT1G || | ||
813 | (len == 0 && agc > ALX_AGC_LONG1G_LIMT))) || | ||
814 | (speed == SPEED_100 && | ||
815 | (len > ALX_CLDCTRL6_CAB_LEN_SHORT100M || | ||
816 | (len == 0 && agc > ALX_AGC_LONG100M_LIMT)))) { | ||
817 | alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT, | ||
818 | ALX_AZ_ANADECT_LONG); | ||
819 | alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, | ||
820 | &phy_val); | ||
821 | alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, | ||
822 | phy_val | ALX_AFE_10BT_100M_TH); | ||
823 | } else { | ||
824 | alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT, | ||
825 | ALX_AZ_ANADECT_DEF); | ||
826 | alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, | ||
827 | ALX_MIIEXT_AFE, &phy_val); | ||
828 | alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, | ||
829 | phy_val & ~ALX_AFE_10BT_100M_TH); | ||
830 | } | ||
831 | |||
832 | /* threshold adjust */ | ||
833 | if (adj_th && hw->lnk_patch) { | ||
834 | if (speed == SPEED_100) { | ||
835 | alx_write_phy_dbg(hw, ALX_MIIDBG_MSE16DB, | ||
836 | ALX_MSE16DB_UP); | ||
837 | } else if (speed == SPEED_1000) { | ||
838 | /* | ||
839 | * Giga link threshold, raise the tolerance of | ||
840 | * noise 50% | ||
841 | */ | ||
842 | alx_read_phy_dbg(hw, ALX_MIIDBG_MSE20DB, | ||
843 | &phy_val); | ||
844 | ALX_SET_FIELD(phy_val, ALX_MSE20DB_TH, | ||
845 | ALX_MSE20DB_TH_HI); | ||
846 | alx_write_phy_dbg(hw, ALX_MIIDBG_MSE20DB, | ||
847 | phy_val); | ||
848 | } | ||
849 | } | ||
850 | } else { | ||
851 | alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, | ||
852 | &phy_val); | ||
853 | alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, | ||
854 | phy_val & ~ALX_AFE_10BT_100M_TH); | ||
855 | |||
856 | if (adj_th && hw->lnk_patch) { | ||
857 | alx_write_phy_dbg(hw, ALX_MIIDBG_MSE16DB, | ||
858 | ALX_MSE16DB_DOWN); | ||
859 | alx_read_phy_dbg(hw, ALX_MIIDBG_MSE20DB, &phy_val); | ||
860 | ALX_SET_FIELD(phy_val, ALX_MSE20DB_TH, | ||
861 | ALX_MSE20DB_TH_DEF); | ||
862 | alx_write_phy_dbg(hw, ALX_MIIDBG_MSE20DB, phy_val); | ||
863 | } | ||
864 | } | ||
865 | } | ||
866 | |||
867 | |||
868 | /* NOTE: | ||
869 | * 1. phy link must be established before calling this function | ||
870 | * 2. wol option (pattern,magic,link,etc.) is configed before call it. | ||
871 | */ | ||
872 | int alx_pre_suspend(struct alx_hw *hw, int speed) | ||
873 | { | ||
874 | u32 master, mac, phy, val; | ||
875 | int err = 0; | ||
876 | |||
877 | master = alx_read_mem32(hw, ALX_MASTER); | ||
878 | master &= ~ALX_MASTER_PCLKSEL_SRDS; | ||
879 | mac = hw->rx_ctrl; | ||
880 | /* 10/100 half */ | ||
881 | ALX_SET_FIELD(mac, ALX_MAC_CTRL_SPEED, ALX_MAC_CTRL_SPEED_10_100); | ||
882 | mac &= ~(ALX_MAC_CTRL_FULLD | ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_TX_EN); | ||
883 | |||
884 | phy = alx_read_mem32(hw, ALX_PHY_CTRL); | ||
885 | phy &= ~(ALX_PHY_CTRL_DSPRST_OUT | ALX_PHY_CTRL_CLS); | ||
886 | phy |= ALX_PHY_CTRL_RST_ANALOG | ALX_PHY_CTRL_HIB_PULSE | | ||
887 | ALX_PHY_CTRL_HIB_EN; | ||
888 | |||
889 | /* without any activity */ | ||
890 | if (!(hw->sleep_ctrl & ALX_SLEEP_ACTIVE)) { | ||
891 | err = alx_write_phy_reg(hw, ALX_MII_IER, 0); | ||
892 | if (err) | ||
893 | return err; | ||
894 | phy |= ALX_PHY_CTRL_IDDQ | ALX_PHY_CTRL_POWER_DOWN; | ||
895 | } else { | ||
896 | if (hw->sleep_ctrl & (ALX_SLEEP_WOL_MAGIC | ALX_SLEEP_CIFS)) | ||
897 | mac |= ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_BRD_EN; | ||
898 | if (hw->sleep_ctrl & ALX_SLEEP_CIFS) | ||
899 | mac |= ALX_MAC_CTRL_TX_EN; | ||
900 | if (speed % 10 == DUPLEX_FULL) | ||
901 | mac |= ALX_MAC_CTRL_FULLD; | ||
902 | if (speed >= SPEED_1000) | ||
903 | ALX_SET_FIELD(mac, ALX_MAC_CTRL_SPEED, | ||
904 | ALX_MAC_CTRL_SPEED_1000); | ||
905 | phy |= ALX_PHY_CTRL_DSPRST_OUT; | ||
906 | err = alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, | ||
907 | ALX_MIIEXT_S3DIG10, | ||
908 | ALX_MIIEXT_S3DIG10_SL); | ||
909 | if (err) | ||
910 | return err; | ||
911 | } | ||
912 | |||
913 | alx_enable_osc(hw); | ||
914 | hw->rx_ctrl = mac; | ||
915 | alx_write_mem32(hw, ALX_MASTER, master); | ||
916 | alx_write_mem32(hw, ALX_MAC_CTRL, mac); | ||
917 | alx_write_mem32(hw, ALX_PHY_CTRL, phy); | ||
918 | |||
919 | /* set val of PDLL D3PLLOFF */ | ||
920 | val = alx_read_mem32(hw, ALX_PDLL_TRNS1); | ||
921 | val |= ALX_PDLL_TRNS1_D3PLLOFF_EN; | ||
922 | alx_write_mem32(hw, ALX_PDLL_TRNS1, val); | ||
923 | |||
924 | return 0; | ||
925 | } | ||
926 | |||
927 | bool alx_phy_configured(struct alx_hw *hw) | ||
928 | { | ||
929 | u32 cfg, hw_cfg; | ||
930 | |||
931 | cfg = ethadv_to_hw_cfg(hw, hw->adv_cfg); | ||
932 | cfg = ALX_GET_FIELD(cfg, ALX_DRV_PHY); | ||
933 | hw_cfg = alx_get_phy_config(hw); | ||
934 | |||
935 | if (hw_cfg == ALX_DRV_PHY_UNKNOWN) | ||
936 | return false; | ||
937 | |||
938 | return cfg == hw_cfg; | ||
939 | } | ||
940 | |||
941 | int alx_get_phy_link(struct alx_hw *hw, int *speed) | ||
942 | { | ||
943 | struct pci_dev *pdev = hw->pdev; | ||
944 | u16 bmsr, giga; | ||
945 | int err; | ||
946 | |||
947 | err = alx_read_phy_reg(hw, MII_BMSR, &bmsr); | ||
948 | if (err) | ||
949 | return err; | ||
950 | |||
951 | err = alx_read_phy_reg(hw, MII_BMSR, &bmsr); | ||
952 | if (err) | ||
953 | return err; | ||
954 | |||
955 | if (!(bmsr & BMSR_LSTATUS)) { | ||
956 | *speed = SPEED_UNKNOWN; | ||
957 | return 0; | ||
958 | } | ||
959 | |||
960 | /* speed/duplex result is saved in PHY Specific Status Register */ | ||
961 | err = alx_read_phy_reg(hw, ALX_MII_GIGA_PSSR, &giga); | ||
962 | if (err) | ||
963 | return err; | ||
964 | |||
965 | if (!(giga & ALX_GIGA_PSSR_SPD_DPLX_RESOLVED)) | ||
966 | goto wrong_speed; | ||
967 | |||
968 | switch (giga & ALX_GIGA_PSSR_SPEED) { | ||
969 | case ALX_GIGA_PSSR_1000MBS: | ||
970 | *speed = SPEED_1000; | ||
971 | break; | ||
972 | case ALX_GIGA_PSSR_100MBS: | ||
973 | *speed = SPEED_100; | ||
974 | break; | ||
975 | case ALX_GIGA_PSSR_10MBS: | ||
976 | *speed = SPEED_10; | ||
977 | break; | ||
978 | default: | ||
979 | goto wrong_speed; | ||
980 | } | ||
981 | |||
982 | *speed += (giga & ALX_GIGA_PSSR_DPLX) ? DUPLEX_FULL : DUPLEX_HALF; | ||
983 | return 1; | ||
984 | |||
985 | wrong_speed: | ||
986 | dev_err(&pdev->dev, "invalid PHY speed/duplex: 0x%x\n", giga); | ||
987 | return -EINVAL; | ||
988 | } | ||
989 | |||
990 | int alx_clear_phy_intr(struct alx_hw *hw) | ||
991 | { | ||
992 | u16 isr; | ||
993 | |||
994 | /* clear interrupt status by reading it */ | ||
995 | return alx_read_phy_reg(hw, ALX_MII_ISR, &isr); | ||
996 | } | ||
997 | |||
998 | int alx_config_wol(struct alx_hw *hw) | ||
999 | { | ||
1000 | u32 wol = 0; | ||
1001 | int err = 0; | ||
1002 | |||
1003 | /* turn on magic packet event */ | ||
1004 | if (hw->sleep_ctrl & ALX_SLEEP_WOL_MAGIC) | ||
1005 | wol |= ALX_WOL0_MAGIC_EN | ALX_WOL0_PME_MAGIC_EN; | ||
1006 | |||
1007 | /* turn on link up event */ | ||
1008 | if (hw->sleep_ctrl & ALX_SLEEP_WOL_PHY) { | ||
1009 | wol |= ALX_WOL0_LINK_EN | ALX_WOL0_PME_LINK; | ||
1010 | /* only link up can wake up */ | ||
1011 | err = alx_write_phy_reg(hw, ALX_MII_IER, ALX_IER_LINK_UP); | ||
1012 | } | ||
1013 | alx_write_mem32(hw, ALX_WOL0, wol); | ||
1014 | |||
1015 | return err; | ||
1016 | } | ||
1017 | |||
1018 | void alx_disable_rss(struct alx_hw *hw) | ||
1019 | { | ||
1020 | u32 ctrl = alx_read_mem32(hw, ALX_RXQ0); | ||
1021 | |||
1022 | ctrl &= ~ALX_RXQ0_RSS_HASH_EN; | ||
1023 | alx_write_mem32(hw, ALX_RXQ0, ctrl); | ||
1024 | } | ||
1025 | |||
1026 | void alx_configure_basic(struct alx_hw *hw) | ||
1027 | { | ||
1028 | u32 val, raw_mtu, max_payload; | ||
1029 | u16 val16; | ||
1030 | u8 chip_rev = alx_hw_revision(hw); | ||
1031 | |||
1032 | alx_set_macaddr(hw, hw->mac_addr); | ||
1033 | |||
1034 | alx_write_mem32(hw, ALX_CLK_GATE, ALX_CLK_GATE_ALL); | ||
1035 | |||
1036 | /* idle timeout to switch clk_125M */ | ||
1037 | if (chip_rev >= ALX_REV_B0) | ||
1038 | alx_write_mem32(hw, ALX_IDLE_DECISN_TIMER, | ||
1039 | ALX_IDLE_DECISN_TIMER_DEF); | ||
1040 | |||
1041 | alx_write_mem32(hw, ALX_SMB_TIMER, hw->smb_timer * 500UL); | ||
1042 | |||
1043 | val = alx_read_mem32(hw, ALX_MASTER); | ||
1044 | val |= ALX_MASTER_IRQMOD2_EN | | ||
1045 | ALX_MASTER_IRQMOD1_EN | | ||
1046 | ALX_MASTER_SYSALVTIMER_EN; | ||
1047 | alx_write_mem32(hw, ALX_MASTER, val); | ||
1048 | alx_write_mem32(hw, ALX_IRQ_MODU_TIMER, | ||
1049 | (hw->imt >> 1) << ALX_IRQ_MODU_TIMER1_SHIFT); | ||
1050 | /* intr re-trig timeout */ | ||
1051 | alx_write_mem32(hw, ALX_INT_RETRIG, ALX_INT_RETRIG_TO); | ||
1052 | /* tpd threshold to trig int */ | ||
1053 | alx_write_mem32(hw, ALX_TINT_TPD_THRSHLD, hw->ith_tpd); | ||
1054 | alx_write_mem32(hw, ALX_TINT_TIMER, hw->imt); | ||
1055 | |||
1056 | raw_mtu = hw->mtu + ETH_HLEN; | ||
1057 | alx_write_mem32(hw, ALX_MTU, raw_mtu + 8); | ||
1058 | if (raw_mtu > ALX_MTU_JUMBO_TH) | ||
1059 | hw->rx_ctrl &= ~ALX_MAC_CTRL_FAST_PAUSE; | ||
1060 | |||
1061 | if ((raw_mtu + 8) < ALX_TXQ1_JUMBO_TSO_TH) | ||
1062 | val = (raw_mtu + 8 + 7) >> 3; | ||
1063 | else | ||
1064 | val = ALX_TXQ1_JUMBO_TSO_TH >> 3; | ||
1065 | alx_write_mem32(hw, ALX_TXQ1, val | ALX_TXQ1_ERRLGPKT_DROP_EN); | ||
1066 | |||
1067 | max_payload = pcie_get_readrq(hw->pdev) >> 8; | ||
1068 | /* | ||
1069 | * if BIOS had changed the default dma read max length, | ||
1070 | * restore it to default value | ||
1071 | */ | ||
1072 | if (max_payload < ALX_DEV_CTRL_MAXRRS_MIN) | ||
1073 | pcie_set_readrq(hw->pdev, 128 << ALX_DEV_CTRL_MAXRRS_MIN); | ||
1074 | |||
1075 | val = ALX_TXQ_TPD_BURSTPREF_DEF << ALX_TXQ0_TPD_BURSTPREF_SHIFT | | ||
1076 | ALX_TXQ0_MODE_ENHANCE | ALX_TXQ0_LSO_8023_EN | | ||
1077 | ALX_TXQ0_SUPT_IPOPT | | ||
1078 | ALX_TXQ_TXF_BURST_PREF_DEF << ALX_TXQ0_TXF_BURST_PREF_SHIFT; | ||
1079 | alx_write_mem32(hw, ALX_TXQ0, val); | ||
1080 | val = ALX_TXQ_TPD_BURSTPREF_DEF << ALX_HQTPD_Q1_NUMPREF_SHIFT | | ||
1081 | ALX_TXQ_TPD_BURSTPREF_DEF << ALX_HQTPD_Q2_NUMPREF_SHIFT | | ||
1082 | ALX_TXQ_TPD_BURSTPREF_DEF << ALX_HQTPD_Q3_NUMPREF_SHIFT | | ||
1083 | ALX_HQTPD_BURST_EN; | ||
1084 | alx_write_mem32(hw, ALX_HQTPD, val); | ||
1085 | |||
1086 | /* rxq, flow control */ | ||
1087 | val = alx_read_mem32(hw, ALX_SRAM5); | ||
1088 | val = ALX_GET_FIELD(val, ALX_SRAM_RXF_LEN) << 3; | ||
1089 | if (val > ALX_SRAM_RXF_LEN_8K) { | ||
1090 | val16 = ALX_MTU_STD_ALGN >> 3; | ||
1091 | val = (val - ALX_RXQ2_RXF_FLOW_CTRL_RSVD) >> 3; | ||
1092 | } else { | ||
1093 | val16 = ALX_MTU_STD_ALGN >> 3; | ||
1094 | val = (val - ALX_MTU_STD_ALGN) >> 3; | ||
1095 | } | ||
1096 | alx_write_mem32(hw, ALX_RXQ2, | ||
1097 | val16 << ALX_RXQ2_RXF_XOFF_THRESH_SHIFT | | ||
1098 | val << ALX_RXQ2_RXF_XON_THRESH_SHIFT); | ||
1099 | val = ALX_RXQ0_NUM_RFD_PREF_DEF << ALX_RXQ0_NUM_RFD_PREF_SHIFT | | ||
1100 | ALX_RXQ0_RSS_MODE_DIS << ALX_RXQ0_RSS_MODE_SHIFT | | ||
1101 | ALX_RXQ0_IDT_TBL_SIZE_DEF << ALX_RXQ0_IDT_TBL_SIZE_SHIFT | | ||
1102 | ALX_RXQ0_RSS_HSTYP_ALL | ALX_RXQ0_RSS_HASH_EN | | ||
1103 | ALX_RXQ0_IPV6_PARSE_EN; | ||
1104 | |||
1105 | if (alx_hw_giga(hw)) | ||
1106 | ALX_SET_FIELD(val, ALX_RXQ0_ASPM_THRESH, | ||
1107 | ALX_RXQ0_ASPM_THRESH_100M); | ||
1108 | |||
1109 | alx_write_mem32(hw, ALX_RXQ0, val); | ||
1110 | |||
1111 | val = alx_read_mem32(hw, ALX_DMA); | ||
1112 | val = ALX_DMA_RORDER_MODE_OUT << ALX_DMA_RORDER_MODE_SHIFT | | ||
1113 | ALX_DMA_RREQ_PRI_DATA | | ||
1114 | max_payload << ALX_DMA_RREQ_BLEN_SHIFT | | ||
1115 | ALX_DMA_WDLY_CNT_DEF << ALX_DMA_WDLY_CNT_SHIFT | | ||
1116 | ALX_DMA_RDLY_CNT_DEF << ALX_DMA_RDLY_CNT_SHIFT | | ||
1117 | (hw->dma_chnl - 1) << ALX_DMA_RCHNL_SEL_SHIFT; | ||
1118 | alx_write_mem32(hw, ALX_DMA, val); | ||
1119 | |||
1120 | /* default multi-tx-q weights */ | ||
1121 | val = ALX_WRR_PRI_RESTRICT_NONE << ALX_WRR_PRI_SHIFT | | ||
1122 | 4 << ALX_WRR_PRI0_SHIFT | | ||
1123 | 4 << ALX_WRR_PRI1_SHIFT | | ||
1124 | 4 << ALX_WRR_PRI2_SHIFT | | ||
1125 | 4 << ALX_WRR_PRI3_SHIFT; | ||
1126 | alx_write_mem32(hw, ALX_WRR, val); | ||
1127 | } | ||
1128 | |||
1129 | static inline u32 alx_speed_to_ethadv(int speed) | ||
1130 | { | ||
1131 | switch (speed) { | ||
1132 | case SPEED_1000 + DUPLEX_FULL: | ||
1133 | return ADVERTISED_1000baseT_Full; | ||
1134 | case SPEED_100 + DUPLEX_FULL: | ||
1135 | return ADVERTISED_100baseT_Full; | ||
1136 | case SPEED_100 + DUPLEX_HALF: | ||
1137 | return ADVERTISED_10baseT_Half; | ||
1138 | case SPEED_10 + DUPLEX_FULL: | ||
1139 | return ADVERTISED_10baseT_Full; | ||
1140 | case SPEED_10 + DUPLEX_HALF: | ||
1141 | return ADVERTISED_10baseT_Half; | ||
1142 | default: | ||
1143 | return 0; | ||
1144 | } | ||
1145 | } | ||
1146 | |||
1147 | int alx_select_powersaving_speed(struct alx_hw *hw, int *speed) | ||
1148 | { | ||
1149 | int i, err, spd; | ||
1150 | u16 lpa; | ||
1151 | |||
1152 | err = alx_get_phy_link(hw, &spd); | ||
1153 | if (err < 0) | ||
1154 | return err; | ||
1155 | |||
1156 | if (spd == SPEED_UNKNOWN) | ||
1157 | return 0; | ||
1158 | |||
1159 | err = alx_read_phy_reg(hw, MII_LPA, &lpa); | ||
1160 | if (err) | ||
1161 | return err; | ||
1162 | |||
1163 | if (!(lpa & LPA_LPACK)) { | ||
1164 | *speed = spd; | ||
1165 | return 0; | ||
1166 | } | ||
1167 | |||
1168 | if (lpa & LPA_10FULL) | ||
1169 | *speed = SPEED_10 + DUPLEX_FULL; | ||
1170 | else if (lpa & LPA_10HALF) | ||
1171 | *speed = SPEED_10 + DUPLEX_HALF; | ||
1172 | else if (lpa & LPA_100FULL) | ||
1173 | *speed = SPEED_100 + DUPLEX_FULL; | ||
1174 | else | ||
1175 | *speed = SPEED_100 + DUPLEX_HALF; | ||
1176 | |||
1177 | if (*speed != spd) { | ||
1178 | err = alx_write_phy_reg(hw, ALX_MII_IER, 0); | ||
1179 | if (err) | ||
1180 | return err; | ||
1181 | err = alx_setup_speed_duplex(hw, | ||
1182 | alx_speed_to_ethadv(*speed) | | ||
1183 | ADVERTISED_Autoneg, | ||
1184 | ALX_FC_ANEG | ALX_FC_RX | | ||
1185 | ALX_FC_TX); | ||
1186 | if (err) | ||
1187 | return err; | ||
1188 | |||
1189 | /* wait for linkup */ | ||
1190 | for (i = 0; i < ALX_MAX_SETUP_LNK_CYCLE; i++) { | ||
1191 | int speed2; | ||
1192 | |||
1193 | msleep(100); | ||
1194 | |||
1195 | err = alx_get_phy_link(hw, &speed2); | ||
1196 | if (err < 0) | ||
1197 | return err; | ||
1198 | if (speed2 != SPEED_UNKNOWN) | ||
1199 | break; | ||
1200 | } | ||
1201 | if (i == ALX_MAX_SETUP_LNK_CYCLE) | ||
1202 | return -ETIMEDOUT; | ||
1203 | } | ||
1204 | |||
1205 | return 0; | ||
1206 | } | ||
1207 | |||
1208 | bool alx_get_phy_info(struct alx_hw *hw) | ||
1209 | { | ||
1210 | u16 devs1, devs2; | ||
1211 | |||
1212 | if (alx_read_phy_reg(hw, MII_PHYSID1, &hw->phy_id[0]) || | ||
1213 | alx_read_phy_reg(hw, MII_PHYSID2, &hw->phy_id[1])) | ||
1214 | return false; | ||
1215 | |||
1216 | /* since we haven't PMA/PMD status2 register, we can't | ||
1217 | * use mdio45_probe function for prtad and mmds. | ||
1218 | * use fixed MMD3 to get mmds. | ||
1219 | */ | ||
1220 | if (alx_read_phy_ext(hw, 3, MDIO_DEVS1, &devs1) || | ||
1221 | alx_read_phy_ext(hw, 3, MDIO_DEVS2, &devs2)) | ||
1222 | return false; | ||
1223 | hw->mdio.mmds = devs1 | devs2 << 16; | ||
1224 | |||
1225 | return true; | ||
1226 | } | ||
diff --git a/drivers/net/ethernet/atheros/alx/hw.h b/drivers/net/ethernet/atheros/alx/hw.h new file mode 100644 index 000000000000..65e723d2172a --- /dev/null +++ b/drivers/net/ethernet/atheros/alx/hw.h | |||
@@ -0,0 +1,499 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013 Johannes Berg <johannes@sipsolutions.net> | ||
3 | * | ||
4 | * This file is free software: you may copy, redistribute and/or modify it | ||
5 | * under the terms of the GNU General Public License as published by the | ||
6 | * Free Software Foundation, either version 2 of the License, or (at your | ||
7 | * option) any later version. | ||
8 | * | ||
9 | * This file is distributed in the hope that it will be useful, but | ||
10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | * General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | * | ||
17 | * This file incorporates work covered by the following copyright and | ||
18 | * permission notice: | ||
19 | * | ||
20 | * Copyright (c) 2012 Qualcomm Atheros, Inc. | ||
21 | * | ||
22 | * Permission to use, copy, modify, and/or distribute this software for any | ||
23 | * purpose with or without fee is hereby granted, provided that the above | ||
24 | * copyright notice and this permission notice appear in all copies. | ||
25 | * | ||
26 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
27 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
28 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
29 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
30 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
31 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
32 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
33 | */ | ||
34 | |||
35 | #ifndef ALX_HW_H_ | ||
36 | #define ALX_HW_H_ | ||
37 | #include <linux/types.h> | ||
38 | #include <linux/mdio.h> | ||
39 | #include <linux/pci.h> | ||
40 | #include "reg.h" | ||
41 | |||
42 | /* Transmit Packet Descriptor, contains 4 32-bit words. | ||
43 | * | ||
44 | * 31 16 0 | ||
45 | * +----------------+----------------+ | ||
46 | * | vlan-tag | buf length | | ||
47 | * +----------------+----------------+ | ||
48 | * | Word 1 | | ||
49 | * +----------------+----------------+ | ||
50 | * | Word 2: buf addr lo | | ||
51 | * +----------------+----------------+ | ||
52 | * | Word 3: buf addr hi | | ||
53 | * +----------------+----------------+ | ||
54 | * | ||
55 | * Word 2 and 3 combine to form a 64-bit buffer address | ||
56 | * | ||
57 | * Word 1 has three forms, depending on the state of bit 8/12/13: | ||
58 | * if bit8 =='1', the definition is just for custom checksum offload. | ||
59 | * if bit8 == '0' && bit12 == '1' && bit13 == '1', the *FIRST* descriptor | ||
60 | * for the skb is special for LSO V2, Word 2 become total skb length , | ||
61 | * Word 3 is meaningless. | ||
62 | * other condition, the definition is for general skb or ip/tcp/udp | ||
63 | * checksum or LSO(TSO) offload. | ||
64 | * | ||
65 | * Here is the depiction: | ||
66 | * | ||
67 | * 0-+ 0-+ | ||
68 | * 1 | 1 | | ||
69 | * 2 | 2 | | ||
70 | * 3 | Payload offset 3 | L4 header offset | ||
71 | * 4 | (7:0) 4 | (7:0) | ||
72 | * 5 | 5 | | ||
73 | * 6 | 6 | | ||
74 | * 7-+ 7-+ | ||
75 | * 8 Custom csum enable = 1 8 Custom csum enable = 0 | ||
76 | * 9 General IPv4 checksum 9 General IPv4 checksum | ||
77 | * 10 General TCP checksum 10 General TCP checksum | ||
78 | * 11 General UDP checksum 11 General UDP checksum | ||
79 | * 12 Large Send Segment enable 12 Large Send Segment enable | ||
80 | * 13 Large Send Segment type 13 Large Send Segment type | ||
81 | * 14 VLAN tagged 14 VLAN tagged | ||
82 | * 15 Insert VLAN tag 15 Insert VLAN tag | ||
83 | * 16 IPv4 packet 16 IPv4 packet | ||
84 | * 17 Ethernet frame type 17 Ethernet frame type | ||
85 | * 18-+ 18-+ | ||
86 | * 19 | 19 | | ||
87 | * 20 | 20 | | ||
88 | * 21 | Custom csum offset 21 | | ||
89 | * 22 | (25:18) 22 | | ||
90 | * 23 | 23 | MSS (30:18) | ||
91 | * 24 | 24 | | ||
92 | * 25-+ 25 | | ||
93 | * 26-+ 26 | | ||
94 | * 27 | 27 | | ||
95 | * 28 | Reserved 28 | | ||
96 | * 29 | 29 | | ||
97 | * 30-+ 30-+ | ||
98 | * 31 End of packet 31 End of packet | ||
99 | */ | ||
100 | struct alx_txd { | ||
101 | __le16 len; | ||
102 | __le16 vlan_tag; | ||
103 | __le32 word1; | ||
104 | union { | ||
105 | __le64 addr; | ||
106 | struct { | ||
107 | __le32 pkt_len; | ||
108 | __le32 resvd; | ||
109 | } l; | ||
110 | } adrl; | ||
111 | } __packed; | ||
112 | |||
113 | /* tpd word 1 */ | ||
114 | #define TPD_CXSUMSTART_MASK 0x00FF | ||
115 | #define TPD_CXSUMSTART_SHIFT 0 | ||
116 | #define TPD_L4HDROFFSET_MASK 0x00FF | ||
117 | #define TPD_L4HDROFFSET_SHIFT 0 | ||
118 | #define TPD_CXSUM_EN_MASK 0x0001 | ||
119 | #define TPD_CXSUM_EN_SHIFT 8 | ||
120 | #define TPD_IP_XSUM_MASK 0x0001 | ||
121 | #define TPD_IP_XSUM_SHIFT 9 | ||
122 | #define TPD_TCP_XSUM_MASK 0x0001 | ||
123 | #define TPD_TCP_XSUM_SHIFT 10 | ||
124 | #define TPD_UDP_XSUM_MASK 0x0001 | ||
125 | #define TPD_UDP_XSUM_SHIFT 11 | ||
126 | #define TPD_LSO_EN_MASK 0x0001 | ||
127 | #define TPD_LSO_EN_SHIFT 12 | ||
128 | #define TPD_LSO_V2_MASK 0x0001 | ||
129 | #define TPD_LSO_V2_SHIFT 13 | ||
130 | #define TPD_VLTAGGED_MASK 0x0001 | ||
131 | #define TPD_VLTAGGED_SHIFT 14 | ||
132 | #define TPD_INS_VLTAG_MASK 0x0001 | ||
133 | #define TPD_INS_VLTAG_SHIFT 15 | ||
134 | #define TPD_IPV4_MASK 0x0001 | ||
135 | #define TPD_IPV4_SHIFT 16 | ||
136 | #define TPD_ETHTYPE_MASK 0x0001 | ||
137 | #define TPD_ETHTYPE_SHIFT 17 | ||
138 | #define TPD_CXSUMOFFSET_MASK 0x00FF | ||
139 | #define TPD_CXSUMOFFSET_SHIFT 18 | ||
140 | #define TPD_MSS_MASK 0x1FFF | ||
141 | #define TPD_MSS_SHIFT 18 | ||
142 | #define TPD_EOP_MASK 0x0001 | ||
143 | #define TPD_EOP_SHIFT 31 | ||
144 | |||
145 | #define DESC_GET(_x, _name) ((_x) >> _name##SHIFT & _name##MASK) | ||
146 | |||
147 | /* Receive Free Descriptor */ | ||
148 | struct alx_rfd { | ||
149 | __le64 addr; /* data buffer address, length is | ||
150 | * declared in register --- every | ||
151 | * buffer has the same size | ||
152 | */ | ||
153 | } __packed; | ||
154 | |||
155 | /* Receive Return Descriptor, contains 4 32-bit words. | ||
156 | * | ||
157 | * 31 16 0 | ||
158 | * +----------------+----------------+ | ||
159 | * | Word 0 | | ||
160 | * +----------------+----------------+ | ||
161 | * | Word 1: RSS Hash value | | ||
162 | * +----------------+----------------+ | ||
163 | * | Word 2 | | ||
164 | * +----------------+----------------+ | ||
165 | * | Word 3 | | ||
166 | * +----------------+----------------+ | ||
167 | * | ||
168 | * Word 0 depiction & Word 2 depiction: | ||
169 | * | ||
170 | * 0--+ 0--+ | ||
171 | * 1 | 1 | | ||
172 | * 2 | 2 | | ||
173 | * 3 | 3 | | ||
174 | * 4 | 4 | | ||
175 | * 5 | 5 | | ||
176 | * 6 | 6 | | ||
177 | * 7 | IP payload checksum 7 | VLAN tag | ||
178 | * 8 | (15:0) 8 | (15:0) | ||
179 | * 9 | 9 | | ||
180 | * 10 | 10 | | ||
181 | * 11 | 11 | | ||
182 | * 12 | 12 | | ||
183 | * 13 | 13 | | ||
184 | * 14 | 14 | | ||
185 | * 15-+ 15-+ | ||
186 | * 16-+ 16-+ | ||
187 | * 17 | Number of RFDs 17 | | ||
188 | * 18 | (19:16) 18 | | ||
189 | * 19-+ 19 | Protocol ID | ||
190 | * 20-+ 20 | (23:16) | ||
191 | * 21 | 21 | | ||
192 | * 22 | 22 | | ||
193 | * 23 | 23-+ | ||
194 | * 24 | 24 | Reserved | ||
195 | * 25 | Start index of RFD-ring 25-+ | ||
196 | * 26 | (31:20) 26 | RSS Q-num (27:25) | ||
197 | * 27 | 27-+ | ||
198 | * 28 | 28-+ | ||
199 | * 29 | 29 | RSS Hash algorithm | ||
200 | * 30 | 30 | (31:28) | ||
201 | * 31-+ 31-+ | ||
202 | * | ||
203 | * Word 3 depiction: | ||
204 | * | ||
205 | * 0--+ | ||
206 | * 1 | | ||
207 | * 2 | | ||
208 | * 3 | | ||
209 | * 4 | | ||
210 | * 5 | | ||
211 | * 6 | | ||
212 | * 7 | Packet length (include FCS) | ||
213 | * 8 | (13:0) | ||
214 | * 9 | | ||
215 | * 10 | | ||
216 | * 11 | | ||
217 | * 12 | | ||
218 | * 13-+ | ||
219 | * 14 L4 Header checksum error | ||
220 | * 15 IPv4 checksum error | ||
221 | * 16 VLAN tagged | ||
222 | * 17-+ | ||
223 | * 18 | Protocol ID (19:17) | ||
224 | * 19-+ | ||
225 | * 20 Receive error summary | ||
226 | * 21 FCS(CRC) error | ||
227 | * 22 Frame alignment error | ||
228 | * 23 Truncated packet | ||
229 | * 24 Runt packet | ||
230 | * 25 Incomplete packet due to insufficient rx-desc | ||
231 | * 26 Broadcast packet | ||
232 | * 27 Multicast packet | ||
233 | * 28 Ethernet type (EII or 802.3) | ||
234 | * 29 FIFO overflow | ||
235 | * 30 Length error (for 802.3, length field mismatch with actual len) | ||
236 | * 31 Updated, indicate to driver that this RRD is refreshed. | ||
237 | */ | ||
238 | struct alx_rrd { | ||
239 | __le32 word0; | ||
240 | __le32 rss_hash; | ||
241 | __le32 word2; | ||
242 | __le32 word3; | ||
243 | } __packed; | ||
244 | |||
245 | /* rrd word 0 */ | ||
246 | #define RRD_XSUM_MASK 0xFFFF | ||
247 | #define RRD_XSUM_SHIFT 0 | ||
248 | #define RRD_NOR_MASK 0x000F | ||
249 | #define RRD_NOR_SHIFT 16 | ||
250 | #define RRD_SI_MASK 0x0FFF | ||
251 | #define RRD_SI_SHIFT 20 | ||
252 | |||
253 | /* rrd word 2 */ | ||
254 | #define RRD_VLTAG_MASK 0xFFFF | ||
255 | #define RRD_VLTAG_SHIFT 0 | ||
256 | #define RRD_PID_MASK 0x00FF | ||
257 | #define RRD_PID_SHIFT 16 | ||
258 | /* non-ip packet */ | ||
259 | #define RRD_PID_NONIP 0 | ||
260 | /* ipv4(only) */ | ||
261 | #define RRD_PID_IPV4 1 | ||
262 | /* tcp/ipv6 */ | ||
263 | #define RRD_PID_IPV6TCP 2 | ||
264 | /* tcp/ipv4 */ | ||
265 | #define RRD_PID_IPV4TCP 3 | ||
266 | /* udp/ipv6 */ | ||
267 | #define RRD_PID_IPV6UDP 4 | ||
268 | /* udp/ipv4 */ | ||
269 | #define RRD_PID_IPV4UDP 5 | ||
270 | /* ipv6(only) */ | ||
271 | #define RRD_PID_IPV6 6 | ||
272 | /* LLDP packet */ | ||
273 | #define RRD_PID_LLDP 7 | ||
274 | /* 1588 packet */ | ||
275 | #define RRD_PID_1588 8 | ||
276 | #define RRD_RSSQ_MASK 0x0007 | ||
277 | #define RRD_RSSQ_SHIFT 25 | ||
278 | #define RRD_RSSALG_MASK 0x000F | ||
279 | #define RRD_RSSALG_SHIFT 28 | ||
280 | #define RRD_RSSALG_TCPV6 0x1 | ||
281 | #define RRD_RSSALG_IPV6 0x2 | ||
282 | #define RRD_RSSALG_TCPV4 0x4 | ||
283 | #define RRD_RSSALG_IPV4 0x8 | ||
284 | |||
285 | /* rrd word 3 */ | ||
286 | #define RRD_PKTLEN_MASK 0x3FFF | ||
287 | #define RRD_PKTLEN_SHIFT 0 | ||
288 | #define RRD_ERR_L4_MASK 0x0001 | ||
289 | #define RRD_ERR_L4_SHIFT 14 | ||
290 | #define RRD_ERR_IPV4_MASK 0x0001 | ||
291 | #define RRD_ERR_IPV4_SHIFT 15 | ||
292 | #define RRD_VLTAGGED_MASK 0x0001 | ||
293 | #define RRD_VLTAGGED_SHIFT 16 | ||
294 | #define RRD_OLD_PID_MASK 0x0007 | ||
295 | #define RRD_OLD_PID_SHIFT 17 | ||
296 | #define RRD_ERR_RES_MASK 0x0001 | ||
297 | #define RRD_ERR_RES_SHIFT 20 | ||
298 | #define RRD_ERR_FCS_MASK 0x0001 | ||
299 | #define RRD_ERR_FCS_SHIFT 21 | ||
300 | #define RRD_ERR_FAE_MASK 0x0001 | ||
301 | #define RRD_ERR_FAE_SHIFT 22 | ||
302 | #define RRD_ERR_TRUNC_MASK 0x0001 | ||
303 | #define RRD_ERR_TRUNC_SHIFT 23 | ||
304 | #define RRD_ERR_RUNT_MASK 0x0001 | ||
305 | #define RRD_ERR_RUNT_SHIFT 24 | ||
306 | #define RRD_ERR_ICMP_MASK 0x0001 | ||
307 | #define RRD_ERR_ICMP_SHIFT 25 | ||
308 | #define RRD_BCAST_MASK 0x0001 | ||
309 | #define RRD_BCAST_SHIFT 26 | ||
310 | #define RRD_MCAST_MASK 0x0001 | ||
311 | #define RRD_MCAST_SHIFT 27 | ||
312 | #define RRD_ETHTYPE_MASK 0x0001 | ||
313 | #define RRD_ETHTYPE_SHIFT 28 | ||
314 | #define RRD_ERR_FIFOV_MASK 0x0001 | ||
315 | #define RRD_ERR_FIFOV_SHIFT 29 | ||
316 | #define RRD_ERR_LEN_MASK 0x0001 | ||
317 | #define RRD_ERR_LEN_SHIFT 30 | ||
318 | #define RRD_UPDATED_MASK 0x0001 | ||
319 | #define RRD_UPDATED_SHIFT 31 | ||
320 | |||
321 | |||
322 | #define ALX_MAX_SETUP_LNK_CYCLE 50 | ||
323 | |||
324 | /* for FlowControl */ | ||
325 | #define ALX_FC_RX 0x01 | ||
326 | #define ALX_FC_TX 0x02 | ||
327 | #define ALX_FC_ANEG 0x04 | ||
328 | |||
329 | /* for sleep control */ | ||
330 | #define ALX_SLEEP_WOL_PHY 0x00000001 | ||
331 | #define ALX_SLEEP_WOL_MAGIC 0x00000002 | ||
332 | #define ALX_SLEEP_CIFS 0x00000004 | ||
333 | #define ALX_SLEEP_ACTIVE (ALX_SLEEP_WOL_PHY | \ | ||
334 | ALX_SLEEP_WOL_MAGIC | \ | ||
335 | ALX_SLEEP_CIFS) | ||
336 | |||
337 | /* for RSS hash type */ | ||
338 | #define ALX_RSS_HASH_TYPE_IPV4 0x1 | ||
339 | #define ALX_RSS_HASH_TYPE_IPV4_TCP 0x2 | ||
340 | #define ALX_RSS_HASH_TYPE_IPV6 0x4 | ||
341 | #define ALX_RSS_HASH_TYPE_IPV6_TCP 0x8 | ||
342 | #define ALX_RSS_HASH_TYPE_ALL (ALX_RSS_HASH_TYPE_IPV4 | \ | ||
343 | ALX_RSS_HASH_TYPE_IPV4_TCP | \ | ||
344 | ALX_RSS_HASH_TYPE_IPV6 | \ | ||
345 | ALX_RSS_HASH_TYPE_IPV6_TCP) | ||
346 | #define ALX_DEF_RXBUF_SIZE 1536 | ||
347 | #define ALX_MAX_JUMBO_PKT_SIZE (9*1024) | ||
348 | #define ALX_MAX_TSO_PKT_SIZE (7*1024) | ||
349 | #define ALX_MAX_FRAME_SIZE ALX_MAX_JUMBO_PKT_SIZE | ||
350 | #define ALX_MIN_FRAME_SIZE 68 | ||
351 | #define ALX_RAW_MTU(_mtu) (_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN) | ||
352 | |||
353 | #define ALX_MAX_RX_QUEUES 8 | ||
354 | #define ALX_MAX_TX_QUEUES 4 | ||
355 | #define ALX_MAX_HANDLED_INTRS 5 | ||
356 | |||
357 | #define ALX_ISR_MISC (ALX_ISR_PCIE_LNKDOWN | \ | ||
358 | ALX_ISR_DMAW | \ | ||
359 | ALX_ISR_DMAR | \ | ||
360 | ALX_ISR_SMB | \ | ||
361 | ALX_ISR_MANU | \ | ||
362 | ALX_ISR_TIMER) | ||
363 | |||
364 | #define ALX_ISR_FATAL (ALX_ISR_PCIE_LNKDOWN | \ | ||
365 | ALX_ISR_DMAW | ALX_ISR_DMAR) | ||
366 | |||
367 | #define ALX_ISR_ALERT (ALX_ISR_RXF_OV | \ | ||
368 | ALX_ISR_TXF_UR | \ | ||
369 | ALX_ISR_RFD_UR) | ||
370 | |||
371 | #define ALX_ISR_ALL_QUEUES (ALX_ISR_TX_Q0 | \ | ||
372 | ALX_ISR_TX_Q1 | \ | ||
373 | ALX_ISR_TX_Q2 | \ | ||
374 | ALX_ISR_TX_Q3 | \ | ||
375 | ALX_ISR_RX_Q0 | \ | ||
376 | ALX_ISR_RX_Q1 | \ | ||
377 | ALX_ISR_RX_Q2 | \ | ||
378 | ALX_ISR_RX_Q3 | \ | ||
379 | ALX_ISR_RX_Q4 | \ | ||
380 | ALX_ISR_RX_Q5 | \ | ||
381 | ALX_ISR_RX_Q6 | \ | ||
382 | ALX_ISR_RX_Q7) | ||
383 | |||
384 | /* maximum interrupt vectors for msix */ | ||
385 | #define ALX_MAX_MSIX_INTRS 16 | ||
386 | |||
387 | #define ALX_GET_FIELD(_data, _field) \ | ||
388 | (((_data) >> _field ## _SHIFT) & _field ## _MASK) | ||
389 | |||
390 | #define ALX_SET_FIELD(_data, _field, _value) do { \ | ||
391 | (_data) &= ~(_field ## _MASK << _field ## _SHIFT); \ | ||
392 | (_data) |= ((_value) & _field ## _MASK) << _field ## _SHIFT;\ | ||
393 | } while (0) | ||
394 | |||
395 | struct alx_hw { | ||
396 | struct pci_dev *pdev; | ||
397 | u8 __iomem *hw_addr; | ||
398 | |||
399 | /* current & permanent mac addr */ | ||
400 | u8 mac_addr[ETH_ALEN]; | ||
401 | u8 perm_addr[ETH_ALEN]; | ||
402 | |||
403 | u16 mtu; | ||
404 | u16 imt; | ||
405 | u8 dma_chnl; | ||
406 | u8 max_dma_chnl; | ||
407 | /* tpd threshold to trig INT */ | ||
408 | u32 ith_tpd; | ||
409 | u32 rx_ctrl; | ||
410 | u32 mc_hash[2]; | ||
411 | |||
412 | u32 smb_timer; | ||
413 | /* SPEED_* + DUPLEX_*, SPEED_UNKNOWN if link is down */ | ||
414 | int link_speed; | ||
415 | |||
416 | /* auto-neg advertisement or force mode config */ | ||
417 | u32 adv_cfg; | ||
418 | u8 flowctrl; | ||
419 | |||
420 | u32 sleep_ctrl; | ||
421 | |||
422 | spinlock_t mdio_lock; | ||
423 | struct mdio_if_info mdio; | ||
424 | u16 phy_id[2]; | ||
425 | |||
426 | /* PHY link patch flag */ | ||
427 | bool lnk_patch; | ||
428 | }; | ||
429 | |||
430 | static inline int alx_hw_revision(struct alx_hw *hw) | ||
431 | { | ||
432 | return hw->pdev->revision >> ALX_PCI_REVID_SHIFT; | ||
433 | } | ||
434 | |||
435 | static inline bool alx_hw_with_cr(struct alx_hw *hw) | ||
436 | { | ||
437 | return hw->pdev->revision & 1; | ||
438 | } | ||
439 | |||
440 | static inline bool alx_hw_giga(struct alx_hw *hw) | ||
441 | { | ||
442 | return hw->pdev->device & 1; | ||
443 | } | ||
444 | |||
445 | static inline void alx_write_mem8(struct alx_hw *hw, u32 reg, u8 val) | ||
446 | { | ||
447 | writeb(val, hw->hw_addr + reg); | ||
448 | } | ||
449 | |||
450 | static inline void alx_write_mem16(struct alx_hw *hw, u32 reg, u16 val) | ||
451 | { | ||
452 | writew(val, hw->hw_addr + reg); | ||
453 | } | ||
454 | |||
455 | static inline u16 alx_read_mem16(struct alx_hw *hw, u32 reg) | ||
456 | { | ||
457 | return readw(hw->hw_addr + reg); | ||
458 | } | ||
459 | |||
460 | static inline void alx_write_mem32(struct alx_hw *hw, u32 reg, u32 val) | ||
461 | { | ||
462 | writel(val, hw->hw_addr + reg); | ||
463 | } | ||
464 | |||
465 | static inline u32 alx_read_mem32(struct alx_hw *hw, u32 reg) | ||
466 | { | ||
467 | return readl(hw->hw_addr + reg); | ||
468 | } | ||
469 | |||
470 | static inline void alx_post_write(struct alx_hw *hw) | ||
471 | { | ||
472 | readl(hw->hw_addr); | ||
473 | } | ||
474 | |||
475 | int alx_get_perm_macaddr(struct alx_hw *hw, u8 *addr); | ||
476 | void alx_reset_phy(struct alx_hw *hw); | ||
477 | void alx_reset_pcie(struct alx_hw *hw); | ||
478 | void alx_enable_aspm(struct alx_hw *hw, bool l0s_en, bool l1_en); | ||
479 | int alx_setup_speed_duplex(struct alx_hw *hw, u32 ethadv, u8 flowctrl); | ||
480 | void alx_post_phy_link(struct alx_hw *hw); | ||
481 | int alx_pre_suspend(struct alx_hw *hw, int speed); | ||
482 | int alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data); | ||
483 | int alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data); | ||
484 | int alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata); | ||
485 | int alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data); | ||
486 | int alx_get_phy_link(struct alx_hw *hw, int *speed); | ||
487 | int alx_clear_phy_intr(struct alx_hw *hw); | ||
488 | int alx_config_wol(struct alx_hw *hw); | ||
489 | void alx_cfg_mac_flowcontrol(struct alx_hw *hw, u8 fc); | ||
490 | void alx_start_mac(struct alx_hw *hw); | ||
491 | int alx_reset_mac(struct alx_hw *hw); | ||
492 | void alx_set_macaddr(struct alx_hw *hw, const u8 *addr); | ||
493 | bool alx_phy_configured(struct alx_hw *hw); | ||
494 | void alx_configure_basic(struct alx_hw *hw); | ||
495 | void alx_disable_rss(struct alx_hw *hw); | ||
496 | int alx_select_powersaving_speed(struct alx_hw *hw, int *speed); | ||
497 | bool alx_get_phy_info(struct alx_hw *hw); | ||
498 | |||
499 | #endif | ||
diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c new file mode 100644 index 000000000000..418de8b13165 --- /dev/null +++ b/drivers/net/ethernet/atheros/alx/main.c | |||
@@ -0,0 +1,1625 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013 Johannes Berg <johannes@sipsolutions.net> | ||
3 | * | ||
4 | * This file is free software: you may copy, redistribute and/or modify it | ||
5 | * under the terms of the GNU General Public License as published by the | ||
6 | * Free Software Foundation, either version 2 of the License, or (at your | ||
7 | * option) any later version. | ||
8 | * | ||
9 | * This file is distributed in the hope that it will be useful, but | ||
10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | * General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | * | ||
17 | * This file incorporates work covered by the following copyright and | ||
18 | * permission notice: | ||
19 | * | ||
20 | * Copyright (c) 2012 Qualcomm Atheros, Inc. | ||
21 | * | ||
22 | * Permission to use, copy, modify, and/or distribute this software for any | ||
23 | * purpose with or without fee is hereby granted, provided that the above | ||
24 | * copyright notice and this permission notice appear in all copies. | ||
25 | * | ||
26 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
27 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
28 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
29 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
30 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
31 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
32 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
33 | */ | ||
34 | |||
35 | #include <linux/module.h> | ||
36 | #include <linux/pci.h> | ||
37 | #include <linux/interrupt.h> | ||
38 | #include <linux/ip.h> | ||
39 | #include <linux/ipv6.h> | ||
40 | #include <linux/if_vlan.h> | ||
41 | #include <linux/mdio.h> | ||
42 | #include <linux/aer.h> | ||
43 | #include <linux/bitops.h> | ||
44 | #include <linux/netdevice.h> | ||
45 | #include <linux/etherdevice.h> | ||
46 | #include <net/ip6_checksum.h> | ||
47 | #include <linux/crc32.h> | ||
48 | #include "alx.h" | ||
49 | #include "hw.h" | ||
50 | #include "reg.h" | ||
51 | |||
52 | const char alx_drv_name[] = "alx"; | ||
53 | |||
54 | |||
55 | static void alx_free_txbuf(struct alx_priv *alx, int entry) | ||
56 | { | ||
57 | struct alx_buffer *txb = &alx->txq.bufs[entry]; | ||
58 | |||
59 | if (dma_unmap_len(txb, size)) { | ||
60 | dma_unmap_single(&alx->hw.pdev->dev, | ||
61 | dma_unmap_addr(txb, dma), | ||
62 | dma_unmap_len(txb, size), | ||
63 | DMA_TO_DEVICE); | ||
64 | dma_unmap_len_set(txb, size, 0); | ||
65 | } | ||
66 | |||
67 | if (txb->skb) { | ||
68 | dev_kfree_skb_any(txb->skb); | ||
69 | txb->skb = NULL; | ||
70 | } | ||
71 | } | ||
72 | |||
73 | static int alx_refill_rx_ring(struct alx_priv *alx, gfp_t gfp) | ||
74 | { | ||
75 | struct alx_rx_queue *rxq = &alx->rxq; | ||
76 | struct sk_buff *skb; | ||
77 | struct alx_buffer *cur_buf; | ||
78 | dma_addr_t dma; | ||
79 | u16 cur, next, count = 0; | ||
80 | |||
81 | next = cur = rxq->write_idx; | ||
82 | if (++next == alx->rx_ringsz) | ||
83 | next = 0; | ||
84 | cur_buf = &rxq->bufs[cur]; | ||
85 | |||
86 | while (!cur_buf->skb && next != rxq->read_idx) { | ||
87 | struct alx_rfd *rfd = &rxq->rfd[cur]; | ||
88 | |||
89 | skb = __netdev_alloc_skb(alx->dev, alx->rxbuf_size, gfp); | ||
90 | if (!skb) | ||
91 | break; | ||
92 | dma = dma_map_single(&alx->hw.pdev->dev, | ||
93 | skb->data, alx->rxbuf_size, | ||
94 | DMA_FROM_DEVICE); | ||
95 | if (dma_mapping_error(&alx->hw.pdev->dev, dma)) { | ||
96 | dev_kfree_skb(skb); | ||
97 | break; | ||
98 | } | ||
99 | |||
100 | /* Unfortunately, RX descriptor buffers must be 4-byte | ||
101 | * aligned, so we can't use IP alignment. | ||
102 | */ | ||
103 | if (WARN_ON(dma & 3)) { | ||
104 | dev_kfree_skb(skb); | ||
105 | break; | ||
106 | } | ||
107 | |||
108 | cur_buf->skb = skb; | ||
109 | dma_unmap_len_set(cur_buf, size, alx->rxbuf_size); | ||
110 | dma_unmap_addr_set(cur_buf, dma, dma); | ||
111 | rfd->addr = cpu_to_le64(dma); | ||
112 | |||
113 | cur = next; | ||
114 | if (++next == alx->rx_ringsz) | ||
115 | next = 0; | ||
116 | cur_buf = &rxq->bufs[cur]; | ||
117 | count++; | ||
118 | } | ||
119 | |||
120 | if (count) { | ||
121 | /* flush all updates before updating hardware */ | ||
122 | wmb(); | ||
123 | rxq->write_idx = cur; | ||
124 | alx_write_mem16(&alx->hw, ALX_RFD_PIDX, cur); | ||
125 | } | ||
126 | |||
127 | return count; | ||
128 | } | ||
129 | |||
130 | static inline int alx_tpd_avail(struct alx_priv *alx) | ||
131 | { | ||
132 | struct alx_tx_queue *txq = &alx->txq; | ||
133 | |||
134 | if (txq->write_idx >= txq->read_idx) | ||
135 | return alx->tx_ringsz + txq->read_idx - txq->write_idx - 1; | ||
136 | return txq->read_idx - txq->write_idx - 1; | ||
137 | } | ||
138 | |||
139 | static bool alx_clean_tx_irq(struct alx_priv *alx) | ||
140 | { | ||
141 | struct alx_tx_queue *txq = &alx->txq; | ||
142 | u16 hw_read_idx, sw_read_idx; | ||
143 | unsigned int total_bytes = 0, total_packets = 0; | ||
144 | int budget = ALX_DEFAULT_TX_WORK; | ||
145 | |||
146 | sw_read_idx = txq->read_idx; | ||
147 | hw_read_idx = alx_read_mem16(&alx->hw, ALX_TPD_PRI0_CIDX); | ||
148 | |||
149 | if (sw_read_idx != hw_read_idx) { | ||
150 | while (sw_read_idx != hw_read_idx && budget > 0) { | ||
151 | struct sk_buff *skb; | ||
152 | |||
153 | skb = txq->bufs[sw_read_idx].skb; | ||
154 | if (skb) { | ||
155 | total_bytes += skb->len; | ||
156 | total_packets++; | ||
157 | budget--; | ||
158 | } | ||
159 | |||
160 | alx_free_txbuf(alx, sw_read_idx); | ||
161 | |||
162 | if (++sw_read_idx == alx->tx_ringsz) | ||
163 | sw_read_idx = 0; | ||
164 | } | ||
165 | txq->read_idx = sw_read_idx; | ||
166 | |||
167 | netdev_completed_queue(alx->dev, total_packets, total_bytes); | ||
168 | } | ||
169 | |||
170 | if (netif_queue_stopped(alx->dev) && netif_carrier_ok(alx->dev) && | ||
171 | alx_tpd_avail(alx) > alx->tx_ringsz/4) | ||
172 | netif_wake_queue(alx->dev); | ||
173 | |||
174 | return sw_read_idx == hw_read_idx; | ||
175 | } | ||
176 | |||
177 | static void alx_schedule_link_check(struct alx_priv *alx) | ||
178 | { | ||
179 | schedule_work(&alx->link_check_wk); | ||
180 | } | ||
181 | |||
182 | static void alx_schedule_reset(struct alx_priv *alx) | ||
183 | { | ||
184 | schedule_work(&alx->reset_wk); | ||
185 | } | ||
186 | |||
187 | static bool alx_clean_rx_irq(struct alx_priv *alx, int budget) | ||
188 | { | ||
189 | struct alx_rx_queue *rxq = &alx->rxq; | ||
190 | struct alx_rrd *rrd; | ||
191 | struct alx_buffer *rxb; | ||
192 | struct sk_buff *skb; | ||
193 | u16 length, rfd_cleaned = 0; | ||
194 | |||
195 | while (budget > 0) { | ||
196 | rrd = &rxq->rrd[rxq->rrd_read_idx]; | ||
197 | if (!(rrd->word3 & cpu_to_le32(1 << RRD_UPDATED_SHIFT))) | ||
198 | break; | ||
199 | rrd->word3 &= ~cpu_to_le32(1 << RRD_UPDATED_SHIFT); | ||
200 | |||
201 | if (ALX_GET_FIELD(le32_to_cpu(rrd->word0), | ||
202 | RRD_SI) != rxq->read_idx || | ||
203 | ALX_GET_FIELD(le32_to_cpu(rrd->word0), | ||
204 | RRD_NOR) != 1) { | ||
205 | alx_schedule_reset(alx); | ||
206 | return 0; | ||
207 | } | ||
208 | |||
209 | rxb = &rxq->bufs[rxq->read_idx]; | ||
210 | dma_unmap_single(&alx->hw.pdev->dev, | ||
211 | dma_unmap_addr(rxb, dma), | ||
212 | dma_unmap_len(rxb, size), | ||
213 | DMA_FROM_DEVICE); | ||
214 | dma_unmap_len_set(rxb, size, 0); | ||
215 | skb = rxb->skb; | ||
216 | rxb->skb = NULL; | ||
217 | |||
218 | if (rrd->word3 & cpu_to_le32(1 << RRD_ERR_RES_SHIFT) || | ||
219 | rrd->word3 & cpu_to_le32(1 << RRD_ERR_LEN_SHIFT)) { | ||
220 | rrd->word3 = 0; | ||
221 | dev_kfree_skb_any(skb); | ||
222 | goto next_pkt; | ||
223 | } | ||
224 | |||
225 | length = ALX_GET_FIELD(le32_to_cpu(rrd->word3), | ||
226 | RRD_PKTLEN) - ETH_FCS_LEN; | ||
227 | skb_put(skb, length); | ||
228 | skb->protocol = eth_type_trans(skb, alx->dev); | ||
229 | |||
230 | skb_checksum_none_assert(skb); | ||
231 | if (alx->dev->features & NETIF_F_RXCSUM && | ||
232 | !(rrd->word3 & (cpu_to_le32(1 << RRD_ERR_L4_SHIFT) | | ||
233 | cpu_to_le32(1 << RRD_ERR_IPV4_SHIFT)))) { | ||
234 | switch (ALX_GET_FIELD(le32_to_cpu(rrd->word2), | ||
235 | RRD_PID)) { | ||
236 | case RRD_PID_IPV6UDP: | ||
237 | case RRD_PID_IPV4UDP: | ||
238 | case RRD_PID_IPV4TCP: | ||
239 | case RRD_PID_IPV6TCP: | ||
240 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
241 | break; | ||
242 | } | ||
243 | } | ||
244 | |||
245 | napi_gro_receive(&alx->napi, skb); | ||
246 | budget--; | ||
247 | |||
248 | next_pkt: | ||
249 | if (++rxq->read_idx == alx->rx_ringsz) | ||
250 | rxq->read_idx = 0; | ||
251 | if (++rxq->rrd_read_idx == alx->rx_ringsz) | ||
252 | rxq->rrd_read_idx = 0; | ||
253 | |||
254 | if (++rfd_cleaned > ALX_RX_ALLOC_THRESH) | ||
255 | rfd_cleaned -= alx_refill_rx_ring(alx, GFP_ATOMIC); | ||
256 | } | ||
257 | |||
258 | if (rfd_cleaned) | ||
259 | alx_refill_rx_ring(alx, GFP_ATOMIC); | ||
260 | |||
261 | return budget > 0; | ||
262 | } | ||
263 | |||
264 | static int alx_poll(struct napi_struct *napi, int budget) | ||
265 | { | ||
266 | struct alx_priv *alx = container_of(napi, struct alx_priv, napi); | ||
267 | struct alx_hw *hw = &alx->hw; | ||
268 | bool complete = true; | ||
269 | unsigned long flags; | ||
270 | |||
271 | complete = alx_clean_tx_irq(alx) && | ||
272 | alx_clean_rx_irq(alx, budget); | ||
273 | |||
274 | if (!complete) | ||
275 | return 1; | ||
276 | |||
277 | napi_complete(&alx->napi); | ||
278 | |||
279 | /* enable interrupt */ | ||
280 | spin_lock_irqsave(&alx->irq_lock, flags); | ||
281 | alx->int_mask |= ALX_ISR_TX_Q0 | ALX_ISR_RX_Q0; | ||
282 | alx_write_mem32(hw, ALX_IMR, alx->int_mask); | ||
283 | spin_unlock_irqrestore(&alx->irq_lock, flags); | ||
284 | |||
285 | alx_post_write(hw); | ||
286 | |||
287 | return 0; | ||
288 | } | ||
289 | |||
290 | static irqreturn_t alx_intr_handle(struct alx_priv *alx, u32 intr) | ||
291 | { | ||
292 | struct alx_hw *hw = &alx->hw; | ||
293 | bool write_int_mask = false; | ||
294 | |||
295 | spin_lock(&alx->irq_lock); | ||
296 | |||
297 | /* ACK interrupt */ | ||
298 | alx_write_mem32(hw, ALX_ISR, intr | ALX_ISR_DIS); | ||
299 | intr &= alx->int_mask; | ||
300 | |||
301 | if (intr & ALX_ISR_FATAL) { | ||
302 | netif_warn(alx, hw, alx->dev, | ||
303 | "fatal interrupt 0x%x, resetting\n", intr); | ||
304 | alx_schedule_reset(alx); | ||
305 | goto out; | ||
306 | } | ||
307 | |||
308 | if (intr & ALX_ISR_ALERT) | ||
309 | netdev_warn(alx->dev, "alert interrupt: 0x%x\n", intr); | ||
310 | |||
311 | if (intr & ALX_ISR_PHY) { | ||
312 | /* suppress PHY interrupt, because the source | ||
313 | * is from PHY internal. only the internal status | ||
314 | * is cleared, the interrupt status could be cleared. | ||
315 | */ | ||
316 | alx->int_mask &= ~ALX_ISR_PHY; | ||
317 | write_int_mask = true; | ||
318 | alx_schedule_link_check(alx); | ||
319 | } | ||
320 | |||
321 | if (intr & (ALX_ISR_TX_Q0 | ALX_ISR_RX_Q0)) { | ||
322 | napi_schedule(&alx->napi); | ||
323 | /* mask rx/tx interrupt, enable them when napi complete */ | ||
324 | alx->int_mask &= ~ALX_ISR_ALL_QUEUES; | ||
325 | write_int_mask = true; | ||
326 | } | ||
327 | |||
328 | if (write_int_mask) | ||
329 | alx_write_mem32(hw, ALX_IMR, alx->int_mask); | ||
330 | |||
331 | alx_write_mem32(hw, ALX_ISR, 0); | ||
332 | |||
333 | out: | ||
334 | spin_unlock(&alx->irq_lock); | ||
335 | return IRQ_HANDLED; | ||
336 | } | ||
337 | |||
338 | static irqreturn_t alx_intr_msi(int irq, void *data) | ||
339 | { | ||
340 | struct alx_priv *alx = data; | ||
341 | |||
342 | return alx_intr_handle(alx, alx_read_mem32(&alx->hw, ALX_ISR)); | ||
343 | } | ||
344 | |||
345 | static irqreturn_t alx_intr_legacy(int irq, void *data) | ||
346 | { | ||
347 | struct alx_priv *alx = data; | ||
348 | struct alx_hw *hw = &alx->hw; | ||
349 | u32 intr; | ||
350 | |||
351 | intr = alx_read_mem32(hw, ALX_ISR); | ||
352 | |||
353 | if (intr & ALX_ISR_DIS || !(intr & alx->int_mask)) | ||
354 | return IRQ_NONE; | ||
355 | |||
356 | return alx_intr_handle(alx, intr); | ||
357 | } | ||
358 | |||
359 | static void alx_init_ring_ptrs(struct alx_priv *alx) | ||
360 | { | ||
361 | struct alx_hw *hw = &alx->hw; | ||
362 | u32 addr_hi = ((u64)alx->descmem.dma) >> 32; | ||
363 | |||
364 | alx->rxq.read_idx = 0; | ||
365 | alx->rxq.write_idx = 0; | ||
366 | alx->rxq.rrd_read_idx = 0; | ||
367 | alx_write_mem32(hw, ALX_RX_BASE_ADDR_HI, addr_hi); | ||
368 | alx_write_mem32(hw, ALX_RRD_ADDR_LO, alx->rxq.rrd_dma); | ||
369 | alx_write_mem32(hw, ALX_RRD_RING_SZ, alx->rx_ringsz); | ||
370 | alx_write_mem32(hw, ALX_RFD_ADDR_LO, alx->rxq.rfd_dma); | ||
371 | alx_write_mem32(hw, ALX_RFD_RING_SZ, alx->rx_ringsz); | ||
372 | alx_write_mem32(hw, ALX_RFD_BUF_SZ, alx->rxbuf_size); | ||
373 | |||
374 | alx->txq.read_idx = 0; | ||
375 | alx->txq.write_idx = 0; | ||
376 | alx_write_mem32(hw, ALX_TX_BASE_ADDR_HI, addr_hi); | ||
377 | alx_write_mem32(hw, ALX_TPD_PRI0_ADDR_LO, alx->txq.tpd_dma); | ||
378 | alx_write_mem32(hw, ALX_TPD_RING_SZ, alx->tx_ringsz); | ||
379 | |||
380 | /* load these pointers into the chip */ | ||
381 | alx_write_mem32(hw, ALX_SRAM9, ALX_SRAM_LOAD_PTR); | ||
382 | } | ||
383 | |||
384 | static void alx_free_txring_buf(struct alx_priv *alx) | ||
385 | { | ||
386 | struct alx_tx_queue *txq = &alx->txq; | ||
387 | int i; | ||
388 | |||
389 | if (!txq->bufs) | ||
390 | return; | ||
391 | |||
392 | for (i = 0; i < alx->tx_ringsz; i++) | ||
393 | alx_free_txbuf(alx, i); | ||
394 | |||
395 | memset(txq->bufs, 0, alx->tx_ringsz * sizeof(struct alx_buffer)); | ||
396 | memset(txq->tpd, 0, alx->tx_ringsz * sizeof(struct alx_txd)); | ||
397 | txq->write_idx = 0; | ||
398 | txq->read_idx = 0; | ||
399 | |||
400 | netdev_reset_queue(alx->dev); | ||
401 | } | ||
402 | |||
403 | static void alx_free_rxring_buf(struct alx_priv *alx) | ||
404 | { | ||
405 | struct alx_rx_queue *rxq = &alx->rxq; | ||
406 | struct alx_buffer *cur_buf; | ||
407 | u16 i; | ||
408 | |||
409 | if (rxq == NULL) | ||
410 | return; | ||
411 | |||
412 | for (i = 0; i < alx->rx_ringsz; i++) { | ||
413 | cur_buf = rxq->bufs + i; | ||
414 | if (cur_buf->skb) { | ||
415 | dma_unmap_single(&alx->hw.pdev->dev, | ||
416 | dma_unmap_addr(cur_buf, dma), | ||
417 | dma_unmap_len(cur_buf, size), | ||
418 | DMA_FROM_DEVICE); | ||
419 | dev_kfree_skb(cur_buf->skb); | ||
420 | cur_buf->skb = NULL; | ||
421 | dma_unmap_len_set(cur_buf, size, 0); | ||
422 | dma_unmap_addr_set(cur_buf, dma, 0); | ||
423 | } | ||
424 | } | ||
425 | |||
426 | rxq->write_idx = 0; | ||
427 | rxq->read_idx = 0; | ||
428 | rxq->rrd_read_idx = 0; | ||
429 | } | ||
430 | |||
431 | static void alx_free_buffers(struct alx_priv *alx) | ||
432 | { | ||
433 | alx_free_txring_buf(alx); | ||
434 | alx_free_rxring_buf(alx); | ||
435 | } | ||
436 | |||
437 | static int alx_reinit_rings(struct alx_priv *alx) | ||
438 | { | ||
439 | alx_free_buffers(alx); | ||
440 | |||
441 | alx_init_ring_ptrs(alx); | ||
442 | |||
443 | if (!alx_refill_rx_ring(alx, GFP_KERNEL)) | ||
444 | return -ENOMEM; | ||
445 | |||
446 | return 0; | ||
447 | } | ||
448 | |||
449 | static void alx_add_mc_addr(struct alx_hw *hw, const u8 *addr, u32 *mc_hash) | ||
450 | { | ||
451 | u32 crc32, bit, reg; | ||
452 | |||
453 | crc32 = ether_crc(ETH_ALEN, addr); | ||
454 | reg = (crc32 >> 31) & 0x1; | ||
455 | bit = (crc32 >> 26) & 0x1F; | ||
456 | |||
457 | mc_hash[reg] |= BIT(bit); | ||
458 | } | ||
459 | |||
460 | static void __alx_set_rx_mode(struct net_device *netdev) | ||
461 | { | ||
462 | struct alx_priv *alx = netdev_priv(netdev); | ||
463 | struct alx_hw *hw = &alx->hw; | ||
464 | struct netdev_hw_addr *ha; | ||
465 | u32 mc_hash[2] = {}; | ||
466 | |||
467 | if (!(netdev->flags & IFF_ALLMULTI)) { | ||
468 | netdev_for_each_mc_addr(ha, netdev) | ||
469 | alx_add_mc_addr(hw, ha->addr, mc_hash); | ||
470 | |||
471 | alx_write_mem32(hw, ALX_HASH_TBL0, mc_hash[0]); | ||
472 | alx_write_mem32(hw, ALX_HASH_TBL1, mc_hash[1]); | ||
473 | } | ||
474 | |||
475 | hw->rx_ctrl &= ~(ALX_MAC_CTRL_MULTIALL_EN | ALX_MAC_CTRL_PROMISC_EN); | ||
476 | if (netdev->flags & IFF_PROMISC) | ||
477 | hw->rx_ctrl |= ALX_MAC_CTRL_PROMISC_EN; | ||
478 | if (netdev->flags & IFF_ALLMULTI) | ||
479 | hw->rx_ctrl |= ALX_MAC_CTRL_MULTIALL_EN; | ||
480 | |||
481 | alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl); | ||
482 | } | ||
483 | |||
484 | static void alx_set_rx_mode(struct net_device *netdev) | ||
485 | { | ||
486 | __alx_set_rx_mode(netdev); | ||
487 | } | ||
488 | |||
489 | static int alx_set_mac_address(struct net_device *netdev, void *data) | ||
490 | { | ||
491 | struct alx_priv *alx = netdev_priv(netdev); | ||
492 | struct alx_hw *hw = &alx->hw; | ||
493 | struct sockaddr *addr = data; | ||
494 | |||
495 | if (!is_valid_ether_addr(addr->sa_data)) | ||
496 | return -EADDRNOTAVAIL; | ||
497 | |||
498 | if (netdev->addr_assign_type & NET_ADDR_RANDOM) | ||
499 | netdev->addr_assign_type ^= NET_ADDR_RANDOM; | ||
500 | |||
501 | memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); | ||
502 | memcpy(hw->mac_addr, addr->sa_data, netdev->addr_len); | ||
503 | alx_set_macaddr(hw, hw->mac_addr); | ||
504 | |||
505 | return 0; | ||
506 | } | ||
507 | |||
508 | static int alx_alloc_descriptors(struct alx_priv *alx) | ||
509 | { | ||
510 | alx->txq.bufs = kcalloc(alx->tx_ringsz, | ||
511 | sizeof(struct alx_buffer), | ||
512 | GFP_KERNEL); | ||
513 | if (!alx->txq.bufs) | ||
514 | return -ENOMEM; | ||
515 | |||
516 | alx->rxq.bufs = kcalloc(alx->rx_ringsz, | ||
517 | sizeof(struct alx_buffer), | ||
518 | GFP_KERNEL); | ||
519 | if (!alx->rxq.bufs) | ||
520 | goto out_free; | ||
521 | |||
522 | /* physical tx/rx ring descriptors | ||
523 | * | ||
524 | * Allocate them as a single chunk because they must not cross a | ||
525 | * 4G boundary (hardware has a single register for high 32 bits | ||
526 | * of addresses only) | ||
527 | */ | ||
528 | alx->descmem.size = sizeof(struct alx_txd) * alx->tx_ringsz + | ||
529 | sizeof(struct alx_rrd) * alx->rx_ringsz + | ||
530 | sizeof(struct alx_rfd) * alx->rx_ringsz; | ||
531 | alx->descmem.virt = dma_zalloc_coherent(&alx->hw.pdev->dev, | ||
532 | alx->descmem.size, | ||
533 | &alx->descmem.dma, | ||
534 | GFP_KERNEL); | ||
535 | if (!alx->descmem.virt) | ||
536 | goto out_free; | ||
537 | |||
538 | alx->txq.tpd = (void *)alx->descmem.virt; | ||
539 | alx->txq.tpd_dma = alx->descmem.dma; | ||
540 | |||
541 | /* alignment requirement for next block */ | ||
542 | BUILD_BUG_ON(sizeof(struct alx_txd) % 8); | ||
543 | |||
544 | alx->rxq.rrd = | ||
545 | (void *)((u8 *)alx->descmem.virt + | ||
546 | sizeof(struct alx_txd) * alx->tx_ringsz); | ||
547 | alx->rxq.rrd_dma = alx->descmem.dma + | ||
548 | sizeof(struct alx_txd) * alx->tx_ringsz; | ||
549 | |||
550 | /* alignment requirement for next block */ | ||
551 | BUILD_BUG_ON(sizeof(struct alx_rrd) % 8); | ||
552 | |||
553 | alx->rxq.rfd = | ||
554 | (void *)((u8 *)alx->descmem.virt + | ||
555 | sizeof(struct alx_txd) * alx->tx_ringsz + | ||
556 | sizeof(struct alx_rrd) * alx->rx_ringsz); | ||
557 | alx->rxq.rfd_dma = alx->descmem.dma + | ||
558 | sizeof(struct alx_txd) * alx->tx_ringsz + | ||
559 | sizeof(struct alx_rrd) * alx->rx_ringsz; | ||
560 | |||
561 | return 0; | ||
562 | out_free: | ||
563 | kfree(alx->txq.bufs); | ||
564 | kfree(alx->rxq.bufs); | ||
565 | return -ENOMEM; | ||
566 | } | ||
567 | |||
568 | static int alx_alloc_rings(struct alx_priv *alx) | ||
569 | { | ||
570 | int err; | ||
571 | |||
572 | err = alx_alloc_descriptors(alx); | ||
573 | if (err) | ||
574 | return err; | ||
575 | |||
576 | alx->int_mask &= ~ALX_ISR_ALL_QUEUES; | ||
577 | alx->int_mask |= ALX_ISR_TX_Q0 | ALX_ISR_RX_Q0; | ||
578 | alx->tx_ringsz = alx->tx_ringsz; | ||
579 | |||
580 | netif_napi_add(alx->dev, &alx->napi, alx_poll, 64); | ||
581 | |||
582 | alx_reinit_rings(alx); | ||
583 | return 0; | ||
584 | } | ||
585 | |||
586 | static void alx_free_rings(struct alx_priv *alx) | ||
587 | { | ||
588 | netif_napi_del(&alx->napi); | ||
589 | alx_free_buffers(alx); | ||
590 | |||
591 | kfree(alx->txq.bufs); | ||
592 | kfree(alx->rxq.bufs); | ||
593 | |||
594 | dma_free_coherent(&alx->hw.pdev->dev, | ||
595 | alx->descmem.size, | ||
596 | alx->descmem.virt, | ||
597 | alx->descmem.dma); | ||
598 | } | ||
599 | |||
600 | static void alx_config_vector_mapping(struct alx_priv *alx) | ||
601 | { | ||
602 | struct alx_hw *hw = &alx->hw; | ||
603 | |||
604 | alx_write_mem32(hw, ALX_MSI_MAP_TBL1, 0); | ||
605 | alx_write_mem32(hw, ALX_MSI_MAP_TBL2, 0); | ||
606 | alx_write_mem32(hw, ALX_MSI_ID_MAP, 0); | ||
607 | } | ||
608 | |||
609 | static void alx_irq_enable(struct alx_priv *alx) | ||
610 | { | ||
611 | struct alx_hw *hw = &alx->hw; | ||
612 | |||
613 | /* level-1 interrupt switch */ | ||
614 | alx_write_mem32(hw, ALX_ISR, 0); | ||
615 | alx_write_mem32(hw, ALX_IMR, alx->int_mask); | ||
616 | alx_post_write(hw); | ||
617 | } | ||
618 | |||
619 | static void alx_irq_disable(struct alx_priv *alx) | ||
620 | { | ||
621 | struct alx_hw *hw = &alx->hw; | ||
622 | |||
623 | alx_write_mem32(hw, ALX_ISR, ALX_ISR_DIS); | ||
624 | alx_write_mem32(hw, ALX_IMR, 0); | ||
625 | alx_post_write(hw); | ||
626 | |||
627 | synchronize_irq(alx->hw.pdev->irq); | ||
628 | } | ||
629 | |||
630 | static int alx_request_irq(struct alx_priv *alx) | ||
631 | { | ||
632 | struct pci_dev *pdev = alx->hw.pdev; | ||
633 | struct alx_hw *hw = &alx->hw; | ||
634 | int err; | ||
635 | u32 msi_ctrl; | ||
636 | |||
637 | msi_ctrl = (hw->imt >> 1) << ALX_MSI_RETRANS_TM_SHIFT; | ||
638 | |||
639 | if (!pci_enable_msi(alx->hw.pdev)) { | ||
640 | alx->msi = true; | ||
641 | |||
642 | alx_write_mem32(hw, ALX_MSI_RETRANS_TIMER, | ||
643 | msi_ctrl | ALX_MSI_MASK_SEL_LINE); | ||
644 | err = request_irq(pdev->irq, alx_intr_msi, 0, | ||
645 | alx->dev->name, alx); | ||
646 | if (!err) | ||
647 | goto out; | ||
648 | /* fall back to legacy interrupt */ | ||
649 | pci_disable_msi(alx->hw.pdev); | ||
650 | } | ||
651 | |||
652 | alx_write_mem32(hw, ALX_MSI_RETRANS_TIMER, 0); | ||
653 | err = request_irq(pdev->irq, alx_intr_legacy, IRQF_SHARED, | ||
654 | alx->dev->name, alx); | ||
655 | out: | ||
656 | if (!err) | ||
657 | alx_config_vector_mapping(alx); | ||
658 | return err; | ||
659 | } | ||
660 | |||
661 | static void alx_free_irq(struct alx_priv *alx) | ||
662 | { | ||
663 | struct pci_dev *pdev = alx->hw.pdev; | ||
664 | |||
665 | free_irq(pdev->irq, alx); | ||
666 | |||
667 | if (alx->msi) { | ||
668 | pci_disable_msi(alx->hw.pdev); | ||
669 | alx->msi = false; | ||
670 | } | ||
671 | } | ||
672 | |||
673 | static int alx_identify_hw(struct alx_priv *alx) | ||
674 | { | ||
675 | struct alx_hw *hw = &alx->hw; | ||
676 | int rev = alx_hw_revision(hw); | ||
677 | |||
678 | if (rev > ALX_REV_C0) | ||
679 | return -EINVAL; | ||
680 | |||
681 | hw->max_dma_chnl = rev >= ALX_REV_B0 ? 4 : 2; | ||
682 | |||
683 | return 0; | ||
684 | } | ||
685 | |||
686 | static int alx_init_sw(struct alx_priv *alx) | ||
687 | { | ||
688 | struct pci_dev *pdev = alx->hw.pdev; | ||
689 | struct alx_hw *hw = &alx->hw; | ||
690 | int err; | ||
691 | |||
692 | err = alx_identify_hw(alx); | ||
693 | if (err) { | ||
694 | dev_err(&pdev->dev, "unrecognized chip, aborting\n"); | ||
695 | return err; | ||
696 | } | ||
697 | |||
698 | alx->hw.lnk_patch = | ||
699 | pdev->device == ALX_DEV_ID_AR8161 && | ||
700 | pdev->subsystem_vendor == PCI_VENDOR_ID_ATTANSIC && | ||
701 | pdev->subsystem_device == 0x0091 && | ||
702 | pdev->revision == 0; | ||
703 | |||
704 | hw->smb_timer = 400; | ||
705 | hw->mtu = alx->dev->mtu; | ||
706 | alx->rxbuf_size = ALIGN(ALX_RAW_MTU(hw->mtu), 8); | ||
707 | alx->tx_ringsz = 256; | ||
708 | alx->rx_ringsz = 512; | ||
709 | hw->sleep_ctrl = ALX_SLEEP_WOL_MAGIC | ALX_SLEEP_WOL_PHY; | ||
710 | hw->imt = 200; | ||
711 | alx->int_mask = ALX_ISR_MISC; | ||
712 | hw->dma_chnl = hw->max_dma_chnl; | ||
713 | hw->ith_tpd = alx->tx_ringsz / 3; | ||
714 | hw->link_speed = SPEED_UNKNOWN; | ||
715 | hw->adv_cfg = ADVERTISED_Autoneg | | ||
716 | ADVERTISED_10baseT_Half | | ||
717 | ADVERTISED_10baseT_Full | | ||
718 | ADVERTISED_100baseT_Full | | ||
719 | ADVERTISED_100baseT_Half | | ||
720 | ADVERTISED_1000baseT_Full; | ||
721 | hw->flowctrl = ALX_FC_ANEG | ALX_FC_RX | ALX_FC_TX; | ||
722 | |||
723 | hw->rx_ctrl = ALX_MAC_CTRL_WOLSPED_SWEN | | ||
724 | ALX_MAC_CTRL_MHASH_ALG_HI5B | | ||
725 | ALX_MAC_CTRL_BRD_EN | | ||
726 | ALX_MAC_CTRL_PCRCE | | ||
727 | ALX_MAC_CTRL_CRCE | | ||
728 | ALX_MAC_CTRL_RXFC_EN | | ||
729 | ALX_MAC_CTRL_TXFC_EN | | ||
730 | 7 << ALX_MAC_CTRL_PRMBLEN_SHIFT; | ||
731 | |||
732 | return err; | ||
733 | } | ||
734 | |||
735 | |||
736 | static netdev_features_t alx_fix_features(struct net_device *netdev, | ||
737 | netdev_features_t features) | ||
738 | { | ||
739 | if (netdev->mtu > ALX_MAX_TSO_PKT_SIZE) | ||
740 | features &= ~(NETIF_F_TSO | NETIF_F_TSO6); | ||
741 | |||
742 | return features; | ||
743 | } | ||
744 | |||
745 | static void alx_netif_stop(struct alx_priv *alx) | ||
746 | { | ||
747 | alx->dev->trans_start = jiffies; | ||
748 | if (netif_carrier_ok(alx->dev)) { | ||
749 | netif_carrier_off(alx->dev); | ||
750 | netif_tx_disable(alx->dev); | ||
751 | napi_disable(&alx->napi); | ||
752 | } | ||
753 | } | ||
754 | |||
755 | static void alx_halt(struct alx_priv *alx) | ||
756 | { | ||
757 | struct alx_hw *hw = &alx->hw; | ||
758 | |||
759 | alx_netif_stop(alx); | ||
760 | hw->link_speed = SPEED_UNKNOWN; | ||
761 | |||
762 | alx_reset_mac(hw); | ||
763 | |||
764 | /* disable l0s/l1 */ | ||
765 | alx_enable_aspm(hw, false, false); | ||
766 | alx_irq_disable(alx); | ||
767 | alx_free_buffers(alx); | ||
768 | } | ||
769 | |||
770 | static void alx_configure(struct alx_priv *alx) | ||
771 | { | ||
772 | struct alx_hw *hw = &alx->hw; | ||
773 | |||
774 | alx_configure_basic(hw); | ||
775 | alx_disable_rss(hw); | ||
776 | __alx_set_rx_mode(alx->dev); | ||
777 | |||
778 | alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl); | ||
779 | } | ||
780 | |||
781 | static void alx_activate(struct alx_priv *alx) | ||
782 | { | ||
783 | /* hardware setting lost, restore it */ | ||
784 | alx_reinit_rings(alx); | ||
785 | alx_configure(alx); | ||
786 | |||
787 | /* clear old interrupts */ | ||
788 | alx_write_mem32(&alx->hw, ALX_ISR, ~(u32)ALX_ISR_DIS); | ||
789 | |||
790 | alx_irq_enable(alx); | ||
791 | |||
792 | alx_schedule_link_check(alx); | ||
793 | } | ||
794 | |||
795 | static void alx_reinit(struct alx_priv *alx) | ||
796 | { | ||
797 | ASSERT_RTNL(); | ||
798 | |||
799 | alx_halt(alx); | ||
800 | alx_activate(alx); | ||
801 | } | ||
802 | |||
803 | static int alx_change_mtu(struct net_device *netdev, int mtu) | ||
804 | { | ||
805 | struct alx_priv *alx = netdev_priv(netdev); | ||
806 | int max_frame = mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN; | ||
807 | |||
808 | if ((max_frame < ALX_MIN_FRAME_SIZE) || | ||
809 | (max_frame > ALX_MAX_FRAME_SIZE)) | ||
810 | return -EINVAL; | ||
811 | |||
812 | if (netdev->mtu == mtu) | ||
813 | return 0; | ||
814 | |||
815 | netdev->mtu = mtu; | ||
816 | alx->hw.mtu = mtu; | ||
817 | alx->rxbuf_size = mtu > ALX_DEF_RXBUF_SIZE ? | ||
818 | ALIGN(max_frame, 8) : ALX_DEF_RXBUF_SIZE; | ||
819 | netdev_update_features(netdev); | ||
820 | if (netif_running(netdev)) | ||
821 | alx_reinit(alx); | ||
822 | return 0; | ||
823 | } | ||
824 | |||
825 | static void alx_netif_start(struct alx_priv *alx) | ||
826 | { | ||
827 | netif_tx_wake_all_queues(alx->dev); | ||
828 | napi_enable(&alx->napi); | ||
829 | netif_carrier_on(alx->dev); | ||
830 | } | ||
831 | |||
832 | static int __alx_open(struct alx_priv *alx, bool resume) | ||
833 | { | ||
834 | int err; | ||
835 | |||
836 | if (!resume) | ||
837 | netif_carrier_off(alx->dev); | ||
838 | |||
839 | err = alx_alloc_rings(alx); | ||
840 | if (err) | ||
841 | return err; | ||
842 | |||
843 | alx_configure(alx); | ||
844 | |||
845 | err = alx_request_irq(alx); | ||
846 | if (err) | ||
847 | goto out_free_rings; | ||
848 | |||
849 | /* clear old interrupts */ | ||
850 | alx_write_mem32(&alx->hw, ALX_ISR, ~(u32)ALX_ISR_DIS); | ||
851 | |||
852 | alx_irq_enable(alx); | ||
853 | |||
854 | if (!resume) | ||
855 | netif_tx_start_all_queues(alx->dev); | ||
856 | |||
857 | alx_schedule_link_check(alx); | ||
858 | return 0; | ||
859 | |||
860 | out_free_rings: | ||
861 | alx_free_rings(alx); | ||
862 | return err; | ||
863 | } | ||
864 | |||
865 | static void __alx_stop(struct alx_priv *alx) | ||
866 | { | ||
867 | alx_halt(alx); | ||
868 | alx_free_irq(alx); | ||
869 | alx_free_rings(alx); | ||
870 | } | ||
871 | |||
872 | static const char *alx_speed_desc(u16 speed) | ||
873 | { | ||
874 | switch (speed) { | ||
875 | case SPEED_1000 + DUPLEX_FULL: | ||
876 | return "1 Gbps Full"; | ||
877 | case SPEED_100 + DUPLEX_FULL: | ||
878 | return "100 Mbps Full"; | ||
879 | case SPEED_100 + DUPLEX_HALF: | ||
880 | return "100 Mbps Half"; | ||
881 | case SPEED_10 + DUPLEX_FULL: | ||
882 | return "10 Mbps Full"; | ||
883 | case SPEED_10 + DUPLEX_HALF: | ||
884 | return "10 Mbps Half"; | ||
885 | default: | ||
886 | return "Unknown speed"; | ||
887 | } | ||
888 | } | ||
889 | |||
890 | static void alx_check_link(struct alx_priv *alx) | ||
891 | { | ||
892 | struct alx_hw *hw = &alx->hw; | ||
893 | unsigned long flags; | ||
894 | int speed, old_speed; | ||
895 | int err; | ||
896 | |||
897 | /* clear PHY internal interrupt status, otherwise the main | ||
898 | * interrupt status will be asserted forever | ||
899 | */ | ||
900 | alx_clear_phy_intr(hw); | ||
901 | |||
902 | err = alx_get_phy_link(hw, &speed); | ||
903 | if (err < 0) | ||
904 | goto reset; | ||
905 | |||
906 | spin_lock_irqsave(&alx->irq_lock, flags); | ||
907 | alx->int_mask |= ALX_ISR_PHY; | ||
908 | alx_write_mem32(hw, ALX_IMR, alx->int_mask); | ||
909 | spin_unlock_irqrestore(&alx->irq_lock, flags); | ||
910 | |||
911 | old_speed = hw->link_speed; | ||
912 | |||
913 | if (old_speed == speed) | ||
914 | return; | ||
915 | hw->link_speed = speed; | ||
916 | |||
917 | if (speed != SPEED_UNKNOWN) { | ||
918 | netif_info(alx, link, alx->dev, | ||
919 | "NIC Up: %s\n", alx_speed_desc(speed)); | ||
920 | alx_post_phy_link(hw); | ||
921 | alx_enable_aspm(hw, true, true); | ||
922 | alx_start_mac(hw); | ||
923 | |||
924 | if (old_speed == SPEED_UNKNOWN) | ||
925 | alx_netif_start(alx); | ||
926 | } else { | ||
927 | /* link is now down */ | ||
928 | alx_netif_stop(alx); | ||
929 | netif_info(alx, link, alx->dev, "Link Down\n"); | ||
930 | err = alx_reset_mac(hw); | ||
931 | if (err) | ||
932 | goto reset; | ||
933 | alx_irq_disable(alx); | ||
934 | |||
935 | /* MAC reset causes all HW settings to be lost, restore all */ | ||
936 | err = alx_reinit_rings(alx); | ||
937 | if (err) | ||
938 | goto reset; | ||
939 | alx_configure(alx); | ||
940 | alx_enable_aspm(hw, false, true); | ||
941 | alx_post_phy_link(hw); | ||
942 | alx_irq_enable(alx); | ||
943 | } | ||
944 | |||
945 | return; | ||
946 | |||
947 | reset: | ||
948 | alx_schedule_reset(alx); | ||
949 | } | ||
950 | |||
951 | static int alx_open(struct net_device *netdev) | ||
952 | { | ||
953 | return __alx_open(netdev_priv(netdev), false); | ||
954 | } | ||
955 | |||
956 | static int alx_stop(struct net_device *netdev) | ||
957 | { | ||
958 | __alx_stop(netdev_priv(netdev)); | ||
959 | return 0; | ||
960 | } | ||
961 | |||
962 | static int __alx_shutdown(struct pci_dev *pdev, bool *wol_en) | ||
963 | { | ||
964 | struct alx_priv *alx = pci_get_drvdata(pdev); | ||
965 | struct net_device *netdev = alx->dev; | ||
966 | struct alx_hw *hw = &alx->hw; | ||
967 | int err, speed; | ||
968 | |||
969 | netif_device_detach(netdev); | ||
970 | |||
971 | if (netif_running(netdev)) | ||
972 | __alx_stop(alx); | ||
973 | |||
974 | #ifdef CONFIG_PM_SLEEP | ||
975 | err = pci_save_state(pdev); | ||
976 | if (err) | ||
977 | return err; | ||
978 | #endif | ||
979 | |||
980 | err = alx_select_powersaving_speed(hw, &speed); | ||
981 | if (err) | ||
982 | return err; | ||
983 | err = alx_clear_phy_intr(hw); | ||
984 | if (err) | ||
985 | return err; | ||
986 | err = alx_pre_suspend(hw, speed); | ||
987 | if (err) | ||
988 | return err; | ||
989 | err = alx_config_wol(hw); | ||
990 | if (err) | ||
991 | return err; | ||
992 | |||
993 | *wol_en = false; | ||
994 | if (hw->sleep_ctrl & ALX_SLEEP_ACTIVE) { | ||
995 | netif_info(alx, wol, netdev, | ||
996 | "wol: ctrl=%X, speed=%X\n", | ||
997 | hw->sleep_ctrl, speed); | ||
998 | device_set_wakeup_enable(&pdev->dev, true); | ||
999 | *wol_en = true; | ||
1000 | } | ||
1001 | |||
1002 | pci_disable_device(pdev); | ||
1003 | |||
1004 | return 0; | ||
1005 | } | ||
1006 | |||
1007 | static void alx_shutdown(struct pci_dev *pdev) | ||
1008 | { | ||
1009 | int err; | ||
1010 | bool wol_en; | ||
1011 | |||
1012 | err = __alx_shutdown(pdev, &wol_en); | ||
1013 | if (!err) { | ||
1014 | pci_wake_from_d3(pdev, wol_en); | ||
1015 | pci_set_power_state(pdev, PCI_D3hot); | ||
1016 | } else { | ||
1017 | dev_err(&pdev->dev, "shutdown fail %d\n", err); | ||
1018 | } | ||
1019 | } | ||
1020 | |||
1021 | static void alx_link_check(struct work_struct *work) | ||
1022 | { | ||
1023 | struct alx_priv *alx; | ||
1024 | |||
1025 | alx = container_of(work, struct alx_priv, link_check_wk); | ||
1026 | |||
1027 | rtnl_lock(); | ||
1028 | alx_check_link(alx); | ||
1029 | rtnl_unlock(); | ||
1030 | } | ||
1031 | |||
1032 | static void alx_reset(struct work_struct *work) | ||
1033 | { | ||
1034 | struct alx_priv *alx = container_of(work, struct alx_priv, reset_wk); | ||
1035 | |||
1036 | rtnl_lock(); | ||
1037 | alx_reinit(alx); | ||
1038 | rtnl_unlock(); | ||
1039 | } | ||
1040 | |||
1041 | static int alx_tx_csum(struct sk_buff *skb, struct alx_txd *first) | ||
1042 | { | ||
1043 | u8 cso, css; | ||
1044 | |||
1045 | if (skb->ip_summed != CHECKSUM_PARTIAL) | ||
1046 | return 0; | ||
1047 | |||
1048 | cso = skb_checksum_start_offset(skb); | ||
1049 | if (cso & 1) | ||
1050 | return -EINVAL; | ||
1051 | |||
1052 | css = cso + skb->csum_offset; | ||
1053 | first->word1 |= cpu_to_le32((cso >> 1) << TPD_CXSUMSTART_SHIFT); | ||
1054 | first->word1 |= cpu_to_le32((css >> 1) << TPD_CXSUMOFFSET_SHIFT); | ||
1055 | first->word1 |= cpu_to_le32(1 << TPD_CXSUM_EN_SHIFT); | ||
1056 | |||
1057 | return 0; | ||
1058 | } | ||
1059 | |||
1060 | static int alx_map_tx_skb(struct alx_priv *alx, struct sk_buff *skb) | ||
1061 | { | ||
1062 | struct alx_tx_queue *txq = &alx->txq; | ||
1063 | struct alx_txd *tpd, *first_tpd; | ||
1064 | dma_addr_t dma; | ||
1065 | int maplen, f, first_idx = txq->write_idx; | ||
1066 | |||
1067 | first_tpd = &txq->tpd[txq->write_idx]; | ||
1068 | tpd = first_tpd; | ||
1069 | |||
1070 | maplen = skb_headlen(skb); | ||
1071 | dma = dma_map_single(&alx->hw.pdev->dev, skb->data, maplen, | ||
1072 | DMA_TO_DEVICE); | ||
1073 | if (dma_mapping_error(&alx->hw.pdev->dev, dma)) | ||
1074 | goto err_dma; | ||
1075 | |||
1076 | dma_unmap_len_set(&txq->bufs[txq->write_idx], size, maplen); | ||
1077 | dma_unmap_addr_set(&txq->bufs[txq->write_idx], dma, dma); | ||
1078 | |||
1079 | tpd->adrl.addr = cpu_to_le64(dma); | ||
1080 | tpd->len = cpu_to_le16(maplen); | ||
1081 | |||
1082 | for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) { | ||
1083 | struct skb_frag_struct *frag; | ||
1084 | |||
1085 | frag = &skb_shinfo(skb)->frags[f]; | ||
1086 | |||
1087 | if (++txq->write_idx == alx->tx_ringsz) | ||
1088 | txq->write_idx = 0; | ||
1089 | tpd = &txq->tpd[txq->write_idx]; | ||
1090 | |||
1091 | tpd->word1 = first_tpd->word1; | ||
1092 | |||
1093 | maplen = skb_frag_size(frag); | ||
1094 | dma = skb_frag_dma_map(&alx->hw.pdev->dev, frag, 0, | ||
1095 | maplen, DMA_TO_DEVICE); | ||
1096 | if (dma_mapping_error(&alx->hw.pdev->dev, dma)) | ||
1097 | goto err_dma; | ||
1098 | dma_unmap_len_set(&txq->bufs[txq->write_idx], size, maplen); | ||
1099 | dma_unmap_addr_set(&txq->bufs[txq->write_idx], dma, dma); | ||
1100 | |||
1101 | tpd->adrl.addr = cpu_to_le64(dma); | ||
1102 | tpd->len = cpu_to_le16(maplen); | ||
1103 | } | ||
1104 | |||
1105 | /* last TPD, set EOP flag and store skb */ | ||
1106 | tpd->word1 |= cpu_to_le32(1 << TPD_EOP_SHIFT); | ||
1107 | txq->bufs[txq->write_idx].skb = skb; | ||
1108 | |||
1109 | if (++txq->write_idx == alx->tx_ringsz) | ||
1110 | txq->write_idx = 0; | ||
1111 | |||
1112 | return 0; | ||
1113 | |||
1114 | err_dma: | ||
1115 | f = first_idx; | ||
1116 | while (f != txq->write_idx) { | ||
1117 | alx_free_txbuf(alx, f); | ||
1118 | if (++f == alx->tx_ringsz) | ||
1119 | f = 0; | ||
1120 | } | ||
1121 | return -ENOMEM; | ||
1122 | } | ||
1123 | |||
1124 | static netdev_tx_t alx_start_xmit(struct sk_buff *skb, | ||
1125 | struct net_device *netdev) | ||
1126 | { | ||
1127 | struct alx_priv *alx = netdev_priv(netdev); | ||
1128 | struct alx_tx_queue *txq = &alx->txq; | ||
1129 | struct alx_txd *first; | ||
1130 | int tpdreq = skb_shinfo(skb)->nr_frags + 1; | ||
1131 | |||
1132 | if (alx_tpd_avail(alx) < tpdreq) { | ||
1133 | netif_stop_queue(alx->dev); | ||
1134 | goto drop; | ||
1135 | } | ||
1136 | |||
1137 | first = &txq->tpd[txq->write_idx]; | ||
1138 | memset(first, 0, sizeof(*first)); | ||
1139 | |||
1140 | if (alx_tx_csum(skb, first)) | ||
1141 | goto drop; | ||
1142 | |||
1143 | if (alx_map_tx_skb(alx, skb) < 0) | ||
1144 | goto drop; | ||
1145 | |||
1146 | netdev_sent_queue(alx->dev, skb->len); | ||
1147 | |||
1148 | /* flush updates before updating hardware */ | ||
1149 | wmb(); | ||
1150 | alx_write_mem16(&alx->hw, ALX_TPD_PRI0_PIDX, txq->write_idx); | ||
1151 | |||
1152 | if (alx_tpd_avail(alx) < alx->tx_ringsz/8) | ||
1153 | netif_stop_queue(alx->dev); | ||
1154 | |||
1155 | return NETDEV_TX_OK; | ||
1156 | |||
1157 | drop: | ||
1158 | dev_kfree_skb(skb); | ||
1159 | return NETDEV_TX_OK; | ||
1160 | } | ||
1161 | |||
1162 | static void alx_tx_timeout(struct net_device *dev) | ||
1163 | { | ||
1164 | struct alx_priv *alx = netdev_priv(dev); | ||
1165 | |||
1166 | alx_schedule_reset(alx); | ||
1167 | } | ||
1168 | |||
1169 | static int alx_mdio_read(struct net_device *netdev, | ||
1170 | int prtad, int devad, u16 addr) | ||
1171 | { | ||
1172 | struct alx_priv *alx = netdev_priv(netdev); | ||
1173 | struct alx_hw *hw = &alx->hw; | ||
1174 | u16 val; | ||
1175 | int err; | ||
1176 | |||
1177 | if (prtad != hw->mdio.prtad) | ||
1178 | return -EINVAL; | ||
1179 | |||
1180 | if (devad == MDIO_DEVAD_NONE) | ||
1181 | err = alx_read_phy_reg(hw, addr, &val); | ||
1182 | else | ||
1183 | err = alx_read_phy_ext(hw, devad, addr, &val); | ||
1184 | |||
1185 | if (err) | ||
1186 | return err; | ||
1187 | return val; | ||
1188 | } | ||
1189 | |||
1190 | static int alx_mdio_write(struct net_device *netdev, | ||
1191 | int prtad, int devad, u16 addr, u16 val) | ||
1192 | { | ||
1193 | struct alx_priv *alx = netdev_priv(netdev); | ||
1194 | struct alx_hw *hw = &alx->hw; | ||
1195 | |||
1196 | if (prtad != hw->mdio.prtad) | ||
1197 | return -EINVAL; | ||
1198 | |||
1199 | if (devad == MDIO_DEVAD_NONE) | ||
1200 | return alx_write_phy_reg(hw, addr, val); | ||
1201 | |||
1202 | return alx_write_phy_ext(hw, devad, addr, val); | ||
1203 | } | ||
1204 | |||
1205 | static int alx_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) | ||
1206 | { | ||
1207 | struct alx_priv *alx = netdev_priv(netdev); | ||
1208 | |||
1209 | if (!netif_running(netdev)) | ||
1210 | return -EAGAIN; | ||
1211 | |||
1212 | return mdio_mii_ioctl(&alx->hw.mdio, if_mii(ifr), cmd); | ||
1213 | } | ||
1214 | |||
1215 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
1216 | static void alx_poll_controller(struct net_device *netdev) | ||
1217 | { | ||
1218 | struct alx_priv *alx = netdev_priv(netdev); | ||
1219 | |||
1220 | if (alx->msi) | ||
1221 | alx_intr_msi(0, alx); | ||
1222 | else | ||
1223 | alx_intr_legacy(0, alx); | ||
1224 | } | ||
1225 | #endif | ||
1226 | |||
1227 | static const struct net_device_ops alx_netdev_ops = { | ||
1228 | .ndo_open = alx_open, | ||
1229 | .ndo_stop = alx_stop, | ||
1230 | .ndo_start_xmit = alx_start_xmit, | ||
1231 | .ndo_set_rx_mode = alx_set_rx_mode, | ||
1232 | .ndo_validate_addr = eth_validate_addr, | ||
1233 | .ndo_set_mac_address = alx_set_mac_address, | ||
1234 | .ndo_change_mtu = alx_change_mtu, | ||
1235 | .ndo_do_ioctl = alx_ioctl, | ||
1236 | .ndo_tx_timeout = alx_tx_timeout, | ||
1237 | .ndo_fix_features = alx_fix_features, | ||
1238 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
1239 | .ndo_poll_controller = alx_poll_controller, | ||
1240 | #endif | ||
1241 | }; | ||
1242 | |||
1243 | static int alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
1244 | { | ||
1245 | struct net_device *netdev; | ||
1246 | struct alx_priv *alx; | ||
1247 | struct alx_hw *hw; | ||
1248 | bool phy_configured; | ||
1249 | int bars, pm_cap, err; | ||
1250 | |||
1251 | err = pci_enable_device_mem(pdev); | ||
1252 | if (err) | ||
1253 | return err; | ||
1254 | |||
1255 | /* The alx chip can DMA to 64-bit addresses, but it uses a single | ||
1256 | * shared register for the high 32 bits, so only a single, aligned, | ||
1257 | * 4 GB physical address range can be used for descriptors. | ||
1258 | */ | ||
1259 | if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) && | ||
1260 | !dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64))) { | ||
1261 | dev_dbg(&pdev->dev, "DMA to 64-BIT addresses\n"); | ||
1262 | } else { | ||
1263 | err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); | ||
1264 | if (err) { | ||
1265 | err = dma_set_coherent_mask(&pdev->dev, | ||
1266 | DMA_BIT_MASK(32)); | ||
1267 | if (err) { | ||
1268 | dev_err(&pdev->dev, | ||
1269 | "No usable DMA config, aborting\n"); | ||
1270 | goto out_pci_disable; | ||
1271 | } | ||
1272 | } | ||
1273 | } | ||
1274 | |||
1275 | bars = pci_select_bars(pdev, IORESOURCE_MEM); | ||
1276 | err = pci_request_selected_regions(pdev, bars, alx_drv_name); | ||
1277 | if (err) { | ||
1278 | dev_err(&pdev->dev, | ||
1279 | "pci_request_selected_regions failed(bars:%d)\n", bars); | ||
1280 | goto out_pci_disable; | ||
1281 | } | ||
1282 | |||
1283 | pci_enable_pcie_error_reporting(pdev); | ||
1284 | pci_set_master(pdev); | ||
1285 | |||
1286 | pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); | ||
1287 | if (pm_cap == 0) { | ||
1288 | dev_err(&pdev->dev, | ||
1289 | "Can't find power management capability, aborting\n"); | ||
1290 | err = -EIO; | ||
1291 | goto out_pci_release; | ||
1292 | } | ||
1293 | |||
1294 | err = pci_set_power_state(pdev, PCI_D0); | ||
1295 | if (err) | ||
1296 | goto out_pci_release; | ||
1297 | |||
1298 | netdev = alloc_etherdev(sizeof(*alx)); | ||
1299 | if (!netdev) { | ||
1300 | err = -ENOMEM; | ||
1301 | goto out_pci_release; | ||
1302 | } | ||
1303 | |||
1304 | SET_NETDEV_DEV(netdev, &pdev->dev); | ||
1305 | alx = netdev_priv(netdev); | ||
1306 | alx->dev = netdev; | ||
1307 | alx->hw.pdev = pdev; | ||
1308 | alx->msg_enable = NETIF_MSG_LINK | NETIF_MSG_HW | NETIF_MSG_IFUP | | ||
1309 | NETIF_MSG_TX_ERR | NETIF_MSG_RX_ERR | NETIF_MSG_WOL; | ||
1310 | hw = &alx->hw; | ||
1311 | pci_set_drvdata(pdev, alx); | ||
1312 | |||
1313 | hw->hw_addr = pci_ioremap_bar(pdev, 0); | ||
1314 | if (!hw->hw_addr) { | ||
1315 | dev_err(&pdev->dev, "cannot map device registers\n"); | ||
1316 | err = -EIO; | ||
1317 | goto out_free_netdev; | ||
1318 | } | ||
1319 | |||
1320 | netdev->netdev_ops = &alx_netdev_ops; | ||
1321 | SET_ETHTOOL_OPS(netdev, &alx_ethtool_ops); | ||
1322 | netdev->irq = pdev->irq; | ||
1323 | netdev->watchdog_timeo = ALX_WATCHDOG_TIME; | ||
1324 | |||
1325 | if (ent->driver_data & ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG) | ||
1326 | pdev->dev_flags |= PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG; | ||
1327 | |||
1328 | err = alx_init_sw(alx); | ||
1329 | if (err) { | ||
1330 | dev_err(&pdev->dev, "net device private data init failed\n"); | ||
1331 | goto out_unmap; | ||
1332 | } | ||
1333 | |||
1334 | alx_reset_pcie(hw); | ||
1335 | |||
1336 | phy_configured = alx_phy_configured(hw); | ||
1337 | |||
1338 | if (!phy_configured) | ||
1339 | alx_reset_phy(hw); | ||
1340 | |||
1341 | err = alx_reset_mac(hw); | ||
1342 | if (err) { | ||
1343 | dev_err(&pdev->dev, "MAC Reset failed, error = %d\n", err); | ||
1344 | goto out_unmap; | ||
1345 | } | ||
1346 | |||
1347 | /* setup link to put it in a known good starting state */ | ||
1348 | if (!phy_configured) { | ||
1349 | err = alx_setup_speed_duplex(hw, hw->adv_cfg, hw->flowctrl); | ||
1350 | if (err) { | ||
1351 | dev_err(&pdev->dev, | ||
1352 | "failed to configure PHY speed/duplex (err=%d)\n", | ||
1353 | err); | ||
1354 | goto out_unmap; | ||
1355 | } | ||
1356 | } | ||
1357 | |||
1358 | netdev->hw_features = NETIF_F_SG | NETIF_F_HW_CSUM; | ||
1359 | |||
1360 | if (alx_get_perm_macaddr(hw, hw->perm_addr)) { | ||
1361 | dev_warn(&pdev->dev, | ||
1362 | "Invalid permanent address programmed, using random one\n"); | ||
1363 | eth_hw_addr_random(netdev); | ||
1364 | memcpy(hw->perm_addr, netdev->dev_addr, netdev->addr_len); | ||
1365 | } | ||
1366 | |||
1367 | memcpy(hw->mac_addr, hw->perm_addr, ETH_ALEN); | ||
1368 | memcpy(netdev->dev_addr, hw->mac_addr, ETH_ALEN); | ||
1369 | memcpy(netdev->perm_addr, hw->perm_addr, ETH_ALEN); | ||
1370 | |||
1371 | hw->mdio.prtad = 0; | ||
1372 | hw->mdio.mmds = 0; | ||
1373 | hw->mdio.dev = netdev; | ||
1374 | hw->mdio.mode_support = MDIO_SUPPORTS_C45 | | ||
1375 | MDIO_SUPPORTS_C22 | | ||
1376 | MDIO_EMULATE_C22; | ||
1377 | hw->mdio.mdio_read = alx_mdio_read; | ||
1378 | hw->mdio.mdio_write = alx_mdio_write; | ||
1379 | |||
1380 | if (!alx_get_phy_info(hw)) { | ||
1381 | dev_err(&pdev->dev, "failed to identify PHY\n"); | ||
1382 | err = -EIO; | ||
1383 | goto out_unmap; | ||
1384 | } | ||
1385 | |||
1386 | INIT_WORK(&alx->link_check_wk, alx_link_check); | ||
1387 | INIT_WORK(&alx->reset_wk, alx_reset); | ||
1388 | spin_lock_init(&alx->hw.mdio_lock); | ||
1389 | spin_lock_init(&alx->irq_lock); | ||
1390 | |||
1391 | netif_carrier_off(netdev); | ||
1392 | |||
1393 | err = register_netdev(netdev); | ||
1394 | if (err) { | ||
1395 | dev_err(&pdev->dev, "register netdevice failed\n"); | ||
1396 | goto out_unmap; | ||
1397 | } | ||
1398 | |||
1399 | device_set_wakeup_enable(&pdev->dev, hw->sleep_ctrl); | ||
1400 | |||
1401 | netdev_info(netdev, | ||
1402 | "Qualcomm Atheros AR816x/AR817x Ethernet [%pM]\n", | ||
1403 | netdev->dev_addr); | ||
1404 | |||
1405 | return 0; | ||
1406 | |||
1407 | out_unmap: | ||
1408 | iounmap(hw->hw_addr); | ||
1409 | out_free_netdev: | ||
1410 | free_netdev(netdev); | ||
1411 | out_pci_release: | ||
1412 | pci_release_selected_regions(pdev, bars); | ||
1413 | out_pci_disable: | ||
1414 | pci_disable_device(pdev); | ||
1415 | return err; | ||
1416 | } | ||
1417 | |||
1418 | static void alx_remove(struct pci_dev *pdev) | ||
1419 | { | ||
1420 | struct alx_priv *alx = pci_get_drvdata(pdev); | ||
1421 | struct alx_hw *hw = &alx->hw; | ||
1422 | |||
1423 | cancel_work_sync(&alx->link_check_wk); | ||
1424 | cancel_work_sync(&alx->reset_wk); | ||
1425 | |||
1426 | /* restore permanent mac address */ | ||
1427 | alx_set_macaddr(hw, hw->perm_addr); | ||
1428 | |||
1429 | unregister_netdev(alx->dev); | ||
1430 | iounmap(hw->hw_addr); | ||
1431 | pci_release_selected_regions(pdev, | ||
1432 | pci_select_bars(pdev, IORESOURCE_MEM)); | ||
1433 | |||
1434 | pci_disable_pcie_error_reporting(pdev); | ||
1435 | pci_disable_device(pdev); | ||
1436 | pci_set_drvdata(pdev, NULL); | ||
1437 | |||
1438 | free_netdev(alx->dev); | ||
1439 | } | ||
1440 | |||
1441 | #ifdef CONFIG_PM_SLEEP | ||
1442 | static int alx_suspend(struct device *dev) | ||
1443 | { | ||
1444 | struct pci_dev *pdev = to_pci_dev(dev); | ||
1445 | int err; | ||
1446 | bool wol_en; | ||
1447 | |||
1448 | err = __alx_shutdown(pdev, &wol_en); | ||
1449 | if (err) { | ||
1450 | dev_err(&pdev->dev, "shutdown fail in suspend %d\n", err); | ||
1451 | return err; | ||
1452 | } | ||
1453 | |||
1454 | if (wol_en) { | ||
1455 | pci_prepare_to_sleep(pdev); | ||
1456 | } else { | ||
1457 | pci_wake_from_d3(pdev, false); | ||
1458 | pci_set_power_state(pdev, PCI_D3hot); | ||
1459 | } | ||
1460 | |||
1461 | return 0; | ||
1462 | } | ||
1463 | |||
1464 | static int alx_resume(struct device *dev) | ||
1465 | { | ||
1466 | struct pci_dev *pdev = to_pci_dev(dev); | ||
1467 | struct alx_priv *alx = pci_get_drvdata(pdev); | ||
1468 | struct net_device *netdev = alx->dev; | ||
1469 | struct alx_hw *hw = &alx->hw; | ||
1470 | int err; | ||
1471 | |||
1472 | pci_set_power_state(pdev, PCI_D0); | ||
1473 | pci_restore_state(pdev); | ||
1474 | pci_save_state(pdev); | ||
1475 | |||
1476 | pci_enable_wake(pdev, PCI_D3hot, 0); | ||
1477 | pci_enable_wake(pdev, PCI_D3cold, 0); | ||
1478 | |||
1479 | hw->link_speed = SPEED_UNKNOWN; | ||
1480 | alx->int_mask = ALX_ISR_MISC; | ||
1481 | |||
1482 | alx_reset_pcie(hw); | ||
1483 | alx_reset_phy(hw); | ||
1484 | |||
1485 | err = alx_reset_mac(hw); | ||
1486 | if (err) { | ||
1487 | netif_err(alx, hw, alx->dev, | ||
1488 | "resume:reset_mac fail %d\n", err); | ||
1489 | return -EIO; | ||
1490 | } | ||
1491 | |||
1492 | err = alx_setup_speed_duplex(hw, hw->adv_cfg, hw->flowctrl); | ||
1493 | if (err) { | ||
1494 | netif_err(alx, hw, alx->dev, | ||
1495 | "resume:setup_speed_duplex fail %d\n", err); | ||
1496 | return -EIO; | ||
1497 | } | ||
1498 | |||
1499 | if (netif_running(netdev)) { | ||
1500 | err = __alx_open(alx, true); | ||
1501 | if (err) | ||
1502 | return err; | ||
1503 | } | ||
1504 | |||
1505 | netif_device_attach(netdev); | ||
1506 | |||
1507 | return err; | ||
1508 | } | ||
1509 | #endif | ||
1510 | |||
1511 | static pci_ers_result_t alx_pci_error_detected(struct pci_dev *pdev, | ||
1512 | pci_channel_state_t state) | ||
1513 | { | ||
1514 | struct alx_priv *alx = pci_get_drvdata(pdev); | ||
1515 | struct net_device *netdev = alx->dev; | ||
1516 | pci_ers_result_t rc = PCI_ERS_RESULT_NEED_RESET; | ||
1517 | |||
1518 | dev_info(&pdev->dev, "pci error detected\n"); | ||
1519 | |||
1520 | rtnl_lock(); | ||
1521 | |||
1522 | if (netif_running(netdev)) { | ||
1523 | netif_device_detach(netdev); | ||
1524 | alx_halt(alx); | ||
1525 | } | ||
1526 | |||
1527 | if (state == pci_channel_io_perm_failure) | ||
1528 | rc = PCI_ERS_RESULT_DISCONNECT; | ||
1529 | else | ||
1530 | pci_disable_device(pdev); | ||
1531 | |||
1532 | rtnl_unlock(); | ||
1533 | |||
1534 | return rc; | ||
1535 | } | ||
1536 | |||
1537 | static pci_ers_result_t alx_pci_error_slot_reset(struct pci_dev *pdev) | ||
1538 | { | ||
1539 | struct alx_priv *alx = pci_get_drvdata(pdev); | ||
1540 | struct alx_hw *hw = &alx->hw; | ||
1541 | pci_ers_result_t rc = PCI_ERS_RESULT_DISCONNECT; | ||
1542 | |||
1543 | dev_info(&pdev->dev, "pci error slot reset\n"); | ||
1544 | |||
1545 | rtnl_lock(); | ||
1546 | |||
1547 | if (pci_enable_device(pdev)) { | ||
1548 | dev_err(&pdev->dev, "Failed to re-enable PCI device after reset\n"); | ||
1549 | goto out; | ||
1550 | } | ||
1551 | |||
1552 | pci_set_master(pdev); | ||
1553 | pci_enable_wake(pdev, PCI_D3hot, 0); | ||
1554 | pci_enable_wake(pdev, PCI_D3cold, 0); | ||
1555 | |||
1556 | alx_reset_pcie(hw); | ||
1557 | if (!alx_reset_mac(hw)) | ||
1558 | rc = PCI_ERS_RESULT_RECOVERED; | ||
1559 | out: | ||
1560 | pci_cleanup_aer_uncorrect_error_status(pdev); | ||
1561 | |||
1562 | rtnl_unlock(); | ||
1563 | |||
1564 | return rc; | ||
1565 | } | ||
1566 | |||
1567 | static void alx_pci_error_resume(struct pci_dev *pdev) | ||
1568 | { | ||
1569 | struct alx_priv *alx = pci_get_drvdata(pdev); | ||
1570 | struct net_device *netdev = alx->dev; | ||
1571 | |||
1572 | dev_info(&pdev->dev, "pci error resume\n"); | ||
1573 | |||
1574 | rtnl_lock(); | ||
1575 | |||
1576 | if (netif_running(netdev)) { | ||
1577 | alx_activate(alx); | ||
1578 | netif_device_attach(netdev); | ||
1579 | } | ||
1580 | |||
1581 | rtnl_unlock(); | ||
1582 | } | ||
1583 | |||
1584 | static const struct pci_error_handlers alx_err_handlers = { | ||
1585 | .error_detected = alx_pci_error_detected, | ||
1586 | .slot_reset = alx_pci_error_slot_reset, | ||
1587 | .resume = alx_pci_error_resume, | ||
1588 | }; | ||
1589 | |||
1590 | #ifdef CONFIG_PM_SLEEP | ||
1591 | static SIMPLE_DEV_PM_OPS(alx_pm_ops, alx_suspend, alx_resume); | ||
1592 | #define ALX_PM_OPS (&alx_pm_ops) | ||
1593 | #else | ||
1594 | #define ALX_PM_OPS NULL | ||
1595 | #endif | ||
1596 | |||
1597 | static DEFINE_PCI_DEVICE_TABLE(alx_pci_tbl) = { | ||
1598 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_AR8161), | ||
1599 | .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, | ||
1600 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_E2200), | ||
1601 | .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, | ||
1602 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_AR8162), | ||
1603 | .driver_data = ALX_DEV_QUIRK_MSI_INTX_DISABLE_BUG }, | ||
1604 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_AR8171) }, | ||
1605 | { PCI_VDEVICE(ATTANSIC, ALX_DEV_ID_AR8172) }, | ||
1606 | {} | ||
1607 | }; | ||
1608 | |||
1609 | static struct pci_driver alx_driver = { | ||
1610 | .name = alx_drv_name, | ||
1611 | .id_table = alx_pci_tbl, | ||
1612 | .probe = alx_probe, | ||
1613 | .remove = alx_remove, | ||
1614 | .shutdown = alx_shutdown, | ||
1615 | .err_handler = &alx_err_handlers, | ||
1616 | .driver.pm = ALX_PM_OPS, | ||
1617 | }; | ||
1618 | |||
1619 | module_pci_driver(alx_driver); | ||
1620 | MODULE_DEVICE_TABLE(pci, alx_pci_tbl); | ||
1621 | MODULE_AUTHOR("Johannes Berg <johannes@sipsolutions.net>"); | ||
1622 | MODULE_AUTHOR("Qualcomm Corporation, <nic-devel@qualcomm.com>"); | ||
1623 | MODULE_DESCRIPTION( | ||
1624 | "Qualcomm Atheros(R) AR816x/AR817x PCI-E Ethernet Network Driver"); | ||
1625 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/ethernet/atheros/alx/reg.h b/drivers/net/ethernet/atheros/alx/reg.h new file mode 100644 index 000000000000..e4358c98bc4e --- /dev/null +++ b/drivers/net/ethernet/atheros/alx/reg.h | |||
@@ -0,0 +1,810 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2013 Johannes Berg <johannes@sipsolutions.net> | ||
3 | * | ||
4 | * This file is free software: you may copy, redistribute and/or modify it | ||
5 | * under the terms of the GNU General Public License as published by the | ||
6 | * Free Software Foundation, either version 2 of the License, or (at your | ||
7 | * option) any later version. | ||
8 | * | ||
9 | * This file is distributed in the hope that it will be useful, but | ||
10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
12 | * General Public License for more details. | ||
13 | * | ||
14 | * You should have received a copy of the GNU General Public License | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
16 | * | ||
17 | * This file incorporates work covered by the following copyright and | ||
18 | * permission notice: | ||
19 | * | ||
20 | * Copyright (c) 2012 Qualcomm Atheros, Inc. | ||
21 | * | ||
22 | * Permission to use, copy, modify, and/or distribute this software for any | ||
23 | * purpose with or without fee is hereby granted, provided that the above | ||
24 | * copyright notice and this permission notice appear in all copies. | ||
25 | * | ||
26 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
27 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
28 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
29 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
30 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
31 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
32 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
33 | */ | ||
34 | |||
35 | #ifndef ALX_REG_H | ||
36 | #define ALX_REG_H | ||
37 | |||
38 | #define ALX_DEV_ID_AR8161 0x1091 | ||
39 | #define ALX_DEV_ID_E2200 0xe091 | ||
40 | #define ALX_DEV_ID_AR8162 0x1090 | ||
41 | #define ALX_DEV_ID_AR8171 0x10A1 | ||
42 | #define ALX_DEV_ID_AR8172 0x10A0 | ||
43 | |||
44 | /* rev definition, | ||
45 | * bit(0): with xD support | ||
46 | * bit(1): with Card Reader function | ||
47 | * bit(7:2): real revision | ||
48 | */ | ||
49 | #define ALX_PCI_REVID_SHIFT 3 | ||
50 | #define ALX_REV_A0 0 | ||
51 | #define ALX_REV_A1 1 | ||
52 | #define ALX_REV_B0 2 | ||
53 | #define ALX_REV_C0 3 | ||
54 | |||
55 | #define ALX_DEV_CTRL 0x0060 | ||
56 | #define ALX_DEV_CTRL_MAXRRS_MIN 2 | ||
57 | |||
58 | #define ALX_MSIX_MASK 0x0090 | ||
59 | |||
60 | #define ALX_UE_SVRT 0x010C | ||
61 | #define ALX_UE_SVRT_FCPROTERR BIT(13) | ||
62 | #define ALX_UE_SVRT_DLPROTERR BIT(4) | ||
63 | |||
64 | /* eeprom & flash load register */ | ||
65 | #define ALX_EFLD 0x0204 | ||
66 | #define ALX_EFLD_F_EXIST BIT(10) | ||
67 | #define ALX_EFLD_E_EXIST BIT(9) | ||
68 | #define ALX_EFLD_STAT BIT(5) | ||
69 | #define ALX_EFLD_START BIT(0) | ||
70 | |||
71 | /* eFuse load register */ | ||
72 | #define ALX_SLD 0x0218 | ||
73 | #define ALX_SLD_STAT BIT(12) | ||
74 | #define ALX_SLD_START BIT(11) | ||
75 | #define ALX_SLD_MAX_TO 100 | ||
76 | |||
77 | #define ALX_PDLL_TRNS1 0x1104 | ||
78 | #define ALX_PDLL_TRNS1_D3PLLOFF_EN BIT(11) | ||
79 | |||
80 | #define ALX_PMCTRL 0x12F8 | ||
81 | #define ALX_PMCTRL_HOTRST_WTEN BIT(31) | ||
82 | /* bit30: L0s/L1 controlled by MAC based on throughput(setting in 15A0) */ | ||
83 | #define ALX_PMCTRL_ASPM_FCEN BIT(30) | ||
84 | #define ALX_PMCTRL_SADLY_EN BIT(29) | ||
85 | #define ALX_PMCTRL_LCKDET_TIMER_MASK 0xF | ||
86 | #define ALX_PMCTRL_LCKDET_TIMER_SHIFT 24 | ||
87 | #define ALX_PMCTRL_LCKDET_TIMER_DEF 0xC | ||
88 | /* bit[23:20] if pm_request_l1 time > @, then enter L0s not L1 */ | ||
89 | #define ALX_PMCTRL_L1REQ_TO_MASK 0xF | ||
90 | #define ALX_PMCTRL_L1REQ_TO_SHIFT 20 | ||
91 | #define ALX_PMCTRL_L1REG_TO_DEF 0xF | ||
92 | #define ALX_PMCTRL_TXL1_AFTER_L0S BIT(19) | ||
93 | #define ALX_PMCTRL_L1_TIMER_MASK 0x7 | ||
94 | #define ALX_PMCTRL_L1_TIMER_SHIFT 16 | ||
95 | #define ALX_PMCTRL_L1_TIMER_16US 4 | ||
96 | #define ALX_PMCTRL_RCVR_WT_1US BIT(15) | ||
97 | /* bit13: enable pcie clk switch in L1 state */ | ||
98 | #define ALX_PMCTRL_L1_CLKSW_EN BIT(13) | ||
99 | #define ALX_PMCTRL_L0S_EN BIT(12) | ||
100 | #define ALX_PMCTRL_RXL1_AFTER_L0S BIT(11) | ||
101 | #define ALX_PMCTRL_L1_BUFSRX_EN BIT(7) | ||
102 | /* bit6: power down serdes RX */ | ||
103 | #define ALX_PMCTRL_L1_SRDSRX_PWD BIT(6) | ||
104 | #define ALX_PMCTRL_L1_SRDSPLL_EN BIT(5) | ||
105 | #define ALX_PMCTRL_L1_SRDS_EN BIT(4) | ||
106 | #define ALX_PMCTRL_L1_EN BIT(3) | ||
107 | |||
108 | /*******************************************************/ | ||
109 | /* following registers are mapped only to memory space */ | ||
110 | /*******************************************************/ | ||
111 | |||
112 | #define ALX_MASTER 0x1400 | ||
113 | /* bit12: 1:alwys select pclk from serdes, not sw to 25M */ | ||
114 | #define ALX_MASTER_PCLKSEL_SRDS BIT(12) | ||
115 | /* bit11: irq moduration for rx */ | ||
116 | #define ALX_MASTER_IRQMOD2_EN BIT(11) | ||
117 | /* bit10: irq moduration for tx/rx */ | ||
118 | #define ALX_MASTER_IRQMOD1_EN BIT(10) | ||
119 | #define ALX_MASTER_SYSALVTIMER_EN BIT(7) | ||
120 | #define ALX_MASTER_OOB_DIS BIT(6) | ||
121 | /* bit5: wakeup without pcie clk */ | ||
122 | #define ALX_MASTER_WAKEN_25M BIT(5) | ||
123 | /* bit0: MAC & DMA reset */ | ||
124 | #define ALX_MASTER_DMA_MAC_RST BIT(0) | ||
125 | #define ALX_DMA_MAC_RST_TO 50 | ||
126 | |||
127 | #define ALX_IRQ_MODU_TIMER 0x1408 | ||
128 | #define ALX_IRQ_MODU_TIMER1_MASK 0xFFFF | ||
129 | #define ALX_IRQ_MODU_TIMER1_SHIFT 0 | ||
130 | |||
131 | #define ALX_PHY_CTRL 0x140C | ||
132 | #define ALX_PHY_CTRL_100AB_EN BIT(17) | ||
133 | /* bit14: affect MAC & PHY, go to low power sts */ | ||
134 | #define ALX_PHY_CTRL_POWER_DOWN BIT(14) | ||
135 | /* bit13: 1:pll always ON, 0:can switch in lpw */ | ||
136 | #define ALX_PHY_CTRL_PLL_ON BIT(13) | ||
137 | #define ALX_PHY_CTRL_RST_ANALOG BIT(12) | ||
138 | #define ALX_PHY_CTRL_HIB_PULSE BIT(11) | ||
139 | #define ALX_PHY_CTRL_HIB_EN BIT(10) | ||
140 | #define ALX_PHY_CTRL_IDDQ BIT(7) | ||
141 | #define ALX_PHY_CTRL_GATE_25M BIT(5) | ||
142 | #define ALX_PHY_CTRL_LED_MODE BIT(2) | ||
143 | /* bit0: out of dsp RST state */ | ||
144 | #define ALX_PHY_CTRL_DSPRST_OUT BIT(0) | ||
145 | #define ALX_PHY_CTRL_DSPRST_TO 80 | ||
146 | #define ALX_PHY_CTRL_CLS (ALX_PHY_CTRL_LED_MODE | \ | ||
147 | ALX_PHY_CTRL_100AB_EN | \ | ||
148 | ALX_PHY_CTRL_PLL_ON) | ||
149 | |||
150 | #define ALX_MAC_STS 0x1410 | ||
151 | #define ALX_MAC_STS_TXQ_BUSY BIT(3) | ||
152 | #define ALX_MAC_STS_RXQ_BUSY BIT(2) | ||
153 | #define ALX_MAC_STS_TXMAC_BUSY BIT(1) | ||
154 | #define ALX_MAC_STS_RXMAC_BUSY BIT(0) | ||
155 | #define ALX_MAC_STS_IDLE (ALX_MAC_STS_TXQ_BUSY | \ | ||
156 | ALX_MAC_STS_RXQ_BUSY | \ | ||
157 | ALX_MAC_STS_TXMAC_BUSY | \ | ||
158 | ALX_MAC_STS_RXMAC_BUSY) | ||
159 | |||
160 | #define ALX_MDIO 0x1414 | ||
161 | #define ALX_MDIO_MODE_EXT BIT(30) | ||
162 | #define ALX_MDIO_BUSY BIT(27) | ||
163 | #define ALX_MDIO_CLK_SEL_MASK 0x7 | ||
164 | #define ALX_MDIO_CLK_SEL_SHIFT 24 | ||
165 | #define ALX_MDIO_CLK_SEL_25MD4 0 | ||
166 | #define ALX_MDIO_CLK_SEL_25MD128 7 | ||
167 | #define ALX_MDIO_START BIT(23) | ||
168 | #define ALX_MDIO_SPRES_PRMBL BIT(22) | ||
169 | /* bit21: 1:read,0:write */ | ||
170 | #define ALX_MDIO_OP_READ BIT(21) | ||
171 | #define ALX_MDIO_REG_MASK 0x1F | ||
172 | #define ALX_MDIO_REG_SHIFT 16 | ||
173 | #define ALX_MDIO_DATA_MASK 0xFFFF | ||
174 | #define ALX_MDIO_DATA_SHIFT 0 | ||
175 | #define ALX_MDIO_MAX_AC_TO 120 | ||
176 | |||
177 | #define ALX_MDIO_EXTN 0x1448 | ||
178 | #define ALX_MDIO_EXTN_DEVAD_MASK 0x1F | ||
179 | #define ALX_MDIO_EXTN_DEVAD_SHIFT 16 | ||
180 | #define ALX_MDIO_EXTN_REG_MASK 0xFFFF | ||
181 | #define ALX_MDIO_EXTN_REG_SHIFT 0 | ||
182 | |||
183 | #define ALX_SERDES 0x1424 | ||
184 | #define ALX_SERDES_PHYCLK_SLWDWN BIT(18) | ||
185 | #define ALX_SERDES_MACCLK_SLWDWN BIT(17) | ||
186 | |||
187 | #define ALX_LPI_CTRL 0x1440 | ||
188 | #define ALX_LPI_CTRL_EN BIT(0) | ||
189 | |||
190 | /* for B0+, bit[13..] for C0+ */ | ||
191 | #define ALX_HRTBT_EXT_CTRL 0x1AD0 | ||
192 | #define L1F_HRTBT_EXT_CTRL_PERIOD_HIGH_MASK 0x3F | ||
193 | #define L1F_HRTBT_EXT_CTRL_PERIOD_HIGH_SHIFT 24 | ||
194 | #define L1F_HRTBT_EXT_CTRL_SWOI_STARTUP_PKT_EN BIT(23) | ||
195 | #define L1F_HRTBT_EXT_CTRL_IOAC_2_FRAGMENTED BIT(22) | ||
196 | #define L1F_HRTBT_EXT_CTRL_IOAC_1_FRAGMENTED BIT(21) | ||
197 | #define L1F_HRTBT_EXT_CTRL_IOAC_1_KEEPALIVE_EN BIT(20) | ||
198 | #define L1F_HRTBT_EXT_CTRL_IOAC_1_HAS_VLAN BIT(19) | ||
199 | #define L1F_HRTBT_EXT_CTRL_IOAC_1_IS_8023 BIT(18) | ||
200 | #define L1F_HRTBT_EXT_CTRL_IOAC_1_IS_IPV6 BIT(17) | ||
201 | #define L1F_HRTBT_EXT_CTRL_IOAC_2_KEEPALIVE_EN BIT(16) | ||
202 | #define L1F_HRTBT_EXT_CTRL_IOAC_2_HAS_VLAN BIT(15) | ||
203 | #define L1F_HRTBT_EXT_CTRL_IOAC_2_IS_8023 BIT(14) | ||
204 | #define L1F_HRTBT_EXT_CTRL_IOAC_2_IS_IPV6 BIT(13) | ||
205 | #define ALX_HRTBT_EXT_CTRL_NS_EN BIT(12) | ||
206 | #define ALX_HRTBT_EXT_CTRL_FRAG_LEN_MASK 0xFF | ||
207 | #define ALX_HRTBT_EXT_CTRL_FRAG_LEN_SHIFT 4 | ||
208 | #define ALX_HRTBT_EXT_CTRL_IS_8023 BIT(3) | ||
209 | #define ALX_HRTBT_EXT_CTRL_IS_IPV6 BIT(2) | ||
210 | #define ALX_HRTBT_EXT_CTRL_WAKEUP_EN BIT(1) | ||
211 | #define ALX_HRTBT_EXT_CTRL_ARP_EN BIT(0) | ||
212 | |||
213 | #define ALX_HRTBT_REM_IPV4_ADDR 0x1AD4 | ||
214 | #define ALX_HRTBT_HOST_IPV4_ADDR 0x1478 | ||
215 | #define ALX_HRTBT_REM_IPV6_ADDR3 0x1AD8 | ||
216 | #define ALX_HRTBT_REM_IPV6_ADDR2 0x1ADC | ||
217 | #define ALX_HRTBT_REM_IPV6_ADDR1 0x1AE0 | ||
218 | #define ALX_HRTBT_REM_IPV6_ADDR0 0x1AE4 | ||
219 | |||
220 | /* 1B8C ~ 1B94 for C0+ */ | ||
221 | #define ALX_SWOI_ACER_CTRL 0x1B8C | ||
222 | #define ALX_SWOI_ORIG_ACK_NAK_EN BIT(20) | ||
223 | #define ALX_SWOI_ORIG_ACK_NAK_PKT_LEN_MASK 0XFF | ||
224 | #define ALX_SWOI_ORIG_ACK_NAK_PKT_LEN_SHIFT 12 | ||
225 | #define ALX_SWOI_ORIG_ACK_ADDR_MASK 0XFFF | ||
226 | #define ALX_SWOI_ORIG_ACK_ADDR_SHIFT 0 | ||
227 | |||
228 | #define ALX_SWOI_IOAC_CTRL_2 0x1B90 | ||
229 | #define ALX_SWOI_IOAC_CTRL_2_SWOI_1_FRAG_LEN_MASK 0xFF | ||
230 | #define ALX_SWOI_IOAC_CTRL_2_SWOI_1_FRAG_LEN_SHIFT 24 | ||
231 | #define ALX_SWOI_IOAC_CTRL_2_SWOI_1_PKT_LEN_MASK 0xFFF | ||
232 | #define ALX_SWOI_IOAC_CTRL_2_SWOI_1_PKT_LEN_SHIFT 12 | ||
233 | #define ALX_SWOI_IOAC_CTRL_2_SWOI_1_HDR_ADDR_MASK 0xFFF | ||
234 | #define ALX_SWOI_IOAC_CTRL_2_SWOI_1_HDR_ADDR_SHIFT 0 | ||
235 | |||
236 | #define ALX_SWOI_IOAC_CTRL_3 0x1B94 | ||
237 | #define ALX_SWOI_IOAC_CTRL_3_SWOI_2_FRAG_LEN_MASK 0xFF | ||
238 | #define ALX_SWOI_IOAC_CTRL_3_SWOI_2_FRAG_LEN_SHIFT 24 | ||
239 | #define ALX_SWOI_IOAC_CTRL_3_SWOI_2_PKT_LEN_MASK 0xFFF | ||
240 | #define ALX_SWOI_IOAC_CTRL_3_SWOI_2_PKT_LEN_SHIFT 12 | ||
241 | #define ALX_SWOI_IOAC_CTRL_3_SWOI_2_HDR_ADDR_MASK 0xFFF | ||
242 | #define ALX_SWOI_IOAC_CTRL_3_SWOI_2_HDR_ADDR_SHIFT 0 | ||
243 | |||
244 | /* for B0 */ | ||
245 | #define ALX_IDLE_DECISN_TIMER 0x1474 | ||
246 | /* 1ms */ | ||
247 | #define ALX_IDLE_DECISN_TIMER_DEF 0x400 | ||
248 | |||
249 | #define ALX_MAC_CTRL 0x1480 | ||
250 | #define ALX_MAC_CTRL_FAST_PAUSE BIT(31) | ||
251 | #define ALX_MAC_CTRL_WOLSPED_SWEN BIT(30) | ||
252 | /* bit29: 1:legacy(hi5b), 0:marvl(lo5b)*/ | ||
253 | #define ALX_MAC_CTRL_MHASH_ALG_HI5B BIT(29) | ||
254 | #define ALX_MAC_CTRL_BRD_EN BIT(26) | ||
255 | #define ALX_MAC_CTRL_MULTIALL_EN BIT(25) | ||
256 | #define ALX_MAC_CTRL_SPEED_MASK 0x3 | ||
257 | #define ALX_MAC_CTRL_SPEED_SHIFT 20 | ||
258 | #define ALX_MAC_CTRL_SPEED_10_100 1 | ||
259 | #define ALX_MAC_CTRL_SPEED_1000 2 | ||
260 | #define ALX_MAC_CTRL_PROMISC_EN BIT(15) | ||
261 | #define ALX_MAC_CTRL_VLANSTRIP BIT(14) | ||
262 | #define ALX_MAC_CTRL_PRMBLEN_MASK 0xF | ||
263 | #define ALX_MAC_CTRL_PRMBLEN_SHIFT 10 | ||
264 | #define ALX_MAC_CTRL_PCRCE BIT(7) | ||
265 | #define ALX_MAC_CTRL_CRCE BIT(6) | ||
266 | #define ALX_MAC_CTRL_FULLD BIT(5) | ||
267 | #define ALX_MAC_CTRL_RXFC_EN BIT(3) | ||
268 | #define ALX_MAC_CTRL_TXFC_EN BIT(2) | ||
269 | #define ALX_MAC_CTRL_RX_EN BIT(1) | ||
270 | #define ALX_MAC_CTRL_TX_EN BIT(0) | ||
271 | |||
272 | #define ALX_STAD0 0x1488 | ||
273 | #define ALX_STAD1 0x148C | ||
274 | |||
275 | #define ALX_HASH_TBL0 0x1490 | ||
276 | #define ALX_HASH_TBL1 0x1494 | ||
277 | |||
278 | #define ALX_MTU 0x149C | ||
279 | #define ALX_MTU_JUMBO_TH 1514 | ||
280 | #define ALX_MTU_STD_ALGN 1536 | ||
281 | |||
282 | #define ALX_SRAM5 0x1524 | ||
283 | #define ALX_SRAM_RXF_LEN_MASK 0xFFF | ||
284 | #define ALX_SRAM_RXF_LEN_SHIFT 0 | ||
285 | #define ALX_SRAM_RXF_LEN_8K (8*1024) | ||
286 | |||
287 | #define ALX_SRAM9 0x1534 | ||
288 | #define ALX_SRAM_LOAD_PTR BIT(0) | ||
289 | |||
290 | #define ALX_RX_BASE_ADDR_HI 0x1540 | ||
291 | |||
292 | #define ALX_TX_BASE_ADDR_HI 0x1544 | ||
293 | |||
294 | #define ALX_RFD_ADDR_LO 0x1550 | ||
295 | #define ALX_RFD_RING_SZ 0x1560 | ||
296 | #define ALX_RFD_BUF_SZ 0x1564 | ||
297 | |||
298 | #define ALX_RRD_ADDR_LO 0x1568 | ||
299 | #define ALX_RRD_RING_SZ 0x1578 | ||
300 | |||
301 | /* pri3: highest, pri0: lowest */ | ||
302 | #define ALX_TPD_PRI3_ADDR_LO 0x14E4 | ||
303 | #define ALX_TPD_PRI2_ADDR_LO 0x14E0 | ||
304 | #define ALX_TPD_PRI1_ADDR_LO 0x157C | ||
305 | #define ALX_TPD_PRI0_ADDR_LO 0x1580 | ||
306 | |||
307 | /* producer index is 16bit */ | ||
308 | #define ALX_TPD_PRI3_PIDX 0x1618 | ||
309 | #define ALX_TPD_PRI2_PIDX 0x161A | ||
310 | #define ALX_TPD_PRI1_PIDX 0x15F0 | ||
311 | #define ALX_TPD_PRI0_PIDX 0x15F2 | ||
312 | |||
313 | /* consumer index is 16bit */ | ||
314 | #define ALX_TPD_PRI3_CIDX 0x161C | ||
315 | #define ALX_TPD_PRI2_CIDX 0x161E | ||
316 | #define ALX_TPD_PRI1_CIDX 0x15F4 | ||
317 | #define ALX_TPD_PRI0_CIDX 0x15F6 | ||
318 | |||
319 | #define ALX_TPD_RING_SZ 0x1584 | ||
320 | |||
321 | #define ALX_TXQ0 0x1590 | ||
322 | #define ALX_TXQ0_TXF_BURST_PREF_MASK 0xFFFF | ||
323 | #define ALX_TXQ0_TXF_BURST_PREF_SHIFT 16 | ||
324 | #define ALX_TXQ_TXF_BURST_PREF_DEF 0x200 | ||
325 | #define ALX_TXQ0_LSO_8023_EN BIT(7) | ||
326 | #define ALX_TXQ0_MODE_ENHANCE BIT(6) | ||
327 | #define ALX_TXQ0_EN BIT(5) | ||
328 | #define ALX_TXQ0_SUPT_IPOPT BIT(4) | ||
329 | #define ALX_TXQ0_TPD_BURSTPREF_MASK 0xF | ||
330 | #define ALX_TXQ0_TPD_BURSTPREF_SHIFT 0 | ||
331 | #define ALX_TXQ_TPD_BURSTPREF_DEF 5 | ||
332 | |||
333 | #define ALX_TXQ1 0x1594 | ||
334 | /* bit11: drop large packet, len > (rfd buf) */ | ||
335 | #define ALX_TXQ1_ERRLGPKT_DROP_EN BIT(11) | ||
336 | #define ALX_TXQ1_JUMBO_TSO_TH (7*1024) | ||
337 | |||
338 | #define ALX_RXQ0 0x15A0 | ||
339 | #define ALX_RXQ0_EN BIT(31) | ||
340 | #define ALX_RXQ0_RSS_HASH_EN BIT(29) | ||
341 | #define ALX_RXQ0_RSS_MODE_MASK 0x3 | ||
342 | #define ALX_RXQ0_RSS_MODE_SHIFT 26 | ||
343 | #define ALX_RXQ0_RSS_MODE_DIS 0 | ||
344 | #define ALX_RXQ0_RSS_MODE_MQMI 3 | ||
345 | #define ALX_RXQ0_NUM_RFD_PREF_MASK 0x3F | ||
346 | #define ALX_RXQ0_NUM_RFD_PREF_SHIFT 20 | ||
347 | #define ALX_RXQ0_NUM_RFD_PREF_DEF 8 | ||
348 | #define ALX_RXQ0_IDT_TBL_SIZE_MASK 0x1FF | ||
349 | #define ALX_RXQ0_IDT_TBL_SIZE_SHIFT 8 | ||
350 | #define ALX_RXQ0_IDT_TBL_SIZE_DEF 0x100 | ||
351 | #define ALX_RXQ0_IDT_TBL_SIZE_NORMAL 128 | ||
352 | #define ALX_RXQ0_IPV6_PARSE_EN BIT(7) | ||
353 | #define ALX_RXQ0_RSS_HSTYP_MASK 0xF | ||
354 | #define ALX_RXQ0_RSS_HSTYP_SHIFT 2 | ||
355 | #define ALX_RXQ0_RSS_HSTYP_IPV6_TCP_EN BIT(5) | ||
356 | #define ALX_RXQ0_RSS_HSTYP_IPV6_EN BIT(4) | ||
357 | #define ALX_RXQ0_RSS_HSTYP_IPV4_TCP_EN BIT(3) | ||
358 | #define ALX_RXQ0_RSS_HSTYP_IPV4_EN BIT(2) | ||
359 | #define ALX_RXQ0_RSS_HSTYP_ALL (ALX_RXQ0_RSS_HSTYP_IPV6_TCP_EN | \ | ||
360 | ALX_RXQ0_RSS_HSTYP_IPV4_TCP_EN | \ | ||
361 | ALX_RXQ0_RSS_HSTYP_IPV6_EN | \ | ||
362 | ALX_RXQ0_RSS_HSTYP_IPV4_EN) | ||
363 | #define ALX_RXQ0_ASPM_THRESH_MASK 0x3 | ||
364 | #define ALX_RXQ0_ASPM_THRESH_SHIFT 0 | ||
365 | #define ALX_RXQ0_ASPM_THRESH_100M 3 | ||
366 | |||
367 | #define ALX_RXQ2 0x15A8 | ||
368 | #define ALX_RXQ2_RXF_XOFF_THRESH_MASK 0xFFF | ||
369 | #define ALX_RXQ2_RXF_XOFF_THRESH_SHIFT 16 | ||
370 | #define ALX_RXQ2_RXF_XON_THRESH_MASK 0xFFF | ||
371 | #define ALX_RXQ2_RXF_XON_THRESH_SHIFT 0 | ||
372 | /* Size = tx-packet(1522) + IPG(12) + SOF(8) + 64(Pause) + IPG(12) + SOF(8) + | ||
373 | * rx-packet(1522) + delay-of-link(64) | ||
374 | * = 3212. | ||
375 | */ | ||
376 | #define ALX_RXQ2_RXF_FLOW_CTRL_RSVD 3212 | ||
377 | |||
378 | #define ALX_DMA 0x15C0 | ||
379 | #define ALX_DMA_RCHNL_SEL_MASK 0x3 | ||
380 | #define ALX_DMA_RCHNL_SEL_SHIFT 26 | ||
381 | #define ALX_DMA_WDLY_CNT_MASK 0xF | ||
382 | #define ALX_DMA_WDLY_CNT_SHIFT 16 | ||
383 | #define ALX_DMA_WDLY_CNT_DEF 4 | ||
384 | #define ALX_DMA_RDLY_CNT_MASK 0x1F | ||
385 | #define ALX_DMA_RDLY_CNT_SHIFT 11 | ||
386 | #define ALX_DMA_RDLY_CNT_DEF 15 | ||
387 | /* bit10: 0:tpd with pri, 1: data */ | ||
388 | #define ALX_DMA_RREQ_PRI_DATA BIT(10) | ||
389 | #define ALX_DMA_RREQ_BLEN_MASK 0x7 | ||
390 | #define ALX_DMA_RREQ_BLEN_SHIFT 4 | ||
391 | #define ALX_DMA_RORDER_MODE_MASK 0x7 | ||
392 | #define ALX_DMA_RORDER_MODE_SHIFT 0 | ||
393 | #define ALX_DMA_RORDER_MODE_OUT 4 | ||
394 | |||
395 | #define ALX_WOL0 0x14A0 | ||
396 | #define ALX_WOL0_PME_LINK BIT(5) | ||
397 | #define ALX_WOL0_LINK_EN BIT(4) | ||
398 | #define ALX_WOL0_PME_MAGIC_EN BIT(3) | ||
399 | #define ALX_WOL0_MAGIC_EN BIT(2) | ||
400 | |||
401 | #define ALX_RFD_PIDX 0x15E0 | ||
402 | |||
403 | #define ALX_RFD_CIDX 0x15F8 | ||
404 | |||
405 | /* MIB */ | ||
406 | #define ALX_MIB_BASE 0x1700 | ||
407 | #define ALX_MIB_RX_OK (ALX_MIB_BASE + 0) | ||
408 | #define ALX_MIB_RX_ERRADDR (ALX_MIB_BASE + 92) | ||
409 | #define ALX_MIB_TX_OK (ALX_MIB_BASE + 96) | ||
410 | #define ALX_MIB_TX_MCCNT (ALX_MIB_BASE + 192) | ||
411 | |||
412 | #define ALX_RX_STATS_BIN ALX_MIB_RX_OK | ||
413 | #define ALX_RX_STATS_END ALX_MIB_RX_ERRADDR | ||
414 | #define ALX_TX_STATS_BIN ALX_MIB_TX_OK | ||
415 | #define ALX_TX_STATS_END ALX_MIB_TX_MCCNT | ||
416 | |||
417 | #define ALX_ISR 0x1600 | ||
418 | #define ALX_ISR_DIS BIT(31) | ||
419 | #define ALX_ISR_RX_Q7 BIT(30) | ||
420 | #define ALX_ISR_RX_Q6 BIT(29) | ||
421 | #define ALX_ISR_RX_Q5 BIT(28) | ||
422 | #define ALX_ISR_RX_Q4 BIT(27) | ||
423 | #define ALX_ISR_PCIE_LNKDOWN BIT(26) | ||
424 | #define ALX_ISR_RX_Q3 BIT(19) | ||
425 | #define ALX_ISR_RX_Q2 BIT(18) | ||
426 | #define ALX_ISR_RX_Q1 BIT(17) | ||
427 | #define ALX_ISR_RX_Q0 BIT(16) | ||
428 | #define ALX_ISR_TX_Q0 BIT(15) | ||
429 | #define ALX_ISR_PHY BIT(12) | ||
430 | #define ALX_ISR_DMAW BIT(10) | ||
431 | #define ALX_ISR_DMAR BIT(9) | ||
432 | #define ALX_ISR_TXF_UR BIT(8) | ||
433 | #define ALX_ISR_TX_Q3 BIT(7) | ||
434 | #define ALX_ISR_TX_Q2 BIT(6) | ||
435 | #define ALX_ISR_TX_Q1 BIT(5) | ||
436 | #define ALX_ISR_RFD_UR BIT(4) | ||
437 | #define ALX_ISR_RXF_OV BIT(3) | ||
438 | #define ALX_ISR_MANU BIT(2) | ||
439 | #define ALX_ISR_TIMER BIT(1) | ||
440 | #define ALX_ISR_SMB BIT(0) | ||
441 | |||
442 | #define ALX_IMR 0x1604 | ||
443 | |||
444 | /* re-send assert msg if SW no response */ | ||
445 | #define ALX_INT_RETRIG 0x1608 | ||
446 | /* 40ms */ | ||
447 | #define ALX_INT_RETRIG_TO 20000 | ||
448 | |||
449 | #define ALX_SMB_TIMER 0x15C4 | ||
450 | |||
451 | #define ALX_TINT_TPD_THRSHLD 0x15C8 | ||
452 | |||
453 | #define ALX_TINT_TIMER 0x15CC | ||
454 | |||
455 | #define ALX_CLK_GATE 0x1814 | ||
456 | #define ALX_CLK_GATE_RXMAC BIT(5) | ||
457 | #define ALX_CLK_GATE_TXMAC BIT(4) | ||
458 | #define ALX_CLK_GATE_RXQ BIT(3) | ||
459 | #define ALX_CLK_GATE_TXQ BIT(2) | ||
460 | #define ALX_CLK_GATE_DMAR BIT(1) | ||
461 | #define ALX_CLK_GATE_DMAW BIT(0) | ||
462 | #define ALX_CLK_GATE_ALL (ALX_CLK_GATE_RXMAC | \ | ||
463 | ALX_CLK_GATE_TXMAC | \ | ||
464 | ALX_CLK_GATE_RXQ | \ | ||
465 | ALX_CLK_GATE_TXQ | \ | ||
466 | ALX_CLK_GATE_DMAR | \ | ||
467 | ALX_CLK_GATE_DMAW) | ||
468 | |||
469 | /* interop between drivers */ | ||
470 | #define ALX_DRV 0x1804 | ||
471 | #define ALX_DRV_PHY_AUTO BIT(28) | ||
472 | #define ALX_DRV_PHY_1000 BIT(27) | ||
473 | #define ALX_DRV_PHY_100 BIT(26) | ||
474 | #define ALX_DRV_PHY_10 BIT(25) | ||
475 | #define ALX_DRV_PHY_DUPLEX BIT(24) | ||
476 | /* bit23: adv Pause */ | ||
477 | #define ALX_DRV_PHY_PAUSE BIT(23) | ||
478 | /* bit22: adv Asym Pause */ | ||
479 | #define ALX_DRV_PHY_MASK 0xFF | ||
480 | #define ALX_DRV_PHY_SHIFT 21 | ||
481 | #define ALX_DRV_PHY_UNKNOWN 0 | ||
482 | |||
483 | /* flag of phy inited */ | ||
484 | #define ALX_PHY_INITED 0x003F | ||
485 | |||
486 | /* reg 1830 ~ 186C for C0+, 16 bit map patterns and wake packet detection */ | ||
487 | #define ALX_WOL_CTRL2 0x1830 | ||
488 | #define ALX_WOL_CTRL2_DATA_STORE BIT(3) | ||
489 | #define ALX_WOL_CTRL2_PTRN_EVT BIT(2) | ||
490 | #define ALX_WOL_CTRL2_PME_PTRN_EN BIT(1) | ||
491 | #define ALX_WOL_CTRL2_PTRN_EN BIT(0) | ||
492 | |||
493 | #define ALX_WOL_CTRL3 0x1834 | ||
494 | #define ALX_WOL_CTRL3_PTRN_ADDR_MASK 0xFFFFF | ||
495 | #define ALX_WOL_CTRL3_PTRN_ADDR_SHIFT 0 | ||
496 | |||
497 | #define ALX_WOL_CTRL4 0x1838 | ||
498 | #define ALX_WOL_CTRL4_PT15_MATCH BIT(31) | ||
499 | #define ALX_WOL_CTRL4_PT14_MATCH BIT(30) | ||
500 | #define ALX_WOL_CTRL4_PT13_MATCH BIT(29) | ||
501 | #define ALX_WOL_CTRL4_PT12_MATCH BIT(28) | ||
502 | #define ALX_WOL_CTRL4_PT11_MATCH BIT(27) | ||
503 | #define ALX_WOL_CTRL4_PT10_MATCH BIT(26) | ||
504 | #define ALX_WOL_CTRL4_PT9_MATCH BIT(25) | ||
505 | #define ALX_WOL_CTRL4_PT8_MATCH BIT(24) | ||
506 | #define ALX_WOL_CTRL4_PT7_MATCH BIT(23) | ||
507 | #define ALX_WOL_CTRL4_PT6_MATCH BIT(22) | ||
508 | #define ALX_WOL_CTRL4_PT5_MATCH BIT(21) | ||
509 | #define ALX_WOL_CTRL4_PT4_MATCH BIT(20) | ||
510 | #define ALX_WOL_CTRL4_PT3_MATCH BIT(19) | ||
511 | #define ALX_WOL_CTRL4_PT2_MATCH BIT(18) | ||
512 | #define ALX_WOL_CTRL4_PT1_MATCH BIT(17) | ||
513 | #define ALX_WOL_CTRL4_PT0_MATCH BIT(16) | ||
514 | #define ALX_WOL_CTRL4_PT15_EN BIT(15) | ||
515 | #define ALX_WOL_CTRL4_PT14_EN BIT(14) | ||
516 | #define ALX_WOL_CTRL4_PT13_EN BIT(13) | ||
517 | #define ALX_WOL_CTRL4_PT12_EN BIT(12) | ||
518 | #define ALX_WOL_CTRL4_PT11_EN BIT(11) | ||
519 | #define ALX_WOL_CTRL4_PT10_EN BIT(10) | ||
520 | #define ALX_WOL_CTRL4_PT9_EN BIT(9) | ||
521 | #define ALX_WOL_CTRL4_PT8_EN BIT(8) | ||
522 | #define ALX_WOL_CTRL4_PT7_EN BIT(7) | ||
523 | #define ALX_WOL_CTRL4_PT6_EN BIT(6) | ||
524 | #define ALX_WOL_CTRL4_PT5_EN BIT(5) | ||
525 | #define ALX_WOL_CTRL4_PT4_EN BIT(4) | ||
526 | #define ALX_WOL_CTRL4_PT3_EN BIT(3) | ||
527 | #define ALX_WOL_CTRL4_PT2_EN BIT(2) | ||
528 | #define ALX_WOL_CTRL4_PT1_EN BIT(1) | ||
529 | #define ALX_WOL_CTRL4_PT0_EN BIT(0) | ||
530 | |||
531 | #define ALX_WOL_CTRL5 0x183C | ||
532 | #define ALX_WOL_CTRL5_PT3_LEN_MASK 0xFF | ||
533 | #define ALX_WOL_CTRL5_PT3_LEN_SHIFT 24 | ||
534 | #define ALX_WOL_CTRL5_PT2_LEN_MASK 0xFF | ||
535 | #define ALX_WOL_CTRL5_PT2_LEN_SHIFT 16 | ||
536 | #define ALX_WOL_CTRL5_PT1_LEN_MASK 0xFF | ||
537 | #define ALX_WOL_CTRL5_PT1_LEN_SHIFT 8 | ||
538 | #define ALX_WOL_CTRL5_PT0_LEN_MASK 0xFF | ||
539 | #define ALX_WOL_CTRL5_PT0_LEN_SHIFT 0 | ||
540 | |||
541 | #define ALX_WOL_CTRL6 0x1840 | ||
542 | #define ALX_WOL_CTRL5_PT7_LEN_MASK 0xFF | ||
543 | #define ALX_WOL_CTRL5_PT7_LEN_SHIFT 24 | ||
544 | #define ALX_WOL_CTRL5_PT6_LEN_MASK 0xFF | ||
545 | #define ALX_WOL_CTRL5_PT6_LEN_SHIFT 16 | ||
546 | #define ALX_WOL_CTRL5_PT5_LEN_MASK 0xFF | ||
547 | #define ALX_WOL_CTRL5_PT5_LEN_SHIFT 8 | ||
548 | #define ALX_WOL_CTRL5_PT4_LEN_MASK 0xFF | ||
549 | #define ALX_WOL_CTRL5_PT4_LEN_SHIFT 0 | ||
550 | |||
551 | #define ALX_WOL_CTRL7 0x1844 | ||
552 | #define ALX_WOL_CTRL5_PT11_LEN_MASK 0xFF | ||
553 | #define ALX_WOL_CTRL5_PT11_LEN_SHIFT 24 | ||
554 | #define ALX_WOL_CTRL5_PT10_LEN_MASK 0xFF | ||
555 | #define ALX_WOL_CTRL5_PT10_LEN_SHIFT 16 | ||
556 | #define ALX_WOL_CTRL5_PT9_LEN_MASK 0xFF | ||
557 | #define ALX_WOL_CTRL5_PT9_LEN_SHIFT 8 | ||
558 | #define ALX_WOL_CTRL5_PT8_LEN_MASK 0xFF | ||
559 | #define ALX_WOL_CTRL5_PT8_LEN_SHIFT 0 | ||
560 | |||
561 | #define ALX_WOL_CTRL8 0x1848 | ||
562 | #define ALX_WOL_CTRL5_PT15_LEN_MASK 0xFF | ||
563 | #define ALX_WOL_CTRL5_PT15_LEN_SHIFT 24 | ||
564 | #define ALX_WOL_CTRL5_PT14_LEN_MASK 0xFF | ||
565 | #define ALX_WOL_CTRL5_PT14_LEN_SHIFT 16 | ||
566 | #define ALX_WOL_CTRL5_PT13_LEN_MASK 0xFF | ||
567 | #define ALX_WOL_CTRL5_PT13_LEN_SHIFT 8 | ||
568 | #define ALX_WOL_CTRL5_PT12_LEN_MASK 0xFF | ||
569 | #define ALX_WOL_CTRL5_PT12_LEN_SHIFT 0 | ||
570 | |||
571 | #define ALX_ACER_FIXED_PTN0 0x1850 | ||
572 | #define ALX_ACER_FIXED_PTN0_MASK 0xFFFFFFFF | ||
573 | #define ALX_ACER_FIXED_PTN0_SHIFT 0 | ||
574 | |||
575 | #define ALX_ACER_FIXED_PTN1 0x1854 | ||
576 | #define ALX_ACER_FIXED_PTN1_MASK 0xFFFF | ||
577 | #define ALX_ACER_FIXED_PTN1_SHIFT 0 | ||
578 | |||
579 | #define ALX_ACER_RANDOM_NUM0 0x1858 | ||
580 | #define ALX_ACER_RANDOM_NUM0_MASK 0xFFFFFFFF | ||
581 | #define ALX_ACER_RANDOM_NUM0_SHIFT 0 | ||
582 | |||
583 | #define ALX_ACER_RANDOM_NUM1 0x185C | ||
584 | #define ALX_ACER_RANDOM_NUM1_MASK 0xFFFFFFFF | ||
585 | #define ALX_ACER_RANDOM_NUM1_SHIFT 0 | ||
586 | |||
587 | #define ALX_ACER_RANDOM_NUM2 0x1860 | ||
588 | #define ALX_ACER_RANDOM_NUM2_MASK 0xFFFFFFFF | ||
589 | #define ALX_ACER_RANDOM_NUM2_SHIFT 0 | ||
590 | |||
591 | #define ALX_ACER_RANDOM_NUM3 0x1864 | ||
592 | #define ALX_ACER_RANDOM_NUM3_MASK 0xFFFFFFFF | ||
593 | #define ALX_ACER_RANDOM_NUM3_SHIFT 0 | ||
594 | |||
595 | #define ALX_ACER_MAGIC 0x1868 | ||
596 | #define ALX_ACER_MAGIC_EN BIT(31) | ||
597 | #define ALX_ACER_MAGIC_PME_EN BIT(30) | ||
598 | #define ALX_ACER_MAGIC_MATCH BIT(29) | ||
599 | #define ALX_ACER_MAGIC_FF_CHECK BIT(10) | ||
600 | #define ALX_ACER_MAGIC_RAN_LEN_MASK 0x1F | ||
601 | #define ALX_ACER_MAGIC_RAN_LEN_SHIFT 5 | ||
602 | #define ALX_ACER_MAGIC_FIX_LEN_MASK 0x1F | ||
603 | #define ALX_ACER_MAGIC_FIX_LEN_SHIFT 0 | ||
604 | |||
605 | #define ALX_ACER_TIMER 0x186C | ||
606 | #define ALX_ACER_TIMER_EN BIT(31) | ||
607 | #define ALX_ACER_TIMER_PME_EN BIT(30) | ||
608 | #define ALX_ACER_TIMER_MATCH BIT(29) | ||
609 | #define ALX_ACER_TIMER_THRES_MASK 0x1FFFF | ||
610 | #define ALX_ACER_TIMER_THRES_SHIFT 0 | ||
611 | #define ALX_ACER_TIMER_THRES_DEF 1 | ||
612 | |||
613 | /* RSS definitions */ | ||
614 | #define ALX_RSS_KEY0 0x14B0 | ||
615 | #define ALX_RSS_KEY1 0x14B4 | ||
616 | #define ALX_RSS_KEY2 0x14B8 | ||
617 | #define ALX_RSS_KEY3 0x14BC | ||
618 | #define ALX_RSS_KEY4 0x14C0 | ||
619 | #define ALX_RSS_KEY5 0x14C4 | ||
620 | #define ALX_RSS_KEY6 0x14C8 | ||
621 | #define ALX_RSS_KEY7 0x14CC | ||
622 | #define ALX_RSS_KEY8 0x14D0 | ||
623 | #define ALX_RSS_KEY9 0x14D4 | ||
624 | |||
625 | #define ALX_RSS_IDT_TBL0 0x1B00 | ||
626 | |||
627 | #define ALX_MSI_MAP_TBL1 0x15D0 | ||
628 | #define ALX_MSI_MAP_TBL1_TXQ1_SHIFT 20 | ||
629 | #define ALX_MSI_MAP_TBL1_TXQ0_SHIFT 16 | ||
630 | #define ALX_MSI_MAP_TBL1_RXQ3_SHIFT 12 | ||
631 | #define ALX_MSI_MAP_TBL1_RXQ2_SHIFT 8 | ||
632 | #define ALX_MSI_MAP_TBL1_RXQ1_SHIFT 4 | ||
633 | #define ALX_MSI_MAP_TBL1_RXQ0_SHIFT 0 | ||
634 | |||
635 | #define ALX_MSI_MAP_TBL2 0x15D8 | ||
636 | #define ALX_MSI_MAP_TBL2_TXQ3_SHIFT 20 | ||
637 | #define ALX_MSI_MAP_TBL2_TXQ2_SHIFT 16 | ||
638 | #define ALX_MSI_MAP_TBL2_RXQ7_SHIFT 12 | ||
639 | #define ALX_MSI_MAP_TBL2_RXQ6_SHIFT 8 | ||
640 | #define ALX_MSI_MAP_TBL2_RXQ5_SHIFT 4 | ||
641 | #define ALX_MSI_MAP_TBL2_RXQ4_SHIFT 0 | ||
642 | |||
643 | #define ALX_MSI_ID_MAP 0x15D4 | ||
644 | |||
645 | #define ALX_MSI_RETRANS_TIMER 0x1920 | ||
646 | /* bit16: 1:line,0:standard */ | ||
647 | #define ALX_MSI_MASK_SEL_LINE BIT(16) | ||
648 | #define ALX_MSI_RETRANS_TM_MASK 0xFFFF | ||
649 | #define ALX_MSI_RETRANS_TM_SHIFT 0 | ||
650 | |||
651 | /* CR DMA ctrl */ | ||
652 | |||
653 | /* TX QoS */ | ||
654 | #define ALX_WRR 0x1938 | ||
655 | #define ALX_WRR_PRI_MASK 0x3 | ||
656 | #define ALX_WRR_PRI_SHIFT 29 | ||
657 | #define ALX_WRR_PRI_RESTRICT_NONE 3 | ||
658 | #define ALX_WRR_PRI3_MASK 0x1F | ||
659 | #define ALX_WRR_PRI3_SHIFT 24 | ||
660 | #define ALX_WRR_PRI2_MASK 0x1F | ||
661 | #define ALX_WRR_PRI2_SHIFT 16 | ||
662 | #define ALX_WRR_PRI1_MASK 0x1F | ||
663 | #define ALX_WRR_PRI1_SHIFT 8 | ||
664 | #define ALX_WRR_PRI0_MASK 0x1F | ||
665 | #define ALX_WRR_PRI0_SHIFT 0 | ||
666 | |||
667 | #define ALX_HQTPD 0x193C | ||
668 | #define ALX_HQTPD_BURST_EN BIT(31) | ||
669 | #define ALX_HQTPD_Q3_NUMPREF_MASK 0xF | ||
670 | #define ALX_HQTPD_Q3_NUMPREF_SHIFT 8 | ||
671 | #define ALX_HQTPD_Q2_NUMPREF_MASK 0xF | ||
672 | #define ALX_HQTPD_Q2_NUMPREF_SHIFT 4 | ||
673 | #define ALX_HQTPD_Q1_NUMPREF_MASK 0xF | ||
674 | #define ALX_HQTPD_Q1_NUMPREF_SHIFT 0 | ||
675 | |||
676 | #define ALX_MISC 0x19C0 | ||
677 | #define ALX_MISC_PSW_OCP_MASK 0x7 | ||
678 | #define ALX_MISC_PSW_OCP_SHIFT 21 | ||
679 | #define ALX_MISC_PSW_OCP_DEF 0x7 | ||
680 | #define ALX_MISC_ISO_EN BIT(12) | ||
681 | #define ALX_MISC_INTNLOSC_OPEN BIT(3) | ||
682 | |||
683 | #define ALX_MSIC2 0x19C8 | ||
684 | #define ALX_MSIC2_CALB_START BIT(0) | ||
685 | |||
686 | #define ALX_MISC3 0x19CC | ||
687 | /* bit1: 1:Software control 25M */ | ||
688 | #define ALX_MISC3_25M_BY_SW BIT(1) | ||
689 | /* bit0: 25M switch to intnl OSC */ | ||
690 | #define ALX_MISC3_25M_NOTO_INTNL BIT(0) | ||
691 | |||
692 | /* MSIX tbl in memory space */ | ||
693 | #define ALX_MSIX_ENTRY_BASE 0x2000 | ||
694 | |||
695 | /********************* PHY regs definition ***************************/ | ||
696 | |||
697 | /* PHY Specific Status Register */ | ||
698 | #define ALX_MII_GIGA_PSSR 0x11 | ||
699 | #define ALX_GIGA_PSSR_SPD_DPLX_RESOLVED 0x0800 | ||
700 | #define ALX_GIGA_PSSR_DPLX 0x2000 | ||
701 | #define ALX_GIGA_PSSR_SPEED 0xC000 | ||
702 | #define ALX_GIGA_PSSR_10MBS 0x0000 | ||
703 | #define ALX_GIGA_PSSR_100MBS 0x4000 | ||
704 | #define ALX_GIGA_PSSR_1000MBS 0x8000 | ||
705 | |||
706 | /* PHY Interrupt Enable Register */ | ||
707 | #define ALX_MII_IER 0x12 | ||
708 | #define ALX_IER_LINK_UP 0x0400 | ||
709 | #define ALX_IER_LINK_DOWN 0x0800 | ||
710 | |||
711 | /* PHY Interrupt Status Register */ | ||
712 | #define ALX_MII_ISR 0x13 | ||
713 | |||
714 | #define ALX_MII_DBG_ADDR 0x1D | ||
715 | #define ALX_MII_DBG_DATA 0x1E | ||
716 | |||
717 | /***************************** debug port *************************************/ | ||
718 | |||
719 | #define ALX_MIIDBG_ANACTRL 0x00 | ||
720 | #define ALX_ANACTRL_DEF 0x02EF | ||
721 | |||
722 | #define ALX_MIIDBG_SYSMODCTRL 0x04 | ||
723 | /* en half bias */ | ||
724 | #define ALX_SYSMODCTRL_IECHOADJ_DEF 0xBB8B | ||
725 | |||
726 | #define ALX_MIIDBG_SRDSYSMOD 0x05 | ||
727 | #define ALX_SRDSYSMOD_DEEMP_EN 0x0040 | ||
728 | #define ALX_SRDSYSMOD_DEF 0x2C46 | ||
729 | |||
730 | #define ALX_MIIDBG_HIBNEG 0x0B | ||
731 | #define ALX_HIBNEG_PSHIB_EN 0x8000 | ||
732 | #define ALX_HIBNEG_HIB_PSE 0x1000 | ||
733 | #define ALX_HIBNEG_DEF 0xBC40 | ||
734 | #define ALX_HIBNEG_NOHIB (ALX_HIBNEG_DEF & \ | ||
735 | ~(ALX_HIBNEG_PSHIB_EN | ALX_HIBNEG_HIB_PSE)) | ||
736 | |||
737 | #define ALX_MIIDBG_TST10BTCFG 0x12 | ||
738 | #define ALX_TST10BTCFG_DEF 0x4C04 | ||
739 | |||
740 | #define ALX_MIIDBG_AZ_ANADECT 0x15 | ||
741 | #define ALX_AZ_ANADECT_DEF 0x3220 | ||
742 | #define ALX_AZ_ANADECT_LONG 0x3210 | ||
743 | |||
744 | #define ALX_MIIDBG_MSE16DB 0x18 | ||
745 | #define ALX_MSE16DB_UP 0x05EA | ||
746 | #define ALX_MSE16DB_DOWN 0x02EA | ||
747 | |||
748 | #define ALX_MIIDBG_MSE20DB 0x1C | ||
749 | #define ALX_MSE20DB_TH_MASK 0x7F | ||
750 | #define ALX_MSE20DB_TH_SHIFT 2 | ||
751 | #define ALX_MSE20DB_TH_DEF 0x2E | ||
752 | #define ALX_MSE20DB_TH_HI 0x54 | ||
753 | |||
754 | #define ALX_MIIDBG_AGC 0x23 | ||
755 | #define ALX_AGC_2_VGA_MASK 0x3FU | ||
756 | #define ALX_AGC_2_VGA_SHIFT 8 | ||
757 | #define ALX_AGC_LONG1G_LIMT 40 | ||
758 | #define ALX_AGC_LONG100M_LIMT 44 | ||
759 | |||
760 | #define ALX_MIIDBG_LEGCYPS 0x29 | ||
761 | #define ALX_LEGCYPS_EN 0x8000 | ||
762 | #define ALX_LEGCYPS_DEF 0x129D | ||
763 | |||
764 | #define ALX_MIIDBG_TST100BTCFG 0x36 | ||
765 | #define ALX_TST100BTCFG_DEF 0xE12C | ||
766 | |||
767 | #define ALX_MIIDBG_GREENCFG 0x3B | ||
768 | #define ALX_GREENCFG_DEF 0x7078 | ||
769 | |||
770 | #define ALX_MIIDBG_GREENCFG2 0x3D | ||
771 | #define ALX_GREENCFG2_BP_GREEN 0x8000 | ||
772 | #define ALX_GREENCFG2_GATE_DFSE_EN 0x0080 | ||
773 | |||
774 | /******* dev 3 *********/ | ||
775 | #define ALX_MIIEXT_PCS 3 | ||
776 | |||
777 | #define ALX_MIIEXT_CLDCTRL3 0x8003 | ||
778 | #define ALX_CLDCTRL3_BP_CABLE1TH_DET_GT 0x8000 | ||
779 | |||
780 | #define ALX_MIIEXT_CLDCTRL5 0x8005 | ||
781 | #define ALX_CLDCTRL5_BP_VD_HLFBIAS 0x4000 | ||
782 | |||
783 | #define ALX_MIIEXT_CLDCTRL6 0x8006 | ||
784 | #define ALX_CLDCTRL6_CAB_LEN_MASK 0xFF | ||
785 | #define ALX_CLDCTRL6_CAB_LEN_SHIFT 0 | ||
786 | #define ALX_CLDCTRL6_CAB_LEN_SHORT1G 116 | ||
787 | #define ALX_CLDCTRL6_CAB_LEN_SHORT100M 152 | ||
788 | |||
789 | #define ALX_MIIEXT_VDRVBIAS 0x8062 | ||
790 | #define ALX_VDRVBIAS_DEF 0x3 | ||
791 | |||
792 | /********* dev 7 **********/ | ||
793 | #define ALX_MIIEXT_ANEG 7 | ||
794 | |||
795 | #define ALX_MIIEXT_LOCAL_EEEADV 0x3C | ||
796 | #define ALX_LOCAL_EEEADV_1000BT 0x0004 | ||
797 | #define ALX_LOCAL_EEEADV_100BT 0x0002 | ||
798 | |||
799 | #define ALX_MIIEXT_AFE 0x801A | ||
800 | #define ALX_AFE_10BT_100M_TH 0x0040 | ||
801 | |||
802 | #define ALX_MIIEXT_S3DIG10 0x8023 | ||
803 | /* bit0: 1:bypass 10BT rx fifo, 0:original 10BT rx */ | ||
804 | #define ALX_MIIEXT_S3DIG10_SL 0x0001 | ||
805 | #define ALX_MIIEXT_S3DIG10_DEF 0 | ||
806 | |||
807 | #define ALX_MIIEXT_NLP78 0x8027 | ||
808 | #define ALX_MIIEXT_NLP78_120M_DEF 0x8A05 | ||
809 | |||
810 | #endif | ||
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 297fc138fa15..986df04fdcb3 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -1790,6 +1790,9 @@ static int tg3_poll_fw(struct tg3 *tp) | |||
1790 | int i; | 1790 | int i; |
1791 | u32 val; | 1791 | u32 val; |
1792 | 1792 | ||
1793 | if (tg3_flag(tp, NO_FWARE_REPORTED)) | ||
1794 | return 0; | ||
1795 | |||
1793 | if (tg3_flag(tp, IS_SSB_CORE)) { | 1796 | if (tg3_flag(tp, IS_SSB_CORE)) { |
1794 | /* We don't use firmware. */ | 1797 | /* We don't use firmware. */ |
1795 | return 0; | 1798 | return 0; |
@@ -10475,6 +10478,13 @@ static int tg3_reset_hw(struct tg3 *tp, bool reset_phy) | |||
10475 | */ | 10478 | */ |
10476 | static int tg3_init_hw(struct tg3 *tp, bool reset_phy) | 10479 | static int tg3_init_hw(struct tg3 *tp, bool reset_phy) |
10477 | { | 10480 | { |
10481 | /* Chip may have been just powered on. If so, the boot code may still | ||
10482 | * be running initialization. Wait for it to finish to avoid races in | ||
10483 | * accessing the hardware. | ||
10484 | */ | ||
10485 | tg3_enable_register_access(tp); | ||
10486 | tg3_poll_fw(tp); | ||
10487 | |||
10478 | tg3_switch_clocks(tp); | 10488 | tg3_switch_clocks(tp); |
10479 | 10489 | ||
10480 | tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); | 10490 | tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0); |
diff --git a/drivers/net/ethernet/brocade/bna/bnad_debugfs.c b/drivers/net/ethernet/brocade/bna/bnad_debugfs.c index 6e8bc9d88c41..94d957d203a6 100644 --- a/drivers/net/ethernet/brocade/bna/bnad_debugfs.c +++ b/drivers/net/ethernet/brocade/bna/bnad_debugfs.c | |||
@@ -244,7 +244,7 @@ bnad_debugfs_lseek(struct file *file, loff_t offset, int orig) | |||
244 | file->f_pos += offset; | 244 | file->f_pos += offset; |
245 | break; | 245 | break; |
246 | case 2: | 246 | case 2: |
247 | file->f_pos = debug->buffer_len - offset; | 247 | file->f_pos = debug->buffer_len + offset; |
248 | break; | 248 | break; |
249 | default: | 249 | default: |
250 | return -EINVAL; | 250 | return -EINVAL; |
diff --git a/drivers/net/ethernet/dec/tulip/interrupt.c b/drivers/net/ethernet/dec/tulip/interrupt.c index 28a5e425fecf..92306b320840 100644 --- a/drivers/net/ethernet/dec/tulip/interrupt.c +++ b/drivers/net/ethernet/dec/tulip/interrupt.c | |||
@@ -76,6 +76,12 @@ int tulip_refill_rx(struct net_device *dev) | |||
76 | 76 | ||
77 | mapping = pci_map_single(tp->pdev, skb->data, PKT_BUF_SZ, | 77 | mapping = pci_map_single(tp->pdev, skb->data, PKT_BUF_SZ, |
78 | PCI_DMA_FROMDEVICE); | 78 | PCI_DMA_FROMDEVICE); |
79 | if (dma_mapping_error(&tp->pdev->dev, mapping)) { | ||
80 | dev_kfree_skb(skb); | ||
81 | tp->rx_buffers[entry].skb = NULL; | ||
82 | break; | ||
83 | } | ||
84 | |||
79 | tp->rx_buffers[entry].mapping = mapping; | 85 | tp->rx_buffers[entry].mapping = mapping; |
80 | 86 | ||
81 | tp->rx_ring[entry].buffer1 = cpu_to_le32(mapping); | 87 | tp->rx_ring[entry].buffer1 = cpu_to_le32(mapping); |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 9aef457dacbb..98efc29eaa55 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -4259,6 +4259,9 @@ static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id) | |||
4259 | netdev->features |= NETIF_F_HIGHDMA; | 4259 | netdev->features |= NETIF_F_HIGHDMA; |
4260 | } else { | 4260 | } else { |
4261 | status = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); | 4261 | status = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); |
4262 | if (!status) | ||
4263 | status = dma_set_coherent_mask(&pdev->dev, | ||
4264 | DMA_BIT_MASK(32)); | ||
4262 | if (status) { | 4265 | if (status) { |
4263 | dev_err(&pdev->dev, "Could not set PCI DMA Mask\n"); | 4266 | dev_err(&pdev->dev, "Could not set PCI DMA Mask\n"); |
4264 | goto free_netdev; | 4267 | goto free_netdev; |
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c index a2eadc070328..8cb600ccaf1d 100644 --- a/drivers/net/ethernet/renesas/sh_eth.c +++ b/drivers/net/ethernet/renesas/sh_eth.c | |||
@@ -722,8 +722,8 @@ static int sh_eth_check_reset(struct net_device *ndev) | |||
722 | mdelay(1); | 722 | mdelay(1); |
723 | cnt--; | 723 | cnt--; |
724 | } | 724 | } |
725 | if (cnt < 0) { | 725 | if (cnt <= 0) { |
726 | pr_err("Device reset fail\n"); | 726 | pr_err("Device reset failed\n"); |
727 | ret = -ETIMEDOUT; | 727 | ret = -ETIMEDOUT; |
728 | } | 728 | } |
729 | return ret; | 729 | return ret; |
@@ -1260,16 +1260,23 @@ static int sh_eth_rx(struct net_device *ndev, u32 intr_status) | |||
1260 | desc_status = edmac_to_cpu(mdp, rxdesc->status); | 1260 | desc_status = edmac_to_cpu(mdp, rxdesc->status); |
1261 | pkt_len = rxdesc->frame_length; | 1261 | pkt_len = rxdesc->frame_length; |
1262 | 1262 | ||
1263 | #if defined(CONFIG_ARCH_R8A7740) | ||
1264 | desc_status >>= 16; | ||
1265 | #endif | ||
1266 | |||
1267 | if (--boguscnt < 0) | 1263 | if (--boguscnt < 0) |
1268 | break; | 1264 | break; |
1269 | 1265 | ||
1270 | if (!(desc_status & RDFEND)) | 1266 | if (!(desc_status & RDFEND)) |
1271 | ndev->stats.rx_length_errors++; | 1267 | ndev->stats.rx_length_errors++; |
1272 | 1268 | ||
1269 | #if defined(CONFIG_ARCH_R8A7740) | ||
1270 | /* | ||
1271 | * In case of almost all GETHER/ETHERs, the Receive Frame State | ||
1272 | * (RFS) bits in the Receive Descriptor 0 are from bit 9 to | ||
1273 | * bit 0. However, in case of the R8A7740's GETHER, the RFS | ||
1274 | * bits are from bit 25 to bit 16. So, the driver needs right | ||
1275 | * shifting by 16. | ||
1276 | */ | ||
1277 | desc_status >>= 16; | ||
1278 | #endif | ||
1279 | |||
1273 | if (desc_status & (RD_RFS1 | RD_RFS2 | RD_RFS3 | RD_RFS4 | | 1280 | if (desc_status & (RD_RFS1 | RD_RFS2 | RD_RFS3 | RD_RFS4 | |
1274 | RD_RFS5 | RD_RFS6 | RD_RFS10)) { | 1281 | RD_RFS5 | RD_RFS6 | RD_RFS10)) { |
1275 | ndev->stats.rx_errors++; | 1282 | ndev->stats.rx_errors++; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 618446ae1ec1..ee919ca8b8a0 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
@@ -1899,7 +1899,7 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1899 | 1899 | ||
1900 | #ifdef STMMAC_XMIT_DEBUG | 1900 | #ifdef STMMAC_XMIT_DEBUG |
1901 | if (netif_msg_pktdata(priv)) { | 1901 | if (netif_msg_pktdata(priv)) { |
1902 | pr_info("%s: curr %d dirty=%d entry=%d, first=%p, nfrags=%d" | 1902 | pr_info("%s: curr %d dirty=%d entry=%d, first=%p, nfrags=%d", |
1903 | __func__, (priv->cur_tx % txsize), | 1903 | __func__, (priv->cur_tx % txsize), |
1904 | (priv->dirty_tx % txsize), entry, first, nfrags); | 1904 | (priv->dirty_tx % txsize), entry, first, nfrags); |
1905 | if (priv->extend_desc) | 1905 | if (priv->extend_desc) |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index a45f64eef870..101b037a7dce 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
@@ -1681,7 +1681,7 @@ static int cpsw_probe(struct platform_device *pdev) | |||
1681 | priv->rx_packet_max = max(rx_packet_max, 128); | 1681 | priv->rx_packet_max = max(rx_packet_max, 128); |
1682 | priv->cpts = devm_kzalloc(&pdev->dev, sizeof(struct cpts), GFP_KERNEL); | 1682 | priv->cpts = devm_kzalloc(&pdev->dev, sizeof(struct cpts), GFP_KERNEL); |
1683 | priv->irq_enabled = true; | 1683 | priv->irq_enabled = true; |
1684 | if (!ndev) { | 1684 | if (!priv->cpts) { |
1685 | pr_err("error allocating cpts\n"); | 1685 | pr_err("error allocating cpts\n"); |
1686 | goto clean_ndev_ret; | 1686 | goto clean_ndev_ret; |
1687 | } | 1687 | } |
diff --git a/drivers/net/ethernet/ti/davinci_mdio.c b/drivers/net/ethernet/ti/davinci_mdio.c index 12aec173564c..c47f0dbcebb5 100644 --- a/drivers/net/ethernet/ti/davinci_mdio.c +++ b/drivers/net/ethernet/ti/davinci_mdio.c | |||
@@ -449,10 +449,9 @@ static int davinci_mdio_suspend(struct device *dev) | |||
449 | __raw_writel(ctrl, &data->regs->control); | 449 | __raw_writel(ctrl, &data->regs->control); |
450 | wait_for_idle(data); | 450 | wait_for_idle(data); |
451 | 451 | ||
452 | pm_runtime_put_sync(data->dev); | ||
453 | |||
454 | data->suspended = true; | 452 | data->suspended = true; |
455 | spin_unlock(&data->lock); | 453 | spin_unlock(&data->lock); |
454 | pm_runtime_put_sync(data->dev); | ||
456 | 455 | ||
457 | return 0; | 456 | return 0; |
458 | } | 457 | } |
@@ -460,15 +459,12 @@ static int davinci_mdio_suspend(struct device *dev) | |||
460 | static int davinci_mdio_resume(struct device *dev) | 459 | static int davinci_mdio_resume(struct device *dev) |
461 | { | 460 | { |
462 | struct davinci_mdio_data *data = dev_get_drvdata(dev); | 461 | struct davinci_mdio_data *data = dev_get_drvdata(dev); |
463 | u32 ctrl; | ||
464 | 462 | ||
465 | spin_lock(&data->lock); | ||
466 | pm_runtime_get_sync(data->dev); | 463 | pm_runtime_get_sync(data->dev); |
467 | 464 | ||
465 | spin_lock(&data->lock); | ||
468 | /* restart the scan state machine */ | 466 | /* restart the scan state machine */ |
469 | ctrl = __raw_readl(&data->regs->control); | 467 | __davinci_mdio_reset(data); |
470 | ctrl |= CONTROL_ENABLE; | ||
471 | __raw_writel(ctrl, &data->regs->control); | ||
472 | 468 | ||
473 | data->suspended = false; | 469 | data->suspended = false; |
474 | spin_unlock(&data->lock); | 470 | spin_unlock(&data->lock); |
@@ -477,8 +473,8 @@ static int davinci_mdio_resume(struct device *dev) | |||
477 | } | 473 | } |
478 | 474 | ||
479 | static const struct dev_pm_ops davinci_mdio_pm_ops = { | 475 | static const struct dev_pm_ops davinci_mdio_pm_ops = { |
480 | .suspend = davinci_mdio_suspend, | 476 | .suspend_late = davinci_mdio_suspend, |
481 | .resume = davinci_mdio_resume, | 477 | .resume_early = davinci_mdio_resume, |
482 | }; | 478 | }; |
483 | 479 | ||
484 | static const struct of_device_id davinci_mdio_of_mtable[] = { | 480 | static const struct of_device_id davinci_mdio_of_mtable[] = { |
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index ab2307b5d9a7..4dccead586be 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
@@ -285,7 +285,9 @@ int netvsc_recv_callback(struct hv_device *device_obj, | |||
285 | 285 | ||
286 | skb->protocol = eth_type_trans(skb, net); | 286 | skb->protocol = eth_type_trans(skb, net); |
287 | skb->ip_summed = CHECKSUM_NONE; | 287 | skb->ip_summed = CHECKSUM_NONE; |
288 | __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), packet->vlan_tci); | 288 | if (packet->vlan_tci & VLAN_TAG_PRESENT) |
289 | __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), | ||
290 | packet->vlan_tci); | ||
289 | 291 | ||
290 | net->stats.rx_packets++; | 292 | net->stats.rx_packets++; |
291 | net->stats.rx_bytes += packet->total_data_buflen; | 293 | net->stats.rx_bytes += packet->total_data_buflen; |
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index edfddc5f61b4..d811b06e2ccd 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -853,18 +853,24 @@ static int macvlan_changelink(struct net_device *dev, | |||
853 | struct nlattr *tb[], struct nlattr *data[]) | 853 | struct nlattr *tb[], struct nlattr *data[]) |
854 | { | 854 | { |
855 | struct macvlan_dev *vlan = netdev_priv(dev); | 855 | struct macvlan_dev *vlan = netdev_priv(dev); |
856 | if (data && data[IFLA_MACVLAN_MODE]) | 856 | |
857 | vlan->mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); | ||
858 | if (data && data[IFLA_MACVLAN_FLAGS]) { | 857 | if (data && data[IFLA_MACVLAN_FLAGS]) { |
859 | __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); | 858 | __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); |
860 | bool promisc = (flags ^ vlan->flags) & MACVLAN_FLAG_NOPROMISC; | 859 | bool promisc = (flags ^ vlan->flags) & MACVLAN_FLAG_NOPROMISC; |
861 | 860 | if (vlan->port->passthru && promisc) { | |
862 | if (promisc && (flags & MACVLAN_FLAG_NOPROMISC)) | 861 | int err; |
863 | dev_set_promiscuity(vlan->lowerdev, -1); | 862 | |
864 | else if (promisc && !(flags & MACVLAN_FLAG_NOPROMISC)) | 863 | if (flags & MACVLAN_FLAG_NOPROMISC) |
865 | dev_set_promiscuity(vlan->lowerdev, 1); | 864 | err = dev_set_promiscuity(vlan->lowerdev, -1); |
865 | else | ||
866 | err = dev_set_promiscuity(vlan->lowerdev, 1); | ||
867 | if (err < 0) | ||
868 | return err; | ||
869 | } | ||
866 | vlan->flags = flags; | 870 | vlan->flags = flags; |
867 | } | 871 | } |
872 | if (data && data[IFLA_MACVLAN_MODE]) | ||
873 | vlan->mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); | ||
868 | return 0; | 874 | return 0; |
869 | } | 875 | } |
870 | 876 | ||
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index e46fef38685b..bff7e0b0b4e7 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
@@ -1111,8 +1111,8 @@ static int team_port_add(struct team *team, struct net_device *port_dev) | |||
1111 | } | 1111 | } |
1112 | 1112 | ||
1113 | port->index = -1; | 1113 | port->index = -1; |
1114 | team_port_enable(team, port); | ||
1115 | list_add_tail_rcu(&port->list, &team->port_list); | 1114 | list_add_tail_rcu(&port->list, &team->port_list); |
1115 | team_port_enable(team, port); | ||
1116 | __team_compute_features(team); | 1116 | __team_compute_features(team); |
1117 | __team_port_change_port_added(port, !!netif_carrier_ok(port_dev)); | 1117 | __team_port_change_port_added(port, !!netif_carrier_ok(port_dev)); |
1118 | __team_options_change_check(team); | 1118 | __team_options_change_check(team); |
diff --git a/drivers/net/team/team_mode_random.c b/drivers/net/team/team_mode_random.c index 5ca14d463ba7..7f032e211343 100644 --- a/drivers/net/team/team_mode_random.c +++ b/drivers/net/team/team_mode_random.c | |||
@@ -28,6 +28,8 @@ static bool rnd_transmit(struct team *team, struct sk_buff *skb) | |||
28 | 28 | ||
29 | port_index = random_N(team->en_port_count); | 29 | port_index = random_N(team->en_port_count); |
30 | port = team_get_port_by_index_rcu(team, port_index); | 30 | port = team_get_port_by_index_rcu(team, port_index); |
31 | if (unlikely(!port)) | ||
32 | goto drop; | ||
31 | port = team_get_first_port_txable_rcu(team, port); | 33 | port = team_get_first_port_txable_rcu(team, port); |
32 | if (unlikely(!port)) | 34 | if (unlikely(!port)) |
33 | goto drop; | 35 | goto drop; |
diff --git a/drivers/net/team/team_mode_roundrobin.c b/drivers/net/team/team_mode_roundrobin.c index 90311c7375fb..53665850b59e 100644 --- a/drivers/net/team/team_mode_roundrobin.c +++ b/drivers/net/team/team_mode_roundrobin.c | |||
@@ -33,6 +33,8 @@ static bool rr_transmit(struct team *team, struct sk_buff *skb) | |||
33 | port_index = team_num_to_port_index(team, | 33 | port_index = team_num_to_port_index(team, |
34 | rr_priv(team)->sent_packets++); | 34 | rr_priv(team)->sent_packets++); |
35 | port = team_get_port_by_index_rcu(team, port_index); | 35 | port = team_get_port_by_index_rcu(team, port_index); |
36 | if (unlikely(!port)) | ||
37 | goto drop; | ||
36 | port = team_get_first_port_txable_rcu(team, port); | 38 | port = team_get_first_port_txable_rcu(team, port); |
37 | if (unlikely(!port)) | 39 | if (unlikely(!port)) |
38 | goto drop; | 40 | goto drop; |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index a34427065460..cea2fe4e9812 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -352,7 +352,7 @@ static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb) | |||
352 | u32 numqueues = 0; | 352 | u32 numqueues = 0; |
353 | 353 | ||
354 | rcu_read_lock(); | 354 | rcu_read_lock(); |
355 | numqueues = tun->numqueues; | 355 | numqueues = ACCESS_ONCE(tun->numqueues); |
356 | 356 | ||
357 | txq = skb_get_rxhash(skb); | 357 | txq = skb_get_rxhash(skb); |
358 | if (txq) { | 358 | if (txq) { |
@@ -2157,6 +2157,8 @@ static int tun_chr_open(struct inode *inode, struct file * file) | |||
2157 | set_bit(SOCK_EXTERNALLY_ALLOCATED, &tfile->socket.flags); | 2157 | set_bit(SOCK_EXTERNALLY_ALLOCATED, &tfile->socket.flags); |
2158 | INIT_LIST_HEAD(&tfile->next); | 2158 | INIT_LIST_HEAD(&tfile->next); |
2159 | 2159 | ||
2160 | sock_set_flag(&tfile->sk, SOCK_ZEROCOPY); | ||
2161 | |||
2160 | return 0; | 2162 | return 0; |
2161 | } | 2163 | } |
2162 | 2164 | ||
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index 078795fe6e31..04ee044dde51 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
@@ -627,6 +627,12 @@ static const struct usb_device_id products [] = { | |||
627 | .driver_info = 0, | 627 | .driver_info = 0, |
628 | }, | 628 | }, |
629 | 629 | ||
630 | /* Huawei E1820 - handled by qmi_wwan */ | ||
631 | { | ||
632 | USB_DEVICE_INTERFACE_NUMBER(HUAWEI_VENDOR_ID, 0x14ac, 1), | ||
633 | .driver_info = 0, | ||
634 | }, | ||
635 | |||
630 | /* Realtek RTL8152 Based USB 2.0 Ethernet Adapters */ | 636 | /* Realtek RTL8152 Based USB 2.0 Ethernet Adapters */ |
631 | #if defined(CONFIG_USB_RTL8152) || defined(CONFIG_USB_RTL8152_MODULE) | 637 | #if defined(CONFIG_USB_RTL8152) || defined(CONFIG_USB_RTL8152_MODULE) |
632 | { | 638 | { |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 86adfa0a912e..d095d0d3056b 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
@@ -519,6 +519,7 @@ static const struct usb_device_id products[] = { | |||
519 | /* 3. Combined interface devices matching on interface number */ | 519 | /* 3. Combined interface devices matching on interface number */ |
520 | {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ | 520 | {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ |
521 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ | 521 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ |
522 | {QMI_FIXED_INTF(0x12d1, 0x14ac, 1)}, /* Huawei E1820 */ | ||
522 | {QMI_FIXED_INTF(0x19d2, 0x0002, 1)}, | 523 | {QMI_FIXED_INTF(0x19d2, 0x0002, 1)}, |
523 | {QMI_FIXED_INTF(0x19d2, 0x0012, 1)}, | 524 | {QMI_FIXED_INTF(0x19d2, 0x0012, 1)}, |
524 | {QMI_FIXED_INTF(0x19d2, 0x0017, 3)}, | 525 | {QMI_FIXED_INTF(0x19d2, 0x0017, 3)}, |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 8111565c35fc..f6dce13c8f89 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -603,18 +603,22 @@ skip: | |||
603 | 603 | ||
604 | /* Watch incoming packets to learn mapping between Ethernet address | 604 | /* Watch incoming packets to learn mapping between Ethernet address |
605 | * and Tunnel endpoint. | 605 | * and Tunnel endpoint. |
606 | * Return true if packet is bogus and should be droppped. | ||
606 | */ | 607 | */ |
607 | static void vxlan_snoop(struct net_device *dev, | 608 | static bool vxlan_snoop(struct net_device *dev, |
608 | __be32 src_ip, const u8 *src_mac) | 609 | __be32 src_ip, const u8 *src_mac) |
609 | { | 610 | { |
610 | struct vxlan_dev *vxlan = netdev_priv(dev); | 611 | struct vxlan_dev *vxlan = netdev_priv(dev); |
611 | struct vxlan_fdb *f; | 612 | struct vxlan_fdb *f; |
612 | int err; | ||
613 | 613 | ||
614 | f = vxlan_find_mac(vxlan, src_mac); | 614 | f = vxlan_find_mac(vxlan, src_mac); |
615 | if (likely(f)) { | 615 | if (likely(f)) { |
616 | if (likely(f->remote.remote_ip == src_ip)) | 616 | if (likely(f->remote.remote_ip == src_ip)) |
617 | return; | 617 | return false; |
618 | |||
619 | /* Don't migrate static entries, drop packets */ | ||
620 | if (f->state & NUD_NOARP) | ||
621 | return true; | ||
618 | 622 | ||
619 | if (net_ratelimit()) | 623 | if (net_ratelimit()) |
620 | netdev_info(dev, | 624 | netdev_info(dev, |
@@ -626,14 +630,19 @@ static void vxlan_snoop(struct net_device *dev, | |||
626 | } else { | 630 | } else { |
627 | /* learned new entry */ | 631 | /* learned new entry */ |
628 | spin_lock(&vxlan->hash_lock); | 632 | spin_lock(&vxlan->hash_lock); |
629 | err = vxlan_fdb_create(vxlan, src_mac, src_ip, | 633 | |
630 | NUD_REACHABLE, | 634 | /* close off race between vxlan_flush and incoming packets */ |
631 | NLM_F_EXCL|NLM_F_CREATE, | 635 | if (netif_running(dev)) |
632 | vxlan->dst_port, | 636 | vxlan_fdb_create(vxlan, src_mac, src_ip, |
633 | vxlan->default_dst.remote_vni, | 637 | NUD_REACHABLE, |
634 | 0, NTF_SELF); | 638 | NLM_F_EXCL|NLM_F_CREATE, |
639 | vxlan->dst_port, | ||
640 | vxlan->default_dst.remote_vni, | ||
641 | 0, NTF_SELF); | ||
635 | spin_unlock(&vxlan->hash_lock); | 642 | spin_unlock(&vxlan->hash_lock); |
636 | } | 643 | } |
644 | |||
645 | return false; | ||
637 | } | 646 | } |
638 | 647 | ||
639 | 648 | ||
@@ -766,8 +775,9 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | |||
766 | vxlan->dev->dev_addr) == 0) | 775 | vxlan->dev->dev_addr) == 0) |
767 | goto drop; | 776 | goto drop; |
768 | 777 | ||
769 | if (vxlan->flags & VXLAN_F_LEARN) | 778 | if ((vxlan->flags & VXLAN_F_LEARN) && |
770 | vxlan_snoop(skb->dev, oip->saddr, eth_hdr(skb)->h_source); | 779 | vxlan_snoop(skb->dev, oip->saddr, eth_hdr(skb)->h_source)) |
780 | goto drop; | ||
771 | 781 | ||
772 | __skb_tunnel_rx(skb, vxlan->dev); | 782 | __skb_tunnel_rx(skb, vxlan->dev); |
773 | skb_reset_network_header(skb); | 783 | skb_reset_network_header(skb); |
@@ -1190,9 +1200,11 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1190 | struct sk_buff *skb1; | 1200 | struct sk_buff *skb1; |
1191 | 1201 | ||
1192 | skb1 = skb_clone(skb, GFP_ATOMIC); | 1202 | skb1 = skb_clone(skb, GFP_ATOMIC); |
1193 | rc1 = vxlan_xmit_one(skb1, dev, rdst, did_rsc); | 1203 | if (skb1) { |
1194 | if (rc == NETDEV_TX_OK) | 1204 | rc1 = vxlan_xmit_one(skb1, dev, rdst, did_rsc); |
1195 | rc = rc1; | 1205 | if (rc == NETDEV_TX_OK) |
1206 | rc = rc1; | ||
1207 | } | ||
1196 | } | 1208 | } |
1197 | 1209 | ||
1198 | rc1 = vxlan_xmit_one(skb, dev, rdst0, did_rsc); | 1210 | rc1 = vxlan_xmit_one(skb, dev, rdst0, did_rsc); |
diff --git a/drivers/net/wireless/ath/ath9k/Kconfig b/drivers/net/wireless/ath/ath9k/Kconfig index 3b078515b422..760ab3fe09e2 100644 --- a/drivers/net/wireless/ath/ath9k/Kconfig +++ b/drivers/net/wireless/ath/ath9k/Kconfig | |||
@@ -84,13 +84,17 @@ config ATH9K_DFS_CERTIFIED | |||
84 | developed. At this point enabling this option won't do anything | 84 | developed. At this point enabling this option won't do anything |
85 | except increase code size. | 85 | except increase code size. |
86 | 86 | ||
87 | config ATH9K_RATE_CONTROL | 87 | config ATH9K_LEGACY_RATE_CONTROL |
88 | bool "Atheros ath9k rate control" | 88 | bool "Atheros ath9k rate control" |
89 | depends on ATH9K | 89 | depends on ATH9K |
90 | default y | 90 | default n |
91 | ---help--- | 91 | ---help--- |
92 | Say Y, if you want to use the ath9k specific rate control | 92 | Say Y, if you want to use the ath9k specific rate control |
93 | module instead of minstrel_ht. | 93 | module instead of minstrel_ht. Be warned that there are various |
94 | issues with the ath9k RC and minstrel is a more robust algorithm. | ||
95 | Note that even if this option is selected, "ath9k_rate_control" | ||
96 | has to be passed to mac80211 using the module parameter, | ||
97 | ieee80211_default_rc_algo. | ||
94 | 98 | ||
95 | config ATH9K_HTC | 99 | config ATH9K_HTC |
96 | tristate "Atheros HTC based wireless cards support" | 100 | tristate "Atheros HTC based wireless cards support" |
diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile index 2ad8f9474ba1..75ee9e7704ce 100644 --- a/drivers/net/wireless/ath/ath9k/Makefile +++ b/drivers/net/wireless/ath/ath9k/Makefile | |||
@@ -8,7 +8,7 @@ ath9k-y += beacon.o \ | |||
8 | antenna.o | 8 | antenna.o |
9 | 9 | ||
10 | ath9k-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += mci.o | 10 | ath9k-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += mci.o |
11 | ath9k-$(CONFIG_ATH9K_RATE_CONTROL) += rc.o | 11 | ath9k-$(CONFIG_ATH9K_LEGACY_RATE_CONTROL) += rc.o |
12 | ath9k-$(CONFIG_ATH9K_PCI) += pci.o | 12 | ath9k-$(CONFIG_ATH9K_PCI) += pci.o |
13 | ath9k-$(CONFIG_ATH9K_AHB) += ahb.o | 13 | ath9k-$(CONFIG_ATH9K_AHB) += ahb.o |
14 | ath9k-$(CONFIG_ATH9K_DEBUGFS) += debug.o | 14 | ath9k-$(CONFIG_ATH9K_DEBUGFS) += debug.o |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h index db5ffada2217..7546b9a7dcbf 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h | |||
@@ -958,11 +958,11 @@ static const u32 ar9300Common_rx_gain_table_2p2[][2] = { | |||
958 | {0x0000a074, 0x00000000}, | 958 | {0x0000a074, 0x00000000}, |
959 | {0x0000a078, 0x00000000}, | 959 | {0x0000a078, 0x00000000}, |
960 | {0x0000a07c, 0x00000000}, | 960 | {0x0000a07c, 0x00000000}, |
961 | {0x0000a080, 0x1a1a1a1a}, | 961 | {0x0000a080, 0x22222229}, |
962 | {0x0000a084, 0x1a1a1a1a}, | 962 | {0x0000a084, 0x1d1d1d1d}, |
963 | {0x0000a088, 0x1a1a1a1a}, | 963 | {0x0000a088, 0x1d1d1d1d}, |
964 | {0x0000a08c, 0x1a1a1a1a}, | 964 | {0x0000a08c, 0x1d1d1d1d}, |
965 | {0x0000a090, 0x171a1a1a}, | 965 | {0x0000a090, 0x171d1d1d}, |
966 | {0x0000a094, 0x11111717}, | 966 | {0x0000a094, 0x11111717}, |
967 | {0x0000a098, 0x00030311}, | 967 | {0x0000a098, 0x00030311}, |
968 | {0x0000a09c, 0x00000000}, | 968 | {0x0000a09c, 0x00000000}, |
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index daba841808cf..389ee1b59976 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
@@ -792,8 +792,7 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
792 | hw->wiphy->iface_combinations = if_comb; | 792 | hw->wiphy->iface_combinations = if_comb; |
793 | hw->wiphy->n_iface_combinations = ARRAY_SIZE(if_comb); | 793 | hw->wiphy->n_iface_combinations = ARRAY_SIZE(if_comb); |
794 | 794 | ||
795 | if (AR_SREV_5416(sc->sc_ah)) | 795 | hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; |
796 | hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; | ||
797 | 796 | ||
798 | hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; | 797 | hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; |
799 | hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; | 798 | hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS; |
@@ -831,10 +830,6 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) | |||
831 | sc->ant_rx = hw->wiphy->available_antennas_rx; | 830 | sc->ant_rx = hw->wiphy->available_antennas_rx; |
832 | sc->ant_tx = hw->wiphy->available_antennas_tx; | 831 | sc->ant_tx = hw->wiphy->available_antennas_tx; |
833 | 832 | ||
834 | #ifdef CONFIG_ATH9K_RATE_CONTROL | ||
835 | hw->rate_control_algorithm = "ath9k_rate_control"; | ||
836 | #endif | ||
837 | |||
838 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) | 833 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) |
839 | hw->wiphy->bands[IEEE80211_BAND_2GHZ] = | 834 | hw->wiphy->bands[IEEE80211_BAND_2GHZ] = |
840 | &sc->sbands[IEEE80211_BAND_2GHZ]; | 835 | &sc->sbands[IEEE80211_BAND_2GHZ]; |
diff --git a/drivers/net/wireless/ath/ath9k/rc.h b/drivers/net/wireless/ath/ath9k/rc.h index 267dbfcfaa96..b9a87383cb43 100644 --- a/drivers/net/wireless/ath/ath9k/rc.h +++ b/drivers/net/wireless/ath/ath9k/rc.h | |||
@@ -231,7 +231,7 @@ static inline void ath_debug_stat_retries(struct ath_rate_priv *rc, int rix, | |||
231 | } | 231 | } |
232 | #endif | 232 | #endif |
233 | 233 | ||
234 | #ifdef CONFIG_ATH9K_RATE_CONTROL | 234 | #ifdef CONFIG_ATH9K_LEGACY_RATE_CONTROL |
235 | int ath_rate_control_register(void); | 235 | int ath_rate_control_register(void); |
236 | void ath_rate_control_unregister(void); | 236 | void ath_rate_control_unregister(void); |
237 | #else | 237 | #else |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 6dd07e2ec595..a95b77ab360e 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -2458,7 +2458,7 @@ static void b43_request_firmware(struct work_struct *work) | |||
2458 | for (i = 0; i < B43_NR_FWTYPES; i++) { | 2458 | for (i = 0; i < B43_NR_FWTYPES; i++) { |
2459 | errmsg = ctx->errors[i]; | 2459 | errmsg = ctx->errors[i]; |
2460 | if (strlen(errmsg)) | 2460 | if (strlen(errmsg)) |
2461 | b43err(dev->wl, errmsg); | 2461 | b43err(dev->wl, "%s", errmsg); |
2462 | } | 2462 | } |
2463 | b43_print_fw_helptext(dev->wl, 1); | 2463 | b43_print_fw_helptext(dev->wl, 1); |
2464 | goto out; | 2464 | goto out; |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c index b98f2235978e..2c593570497c 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c | |||
@@ -930,6 +930,10 @@ fail: | |||
930 | brcmf_fws_del_interface(ifp); | 930 | brcmf_fws_del_interface(ifp); |
931 | brcmf_fws_deinit(drvr); | 931 | brcmf_fws_deinit(drvr); |
932 | } | 932 | } |
933 | if (drvr->iflist[0]) { | ||
934 | free_netdev(ifp->ndev); | ||
935 | drvr->iflist[0] = NULL; | ||
936 | } | ||
933 | if (p2p_ifp) { | 937 | if (p2p_ifp) { |
934 | free_netdev(p2p_ifp->ndev); | 938 | free_netdev(p2p_ifp->ndev); |
935 | drvr->iflist[1] = NULL; | 939 | drvr->iflist[1] = NULL; |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c index 28e7aeedd184..9fd6f2fef11b 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c | |||
@@ -3074,21 +3074,8 @@ static void brcms_b_antsel_set(struct brcms_hardware *wlc_hw, u32 antsel_avail) | |||
3074 | */ | 3074 | */ |
3075 | static bool brcms_c_ps_allowed(struct brcms_c_info *wlc) | 3075 | static bool brcms_c_ps_allowed(struct brcms_c_info *wlc) |
3076 | { | 3076 | { |
3077 | /* disallow PS when one of the following global conditions meets */ | 3077 | /* not supporting PS so always return false for now */ |
3078 | if (!wlc->pub->associated) | 3078 | return false; |
3079 | return false; | ||
3080 | |||
3081 | /* disallow PS when one of these meets when not scanning */ | ||
3082 | if (wlc->filter_flags & FIF_PROMISC_IN_BSS) | ||
3083 | return false; | ||
3084 | |||
3085 | if (wlc->bsscfg->type == BRCMS_TYPE_AP) | ||
3086 | return false; | ||
3087 | |||
3088 | if (wlc->bsscfg->type == BRCMS_TYPE_ADHOC) | ||
3089 | return false; | ||
3090 | |||
3091 | return true; | ||
3092 | } | 3079 | } |
3093 | 3080 | ||
3094 | static void brcms_c_statsupd(struct brcms_c_info *wlc) | 3081 | static void brcms_c_statsupd(struct brcms_c_info *wlc) |
diff --git a/drivers/net/wireless/iwlegacy/3945-rs.c b/drivers/net/wireless/iwlegacy/3945-rs.c index c9f197d9ca1e..fe31590a51b2 100644 --- a/drivers/net/wireless/iwlegacy/3945-rs.c +++ b/drivers/net/wireless/iwlegacy/3945-rs.c | |||
@@ -816,6 +816,7 @@ out: | |||
816 | rs_sta->last_txrate_idx = idx; | 816 | rs_sta->last_txrate_idx = idx; |
817 | info->control.rates[0].idx = rs_sta->last_txrate_idx; | 817 | info->control.rates[0].idx = rs_sta->last_txrate_idx; |
818 | } | 818 | } |
819 | info->control.rates[0].count = 1; | ||
819 | 820 | ||
820 | D_RATE("leave: %d\n", idx); | 821 | D_RATE("leave: %d\n", idx); |
821 | } | 822 | } |
diff --git a/drivers/net/wireless/iwlegacy/4965-rs.c b/drivers/net/wireless/iwlegacy/4965-rs.c index 1fc0b227e120..ed3c42a63a43 100644 --- a/drivers/net/wireless/iwlegacy/4965-rs.c +++ b/drivers/net/wireless/iwlegacy/4965-rs.c | |||
@@ -2268,7 +2268,7 @@ il4965_rs_get_rate(void *il_r, struct ieee80211_sta *sta, void *il_sta, | |||
2268 | info->control.rates[0].flags = 0; | 2268 | info->control.rates[0].flags = 0; |
2269 | } | 2269 | } |
2270 | info->control.rates[0].idx = rate_idx; | 2270 | info->control.rates[0].idx = rate_idx; |
2271 | 2271 | info->control.rates[0].count = 1; | |
2272 | } | 2272 | } |
2273 | 2273 | ||
2274 | static void * | 2274 | static void * |
diff --git a/drivers/net/wireless/iwlegacy/common.h b/drivers/net/wireless/iwlegacy/common.h index f8246f2d88f9..4caaf52986a4 100644 --- a/drivers/net/wireless/iwlegacy/common.h +++ b/drivers/net/wireless/iwlegacy/common.h | |||
@@ -1832,16 +1832,16 @@ u32 il_usecs_to_beacons(struct il_priv *il, u32 usec, u32 beacon_interval); | |||
1832 | __le32 il_add_beacon_time(struct il_priv *il, u32 base, u32 addon, | 1832 | __le32 il_add_beacon_time(struct il_priv *il, u32 base, u32 addon, |
1833 | u32 beacon_interval); | 1833 | u32 beacon_interval); |
1834 | 1834 | ||
1835 | #ifdef CONFIG_PM | 1835 | #ifdef CONFIG_PM_SLEEP |
1836 | extern const struct dev_pm_ops il_pm_ops; | 1836 | extern const struct dev_pm_ops il_pm_ops; |
1837 | 1837 | ||
1838 | #define IL_LEGACY_PM_OPS (&il_pm_ops) | 1838 | #define IL_LEGACY_PM_OPS (&il_pm_ops) |
1839 | 1839 | ||
1840 | #else /* !CONFIG_PM */ | 1840 | #else /* !CONFIG_PM_SLEEP */ |
1841 | 1841 | ||
1842 | #define IL_LEGACY_PM_OPS NULL | 1842 | #define IL_LEGACY_PM_OPS NULL |
1843 | 1843 | ||
1844 | #endif /* !CONFIG_PM */ | 1844 | #endif /* !CONFIG_PM_SLEEP */ |
1845 | 1845 | ||
1846 | /***************************************************** | 1846 | /***************************************************** |
1847 | * Error Handling Debugging | 1847 | * Error Handling Debugging |
diff --git a/drivers/net/wireless/iwlwifi/dvm/rs.c b/drivers/net/wireless/iwlwifi/dvm/rs.c index 94314a8e1029..8fe76dc4f373 100644 --- a/drivers/net/wireless/iwlwifi/dvm/rs.c +++ b/drivers/net/wireless/iwlwifi/dvm/rs.c | |||
@@ -2799,7 +2799,7 @@ static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta, | |||
2799 | info->control.rates[0].flags = 0; | 2799 | info->control.rates[0].flags = 0; |
2800 | } | 2800 | } |
2801 | info->control.rates[0].idx = rate_idx; | 2801 | info->control.rates[0].idx = rate_idx; |
2802 | 2802 | info->control.rates[0].count = 1; | |
2803 | } | 2803 | } |
2804 | 2804 | ||
2805 | static void *rs_alloc_sta(void *priv_rate, struct ieee80211_sta *sta, | 2805 | static void *rs_alloc_sta(void *priv_rate, struct ieee80211_sta *sta, |
diff --git a/drivers/net/wireless/iwlwifi/dvm/rxon.c b/drivers/net/wireless/iwlwifi/dvm/rxon.c index 707446fa00bd..cd1ad0019185 100644 --- a/drivers/net/wireless/iwlwifi/dvm/rxon.c +++ b/drivers/net/wireless/iwlwifi/dvm/rxon.c | |||
@@ -1378,7 +1378,7 @@ static void iwlagn_chain_noise_reset(struct iwl_priv *priv) | |||
1378 | struct iwl_chain_noise_data *data = &priv->chain_noise_data; | 1378 | struct iwl_chain_noise_data *data = &priv->chain_noise_data; |
1379 | int ret; | 1379 | int ret; |
1380 | 1380 | ||
1381 | if (!(priv->calib_disabled & IWL_CHAIN_NOISE_CALIB_DISABLED)) | 1381 | if (priv->calib_disabled & IWL_CHAIN_NOISE_CALIB_DISABLED) |
1382 | return; | 1382 | return; |
1383 | 1383 | ||
1384 | if ((data->state == IWL_CHAIN_NOISE_ALIVE) && | 1384 | if ((data->state == IWL_CHAIN_NOISE_ALIVE) && |
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c index 4f886133639a..2f690e578b5c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-drv.c +++ b/drivers/net/wireless/iwlwifi/iwl-drv.c | |||
@@ -1000,10 +1000,12 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context) | |||
1000 | */ | 1000 | */ |
1001 | if (load_module) { | 1001 | if (load_module) { |
1002 | err = request_module("%s", op->name); | 1002 | err = request_module("%s", op->name); |
1003 | #ifdef CONFIG_IWLWIFI_OPMODE_MODULAR | ||
1003 | if (err) | 1004 | if (err) |
1004 | IWL_ERR(drv, | 1005 | IWL_ERR(drv, |
1005 | "failed to load module %s (error %d), is dynamic loading enabled?\n", | 1006 | "failed to load module %s (error %d), is dynamic loading enabled?\n", |
1006 | op->name, err); | 1007 | op->name, err); |
1008 | #endif | ||
1007 | } | 1009 | } |
1008 | return; | 1010 | return; |
1009 | 1011 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c index d6beec765d65..31587a318f8b 100644 --- a/drivers/net/wireless/iwlwifi/mvm/rs.c +++ b/drivers/net/wireless/iwlwifi/mvm/rs.c | |||
@@ -2652,6 +2652,7 @@ static void rs_get_rate(void *mvm_r, struct ieee80211_sta *sta, void *mvm_sta, | |||
2652 | info->control.rates[0].flags = 0; | 2652 | info->control.rates[0].flags = 0; |
2653 | } | 2653 | } |
2654 | info->control.rates[0].idx = rate_idx; | 2654 | info->control.rates[0].idx = rate_idx; |
2655 | info->control.rates[0].count = 1; | ||
2655 | } | 2656 | } |
2656 | 2657 | ||
2657 | static void *rs_alloc_sta(void *mvm_rate, struct ieee80211_sta *sta, | 2658 | static void *rs_alloc_sta(void *mvm_rate, struct ieee80211_sta *sta, |
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c index a830eb6cc411..b9ba4e71ea4a 100644 --- a/drivers/net/wireless/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/iwlwifi/mvm/tx.c | |||
@@ -180,7 +180,8 @@ static void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm, | |||
180 | tx_cmd->tx_flags |= cpu_to_le32(TX_CMD_FLG_STA_RATE); | 180 | tx_cmd->tx_flags |= cpu_to_le32(TX_CMD_FLG_STA_RATE); |
181 | return; | 181 | return; |
182 | } else if (ieee80211_is_back_req(fc)) { | 182 | } else if (ieee80211_is_back_req(fc)) { |
183 | tx_cmd->tx_flags |= cpu_to_le32(TX_CMD_FLG_STA_RATE); | 183 | tx_cmd->tx_flags |= |
184 | cpu_to_le32(TX_CMD_FLG_ACK | TX_CMD_FLG_BAR); | ||
184 | } | 185 | } |
185 | 186 | ||
186 | /* HT rate doesn't make sense for a non data frame */ | 187 | /* HT rate doesn't make sense for a non data frame */ |
diff --git a/drivers/net/wireless/mwifiex/debugfs.c b/drivers/net/wireless/mwifiex/debugfs.c index 753b5682d53f..a5f9875cfd6e 100644 --- a/drivers/net/wireless/mwifiex/debugfs.c +++ b/drivers/net/wireless/mwifiex/debugfs.c | |||
@@ -26,10 +26,17 @@ | |||
26 | static struct dentry *mwifiex_dfs_dir; | 26 | static struct dentry *mwifiex_dfs_dir; |
27 | 27 | ||
28 | static char *bss_modes[] = { | 28 | static char *bss_modes[] = { |
29 | "Unknown", | 29 | "UNSPECIFIED", |
30 | "Ad-hoc", | 30 | "ADHOC", |
31 | "Managed", | 31 | "STATION", |
32 | "Auto" | 32 | "AP", |
33 | "AP_VLAN", | ||
34 | "WDS", | ||
35 | "MONITOR", | ||
36 | "MESH_POINT", | ||
37 | "P2P_CLIENT", | ||
38 | "P2P_GO", | ||
39 | "P2P_DEVICE", | ||
33 | }; | 40 | }; |
34 | 41 | ||
35 | /* size/addr for mwifiex_debug_info */ | 42 | /* size/addr for mwifiex_debug_info */ |
@@ -200,7 +207,12 @@ mwifiex_info_read(struct file *file, char __user *ubuf, | |||
200 | p += sprintf(p, "driver_version = %s", fmt); | 207 | p += sprintf(p, "driver_version = %s", fmt); |
201 | p += sprintf(p, "\nverext = %s", priv->version_str); | 208 | p += sprintf(p, "\nverext = %s", priv->version_str); |
202 | p += sprintf(p, "\ninterface_name=\"%s\"\n", netdev->name); | 209 | p += sprintf(p, "\ninterface_name=\"%s\"\n", netdev->name); |
203 | p += sprintf(p, "bss_mode=\"%s\"\n", bss_modes[info.bss_mode]); | 210 | |
211 | if (info.bss_mode >= ARRAY_SIZE(bss_modes)) | ||
212 | p += sprintf(p, "bss_mode=\"%d\"\n", info.bss_mode); | ||
213 | else | ||
214 | p += sprintf(p, "bss_mode=\"%s\"\n", bss_modes[info.bss_mode]); | ||
215 | |||
204 | p += sprintf(p, "media_state=\"%s\"\n", | 216 | p += sprintf(p, "media_state=\"%s\"\n", |
205 | (!priv->media_connected ? "Disconnected" : "Connected")); | 217 | (!priv->media_connected ? "Disconnected" : "Connected")); |
206 | p += sprintf(p, "mac_address=\"%pM\"\n", netdev->dev_addr); | 218 | p += sprintf(p, "mac_address=\"%pM\"\n", netdev->dev_addr); |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index ead3a3e746a2..3aa30ddcbfea 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -3027,19 +3027,26 @@ static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev, | |||
3027 | * TODO: we do not use +6 dBm option to do not increase power beyond | 3027 | * TODO: we do not use +6 dBm option to do not increase power beyond |
3028 | * regulatory limit, however this could be utilized for devices with | 3028 | * regulatory limit, however this could be utilized for devices with |
3029 | * CAPABILITY_POWER_LIMIT. | 3029 | * CAPABILITY_POWER_LIMIT. |
3030 | * | ||
3031 | * TODO: add different temperature compensation code for RT3290 & RT5390 | ||
3032 | * to allow to use BBP_R1 for those chips. | ||
3030 | */ | 3033 | */ |
3031 | rt2800_bbp_read(rt2x00dev, 1, &r1); | 3034 | if (!rt2x00_rt(rt2x00dev, RT3290) && |
3032 | if (delta <= -12) { | 3035 | !rt2x00_rt(rt2x00dev, RT5390)) { |
3033 | power_ctrl = 2; | 3036 | rt2800_bbp_read(rt2x00dev, 1, &r1); |
3034 | delta += 12; | 3037 | if (delta <= -12) { |
3035 | } else if (delta <= -6) { | 3038 | power_ctrl = 2; |
3036 | power_ctrl = 1; | 3039 | delta += 12; |
3037 | delta += 6; | 3040 | } else if (delta <= -6) { |
3038 | } else { | 3041 | power_ctrl = 1; |
3039 | power_ctrl = 0; | 3042 | delta += 6; |
3043 | } else { | ||
3044 | power_ctrl = 0; | ||
3045 | } | ||
3046 | rt2x00_set_field8(&r1, BBP1_TX_POWER_CTRL, power_ctrl); | ||
3047 | rt2800_bbp_write(rt2x00dev, 1, r1); | ||
3040 | } | 3048 | } |
3041 | rt2x00_set_field8(&r1, BBP1_TX_POWER_CTRL, power_ctrl); | 3049 | |
3042 | rt2800_bbp_write(rt2x00dev, 1, r1); | ||
3043 | offset = TX_PWR_CFG_0; | 3050 | offset = TX_PWR_CFG_0; |
3044 | 3051 | ||
3045 | for (i = 0; i < EEPROM_TXPOWER_BYRATE_SIZE; i += 2) { | 3052 | for (i = 0; i < EEPROM_TXPOWER_BYRATE_SIZE; i += 2) { |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 999ffc12578b..c97e9d327331 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
@@ -764,6 +764,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) | |||
764 | "can't alloc skb for rx\n"); | 764 | "can't alloc skb for rx\n"); |
765 | goto done; | 765 | goto done; |
766 | } | 766 | } |
767 | kmemleak_not_leak(new_skb); | ||
767 | 768 | ||
768 | pci_unmap_single(rtlpci->pdev, | 769 | pci_unmap_single(rtlpci->pdev, |
769 | *((dma_addr_t *) skb->cb), | 770 | *((dma_addr_t *) skb->cb), |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c index 3d0498e69c8c..189ba124a8c6 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | |||
@@ -1973,26 +1973,35 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) | |||
1973 | } | 1973 | } |
1974 | } | 1974 | } |
1975 | 1975 | ||
1976 | void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw, | 1976 | static void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw, |
1977 | struct ieee80211_sta *sta, | 1977 | struct ieee80211_sta *sta) |
1978 | u8 rssi_level) | ||
1979 | { | 1978 | { |
1980 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 1979 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
1981 | struct rtl_phy *rtlphy = &(rtlpriv->phy); | 1980 | struct rtl_phy *rtlphy = &(rtlpriv->phy); |
1982 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); | 1981 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); |
1983 | u32 ratr_value = (u32) mac->basic_rates; | 1982 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); |
1984 | u8 *mcsrate = mac->mcs; | 1983 | u32 ratr_value; |
1985 | u8 ratr_index = 0; | 1984 | u8 ratr_index = 0; |
1986 | u8 nmode = mac->ht_enable; | 1985 | u8 nmode = mac->ht_enable; |
1987 | u8 mimo_ps = 1; | 1986 | u8 mimo_ps = IEEE80211_SMPS_OFF; |
1988 | u16 shortgi_rate = 0; | 1987 | u16 shortgi_rate; |
1989 | u32 tmp_ratr_value = 0; | 1988 | u32 tmp_ratr_value; |
1990 | u8 curtxbw_40mhz = mac->bw_40; | 1989 | u8 curtxbw_40mhz = mac->bw_40; |
1991 | u8 curshortgi_40mhz = mac->sgi_40; | 1990 | u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? |
1992 | u8 curshortgi_20mhz = mac->sgi_20; | 1991 | 1 : 0; |
1992 | u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ? | ||
1993 | 1 : 0; | ||
1993 | enum wireless_mode wirelessmode = mac->mode; | 1994 | enum wireless_mode wirelessmode = mac->mode; |
1994 | 1995 | ||
1995 | ratr_value |= ((*(u16 *) (mcsrate))) << 12; | 1996 | if (rtlhal->current_bandtype == BAND_ON_5G) |
1997 | ratr_value = sta->supp_rates[1] << 4; | ||
1998 | else | ||
1999 | ratr_value = sta->supp_rates[0]; | ||
2000 | if (mac->opmode == NL80211_IFTYPE_ADHOC) | ||
2001 | ratr_value = 0xfff; | ||
2002 | |||
2003 | ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 | | ||
2004 | sta->ht_cap.mcs.rx_mask[0] << 12); | ||
1996 | switch (wirelessmode) { | 2005 | switch (wirelessmode) { |
1997 | case WIRELESS_MODE_B: | 2006 | case WIRELESS_MODE_B: |
1998 | if (ratr_value & 0x0000000c) | 2007 | if (ratr_value & 0x0000000c) |
@@ -2006,7 +2015,7 @@ void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw, | |||
2006 | case WIRELESS_MODE_N_24G: | 2015 | case WIRELESS_MODE_N_24G: |
2007 | case WIRELESS_MODE_N_5G: | 2016 | case WIRELESS_MODE_N_5G: |
2008 | nmode = 1; | 2017 | nmode = 1; |
2009 | if (mimo_ps == 0) { | 2018 | if (mimo_ps == IEEE80211_SMPS_STATIC) { |
2010 | ratr_value &= 0x0007F005; | 2019 | ratr_value &= 0x0007F005; |
2011 | } else { | 2020 | } else { |
2012 | u32 ratr_mask; | 2021 | u32 ratr_mask; |
@@ -2016,8 +2025,7 @@ void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw, | |||
2016 | ratr_mask = 0x000ff005; | 2025 | ratr_mask = 0x000ff005; |
2017 | else | 2026 | else |
2018 | ratr_mask = 0x0f0ff005; | 2027 | ratr_mask = 0x0f0ff005; |
2019 | if (curtxbw_40mhz) | 2028 | |
2020 | ratr_mask |= 0x00000010; | ||
2021 | ratr_value &= ratr_mask; | 2029 | ratr_value &= ratr_mask; |
2022 | } | 2030 | } |
2023 | break; | 2031 | break; |
@@ -2026,41 +2034,74 @@ void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw, | |||
2026 | ratr_value &= 0x000ff0ff; | 2034 | ratr_value &= 0x000ff0ff; |
2027 | else | 2035 | else |
2028 | ratr_value &= 0x0f0ff0ff; | 2036 | ratr_value &= 0x0f0ff0ff; |
2037 | |||
2029 | break; | 2038 | break; |
2030 | } | 2039 | } |
2040 | |||
2031 | ratr_value &= 0x0FFFFFFF; | 2041 | ratr_value &= 0x0FFFFFFF; |
2032 | if (nmode && ((curtxbw_40mhz && curshortgi_40mhz) || | 2042 | |
2033 | (!curtxbw_40mhz && curshortgi_20mhz))) { | 2043 | if (nmode && ((curtxbw_40mhz && |
2044 | curshortgi_40mhz) || (!curtxbw_40mhz && | ||
2045 | curshortgi_20mhz))) { | ||
2046 | |||
2034 | ratr_value |= 0x10000000; | 2047 | ratr_value |= 0x10000000; |
2035 | tmp_ratr_value = (ratr_value >> 12); | 2048 | tmp_ratr_value = (ratr_value >> 12); |
2049 | |||
2036 | for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) { | 2050 | for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) { |
2037 | if ((1 << shortgi_rate) & tmp_ratr_value) | 2051 | if ((1 << shortgi_rate) & tmp_ratr_value) |
2038 | break; | 2052 | break; |
2039 | } | 2053 | } |
2054 | |||
2040 | shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) | | 2055 | shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) | |
2041 | (shortgi_rate << 4) | (shortgi_rate); | 2056 | (shortgi_rate << 4) | (shortgi_rate); |
2042 | } | 2057 | } |
2058 | |||
2043 | rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value); | 2059 | rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value); |
2060 | |||
2061 | RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, "%x\n", | ||
2062 | rtl_read_dword(rtlpriv, REG_ARFR0)); | ||
2044 | } | 2063 | } |
2045 | 2064 | ||
2046 | void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level) | 2065 | static void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, |
2066 | struct ieee80211_sta *sta, | ||
2067 | u8 rssi_level) | ||
2047 | { | 2068 | { |
2048 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 2069 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
2049 | struct rtl_phy *rtlphy = &(rtlpriv->phy); | 2070 | struct rtl_phy *rtlphy = &(rtlpriv->phy); |
2050 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); | 2071 | struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); |
2051 | u32 ratr_bitmap = (u32) mac->basic_rates; | 2072 | struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); |
2052 | u8 *p_mcsrate = mac->mcs; | 2073 | struct rtl_sta_info *sta_entry = NULL; |
2053 | u8 ratr_index = 0; | 2074 | u32 ratr_bitmap; |
2054 | u8 curtxbw_40mhz = mac->bw_40; | 2075 | u8 ratr_index; |
2055 | u8 curshortgi_40mhz = mac->sgi_40; | 2076 | u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0; |
2056 | u8 curshortgi_20mhz = mac->sgi_20; | 2077 | u8 curshortgi_40mhz = curtxbw_40mhz && |
2057 | enum wireless_mode wirelessmode = mac->mode; | 2078 | (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? |
2079 | 1 : 0; | ||
2080 | u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ? | ||
2081 | 1 : 0; | ||
2082 | enum wireless_mode wirelessmode = 0; | ||
2058 | bool shortgi = false; | 2083 | bool shortgi = false; |
2059 | u8 rate_mask[5]; | 2084 | u8 rate_mask[5]; |
2060 | u8 macid = 0; | 2085 | u8 macid = 0; |
2061 | u8 mimops = 1; | 2086 | u8 mimo_ps = IEEE80211_SMPS_OFF; |
2062 | 2087 | ||
2063 | ratr_bitmap |= (p_mcsrate[1] << 20) | (p_mcsrate[0] << 12); | 2088 | sta_entry = (struct rtl_sta_info *) sta->drv_priv; |
2089 | wirelessmode = sta_entry->wireless_mode; | ||
2090 | if (mac->opmode == NL80211_IFTYPE_STATION || | ||
2091 | mac->opmode == NL80211_IFTYPE_MESH_POINT) | ||
2092 | curtxbw_40mhz = mac->bw_40; | ||
2093 | else if (mac->opmode == NL80211_IFTYPE_AP || | ||
2094 | mac->opmode == NL80211_IFTYPE_ADHOC) | ||
2095 | macid = sta->aid + 1; | ||
2096 | |||
2097 | if (rtlhal->current_bandtype == BAND_ON_5G) | ||
2098 | ratr_bitmap = sta->supp_rates[1] << 4; | ||
2099 | else | ||
2100 | ratr_bitmap = sta->supp_rates[0]; | ||
2101 | if (mac->opmode == NL80211_IFTYPE_ADHOC) | ||
2102 | ratr_bitmap = 0xfff; | ||
2103 | ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 | | ||
2104 | sta->ht_cap.mcs.rx_mask[0] << 12); | ||
2064 | switch (wirelessmode) { | 2105 | switch (wirelessmode) { |
2065 | case WIRELESS_MODE_B: | 2106 | case WIRELESS_MODE_B: |
2066 | ratr_index = RATR_INX_WIRELESS_B; | 2107 | ratr_index = RATR_INX_WIRELESS_B; |
@@ -2071,6 +2112,7 @@ void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level) | |||
2071 | break; | 2112 | break; |
2072 | case WIRELESS_MODE_G: | 2113 | case WIRELESS_MODE_G: |
2073 | ratr_index = RATR_INX_WIRELESS_GB; | 2114 | ratr_index = RATR_INX_WIRELESS_GB; |
2115 | |||
2074 | if (rssi_level == 1) | 2116 | if (rssi_level == 1) |
2075 | ratr_bitmap &= 0x00000f00; | 2117 | ratr_bitmap &= 0x00000f00; |
2076 | else if (rssi_level == 2) | 2118 | else if (rssi_level == 2) |
@@ -2085,7 +2127,8 @@ void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level) | |||
2085 | case WIRELESS_MODE_N_24G: | 2127 | case WIRELESS_MODE_N_24G: |
2086 | case WIRELESS_MODE_N_5G: | 2128 | case WIRELESS_MODE_N_5G: |
2087 | ratr_index = RATR_INX_WIRELESS_NGB; | 2129 | ratr_index = RATR_INX_WIRELESS_NGB; |
2088 | if (mimops == 0) { | 2130 | |
2131 | if (mimo_ps == IEEE80211_SMPS_STATIC) { | ||
2089 | if (rssi_level == 1) | 2132 | if (rssi_level == 1) |
2090 | ratr_bitmap &= 0x00070000; | 2133 | ratr_bitmap &= 0x00070000; |
2091 | else if (rssi_level == 2) | 2134 | else if (rssi_level == 2) |
@@ -2128,8 +2171,10 @@ void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level) | |||
2128 | } | 2171 | } |
2129 | } | 2172 | } |
2130 | } | 2173 | } |
2174 | |||
2131 | if ((curtxbw_40mhz && curshortgi_40mhz) || | 2175 | if ((curtxbw_40mhz && curshortgi_40mhz) || |
2132 | (!curtxbw_40mhz && curshortgi_20mhz)) { | 2176 | (!curtxbw_40mhz && curshortgi_20mhz)) { |
2177 | |||
2133 | if (macid == 0) | 2178 | if (macid == 0) |
2134 | shortgi = true; | 2179 | shortgi = true; |
2135 | else if (macid == 1) | 2180 | else if (macid == 1) |
@@ -2138,21 +2183,42 @@ void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level) | |||
2138 | break; | 2183 | break; |
2139 | default: | 2184 | default: |
2140 | ratr_index = RATR_INX_WIRELESS_NGB; | 2185 | ratr_index = RATR_INX_WIRELESS_NGB; |
2186 | |||
2141 | if (rtlphy->rf_type == RF_1T2R) | 2187 | if (rtlphy->rf_type == RF_1T2R) |
2142 | ratr_bitmap &= 0x000ff0ff; | 2188 | ratr_bitmap &= 0x000ff0ff; |
2143 | else | 2189 | else |
2144 | ratr_bitmap &= 0x0f0ff0ff; | 2190 | ratr_bitmap &= 0x0f0ff0ff; |
2145 | break; | 2191 | break; |
2146 | } | 2192 | } |
2147 | RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, "ratr_bitmap :%x\n", | 2193 | sta_entry->ratr_index = ratr_index; |
2148 | ratr_bitmap); | 2194 | |
2149 | *(u32 *)&rate_mask = ((ratr_bitmap & 0x0fffffff) | | 2195 | RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, |
2150 | ratr_index << 28); | 2196 | "ratr_bitmap :%x\n", ratr_bitmap); |
2197 | *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) | | ||
2198 | (ratr_index << 28); | ||
2151 | rate_mask[4] = macid | (shortgi ? 0x20 : 0x00) | 0x80; | 2199 | rate_mask[4] = macid | (shortgi ? 0x20 : 0x00) | 0x80; |
2152 | RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, | 2200 | RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, |
2153 | "Rate_index:%x, ratr_val:%x, %5phC\n", | 2201 | "Rate_index:%x, ratr_val:%x, %5phC\n", |
2154 | ratr_index, ratr_bitmap, rate_mask); | 2202 | ratr_index, ratr_bitmap, rate_mask); |
2155 | rtl92c_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask); | 2203 | memcpy(rtlpriv->rate_mask, rate_mask, 5); |
2204 | /* rtl92c_fill_h2c_cmd() does USB I/O and will result in a | ||
2205 | * "scheduled while atomic" if called directly */ | ||
2206 | schedule_work(&rtlpriv->works.fill_h2c_cmd); | ||
2207 | |||
2208 | if (macid != 0) | ||
2209 | sta_entry->ratr_index = ratr_index; | ||
2210 | } | ||
2211 | |||
2212 | void rtl92cu_update_hal_rate_tbl(struct ieee80211_hw *hw, | ||
2213 | struct ieee80211_sta *sta, | ||
2214 | u8 rssi_level) | ||
2215 | { | ||
2216 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
2217 | |||
2218 | if (rtlpriv->dm.useramask) | ||
2219 | rtl92cu_update_hal_rate_mask(hw, sta, rssi_level); | ||
2220 | else | ||
2221 | rtl92cu_update_hal_rate_table(hw, sta); | ||
2156 | } | 2222 | } |
2157 | 2223 | ||
2158 | void rtl92cu_update_channel_access_setting(struct ieee80211_hw *hw) | 2224 | void rtl92cu_update_channel_access_setting(struct ieee80211_hw *hw) |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h index f41a3aa4a26f..8e3ec1e25644 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h | |||
@@ -98,10 +98,6 @@ void rtl92cu_update_interrupt_mask(struct ieee80211_hw *hw, | |||
98 | u32 add_msr, u32 rm_msr); | 98 | u32 add_msr, u32 rm_msr); |
99 | void rtl92cu_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val); | 99 | void rtl92cu_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val); |
100 | void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val); | 100 | void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val); |
101 | void rtl92cu_update_hal_rate_table(struct ieee80211_hw *hw, | ||
102 | struct ieee80211_sta *sta, | ||
103 | u8 rssi_level); | ||
104 | void rtl92cu_update_hal_rate_mask(struct ieee80211_hw *hw, u8 rssi_level); | ||
105 | 101 | ||
106 | void rtl92cu_update_channel_access_setting(struct ieee80211_hw *hw); | 102 | void rtl92cu_update_channel_access_setting(struct ieee80211_hw *hw); |
107 | bool rtl92cu_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 * valid); | 103 | bool rtl92cu_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 * valid); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c index 85b6bdb163c0..da4f587199ee 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c | |||
@@ -289,14 +289,30 @@ void rtl92c_set_key(struct ieee80211_hw *hw, u32 key_index, | |||
289 | macaddr = cam_const_broad; | 289 | macaddr = cam_const_broad; |
290 | entry_id = key_index; | 290 | entry_id = key_index; |
291 | } else { | 291 | } else { |
292 | if (mac->opmode == NL80211_IFTYPE_AP || | ||
293 | mac->opmode == NL80211_IFTYPE_MESH_POINT) { | ||
294 | entry_id = rtl_cam_get_free_entry(hw, | ||
295 | p_macaddr); | ||
296 | if (entry_id >= TOTAL_CAM_ENTRY) { | ||
297 | RT_TRACE(rtlpriv, COMP_SEC, | ||
298 | DBG_EMERG, | ||
299 | "Can not find free hw security cam entry\n"); | ||
300 | return; | ||
301 | } | ||
302 | } else { | ||
303 | entry_id = CAM_PAIRWISE_KEY_POSITION; | ||
304 | } | ||
305 | |||
292 | key_index = PAIRWISE_KEYIDX; | 306 | key_index = PAIRWISE_KEYIDX; |
293 | entry_id = CAM_PAIRWISE_KEY_POSITION; | ||
294 | is_pairwise = true; | 307 | is_pairwise = true; |
295 | } | 308 | } |
296 | } | 309 | } |
297 | if (rtlpriv->sec.key_len[key_index] == 0) { | 310 | if (rtlpriv->sec.key_len[key_index] == 0) { |
298 | RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, | 311 | RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, |
299 | "delete one entry\n"); | 312 | "delete one entry\n"); |
313 | if (mac->opmode == NL80211_IFTYPE_AP || | ||
314 | mac->opmode == NL80211_IFTYPE_MESH_POINT) | ||
315 | rtl_cam_del_entry(hw, p_macaddr); | ||
300 | rtl_cam_delete_one_entry(hw, p_macaddr, entry_id); | 316 | rtl_cam_delete_one_entry(hw, p_macaddr, entry_id); |
301 | } else { | 317 | } else { |
302 | RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, | 318 | RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c index 938b1e670b93..826f085c29dd 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | |||
@@ -106,8 +106,7 @@ static struct rtl_hal_ops rtl8192cu_hal_ops = { | |||
106 | .update_interrupt_mask = rtl92cu_update_interrupt_mask, | 106 | .update_interrupt_mask = rtl92cu_update_interrupt_mask, |
107 | .get_hw_reg = rtl92cu_get_hw_reg, | 107 | .get_hw_reg = rtl92cu_get_hw_reg, |
108 | .set_hw_reg = rtl92cu_set_hw_reg, | 108 | .set_hw_reg = rtl92cu_set_hw_reg, |
109 | .update_rate_tbl = rtl92cu_update_hal_rate_table, | 109 | .update_rate_tbl = rtl92cu_update_hal_rate_tbl, |
110 | .update_rate_mask = rtl92cu_update_hal_rate_mask, | ||
111 | .fill_tx_desc = rtl92cu_tx_fill_desc, | 110 | .fill_tx_desc = rtl92cu_tx_fill_desc, |
112 | .fill_fake_txdesc = rtl92cu_fill_fake_txdesc, | 111 | .fill_fake_txdesc = rtl92cu_fill_fake_txdesc, |
113 | .fill_tx_cmddesc = rtl92cu_tx_fill_cmddesc, | 112 | .fill_tx_cmddesc = rtl92cu_tx_fill_cmddesc, |
@@ -137,6 +136,7 @@ static struct rtl_hal_ops rtl8192cu_hal_ops = { | |||
137 | .phy_lc_calibrate = _rtl92cu_phy_lc_calibrate, | 136 | .phy_lc_calibrate = _rtl92cu_phy_lc_calibrate, |
138 | .phy_set_bw_mode_callback = rtl92cu_phy_set_bw_mode_callback, | 137 | .phy_set_bw_mode_callback = rtl92cu_phy_set_bw_mode_callback, |
139 | .dm_dynamic_txpower = rtl92cu_dm_dynamic_txpower, | 138 | .dm_dynamic_txpower = rtl92cu_dm_dynamic_txpower, |
139 | .fill_h2c_cmd = rtl92c_fill_h2c_cmd, | ||
140 | }; | 140 | }; |
141 | 141 | ||
142 | static struct rtl_mod_params rtl92cu_mod_params = { | 142 | static struct rtl_mod_params rtl92cu_mod_params = { |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.h b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.h index a1310abd0d54..262e1e4c6e5b 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.h +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.h | |||
@@ -49,5 +49,8 @@ bool rtl92cu_phy_set_rf_power_state(struct ieee80211_hw *hw, | |||
49 | u32 rtl92cu_phy_query_rf_reg(struct ieee80211_hw *hw, | 49 | u32 rtl92cu_phy_query_rf_reg(struct ieee80211_hw *hw, |
50 | enum radio_path rfpath, u32 regaddr, u32 bitmask); | 50 | enum radio_path rfpath, u32 regaddr, u32 bitmask); |
51 | void rtl92cu_phy_set_bw_mode_callback(struct ieee80211_hw *hw); | 51 | void rtl92cu_phy_set_bw_mode_callback(struct ieee80211_hw *hw); |
52 | void rtl92cu_update_hal_rate_tbl(struct ieee80211_hw *hw, | ||
53 | struct ieee80211_sta *sta, | ||
54 | u8 rssi_level); | ||
52 | 55 | ||
53 | #endif | 56 | #endif |
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index 76732b0cd221..a3532e077871 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c | |||
@@ -824,6 +824,7 @@ static void rtl_usb_stop(struct ieee80211_hw *hw) | |||
824 | 824 | ||
825 | /* should after adapter start and interrupt enable. */ | 825 | /* should after adapter start and interrupt enable. */ |
826 | set_hal_stop(rtlhal); | 826 | set_hal_stop(rtlhal); |
827 | cancel_work_sync(&rtlpriv->works.fill_h2c_cmd); | ||
827 | /* Enable software */ | 828 | /* Enable software */ |
828 | SET_USB_STOP(rtlusb); | 829 | SET_USB_STOP(rtlusb); |
829 | rtl_usb_deinit(hw); | 830 | rtl_usb_deinit(hw); |
@@ -1026,6 +1027,16 @@ static bool rtl_usb_tx_chk_waitq_insert(struct ieee80211_hw *hw, | |||
1026 | return false; | 1027 | return false; |
1027 | } | 1028 | } |
1028 | 1029 | ||
1030 | static void rtl_fill_h2c_cmd_work_callback(struct work_struct *work) | ||
1031 | { | ||
1032 | struct rtl_works *rtlworks = | ||
1033 | container_of(work, struct rtl_works, fill_h2c_cmd); | ||
1034 | struct ieee80211_hw *hw = rtlworks->hw; | ||
1035 | struct rtl_priv *rtlpriv = rtl_priv(hw); | ||
1036 | |||
1037 | rtlpriv->cfg->ops->fill_h2c_cmd(hw, H2C_RA_MASK, 5, rtlpriv->rate_mask); | ||
1038 | } | ||
1039 | |||
1029 | static struct rtl_intf_ops rtl_usb_ops = { | 1040 | static struct rtl_intf_ops rtl_usb_ops = { |
1030 | .adapter_start = rtl_usb_start, | 1041 | .adapter_start = rtl_usb_start, |
1031 | .adapter_stop = rtl_usb_stop, | 1042 | .adapter_stop = rtl_usb_stop, |
@@ -1057,6 +1068,8 @@ int rtl_usb_probe(struct usb_interface *intf, | |||
1057 | 1068 | ||
1058 | /* this spin lock must be initialized early */ | 1069 | /* this spin lock must be initialized early */ |
1059 | spin_lock_init(&rtlpriv->locks.usb_lock); | 1070 | spin_lock_init(&rtlpriv->locks.usb_lock); |
1071 | INIT_WORK(&rtlpriv->works.fill_h2c_cmd, | ||
1072 | rtl_fill_h2c_cmd_work_callback); | ||
1060 | 1073 | ||
1061 | rtlpriv->usb_data_index = 0; | 1074 | rtlpriv->usb_data_index = 0; |
1062 | init_completion(&rtlpriv->firmware_loading_complete); | 1075 | init_completion(&rtlpriv->firmware_loading_complete); |
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h index 44328baa6389..cc03e7c87cbe 100644 --- a/drivers/net/wireless/rtlwifi/wifi.h +++ b/drivers/net/wireless/rtlwifi/wifi.h | |||
@@ -1736,6 +1736,8 @@ struct rtl_hal_ops { | |||
1736 | void (*bt_wifi_media_status_notify) (struct ieee80211_hw *hw, | 1736 | void (*bt_wifi_media_status_notify) (struct ieee80211_hw *hw, |
1737 | bool mstate); | 1737 | bool mstate); |
1738 | void (*bt_coex_off_before_lps) (struct ieee80211_hw *hw); | 1738 | void (*bt_coex_off_before_lps) (struct ieee80211_hw *hw); |
1739 | void (*fill_h2c_cmd) (struct ieee80211_hw *hw, u8 element_id, | ||
1740 | u32 cmd_len, u8 *p_cmdbuffer); | ||
1739 | }; | 1741 | }; |
1740 | 1742 | ||
1741 | struct rtl_intf_ops { | 1743 | struct rtl_intf_ops { |
@@ -1869,6 +1871,7 @@ struct rtl_works { | |||
1869 | struct delayed_work fwevt_wq; | 1871 | struct delayed_work fwevt_wq; |
1870 | 1872 | ||
1871 | struct work_struct lps_change_work; | 1873 | struct work_struct lps_change_work; |
1874 | struct work_struct fill_h2c_cmd; | ||
1872 | }; | 1875 | }; |
1873 | 1876 | ||
1874 | struct rtl_debug { | 1877 | struct rtl_debug { |
@@ -2048,6 +2051,7 @@ struct rtl_priv { | |||
2048 | }; | 2051 | }; |
2049 | }; | 2052 | }; |
2050 | bool enter_ps; /* true when entering PS */ | 2053 | bool enter_ps; /* true when entering PS */ |
2054 | u8 rate_mask[5]; | ||
2051 | 2055 | ||
2052 | /*This must be the last item so | 2056 | /*This must be the last item so |
2053 | that it points to the data allocated | 2057 | that it points to the data allocated |
diff --git a/drivers/net/wireless/ti/wl12xx/scan.c b/drivers/net/wireless/ti/wl12xx/scan.c index affdb3ec6225..4a0bbb13806b 100644 --- a/drivers/net/wireless/ti/wl12xx/scan.c +++ b/drivers/net/wireless/ti/wl12xx/scan.c | |||
@@ -310,7 +310,7 @@ static void wl12xx_adjust_channels(struct wl1271_cmd_sched_scan_config *cmd, | |||
310 | memcpy(cmd->channels_2, cmd_channels->channels_2, | 310 | memcpy(cmd->channels_2, cmd_channels->channels_2, |
311 | sizeof(cmd->channels_2)); | 311 | sizeof(cmd->channels_2)); |
312 | memcpy(cmd->channels_5, cmd_channels->channels_5, | 312 | memcpy(cmd->channels_5, cmd_channels->channels_5, |
313 | sizeof(cmd->channels_2)); | 313 | sizeof(cmd->channels_5)); |
314 | /* channels_4 are not supported, so no need to copy them */ | 314 | /* channels_4 are not supported, so no need to copy them */ |
315 | } | 315 | } |
316 | 316 | ||
diff --git a/drivers/net/wireless/ti/wl12xx/wl12xx.h b/drivers/net/wireless/ti/wl12xx/wl12xx.h index 222d03540200..9e5484a73667 100644 --- a/drivers/net/wireless/ti/wl12xx/wl12xx.h +++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h | |||
@@ -36,12 +36,12 @@ | |||
36 | #define WL127X_IFTYPE_SR_VER 3 | 36 | #define WL127X_IFTYPE_SR_VER 3 |
37 | #define WL127X_MAJOR_SR_VER 10 | 37 | #define WL127X_MAJOR_SR_VER 10 |
38 | #define WL127X_SUBTYPE_SR_VER WLCORE_FW_VER_IGNORE | 38 | #define WL127X_SUBTYPE_SR_VER WLCORE_FW_VER_IGNORE |
39 | #define WL127X_MINOR_SR_VER 115 | 39 | #define WL127X_MINOR_SR_VER 133 |
40 | /* minimum multi-role FW version for wl127x */ | 40 | /* minimum multi-role FW version for wl127x */ |
41 | #define WL127X_IFTYPE_MR_VER 5 | 41 | #define WL127X_IFTYPE_MR_VER 5 |
42 | #define WL127X_MAJOR_MR_VER 7 | 42 | #define WL127X_MAJOR_MR_VER 7 |
43 | #define WL127X_SUBTYPE_MR_VER WLCORE_FW_VER_IGNORE | 43 | #define WL127X_SUBTYPE_MR_VER WLCORE_FW_VER_IGNORE |
44 | #define WL127X_MINOR_MR_VER 115 | 44 | #define WL127X_MINOR_MR_VER 42 |
45 | 45 | ||
46 | /* FW chip version for wl128x */ | 46 | /* FW chip version for wl128x */ |
47 | #define WL128X_CHIP_VER 7 | 47 | #define WL128X_CHIP_VER 7 |
@@ -49,7 +49,7 @@ | |||
49 | #define WL128X_IFTYPE_SR_VER 3 | 49 | #define WL128X_IFTYPE_SR_VER 3 |
50 | #define WL128X_MAJOR_SR_VER 10 | 50 | #define WL128X_MAJOR_SR_VER 10 |
51 | #define WL128X_SUBTYPE_SR_VER WLCORE_FW_VER_IGNORE | 51 | #define WL128X_SUBTYPE_SR_VER WLCORE_FW_VER_IGNORE |
52 | #define WL128X_MINOR_SR_VER 115 | 52 | #define WL128X_MINOR_SR_VER 133 |
53 | /* minimum multi-role FW version for wl128x */ | 53 | /* minimum multi-role FW version for wl128x */ |
54 | #define WL128X_IFTYPE_MR_VER 5 | 54 | #define WL128X_IFTYPE_MR_VER 5 |
55 | #define WL128X_MAJOR_MR_VER 7 | 55 | #define WL128X_MAJOR_MR_VER 7 |
diff --git a/drivers/net/wireless/ti/wl18xx/scan.c b/drivers/net/wireless/ti/wl18xx/scan.c index 09d944505ac0..2b642f8c9266 100644 --- a/drivers/net/wireless/ti/wl18xx/scan.c +++ b/drivers/net/wireless/ti/wl18xx/scan.c | |||
@@ -34,7 +34,7 @@ static void wl18xx_adjust_channels(struct wl18xx_cmd_scan_params *cmd, | |||
34 | memcpy(cmd->channels_2, cmd_channels->channels_2, | 34 | memcpy(cmd->channels_2, cmd_channels->channels_2, |
35 | sizeof(cmd->channels_2)); | 35 | sizeof(cmd->channels_2)); |
36 | memcpy(cmd->channels_5, cmd_channels->channels_5, | 36 | memcpy(cmd->channels_5, cmd_channels->channels_5, |
37 | sizeof(cmd->channels_2)); | 37 | sizeof(cmd->channels_5)); |
38 | /* channels_4 are not supported, so no need to copy them */ | 38 | /* channels_4 are not supported, so no need to copy them */ |
39 | } | 39 | } |
40 | 40 | ||
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 82576fffb452..a0b50ad2ef31 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
@@ -778,12 +778,13 @@ static void xen_netbk_rx_action(struct xen_netbk *netbk) | |||
778 | sco->meta_slots_used); | 778 | sco->meta_slots_used); |
779 | 779 | ||
780 | RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&vif->rx, ret); | 780 | RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&vif->rx, ret); |
781 | if (ret && list_empty(&vif->notify_list)) | ||
782 | list_add_tail(&vif->notify_list, ¬ify); | ||
783 | 781 | ||
784 | xenvif_notify_tx_completion(vif); | 782 | xenvif_notify_tx_completion(vif); |
785 | 783 | ||
786 | xenvif_put(vif); | 784 | if (ret && list_empty(&vif->notify_list)) |
785 | list_add_tail(&vif->notify_list, ¬ify); | ||
786 | else | ||
787 | xenvif_put(vif); | ||
787 | npo.meta_cons += sco->meta_slots_used; | 788 | npo.meta_cons += sco->meta_slots_used; |
788 | dev_kfree_skb(skb); | 789 | dev_kfree_skb(skb); |
789 | } | 790 | } |
@@ -791,6 +792,7 @@ static void xen_netbk_rx_action(struct xen_netbk *netbk) | |||
791 | list_for_each_entry_safe(vif, tmp, ¬ify, notify_list) { | 792 | list_for_each_entry_safe(vif, tmp, ¬ify, notify_list) { |
792 | notify_remote_via_irq(vif->rx_irq); | 793 | notify_remote_via_irq(vif->rx_irq); |
793 | list_del_init(&vif->notify_list); | 794 | list_del_init(&vif->notify_list); |
795 | xenvif_put(vif); | ||
794 | } | 796 | } |
795 | 797 | ||
796 | /* More work to do? */ | 798 | /* More work to do? */ |
diff --git a/drivers/of/base.c b/drivers/of/base.c index f53b992f060a..a6f584a7f4a1 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c | |||
@@ -192,14 +192,15 @@ EXPORT_SYMBOL(of_find_property); | |||
192 | struct device_node *of_find_all_nodes(struct device_node *prev) | 192 | struct device_node *of_find_all_nodes(struct device_node *prev) |
193 | { | 193 | { |
194 | struct device_node *np; | 194 | struct device_node *np; |
195 | unsigned long flags; | ||
195 | 196 | ||
196 | raw_spin_lock(&devtree_lock); | 197 | raw_spin_lock_irqsave(&devtree_lock, flags); |
197 | np = prev ? prev->allnext : of_allnodes; | 198 | np = prev ? prev->allnext : of_allnodes; |
198 | for (; np != NULL; np = np->allnext) | 199 | for (; np != NULL; np = np->allnext) |
199 | if (of_node_get(np)) | 200 | if (of_node_get(np)) |
200 | break; | 201 | break; |
201 | of_node_put(prev); | 202 | of_node_put(prev); |
202 | raw_spin_unlock(&devtree_lock); | 203 | raw_spin_unlock_irqrestore(&devtree_lock, flags); |
203 | return np; | 204 | return np; |
204 | } | 205 | } |
205 | EXPORT_SYMBOL(of_find_all_nodes); | 206 | EXPORT_SYMBOL(of_find_all_nodes); |
@@ -421,8 +422,9 @@ struct device_node *of_get_next_available_child(const struct device_node *node, | |||
421 | struct device_node *prev) | 422 | struct device_node *prev) |
422 | { | 423 | { |
423 | struct device_node *next; | 424 | struct device_node *next; |
425 | unsigned long flags; | ||
424 | 426 | ||
425 | raw_spin_lock(&devtree_lock); | 427 | raw_spin_lock_irqsave(&devtree_lock, flags); |
426 | next = prev ? prev->sibling : node->child; | 428 | next = prev ? prev->sibling : node->child; |
427 | for (; next; next = next->sibling) { | 429 | for (; next; next = next->sibling) { |
428 | if (!__of_device_is_available(next)) | 430 | if (!__of_device_is_available(next)) |
@@ -431,7 +433,7 @@ struct device_node *of_get_next_available_child(const struct device_node *node, | |||
431 | break; | 433 | break; |
432 | } | 434 | } |
433 | of_node_put(prev); | 435 | of_node_put(prev); |
434 | raw_spin_unlock(&devtree_lock); | 436 | raw_spin_unlock_irqrestore(&devtree_lock, flags); |
435 | return next; | 437 | return next; |
436 | } | 438 | } |
437 | EXPORT_SYMBOL(of_get_next_available_child); | 439 | EXPORT_SYMBOL(of_get_next_available_child); |
@@ -735,13 +737,14 @@ EXPORT_SYMBOL_GPL(of_modalias_node); | |||
735 | struct device_node *of_find_node_by_phandle(phandle handle) | 737 | struct device_node *of_find_node_by_phandle(phandle handle) |
736 | { | 738 | { |
737 | struct device_node *np; | 739 | struct device_node *np; |
740 | unsigned long flags; | ||
738 | 741 | ||
739 | raw_spin_lock(&devtree_lock); | 742 | raw_spin_lock_irqsave(&devtree_lock, flags); |
740 | for (np = of_allnodes; np; np = np->allnext) | 743 | for (np = of_allnodes; np; np = np->allnext) |
741 | if (np->phandle == handle) | 744 | if (np->phandle == handle) |
742 | break; | 745 | break; |
743 | of_node_get(np); | 746 | of_node_get(np); |
744 | raw_spin_unlock(&devtree_lock); | 747 | raw_spin_unlock_irqrestore(&devtree_lock, flags); |
745 | return np; | 748 | return np; |
746 | } | 749 | } |
747 | EXPORT_SYMBOL(of_find_node_by_phandle); | 750 | EXPORT_SYMBOL(of_find_node_by_phandle); |
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7779.c b/drivers/pinctrl/sh-pfc/pfc-r8a7779.c index 791a6719d8a9..8cd90e7e945a 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7779.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7779.c | |||
@@ -2357,27 +2357,48 @@ static const unsigned int sdhi3_wp_mux[] = { | |||
2357 | }; | 2357 | }; |
2358 | /* - USB0 ------------------------------------------------------------------- */ | 2358 | /* - USB0 ------------------------------------------------------------------- */ |
2359 | static const unsigned int usb0_pins[] = { | 2359 | static const unsigned int usb0_pins[] = { |
2360 | /* OVC */ | 2360 | /* PENC */ |
2361 | 150, 154, | 2361 | 154, |
2362 | }; | 2362 | }; |
2363 | static const unsigned int usb0_mux[] = { | 2363 | static const unsigned int usb0_mux[] = { |
2364 | USB_OVC0_MARK, USB_PENC0_MARK, | 2364 | USB_PENC0_MARK, |
2365 | }; | ||
2366 | static const unsigned int usb0_ovc_pins[] = { | ||
2367 | /* USB_OVC */ | ||
2368 | 150 | ||
2369 | }; | ||
2370 | static const unsigned int usb0_ovc_mux[] = { | ||
2371 | USB_OVC0_MARK, | ||
2365 | }; | 2372 | }; |
2366 | /* - USB1 ------------------------------------------------------------------- */ | 2373 | /* - USB1 ------------------------------------------------------------------- */ |
2367 | static const unsigned int usb1_pins[] = { | 2374 | static const unsigned int usb1_pins[] = { |
2368 | /* OVC */ | 2375 | /* PENC */ |
2369 | 152, 155, | 2376 | 155, |
2370 | }; | 2377 | }; |
2371 | static const unsigned int usb1_mux[] = { | 2378 | static const unsigned int usb1_mux[] = { |
2372 | USB_OVC1_MARK, USB_PENC1_MARK, | 2379 | USB_PENC1_MARK, |
2380 | }; | ||
2381 | static const unsigned int usb1_ovc_pins[] = { | ||
2382 | /* USB_OVC */ | ||
2383 | 152, | ||
2384 | }; | ||
2385 | static const unsigned int usb1_ovc_mux[] = { | ||
2386 | USB_OVC1_MARK, | ||
2373 | }; | 2387 | }; |
2374 | /* - USB2 ------------------------------------------------------------------- */ | 2388 | /* - USB2 ------------------------------------------------------------------- */ |
2375 | static const unsigned int usb2_pins[] = { | 2389 | static const unsigned int usb2_pins[] = { |
2376 | /* OVC, PENC */ | 2390 | /* PENC */ |
2377 | 125, 156, | 2391 | 156, |
2378 | }; | 2392 | }; |
2379 | static const unsigned int usb2_mux[] = { | 2393 | static const unsigned int usb2_mux[] = { |
2380 | USB_OVC2_MARK, USB_PENC2_MARK, | 2394 | USB_PENC2_MARK, |
2395 | }; | ||
2396 | static const unsigned int usb2_ovc_pins[] = { | ||
2397 | /* USB_OVC */ | ||
2398 | 125, | ||
2399 | }; | ||
2400 | static const unsigned int usb2_ovc_mux[] = { | ||
2401 | USB_OVC2_MARK, | ||
2381 | }; | 2402 | }; |
2382 | 2403 | ||
2383 | static const struct sh_pfc_pin_group pinmux_groups[] = { | 2404 | static const struct sh_pfc_pin_group pinmux_groups[] = { |
@@ -2501,8 +2522,11 @@ static const struct sh_pfc_pin_group pinmux_groups[] = { | |||
2501 | SH_PFC_PIN_GROUP(sdhi3_cd), | 2522 | SH_PFC_PIN_GROUP(sdhi3_cd), |
2502 | SH_PFC_PIN_GROUP(sdhi3_wp), | 2523 | SH_PFC_PIN_GROUP(sdhi3_wp), |
2503 | SH_PFC_PIN_GROUP(usb0), | 2524 | SH_PFC_PIN_GROUP(usb0), |
2525 | SH_PFC_PIN_GROUP(usb0_ovc), | ||
2504 | SH_PFC_PIN_GROUP(usb1), | 2526 | SH_PFC_PIN_GROUP(usb1), |
2527 | SH_PFC_PIN_GROUP(usb1_ovc), | ||
2505 | SH_PFC_PIN_GROUP(usb2), | 2528 | SH_PFC_PIN_GROUP(usb2), |
2529 | SH_PFC_PIN_GROUP(usb2_ovc), | ||
2506 | }; | 2530 | }; |
2507 | 2531 | ||
2508 | static const char * const du0_groups[] = { | 2532 | static const char * const du0_groups[] = { |
@@ -2683,14 +2707,17 @@ static const char * const sdhi3_groups[] = { | |||
2683 | 2707 | ||
2684 | static const char * const usb0_groups[] = { | 2708 | static const char * const usb0_groups[] = { |
2685 | "usb0", | 2709 | "usb0", |
2710 | "usb0_ovc", | ||
2686 | }; | 2711 | }; |
2687 | 2712 | ||
2688 | static const char * const usb1_groups[] = { | 2713 | static const char * const usb1_groups[] = { |
2689 | "usb1", | 2714 | "usb1", |
2715 | "usb1_ovc", | ||
2690 | }; | 2716 | }; |
2691 | 2717 | ||
2692 | static const char * const usb2_groups[] = { | 2718 | static const char * const usb2_groups[] = { |
2693 | "usb2", | 2719 | "usb2", |
2720 | "usb2_ovc", | ||
2694 | }; | 2721 | }; |
2695 | 2722 | ||
2696 | static const struct sh_pfc_function pinmux_functions[] = { | 2723 | static const struct sh_pfc_function pinmux_functions[] = { |
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 8df0c5a21be2..d111c8687f9b 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c | |||
@@ -703,7 +703,7 @@ static int hp_wmi_rfkill_setup(struct platform_device *device) | |||
703 | } | 703 | } |
704 | rfkill_init_sw_state(gps_rfkill, | 704 | rfkill_init_sw_state(gps_rfkill, |
705 | hp_wmi_get_sw_state(HPWMI_GPS)); | 705 | hp_wmi_get_sw_state(HPWMI_GPS)); |
706 | rfkill_set_hw_state(bluetooth_rfkill, | 706 | rfkill_set_hw_state(gps_rfkill, |
707 | hp_wmi_get_hw_state(HPWMI_GPS)); | 707 | hp_wmi_get_hw_state(HPWMI_GPS)); |
708 | err = rfkill_register(gps_rfkill); | 708 | err = rfkill_register(gps_rfkill); |
709 | if (err) | 709 | if (err) |
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c index 0eab77b22340..f296f3f7db9b 100644 --- a/drivers/rtc/rtc-at91rm9200.c +++ b/drivers/rtc/rtc-at91rm9200.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/rtc.h> | 25 | #include <linux/rtc.h> |
26 | #include <linux/bcd.h> | 26 | #include <linux/bcd.h> |
27 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
28 | #include <linux/spinlock.h> | ||
28 | #include <linux/ioctl.h> | 29 | #include <linux/ioctl.h> |
29 | #include <linux/completion.h> | 30 | #include <linux/completion.h> |
30 | #include <linux/io.h> | 31 | #include <linux/io.h> |
@@ -42,10 +43,65 @@ | |||
42 | 43 | ||
43 | #define AT91_RTC_EPOCH 1900UL /* just like arch/arm/common/rtctime.c */ | 44 | #define AT91_RTC_EPOCH 1900UL /* just like arch/arm/common/rtctime.c */ |
44 | 45 | ||
46 | struct at91_rtc_config { | ||
47 | bool use_shadow_imr; | ||
48 | }; | ||
49 | |||
50 | static const struct at91_rtc_config *at91_rtc_config; | ||
45 | static DECLARE_COMPLETION(at91_rtc_updated); | 51 | static DECLARE_COMPLETION(at91_rtc_updated); |
46 | static unsigned int at91_alarm_year = AT91_RTC_EPOCH; | 52 | static unsigned int at91_alarm_year = AT91_RTC_EPOCH; |
47 | static void __iomem *at91_rtc_regs; | 53 | static void __iomem *at91_rtc_regs; |
48 | static int irq; | 54 | static int irq; |
55 | static DEFINE_SPINLOCK(at91_rtc_lock); | ||
56 | static u32 at91_rtc_shadow_imr; | ||
57 | |||
58 | static void at91_rtc_write_ier(u32 mask) | ||
59 | { | ||
60 | unsigned long flags; | ||
61 | |||
62 | spin_lock_irqsave(&at91_rtc_lock, flags); | ||
63 | at91_rtc_shadow_imr |= mask; | ||
64 | at91_rtc_write(AT91_RTC_IER, mask); | ||
65 | spin_unlock_irqrestore(&at91_rtc_lock, flags); | ||
66 | } | ||
67 | |||
68 | static void at91_rtc_write_idr(u32 mask) | ||
69 | { | ||
70 | unsigned long flags; | ||
71 | |||
72 | spin_lock_irqsave(&at91_rtc_lock, flags); | ||
73 | at91_rtc_write(AT91_RTC_IDR, mask); | ||
74 | /* | ||
75 | * Register read back (of any RTC-register) needed to make sure | ||
76 | * IDR-register write has reached the peripheral before updating | ||
77 | * shadow mask. | ||
78 | * | ||
79 | * Note that there is still a possibility that the mask is updated | ||
80 | * before interrupts have actually been disabled in hardware. The only | ||
81 | * way to be certain would be to poll the IMR-register, which is is | ||
82 | * the very register we are trying to emulate. The register read back | ||
83 | * is a reasonable heuristic. | ||
84 | */ | ||
85 | at91_rtc_read(AT91_RTC_SR); | ||
86 | at91_rtc_shadow_imr &= ~mask; | ||
87 | spin_unlock_irqrestore(&at91_rtc_lock, flags); | ||
88 | } | ||
89 | |||
90 | static u32 at91_rtc_read_imr(void) | ||
91 | { | ||
92 | unsigned long flags; | ||
93 | u32 mask; | ||
94 | |||
95 | if (at91_rtc_config->use_shadow_imr) { | ||
96 | spin_lock_irqsave(&at91_rtc_lock, flags); | ||
97 | mask = at91_rtc_shadow_imr; | ||
98 | spin_unlock_irqrestore(&at91_rtc_lock, flags); | ||
99 | } else { | ||
100 | mask = at91_rtc_read(AT91_RTC_IMR); | ||
101 | } | ||
102 | |||
103 | return mask; | ||
104 | } | ||
49 | 105 | ||
50 | /* | 106 | /* |
51 | * Decode time/date into rtc_time structure | 107 | * Decode time/date into rtc_time structure |
@@ -110,9 +166,9 @@ static int at91_rtc_settime(struct device *dev, struct rtc_time *tm) | |||
110 | cr = at91_rtc_read(AT91_RTC_CR); | 166 | cr = at91_rtc_read(AT91_RTC_CR); |
111 | at91_rtc_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL | AT91_RTC_UPDTIM); | 167 | at91_rtc_write(AT91_RTC_CR, cr | AT91_RTC_UPDCAL | AT91_RTC_UPDTIM); |
112 | 168 | ||
113 | at91_rtc_write(AT91_RTC_IER, AT91_RTC_ACKUPD); | 169 | at91_rtc_write_ier(AT91_RTC_ACKUPD); |
114 | wait_for_completion(&at91_rtc_updated); /* wait for ACKUPD interrupt */ | 170 | wait_for_completion(&at91_rtc_updated); /* wait for ACKUPD interrupt */ |
115 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD); | 171 | at91_rtc_write_idr(AT91_RTC_ACKUPD); |
116 | 172 | ||
117 | at91_rtc_write(AT91_RTC_TIMR, | 173 | at91_rtc_write(AT91_RTC_TIMR, |
118 | bin2bcd(tm->tm_sec) << 0 | 174 | bin2bcd(tm->tm_sec) << 0 |
@@ -144,7 +200,7 @@ static int at91_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
144 | tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); | 200 | tm->tm_yday = rtc_year_days(tm->tm_mday, tm->tm_mon, tm->tm_year); |
145 | tm->tm_year = at91_alarm_year - 1900; | 201 | tm->tm_year = at91_alarm_year - 1900; |
146 | 202 | ||
147 | alrm->enabled = (at91_rtc_read(AT91_RTC_IMR) & AT91_RTC_ALARM) | 203 | alrm->enabled = (at91_rtc_read_imr() & AT91_RTC_ALARM) |
148 | ? 1 : 0; | 204 | ? 1 : 0; |
149 | 205 | ||
150 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, | 206 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, |
@@ -169,7 +225,7 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
169 | tm.tm_min = alrm->time.tm_min; | 225 | tm.tm_min = alrm->time.tm_min; |
170 | tm.tm_sec = alrm->time.tm_sec; | 226 | tm.tm_sec = alrm->time.tm_sec; |
171 | 227 | ||
172 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM); | 228 | at91_rtc_write_idr(AT91_RTC_ALARM); |
173 | at91_rtc_write(AT91_RTC_TIMALR, | 229 | at91_rtc_write(AT91_RTC_TIMALR, |
174 | bin2bcd(tm.tm_sec) << 0 | 230 | bin2bcd(tm.tm_sec) << 0 |
175 | | bin2bcd(tm.tm_min) << 8 | 231 | | bin2bcd(tm.tm_min) << 8 |
@@ -182,7 +238,7 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
182 | 238 | ||
183 | if (alrm->enabled) { | 239 | if (alrm->enabled) { |
184 | at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); | 240 | at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); |
185 | at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM); | 241 | at91_rtc_write_ier(AT91_RTC_ALARM); |
186 | } | 242 | } |
187 | 243 | ||
188 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, | 244 | dev_dbg(dev, "%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__, |
@@ -198,9 +254,9 @@ static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
198 | 254 | ||
199 | if (enabled) { | 255 | if (enabled) { |
200 | at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); | 256 | at91_rtc_write(AT91_RTC_SCCR, AT91_RTC_ALARM); |
201 | at91_rtc_write(AT91_RTC_IER, AT91_RTC_ALARM); | 257 | at91_rtc_write_ier(AT91_RTC_ALARM); |
202 | } else | 258 | } else |
203 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ALARM); | 259 | at91_rtc_write_idr(AT91_RTC_ALARM); |
204 | 260 | ||
205 | return 0; | 261 | return 0; |
206 | } | 262 | } |
@@ -209,7 +265,7 @@ static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) | |||
209 | */ | 265 | */ |
210 | static int at91_rtc_proc(struct device *dev, struct seq_file *seq) | 266 | static int at91_rtc_proc(struct device *dev, struct seq_file *seq) |
211 | { | 267 | { |
212 | unsigned long imr = at91_rtc_read(AT91_RTC_IMR); | 268 | unsigned long imr = at91_rtc_read_imr(); |
213 | 269 | ||
214 | seq_printf(seq, "update_IRQ\t: %s\n", | 270 | seq_printf(seq, "update_IRQ\t: %s\n", |
215 | (imr & AT91_RTC_ACKUPD) ? "yes" : "no"); | 271 | (imr & AT91_RTC_ACKUPD) ? "yes" : "no"); |
@@ -229,7 +285,7 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id) | |||
229 | unsigned int rtsr; | 285 | unsigned int rtsr; |
230 | unsigned long events = 0; | 286 | unsigned long events = 0; |
231 | 287 | ||
232 | rtsr = at91_rtc_read(AT91_RTC_SR) & at91_rtc_read(AT91_RTC_IMR); | 288 | rtsr = at91_rtc_read(AT91_RTC_SR) & at91_rtc_read_imr(); |
233 | if (rtsr) { /* this interrupt is shared! Is it ours? */ | 289 | if (rtsr) { /* this interrupt is shared! Is it ours? */ |
234 | if (rtsr & AT91_RTC_ALARM) | 290 | if (rtsr & AT91_RTC_ALARM) |
235 | events |= (RTC_AF | RTC_IRQF); | 291 | events |= (RTC_AF | RTC_IRQF); |
@@ -250,6 +306,43 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id) | |||
250 | return IRQ_NONE; /* not handled */ | 306 | return IRQ_NONE; /* not handled */ |
251 | } | 307 | } |
252 | 308 | ||
309 | static const struct at91_rtc_config at91rm9200_config = { | ||
310 | }; | ||
311 | |||
312 | static const struct at91_rtc_config at91sam9x5_config = { | ||
313 | .use_shadow_imr = true, | ||
314 | }; | ||
315 | |||
316 | #ifdef CONFIG_OF | ||
317 | static const struct of_device_id at91_rtc_dt_ids[] = { | ||
318 | { | ||
319 | .compatible = "atmel,at91rm9200-rtc", | ||
320 | .data = &at91rm9200_config, | ||
321 | }, { | ||
322 | .compatible = "atmel,at91sam9x5-rtc", | ||
323 | .data = &at91sam9x5_config, | ||
324 | }, { | ||
325 | /* sentinel */ | ||
326 | } | ||
327 | }; | ||
328 | MODULE_DEVICE_TABLE(of, at91_rtc_dt_ids); | ||
329 | #endif | ||
330 | |||
331 | static const struct at91_rtc_config * | ||
332 | at91_rtc_get_config(struct platform_device *pdev) | ||
333 | { | ||
334 | const struct of_device_id *match; | ||
335 | |||
336 | if (pdev->dev.of_node) { | ||
337 | match = of_match_node(at91_rtc_dt_ids, pdev->dev.of_node); | ||
338 | if (!match) | ||
339 | return NULL; | ||
340 | return (const struct at91_rtc_config *)match->data; | ||
341 | } | ||
342 | |||
343 | return &at91rm9200_config; | ||
344 | } | ||
345 | |||
253 | static const struct rtc_class_ops at91_rtc_ops = { | 346 | static const struct rtc_class_ops at91_rtc_ops = { |
254 | .read_time = at91_rtc_readtime, | 347 | .read_time = at91_rtc_readtime, |
255 | .set_time = at91_rtc_settime, | 348 | .set_time = at91_rtc_settime, |
@@ -268,6 +361,10 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
268 | struct resource *regs; | 361 | struct resource *regs; |
269 | int ret = 0; | 362 | int ret = 0; |
270 | 363 | ||
364 | at91_rtc_config = at91_rtc_get_config(pdev); | ||
365 | if (!at91_rtc_config) | ||
366 | return -ENODEV; | ||
367 | |||
271 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 368 | regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
272 | if (!regs) { | 369 | if (!regs) { |
273 | dev_err(&pdev->dev, "no mmio resource defined\n"); | 370 | dev_err(&pdev->dev, "no mmio resource defined\n"); |
@@ -290,7 +387,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev) | |||
290 | at91_rtc_write(AT91_RTC_MR, 0); /* 24 hour mode */ | 387 | at91_rtc_write(AT91_RTC_MR, 0); /* 24 hour mode */ |
291 | 388 | ||
292 | /* Disable all interrupts */ | 389 | /* Disable all interrupts */ |
293 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | | 390 | at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM | |
294 | AT91_RTC_SECEV | AT91_RTC_TIMEV | | 391 | AT91_RTC_SECEV | AT91_RTC_TIMEV | |
295 | AT91_RTC_CALEV); | 392 | AT91_RTC_CALEV); |
296 | 393 | ||
@@ -335,7 +432,7 @@ static int __exit at91_rtc_remove(struct platform_device *pdev) | |||
335 | struct rtc_device *rtc = platform_get_drvdata(pdev); | 432 | struct rtc_device *rtc = platform_get_drvdata(pdev); |
336 | 433 | ||
337 | /* Disable all interrupts */ | 434 | /* Disable all interrupts */ |
338 | at91_rtc_write(AT91_RTC_IDR, AT91_RTC_ACKUPD | AT91_RTC_ALARM | | 435 | at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM | |
339 | AT91_RTC_SECEV | AT91_RTC_TIMEV | | 436 | AT91_RTC_SECEV | AT91_RTC_TIMEV | |
340 | AT91_RTC_CALEV); | 437 | AT91_RTC_CALEV); |
341 | free_irq(irq, pdev); | 438 | free_irq(irq, pdev); |
@@ -358,13 +455,13 @@ static int at91_rtc_suspend(struct device *dev) | |||
358 | /* this IRQ is shared with DBGU and other hardware which isn't | 455 | /* this IRQ is shared with DBGU and other hardware which isn't |
359 | * necessarily doing PM like we are... | 456 | * necessarily doing PM like we are... |
360 | */ | 457 | */ |
361 | at91_rtc_imr = at91_rtc_read(AT91_RTC_IMR) | 458 | at91_rtc_imr = at91_rtc_read_imr() |
362 | & (AT91_RTC_ALARM|AT91_RTC_SECEV); | 459 | & (AT91_RTC_ALARM|AT91_RTC_SECEV); |
363 | if (at91_rtc_imr) { | 460 | if (at91_rtc_imr) { |
364 | if (device_may_wakeup(dev)) | 461 | if (device_may_wakeup(dev)) |
365 | enable_irq_wake(irq); | 462 | enable_irq_wake(irq); |
366 | else | 463 | else |
367 | at91_rtc_write(AT91_RTC_IDR, at91_rtc_imr); | 464 | at91_rtc_write_idr(at91_rtc_imr); |
368 | } | 465 | } |
369 | return 0; | 466 | return 0; |
370 | } | 467 | } |
@@ -375,7 +472,7 @@ static int at91_rtc_resume(struct device *dev) | |||
375 | if (device_may_wakeup(dev)) | 472 | if (device_may_wakeup(dev)) |
376 | disable_irq_wake(irq); | 473 | disable_irq_wake(irq); |
377 | else | 474 | else |
378 | at91_rtc_write(AT91_RTC_IER, at91_rtc_imr); | 475 | at91_rtc_write_ier(at91_rtc_imr); |
379 | } | 476 | } |
380 | return 0; | 477 | return 0; |
381 | } | 478 | } |
@@ -383,12 +480,6 @@ static int at91_rtc_resume(struct device *dev) | |||
383 | 480 | ||
384 | static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume); | 481 | static SIMPLE_DEV_PM_OPS(at91_rtc_pm_ops, at91_rtc_suspend, at91_rtc_resume); |
385 | 482 | ||
386 | static const struct of_device_id at91_rtc_dt_ids[] = { | ||
387 | { .compatible = "atmel,at91rm9200-rtc" }, | ||
388 | { /* sentinel */ } | ||
389 | }; | ||
390 | MODULE_DEVICE_TABLE(of, at91_rtc_dt_ids); | ||
391 | |||
392 | static struct platform_driver at91_rtc_driver = { | 483 | static struct platform_driver at91_rtc_driver = { |
393 | .remove = __exit_p(at91_rtc_remove), | 484 | .remove = __exit_p(at91_rtc_remove), |
394 | .driver = { | 485 | .driver = { |
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index cc5bea9c4b1c..f1cb706445c7 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -854,6 +854,9 @@ static int cmos_resume(struct device *dev) | |||
854 | } | 854 | } |
855 | 855 | ||
856 | spin_lock_irq(&rtc_lock); | 856 | spin_lock_irq(&rtc_lock); |
857 | if (device_may_wakeup(dev)) | ||
858 | hpet_rtc_timer_init(); | ||
859 | |||
857 | do { | 860 | do { |
858 | CMOS_WRITE(tmp, RTC_CONTROL); | 861 | CMOS_WRITE(tmp, RTC_CONTROL); |
859 | hpet_set_rtc_irq_bit(tmp & RTC_IRQMASK); | 862 | hpet_set_rtc_irq_bit(tmp & RTC_IRQMASK); |
@@ -869,7 +872,6 @@ static int cmos_resume(struct device *dev) | |||
869 | rtc_update_irq(cmos->rtc, 1, mask); | 872 | rtc_update_irq(cmos->rtc, 1, mask); |
870 | tmp &= ~RTC_AIE; | 873 | tmp &= ~RTC_AIE; |
871 | hpet_mask_rtc_irq_bit(RTC_AIE); | 874 | hpet_mask_rtc_irq_bit(RTC_AIE); |
872 | hpet_rtc_timer_init(); | ||
873 | } while (mask & RTC_AIE); | 875 | } while (mask & RTC_AIE); |
874 | spin_unlock_irq(&rtc_lock); | 876 | spin_unlock_irq(&rtc_lock); |
875 | } | 877 | } |
diff --git a/drivers/rtc/rtc-tps6586x.c b/drivers/rtc/rtc-tps6586x.c index 459c2ffc95a6..426901cef14f 100644 --- a/drivers/rtc/rtc-tps6586x.c +++ b/drivers/rtc/rtc-tps6586x.c | |||
@@ -273,6 +273,8 @@ static int tps6586x_rtc_probe(struct platform_device *pdev) | |||
273 | return ret; | 273 | return ret; |
274 | } | 274 | } |
275 | 275 | ||
276 | device_init_wakeup(&pdev->dev, 1); | ||
277 | |||
276 | platform_set_drvdata(pdev, rtc); | 278 | platform_set_drvdata(pdev, rtc); |
277 | rtc->rtc = devm_rtc_device_register(&pdev->dev, dev_name(&pdev->dev), | 279 | rtc->rtc = devm_rtc_device_register(&pdev->dev, dev_name(&pdev->dev), |
278 | &tps6586x_rtc_ops, THIS_MODULE); | 280 | &tps6586x_rtc_ops, THIS_MODULE); |
@@ -292,7 +294,6 @@ static int tps6586x_rtc_probe(struct platform_device *pdev) | |||
292 | goto fail_rtc_register; | 294 | goto fail_rtc_register; |
293 | } | 295 | } |
294 | disable_irq(rtc->irq); | 296 | disable_irq(rtc->irq); |
295 | device_set_wakeup_capable(&pdev->dev, 1); | ||
296 | return 0; | 297 | return 0; |
297 | 298 | ||
298 | fail_rtc_register: | 299 | fail_rtc_register: |
diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c index 8751a5240c99..b2eab34f38d9 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c | |||
@@ -524,6 +524,7 @@ static int twl_rtc_probe(struct platform_device *pdev) | |||
524 | } | 524 | } |
525 | 525 | ||
526 | platform_set_drvdata(pdev, rtc); | 526 | platform_set_drvdata(pdev, rtc); |
527 | device_init_wakeup(&pdev->dev, 1); | ||
527 | return 0; | 528 | return 0; |
528 | 529 | ||
529 | out2: | 530 | out2: |
diff --git a/drivers/s390/net/netiucv.c b/drivers/s390/net/netiucv.c index 4ffa66c87ea5..9ca3996f65b2 100644 --- a/drivers/s390/net/netiucv.c +++ b/drivers/s390/net/netiucv.c | |||
@@ -2040,6 +2040,7 @@ static struct net_device *netiucv_init_netdevice(char *username, char *userdata) | |||
2040 | netiucv_setup_netdevice); | 2040 | netiucv_setup_netdevice); |
2041 | if (!dev) | 2041 | if (!dev) |
2042 | return NULL; | 2042 | return NULL; |
2043 | rtnl_lock(); | ||
2043 | if (dev_alloc_name(dev, dev->name) < 0) | 2044 | if (dev_alloc_name(dev, dev->name) < 0) |
2044 | goto out_netdev; | 2045 | goto out_netdev; |
2045 | 2046 | ||
@@ -2061,6 +2062,7 @@ static struct net_device *netiucv_init_netdevice(char *username, char *userdata) | |||
2061 | out_fsm: | 2062 | out_fsm: |
2062 | kfree_fsm(privptr->fsm); | 2063 | kfree_fsm(privptr->fsm); |
2063 | out_netdev: | 2064 | out_netdev: |
2065 | rtnl_unlock(); | ||
2064 | free_netdev(dev); | 2066 | free_netdev(dev); |
2065 | return NULL; | 2067 | return NULL; |
2066 | } | 2068 | } |
@@ -2100,6 +2102,7 @@ static ssize_t conn_write(struct device_driver *drv, | |||
2100 | 2102 | ||
2101 | rc = netiucv_register_device(dev); | 2103 | rc = netiucv_register_device(dev); |
2102 | if (rc) { | 2104 | if (rc) { |
2105 | rtnl_unlock(); | ||
2103 | IUCV_DBF_TEXT_(setup, 2, | 2106 | IUCV_DBF_TEXT_(setup, 2, |
2104 | "ret %d from netiucv_register_device\n", rc); | 2107 | "ret %d from netiucv_register_device\n", rc); |
2105 | goto out_free_ndev; | 2108 | goto out_free_ndev; |
@@ -2109,7 +2112,8 @@ static ssize_t conn_write(struct device_driver *drv, | |||
2109 | priv = netdev_priv(dev); | 2112 | priv = netdev_priv(dev); |
2110 | SET_NETDEV_DEV(dev, priv->dev); | 2113 | SET_NETDEV_DEV(dev, priv->dev); |
2111 | 2114 | ||
2112 | rc = register_netdev(dev); | 2115 | rc = register_netdevice(dev); |
2116 | rtnl_unlock(); | ||
2113 | if (rc) | 2117 | if (rc) |
2114 | goto out_unreg; | 2118 | goto out_unreg; |
2115 | 2119 | ||
diff --git a/drivers/scsi/bfa/bfad_debugfs.c b/drivers/scsi/bfa/bfad_debugfs.c index 439c012be763..b63d534192e3 100644 --- a/drivers/scsi/bfa/bfad_debugfs.c +++ b/drivers/scsi/bfa/bfad_debugfs.c | |||
@@ -186,7 +186,7 @@ bfad_debugfs_lseek(struct file *file, loff_t offset, int orig) | |||
186 | file->f_pos += offset; | 186 | file->f_pos += offset; |
187 | break; | 187 | break; |
188 | case 2: | 188 | case 2: |
189 | file->f_pos = debug->buffer_len - offset; | 189 | file->f_pos = debug->buffer_len + offset; |
190 | break; | 190 | break; |
191 | default: | 191 | default: |
192 | return -EINVAL; | 192 | return -EINVAL; |
diff --git a/drivers/scsi/fnic/fnic_debugfs.c b/drivers/scsi/fnic/fnic_debugfs.c index adc1f7f471f5..85e1ffd0e5c5 100644 --- a/drivers/scsi/fnic/fnic_debugfs.c +++ b/drivers/scsi/fnic/fnic_debugfs.c | |||
@@ -174,7 +174,7 @@ static loff_t fnic_trace_debugfs_lseek(struct file *file, | |||
174 | pos = file->f_pos + offset; | 174 | pos = file->f_pos + offset; |
175 | break; | 175 | break; |
176 | case 2: | 176 | case 2: |
177 | pos = fnic_dbg_prt->buffer_len - offset; | 177 | pos = fnic_dbg_prt->buffer_len + offset; |
178 | } | 178 | } |
179 | return (pos < 0 || pos > fnic_dbg_prt->buffer_len) ? | 179 | return (pos < 0 || pos > fnic_dbg_prt->buffer_len) ? |
180 | -EINVAL : (file->f_pos = pos); | 180 | -EINVAL : (file->f_pos = pos); |
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index f63f5ff7f274..f525ecb7a9c6 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
@@ -1178,7 +1178,7 @@ lpfc_debugfs_lseek(struct file *file, loff_t off, int whence) | |||
1178 | pos = file->f_pos + off; | 1178 | pos = file->f_pos + off; |
1179 | break; | 1179 | break; |
1180 | case 2: | 1180 | case 2: |
1181 | pos = debug->len - off; | 1181 | pos = debug->len + off; |
1182 | } | 1182 | } |
1183 | return (pos < 0 || pos > debug->len) ? -EINVAL : (file->f_pos = pos); | 1183 | return (pos < 0 || pos > debug->len) ? -EINVAL : (file->f_pos = pos); |
1184 | } | 1184 | } |
diff --git a/drivers/spi/spi-sh-hspi.c b/drivers/spi/spi-sh-hspi.c index 60cfae51c713..eab593eaaafa 100644 --- a/drivers/spi/spi-sh-hspi.c +++ b/drivers/spi/spi-sh-hspi.c | |||
@@ -89,7 +89,7 @@ static int hspi_status_check_timeout(struct hspi_priv *hspi, u32 mask, u32 val) | |||
89 | if ((mask & hspi_read(hspi, SPSR)) == val) | 89 | if ((mask & hspi_read(hspi, SPSR)) == val) |
90 | return 0; | 90 | return 0; |
91 | 91 | ||
92 | msleep(20); | 92 | udelay(10); |
93 | } | 93 | } |
94 | 94 | ||
95 | dev_err(hspi->dev, "timeout\n"); | 95 | dev_err(hspi->dev, "timeout\n"); |
diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c index 35f60bd252dd..637d728fbeb5 100644 --- a/drivers/spi/spi-topcliff-pch.c +++ b/drivers/spi/spi-topcliff-pch.c | |||
@@ -1487,7 +1487,7 @@ static int pch_spi_pd_probe(struct platform_device *plat_dev) | |||
1487 | return 0; | 1487 | return 0; |
1488 | 1488 | ||
1489 | err_spi_register_master: | 1489 | err_spi_register_master: |
1490 | free_irq(board_dat->pdev->irq, board_dat); | 1490 | free_irq(board_dat->pdev->irq, data); |
1491 | err_request_irq: | 1491 | err_request_irq: |
1492 | pch_spi_free_resources(board_dat, data); | 1492 | pch_spi_free_resources(board_dat, data); |
1493 | err_spi_get_resources: | 1493 | err_spi_get_resources: |
@@ -1667,6 +1667,7 @@ static int pch_spi_probe(struct pci_dev *pdev, | |||
1667 | pd_dev = platform_device_alloc("pch-spi", i); | 1667 | pd_dev = platform_device_alloc("pch-spi", i); |
1668 | if (!pd_dev) { | 1668 | if (!pd_dev) { |
1669 | dev_err(&pdev->dev, "platform_device_alloc failed\n"); | 1669 | dev_err(&pdev->dev, "platform_device_alloc failed\n"); |
1670 | retval = -ENOMEM; | ||
1670 | goto err_platform_device; | 1671 | goto err_platform_device; |
1671 | } | 1672 | } |
1672 | pd_dev_save->pd_save[i] = pd_dev; | 1673 | pd_dev_save->pd_save[i] = pd_dev; |
diff --git a/drivers/spi/spi-xilinx.c b/drivers/spi/spi-xilinx.c index e1d769607425..34d18dcfa0db 100644 --- a/drivers/spi/spi-xilinx.c +++ b/drivers/spi/spi-xilinx.c | |||
@@ -267,7 +267,6 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t) | |||
267 | { | 267 | { |
268 | struct xilinx_spi *xspi = spi_master_get_devdata(spi->master); | 268 | struct xilinx_spi *xspi = spi_master_get_devdata(spi->master); |
269 | u32 ipif_ier; | 269 | u32 ipif_ier; |
270 | u16 cr; | ||
271 | 270 | ||
272 | /* We get here with transmitter inhibited */ | 271 | /* We get here with transmitter inhibited */ |
273 | 272 | ||
@@ -276,7 +275,6 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t) | |||
276 | xspi->remaining_bytes = t->len; | 275 | xspi->remaining_bytes = t->len; |
277 | INIT_COMPLETION(xspi->done); | 276 | INIT_COMPLETION(xspi->done); |
278 | 277 | ||
279 | xilinx_spi_fill_tx_fifo(xspi); | ||
280 | 278 | ||
281 | /* Enable the transmit empty interrupt, which we use to determine | 279 | /* Enable the transmit empty interrupt, which we use to determine |
282 | * progress on the transmission. | 280 | * progress on the transmission. |
@@ -285,12 +283,41 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t) | |||
285 | xspi->write_fn(ipif_ier | XSPI_INTR_TX_EMPTY, | 283 | xspi->write_fn(ipif_ier | XSPI_INTR_TX_EMPTY, |
286 | xspi->regs + XIPIF_V123B_IIER_OFFSET); | 284 | xspi->regs + XIPIF_V123B_IIER_OFFSET); |
287 | 285 | ||
288 | /* Start the transfer by not inhibiting the transmitter any longer */ | 286 | for (;;) { |
289 | cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET) & | 287 | u16 cr; |
290 | ~XSPI_CR_TRANS_INHIBIT; | 288 | u8 sr; |
291 | xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET); | 289 | |
290 | xilinx_spi_fill_tx_fifo(xspi); | ||
291 | |||
292 | /* Start the transfer by not inhibiting the transmitter any | ||
293 | * longer | ||
294 | */ | ||
295 | cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET) & | ||
296 | ~XSPI_CR_TRANS_INHIBIT; | ||
297 | xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET); | ||
298 | |||
299 | wait_for_completion(&xspi->done); | ||
300 | |||
301 | /* A transmit has just completed. Process received data and | ||
302 | * check for more data to transmit. Always inhibit the | ||
303 | * transmitter while the Isr refills the transmit register/FIFO, | ||
304 | * or make sure it is stopped if we're done. | ||
305 | */ | ||
306 | cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET); | ||
307 | xspi->write_fn(cr | XSPI_CR_TRANS_INHIBIT, | ||
308 | xspi->regs + XSPI_CR_OFFSET); | ||
309 | |||
310 | /* Read out all the data from the Rx FIFO */ | ||
311 | sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET); | ||
312 | while ((sr & XSPI_SR_RX_EMPTY_MASK) == 0) { | ||
313 | xspi->rx_fn(xspi); | ||
314 | sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET); | ||
315 | } | ||
292 | 316 | ||
293 | wait_for_completion(&xspi->done); | 317 | /* See if there is more data to send */ |
318 | if (!xspi->remaining_bytes > 0) | ||
319 | break; | ||
320 | } | ||
294 | 321 | ||
295 | /* Disable the transmit empty interrupt */ | 322 | /* Disable the transmit empty interrupt */ |
296 | xspi->write_fn(ipif_ier, xspi->regs + XIPIF_V123B_IIER_OFFSET); | 323 | xspi->write_fn(ipif_ier, xspi->regs + XIPIF_V123B_IIER_OFFSET); |
@@ -314,38 +341,7 @@ static irqreturn_t xilinx_spi_irq(int irq, void *dev_id) | |||
314 | xspi->write_fn(ipif_isr, xspi->regs + XIPIF_V123B_IISR_OFFSET); | 341 | xspi->write_fn(ipif_isr, xspi->regs + XIPIF_V123B_IISR_OFFSET); |
315 | 342 | ||
316 | if (ipif_isr & XSPI_INTR_TX_EMPTY) { /* Transmission completed */ | 343 | if (ipif_isr & XSPI_INTR_TX_EMPTY) { /* Transmission completed */ |
317 | u16 cr; | 344 | complete(&xspi->done); |
318 | u8 sr; | ||
319 | |||
320 | /* A transmit has just completed. Process received data and | ||
321 | * check for more data to transmit. Always inhibit the | ||
322 | * transmitter while the Isr refills the transmit register/FIFO, | ||
323 | * or make sure it is stopped if we're done. | ||
324 | */ | ||
325 | cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET); | ||
326 | xspi->write_fn(cr | XSPI_CR_TRANS_INHIBIT, | ||
327 | xspi->regs + XSPI_CR_OFFSET); | ||
328 | |||
329 | /* Read out all the data from the Rx FIFO */ | ||
330 | sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET); | ||
331 | while ((sr & XSPI_SR_RX_EMPTY_MASK) == 0) { | ||
332 | xspi->rx_fn(xspi); | ||
333 | sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET); | ||
334 | } | ||
335 | |||
336 | /* See if there is more data to send */ | ||
337 | if (xspi->remaining_bytes > 0) { | ||
338 | xilinx_spi_fill_tx_fifo(xspi); | ||
339 | /* Start the transfer by not inhibiting the | ||
340 | * transmitter any longer | ||
341 | */ | ||
342 | xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET); | ||
343 | } else { | ||
344 | /* No more data to send. | ||
345 | * Indicate the transfer is completed. | ||
346 | */ | ||
347 | complete(&xspi->done); | ||
348 | } | ||
349 | } | 345 | } |
350 | 346 | ||
351 | return IRQ_HANDLED; | 347 | return IRQ_HANDLED; |
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 49b098bedf9b..475c9c114689 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c | |||
@@ -276,8 +276,9 @@ static void ci_role_work(struct work_struct *work) | |||
276 | 276 | ||
277 | ci_role_stop(ci); | 277 | ci_role_stop(ci); |
278 | ci_role_start(ci, role); | 278 | ci_role_start(ci, role); |
279 | enable_irq(ci->irq); | ||
280 | } | 279 | } |
280 | |||
281 | enable_irq(ci->irq); | ||
281 | } | 282 | } |
282 | 283 | ||
283 | static irqreturn_t ci_irq(int irq, void *data) | 284 | static irqreturn_t ci_irq(int irq, void *data) |
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 519ead2443c5..b501346484ae 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
@@ -1678,8 +1678,11 @@ static int udc_start(struct ci13xxx *ci) | |||
1678 | 1678 | ||
1679 | ci->gadget.ep0 = &ci->ep0in->ep; | 1679 | ci->gadget.ep0 = &ci->ep0in->ep; |
1680 | 1680 | ||
1681 | if (ci->global_phy) | 1681 | if (ci->global_phy) { |
1682 | ci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2); | 1682 | ci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2); |
1683 | if (IS_ERR(ci->transceiver)) | ||
1684 | ci->transceiver = NULL; | ||
1685 | } | ||
1683 | 1686 | ||
1684 | if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) { | 1687 | if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) { |
1685 | if (ci->transceiver == NULL) { | 1688 | if (ci->transceiver == NULL) { |
@@ -1694,7 +1697,7 @@ static int udc_start(struct ci13xxx *ci) | |||
1694 | goto put_transceiver; | 1697 | goto put_transceiver; |
1695 | } | 1698 | } |
1696 | 1699 | ||
1697 | if (!IS_ERR_OR_NULL(ci->transceiver)) { | 1700 | if (ci->transceiver) { |
1698 | retval = otg_set_peripheral(ci->transceiver->otg, | 1701 | retval = otg_set_peripheral(ci->transceiver->otg, |
1699 | &ci->gadget); | 1702 | &ci->gadget); |
1700 | if (retval) | 1703 | if (retval) |
@@ -1711,7 +1714,7 @@ static int udc_start(struct ci13xxx *ci) | |||
1711 | return retval; | 1714 | return retval; |
1712 | 1715 | ||
1713 | remove_trans: | 1716 | remove_trans: |
1714 | if (!IS_ERR_OR_NULL(ci->transceiver)) { | 1717 | if (ci->transceiver) { |
1715 | otg_set_peripheral(ci->transceiver->otg, NULL); | 1718 | otg_set_peripheral(ci->transceiver->otg, NULL); |
1716 | if (ci->global_phy) | 1719 | if (ci->global_phy) |
1717 | usb_put_phy(ci->transceiver); | 1720 | usb_put_phy(ci->transceiver); |
@@ -1719,7 +1722,7 @@ remove_trans: | |||
1719 | 1722 | ||
1720 | dev_err(dev, "error = %i\n", retval); | 1723 | dev_err(dev, "error = %i\n", retval); |
1721 | put_transceiver: | 1724 | put_transceiver: |
1722 | if (!IS_ERR_OR_NULL(ci->transceiver) && ci->global_phy) | 1725 | if (ci->transceiver && ci->global_phy) |
1723 | usb_put_phy(ci->transceiver); | 1726 | usb_put_phy(ci->transceiver); |
1724 | destroy_eps: | 1727 | destroy_eps: |
1725 | destroy_eps(ci); | 1728 | destroy_eps(ci); |
@@ -1747,7 +1750,7 @@ static void udc_stop(struct ci13xxx *ci) | |||
1747 | dma_pool_destroy(ci->td_pool); | 1750 | dma_pool_destroy(ci->td_pool); |
1748 | dma_pool_destroy(ci->qh_pool); | 1751 | dma_pool_destroy(ci->qh_pool); |
1749 | 1752 | ||
1750 | if (!IS_ERR_OR_NULL(ci->transceiver)) { | 1753 | if (ci->transceiver) { |
1751 | otg_set_peripheral(ci->transceiver->otg, NULL); | 1754 | otg_set_peripheral(ci->transceiver->otg, NULL); |
1752 | if (ci->global_phy) | 1755 | if (ci->global_phy) |
1753 | usb_put_phy(ci->transceiver); | 1756 | usb_put_phy(ci->transceiver); |
diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c index 090b411d893f..7d8dd5aad236 100644 --- a/drivers/usb/serial/f81232.c +++ b/drivers/usb/serial/f81232.c | |||
@@ -165,11 +165,12 @@ static void f81232_set_termios(struct tty_struct *tty, | |||
165 | /* FIXME - Stubbed out for now */ | 165 | /* FIXME - Stubbed out for now */ |
166 | 166 | ||
167 | /* Don't change anything if nothing has changed */ | 167 | /* Don't change anything if nothing has changed */ |
168 | if (!tty_termios_hw_change(&tty->termios, old_termios)) | 168 | if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios)) |
169 | return; | 169 | return; |
170 | 170 | ||
171 | /* Do the real work here... */ | 171 | /* Do the real work here... */ |
172 | tty_termios_copy_hw(&tty->termios, old_termios); | 172 | if (old_termios) |
173 | tty_termios_copy_hw(&tty->termios, old_termios); | ||
173 | } | 174 | } |
174 | 175 | ||
175 | static int f81232_tiocmget(struct tty_struct *tty) | 176 | static int f81232_tiocmget(struct tty_struct *tty) |
@@ -187,12 +188,11 @@ static int f81232_tiocmset(struct tty_struct *tty, | |||
187 | 188 | ||
188 | static int f81232_open(struct tty_struct *tty, struct usb_serial_port *port) | 189 | static int f81232_open(struct tty_struct *tty, struct usb_serial_port *port) |
189 | { | 190 | { |
190 | struct ktermios tmp_termios; | ||
191 | int result; | 191 | int result; |
192 | 192 | ||
193 | /* Setup termios */ | 193 | /* Setup termios */ |
194 | if (tty) | 194 | if (tty) |
195 | f81232_set_termios(tty, port, &tmp_termios); | 195 | f81232_set_termios(tty, port, NULL); |
196 | 196 | ||
197 | result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); | 197 | result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); |
198 | if (result) { | 198 | if (result) { |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 7151659367a0..048cd44d51b1 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
@@ -284,7 +284,7 @@ static void pl2303_set_termios(struct tty_struct *tty, | |||
284 | serial settings even to the same values as before. Thus | 284 | serial settings even to the same values as before. Thus |
285 | we actually need to filter in this specific case */ | 285 | we actually need to filter in this specific case */ |
286 | 286 | ||
287 | if (!tty_termios_hw_change(&tty->termios, old_termios)) | 287 | if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios)) |
288 | return; | 288 | return; |
289 | 289 | ||
290 | cflag = tty->termios.c_cflag; | 290 | cflag = tty->termios.c_cflag; |
@@ -293,7 +293,8 @@ static void pl2303_set_termios(struct tty_struct *tty, | |||
293 | if (!buf) { | 293 | if (!buf) { |
294 | dev_err(&port->dev, "%s - out of memory.\n", __func__); | 294 | dev_err(&port->dev, "%s - out of memory.\n", __func__); |
295 | /* Report back no change occurred */ | 295 | /* Report back no change occurred */ |
296 | tty->termios = *old_termios; | 296 | if (old_termios) |
297 | tty->termios = *old_termios; | ||
297 | return; | 298 | return; |
298 | } | 299 | } |
299 | 300 | ||
@@ -433,7 +434,7 @@ static void pl2303_set_termios(struct tty_struct *tty, | |||
433 | control = priv->line_control; | 434 | control = priv->line_control; |
434 | if ((cflag & CBAUD) == B0) | 435 | if ((cflag & CBAUD) == B0) |
435 | priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS); | 436 | priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS); |
436 | else if ((old_termios->c_cflag & CBAUD) == B0) | 437 | else if (old_termios && (old_termios->c_cflag & CBAUD) == B0) |
437 | priv->line_control |= (CONTROL_DTR | CONTROL_RTS); | 438 | priv->line_control |= (CONTROL_DTR | CONTROL_RTS); |
438 | if (control != priv->line_control) { | 439 | if (control != priv->line_control) { |
439 | control = priv->line_control; | 440 | control = priv->line_control; |
@@ -492,7 +493,6 @@ static void pl2303_close(struct usb_serial_port *port) | |||
492 | 493 | ||
493 | static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port) | 494 | static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port) |
494 | { | 495 | { |
495 | struct ktermios tmp_termios; | ||
496 | struct usb_serial *serial = port->serial; | 496 | struct usb_serial *serial = port->serial; |
497 | struct pl2303_serial_private *spriv = usb_get_serial_data(serial); | 497 | struct pl2303_serial_private *spriv = usb_get_serial_data(serial); |
498 | int result; | 498 | int result; |
@@ -508,7 +508,7 @@ static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
508 | 508 | ||
509 | /* Setup termios */ | 509 | /* Setup termios */ |
510 | if (tty) | 510 | if (tty) |
511 | pl2303_set_termios(tty, port, &tmp_termios); | 511 | pl2303_set_termios(tty, port, NULL); |
512 | 512 | ||
513 | result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); | 513 | result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); |
514 | if (result) { | 514 | if (result) { |
diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index cf3df793c2b7..ddf6c47137dc 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c | |||
@@ -291,7 +291,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty, | |||
291 | struct spcp8x5_private *priv = usb_get_serial_port_data(port); | 291 | struct spcp8x5_private *priv = usb_get_serial_port_data(port); |
292 | unsigned long flags; | 292 | unsigned long flags; |
293 | unsigned int cflag = tty->termios.c_cflag; | 293 | unsigned int cflag = tty->termios.c_cflag; |
294 | unsigned int old_cflag = old_termios->c_cflag; | ||
295 | unsigned short uartdata; | 294 | unsigned short uartdata; |
296 | unsigned char buf[2] = {0, 0}; | 295 | unsigned char buf[2] = {0, 0}; |
297 | int baud; | 296 | int baud; |
@@ -299,15 +298,15 @@ static void spcp8x5_set_termios(struct tty_struct *tty, | |||
299 | u8 control; | 298 | u8 control; |
300 | 299 | ||
301 | /* check that they really want us to change something */ | 300 | /* check that they really want us to change something */ |
302 | if (!tty_termios_hw_change(&tty->termios, old_termios)) | 301 | if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios)) |
303 | return; | 302 | return; |
304 | 303 | ||
305 | /* set DTR/RTS active */ | 304 | /* set DTR/RTS active */ |
306 | spin_lock_irqsave(&priv->lock, flags); | 305 | spin_lock_irqsave(&priv->lock, flags); |
307 | control = priv->line_control; | 306 | control = priv->line_control; |
308 | if ((old_cflag & CBAUD) == B0) { | 307 | if (old_termios && (old_termios->c_cflag & CBAUD) == B0) { |
309 | priv->line_control |= MCR_DTR; | 308 | priv->line_control |= MCR_DTR; |
310 | if (!(old_cflag & CRTSCTS)) | 309 | if (!(old_termios->c_cflag & CRTSCTS)) |
311 | priv->line_control |= MCR_RTS; | 310 | priv->line_control |= MCR_RTS; |
312 | } | 311 | } |
313 | if (control != priv->line_control) { | 312 | if (control != priv->line_control) { |
@@ -394,7 +393,6 @@ static void spcp8x5_set_termios(struct tty_struct *tty, | |||
394 | 393 | ||
395 | static int spcp8x5_open(struct tty_struct *tty, struct usb_serial_port *port) | 394 | static int spcp8x5_open(struct tty_struct *tty, struct usb_serial_port *port) |
396 | { | 395 | { |
397 | struct ktermios tmp_termios; | ||
398 | struct usb_serial *serial = port->serial; | 396 | struct usb_serial *serial = port->serial; |
399 | struct spcp8x5_private *priv = usb_get_serial_port_data(port); | 397 | struct spcp8x5_private *priv = usb_get_serial_port_data(port); |
400 | int ret; | 398 | int ret; |
@@ -411,7 +409,7 @@ static int spcp8x5_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
411 | spcp8x5_set_ctrl_line(port, priv->line_control); | 409 | spcp8x5_set_ctrl_line(port, priv->line_control); |
412 | 410 | ||
413 | if (tty) | 411 | if (tty) |
414 | spcp8x5_set_termios(tty, port, &tmp_termios); | 412 | spcp8x5_set_termios(tty, port, NULL); |
415 | 413 | ||
416 | port->port.drain_delay = 256; | 414 | port->port.drain_delay = 256; |
417 | 415 | ||
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c index acb7121a9316..6d78736563de 100644 --- a/drivers/vfio/vfio.c +++ b/drivers/vfio/vfio.c | |||
@@ -1360,7 +1360,7 @@ static const struct file_operations vfio_device_fops = { | |||
1360 | */ | 1360 | */ |
1361 | static char *vfio_devnode(struct device *dev, umode_t *mode) | 1361 | static char *vfio_devnode(struct device *dev, umode_t *mode) |
1362 | { | 1362 | { |
1363 | if (MINOR(dev->devt) == 0) | 1363 | if (mode && (MINOR(dev->devt) == 0)) |
1364 | *mode = S_IRUGO | S_IWUGO; | 1364 | *mode = S_IRUGO | S_IWUGO; |
1365 | 1365 | ||
1366 | return kasprintf(GFP_KERNEL, "vfio/%s", dev_name(dev)); | 1366 | return kasprintf(GFP_KERNEL, "vfio/%s", dev_name(dev)); |
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index 2b51e2336aa2..f80d3dd41d8c 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -155,14 +155,11 @@ static void vhost_net_ubuf_put_and_wait(struct vhost_net_ubuf_ref *ubufs) | |||
155 | 155 | ||
156 | static void vhost_net_clear_ubuf_info(struct vhost_net *n) | 156 | static void vhost_net_clear_ubuf_info(struct vhost_net *n) |
157 | { | 157 | { |
158 | |||
159 | bool zcopy; | ||
160 | int i; | 158 | int i; |
161 | 159 | ||
162 | for (i = 0; i < n->dev.nvqs; ++i) { | 160 | for (i = 0; i < VHOST_NET_VQ_MAX; ++i) { |
163 | zcopy = vhost_net_zcopy_mask & (0x1 << i); | 161 | kfree(n->vqs[i].ubuf_info); |
164 | if (zcopy) | 162 | n->vqs[i].ubuf_info = NULL; |
165 | kfree(n->vqs[i].ubuf_info); | ||
166 | } | 163 | } |
167 | } | 164 | } |
168 | 165 | ||
@@ -171,7 +168,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n) | |||
171 | bool zcopy; | 168 | bool zcopy; |
172 | int i; | 169 | int i; |
173 | 170 | ||
174 | for (i = 0; i < n->dev.nvqs; ++i) { | 171 | for (i = 0; i < VHOST_NET_VQ_MAX; ++i) { |
175 | zcopy = vhost_net_zcopy_mask & (0x1 << i); | 172 | zcopy = vhost_net_zcopy_mask & (0x1 << i); |
176 | if (!zcopy) | 173 | if (!zcopy) |
177 | continue; | 174 | continue; |
@@ -183,12 +180,7 @@ int vhost_net_set_ubuf_info(struct vhost_net *n) | |||
183 | return 0; | 180 | return 0; |
184 | 181 | ||
185 | err: | 182 | err: |
186 | while (i--) { | 183 | vhost_net_clear_ubuf_info(n); |
187 | zcopy = vhost_net_zcopy_mask & (0x1 << i); | ||
188 | if (!zcopy) | ||
189 | continue; | ||
190 | kfree(n->vqs[i].ubuf_info); | ||
191 | } | ||
192 | return -ENOMEM; | 184 | return -ENOMEM; |
193 | } | 185 | } |
194 | 186 | ||
@@ -196,12 +188,12 @@ void vhost_net_vq_reset(struct vhost_net *n) | |||
196 | { | 188 | { |
197 | int i; | 189 | int i; |
198 | 190 | ||
191 | vhost_net_clear_ubuf_info(n); | ||
192 | |||
199 | for (i = 0; i < VHOST_NET_VQ_MAX; i++) { | 193 | for (i = 0; i < VHOST_NET_VQ_MAX; i++) { |
200 | n->vqs[i].done_idx = 0; | 194 | n->vqs[i].done_idx = 0; |
201 | n->vqs[i].upend_idx = 0; | 195 | n->vqs[i].upend_idx = 0; |
202 | n->vqs[i].ubufs = NULL; | 196 | n->vqs[i].ubufs = NULL; |
203 | kfree(n->vqs[i].ubuf_info); | ||
204 | n->vqs[i].ubuf_info = NULL; | ||
205 | n->vqs[i].vhost_hlen = 0; | 197 | n->vqs[i].vhost_hlen = 0; |
206 | n->vqs[i].sock_hlen = 0; | 198 | n->vqs[i].sock_hlen = 0; |
207 | } | 199 | } |
@@ -436,7 +428,8 @@ static void handle_tx(struct vhost_net *net) | |||
436 | kref_get(&ubufs->kref); | 428 | kref_get(&ubufs->kref); |
437 | } | 429 | } |
438 | nvq->upend_idx = (nvq->upend_idx + 1) % UIO_MAXIOV; | 430 | nvq->upend_idx = (nvq->upend_idx + 1) % UIO_MAXIOV; |
439 | } | 431 | } else |
432 | msg.msg_control = NULL; | ||
440 | /* TODO: Check specific error and bomb out unless ENOBUFS? */ | 433 | /* TODO: Check specific error and bomb out unless ENOBUFS? */ |
441 | err = sock->ops->sendmsg(NULL, sock, &msg, len); | 434 | err = sock->ops->sendmsg(NULL, sock, &msg, len); |
442 | if (unlikely(err < 0)) { | 435 | if (unlikely(err < 0)) { |
@@ -1053,6 +1046,10 @@ static long vhost_net_set_owner(struct vhost_net *n) | |||
1053 | int r; | 1046 | int r; |
1054 | 1047 | ||
1055 | mutex_lock(&n->dev.mutex); | 1048 | mutex_lock(&n->dev.mutex); |
1049 | if (vhost_dev_has_owner(&n->dev)) { | ||
1050 | r = -EBUSY; | ||
1051 | goto out; | ||
1052 | } | ||
1056 | r = vhost_net_set_ubuf_info(n); | 1053 | r = vhost_net_set_ubuf_info(n); |
1057 | if (r) | 1054 | if (r) |
1058 | goto out; | 1055 | goto out; |
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index beee7f5787e6..60aa5ad09a2f 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
@@ -344,13 +344,19 @@ static int vhost_attach_cgroups(struct vhost_dev *dev) | |||
344 | } | 344 | } |
345 | 345 | ||
346 | /* Caller should have device mutex */ | 346 | /* Caller should have device mutex */ |
347 | bool vhost_dev_has_owner(struct vhost_dev *dev) | ||
348 | { | ||
349 | return dev->mm; | ||
350 | } | ||
351 | |||
352 | /* Caller should have device mutex */ | ||
347 | long vhost_dev_set_owner(struct vhost_dev *dev) | 353 | long vhost_dev_set_owner(struct vhost_dev *dev) |
348 | { | 354 | { |
349 | struct task_struct *worker; | 355 | struct task_struct *worker; |
350 | int err; | 356 | int err; |
351 | 357 | ||
352 | /* Is there an owner already? */ | 358 | /* Is there an owner already? */ |
353 | if (dev->mm) { | 359 | if (vhost_dev_has_owner(dev)) { |
354 | err = -EBUSY; | 360 | err = -EBUSY; |
355 | goto err_mm; | 361 | goto err_mm; |
356 | } | 362 | } |
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h index a7ad63592987..64adcf99ff33 100644 --- a/drivers/vhost/vhost.h +++ b/drivers/vhost/vhost.h | |||
@@ -133,6 +133,7 @@ struct vhost_dev { | |||
133 | 133 | ||
134 | long vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs, int nvqs); | 134 | long vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs, int nvqs); |
135 | long vhost_dev_set_owner(struct vhost_dev *dev); | 135 | long vhost_dev_set_owner(struct vhost_dev *dev); |
136 | bool vhost_dev_has_owner(struct vhost_dev *dev); | ||
136 | long vhost_dev_check_owner(struct vhost_dev *); | 137 | long vhost_dev_check_owner(struct vhost_dev *); |
137 | struct vhost_memory *vhost_dev_reset_owner_prepare(void); | 138 | struct vhost_memory *vhost_dev_reset_owner_prepare(void); |
138 | void vhost_dev_reset_owner(struct vhost_dev *, struct vhost_memory *); | 139 | void vhost_dev_reset_owner(struct vhost_dev *, struct vhost_memory *); |
diff --git a/drivers/xen/tmem.c b/drivers/xen/tmem.c index cc072c66c766..0f0493c63371 100644 --- a/drivers/xen/tmem.c +++ b/drivers/xen/tmem.c | |||
@@ -379,10 +379,10 @@ static int xen_tmem_init(void) | |||
379 | #ifdef CONFIG_FRONTSWAP | 379 | #ifdef CONFIG_FRONTSWAP |
380 | if (tmem_enabled && frontswap) { | 380 | if (tmem_enabled && frontswap) { |
381 | char *s = ""; | 381 | char *s = ""; |
382 | struct frontswap_ops *old_ops = | 382 | struct frontswap_ops *old_ops; |
383 | frontswap_register_ops(&tmem_frontswap_ops); | ||
384 | 383 | ||
385 | tmem_frontswap_poolid = -1; | 384 | tmem_frontswap_poolid = -1; |
385 | old_ops = frontswap_register_ops(&tmem_frontswap_ops); | ||
386 | if (IS_ERR(old_ops) || old_ops) { | 386 | if (IS_ERR(old_ops) || old_ops) { |
387 | if (IS_ERR(old_ops)) | 387 | if (IS_ERR(old_ops)) |
388 | return PTR_ERR(old_ops); | 388 | return PTR_ERR(old_ops); |
@@ -141,9 +141,6 @@ static void aio_free_ring(struct kioctx *ctx) | |||
141 | for (i = 0; i < ctx->nr_pages; i++) | 141 | for (i = 0; i < ctx->nr_pages; i++) |
142 | put_page(ctx->ring_pages[i]); | 142 | put_page(ctx->ring_pages[i]); |
143 | 143 | ||
144 | if (ctx->mmap_size) | ||
145 | vm_munmap(ctx->mmap_base, ctx->mmap_size); | ||
146 | |||
147 | if (ctx->ring_pages && ctx->ring_pages != ctx->internal_pages) | 144 | if (ctx->ring_pages && ctx->ring_pages != ctx->internal_pages) |
148 | kfree(ctx->ring_pages); | 145 | kfree(ctx->ring_pages); |
149 | } | 146 | } |
@@ -322,11 +319,6 @@ static void free_ioctx(struct kioctx *ctx) | |||
322 | 319 | ||
323 | aio_free_ring(ctx); | 320 | aio_free_ring(ctx); |
324 | 321 | ||
325 | spin_lock(&aio_nr_lock); | ||
326 | BUG_ON(aio_nr - ctx->max_reqs > aio_nr); | ||
327 | aio_nr -= ctx->max_reqs; | ||
328 | spin_unlock(&aio_nr_lock); | ||
329 | |||
330 | pr_debug("freeing %p\n", ctx); | 322 | pr_debug("freeing %p\n", ctx); |
331 | 323 | ||
332 | /* | 324 | /* |
@@ -435,17 +427,24 @@ static void kill_ioctx(struct kioctx *ctx) | |||
435 | { | 427 | { |
436 | if (!atomic_xchg(&ctx->dead, 1)) { | 428 | if (!atomic_xchg(&ctx->dead, 1)) { |
437 | hlist_del_rcu(&ctx->list); | 429 | hlist_del_rcu(&ctx->list); |
438 | /* Between hlist_del_rcu() and dropping the initial ref */ | ||
439 | synchronize_rcu(); | ||
440 | 430 | ||
441 | /* | 431 | /* |
442 | * We can't punt to workqueue here because put_ioctx() -> | 432 | * It'd be more correct to do this in free_ioctx(), after all |
443 | * free_ioctx() will unmap the ringbuffer, and that has to be | 433 | * the outstanding kiocbs have finished - but by then io_destroy |
444 | * done in the original process's context. kill_ioctx_rcu/work() | 434 | * has already returned, so io_setup() could potentially return |
445 | * exist for exit_aio(), as in that path free_ioctx() won't do | 435 | * -EAGAIN with no ioctxs actually in use (as far as userspace |
446 | * the unmap. | 436 | * could tell). |
447 | */ | 437 | */ |
448 | kill_ioctx_work(&ctx->rcu_work); | 438 | spin_lock(&aio_nr_lock); |
439 | BUG_ON(aio_nr - ctx->max_reqs > aio_nr); | ||
440 | aio_nr -= ctx->max_reqs; | ||
441 | spin_unlock(&aio_nr_lock); | ||
442 | |||
443 | if (ctx->mmap_size) | ||
444 | vm_munmap(ctx->mmap_base, ctx->mmap_size); | ||
445 | |||
446 | /* Between hlist_del_rcu() and dropping the initial ref */ | ||
447 | call_rcu(&ctx->rcu_head, kill_ioctx_rcu); | ||
449 | } | 448 | } |
450 | } | 449 | } |
451 | 450 | ||
@@ -495,10 +494,7 @@ void exit_aio(struct mm_struct *mm) | |||
495 | */ | 494 | */ |
496 | ctx->mmap_size = 0; | 495 | ctx->mmap_size = 0; |
497 | 496 | ||
498 | if (!atomic_xchg(&ctx->dead, 1)) { | 497 | kill_ioctx(ctx); |
499 | hlist_del_rcu(&ctx->list); | ||
500 | call_rcu(&ctx->rcu_head, kill_ioctx_rcu); | ||
501 | } | ||
502 | } | 498 | } |
503 | } | 499 | } |
504 | 500 | ||
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index e7b3cb5286a5..b8b60b660c8f 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -2859,8 +2859,8 @@ fail_qgroup: | |||
2859 | btrfs_free_qgroup_config(fs_info); | 2859 | btrfs_free_qgroup_config(fs_info); |
2860 | fail_trans_kthread: | 2860 | fail_trans_kthread: |
2861 | kthread_stop(fs_info->transaction_kthread); | 2861 | kthread_stop(fs_info->transaction_kthread); |
2862 | del_fs_roots(fs_info); | ||
2863 | btrfs_cleanup_transaction(fs_info->tree_root); | 2862 | btrfs_cleanup_transaction(fs_info->tree_root); |
2863 | del_fs_roots(fs_info); | ||
2864 | fail_cleaner: | 2864 | fail_cleaner: |
2865 | kthread_stop(fs_info->cleaner_kthread); | 2865 | kthread_stop(fs_info->cleaner_kthread); |
2866 | 2866 | ||
@@ -3512,15 +3512,15 @@ int close_ctree(struct btrfs_root *root) | |||
3512 | percpu_counter_sum(&fs_info->delalloc_bytes)); | 3512 | percpu_counter_sum(&fs_info->delalloc_bytes)); |
3513 | } | 3513 | } |
3514 | 3514 | ||
3515 | free_root_pointers(fs_info, 1); | ||
3516 | |||
3517 | btrfs_free_block_groups(fs_info); | 3515 | btrfs_free_block_groups(fs_info); |
3518 | 3516 | ||
3517 | btrfs_stop_all_workers(fs_info); | ||
3518 | |||
3519 | del_fs_roots(fs_info); | 3519 | del_fs_roots(fs_info); |
3520 | 3520 | ||
3521 | iput(fs_info->btree_inode); | 3521 | free_root_pointers(fs_info, 1); |
3522 | 3522 | ||
3523 | btrfs_stop_all_workers(fs_info); | 3523 | iput(fs_info->btree_inode); |
3524 | 3524 | ||
3525 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY | 3525 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY |
3526 | if (btrfs_test_opt(root, CHECK_INTEGRITY)) | 3526 | if (btrfs_test_opt(root, CHECK_INTEGRITY)) |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index af978f7682b3..17f3064b4a3e 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -8012,6 +8012,9 @@ int btrfs_drop_inode(struct inode *inode) | |||
8012 | { | 8012 | { |
8013 | struct btrfs_root *root = BTRFS_I(inode)->root; | 8013 | struct btrfs_root *root = BTRFS_I(inode)->root; |
8014 | 8014 | ||
8015 | if (root == NULL) | ||
8016 | return 1; | ||
8017 | |||
8015 | /* the snap/subvol tree is on deleting */ | 8018 | /* the snap/subvol tree is on deleting */ |
8016 | if (btrfs_root_refs(&root->root_item) == 0 && | 8019 | if (btrfs_root_refs(&root->root_item) == 0 && |
8017 | root != root->fs_info->tree_root) | 8020 | root != root->fs_info->tree_root) |
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c index 395b82031a42..4febca4fc2de 100644 --- a/fs/btrfs/relocation.c +++ b/fs/btrfs/relocation.c | |||
@@ -4082,7 +4082,7 @@ out: | |||
4082 | return inode; | 4082 | return inode; |
4083 | } | 4083 | } |
4084 | 4084 | ||
4085 | static struct reloc_control *alloc_reloc_control(void) | 4085 | static struct reloc_control *alloc_reloc_control(struct btrfs_fs_info *fs_info) |
4086 | { | 4086 | { |
4087 | struct reloc_control *rc; | 4087 | struct reloc_control *rc; |
4088 | 4088 | ||
@@ -4093,7 +4093,8 @@ static struct reloc_control *alloc_reloc_control(void) | |||
4093 | INIT_LIST_HEAD(&rc->reloc_roots); | 4093 | INIT_LIST_HEAD(&rc->reloc_roots); |
4094 | backref_cache_init(&rc->backref_cache); | 4094 | backref_cache_init(&rc->backref_cache); |
4095 | mapping_tree_init(&rc->reloc_root_tree); | 4095 | mapping_tree_init(&rc->reloc_root_tree); |
4096 | extent_io_tree_init(&rc->processed_blocks, NULL); | 4096 | extent_io_tree_init(&rc->processed_blocks, |
4097 | fs_info->btree_inode->i_mapping); | ||
4097 | return rc; | 4098 | return rc; |
4098 | } | 4099 | } |
4099 | 4100 | ||
@@ -4110,7 +4111,7 @@ int btrfs_relocate_block_group(struct btrfs_root *extent_root, u64 group_start) | |||
4110 | int rw = 0; | 4111 | int rw = 0; |
4111 | int err = 0; | 4112 | int err = 0; |
4112 | 4113 | ||
4113 | rc = alloc_reloc_control(); | 4114 | rc = alloc_reloc_control(fs_info); |
4114 | if (!rc) | 4115 | if (!rc) |
4115 | return -ENOMEM; | 4116 | return -ENOMEM; |
4116 | 4117 | ||
@@ -4311,7 +4312,7 @@ int btrfs_recover_relocation(struct btrfs_root *root) | |||
4311 | if (list_empty(&reloc_roots)) | 4312 | if (list_empty(&reloc_roots)) |
4312 | goto out; | 4313 | goto out; |
4313 | 4314 | ||
4314 | rc = alloc_reloc_control(); | 4315 | rc = alloc_reloc_control(root->fs_info); |
4315 | if (!rc) { | 4316 | if (!rc) { |
4316 | err = -ENOMEM; | 4317 | err = -ENOMEM; |
4317 | goto out; | 4318 | goto out; |
diff --git a/fs/ceph/locks.c b/fs/ceph/locks.c index 202dd3d68be0..ebbf680378e2 100644 --- a/fs/ceph/locks.c +++ b/fs/ceph/locks.c | |||
@@ -191,27 +191,23 @@ void ceph_count_locks(struct inode *inode, int *fcntl_count, int *flock_count) | |||
191 | } | 191 | } |
192 | 192 | ||
193 | /** | 193 | /** |
194 | * Encode the flock and fcntl locks for the given inode into the pagelist. | 194 | * Encode the flock and fcntl locks for the given inode into the ceph_filelock |
195 | * Format is: #fcntl locks, sequential fcntl locks, #flock locks, | 195 | * array. Must be called with lock_flocks() already held. |
196 | * sequential flock locks. | 196 | * If we encounter more of a specific lock type than expected, return -ENOSPC. |
197 | * Must be called with lock_flocks() already held. | ||
198 | * If we encounter more of a specific lock type than expected, | ||
199 | * we return the value 1. | ||
200 | */ | 197 | */ |
201 | int ceph_encode_locks(struct inode *inode, struct ceph_pagelist *pagelist, | 198 | int ceph_encode_locks_to_buffer(struct inode *inode, |
202 | int num_fcntl_locks, int num_flock_locks) | 199 | struct ceph_filelock *flocks, |
200 | int num_fcntl_locks, int num_flock_locks) | ||
203 | { | 201 | { |
204 | struct file_lock *lock; | 202 | struct file_lock *lock; |
205 | struct ceph_filelock cephlock; | ||
206 | int err = 0; | 203 | int err = 0; |
207 | int seen_fcntl = 0; | 204 | int seen_fcntl = 0; |
208 | int seen_flock = 0; | 205 | int seen_flock = 0; |
206 | int l = 0; | ||
209 | 207 | ||
210 | dout("encoding %d flock and %d fcntl locks", num_flock_locks, | 208 | dout("encoding %d flock and %d fcntl locks", num_flock_locks, |
211 | num_fcntl_locks); | 209 | num_fcntl_locks); |
212 | err = ceph_pagelist_append(pagelist, &num_fcntl_locks, sizeof(u32)); | 210 | |
213 | if (err) | ||
214 | goto fail; | ||
215 | for (lock = inode->i_flock; lock != NULL; lock = lock->fl_next) { | 211 | for (lock = inode->i_flock; lock != NULL; lock = lock->fl_next) { |
216 | if (lock->fl_flags & FL_POSIX) { | 212 | if (lock->fl_flags & FL_POSIX) { |
217 | ++seen_fcntl; | 213 | ++seen_fcntl; |
@@ -219,19 +215,12 @@ int ceph_encode_locks(struct inode *inode, struct ceph_pagelist *pagelist, | |||
219 | err = -ENOSPC; | 215 | err = -ENOSPC; |
220 | goto fail; | 216 | goto fail; |
221 | } | 217 | } |
222 | err = lock_to_ceph_filelock(lock, &cephlock); | 218 | err = lock_to_ceph_filelock(lock, &flocks[l]); |
223 | if (err) | 219 | if (err) |
224 | goto fail; | 220 | goto fail; |
225 | err = ceph_pagelist_append(pagelist, &cephlock, | 221 | ++l; |
226 | sizeof(struct ceph_filelock)); | ||
227 | } | 222 | } |
228 | if (err) | ||
229 | goto fail; | ||
230 | } | 223 | } |
231 | |||
232 | err = ceph_pagelist_append(pagelist, &num_flock_locks, sizeof(u32)); | ||
233 | if (err) | ||
234 | goto fail; | ||
235 | for (lock = inode->i_flock; lock != NULL; lock = lock->fl_next) { | 224 | for (lock = inode->i_flock; lock != NULL; lock = lock->fl_next) { |
236 | if (lock->fl_flags & FL_FLOCK) { | 225 | if (lock->fl_flags & FL_FLOCK) { |
237 | ++seen_flock; | 226 | ++seen_flock; |
@@ -239,19 +228,51 @@ int ceph_encode_locks(struct inode *inode, struct ceph_pagelist *pagelist, | |||
239 | err = -ENOSPC; | 228 | err = -ENOSPC; |
240 | goto fail; | 229 | goto fail; |
241 | } | 230 | } |
242 | err = lock_to_ceph_filelock(lock, &cephlock); | 231 | err = lock_to_ceph_filelock(lock, &flocks[l]); |
243 | if (err) | 232 | if (err) |
244 | goto fail; | 233 | goto fail; |
245 | err = ceph_pagelist_append(pagelist, &cephlock, | 234 | ++l; |
246 | sizeof(struct ceph_filelock)); | ||
247 | } | 235 | } |
248 | if (err) | ||
249 | goto fail; | ||
250 | } | 236 | } |
251 | fail: | 237 | fail: |
252 | return err; | 238 | return err; |
253 | } | 239 | } |
254 | 240 | ||
241 | /** | ||
242 | * Copy the encoded flock and fcntl locks into the pagelist. | ||
243 | * Format is: #fcntl locks, sequential fcntl locks, #flock locks, | ||
244 | * sequential flock locks. | ||
245 | * Returns zero on success. | ||
246 | */ | ||
247 | int ceph_locks_to_pagelist(struct ceph_filelock *flocks, | ||
248 | struct ceph_pagelist *pagelist, | ||
249 | int num_fcntl_locks, int num_flock_locks) | ||
250 | { | ||
251 | int err = 0; | ||
252 | __le32 nlocks; | ||
253 | |||
254 | nlocks = cpu_to_le32(num_fcntl_locks); | ||
255 | err = ceph_pagelist_append(pagelist, &nlocks, sizeof(nlocks)); | ||
256 | if (err) | ||
257 | goto out_fail; | ||
258 | |||
259 | err = ceph_pagelist_append(pagelist, flocks, | ||
260 | num_fcntl_locks * sizeof(*flocks)); | ||
261 | if (err) | ||
262 | goto out_fail; | ||
263 | |||
264 | nlocks = cpu_to_le32(num_flock_locks); | ||
265 | err = ceph_pagelist_append(pagelist, &nlocks, sizeof(nlocks)); | ||
266 | if (err) | ||
267 | goto out_fail; | ||
268 | |||
269 | err = ceph_pagelist_append(pagelist, | ||
270 | &flocks[num_fcntl_locks], | ||
271 | num_flock_locks * sizeof(*flocks)); | ||
272 | out_fail: | ||
273 | return err; | ||
274 | } | ||
275 | |||
255 | /* | 276 | /* |
256 | * Given a pointer to a lock, convert it to a ceph filelock | 277 | * Given a pointer to a lock, convert it to a ceph filelock |
257 | */ | 278 | */ |
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 4f22671a5bd4..4d2920304be8 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -2478,39 +2478,44 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap, | |||
2478 | 2478 | ||
2479 | if (recon_state->flock) { | 2479 | if (recon_state->flock) { |
2480 | int num_fcntl_locks, num_flock_locks; | 2480 | int num_fcntl_locks, num_flock_locks; |
2481 | struct ceph_pagelist_cursor trunc_point; | 2481 | struct ceph_filelock *flocks; |
2482 | 2482 | ||
2483 | ceph_pagelist_set_cursor(pagelist, &trunc_point); | 2483 | encode_again: |
2484 | do { | 2484 | lock_flocks(); |
2485 | lock_flocks(); | 2485 | ceph_count_locks(inode, &num_fcntl_locks, &num_flock_locks); |
2486 | ceph_count_locks(inode, &num_fcntl_locks, | 2486 | unlock_flocks(); |
2487 | &num_flock_locks); | 2487 | flocks = kmalloc((num_fcntl_locks+num_flock_locks) * |
2488 | rec.v2.flock_len = (2*sizeof(u32) + | 2488 | sizeof(struct ceph_filelock), GFP_NOFS); |
2489 | (num_fcntl_locks+num_flock_locks) * | 2489 | if (!flocks) { |
2490 | sizeof(struct ceph_filelock)); | 2490 | err = -ENOMEM; |
2491 | unlock_flocks(); | 2491 | goto out_free; |
2492 | 2492 | } | |
2493 | /* pre-alloc pagelist */ | 2493 | lock_flocks(); |
2494 | ceph_pagelist_truncate(pagelist, &trunc_point); | 2494 | err = ceph_encode_locks_to_buffer(inode, flocks, |
2495 | err = ceph_pagelist_append(pagelist, &rec, reclen); | 2495 | num_fcntl_locks, |
2496 | if (!err) | 2496 | num_flock_locks); |
2497 | err = ceph_pagelist_reserve(pagelist, | 2497 | unlock_flocks(); |
2498 | rec.v2.flock_len); | 2498 | if (err) { |
2499 | 2499 | kfree(flocks); | |
2500 | /* encode locks */ | 2500 | if (err == -ENOSPC) |
2501 | if (!err) { | 2501 | goto encode_again; |
2502 | lock_flocks(); | 2502 | goto out_free; |
2503 | err = ceph_encode_locks(inode, | 2503 | } |
2504 | pagelist, | 2504 | /* |
2505 | num_fcntl_locks, | 2505 | * number of encoded locks is stable, so copy to pagelist |
2506 | num_flock_locks); | 2506 | */ |
2507 | unlock_flocks(); | 2507 | rec.v2.flock_len = cpu_to_le32(2*sizeof(u32) + |
2508 | } | 2508 | (num_fcntl_locks+num_flock_locks) * |
2509 | } while (err == -ENOSPC); | 2509 | sizeof(struct ceph_filelock)); |
2510 | err = ceph_pagelist_append(pagelist, &rec, reclen); | ||
2511 | if (!err) | ||
2512 | err = ceph_locks_to_pagelist(flocks, pagelist, | ||
2513 | num_fcntl_locks, | ||
2514 | num_flock_locks); | ||
2515 | kfree(flocks); | ||
2510 | } else { | 2516 | } else { |
2511 | err = ceph_pagelist_append(pagelist, &rec, reclen); | 2517 | err = ceph_pagelist_append(pagelist, &rec, reclen); |
2512 | } | 2518 | } |
2513 | |||
2514 | out_free: | 2519 | out_free: |
2515 | kfree(path); | 2520 | kfree(path); |
2516 | out_dput: | 2521 | out_dput: |
diff --git a/fs/ceph/super.h b/fs/ceph/super.h index 8696be2ff679..7ccfdb4aea2e 100644 --- a/fs/ceph/super.h +++ b/fs/ceph/super.h | |||
@@ -822,8 +822,13 @@ extern const struct export_operations ceph_export_ops; | |||
822 | extern int ceph_lock(struct file *file, int cmd, struct file_lock *fl); | 822 | extern int ceph_lock(struct file *file, int cmd, struct file_lock *fl); |
823 | extern int ceph_flock(struct file *file, int cmd, struct file_lock *fl); | 823 | extern int ceph_flock(struct file *file, int cmd, struct file_lock *fl); |
824 | extern void ceph_count_locks(struct inode *inode, int *p_num, int *f_num); | 824 | extern void ceph_count_locks(struct inode *inode, int *p_num, int *f_num); |
825 | extern int ceph_encode_locks(struct inode *i, struct ceph_pagelist *p, | 825 | extern int ceph_encode_locks_to_buffer(struct inode *inode, |
826 | int p_locks, int f_locks); | 826 | struct ceph_filelock *flocks, |
827 | int num_fcntl_locks, | ||
828 | int num_flock_locks); | ||
829 | extern int ceph_locks_to_pagelist(struct ceph_filelock *flocks, | ||
830 | struct ceph_pagelist *pagelist, | ||
831 | int num_fcntl_locks, int num_flock_locks); | ||
827 | extern int lock_to_ceph_filelock(struct file_lock *fl, struct ceph_filelock *c); | 832 | extern int lock_to_ceph_filelock(struct file_lock *fl, struct ceph_filelock *c); |
828 | 833 | ||
829 | /* debugfs.c */ | 834 | /* debugfs.c */ |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 5b97e56ddbca..e3bc39bb9d12 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -3279,8 +3279,8 @@ build_unc_path_to_root(const struct smb_vol *vol, | |||
3279 | pos = full_path + unc_len; | 3279 | pos = full_path + unc_len; |
3280 | 3280 | ||
3281 | if (pplen) { | 3281 | if (pplen) { |
3282 | *pos++ = CIFS_DIR_SEP(cifs_sb); | 3282 | *pos = CIFS_DIR_SEP(cifs_sb); |
3283 | strncpy(pos, vol->prepath, pplen); | 3283 | strncpy(pos + 1, vol->prepath, pplen); |
3284 | pos += pplen; | 3284 | pos += pplen; |
3285 | } | 3285 | } |
3286 | 3286 | ||
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index 201f0a0d6b0a..a7abbea2c096 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c | |||
@@ -295,6 +295,12 @@ static int ecryptfs_release(struct inode *inode, struct file *file) | |||
295 | static int | 295 | static int |
296 | ecryptfs_fsync(struct file *file, loff_t start, loff_t end, int datasync) | 296 | ecryptfs_fsync(struct file *file, loff_t start, loff_t end, int datasync) |
297 | { | 297 | { |
298 | int rc; | ||
299 | |||
300 | rc = filemap_write_and_wait(file->f_mapping); | ||
301 | if (rc) | ||
302 | return rc; | ||
303 | |||
298 | return vfs_fsync(ecryptfs_file_to_lower(file), datasync); | 304 | return vfs_fsync(ecryptfs_file_to_lower(file), datasync); |
299 | } | 305 | } |
300 | 306 | ||
diff --git a/fs/file_table.c b/fs/file_table.c index cd4d87a82951..485dc0eddd67 100644 --- a/fs/file_table.c +++ b/fs/file_table.c | |||
@@ -306,17 +306,18 @@ void fput(struct file *file) | |||
306 | { | 306 | { |
307 | if (atomic_long_dec_and_test(&file->f_count)) { | 307 | if (atomic_long_dec_and_test(&file->f_count)) { |
308 | struct task_struct *task = current; | 308 | struct task_struct *task = current; |
309 | unsigned long flags; | ||
310 | |||
309 | file_sb_list_del(file); | 311 | file_sb_list_del(file); |
310 | if (unlikely(in_interrupt() || task->flags & PF_KTHREAD)) { | 312 | if (likely(!in_interrupt() && !(task->flags & PF_KTHREAD))) { |
311 | unsigned long flags; | 313 | init_task_work(&file->f_u.fu_rcuhead, ____fput); |
312 | spin_lock_irqsave(&delayed_fput_lock, flags); | 314 | if (!task_work_add(task, &file->f_u.fu_rcuhead, true)) |
313 | list_add(&file->f_u.fu_list, &delayed_fput_list); | 315 | return; |
314 | schedule_work(&delayed_fput_work); | ||
315 | spin_unlock_irqrestore(&delayed_fput_lock, flags); | ||
316 | return; | ||
317 | } | 316 | } |
318 | init_task_work(&file->f_u.fu_rcuhead, ____fput); | 317 | spin_lock_irqsave(&delayed_fput_lock, flags); |
319 | task_work_add(task, &file->f_u.fu_rcuhead, true); | 318 | list_add(&file->f_u.fu_list, &delayed_fput_list); |
319 | schedule_work(&delayed_fput_work); | ||
320 | spin_unlock_irqrestore(&delayed_fput_lock, flags); | ||
320 | } | 321 | } |
321 | } | 322 | } |
322 | 323 | ||
diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index 3027f4dbbab5..e4ba5fe4c3b5 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c | |||
@@ -109,10 +109,14 @@ static void hpfs_write_failed(struct address_space *mapping, loff_t to) | |||
109 | { | 109 | { |
110 | struct inode *inode = mapping->host; | 110 | struct inode *inode = mapping->host; |
111 | 111 | ||
112 | hpfs_lock(inode->i_sb); | ||
113 | |||
112 | if (to > inode->i_size) { | 114 | if (to > inode->i_size) { |
113 | truncate_pagecache(inode, to, inode->i_size); | 115 | truncate_pagecache(inode, to, inode->i_size); |
114 | hpfs_truncate(inode); | 116 | hpfs_truncate(inode); |
115 | } | 117 | } |
118 | |||
119 | hpfs_unlock(inode->i_sb); | ||
116 | } | 120 | } |
117 | 121 | ||
118 | static int hpfs_write_begin(struct file *file, struct address_space *mapping, | 122 | static int hpfs_write_begin(struct file *file, struct address_space *mapping, |
diff --git a/fs/namei.c b/fs/namei.c index 85e40d1c0a8f..9ed9361223c0 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -1976,7 +1976,7 @@ static int path_lookupat(int dfd, const char *name, | |||
1976 | err = complete_walk(nd); | 1976 | err = complete_walk(nd); |
1977 | 1977 | ||
1978 | if (!err && nd->flags & LOOKUP_DIRECTORY) { | 1978 | if (!err && nd->flags & LOOKUP_DIRECTORY) { |
1979 | if (!nd->inode->i_op->lookup) { | 1979 | if (!can_lookup(nd->inode)) { |
1980 | path_put(&nd->path); | 1980 | path_put(&nd->path); |
1981 | err = -ENOTDIR; | 1981 | err = -ENOTDIR; |
1982 | } | 1982 | } |
@@ -2850,7 +2850,7 @@ finish_lookup: | |||
2850 | if ((open_flag & O_CREAT) && S_ISDIR(nd->inode->i_mode)) | 2850 | if ((open_flag & O_CREAT) && S_ISDIR(nd->inode->i_mode)) |
2851 | goto out; | 2851 | goto out; |
2852 | error = -ENOTDIR; | 2852 | error = -ENOTDIR; |
2853 | if ((nd->flags & LOOKUP_DIRECTORY) && !nd->inode->i_op->lookup) | 2853 | if ((nd->flags & LOOKUP_DIRECTORY) && !can_lookup(nd->inode)) |
2854 | goto out; | 2854 | goto out; |
2855 | audit_inode(name, nd->path.dentry, 0); | 2855 | audit_inode(name, nd->path.dentry, 0); |
2856 | finish_open: | 2856 | finish_open: |
diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c index 816326093656..6792ce11f2bf 100644 --- a/fs/ncpfs/dir.c +++ b/fs/ncpfs/dir.c | |||
@@ -1029,15 +1029,6 @@ static int ncp_rmdir(struct inode *dir, struct dentry *dentry) | |||
1029 | DPRINTK("ncp_rmdir: removing %s/%s\n", | 1029 | DPRINTK("ncp_rmdir: removing %s/%s\n", |
1030 | dentry->d_parent->d_name.name, dentry->d_name.name); | 1030 | dentry->d_parent->d_name.name, dentry->d_name.name); |
1031 | 1031 | ||
1032 | /* | ||
1033 | * fail with EBUSY if there are still references to this | ||
1034 | * directory. | ||
1035 | */ | ||
1036 | dentry_unhash(dentry); | ||
1037 | error = -EBUSY; | ||
1038 | if (!d_unhashed(dentry)) | ||
1039 | goto out; | ||
1040 | |||
1041 | len = sizeof(__name); | 1032 | len = sizeof(__name); |
1042 | error = ncp_io2vol(server, __name, &len, dentry->d_name.name, | 1033 | error = ncp_io2vol(server, __name, &len, dentry->d_name.name, |
1043 | dentry->d_name.len, !ncp_preserve_case(dir)); | 1034 | dentry->d_name.len, !ncp_preserve_case(dir)); |
diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c index b3fdd1a323d6..e68588e6b1e8 100644 --- a/fs/ocfs2/dlm/dlmrecovery.c +++ b/fs/ocfs2/dlm/dlmrecovery.c | |||
@@ -1408,6 +1408,7 @@ int dlm_mig_lockres_handler(struct o2net_msg *msg, u32 len, void *data, | |||
1408 | mres->lockname_len, mres->lockname); | 1408 | mres->lockname_len, mres->lockname); |
1409 | ret = -EFAULT; | 1409 | ret = -EFAULT; |
1410 | spin_unlock(&res->spinlock); | 1410 | spin_unlock(&res->spinlock); |
1411 | dlm_lockres_put(res); | ||
1411 | goto leave; | 1412 | goto leave; |
1412 | } | 1413 | } |
1413 | res->state |= DLM_LOCK_RES_MIGRATING; | 1414 | res->state |= DLM_LOCK_RES_MIGRATING; |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index 04ee1b57c243..b4a5cdf9dbc5 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
@@ -947,7 +947,7 @@ leave: | |||
947 | ocfs2_free_dir_lookup_result(&orphan_insert); | 947 | ocfs2_free_dir_lookup_result(&orphan_insert); |
948 | ocfs2_free_dir_lookup_result(&lookup); | 948 | ocfs2_free_dir_lookup_result(&lookup); |
949 | 949 | ||
950 | if (status) | 950 | if (status && (status != -ENOTEMPTY)) |
951 | mlog_errno(status); | 951 | mlog_errno(status); |
952 | 952 | ||
953 | return status; | 953 | return status; |
@@ -2216,7 +2216,7 @@ out: | |||
2216 | 2216 | ||
2217 | brelse(orphan_dir_bh); | 2217 | brelse(orphan_dir_bh); |
2218 | 2218 | ||
2219 | return 0; | 2219 | return ret; |
2220 | } | 2220 | } |
2221 | 2221 | ||
2222 | int ocfs2_create_inode_in_orphan(struct inode *dir, | 2222 | int ocfs2_create_inode_in_orphan(struct inode *dir, |
diff --git a/fs/proc/base.c b/fs/proc/base.c index dd51e50001fe..c3834dad09b3 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -2118,6 +2118,7 @@ static int show_timer(struct seq_file *m, void *v) | |||
2118 | nstr[notify & ~SIGEV_THREAD_ID], | 2118 | nstr[notify & ~SIGEV_THREAD_ID], |
2119 | (notify & SIGEV_THREAD_ID) ? "tid" : "pid", | 2119 | (notify & SIGEV_THREAD_ID) ? "tid" : "pid", |
2120 | pid_nr_ns(timer->it_pid, tp->ns)); | 2120 | pid_nr_ns(timer->it_pid, tp->ns)); |
2121 | seq_printf(m, "ClockID: %d\n", timer->it_clock); | ||
2121 | 2122 | ||
2122 | return 0; | 2123 | return 0; |
2123 | } | 2124 | } |
diff --git a/fs/proc/kmsg.c b/fs/proc/kmsg.c index bd4b5a740ff1..bdfabdaefdce 100644 --- a/fs/proc/kmsg.c +++ b/fs/proc/kmsg.c | |||
@@ -21,12 +21,12 @@ extern wait_queue_head_t log_wait; | |||
21 | 21 | ||
22 | static int kmsg_open(struct inode * inode, struct file * file) | 22 | static int kmsg_open(struct inode * inode, struct file * file) |
23 | { | 23 | { |
24 | return do_syslog(SYSLOG_ACTION_OPEN, NULL, 0, SYSLOG_FROM_FILE); | 24 | return do_syslog(SYSLOG_ACTION_OPEN, NULL, 0, SYSLOG_FROM_PROC); |
25 | } | 25 | } |
26 | 26 | ||
27 | static int kmsg_release(struct inode * inode, struct file * file) | 27 | static int kmsg_release(struct inode * inode, struct file * file) |
28 | { | 28 | { |
29 | (void) do_syslog(SYSLOG_ACTION_CLOSE, NULL, 0, SYSLOG_FROM_FILE); | 29 | (void) do_syslog(SYSLOG_ACTION_CLOSE, NULL, 0, SYSLOG_FROM_PROC); |
30 | return 0; | 30 | return 0; |
31 | } | 31 | } |
32 | 32 | ||
@@ -34,15 +34,15 @@ static ssize_t kmsg_read(struct file *file, char __user *buf, | |||
34 | size_t count, loff_t *ppos) | 34 | size_t count, loff_t *ppos) |
35 | { | 35 | { |
36 | if ((file->f_flags & O_NONBLOCK) && | 36 | if ((file->f_flags & O_NONBLOCK) && |
37 | !do_syslog(SYSLOG_ACTION_SIZE_UNREAD, NULL, 0, SYSLOG_FROM_FILE)) | 37 | !do_syslog(SYSLOG_ACTION_SIZE_UNREAD, NULL, 0, SYSLOG_FROM_PROC)) |
38 | return -EAGAIN; | 38 | return -EAGAIN; |
39 | return do_syslog(SYSLOG_ACTION_READ, buf, count, SYSLOG_FROM_FILE); | 39 | return do_syslog(SYSLOG_ACTION_READ, buf, count, SYSLOG_FROM_PROC); |
40 | } | 40 | } |
41 | 41 | ||
42 | static unsigned int kmsg_poll(struct file *file, poll_table *wait) | 42 | static unsigned int kmsg_poll(struct file *file, poll_table *wait) |
43 | { | 43 | { |
44 | poll_wait(file, &log_wait, wait); | 44 | poll_wait(file, &log_wait, wait); |
45 | if (do_syslog(SYSLOG_ACTION_SIZE_UNREAD, NULL, 0, SYSLOG_FROM_FILE)) | 45 | if (do_syslog(SYSLOG_ACTION_SIZE_UNREAD, NULL, 0, SYSLOG_FROM_PROC)) |
46 | return POLLIN | POLLRDNORM; | 46 | return POLLIN | POLLRDNORM; |
47 | return 0; | 47 | return 0; |
48 | } | 48 | } |
diff --git a/fs/xfs/xfs_attr_leaf.h b/fs/xfs/xfs_attr_leaf.h index f9d7846097e2..444a7704596c 100644 --- a/fs/xfs/xfs_attr_leaf.h +++ b/fs/xfs/xfs_attr_leaf.h | |||
@@ -128,6 +128,7 @@ struct xfs_attr3_leaf_hdr { | |||
128 | __u8 holes; | 128 | __u8 holes; |
129 | __u8 pad1; | 129 | __u8 pad1; |
130 | struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; | 130 | struct xfs_attr_leaf_map freemap[XFS_ATTR_LEAF_MAPSIZE]; |
131 | __be32 pad2; /* 64 bit alignment */ | ||
131 | }; | 132 | }; |
132 | 133 | ||
133 | #define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) | 134 | #define XFS_ATTR3_LEAF_CRC_OFF (offsetof(struct xfs_attr3_leaf_hdr, info.crc)) |
diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 8804b8a3c310..0903960410a2 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c | |||
@@ -2544,7 +2544,17 @@ xfs_btree_new_iroot( | |||
2544 | if (error) | 2544 | if (error) |
2545 | goto error0; | 2545 | goto error0; |
2546 | 2546 | ||
2547 | /* | ||
2548 | * we can't just memcpy() the root in for CRC enabled btree blocks. | ||
2549 | * In that case have to also ensure the blkno remains correct | ||
2550 | */ | ||
2547 | memcpy(cblock, block, xfs_btree_block_len(cur)); | 2551 | memcpy(cblock, block, xfs_btree_block_len(cur)); |
2552 | if (cur->bc_flags & XFS_BTREE_CRC_BLOCKS) { | ||
2553 | if (cur->bc_flags & XFS_BTREE_LONG_PTRS) | ||
2554 | cblock->bb_u.l.bb_blkno = cpu_to_be64(cbp->b_bn); | ||
2555 | else | ||
2556 | cblock->bb_u.s.bb_blkno = cpu_to_be64(cbp->b_bn); | ||
2557 | } | ||
2548 | 2558 | ||
2549 | be16_add_cpu(&block->bb_level, 1); | 2559 | be16_add_cpu(&block->bb_level, 1); |
2550 | xfs_btree_set_numrecs(block, 1); | 2560 | xfs_btree_set_numrecs(block, 1); |
diff --git a/fs/xfs/xfs_dir2_format.h b/fs/xfs/xfs_dir2_format.h index 995f1f505a52..7826782b8d78 100644 --- a/fs/xfs/xfs_dir2_format.h +++ b/fs/xfs/xfs_dir2_format.h | |||
@@ -266,6 +266,7 @@ struct xfs_dir3_blk_hdr { | |||
266 | struct xfs_dir3_data_hdr { | 266 | struct xfs_dir3_data_hdr { |
267 | struct xfs_dir3_blk_hdr hdr; | 267 | struct xfs_dir3_blk_hdr hdr; |
268 | xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; | 268 | xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; |
269 | __be32 pad; /* 64 bit alignment */ | ||
269 | }; | 270 | }; |
270 | 271 | ||
271 | #define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) | 272 | #define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) |
@@ -477,7 +478,7 @@ struct xfs_dir3_leaf_hdr { | |||
477 | struct xfs_da3_blkinfo info; /* header for da routines */ | 478 | struct xfs_da3_blkinfo info; /* header for da routines */ |
478 | __be16 count; /* count of entries */ | 479 | __be16 count; /* count of entries */ |
479 | __be16 stale; /* count of stale entries */ | 480 | __be16 stale; /* count of stale entries */ |
480 | __be32 pad; | 481 | __be32 pad; /* 64 bit alignment */ |
481 | }; | 482 | }; |
482 | 483 | ||
483 | struct xfs_dir3_icleaf_hdr { | 484 | struct xfs_dir3_icleaf_hdr { |
@@ -715,7 +716,7 @@ struct xfs_dir3_free_hdr { | |||
715 | __be32 firstdb; /* db of first entry */ | 716 | __be32 firstdb; /* db of first entry */ |
716 | __be32 nvalid; /* count of valid entries */ | 717 | __be32 nvalid; /* count of valid entries */ |
717 | __be32 nused; /* count of used entries */ | 718 | __be32 nused; /* count of used entries */ |
718 | __be32 pad; /* 64 bit alignment. */ | 719 | __be32 pad; /* 64 bit alignment */ |
719 | }; | 720 | }; |
720 | 721 | ||
721 | struct xfs_dir3_free { | 722 | struct xfs_dir3_free { |
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 45a85ff84da1..7cf5e4eafe28 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
@@ -1845,7 +1845,13 @@ xlog_recover_do_inode_buffer( | |||
1845 | xfs_agino_t *buffer_nextp; | 1845 | xfs_agino_t *buffer_nextp; |
1846 | 1846 | ||
1847 | trace_xfs_log_recover_buf_inode_buf(mp->m_log, buf_f); | 1847 | trace_xfs_log_recover_buf_inode_buf(mp->m_log, buf_f); |
1848 | bp->b_ops = &xfs_inode_buf_ops; | 1848 | |
1849 | /* | ||
1850 | * Post recovery validation only works properly on CRC enabled | ||
1851 | * filesystems. | ||
1852 | */ | ||
1853 | if (xfs_sb_version_hascrc(&mp->m_sb)) | ||
1854 | bp->b_ops = &xfs_inode_buf_ops; | ||
1849 | 1855 | ||
1850 | inodes_per_buf = BBTOB(bp->b_io_length) >> mp->m_sb.sb_inodelog; | 1856 | inodes_per_buf = BBTOB(bp->b_io_length) >> mp->m_sb.sb_inodelog; |
1851 | for (i = 0; i < inodes_per_buf; i++) { | 1857 | for (i = 0; i < inodes_per_buf; i++) { |
@@ -2205,7 +2211,16 @@ xlog_recover_do_reg_buffer( | |||
2205 | /* Shouldn't be any more regions */ | 2211 | /* Shouldn't be any more regions */ |
2206 | ASSERT(i == item->ri_total); | 2212 | ASSERT(i == item->ri_total); |
2207 | 2213 | ||
2208 | xlog_recovery_validate_buf_type(mp, bp, buf_f); | 2214 | /* |
2215 | * We can only do post recovery validation on items on CRC enabled | ||
2216 | * fielsystems as we need to know when the buffer was written to be able | ||
2217 | * to determine if we should have replayed the item. If we replay old | ||
2218 | * metadata over a newer buffer, then it will enter a temporarily | ||
2219 | * inconsistent state resulting in verification failures. Hence for now | ||
2220 | * just avoid the verification stage for non-crc filesystems | ||
2221 | */ | ||
2222 | if (xfs_sb_version_hascrc(&mp->m_sb)) | ||
2223 | xlog_recovery_validate_buf_type(mp, bp, buf_f); | ||
2209 | } | 2224 | } |
2210 | 2225 | ||
2211 | /* | 2226 | /* |
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index f6bfbd734669..e8e310c05097 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
@@ -314,7 +314,8 @@ STATIC int | |||
314 | xfs_mount_validate_sb( | 314 | xfs_mount_validate_sb( |
315 | xfs_mount_t *mp, | 315 | xfs_mount_t *mp, |
316 | xfs_sb_t *sbp, | 316 | xfs_sb_t *sbp, |
317 | bool check_inprogress) | 317 | bool check_inprogress, |
318 | bool check_version) | ||
318 | { | 319 | { |
319 | 320 | ||
320 | /* | 321 | /* |
@@ -337,9 +338,10 @@ xfs_mount_validate_sb( | |||
337 | 338 | ||
338 | /* | 339 | /* |
339 | * Version 5 superblock feature mask validation. Reject combinations the | 340 | * Version 5 superblock feature mask validation. Reject combinations the |
340 | * kernel cannot support up front before checking anything else. | 341 | * kernel cannot support up front before checking anything else. For |
342 | * write validation, we don't need to check feature masks. | ||
341 | */ | 343 | */ |
342 | if (XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) { | 344 | if (check_version && XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) { |
343 | xfs_alert(mp, | 345 | xfs_alert(mp, |
344 | "Version 5 superblock detected. This kernel has EXPERIMENTAL support enabled!\n" | 346 | "Version 5 superblock detected. This kernel has EXPERIMENTAL support enabled!\n" |
345 | "Use of these features in this kernel is at your own risk!"); | 347 | "Use of these features in this kernel is at your own risk!"); |
@@ -675,7 +677,8 @@ xfs_sb_to_disk( | |||
675 | 677 | ||
676 | static int | 678 | static int |
677 | xfs_sb_verify( | 679 | xfs_sb_verify( |
678 | struct xfs_buf *bp) | 680 | struct xfs_buf *bp, |
681 | bool check_version) | ||
679 | { | 682 | { |
680 | struct xfs_mount *mp = bp->b_target->bt_mount; | 683 | struct xfs_mount *mp = bp->b_target->bt_mount; |
681 | struct xfs_sb sb; | 684 | struct xfs_sb sb; |
@@ -686,7 +689,8 @@ xfs_sb_verify( | |||
686 | * Only check the in progress field for the primary superblock as | 689 | * Only check the in progress field for the primary superblock as |
687 | * mkfs.xfs doesn't clear it from secondary superblocks. | 690 | * mkfs.xfs doesn't clear it from secondary superblocks. |
688 | */ | 691 | */ |
689 | return xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR); | 692 | return xfs_mount_validate_sb(mp, &sb, bp->b_bn == XFS_SB_DADDR, |
693 | check_version); | ||
690 | } | 694 | } |
691 | 695 | ||
692 | /* | 696 | /* |
@@ -719,7 +723,7 @@ xfs_sb_read_verify( | |||
719 | goto out_error; | 723 | goto out_error; |
720 | } | 724 | } |
721 | } | 725 | } |
722 | error = xfs_sb_verify(bp); | 726 | error = xfs_sb_verify(bp, true); |
723 | 727 | ||
724 | out_error: | 728 | out_error: |
725 | if (error) { | 729 | if (error) { |
@@ -758,7 +762,7 @@ xfs_sb_write_verify( | |||
758 | struct xfs_buf_log_item *bip = bp->b_fspriv; | 762 | struct xfs_buf_log_item *bip = bp->b_fspriv; |
759 | int error; | 763 | int error; |
760 | 764 | ||
761 | error = xfs_sb_verify(bp); | 765 | error = xfs_sb_verify(bp, false); |
762 | if (error) { | 766 | if (error) { |
763 | XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); | 767 | XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bp->b_addr); |
764 | xfs_buf_ioerror(bp, error); | 768 | xfs_buf_ioerror(bp, error); |
diff --git a/include/asm-generic/kvm_para.h b/include/asm-generic/kvm_para.h index 9d96605f160a..fa25becbdcaf 100644 --- a/include/asm-generic/kvm_para.h +++ b/include/asm-generic/kvm_para.h | |||
@@ -18,4 +18,9 @@ static inline unsigned int kvm_arch_para_features(void) | |||
18 | return 0; | 18 | return 0; |
19 | } | 19 | } |
20 | 20 | ||
21 | static inline bool kvm_para_available(void) | ||
22 | { | ||
23 | return false; | ||
24 | } | ||
25 | |||
21 | #endif | 26 | #endif |
diff --git a/include/linux/cpu.h b/include/linux/cpu.h index c6f6e0839b61..9f3c7e81270a 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h | |||
@@ -175,6 +175,8 @@ extern struct bus_type cpu_subsys; | |||
175 | 175 | ||
176 | extern void get_online_cpus(void); | 176 | extern void get_online_cpus(void); |
177 | extern void put_online_cpus(void); | 177 | extern void put_online_cpus(void); |
178 | extern void cpu_hotplug_disable(void); | ||
179 | extern void cpu_hotplug_enable(void); | ||
178 | #define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri) | 180 | #define hotcpu_notifier(fn, pri) cpu_notifier(fn, pri) |
179 | #define register_hotcpu_notifier(nb) register_cpu_notifier(nb) | 181 | #define register_hotcpu_notifier(nb) register_cpu_notifier(nb) |
180 | #define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) | 182 | #define unregister_hotcpu_notifier(nb) unregister_cpu_notifier(nb) |
@@ -198,6 +200,8 @@ static inline void cpu_hotplug_driver_unlock(void) | |||
198 | 200 | ||
199 | #define get_online_cpus() do { } while (0) | 201 | #define get_online_cpus() do { } while (0) |
200 | #define put_online_cpus() do { } while (0) | 202 | #define put_online_cpus() do { } while (0) |
203 | #define cpu_hotplug_disable() do { } while (0) | ||
204 | #define cpu_hotplug_enable() do { } while (0) | ||
201 | #define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0) | 205 | #define hotcpu_notifier(fn, pri) do { (void)(fn); } while (0) |
202 | /* These aren't inline functions due to a GCC bug. */ | 206 | /* These aren't inline functions due to a GCC bug. */ |
203 | #define register_hotcpu_notifier(nb) ({ (void)(nb); 0; }) | 207 | #define register_hotcpu_notifier(nb) ({ (void)(nb); 0; }) |
diff --git a/include/linux/filter.h b/include/linux/filter.h index 56a6b7fbb3c6..a6ac84871d6d 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h | |||
@@ -46,6 +46,7 @@ extern int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk); | |||
46 | extern int sk_detach_filter(struct sock *sk); | 46 | extern int sk_detach_filter(struct sock *sk); |
47 | extern int sk_chk_filter(struct sock_filter *filter, unsigned int flen); | 47 | extern int sk_chk_filter(struct sock_filter *filter, unsigned int flen); |
48 | extern int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, unsigned len); | 48 | extern int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, unsigned len); |
49 | extern void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to); | ||
49 | 50 | ||
50 | #ifdef CONFIG_BPF_JIT | 51 | #ifdef CONFIG_BPF_JIT |
51 | #include <stdarg.h> | 52 | #include <stdarg.h> |
diff --git a/include/linux/if_team.h b/include/linux/if_team.h index b662045a81c0..f6156f91eb1c 100644 --- a/include/linux/if_team.h +++ b/include/linux/if_team.h | |||
@@ -260,12 +260,12 @@ team_get_first_port_txable_rcu(struct team *team, struct team_port *port) | |||
260 | return port; | 260 | return port; |
261 | cur = port; | 261 | cur = port; |
262 | list_for_each_entry_continue_rcu(cur, &team->port_list, list) | 262 | list_for_each_entry_continue_rcu(cur, &team->port_list, list) |
263 | if (team_port_txable(port)) | 263 | if (team_port_txable(cur)) |
264 | return cur; | 264 | return cur; |
265 | list_for_each_entry_rcu(cur, &team->port_list, list) { | 265 | list_for_each_entry_rcu(cur, &team->port_list, list) { |
266 | if (cur == port) | 266 | if (cur == port) |
267 | break; | 267 | break; |
268 | if (team_port_txable(port)) | 268 | if (team_port_txable(cur)) |
269 | return cur; | 269 | return cur; |
270 | } | 270 | } |
271 | return NULL; | 271 | return NULL; |
diff --git a/include/linux/math64.h b/include/linux/math64.h index b8ba85544721..2913b86eb12a 100644 --- a/include/linux/math64.h +++ b/include/linux/math64.h | |||
@@ -6,7 +6,8 @@ | |||
6 | 6 | ||
7 | #if BITS_PER_LONG == 64 | 7 | #if BITS_PER_LONG == 64 |
8 | 8 | ||
9 | #define div64_long(x,y) div64_s64((x),(y)) | 9 | #define div64_long(x, y) div64_s64((x), (y)) |
10 | #define div64_ul(x, y) div64_u64((x), (y)) | ||
10 | 11 | ||
11 | /** | 12 | /** |
12 | * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder | 13 | * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder |
@@ -47,7 +48,8 @@ static inline s64 div64_s64(s64 dividend, s64 divisor) | |||
47 | 48 | ||
48 | #elif BITS_PER_LONG == 32 | 49 | #elif BITS_PER_LONG == 32 |
49 | 50 | ||
50 | #define div64_long(x,y) div_s64((x),(y)) | 51 | #define div64_long(x, y) div_s64((x), (y)) |
52 | #define div64_ul(x, y) div_u64((x), (y)) | ||
51 | 53 | ||
52 | #ifndef div_u64_rem | 54 | #ifndef div_u64_rem |
53 | static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) | 55 | static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) |
diff --git a/include/linux/rculist.h b/include/linux/rculist.h index 8089e35d47ac..f4b1001a4676 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h | |||
@@ -461,6 +461,26 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, | |||
461 | &(pos)->member)), typeof(*(pos)), member)) | 461 | &(pos)->member)), typeof(*(pos)), member)) |
462 | 462 | ||
463 | /** | 463 | /** |
464 | * hlist_for_each_entry_rcu_notrace - iterate over rcu list of given type (for tracing) | ||
465 | * @pos: the type * to use as a loop cursor. | ||
466 | * @head: the head for your list. | ||
467 | * @member: the name of the hlist_node within the struct. | ||
468 | * | ||
469 | * This list-traversal primitive may safely run concurrently with | ||
470 | * the _rcu list-mutation primitives such as hlist_add_head_rcu() | ||
471 | * as long as the traversal is guarded by rcu_read_lock(). | ||
472 | * | ||
473 | * This is the same as hlist_for_each_entry_rcu() except that it does | ||
474 | * not do any RCU debugging or tracing. | ||
475 | */ | ||
476 | #define hlist_for_each_entry_rcu_notrace(pos, head, member) \ | ||
477 | for (pos = hlist_entry_safe (rcu_dereference_raw_notrace(hlist_first_rcu(head)),\ | ||
478 | typeof(*(pos)), member); \ | ||
479 | pos; \ | ||
480 | pos = hlist_entry_safe(rcu_dereference_raw_notrace(hlist_next_rcu(\ | ||
481 | &(pos)->member)), typeof(*(pos)), member)) | ||
482 | |||
483 | /** | ||
464 | * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type | 484 | * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type |
465 | * @pos: the type * to use as a loop cursor. | 485 | * @pos: the type * to use as a loop cursor. |
466 | * @head: the head for your list. | 486 | * @head: the head for your list. |
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 4ccd68e49b00..ddcc7826d907 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
@@ -640,6 +640,15 @@ static inline void rcu_preempt_sleep_check(void) | |||
640 | 640 | ||
641 | #define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/ | 641 | #define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/ |
642 | 642 | ||
643 | /* | ||
644 | * The tracing infrastructure traces RCU (we want that), but unfortunately | ||
645 | * some of the RCU checks causes tracing to lock up the system. | ||
646 | * | ||
647 | * The tracing version of rcu_dereference_raw() must not call | ||
648 | * rcu_read_lock_held(). | ||
649 | */ | ||
650 | #define rcu_dereference_raw_notrace(p) __rcu_dereference_check((p), 1, __rcu) | ||
651 | |||
643 | /** | 652 | /** |
644 | * rcu_access_index() - fetch RCU index with no dereferencing | 653 | * rcu_access_index() - fetch RCU index with no dereferencing |
645 | * @p: The index to read | 654 | * @p: The index to read |
diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index 5951e3f38878..26806775b11b 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h | |||
@@ -111,6 +111,9 @@ static inline struct page *sg_page(struct scatterlist *sg) | |||
111 | static inline void sg_set_buf(struct scatterlist *sg, const void *buf, | 111 | static inline void sg_set_buf(struct scatterlist *sg, const void *buf, |
112 | unsigned int buflen) | 112 | unsigned int buflen) |
113 | { | 113 | { |
114 | #ifdef CONFIG_DEBUG_SG | ||
115 | BUG_ON(!virt_addr_valid(buf)); | ||
116 | #endif | ||
114 | sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf)); | 117 | sg_set_page(sg, virt_to_page(buf), buflen, offset_in_page(buf)); |
115 | } | 118 | } |
116 | 119 | ||
diff --git a/include/linux/smp.h b/include/linux/smp.h index e6564c1dc552..c8488763277f 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <linux/list.h> | 11 | #include <linux/list.h> |
12 | #include <linux/cpumask.h> | 12 | #include <linux/cpumask.h> |
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/irqflags.h> | ||
14 | 15 | ||
15 | extern void cpu_idle(void); | 16 | extern void cpu_idle(void); |
16 | 17 | ||
@@ -139,13 +140,17 @@ static inline int up_smp_call_function(smp_call_func_t func, void *info) | |||
139 | } | 140 | } |
140 | #define smp_call_function(func, info, wait) \ | 141 | #define smp_call_function(func, info, wait) \ |
141 | (up_smp_call_function(func, info)) | 142 | (up_smp_call_function(func, info)) |
142 | #define on_each_cpu(func,info,wait) \ | 143 | |
143 | ({ \ | 144 | static inline int on_each_cpu(smp_call_func_t func, void *info, int wait) |
144 | local_irq_disable(); \ | 145 | { |
145 | func(info); \ | 146 | unsigned long flags; |
146 | local_irq_enable(); \ | 147 | |
147 | 0; \ | 148 | local_irq_save(flags); |
148 | }) | 149 | func(info); |
150 | local_irq_restore(flags); | ||
151 | return 0; | ||
152 | } | ||
153 | |||
149 | /* | 154 | /* |
150 | * Note we still need to test the mask even for UP | 155 | * Note we still need to test the mask even for UP |
151 | * because we actually can get an empty mask from | 156 | * because we actually can get an empty mask from |
diff --git a/include/linux/swapops.h b/include/linux/swapops.h index 47ead515c811..c5fd30d2a415 100644 --- a/include/linux/swapops.h +++ b/include/linux/swapops.h | |||
@@ -137,6 +137,7 @@ static inline void make_migration_entry_read(swp_entry_t *entry) | |||
137 | 137 | ||
138 | extern void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, | 138 | extern void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, |
139 | unsigned long address); | 139 | unsigned long address); |
140 | extern void migration_entry_wait_huge(struct mm_struct *mm, pte_t *pte); | ||
140 | #else | 141 | #else |
141 | 142 | ||
142 | #define make_migration_entry(page, write) swp_entry(0, 0) | 143 | #define make_migration_entry(page, write) swp_entry(0, 0) |
@@ -148,6 +149,8 @@ static inline int is_migration_entry(swp_entry_t swp) | |||
148 | static inline void make_migration_entry_read(swp_entry_t *entryp) { } | 149 | static inline void make_migration_entry_read(swp_entry_t *entryp) { } |
149 | static inline void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, | 150 | static inline void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, |
150 | unsigned long address) { } | 151 | unsigned long address) { } |
152 | static inline void migration_entry_wait_huge(struct mm_struct *mm, | ||
153 | pte_t *pte) { } | ||
151 | static inline int is_write_migration_entry(swp_entry_t entry) | 154 | static inline int is_write_migration_entry(swp_entry_t entry) |
152 | { | 155 | { |
153 | return 0; | 156 | return 0; |
diff --git a/include/linux/syslog.h b/include/linux/syslog.h index 38911391a139..98a3153c0f96 100644 --- a/include/linux/syslog.h +++ b/include/linux/syslog.h | |||
@@ -44,8 +44,8 @@ | |||
44 | /* Return size of the log buffer */ | 44 | /* Return size of the log buffer */ |
45 | #define SYSLOG_ACTION_SIZE_BUFFER 10 | 45 | #define SYSLOG_ACTION_SIZE_BUFFER 10 |
46 | 46 | ||
47 | #define SYSLOG_FROM_CALL 0 | 47 | #define SYSLOG_FROM_READER 0 |
48 | #define SYSLOG_FROM_FILE 1 | 48 | #define SYSLOG_FROM_PROC 1 |
49 | 49 | ||
50 | int do_syslog(int type, char __user *buf, int count, bool from_file); | 50 | int do_syslog(int type, char __user *buf, int count, bool from_file); |
51 | 51 | ||
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 2f322c38bd4d..f8e084d0fc77 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
@@ -145,8 +145,8 @@ static inline void tracepoint_synchronize_unregister(void) | |||
145 | TP_PROTO(data_proto), \ | 145 | TP_PROTO(data_proto), \ |
146 | TP_ARGS(data_args), \ | 146 | TP_ARGS(data_args), \ |
147 | TP_CONDITION(cond), \ | 147 | TP_CONDITION(cond), \ |
148 | rcu_idle_exit(), \ | 148 | rcu_irq_enter(), \ |
149 | rcu_idle_enter()); \ | 149 | rcu_irq_exit()); \ |
150 | } | 150 | } |
151 | #else | 151 | #else |
152 | #define __DECLARE_TRACE_RCU(name, proto, args, cond, data_proto, data_args) | 152 | #define __DECLARE_TRACE_RCU(name, proto, args, cond, data_proto, data_args) |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 35a57cd1704c..7cb6d360d147 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
@@ -1117,6 +1117,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event); | |||
1117 | int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); | 1117 | int mgmt_control(struct sock *sk, struct msghdr *msg, size_t len); |
1118 | int mgmt_index_added(struct hci_dev *hdev); | 1118 | int mgmt_index_added(struct hci_dev *hdev); |
1119 | int mgmt_index_removed(struct hci_dev *hdev); | 1119 | int mgmt_index_removed(struct hci_dev *hdev); |
1120 | int mgmt_set_powered_failed(struct hci_dev *hdev, int err); | ||
1120 | int mgmt_powered(struct hci_dev *hdev, u8 powered); | 1121 | int mgmt_powered(struct hci_dev *hdev, u8 powered); |
1121 | int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable); | 1122 | int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable); |
1122 | int mgmt_connectable(struct hci_dev *hdev, u8 connectable); | 1123 | int mgmt_connectable(struct hci_dev *hdev, u8 connectable); |
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h index 22980a7c3873..9944c3e68c5d 100644 --- a/include/net/bluetooth/mgmt.h +++ b/include/net/bluetooth/mgmt.h | |||
@@ -42,6 +42,7 @@ | |||
42 | #define MGMT_STATUS_NOT_POWERED 0x0f | 42 | #define MGMT_STATUS_NOT_POWERED 0x0f |
43 | #define MGMT_STATUS_CANCELLED 0x10 | 43 | #define MGMT_STATUS_CANCELLED 0x10 |
44 | #define MGMT_STATUS_INVALID_INDEX 0x11 | 44 | #define MGMT_STATUS_INVALID_INDEX 0x11 |
45 | #define MGMT_STATUS_RFKILLED 0x12 | ||
45 | 46 | ||
46 | struct mgmt_hdr { | 47 | struct mgmt_hdr { |
47 | __le16 opcode; | 48 | __le16 opcode; |
diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h index 40b4dfce01fc..1be442f89406 100644 --- a/include/net/ip_tunnels.h +++ b/include/net/ip_tunnels.h | |||
@@ -95,10 +95,10 @@ struct ip_tunnel_net { | |||
95 | int ip_tunnel_init(struct net_device *dev); | 95 | int ip_tunnel_init(struct net_device *dev); |
96 | void ip_tunnel_uninit(struct net_device *dev); | 96 | void ip_tunnel_uninit(struct net_device *dev); |
97 | void ip_tunnel_dellink(struct net_device *dev, struct list_head *head); | 97 | void ip_tunnel_dellink(struct net_device *dev, struct list_head *head); |
98 | int __net_init ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, | 98 | int ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, |
99 | struct rtnl_link_ops *ops, char *devname); | 99 | struct rtnl_link_ops *ops, char *devname); |
100 | 100 | ||
101 | void __net_exit ip_tunnel_delete_net(struct ip_tunnel_net *itn); | 101 | void ip_tunnel_delete_net(struct ip_tunnel_net *itn); |
102 | 102 | ||
103 | void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | 103 | void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, |
104 | const struct iphdr *tnl_params, const u8 protocol); | 104 | const struct iphdr *tnl_params, const u8 protocol); |
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h index d4609029f014..385c6329a967 100644 --- a/include/sound/soc-dapm.h +++ b/include/sound/soc-dapm.h | |||
@@ -450,7 +450,8 @@ enum snd_soc_dapm_type { | |||
450 | snd_soc_dapm_aif_in, /* audio interface input */ | 450 | snd_soc_dapm_aif_in, /* audio interface input */ |
451 | snd_soc_dapm_aif_out, /* audio interface output */ | 451 | snd_soc_dapm_aif_out, /* audio interface output */ |
452 | snd_soc_dapm_siggen, /* signal generator */ | 452 | snd_soc_dapm_siggen, /* signal generator */ |
453 | snd_soc_dapm_dai, /* link to DAI structure */ | 453 | snd_soc_dapm_dai_in, /* link to DAI structure */ |
454 | snd_soc_dapm_dai_out, | ||
454 | snd_soc_dapm_dai_link, /* link between two DAI structures */ | 455 | snd_soc_dapm_dai_link, /* link between two DAI structures */ |
455 | }; | 456 | }; |
456 | 457 | ||
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h index a5c86fc34a37..d88c8ee00c8b 100644 --- a/include/uapi/linux/kvm.h +++ b/include/uapi/linux/kvm.h | |||
@@ -783,6 +783,7 @@ struct kvm_dirty_tlb { | |||
783 | #define KVM_REG_IA64 0x3000000000000000ULL | 783 | #define KVM_REG_IA64 0x3000000000000000ULL |
784 | #define KVM_REG_ARM 0x4000000000000000ULL | 784 | #define KVM_REG_ARM 0x4000000000000000ULL |
785 | #define KVM_REG_S390 0x5000000000000000ULL | 785 | #define KVM_REG_S390 0x5000000000000000ULL |
786 | #define KVM_REG_MIPS 0x7000000000000000ULL | ||
786 | 787 | ||
787 | #define KVM_REG_SIZE_SHIFT 52 | 788 | #define KVM_REG_SIZE_SHIFT 52 |
788 | #define KVM_REG_SIZE_MASK 0x00f0000000000000ULL | 789 | #define KVM_REG_SIZE_MASK 0x00f0000000000000ULL |
diff --git a/init/Kconfig b/init/Kconfig index 9d3a7887a6d3..2d9b83104dcf 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -431,6 +431,7 @@ choice | |||
431 | config TREE_RCU | 431 | config TREE_RCU |
432 | bool "Tree-based hierarchical RCU" | 432 | bool "Tree-based hierarchical RCU" |
433 | depends on !PREEMPT && SMP | 433 | depends on !PREEMPT && SMP |
434 | select IRQ_WORK | ||
434 | help | 435 | help |
435 | This option selects the RCU implementation that is | 436 | This option selects the RCU implementation that is |
436 | designed for very large SMP system with hundreds or | 437 | designed for very large SMP system with hundreds or |
diff --git a/kernel/audit.c b/kernel/audit.c index 21c7fa615bd3..91e53d04b6a9 100644 --- a/kernel/audit.c +++ b/kernel/audit.c | |||
@@ -1056,7 +1056,7 @@ static inline void audit_get_stamp(struct audit_context *ctx, | |||
1056 | static void wait_for_auditd(unsigned long sleep_time) | 1056 | static void wait_for_auditd(unsigned long sleep_time) |
1057 | { | 1057 | { |
1058 | DECLARE_WAITQUEUE(wait, current); | 1058 | DECLARE_WAITQUEUE(wait, current); |
1059 | set_current_state(TASK_INTERRUPTIBLE); | 1059 | set_current_state(TASK_UNINTERRUPTIBLE); |
1060 | add_wait_queue(&audit_backlog_wait, &wait); | 1060 | add_wait_queue(&audit_backlog_wait, &wait); |
1061 | 1061 | ||
1062 | if (audit_backlog_limit && | 1062 | if (audit_backlog_limit && |
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c index a291aa23fb3f..43c307dc9453 100644 --- a/kernel/audit_tree.c +++ b/kernel/audit_tree.c | |||
@@ -658,6 +658,7 @@ int audit_add_tree_rule(struct audit_krule *rule) | |||
658 | struct vfsmount *mnt; | 658 | struct vfsmount *mnt; |
659 | int err; | 659 | int err; |
660 | 660 | ||
661 | rule->tree = NULL; | ||
661 | list_for_each_entry(tree, &tree_list, list) { | 662 | list_for_each_entry(tree, &tree_list, list) { |
662 | if (!strcmp(seed->pathname, tree->pathname)) { | 663 | if (!strcmp(seed->pathname, tree->pathname)) { |
663 | put_tree(seed); | 664 | put_tree(seed); |
diff --git a/kernel/cpu.c b/kernel/cpu.c index b5e4ab2d427e..198a38883e64 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
@@ -133,6 +133,27 @@ static void cpu_hotplug_done(void) | |||
133 | mutex_unlock(&cpu_hotplug.lock); | 133 | mutex_unlock(&cpu_hotplug.lock); |
134 | } | 134 | } |
135 | 135 | ||
136 | /* | ||
137 | * Wait for currently running CPU hotplug operations to complete (if any) and | ||
138 | * disable future CPU hotplug (from sysfs). The 'cpu_add_remove_lock' protects | ||
139 | * the 'cpu_hotplug_disabled' flag. The same lock is also acquired by the | ||
140 | * hotplug path before performing hotplug operations. So acquiring that lock | ||
141 | * guarantees mutual exclusion from any currently running hotplug operations. | ||
142 | */ | ||
143 | void cpu_hotplug_disable(void) | ||
144 | { | ||
145 | cpu_maps_update_begin(); | ||
146 | cpu_hotplug_disabled = 1; | ||
147 | cpu_maps_update_done(); | ||
148 | } | ||
149 | |||
150 | void cpu_hotplug_enable(void) | ||
151 | { | ||
152 | cpu_maps_update_begin(); | ||
153 | cpu_hotplug_disabled = 0; | ||
154 | cpu_maps_update_done(); | ||
155 | } | ||
156 | |||
136 | #else /* #if CONFIG_HOTPLUG_CPU */ | 157 | #else /* #if CONFIG_HOTPLUG_CPU */ |
137 | static void cpu_hotplug_begin(void) {} | 158 | static void cpu_hotplug_begin(void) {} |
138 | static void cpu_hotplug_done(void) {} | 159 | static void cpu_hotplug_done(void) {} |
@@ -541,36 +562,6 @@ static int __init alloc_frozen_cpus(void) | |||
541 | core_initcall(alloc_frozen_cpus); | 562 | core_initcall(alloc_frozen_cpus); |
542 | 563 | ||
543 | /* | 564 | /* |
544 | * Prevent regular CPU hotplug from racing with the freezer, by disabling CPU | ||
545 | * hotplug when tasks are about to be frozen. Also, don't allow the freezer | ||
546 | * to continue until any currently running CPU hotplug operation gets | ||
547 | * completed. | ||
548 | * To modify the 'cpu_hotplug_disabled' flag, we need to acquire the | ||
549 | * 'cpu_add_remove_lock'. And this same lock is also taken by the regular | ||
550 | * CPU hotplug path and released only after it is complete. Thus, we | ||
551 | * (and hence the freezer) will block here until any currently running CPU | ||
552 | * hotplug operation gets completed. | ||
553 | */ | ||
554 | void cpu_hotplug_disable_before_freeze(void) | ||
555 | { | ||
556 | cpu_maps_update_begin(); | ||
557 | cpu_hotplug_disabled = 1; | ||
558 | cpu_maps_update_done(); | ||
559 | } | ||
560 | |||
561 | |||
562 | /* | ||
563 | * When tasks have been thawed, re-enable regular CPU hotplug (which had been | ||
564 | * disabled while beginning to freeze tasks). | ||
565 | */ | ||
566 | void cpu_hotplug_enable_after_thaw(void) | ||
567 | { | ||
568 | cpu_maps_update_begin(); | ||
569 | cpu_hotplug_disabled = 0; | ||
570 | cpu_maps_update_done(); | ||
571 | } | ||
572 | |||
573 | /* | ||
574 | * When callbacks for CPU hotplug notifications are being executed, we must | 565 | * When callbacks for CPU hotplug notifications are being executed, we must |
575 | * ensure that the state of the system with respect to the tasks being frozen | 566 | * ensure that the state of the system with respect to the tasks being frozen |
576 | * or not, as reported by the notification, remains unchanged *throughout the | 567 | * or not, as reported by the notification, remains unchanged *throughout the |
@@ -589,12 +580,12 @@ cpu_hotplug_pm_callback(struct notifier_block *nb, | |||
589 | 580 | ||
590 | case PM_SUSPEND_PREPARE: | 581 | case PM_SUSPEND_PREPARE: |
591 | case PM_HIBERNATION_PREPARE: | 582 | case PM_HIBERNATION_PREPARE: |
592 | cpu_hotplug_disable_before_freeze(); | 583 | cpu_hotplug_disable(); |
593 | break; | 584 | break; |
594 | 585 | ||
595 | case PM_POST_SUSPEND: | 586 | case PM_POST_SUSPEND: |
596 | case PM_POST_HIBERNATION: | 587 | case PM_POST_HIBERNATION: |
597 | cpu_hotplug_enable_after_thaw(); | 588 | cpu_hotplug_enable(); |
598 | break; | 589 | break; |
599 | 590 | ||
600 | default: | 591 | default: |
diff --git a/kernel/exit.c b/kernel/exit.c index af2eb3cbd499..7bb73f9d09db 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -649,7 +649,6 @@ static void exit_notify(struct task_struct *tsk, int group_dead) | |||
649 | * jobs, send them a SIGHUP and then a SIGCONT. (POSIX 3.2.2.2) | 649 | * jobs, send them a SIGHUP and then a SIGCONT. (POSIX 3.2.2.2) |
650 | */ | 650 | */ |
651 | forget_original_parent(tsk); | 651 | forget_original_parent(tsk); |
652 | exit_task_namespaces(tsk); | ||
653 | 652 | ||
654 | write_lock_irq(&tasklist_lock); | 653 | write_lock_irq(&tasklist_lock); |
655 | if (group_dead) | 654 | if (group_dead) |
@@ -795,6 +794,7 @@ void do_exit(long code) | |||
795 | exit_shm(tsk); | 794 | exit_shm(tsk); |
796 | exit_files(tsk); | 795 | exit_files(tsk); |
797 | exit_fs(tsk); | 796 | exit_fs(tsk); |
797 | exit_task_namespaces(tsk); | ||
798 | exit_task_work(tsk); | 798 | exit_task_work(tsk); |
799 | check_stack_usage(); | 799 | check_stack_usage(); |
800 | exit_thread(); | 800 | exit_thread(); |
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index 5a83dde8ca0c..54a4d5223238 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c | |||
@@ -143,7 +143,10 @@ static unsigned int irq_domain_legacy_revmap(struct irq_domain *domain, | |||
143 | * irq_domain_add_simple() - Allocate and register a simple irq_domain. | 143 | * irq_domain_add_simple() - Allocate and register a simple irq_domain. |
144 | * @of_node: pointer to interrupt controller's device tree node. | 144 | * @of_node: pointer to interrupt controller's device tree node. |
145 | * @size: total number of irqs in mapping | 145 | * @size: total number of irqs in mapping |
146 | * @first_irq: first number of irq block assigned to the domain | 146 | * @first_irq: first number of irq block assigned to the domain, |
147 | * pass zero to assign irqs on-the-fly. This will result in a | ||
148 | * linear IRQ domain so it is important to use irq_create_mapping() | ||
149 | * for each used IRQ, especially when SPARSE_IRQ is enabled. | ||
147 | * @ops: map/unmap domain callbacks | 150 | * @ops: map/unmap domain callbacks |
148 | * @host_data: Controller private data pointer | 151 | * @host_data: Controller private data pointer |
149 | * | 152 | * |
@@ -191,6 +194,7 @@ struct irq_domain *irq_domain_add_simple(struct device_node *of_node, | |||
191 | /* A linear domain is the default */ | 194 | /* A linear domain is the default */ |
192 | return irq_domain_add_linear(of_node, size, ops, host_data); | 195 | return irq_domain_add_linear(of_node, size, ops, host_data); |
193 | } | 196 | } |
197 | EXPORT_SYMBOL_GPL(irq_domain_add_simple); | ||
194 | 198 | ||
195 | /** | 199 | /** |
196 | * irq_domain_add_legacy() - Allocate and register a legacy revmap irq_domain. | 200 | * irq_domain_add_legacy() - Allocate and register a legacy revmap irq_domain. |
@@ -397,11 +401,12 @@ static void irq_domain_disassociate_many(struct irq_domain *domain, | |||
397 | while (count--) { | 401 | while (count--) { |
398 | int irq = irq_base + count; | 402 | int irq = irq_base + count; |
399 | struct irq_data *irq_data = irq_get_irq_data(irq); | 403 | struct irq_data *irq_data = irq_get_irq_data(irq); |
400 | irq_hw_number_t hwirq = irq_data->hwirq; | 404 | irq_hw_number_t hwirq; |
401 | 405 | ||
402 | if (WARN_ON(!irq_data || irq_data->domain != domain)) | 406 | if (WARN_ON(!irq_data || irq_data->domain != domain)) |
403 | continue; | 407 | continue; |
404 | 408 | ||
409 | hwirq = irq_data->hwirq; | ||
405 | irq_set_status_flags(irq, IRQ_NOREQUEST); | 410 | irq_set_status_flags(irq, IRQ_NOREQUEST); |
406 | 411 | ||
407 | /* remove chip and handler */ | 412 | /* remove chip and handler */ |
diff --git a/kernel/printk.c b/kernel/printk.c index fa36e1494420..8212c1aef125 100644 --- a/kernel/printk.c +++ b/kernel/printk.c | |||
@@ -363,6 +363,53 @@ static void log_store(int facility, int level, | |||
363 | log_next_seq++; | 363 | log_next_seq++; |
364 | } | 364 | } |
365 | 365 | ||
366 | #ifdef CONFIG_SECURITY_DMESG_RESTRICT | ||
367 | int dmesg_restrict = 1; | ||
368 | #else | ||
369 | int dmesg_restrict; | ||
370 | #endif | ||
371 | |||
372 | static int syslog_action_restricted(int type) | ||
373 | { | ||
374 | if (dmesg_restrict) | ||
375 | return 1; | ||
376 | /* | ||
377 | * Unless restricted, we allow "read all" and "get buffer size" | ||
378 | * for everybody. | ||
379 | */ | ||
380 | return type != SYSLOG_ACTION_READ_ALL && | ||
381 | type != SYSLOG_ACTION_SIZE_BUFFER; | ||
382 | } | ||
383 | |||
384 | static int check_syslog_permissions(int type, bool from_file) | ||
385 | { | ||
386 | /* | ||
387 | * If this is from /proc/kmsg and we've already opened it, then we've | ||
388 | * already done the capabilities checks at open time. | ||
389 | */ | ||
390 | if (from_file && type != SYSLOG_ACTION_OPEN) | ||
391 | return 0; | ||
392 | |||
393 | if (syslog_action_restricted(type)) { | ||
394 | if (capable(CAP_SYSLOG)) | ||
395 | return 0; | ||
396 | /* | ||
397 | * For historical reasons, accept CAP_SYS_ADMIN too, with | ||
398 | * a warning. | ||
399 | */ | ||
400 | if (capable(CAP_SYS_ADMIN)) { | ||
401 | pr_warn_once("%s (%d): Attempt to access syslog with " | ||
402 | "CAP_SYS_ADMIN but no CAP_SYSLOG " | ||
403 | "(deprecated).\n", | ||
404 | current->comm, task_pid_nr(current)); | ||
405 | return 0; | ||
406 | } | ||
407 | return -EPERM; | ||
408 | } | ||
409 | return security_syslog(type); | ||
410 | } | ||
411 | |||
412 | |||
366 | /* /dev/kmsg - userspace message inject/listen interface */ | 413 | /* /dev/kmsg - userspace message inject/listen interface */ |
367 | struct devkmsg_user { | 414 | struct devkmsg_user { |
368 | u64 seq; | 415 | u64 seq; |
@@ -620,7 +667,8 @@ static int devkmsg_open(struct inode *inode, struct file *file) | |||
620 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) | 667 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) |
621 | return 0; | 668 | return 0; |
622 | 669 | ||
623 | err = security_syslog(SYSLOG_ACTION_READ_ALL); | 670 | err = check_syslog_permissions(SYSLOG_ACTION_READ_ALL, |
671 | SYSLOG_FROM_READER); | ||
624 | if (err) | 672 | if (err) |
625 | return err; | 673 | return err; |
626 | 674 | ||
@@ -813,45 +861,6 @@ static inline void boot_delay_msec(int level) | |||
813 | } | 861 | } |
814 | #endif | 862 | #endif |
815 | 863 | ||
816 | #ifdef CONFIG_SECURITY_DMESG_RESTRICT | ||
817 | int dmesg_restrict = 1; | ||
818 | #else | ||
819 | int dmesg_restrict; | ||
820 | #endif | ||
821 | |||
822 | static int syslog_action_restricted(int type) | ||
823 | { | ||
824 | if (dmesg_restrict) | ||
825 | return 1; | ||
826 | /* Unless restricted, we allow "read all" and "get buffer size" for everybody */ | ||
827 | return type != SYSLOG_ACTION_READ_ALL && type != SYSLOG_ACTION_SIZE_BUFFER; | ||
828 | } | ||
829 | |||
830 | static int check_syslog_permissions(int type, bool from_file) | ||
831 | { | ||
832 | /* | ||
833 | * If this is from /proc/kmsg and we've already opened it, then we've | ||
834 | * already done the capabilities checks at open time. | ||
835 | */ | ||
836 | if (from_file && type != SYSLOG_ACTION_OPEN) | ||
837 | return 0; | ||
838 | |||
839 | if (syslog_action_restricted(type)) { | ||
840 | if (capable(CAP_SYSLOG)) | ||
841 | return 0; | ||
842 | /* For historical reasons, accept CAP_SYS_ADMIN too, with a warning */ | ||
843 | if (capable(CAP_SYS_ADMIN)) { | ||
844 | printk_once(KERN_WARNING "%s (%d): " | ||
845 | "Attempt to access syslog with CAP_SYS_ADMIN " | ||
846 | "but no CAP_SYSLOG (deprecated).\n", | ||
847 | current->comm, task_pid_nr(current)); | ||
848 | return 0; | ||
849 | } | ||
850 | return -EPERM; | ||
851 | } | ||
852 | return 0; | ||
853 | } | ||
854 | |||
855 | #if defined(CONFIG_PRINTK_TIME) | 864 | #if defined(CONFIG_PRINTK_TIME) |
856 | static bool printk_time = 1; | 865 | static bool printk_time = 1; |
857 | #else | 866 | #else |
@@ -1249,7 +1258,7 @@ out: | |||
1249 | 1258 | ||
1250 | SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len) | 1259 | SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len) |
1251 | { | 1260 | { |
1252 | return do_syslog(type, buf, len, SYSLOG_FROM_CALL); | 1261 | return do_syslog(type, buf, len, SYSLOG_FROM_READER); |
1253 | } | 1262 | } |
1254 | 1263 | ||
1255 | /* | 1264 | /* |
diff --git a/kernel/rcutree.c b/kernel/rcutree.c index 16ea67925015..35380019f0fc 100644 --- a/kernel/rcutree.c +++ b/kernel/rcutree.c | |||
@@ -1451,9 +1451,9 @@ static int rcu_gp_init(struct rcu_state *rsp) | |||
1451 | rnp->grphi, rnp->qsmask); | 1451 | rnp->grphi, rnp->qsmask); |
1452 | raw_spin_unlock_irq(&rnp->lock); | 1452 | raw_spin_unlock_irq(&rnp->lock); |
1453 | #ifdef CONFIG_PROVE_RCU_DELAY | 1453 | #ifdef CONFIG_PROVE_RCU_DELAY |
1454 | if ((prandom_u32() % (rcu_num_nodes * 8)) == 0 && | 1454 | if ((prandom_u32() % (rcu_num_nodes + 1)) == 0 && |
1455 | system_state == SYSTEM_RUNNING) | 1455 | system_state == SYSTEM_RUNNING) |
1456 | schedule_timeout_uninterruptible(2); | 1456 | udelay(200); |
1457 | #endif /* #ifdef CONFIG_PROVE_RCU_DELAY */ | 1457 | #endif /* #ifdef CONFIG_PROVE_RCU_DELAY */ |
1458 | cond_resched(); | 1458 | cond_resched(); |
1459 | } | 1459 | } |
@@ -1613,6 +1613,14 @@ static int __noreturn rcu_gp_kthread(void *arg) | |||
1613 | } | 1613 | } |
1614 | } | 1614 | } |
1615 | 1615 | ||
1616 | static void rsp_wakeup(struct irq_work *work) | ||
1617 | { | ||
1618 | struct rcu_state *rsp = container_of(work, struct rcu_state, wakeup_work); | ||
1619 | |||
1620 | /* Wake up rcu_gp_kthread() to start the grace period. */ | ||
1621 | wake_up(&rsp->gp_wq); | ||
1622 | } | ||
1623 | |||
1616 | /* | 1624 | /* |
1617 | * Start a new RCU grace period if warranted, re-initializing the hierarchy | 1625 | * Start a new RCU grace period if warranted, re-initializing the hierarchy |
1618 | * in preparation for detecting the next grace period. The caller must hold | 1626 | * in preparation for detecting the next grace period. The caller must hold |
@@ -1637,8 +1645,12 @@ rcu_start_gp_advanced(struct rcu_state *rsp, struct rcu_node *rnp, | |||
1637 | } | 1645 | } |
1638 | rsp->gp_flags = RCU_GP_FLAG_INIT; | 1646 | rsp->gp_flags = RCU_GP_FLAG_INIT; |
1639 | 1647 | ||
1640 | /* Wake up rcu_gp_kthread() to start the grace period. */ | 1648 | /* |
1641 | wake_up(&rsp->gp_wq); | 1649 | * We can't do wakeups while holding the rnp->lock, as that |
1650 | * could cause possible deadlocks with the rq->lock. Deter | ||
1651 | * the wakeup to interrupt context. | ||
1652 | */ | ||
1653 | irq_work_queue(&rsp->wakeup_work); | ||
1642 | } | 1654 | } |
1643 | 1655 | ||
1644 | /* | 1656 | /* |
@@ -3235,6 +3247,7 @@ static void __init rcu_init_one(struct rcu_state *rsp, | |||
3235 | 3247 | ||
3236 | rsp->rda = rda; | 3248 | rsp->rda = rda; |
3237 | init_waitqueue_head(&rsp->gp_wq); | 3249 | init_waitqueue_head(&rsp->gp_wq); |
3250 | init_irq_work(&rsp->wakeup_work, rsp_wakeup); | ||
3238 | rnp = rsp->level[rcu_num_lvls - 1]; | 3251 | rnp = rsp->level[rcu_num_lvls - 1]; |
3239 | for_each_possible_cpu(i) { | 3252 | for_each_possible_cpu(i) { |
3240 | while (i > rnp->grphi) | 3253 | while (i > rnp->grphi) |
diff --git a/kernel/rcutree.h b/kernel/rcutree.h index da77a8f57ff9..4df503470e42 100644 --- a/kernel/rcutree.h +++ b/kernel/rcutree.h | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/threads.h> | 27 | #include <linux/threads.h> |
28 | #include <linux/cpumask.h> | 28 | #include <linux/cpumask.h> |
29 | #include <linux/seqlock.h> | 29 | #include <linux/seqlock.h> |
30 | #include <linux/irq_work.h> | ||
30 | 31 | ||
31 | /* | 32 | /* |
32 | * Define shape of hierarchy based on NR_CPUS, CONFIG_RCU_FANOUT, and | 33 | * Define shape of hierarchy based on NR_CPUS, CONFIG_RCU_FANOUT, and |
@@ -442,6 +443,7 @@ struct rcu_state { | |||
442 | char *name; /* Name of structure. */ | 443 | char *name; /* Name of structure. */ |
443 | char abbr; /* Abbreviated name. */ | 444 | char abbr; /* Abbreviated name. */ |
444 | struct list_head flavors; /* List of RCU flavors. */ | 445 | struct list_head flavors; /* List of RCU flavors. */ |
446 | struct irq_work wakeup_work; /* Postponed wakeups */ | ||
445 | }; | 447 | }; |
446 | 448 | ||
447 | /* Values for rcu_state structure's gp_flags field. */ | 449 | /* Values for rcu_state structure's gp_flags field. */ |
diff --git a/kernel/softirq.c b/kernel/softirq.c index b5197dcb0dad..3d6833f125d3 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c | |||
@@ -195,8 +195,12 @@ void local_bh_enable_ip(unsigned long ip) | |||
195 | EXPORT_SYMBOL(local_bh_enable_ip); | 195 | EXPORT_SYMBOL(local_bh_enable_ip); |
196 | 196 | ||
197 | /* | 197 | /* |
198 | * We restart softirq processing for at most 2 ms, | 198 | * We restart softirq processing for at most MAX_SOFTIRQ_RESTART times, |
199 | * and if need_resched() is not set. | 199 | * but break the loop if need_resched() is set or after 2 ms. |
200 | * The MAX_SOFTIRQ_TIME provides a nice upper bound in most cases, but in | ||
201 | * certain cases, such as stop_machine(), jiffies may cease to | ||
202 | * increment and so we need the MAX_SOFTIRQ_RESTART limit as | ||
203 | * well to make sure we eventually return from this method. | ||
200 | * | 204 | * |
201 | * These limits have been established via experimentation. | 205 | * These limits have been established via experimentation. |
202 | * The two things to balance is latency against fairness - | 206 | * The two things to balance is latency against fairness - |
@@ -204,6 +208,7 @@ EXPORT_SYMBOL(local_bh_enable_ip); | |||
204 | * should not be able to lock up the box. | 208 | * should not be able to lock up the box. |
205 | */ | 209 | */ |
206 | #define MAX_SOFTIRQ_TIME msecs_to_jiffies(2) | 210 | #define MAX_SOFTIRQ_TIME msecs_to_jiffies(2) |
211 | #define MAX_SOFTIRQ_RESTART 10 | ||
207 | 212 | ||
208 | asmlinkage void __do_softirq(void) | 213 | asmlinkage void __do_softirq(void) |
209 | { | 214 | { |
@@ -212,6 +217,7 @@ asmlinkage void __do_softirq(void) | |||
212 | unsigned long end = jiffies + MAX_SOFTIRQ_TIME; | 217 | unsigned long end = jiffies + MAX_SOFTIRQ_TIME; |
213 | int cpu; | 218 | int cpu; |
214 | unsigned long old_flags = current->flags; | 219 | unsigned long old_flags = current->flags; |
220 | int max_restart = MAX_SOFTIRQ_RESTART; | ||
215 | 221 | ||
216 | /* | 222 | /* |
217 | * Mask out PF_MEMALLOC s current task context is borrowed for the | 223 | * Mask out PF_MEMALLOC s current task context is borrowed for the |
@@ -265,7 +271,8 @@ restart: | |||
265 | 271 | ||
266 | pending = local_softirq_pending(); | 272 | pending = local_softirq_pending(); |
267 | if (pending) { | 273 | if (pending) { |
268 | if (time_before(jiffies, end) && !need_resched()) | 274 | if (time_before(jiffies, end) && !need_resched() && |
275 | --max_restart) | ||
269 | goto restart; | 276 | goto restart; |
270 | 277 | ||
271 | wakeup_softirqd(); | 278 | wakeup_softirqd(); |
diff --git a/kernel/sys.c b/kernel/sys.c index b95d3c72ba21..2bbd9a73b54c 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -362,6 +362,29 @@ int unregister_reboot_notifier(struct notifier_block *nb) | |||
362 | } | 362 | } |
363 | EXPORT_SYMBOL(unregister_reboot_notifier); | 363 | EXPORT_SYMBOL(unregister_reboot_notifier); |
364 | 364 | ||
365 | /* Add backwards compatibility for stable trees. */ | ||
366 | #ifndef PF_NO_SETAFFINITY | ||
367 | #define PF_NO_SETAFFINITY PF_THREAD_BOUND | ||
368 | #endif | ||
369 | |||
370 | static void migrate_to_reboot_cpu(void) | ||
371 | { | ||
372 | /* The boot cpu is always logical cpu 0 */ | ||
373 | int cpu = 0; | ||
374 | |||
375 | cpu_hotplug_disable(); | ||
376 | |||
377 | /* Make certain the cpu I'm about to reboot on is online */ | ||
378 | if (!cpu_online(cpu)) | ||
379 | cpu = cpumask_first(cpu_online_mask); | ||
380 | |||
381 | /* Prevent races with other tasks migrating this task */ | ||
382 | current->flags |= PF_NO_SETAFFINITY; | ||
383 | |||
384 | /* Make certain I only run on the appropriate processor */ | ||
385 | set_cpus_allowed_ptr(current, cpumask_of(cpu)); | ||
386 | } | ||
387 | |||
365 | /** | 388 | /** |
366 | * kernel_restart - reboot the system | 389 | * kernel_restart - reboot the system |
367 | * @cmd: pointer to buffer containing command to execute for restart | 390 | * @cmd: pointer to buffer containing command to execute for restart |
@@ -373,7 +396,7 @@ EXPORT_SYMBOL(unregister_reboot_notifier); | |||
373 | void kernel_restart(char *cmd) | 396 | void kernel_restart(char *cmd) |
374 | { | 397 | { |
375 | kernel_restart_prepare(cmd); | 398 | kernel_restart_prepare(cmd); |
376 | disable_nonboot_cpus(); | 399 | migrate_to_reboot_cpu(); |
377 | syscore_shutdown(); | 400 | syscore_shutdown(); |
378 | if (!cmd) | 401 | if (!cmd) |
379 | printk(KERN_EMERG "Restarting system.\n"); | 402 | printk(KERN_EMERG "Restarting system.\n"); |
@@ -400,7 +423,7 @@ static void kernel_shutdown_prepare(enum system_states state) | |||
400 | void kernel_halt(void) | 423 | void kernel_halt(void) |
401 | { | 424 | { |
402 | kernel_shutdown_prepare(SYSTEM_HALT); | 425 | kernel_shutdown_prepare(SYSTEM_HALT); |
403 | disable_nonboot_cpus(); | 426 | migrate_to_reboot_cpu(); |
404 | syscore_shutdown(); | 427 | syscore_shutdown(); |
405 | printk(KERN_EMERG "System halted.\n"); | 428 | printk(KERN_EMERG "System halted.\n"); |
406 | kmsg_dump(KMSG_DUMP_HALT); | 429 | kmsg_dump(KMSG_DUMP_HALT); |
@@ -419,7 +442,7 @@ void kernel_power_off(void) | |||
419 | kernel_shutdown_prepare(SYSTEM_POWER_OFF); | 442 | kernel_shutdown_prepare(SYSTEM_POWER_OFF); |
420 | if (pm_power_off_prepare) | 443 | if (pm_power_off_prepare) |
421 | pm_power_off_prepare(); | 444 | pm_power_off_prepare(); |
422 | disable_nonboot_cpus(); | 445 | migrate_to_reboot_cpu(); |
423 | syscore_shutdown(); | 446 | syscore_shutdown(); |
424 | printk(KERN_EMERG "Power down.\n"); | 447 | printk(KERN_EMERG "Power down.\n"); |
425 | kmsg_dump(KMSG_DUMP_POWEROFF); | 448 | kmsg_dump(KMSG_DUMP_POWEROFF); |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 12ff13a838c6..8f5b3b98577b 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
@@ -874,7 +874,6 @@ static void hardpps_update_phase(long error) | |||
874 | void __hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts) | 874 | void __hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts) |
875 | { | 875 | { |
876 | struct pps_normtime pts_norm, freq_norm; | 876 | struct pps_normtime pts_norm, freq_norm; |
877 | unsigned long flags; | ||
878 | 877 | ||
879 | pts_norm = pps_normalize_ts(*phase_ts); | 878 | pts_norm = pps_normalize_ts(*phase_ts); |
880 | 879 | ||
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 24938d577669..0c739423b0f9 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
@@ -511,6 +511,12 @@ again: | |||
511 | } | 511 | } |
512 | } | 512 | } |
513 | 513 | ||
514 | /* | ||
515 | * Remove the current cpu from the pending mask. The event is | ||
516 | * delivered immediately in tick_do_broadcast() ! | ||
517 | */ | ||
518 | cpumask_clear_cpu(smp_processor_id(), tick_broadcast_pending_mask); | ||
519 | |||
514 | /* Take care of enforced broadcast requests */ | 520 | /* Take care of enforced broadcast requests */ |
515 | cpumask_or(tmpmask, tmpmask, tick_broadcast_force_mask); | 521 | cpumask_or(tmpmask, tmpmask, tick_broadcast_force_mask); |
516 | cpumask_clear(tick_broadcast_force_mask); | 522 | cpumask_clear(tick_broadcast_force_mask); |
@@ -575,8 +581,8 @@ void tick_broadcast_oneshot_control(unsigned long reason) | |||
575 | 581 | ||
576 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 582 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); |
577 | if (reason == CLOCK_EVT_NOTIFY_BROADCAST_ENTER) { | 583 | if (reason == CLOCK_EVT_NOTIFY_BROADCAST_ENTER) { |
578 | WARN_ON_ONCE(cpumask_test_cpu(cpu, tick_broadcast_pending_mask)); | ||
579 | if (!cpumask_test_and_set_cpu(cpu, tick_broadcast_oneshot_mask)) { | 584 | if (!cpumask_test_and_set_cpu(cpu, tick_broadcast_oneshot_mask)) { |
585 | WARN_ON_ONCE(cpumask_test_cpu(cpu, tick_broadcast_pending_mask)); | ||
580 | clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); | 586 | clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); |
581 | /* | 587 | /* |
582 | * We only reprogram the broadcast timer if we | 588 | * We only reprogram the broadcast timer if we |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 98cd470bbe49..baeeb5c87cf1 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
@@ -975,6 +975,14 @@ static int timekeeping_suspend(void) | |||
975 | 975 | ||
976 | read_persistent_clock(&timekeeping_suspend_time); | 976 | read_persistent_clock(&timekeeping_suspend_time); |
977 | 977 | ||
978 | /* | ||
979 | * On some systems the persistent_clock can not be detected at | ||
980 | * timekeeping_init by its return value, so if we see a valid | ||
981 | * value returned, update the persistent_clock_exists flag. | ||
982 | */ | ||
983 | if (timekeeping_suspend_time.tv_sec || timekeeping_suspend_time.tv_nsec) | ||
984 | persistent_clock_exist = true; | ||
985 | |||
978 | raw_spin_lock_irqsave(&timekeeper_lock, flags); | 986 | raw_spin_lock_irqsave(&timekeeper_lock, flags); |
979 | write_seqcount_begin(&timekeeper_seq); | 987 | write_seqcount_begin(&timekeeper_seq); |
980 | timekeeping_forward_now(tk); | 988 | timekeeping_forward_now(tk); |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index b549b0f5b977..6c508ff33c62 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
@@ -120,22 +120,22 @@ static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip); | |||
120 | 120 | ||
121 | /* | 121 | /* |
122 | * Traverse the ftrace_global_list, invoking all entries. The reason that we | 122 | * Traverse the ftrace_global_list, invoking all entries. The reason that we |
123 | * can use rcu_dereference_raw() is that elements removed from this list | 123 | * can use rcu_dereference_raw_notrace() is that elements removed from this list |
124 | * are simply leaked, so there is no need to interact with a grace-period | 124 | * are simply leaked, so there is no need to interact with a grace-period |
125 | * mechanism. The rcu_dereference_raw() calls are needed to handle | 125 | * mechanism. The rcu_dereference_raw_notrace() calls are needed to handle |
126 | * concurrent insertions into the ftrace_global_list. | 126 | * concurrent insertions into the ftrace_global_list. |
127 | * | 127 | * |
128 | * Silly Alpha and silly pointer-speculation compiler optimizations! | 128 | * Silly Alpha and silly pointer-speculation compiler optimizations! |
129 | */ | 129 | */ |
130 | #define do_for_each_ftrace_op(op, list) \ | 130 | #define do_for_each_ftrace_op(op, list) \ |
131 | op = rcu_dereference_raw(list); \ | 131 | op = rcu_dereference_raw_notrace(list); \ |
132 | do | 132 | do |
133 | 133 | ||
134 | /* | 134 | /* |
135 | * Optimized for just a single item in the list (as that is the normal case). | 135 | * Optimized for just a single item in the list (as that is the normal case). |
136 | */ | 136 | */ |
137 | #define while_for_each_ftrace_op(op) \ | 137 | #define while_for_each_ftrace_op(op) \ |
138 | while (likely(op = rcu_dereference_raw((op)->next)) && \ | 138 | while (likely(op = rcu_dereference_raw_notrace((op)->next)) && \ |
139 | unlikely((op) != &ftrace_list_end)) | 139 | unlikely((op) != &ftrace_list_end)) |
140 | 140 | ||
141 | static inline void ftrace_ops_init(struct ftrace_ops *ops) | 141 | static inline void ftrace_ops_init(struct ftrace_ops *ops) |
@@ -779,7 +779,7 @@ ftrace_find_profiled_func(struct ftrace_profile_stat *stat, unsigned long ip) | |||
779 | if (hlist_empty(hhd)) | 779 | if (hlist_empty(hhd)) |
780 | return NULL; | 780 | return NULL; |
781 | 781 | ||
782 | hlist_for_each_entry_rcu(rec, hhd, node) { | 782 | hlist_for_each_entry_rcu_notrace(rec, hhd, node) { |
783 | if (rec->ip == ip) | 783 | if (rec->ip == ip) |
784 | return rec; | 784 | return rec; |
785 | } | 785 | } |
@@ -1165,7 +1165,7 @@ ftrace_lookup_ip(struct ftrace_hash *hash, unsigned long ip) | |||
1165 | 1165 | ||
1166 | hhd = &hash->buckets[key]; | 1166 | hhd = &hash->buckets[key]; |
1167 | 1167 | ||
1168 | hlist_for_each_entry_rcu(entry, hhd, hlist) { | 1168 | hlist_for_each_entry_rcu_notrace(entry, hhd, hlist) { |
1169 | if (entry->ip == ip) | 1169 | if (entry->ip == ip) |
1170 | return entry; | 1170 | return entry; |
1171 | } | 1171 | } |
@@ -1422,8 +1422,8 @@ ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip) | |||
1422 | struct ftrace_hash *notrace_hash; | 1422 | struct ftrace_hash *notrace_hash; |
1423 | int ret; | 1423 | int ret; |
1424 | 1424 | ||
1425 | filter_hash = rcu_dereference_raw(ops->filter_hash); | 1425 | filter_hash = rcu_dereference_raw_notrace(ops->filter_hash); |
1426 | notrace_hash = rcu_dereference_raw(ops->notrace_hash); | 1426 | notrace_hash = rcu_dereference_raw_notrace(ops->notrace_hash); |
1427 | 1427 | ||
1428 | if ((ftrace_hash_empty(filter_hash) || | 1428 | if ((ftrace_hash_empty(filter_hash) || |
1429 | ftrace_lookup_ip(filter_hash, ip)) && | 1429 | ftrace_lookup_ip(filter_hash, ip)) && |
@@ -2920,7 +2920,7 @@ static void function_trace_probe_call(unsigned long ip, unsigned long parent_ip, | |||
2920 | * on the hash. rcu_read_lock is too dangerous here. | 2920 | * on the hash. rcu_read_lock is too dangerous here. |
2921 | */ | 2921 | */ |
2922 | preempt_disable_notrace(); | 2922 | preempt_disable_notrace(); |
2923 | hlist_for_each_entry_rcu(entry, hhd, node) { | 2923 | hlist_for_each_entry_rcu_notrace(entry, hhd, node) { |
2924 | if (entry->ip == ip) | 2924 | if (entry->ip == ip) |
2925 | entry->ops->func(ip, parent_ip, &entry->data); | 2925 | entry->ops->func(ip, parent_ip, &entry->data); |
2926 | } | 2926 | } |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 4d79485b3237..e71a8be4a6ee 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -652,8 +652,6 @@ static struct { | |||
652 | ARCH_TRACE_CLOCKS | 652 | ARCH_TRACE_CLOCKS |
653 | }; | 653 | }; |
654 | 654 | ||
655 | int trace_clock_id; | ||
656 | |||
657 | /* | 655 | /* |
658 | * trace_parser_get_init - gets the buffer for trace parser | 656 | * trace_parser_get_init - gets the buffer for trace parser |
659 | */ | 657 | */ |
@@ -843,7 +841,15 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) | |||
843 | 841 | ||
844 | memcpy(max_data->comm, tsk->comm, TASK_COMM_LEN); | 842 | memcpy(max_data->comm, tsk->comm, TASK_COMM_LEN); |
845 | max_data->pid = tsk->pid; | 843 | max_data->pid = tsk->pid; |
846 | max_data->uid = task_uid(tsk); | 844 | /* |
845 | * If tsk == current, then use current_uid(), as that does not use | ||
846 | * RCU. The irq tracer can be called out of RCU scope. | ||
847 | */ | ||
848 | if (tsk == current) | ||
849 | max_data->uid = current_uid(); | ||
850 | else | ||
851 | max_data->uid = task_uid(tsk); | ||
852 | |||
847 | max_data->nice = tsk->static_prio - 20 - MAX_RT_PRIO; | 853 | max_data->nice = tsk->static_prio - 20 - MAX_RT_PRIO; |
848 | max_data->policy = tsk->policy; | 854 | max_data->policy = tsk->policy; |
849 | max_data->rt_priority = tsk->rt_priority; | 855 | max_data->rt_priority = tsk->rt_priority; |
@@ -2818,7 +2824,7 @@ __tracing_open(struct inode *inode, struct file *file, bool snapshot) | |||
2818 | iter->iter_flags |= TRACE_FILE_ANNOTATE; | 2824 | iter->iter_flags |= TRACE_FILE_ANNOTATE; |
2819 | 2825 | ||
2820 | /* Output in nanoseconds only if we are using a clock in nanoseconds. */ | 2826 | /* Output in nanoseconds only if we are using a clock in nanoseconds. */ |
2821 | if (trace_clocks[trace_clock_id].in_ns) | 2827 | if (trace_clocks[tr->clock_id].in_ns) |
2822 | iter->iter_flags |= TRACE_FILE_TIME_IN_NS; | 2828 | iter->iter_flags |= TRACE_FILE_TIME_IN_NS; |
2823 | 2829 | ||
2824 | /* stop the trace while dumping if we are not opening "snapshot" */ | 2830 | /* stop the trace while dumping if we are not opening "snapshot" */ |
@@ -3817,7 +3823,7 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp) | |||
3817 | iter->iter_flags |= TRACE_FILE_LAT_FMT; | 3823 | iter->iter_flags |= TRACE_FILE_LAT_FMT; |
3818 | 3824 | ||
3819 | /* Output in nanoseconds only if we are using a clock in nanoseconds. */ | 3825 | /* Output in nanoseconds only if we are using a clock in nanoseconds. */ |
3820 | if (trace_clocks[trace_clock_id].in_ns) | 3826 | if (trace_clocks[tr->clock_id].in_ns) |
3821 | iter->iter_flags |= TRACE_FILE_TIME_IN_NS; | 3827 | iter->iter_flags |= TRACE_FILE_TIME_IN_NS; |
3822 | 3828 | ||
3823 | iter->cpu_file = tc->cpu; | 3829 | iter->cpu_file = tc->cpu; |
@@ -5087,7 +5093,7 @@ tracing_stats_read(struct file *filp, char __user *ubuf, | |||
5087 | cnt = ring_buffer_bytes_cpu(trace_buf->buffer, cpu); | 5093 | cnt = ring_buffer_bytes_cpu(trace_buf->buffer, cpu); |
5088 | trace_seq_printf(s, "bytes: %ld\n", cnt); | 5094 | trace_seq_printf(s, "bytes: %ld\n", cnt); |
5089 | 5095 | ||
5090 | if (trace_clocks[trace_clock_id].in_ns) { | 5096 | if (trace_clocks[tr->clock_id].in_ns) { |
5091 | /* local or global for trace_clock */ | 5097 | /* local or global for trace_clock */ |
5092 | t = ns2usecs(ring_buffer_oldest_event_ts(trace_buf->buffer, cpu)); | 5098 | t = ns2usecs(ring_buffer_oldest_event_ts(trace_buf->buffer, cpu)); |
5093 | usec_rem = do_div(t, USEC_PER_SEC); | 5099 | usec_rem = do_div(t, USEC_PER_SEC); |
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 711ca7d3e7f1..20572ed88c5c 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -700,8 +700,6 @@ enum print_line_t print_trace_line(struct trace_iterator *iter); | |||
700 | 700 | ||
701 | extern unsigned long trace_flags; | 701 | extern unsigned long trace_flags; |
702 | 702 | ||
703 | extern int trace_clock_id; | ||
704 | |||
705 | /* Standard output formatting function used for function return traces */ | 703 | /* Standard output formatting function used for function return traces */ |
706 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | 704 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
707 | 705 | ||
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index 55e2cf66967b..2901e3b88590 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c | |||
@@ -1159,7 +1159,7 @@ trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr) | |||
1159 | /* stop the tracing. */ | 1159 | /* stop the tracing. */ |
1160 | tracing_stop(); | 1160 | tracing_stop(); |
1161 | /* check the trace buffer */ | 1161 | /* check the trace buffer */ |
1162 | ret = trace_test_buffer(tr, &count); | 1162 | ret = trace_test_buffer(&tr->trace_buffer, &count); |
1163 | trace->reset(tr); | 1163 | trace->reset(tr); |
1164 | tracing_start(); | 1164 | tracing_start(); |
1165 | 1165 | ||
diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c index 5f9c44cdf1f5..4cc6442733f4 100644 --- a/lib/mpi/mpicoder.c +++ b/lib/mpi/mpicoder.c | |||
@@ -37,7 +37,7 @@ MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes) | |||
37 | mpi_limb_t a; | 37 | mpi_limb_t a; |
38 | MPI val = NULL; | 38 | MPI val = NULL; |
39 | 39 | ||
40 | while (nbytes >= 0 && buffer[0] == 0) { | 40 | while (nbytes > 0 && buffer[0] == 0) { |
41 | buffer++; | 41 | buffer++; |
42 | nbytes--; | 42 | nbytes--; |
43 | } | 43 | } |
diff --git a/mm/frontswap.c b/mm/frontswap.c index 538367ef1372..1b24bdcb3197 100644 --- a/mm/frontswap.c +++ b/mm/frontswap.c | |||
@@ -319,7 +319,7 @@ void __frontswap_invalidate_area(unsigned type) | |||
319 | return; | 319 | return; |
320 | frontswap_ops->invalidate_area(type); | 320 | frontswap_ops->invalidate_area(type); |
321 | atomic_set(&sis->frontswap_pages, 0); | 321 | atomic_set(&sis->frontswap_pages, 0); |
322 | memset(sis->frontswap_map, 0, sis->max / sizeof(long)); | 322 | bitmap_zero(sis->frontswap_map, sis->max); |
323 | } | 323 | } |
324 | clear_bit(type, need_init); | 324 | clear_bit(type, need_init); |
325 | } | 325 | } |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index f8feeeca6686..e2bfbf73a551 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -2839,7 +2839,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2839 | if (ptep) { | 2839 | if (ptep) { |
2840 | entry = huge_ptep_get(ptep); | 2840 | entry = huge_ptep_get(ptep); |
2841 | if (unlikely(is_hugetlb_entry_migration(entry))) { | 2841 | if (unlikely(is_hugetlb_entry_migration(entry))) { |
2842 | migration_entry_wait(mm, (pmd_t *)ptep, address); | 2842 | migration_entry_wait_huge(mm, ptep); |
2843 | return 0; | 2843 | return 0; |
2844 | } else if (unlikely(is_hugetlb_entry_hwpoisoned(entry))) | 2844 | } else if (unlikely(is_hugetlb_entry_hwpoisoned(entry))) |
2845 | return VM_FAULT_HWPOISON_LARGE | | 2845 | return VM_FAULT_HWPOISON_LARGE | |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 010d6c14129a..194721839cf5 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1199,7 +1199,6 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root, | |||
1199 | 1199 | ||
1200 | mz = mem_cgroup_zoneinfo(root, nid, zid); | 1200 | mz = mem_cgroup_zoneinfo(root, nid, zid); |
1201 | iter = &mz->reclaim_iter[reclaim->priority]; | 1201 | iter = &mz->reclaim_iter[reclaim->priority]; |
1202 | last_visited = iter->last_visited; | ||
1203 | if (prev && reclaim->generation != iter->generation) { | 1202 | if (prev && reclaim->generation != iter->generation) { |
1204 | iter->last_visited = NULL; | 1203 | iter->last_visited = NULL; |
1205 | goto out_unlock; | 1204 | goto out_unlock; |
@@ -1218,13 +1217,12 @@ struct mem_cgroup *mem_cgroup_iter(struct mem_cgroup *root, | |||
1218 | * is alive. | 1217 | * is alive. |
1219 | */ | 1218 | */ |
1220 | dead_count = atomic_read(&root->dead_count); | 1219 | dead_count = atomic_read(&root->dead_count); |
1221 | smp_rmb(); | 1220 | if (dead_count == iter->last_dead_count) { |
1222 | last_visited = iter->last_visited; | 1221 | smp_rmb(); |
1223 | if (last_visited) { | 1222 | last_visited = iter->last_visited; |
1224 | if ((dead_count != iter->last_dead_count) || | 1223 | if (last_visited && |
1225 | !css_tryget(&last_visited->css)) { | 1224 | !css_tryget(&last_visited->css)) |
1226 | last_visited = NULL; | 1225 | last_visited = NULL; |
1227 | } | ||
1228 | } | 1226 | } |
1229 | } | 1227 | } |
1230 | 1228 | ||
@@ -3141,8 +3139,6 @@ int memcg_update_cache_size(struct kmem_cache *s, int num_groups) | |||
3141 | return -ENOMEM; | 3139 | return -ENOMEM; |
3142 | } | 3140 | } |
3143 | 3141 | ||
3144 | INIT_WORK(&s->memcg_params->destroy, | ||
3145 | kmem_cache_destroy_work_func); | ||
3146 | s->memcg_params->is_root_cache = true; | 3142 | s->memcg_params->is_root_cache = true; |
3147 | 3143 | ||
3148 | /* | 3144 | /* |
diff --git a/mm/migrate.c b/mm/migrate.c index b1f57501de9c..6f0c24438bba 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -200,15 +200,14 @@ static void remove_migration_ptes(struct page *old, struct page *new) | |||
200 | * get to the page and wait until migration is finished. | 200 | * get to the page and wait until migration is finished. |
201 | * When we return from this function the fault will be retried. | 201 | * When we return from this function the fault will be retried. |
202 | */ | 202 | */ |
203 | void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, | 203 | static void __migration_entry_wait(struct mm_struct *mm, pte_t *ptep, |
204 | unsigned long address) | 204 | spinlock_t *ptl) |
205 | { | 205 | { |
206 | pte_t *ptep, pte; | 206 | pte_t pte; |
207 | spinlock_t *ptl; | ||
208 | swp_entry_t entry; | 207 | swp_entry_t entry; |
209 | struct page *page; | 208 | struct page *page; |
210 | 209 | ||
211 | ptep = pte_offset_map_lock(mm, pmd, address, &ptl); | 210 | spin_lock(ptl); |
212 | pte = *ptep; | 211 | pte = *ptep; |
213 | if (!is_swap_pte(pte)) | 212 | if (!is_swap_pte(pte)) |
214 | goto out; | 213 | goto out; |
@@ -236,6 +235,20 @@ out: | |||
236 | pte_unmap_unlock(ptep, ptl); | 235 | pte_unmap_unlock(ptep, ptl); |
237 | } | 236 | } |
238 | 237 | ||
238 | void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd, | ||
239 | unsigned long address) | ||
240 | { | ||
241 | spinlock_t *ptl = pte_lockptr(mm, pmd); | ||
242 | pte_t *ptep = pte_offset_map(pmd, address); | ||
243 | __migration_entry_wait(mm, ptep, ptl); | ||
244 | } | ||
245 | |||
246 | void migration_entry_wait_huge(struct mm_struct *mm, pte_t *pte) | ||
247 | { | ||
248 | spinlock_t *ptl = &(mm)->page_table_lock; | ||
249 | __migration_entry_wait(mm, pte, ptl); | ||
250 | } | ||
251 | |||
239 | #ifdef CONFIG_BLOCK | 252 | #ifdef CONFIG_BLOCK |
240 | /* Returns true if all buffers are successfully locked */ | 253 | /* Returns true if all buffers are successfully locked */ |
241 | static bool buffer_migrate_lock_buffers(struct buffer_head *head, | 254 | static bool buffer_migrate_lock_buffers(struct buffer_head *head, |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 378a15bcd649..c3edb624fccf 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -1628,6 +1628,7 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark, | |||
1628 | long min = mark; | 1628 | long min = mark; |
1629 | long lowmem_reserve = z->lowmem_reserve[classzone_idx]; | 1629 | long lowmem_reserve = z->lowmem_reserve[classzone_idx]; |
1630 | int o; | 1630 | int o; |
1631 | long free_cma = 0; | ||
1631 | 1632 | ||
1632 | free_pages -= (1 << order) - 1; | 1633 | free_pages -= (1 << order) - 1; |
1633 | if (alloc_flags & ALLOC_HIGH) | 1634 | if (alloc_flags & ALLOC_HIGH) |
@@ -1637,9 +1638,10 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark, | |||
1637 | #ifdef CONFIG_CMA | 1638 | #ifdef CONFIG_CMA |
1638 | /* If allocation can't use CMA areas don't use free CMA pages */ | 1639 | /* If allocation can't use CMA areas don't use free CMA pages */ |
1639 | if (!(alloc_flags & ALLOC_CMA)) | 1640 | if (!(alloc_flags & ALLOC_CMA)) |
1640 | free_pages -= zone_page_state(z, NR_FREE_CMA_PAGES); | 1641 | free_cma = zone_page_state(z, NR_FREE_CMA_PAGES); |
1641 | #endif | 1642 | #endif |
1642 | if (free_pages <= min + lowmem_reserve) | 1643 | |
1644 | if (free_pages - free_cma <= min + lowmem_reserve) | ||
1643 | return false; | 1645 | return false; |
1644 | for (o = 0; o < order; o++) { | 1646 | for (o = 0; o < order; o++) { |
1645 | /* At the next order, this order's pages become unavailable */ | 1647 | /* At the next order, this order's pages become unavailable */ |
diff --git a/mm/swap_state.c b/mm/swap_state.c index b3d40dcf3624..f24ab0dff554 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -336,8 +336,24 @@ struct page *read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, | |||
336 | * Swap entry may have been freed since our caller observed it. | 336 | * Swap entry may have been freed since our caller observed it. |
337 | */ | 337 | */ |
338 | err = swapcache_prepare(entry); | 338 | err = swapcache_prepare(entry); |
339 | if (err == -EEXIST) { /* seems racy */ | 339 | if (err == -EEXIST) { |
340 | radix_tree_preload_end(); | 340 | radix_tree_preload_end(); |
341 | /* | ||
342 | * We might race against get_swap_page() and stumble | ||
343 | * across a SWAP_HAS_CACHE swap_map entry whose page | ||
344 | * has not been brought into the swapcache yet, while | ||
345 | * the other end is scheduled away waiting on discard | ||
346 | * I/O completion at scan_swap_map(). | ||
347 | * | ||
348 | * In order to avoid turning this transitory state | ||
349 | * into a permanent loop around this -EEXIST case | ||
350 | * if !CONFIG_PREEMPT and the I/O completion happens | ||
351 | * to be waiting on the CPU waitqueue where we are now | ||
352 | * busy looping, we just conditionally invoke the | ||
353 | * scheduler here, if there are some more important | ||
354 | * tasks to run. | ||
355 | */ | ||
356 | cond_resched(); | ||
341 | continue; | 357 | continue; |
342 | } | 358 | } |
343 | if (err) { /* swp entry is obsolete ? */ | 359 | if (err) { /* swp entry is obsolete ? */ |
diff --git a/mm/swapfile.c b/mm/swapfile.c index 6c340d908b27..746af55b8455 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c | |||
@@ -2116,7 +2116,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) | |||
2116 | } | 2116 | } |
2117 | /* frontswap enabled? set up bit-per-page map for frontswap */ | 2117 | /* frontswap enabled? set up bit-per-page map for frontswap */ |
2118 | if (frontswap_enabled) | 2118 | if (frontswap_enabled) |
2119 | frontswap_map = vzalloc(maxpages / sizeof(long)); | 2119 | frontswap_map = vzalloc(BITS_TO_LONGS(maxpages) * sizeof(long)); |
2120 | 2120 | ||
2121 | if (p->bdev) { | 2121 | if (p->bdev) { |
2122 | if (blk_queue_nonrot(bdev_get_queue(p->bdev))) { | 2122 | if (blk_queue_nonrot(bdev_get_queue(p->bdev))) { |
diff --git a/net/9p/client.c b/net/9p/client.c index 8eb75425e6e6..addc116cecf0 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
@@ -562,36 +562,19 @@ static int p9_check_zc_errors(struct p9_client *c, struct p9_req_t *req, | |||
562 | 562 | ||
563 | if (!p9_is_proto_dotl(c)) { | 563 | if (!p9_is_proto_dotl(c)) { |
564 | /* Error is reported in string format */ | 564 | /* Error is reported in string format */ |
565 | uint16_t len; | 565 | int len; |
566 | /* 7 = header size for RERROR, 2 is the size of string len; */ | 566 | /* 7 = header size for RERROR; */ |
567 | int inline_len = in_hdrlen - (7 + 2); | 567 | int inline_len = in_hdrlen - 7; |
568 | 568 | ||
569 | /* Read the size of error string */ | 569 | len = req->rc->size - req->rc->offset; |
570 | err = p9pdu_readf(req->rc, c->proto_version, "w", &len); | 570 | if (len > (P9_ZC_HDR_SZ - 7)) { |
571 | if (err) | 571 | err = -EFAULT; |
572 | goto out_err; | ||
573 | |||
574 | ename = kmalloc(len + 1, GFP_NOFS); | ||
575 | if (!ename) { | ||
576 | err = -ENOMEM; | ||
577 | goto out_err; | 572 | goto out_err; |
578 | } | 573 | } |
579 | if (len <= inline_len) { | ||
580 | /* We have error in protocol buffer itself */ | ||
581 | if (pdu_read(req->rc, ename, len)) { | ||
582 | err = -EFAULT; | ||
583 | goto out_free; | ||
584 | 574 | ||
585 | } | 575 | ename = &req->rc->sdata[req->rc->offset]; |
586 | } else { | 576 | if (len > inline_len) { |
587 | /* | 577 | /* We have error in external buffer */ |
588 | * Part of the data is in user space buffer. | ||
589 | */ | ||
590 | if (pdu_read(req->rc, ename, inline_len)) { | ||
591 | err = -EFAULT; | ||
592 | goto out_free; | ||
593 | |||
594 | } | ||
595 | if (kern_buf) { | 578 | if (kern_buf) { |
596 | memcpy(ename + inline_len, uidata, | 579 | memcpy(ename + inline_len, uidata, |
597 | len - inline_len); | 580 | len - inline_len); |
@@ -600,19 +583,19 @@ static int p9_check_zc_errors(struct p9_client *c, struct p9_req_t *req, | |||
600 | uidata, len - inline_len); | 583 | uidata, len - inline_len); |
601 | if (err) { | 584 | if (err) { |
602 | err = -EFAULT; | 585 | err = -EFAULT; |
603 | goto out_free; | 586 | goto out_err; |
604 | } | 587 | } |
605 | } | 588 | } |
606 | } | 589 | } |
607 | ename[len] = 0; | 590 | ename = NULL; |
608 | if (p9_is_proto_dotu(c)) { | 591 | err = p9pdu_readf(req->rc, c->proto_version, "s?d", |
609 | /* For dotu we also have error code */ | 592 | &ename, &ecode); |
610 | err = p9pdu_readf(req->rc, | 593 | if (err) |
611 | c->proto_version, "d", &ecode); | 594 | goto out_err; |
612 | if (err) | 595 | |
613 | goto out_free; | 596 | if (p9_is_proto_dotu(c)) |
614 | err = -ecode; | 597 | err = -ecode; |
615 | } | 598 | |
616 | if (!err || !IS_ERR_VALUE(err)) { | 599 | if (!err || !IS_ERR_VALUE(err)) { |
617 | err = p9_errstr2errno(ename, strlen(ename)); | 600 | err = p9_errstr2errno(ename, strlen(ename)); |
618 | 601 | ||
@@ -628,8 +611,6 @@ static int p9_check_zc_errors(struct p9_client *c, struct p9_req_t *req, | |||
628 | } | 611 | } |
629 | return err; | 612 | return err; |
630 | 613 | ||
631 | out_free: | ||
632 | kfree(ename); | ||
633 | out_err: | 614 | out_err: |
634 | p9_debug(P9_DEBUG_ERROR, "couldn't parse error%d\n", err); | 615 | p9_debug(P9_DEBUG_ERROR, "couldn't parse error%d\n", err); |
635 | return err; | 616 | return err; |
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c index d07323b3e9b8..62da5278014a 100644 --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c | |||
@@ -70,6 +70,22 @@ static uint8_t batadv_ring_buffer_avg(const uint8_t lq_recv[]) | |||
70 | 70 | ||
71 | return (uint8_t)(sum / count); | 71 | return (uint8_t)(sum / count); |
72 | } | 72 | } |
73 | |||
74 | /* | ||
75 | * batadv_dup_status - duplicate status | ||
76 | * @BATADV_NO_DUP: the packet is a duplicate | ||
77 | * @BATADV_ORIG_DUP: OGM is a duplicate in the originator (but not for the | ||
78 | * neighbor) | ||
79 | * @BATADV_NEIGH_DUP: OGM is a duplicate for the neighbor | ||
80 | * @BATADV_PROTECTED: originator is currently protected (after reboot) | ||
81 | */ | ||
82 | enum batadv_dup_status { | ||
83 | BATADV_NO_DUP = 0, | ||
84 | BATADV_ORIG_DUP, | ||
85 | BATADV_NEIGH_DUP, | ||
86 | BATADV_PROTECTED, | ||
87 | }; | ||
88 | |||
73 | static struct batadv_neigh_node * | 89 | static struct batadv_neigh_node * |
74 | batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface, | 90 | batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface, |
75 | const uint8_t *neigh_addr, | 91 | const uint8_t *neigh_addr, |
@@ -723,7 +739,7 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, | |||
723 | const struct batadv_ogm_packet *batadv_ogm_packet, | 739 | const struct batadv_ogm_packet *batadv_ogm_packet, |
724 | struct batadv_hard_iface *if_incoming, | 740 | struct batadv_hard_iface *if_incoming, |
725 | const unsigned char *tt_buff, | 741 | const unsigned char *tt_buff, |
726 | int is_duplicate) | 742 | enum batadv_dup_status dup_status) |
727 | { | 743 | { |
728 | struct batadv_neigh_node *neigh_node = NULL, *tmp_neigh_node = NULL; | 744 | struct batadv_neigh_node *neigh_node = NULL, *tmp_neigh_node = NULL; |
729 | struct batadv_neigh_node *router = NULL; | 745 | struct batadv_neigh_node *router = NULL; |
@@ -749,7 +765,7 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, | |||
749 | continue; | 765 | continue; |
750 | } | 766 | } |
751 | 767 | ||
752 | if (is_duplicate) | 768 | if (dup_status != BATADV_NO_DUP) |
753 | continue; | 769 | continue; |
754 | 770 | ||
755 | spin_lock_bh(&tmp_neigh_node->lq_update_lock); | 771 | spin_lock_bh(&tmp_neigh_node->lq_update_lock); |
@@ -790,7 +806,7 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, | |||
790 | neigh_node->tq_avg = batadv_ring_buffer_avg(neigh_node->tq_recv); | 806 | neigh_node->tq_avg = batadv_ring_buffer_avg(neigh_node->tq_recv); |
791 | spin_unlock_bh(&neigh_node->lq_update_lock); | 807 | spin_unlock_bh(&neigh_node->lq_update_lock); |
792 | 808 | ||
793 | if (!is_duplicate) { | 809 | if (dup_status == BATADV_NO_DUP) { |
794 | orig_node->last_ttl = batadv_ogm_packet->header.ttl; | 810 | orig_node->last_ttl = batadv_ogm_packet->header.ttl; |
795 | neigh_node->last_ttl = batadv_ogm_packet->header.ttl; | 811 | neigh_node->last_ttl = batadv_ogm_packet->header.ttl; |
796 | } | 812 | } |
@@ -973,15 +989,16 @@ out: | |||
973 | return ret; | 989 | return ret; |
974 | } | 990 | } |
975 | 991 | ||
976 | /* processes a batman packet for all interfaces, adjusts the sequence number and | 992 | /** |
977 | * finds out whether it is a duplicate. | 993 | * batadv_iv_ogm_update_seqnos - process a batman packet for all interfaces, |
978 | * returns: | 994 | * adjust the sequence number and find out whether it is a duplicate |
979 | * 1 the packet is a duplicate | 995 | * @ethhdr: ethernet header of the packet |
980 | * 0 the packet has not yet been received | 996 | * @batadv_ogm_packet: OGM packet to be considered |
981 | * -1 the packet is old and has been received while the seqno window | 997 | * @if_incoming: interface on which the OGM packet was received |
982 | * was protected. Caller should drop it. | 998 | * |
999 | * Returns duplicate status as enum batadv_dup_status | ||
983 | */ | 1000 | */ |
984 | static int | 1001 | static enum batadv_dup_status |
985 | batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, | 1002 | batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, |
986 | const struct batadv_ogm_packet *batadv_ogm_packet, | 1003 | const struct batadv_ogm_packet *batadv_ogm_packet, |
987 | const struct batadv_hard_iface *if_incoming) | 1004 | const struct batadv_hard_iface *if_incoming) |
@@ -989,17 +1006,18 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, | |||
989 | struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); | 1006 | struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); |
990 | struct batadv_orig_node *orig_node; | 1007 | struct batadv_orig_node *orig_node; |
991 | struct batadv_neigh_node *tmp_neigh_node; | 1008 | struct batadv_neigh_node *tmp_neigh_node; |
992 | int is_duplicate = 0; | 1009 | int is_dup; |
993 | int32_t seq_diff; | 1010 | int32_t seq_diff; |
994 | int need_update = 0; | 1011 | int need_update = 0; |
995 | int set_mark, ret = -1; | 1012 | int set_mark; |
1013 | enum batadv_dup_status ret = BATADV_NO_DUP; | ||
996 | uint32_t seqno = ntohl(batadv_ogm_packet->seqno); | 1014 | uint32_t seqno = ntohl(batadv_ogm_packet->seqno); |
997 | uint8_t *neigh_addr; | 1015 | uint8_t *neigh_addr; |
998 | uint8_t packet_count; | 1016 | uint8_t packet_count; |
999 | 1017 | ||
1000 | orig_node = batadv_get_orig_node(bat_priv, batadv_ogm_packet->orig); | 1018 | orig_node = batadv_get_orig_node(bat_priv, batadv_ogm_packet->orig); |
1001 | if (!orig_node) | 1019 | if (!orig_node) |
1002 | return 0; | 1020 | return BATADV_NO_DUP; |
1003 | 1021 | ||
1004 | spin_lock_bh(&orig_node->ogm_cnt_lock); | 1022 | spin_lock_bh(&orig_node->ogm_cnt_lock); |
1005 | seq_diff = seqno - orig_node->last_real_seqno; | 1023 | seq_diff = seqno - orig_node->last_real_seqno; |
@@ -1007,22 +1025,29 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, | |||
1007 | /* signalize caller that the packet is to be dropped. */ | 1025 | /* signalize caller that the packet is to be dropped. */ |
1008 | if (!hlist_empty(&orig_node->neigh_list) && | 1026 | if (!hlist_empty(&orig_node->neigh_list) && |
1009 | batadv_window_protected(bat_priv, seq_diff, | 1027 | batadv_window_protected(bat_priv, seq_diff, |
1010 | &orig_node->batman_seqno_reset)) | 1028 | &orig_node->batman_seqno_reset)) { |
1029 | ret = BATADV_PROTECTED; | ||
1011 | goto out; | 1030 | goto out; |
1031 | } | ||
1012 | 1032 | ||
1013 | rcu_read_lock(); | 1033 | rcu_read_lock(); |
1014 | hlist_for_each_entry_rcu(tmp_neigh_node, | 1034 | hlist_for_each_entry_rcu(tmp_neigh_node, |
1015 | &orig_node->neigh_list, list) { | 1035 | &orig_node->neigh_list, list) { |
1016 | is_duplicate |= batadv_test_bit(tmp_neigh_node->real_bits, | ||
1017 | orig_node->last_real_seqno, | ||
1018 | seqno); | ||
1019 | |||
1020 | neigh_addr = tmp_neigh_node->addr; | 1036 | neigh_addr = tmp_neigh_node->addr; |
1037 | is_dup = batadv_test_bit(tmp_neigh_node->real_bits, | ||
1038 | orig_node->last_real_seqno, | ||
1039 | seqno); | ||
1040 | |||
1021 | if (batadv_compare_eth(neigh_addr, ethhdr->h_source) && | 1041 | if (batadv_compare_eth(neigh_addr, ethhdr->h_source) && |
1022 | tmp_neigh_node->if_incoming == if_incoming) | 1042 | tmp_neigh_node->if_incoming == if_incoming) { |
1023 | set_mark = 1; | 1043 | set_mark = 1; |
1024 | else | 1044 | if (is_dup) |
1045 | ret = BATADV_NEIGH_DUP; | ||
1046 | } else { | ||
1025 | set_mark = 0; | 1047 | set_mark = 0; |
1048 | if (is_dup && (ret != BATADV_NEIGH_DUP)) | ||
1049 | ret = BATADV_ORIG_DUP; | ||
1050 | } | ||
1026 | 1051 | ||
1027 | /* if the window moved, set the update flag. */ | 1052 | /* if the window moved, set the update flag. */ |
1028 | need_update |= batadv_bit_get_packet(bat_priv, | 1053 | need_update |= batadv_bit_get_packet(bat_priv, |
@@ -1042,8 +1067,6 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, | |||
1042 | orig_node->last_real_seqno = seqno; | 1067 | orig_node->last_real_seqno = seqno; |
1043 | } | 1068 | } |
1044 | 1069 | ||
1045 | ret = is_duplicate; | ||
1046 | |||
1047 | out: | 1070 | out: |
1048 | spin_unlock_bh(&orig_node->ogm_cnt_lock); | 1071 | spin_unlock_bh(&orig_node->ogm_cnt_lock); |
1049 | batadv_orig_node_free_ref(orig_node); | 1072 | batadv_orig_node_free_ref(orig_node); |
@@ -1065,7 +1088,8 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1065 | int is_bidirect; | 1088 | int is_bidirect; |
1066 | bool is_single_hop_neigh = false; | 1089 | bool is_single_hop_neigh = false; |
1067 | bool is_from_best_next_hop = false; | 1090 | bool is_from_best_next_hop = false; |
1068 | int is_duplicate, sameseq, simlar_ttl; | 1091 | int sameseq, similar_ttl; |
1092 | enum batadv_dup_status dup_status; | ||
1069 | uint32_t if_incoming_seqno; | 1093 | uint32_t if_incoming_seqno; |
1070 | uint8_t *prev_sender; | 1094 | uint8_t *prev_sender; |
1071 | 1095 | ||
@@ -1192,10 +1216,10 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1192 | if (!orig_node) | 1216 | if (!orig_node) |
1193 | return; | 1217 | return; |
1194 | 1218 | ||
1195 | is_duplicate = batadv_iv_ogm_update_seqnos(ethhdr, batadv_ogm_packet, | 1219 | dup_status = batadv_iv_ogm_update_seqnos(ethhdr, batadv_ogm_packet, |
1196 | if_incoming); | 1220 | if_incoming); |
1197 | 1221 | ||
1198 | if (is_duplicate == -1) { | 1222 | if (dup_status == BATADV_PROTECTED) { |
1199 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, | 1223 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, |
1200 | "Drop packet: packet within seqno protection time (sender: %pM)\n", | 1224 | "Drop packet: packet within seqno protection time (sender: %pM)\n", |
1201 | ethhdr->h_source); | 1225 | ethhdr->h_source); |
@@ -1265,11 +1289,12 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1265 | * seqno and similar ttl as the non-duplicate | 1289 | * seqno and similar ttl as the non-duplicate |
1266 | */ | 1290 | */ |
1267 | sameseq = orig_node->last_real_seqno == ntohl(batadv_ogm_packet->seqno); | 1291 | sameseq = orig_node->last_real_seqno == ntohl(batadv_ogm_packet->seqno); |
1268 | simlar_ttl = orig_node->last_ttl - 3 <= batadv_ogm_packet->header.ttl; | 1292 | similar_ttl = orig_node->last_ttl - 3 <= batadv_ogm_packet->header.ttl; |
1269 | if (is_bidirect && (!is_duplicate || (sameseq && simlar_ttl))) | 1293 | if (is_bidirect && ((dup_status == BATADV_NO_DUP) || |
1294 | (sameseq && similar_ttl))) | ||
1270 | batadv_iv_ogm_orig_update(bat_priv, orig_node, ethhdr, | 1295 | batadv_iv_ogm_orig_update(bat_priv, orig_node, ethhdr, |
1271 | batadv_ogm_packet, if_incoming, | 1296 | batadv_ogm_packet, if_incoming, |
1272 | tt_buff, is_duplicate); | 1297 | tt_buff, dup_status); |
1273 | 1298 | ||
1274 | /* is single hop (direct) neighbor */ | 1299 | /* is single hop (direct) neighbor */ |
1275 | if (is_single_hop_neigh) { | 1300 | if (is_single_hop_neigh) { |
@@ -1290,7 +1315,7 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1290 | goto out_neigh; | 1315 | goto out_neigh; |
1291 | } | 1316 | } |
1292 | 1317 | ||
1293 | if (is_duplicate) { | 1318 | if (dup_status == BATADV_NEIGH_DUP) { |
1294 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, | 1319 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, |
1295 | "Drop packet: duplicate packet received\n"); | 1320 | "Drop packet: duplicate packet received\n"); |
1296 | goto out_neigh; | 1321 | goto out_neigh; |
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c index e9d8e0b3c3d0..e14531f1ce1c 100644 --- a/net/batman-adv/bridge_loop_avoidance.c +++ b/net/batman-adv/bridge_loop_avoidance.c | |||
@@ -1073,6 +1073,10 @@ void batadv_bla_update_orig_address(struct batadv_priv *bat_priv, | |||
1073 | group = htons(crc16(0, primary_if->net_dev->dev_addr, ETH_ALEN)); | 1073 | group = htons(crc16(0, primary_if->net_dev->dev_addr, ETH_ALEN)); |
1074 | bat_priv->bla.claim_dest.group = group; | 1074 | bat_priv->bla.claim_dest.group = group; |
1075 | 1075 | ||
1076 | /* purge everything when bridge loop avoidance is turned off */ | ||
1077 | if (!atomic_read(&bat_priv->bridge_loop_avoidance)) | ||
1078 | oldif = NULL; | ||
1079 | |||
1076 | if (!oldif) { | 1080 | if (!oldif) { |
1077 | batadv_bla_purge_claims(bat_priv, NULL, 1); | 1081 | batadv_bla_purge_claims(bat_priv, NULL, 1); |
1078 | batadv_bla_purge_backbone_gw(bat_priv, 1); | 1082 | batadv_bla_purge_backbone_gw(bat_priv, 1); |
diff --git a/net/batman-adv/sysfs.c b/net/batman-adv/sysfs.c index 15a22efa9a67..929e304dacb2 100644 --- a/net/batman-adv/sysfs.c +++ b/net/batman-adv/sysfs.c | |||
@@ -582,10 +582,7 @@ static ssize_t batadv_store_mesh_iface(struct kobject *kobj, | |||
582 | (strncmp(hard_iface->soft_iface->name, buff, IFNAMSIZ) == 0)) | 582 | (strncmp(hard_iface->soft_iface->name, buff, IFNAMSIZ) == 0)) |
583 | goto out; | 583 | goto out; |
584 | 584 | ||
585 | if (!rtnl_trylock()) { | 585 | rtnl_lock(); |
586 | ret = -ERESTARTSYS; | ||
587 | goto out; | ||
588 | } | ||
589 | 586 | ||
590 | if (status_tmp == BATADV_IF_NOT_IN_USE) { | 587 | if (status_tmp == BATADV_IF_NOT_IN_USE) { |
591 | batadv_hardif_disable_interface(hard_iface, | 588 | batadv_hardif_disable_interface(hard_iface, |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 33843c5c4939..ace5e55fe5a3 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -341,7 +341,6 @@ static void hci_init1_req(struct hci_request *req, unsigned long opt) | |||
341 | 341 | ||
342 | static void bredr_setup(struct hci_request *req) | 342 | static void bredr_setup(struct hci_request *req) |
343 | { | 343 | { |
344 | struct hci_cp_delete_stored_link_key cp; | ||
345 | __le16 param; | 344 | __le16 param; |
346 | __u8 flt_type; | 345 | __u8 flt_type; |
347 | 346 | ||
@@ -365,10 +364,6 @@ static void bredr_setup(struct hci_request *req) | |||
365 | param = __constant_cpu_to_le16(0x7d00); | 364 | param = __constant_cpu_to_le16(0x7d00); |
366 | hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); | 365 | hci_req_add(req, HCI_OP_WRITE_CA_TIMEOUT, 2, ¶m); |
367 | 366 | ||
368 | bacpy(&cp.bdaddr, BDADDR_ANY); | ||
369 | cp.delete_all = 0x01; | ||
370 | hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY, sizeof(cp), &cp); | ||
371 | |||
372 | /* Read page scan parameters */ | 367 | /* Read page scan parameters */ |
373 | if (req->hdev->hci_ver > BLUETOOTH_VER_1_1) { | 368 | if (req->hdev->hci_ver > BLUETOOTH_VER_1_1) { |
374 | hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL); | 369 | hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL); |
@@ -602,6 +597,16 @@ static void hci_init3_req(struct hci_request *req, unsigned long opt) | |||
602 | struct hci_dev *hdev = req->hdev; | 597 | struct hci_dev *hdev = req->hdev; |
603 | u8 p; | 598 | u8 p; |
604 | 599 | ||
600 | /* Only send HCI_Delete_Stored_Link_Key if it is supported */ | ||
601 | if (hdev->commands[6] & 0x80) { | ||
602 | struct hci_cp_delete_stored_link_key cp; | ||
603 | |||
604 | bacpy(&cp.bdaddr, BDADDR_ANY); | ||
605 | cp.delete_all = 0x01; | ||
606 | hci_req_add(req, HCI_OP_DELETE_STORED_LINK_KEY, | ||
607 | sizeof(cp), &cp); | ||
608 | } | ||
609 | |||
605 | if (hdev->commands[5] & 0x10) | 610 | if (hdev->commands[5] & 0x10) |
606 | hci_setup_link_policy(req); | 611 | hci_setup_link_policy(req); |
607 | 612 | ||
@@ -1555,11 +1560,15 @@ static const struct rfkill_ops hci_rfkill_ops = { | |||
1555 | static void hci_power_on(struct work_struct *work) | 1560 | static void hci_power_on(struct work_struct *work) |
1556 | { | 1561 | { |
1557 | struct hci_dev *hdev = container_of(work, struct hci_dev, power_on); | 1562 | struct hci_dev *hdev = container_of(work, struct hci_dev, power_on); |
1563 | int err; | ||
1558 | 1564 | ||
1559 | BT_DBG("%s", hdev->name); | 1565 | BT_DBG("%s", hdev->name); |
1560 | 1566 | ||
1561 | if (hci_dev_open(hdev->id) < 0) | 1567 | err = hci_dev_open(hdev->id); |
1568 | if (err < 0) { | ||
1569 | mgmt_set_powered_failed(hdev, err); | ||
1562 | return; | 1570 | return; |
1571 | } | ||
1563 | 1572 | ||
1564 | if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) | 1573 | if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) |
1565 | queue_delayed_work(hdev->req_workqueue, &hdev->power_off, | 1574 | queue_delayed_work(hdev->req_workqueue, &hdev->power_off, |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index a76d1ac0321b..4be6a264b475 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -2852,6 +2852,9 @@ static struct sk_buff *l2cap_build_cmd(struct l2cap_conn *conn, u8 code, | |||
2852 | BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u", | 2852 | BT_DBG("conn %p, code 0x%2.2x, ident 0x%2.2x, len %u", |
2853 | conn, code, ident, dlen); | 2853 | conn, code, ident, dlen); |
2854 | 2854 | ||
2855 | if (conn->mtu < L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE) | ||
2856 | return NULL; | ||
2857 | |||
2855 | len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen; | 2858 | len = L2CAP_HDR_SIZE + L2CAP_CMD_HDR_SIZE + dlen; |
2856 | count = min_t(unsigned int, conn->mtu, len); | 2859 | count = min_t(unsigned int, conn->mtu, len); |
2857 | 2860 | ||
@@ -3677,10 +3680,14 @@ static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len) | |||
3677 | } | 3680 | } |
3678 | 3681 | ||
3679 | static inline int l2cap_command_rej(struct l2cap_conn *conn, | 3682 | static inline int l2cap_command_rej(struct l2cap_conn *conn, |
3680 | struct l2cap_cmd_hdr *cmd, u8 *data) | 3683 | struct l2cap_cmd_hdr *cmd, u16 cmd_len, |
3684 | u8 *data) | ||
3681 | { | 3685 | { |
3682 | struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data; | 3686 | struct l2cap_cmd_rej_unk *rej = (struct l2cap_cmd_rej_unk *) data; |
3683 | 3687 | ||
3688 | if (cmd_len < sizeof(*rej)) | ||
3689 | return -EPROTO; | ||
3690 | |||
3684 | if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD) | 3691 | if (rej->reason != L2CAP_REJ_NOT_UNDERSTOOD) |
3685 | return 0; | 3692 | return 0; |
3686 | 3693 | ||
@@ -3829,11 +3836,14 @@ sendresp: | |||
3829 | } | 3836 | } |
3830 | 3837 | ||
3831 | static int l2cap_connect_req(struct l2cap_conn *conn, | 3838 | static int l2cap_connect_req(struct l2cap_conn *conn, |
3832 | struct l2cap_cmd_hdr *cmd, u8 *data) | 3839 | struct l2cap_cmd_hdr *cmd, u16 cmd_len, u8 *data) |
3833 | { | 3840 | { |
3834 | struct hci_dev *hdev = conn->hcon->hdev; | 3841 | struct hci_dev *hdev = conn->hcon->hdev; |
3835 | struct hci_conn *hcon = conn->hcon; | 3842 | struct hci_conn *hcon = conn->hcon; |
3836 | 3843 | ||
3844 | if (cmd_len < sizeof(struct l2cap_conn_req)) | ||
3845 | return -EPROTO; | ||
3846 | |||
3837 | hci_dev_lock(hdev); | 3847 | hci_dev_lock(hdev); |
3838 | if (test_bit(HCI_MGMT, &hdev->dev_flags) && | 3848 | if (test_bit(HCI_MGMT, &hdev->dev_flags) && |
3839 | !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags)) | 3849 | !test_and_set_bit(HCI_CONN_MGMT_CONNECTED, &hcon->flags)) |
@@ -3847,7 +3857,8 @@ static int l2cap_connect_req(struct l2cap_conn *conn, | |||
3847 | } | 3857 | } |
3848 | 3858 | ||
3849 | static int l2cap_connect_create_rsp(struct l2cap_conn *conn, | 3859 | static int l2cap_connect_create_rsp(struct l2cap_conn *conn, |
3850 | struct l2cap_cmd_hdr *cmd, u8 *data) | 3860 | struct l2cap_cmd_hdr *cmd, u16 cmd_len, |
3861 | u8 *data) | ||
3851 | { | 3862 | { |
3852 | struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data; | 3863 | struct l2cap_conn_rsp *rsp = (struct l2cap_conn_rsp *) data; |
3853 | u16 scid, dcid, result, status; | 3864 | u16 scid, dcid, result, status; |
@@ -3855,6 +3866,9 @@ static int l2cap_connect_create_rsp(struct l2cap_conn *conn, | |||
3855 | u8 req[128]; | 3866 | u8 req[128]; |
3856 | int err; | 3867 | int err; |
3857 | 3868 | ||
3869 | if (cmd_len < sizeof(*rsp)) | ||
3870 | return -EPROTO; | ||
3871 | |||
3858 | scid = __le16_to_cpu(rsp->scid); | 3872 | scid = __le16_to_cpu(rsp->scid); |
3859 | dcid = __le16_to_cpu(rsp->dcid); | 3873 | dcid = __le16_to_cpu(rsp->dcid); |
3860 | result = __le16_to_cpu(rsp->result); | 3874 | result = __le16_to_cpu(rsp->result); |
@@ -3952,6 +3966,9 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, | |||
3952 | struct l2cap_chan *chan; | 3966 | struct l2cap_chan *chan; |
3953 | int len, err = 0; | 3967 | int len, err = 0; |
3954 | 3968 | ||
3969 | if (cmd_len < sizeof(*req)) | ||
3970 | return -EPROTO; | ||
3971 | |||
3955 | dcid = __le16_to_cpu(req->dcid); | 3972 | dcid = __le16_to_cpu(req->dcid); |
3956 | flags = __le16_to_cpu(req->flags); | 3973 | flags = __le16_to_cpu(req->flags); |
3957 | 3974 | ||
@@ -3975,7 +3992,7 @@ static inline int l2cap_config_req(struct l2cap_conn *conn, | |||
3975 | 3992 | ||
3976 | /* Reject if config buffer is too small. */ | 3993 | /* Reject if config buffer is too small. */ |
3977 | len = cmd_len - sizeof(*req); | 3994 | len = cmd_len - sizeof(*req); |
3978 | if (len < 0 || chan->conf_len + len > sizeof(chan->conf_req)) { | 3995 | if (chan->conf_len + len > sizeof(chan->conf_req)) { |
3979 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, | 3996 | l2cap_send_cmd(conn, cmd->ident, L2CAP_CONF_RSP, |
3980 | l2cap_build_conf_rsp(chan, rsp, | 3997 | l2cap_build_conf_rsp(chan, rsp, |
3981 | L2CAP_CONF_REJECT, flags), rsp); | 3998 | L2CAP_CONF_REJECT, flags), rsp); |
@@ -4053,14 +4070,18 @@ unlock: | |||
4053 | } | 4070 | } |
4054 | 4071 | ||
4055 | static inline int l2cap_config_rsp(struct l2cap_conn *conn, | 4072 | static inline int l2cap_config_rsp(struct l2cap_conn *conn, |
4056 | struct l2cap_cmd_hdr *cmd, u8 *data) | 4073 | struct l2cap_cmd_hdr *cmd, u16 cmd_len, |
4074 | u8 *data) | ||
4057 | { | 4075 | { |
4058 | struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data; | 4076 | struct l2cap_conf_rsp *rsp = (struct l2cap_conf_rsp *)data; |
4059 | u16 scid, flags, result; | 4077 | u16 scid, flags, result; |
4060 | struct l2cap_chan *chan; | 4078 | struct l2cap_chan *chan; |
4061 | int len = le16_to_cpu(cmd->len) - sizeof(*rsp); | 4079 | int len = cmd_len - sizeof(*rsp); |
4062 | int err = 0; | 4080 | int err = 0; |
4063 | 4081 | ||
4082 | if (cmd_len < sizeof(*rsp)) | ||
4083 | return -EPROTO; | ||
4084 | |||
4064 | scid = __le16_to_cpu(rsp->scid); | 4085 | scid = __le16_to_cpu(rsp->scid); |
4065 | flags = __le16_to_cpu(rsp->flags); | 4086 | flags = __le16_to_cpu(rsp->flags); |
4066 | result = __le16_to_cpu(rsp->result); | 4087 | result = __le16_to_cpu(rsp->result); |
@@ -4161,7 +4182,8 @@ done: | |||
4161 | } | 4182 | } |
4162 | 4183 | ||
4163 | static inline int l2cap_disconnect_req(struct l2cap_conn *conn, | 4184 | static inline int l2cap_disconnect_req(struct l2cap_conn *conn, |
4164 | struct l2cap_cmd_hdr *cmd, u8 *data) | 4185 | struct l2cap_cmd_hdr *cmd, u16 cmd_len, |
4186 | u8 *data) | ||
4165 | { | 4187 | { |
4166 | struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data; | 4188 | struct l2cap_disconn_req *req = (struct l2cap_disconn_req *) data; |
4167 | struct l2cap_disconn_rsp rsp; | 4189 | struct l2cap_disconn_rsp rsp; |
@@ -4169,6 +4191,9 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, | |||
4169 | struct l2cap_chan *chan; | 4191 | struct l2cap_chan *chan; |
4170 | struct sock *sk; | 4192 | struct sock *sk; |
4171 | 4193 | ||
4194 | if (cmd_len != sizeof(*req)) | ||
4195 | return -EPROTO; | ||
4196 | |||
4172 | scid = __le16_to_cpu(req->scid); | 4197 | scid = __le16_to_cpu(req->scid); |
4173 | dcid = __le16_to_cpu(req->dcid); | 4198 | dcid = __le16_to_cpu(req->dcid); |
4174 | 4199 | ||
@@ -4208,12 +4233,16 @@ static inline int l2cap_disconnect_req(struct l2cap_conn *conn, | |||
4208 | } | 4233 | } |
4209 | 4234 | ||
4210 | static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, | 4235 | static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, |
4211 | struct l2cap_cmd_hdr *cmd, u8 *data) | 4236 | struct l2cap_cmd_hdr *cmd, u16 cmd_len, |
4237 | u8 *data) | ||
4212 | { | 4238 | { |
4213 | struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data; | 4239 | struct l2cap_disconn_rsp *rsp = (struct l2cap_disconn_rsp *) data; |
4214 | u16 dcid, scid; | 4240 | u16 dcid, scid; |
4215 | struct l2cap_chan *chan; | 4241 | struct l2cap_chan *chan; |
4216 | 4242 | ||
4243 | if (cmd_len != sizeof(*rsp)) | ||
4244 | return -EPROTO; | ||
4245 | |||
4217 | scid = __le16_to_cpu(rsp->scid); | 4246 | scid = __le16_to_cpu(rsp->scid); |
4218 | dcid = __le16_to_cpu(rsp->dcid); | 4247 | dcid = __le16_to_cpu(rsp->dcid); |
4219 | 4248 | ||
@@ -4243,11 +4272,15 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, | |||
4243 | } | 4272 | } |
4244 | 4273 | ||
4245 | static inline int l2cap_information_req(struct l2cap_conn *conn, | 4274 | static inline int l2cap_information_req(struct l2cap_conn *conn, |
4246 | struct l2cap_cmd_hdr *cmd, u8 *data) | 4275 | struct l2cap_cmd_hdr *cmd, u16 cmd_len, |
4276 | u8 *data) | ||
4247 | { | 4277 | { |
4248 | struct l2cap_info_req *req = (struct l2cap_info_req *) data; | 4278 | struct l2cap_info_req *req = (struct l2cap_info_req *) data; |
4249 | u16 type; | 4279 | u16 type; |
4250 | 4280 | ||
4281 | if (cmd_len != sizeof(*req)) | ||
4282 | return -EPROTO; | ||
4283 | |||
4251 | type = __le16_to_cpu(req->type); | 4284 | type = __le16_to_cpu(req->type); |
4252 | 4285 | ||
4253 | BT_DBG("type 0x%4.4x", type); | 4286 | BT_DBG("type 0x%4.4x", type); |
@@ -4294,11 +4327,15 @@ static inline int l2cap_information_req(struct l2cap_conn *conn, | |||
4294 | } | 4327 | } |
4295 | 4328 | ||
4296 | static inline int l2cap_information_rsp(struct l2cap_conn *conn, | 4329 | static inline int l2cap_information_rsp(struct l2cap_conn *conn, |
4297 | struct l2cap_cmd_hdr *cmd, u8 *data) | 4330 | struct l2cap_cmd_hdr *cmd, u16 cmd_len, |
4331 | u8 *data) | ||
4298 | { | 4332 | { |
4299 | struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data; | 4333 | struct l2cap_info_rsp *rsp = (struct l2cap_info_rsp *) data; |
4300 | u16 type, result; | 4334 | u16 type, result; |
4301 | 4335 | ||
4336 | if (cmd_len != sizeof(*rsp)) | ||
4337 | return -EPROTO; | ||
4338 | |||
4302 | type = __le16_to_cpu(rsp->type); | 4339 | type = __le16_to_cpu(rsp->type); |
4303 | result = __le16_to_cpu(rsp->result); | 4340 | result = __le16_to_cpu(rsp->result); |
4304 | 4341 | ||
@@ -5164,16 +5201,16 @@ static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn, | |||
5164 | 5201 | ||
5165 | switch (cmd->code) { | 5202 | switch (cmd->code) { |
5166 | case L2CAP_COMMAND_REJ: | 5203 | case L2CAP_COMMAND_REJ: |
5167 | l2cap_command_rej(conn, cmd, data); | 5204 | l2cap_command_rej(conn, cmd, cmd_len, data); |
5168 | break; | 5205 | break; |
5169 | 5206 | ||
5170 | case L2CAP_CONN_REQ: | 5207 | case L2CAP_CONN_REQ: |
5171 | err = l2cap_connect_req(conn, cmd, data); | 5208 | err = l2cap_connect_req(conn, cmd, cmd_len, data); |
5172 | break; | 5209 | break; |
5173 | 5210 | ||
5174 | case L2CAP_CONN_RSP: | 5211 | case L2CAP_CONN_RSP: |
5175 | case L2CAP_CREATE_CHAN_RSP: | 5212 | case L2CAP_CREATE_CHAN_RSP: |
5176 | err = l2cap_connect_create_rsp(conn, cmd, data); | 5213 | err = l2cap_connect_create_rsp(conn, cmd, cmd_len, data); |
5177 | break; | 5214 | break; |
5178 | 5215 | ||
5179 | case L2CAP_CONF_REQ: | 5216 | case L2CAP_CONF_REQ: |
@@ -5181,15 +5218,15 @@ static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn, | |||
5181 | break; | 5218 | break; |
5182 | 5219 | ||
5183 | case L2CAP_CONF_RSP: | 5220 | case L2CAP_CONF_RSP: |
5184 | err = l2cap_config_rsp(conn, cmd, data); | 5221 | err = l2cap_config_rsp(conn, cmd, cmd_len, data); |
5185 | break; | 5222 | break; |
5186 | 5223 | ||
5187 | case L2CAP_DISCONN_REQ: | 5224 | case L2CAP_DISCONN_REQ: |
5188 | err = l2cap_disconnect_req(conn, cmd, data); | 5225 | err = l2cap_disconnect_req(conn, cmd, cmd_len, data); |
5189 | break; | 5226 | break; |
5190 | 5227 | ||
5191 | case L2CAP_DISCONN_RSP: | 5228 | case L2CAP_DISCONN_RSP: |
5192 | err = l2cap_disconnect_rsp(conn, cmd, data); | 5229 | err = l2cap_disconnect_rsp(conn, cmd, cmd_len, data); |
5193 | break; | 5230 | break; |
5194 | 5231 | ||
5195 | case L2CAP_ECHO_REQ: | 5232 | case L2CAP_ECHO_REQ: |
@@ -5200,11 +5237,11 @@ static inline int l2cap_bredr_sig_cmd(struct l2cap_conn *conn, | |||
5200 | break; | 5237 | break; |
5201 | 5238 | ||
5202 | case L2CAP_INFO_REQ: | 5239 | case L2CAP_INFO_REQ: |
5203 | err = l2cap_information_req(conn, cmd, data); | 5240 | err = l2cap_information_req(conn, cmd, cmd_len, data); |
5204 | break; | 5241 | break; |
5205 | 5242 | ||
5206 | case L2CAP_INFO_RSP: | 5243 | case L2CAP_INFO_RSP: |
5207 | err = l2cap_information_rsp(conn, cmd, data); | 5244 | err = l2cap_information_rsp(conn, cmd, cmd_len, data); |
5208 | break; | 5245 | break; |
5209 | 5246 | ||
5210 | case L2CAP_CREATE_CHAN_REQ: | 5247 | case L2CAP_CREATE_CHAN_REQ: |
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 35fef22703e9..f8ecbc70293d 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c | |||
@@ -2700,7 +2700,7 @@ static int start_discovery(struct sock *sk, struct hci_dev *hdev, | |||
2700 | break; | 2700 | break; |
2701 | 2701 | ||
2702 | case DISCOV_TYPE_LE: | 2702 | case DISCOV_TYPE_LE: |
2703 | if (!lmp_host_le_capable(hdev)) { | 2703 | if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) { |
2704 | err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY, | 2704 | err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY, |
2705 | MGMT_STATUS_NOT_SUPPORTED); | 2705 | MGMT_STATUS_NOT_SUPPORTED); |
2706 | mgmt_pending_remove(cmd); | 2706 | mgmt_pending_remove(cmd); |
@@ -3418,6 +3418,27 @@ new_settings: | |||
3418 | return err; | 3418 | return err; |
3419 | } | 3419 | } |
3420 | 3420 | ||
3421 | int mgmt_set_powered_failed(struct hci_dev *hdev, int err) | ||
3422 | { | ||
3423 | struct pending_cmd *cmd; | ||
3424 | u8 status; | ||
3425 | |||
3426 | cmd = mgmt_pending_find(MGMT_OP_SET_POWERED, hdev); | ||
3427 | if (!cmd) | ||
3428 | return -ENOENT; | ||
3429 | |||
3430 | if (err == -ERFKILL) | ||
3431 | status = MGMT_STATUS_RFKILLED; | ||
3432 | else | ||
3433 | status = MGMT_STATUS_FAILED; | ||
3434 | |||
3435 | err = cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status); | ||
3436 | |||
3437 | mgmt_pending_remove(cmd); | ||
3438 | |||
3439 | return err; | ||
3440 | } | ||
3441 | |||
3421 | int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable) | 3442 | int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable) |
3422 | { | 3443 | { |
3423 | struct cmd_lookup match = { NULL, hdev }; | 3444 | struct cmd_lookup match = { NULL, hdev }; |
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c index b2296d3857a0..b5562abdd6e0 100644 --- a/net/bluetooth/smp.c +++ b/net/bluetooth/smp.c | |||
@@ -770,7 +770,7 @@ int smp_conn_security(struct hci_conn *hcon, __u8 sec_level) | |||
770 | 770 | ||
771 | BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level); | 771 | BT_DBG("conn %p hcon %p level 0x%2.2x", conn, hcon, sec_level); |
772 | 772 | ||
773 | if (!lmp_host_le_capable(hcon->hdev)) | 773 | if (!test_bit(HCI_LE_ENABLED, &hcon->hdev->dev_flags)) |
774 | return 1; | 774 | return 1; |
775 | 775 | ||
776 | if (sec_level == BT_SECURITY_LOW) | 776 | if (sec_level == BT_SECURITY_LOW) |
@@ -851,7 +851,7 @@ int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb) | |||
851 | __u8 reason; | 851 | __u8 reason; |
852 | int err = 0; | 852 | int err = 0; |
853 | 853 | ||
854 | if (!lmp_host_le_capable(conn->hcon->hdev)) { | 854 | if (!test_bit(HCI_LE_ENABLED, &conn->hcon->hdev->dev_flags)) { |
855 | err = -ENOTSUPP; | 855 | err = -ENOTSUPP; |
856 | reason = SMP_PAIRING_NOTSUPP; | 856 | reason = SMP_PAIRING_NOTSUPP; |
857 | goto done; | 857 | goto done; |
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 37a467697967..31952a103949 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
@@ -467,8 +467,9 @@ static struct sk_buff *br_ip6_multicast_alloc_query(struct net_bridge *br, | |||
467 | skb_set_transport_header(skb, skb->len); | 467 | skb_set_transport_header(skb, skb->len); |
468 | mldq = (struct mld_msg *) icmp6_hdr(skb); | 468 | mldq = (struct mld_msg *) icmp6_hdr(skb); |
469 | 469 | ||
470 | interval = ipv6_addr_any(group) ? br->multicast_last_member_interval : | 470 | interval = ipv6_addr_any(group) ? |
471 | br->multicast_query_response_interval; | 471 | br->multicast_query_response_interval : |
472 | br->multicast_last_member_interval; | ||
472 | 473 | ||
473 | mldq->mld_type = ICMPV6_MGM_QUERY; | 474 | mldq->mld_type = ICMPV6_MGM_QUERY; |
474 | mldq->mld_code = 0; | 475 | mldq->mld_code = 0; |
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index d5953b87918c..3a246a6cab47 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
@@ -1675,13 +1675,13 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | |||
1675 | __register_request(osdc, req); | 1675 | __register_request(osdc, req); |
1676 | __unregister_linger_request(osdc, req); | 1676 | __unregister_linger_request(osdc, req); |
1677 | } | 1677 | } |
1678 | reset_changed_osds(osdc); | ||
1678 | mutex_unlock(&osdc->request_mutex); | 1679 | mutex_unlock(&osdc->request_mutex); |
1679 | 1680 | ||
1680 | if (needmap) { | 1681 | if (needmap) { |
1681 | dout("%d requests for down osds, need new map\n", needmap); | 1682 | dout("%d requests for down osds, need new map\n", needmap); |
1682 | ceph_monc_request_next_osdmap(&osdc->client->monc); | 1683 | ceph_monc_request_next_osdmap(&osdc->client->monc); |
1683 | } | 1684 | } |
1684 | reset_changed_osds(osdc); | ||
1685 | } | 1685 | } |
1686 | 1686 | ||
1687 | 1687 | ||
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index cd23d314d68a..9255bbdf81ff 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
@@ -60,10 +60,10 @@ static const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] | |||
60 | [NETIF_F_IPV6_CSUM_BIT] = "tx-checksum-ipv6", | 60 | [NETIF_F_IPV6_CSUM_BIT] = "tx-checksum-ipv6", |
61 | [NETIF_F_HIGHDMA_BIT] = "highdma", | 61 | [NETIF_F_HIGHDMA_BIT] = "highdma", |
62 | [NETIF_F_FRAGLIST_BIT] = "tx-scatter-gather-fraglist", | 62 | [NETIF_F_FRAGLIST_BIT] = "tx-scatter-gather-fraglist", |
63 | [NETIF_F_HW_VLAN_CTAG_TX_BIT] = "tx-vlan-ctag-hw-insert", | 63 | [NETIF_F_HW_VLAN_CTAG_TX_BIT] = "tx-vlan-hw-insert", |
64 | 64 | ||
65 | [NETIF_F_HW_VLAN_CTAG_RX_BIT] = "rx-vlan-ctag-hw-parse", | 65 | [NETIF_F_HW_VLAN_CTAG_RX_BIT] = "rx-vlan-hw-parse", |
66 | [NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-ctag-filter", | 66 | [NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter", |
67 | [NETIF_F_HW_VLAN_STAG_TX_BIT] = "tx-vlan-stag-hw-insert", | 67 | [NETIF_F_HW_VLAN_STAG_TX_BIT] = "tx-vlan-stag-hw-insert", |
68 | [NETIF_F_HW_VLAN_STAG_RX_BIT] = "rx-vlan-stag-hw-parse", | 68 | [NETIF_F_HW_VLAN_STAG_RX_BIT] = "rx-vlan-stag-hw-parse", |
69 | [NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter", | 69 | [NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter", |
diff --git a/net/core/filter.c b/net/core/filter.c index dad2a178f9f8..6438f29ff266 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -778,7 +778,7 @@ int sk_detach_filter(struct sock *sk) | |||
778 | } | 778 | } |
779 | EXPORT_SYMBOL_GPL(sk_detach_filter); | 779 | EXPORT_SYMBOL_GPL(sk_detach_filter); |
780 | 780 | ||
781 | static void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to) | 781 | void sk_decode_filter(struct sock_filter *filt, struct sock_filter *to) |
782 | { | 782 | { |
783 | static const u16 decodes[] = { | 783 | static const u16 decodes[] = { |
784 | [BPF_S_ALU_ADD_K] = BPF_ALU|BPF_ADD|BPF_K, | 784 | [BPF_S_ALU_ADD_K] = BPF_ALU|BPF_ADD|BPF_K, |
diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c index d5bef0b0f639..a0e9cf6379de 100644 --- a/net/core/sock_diag.c +++ b/net/core/sock_diag.c | |||
@@ -73,8 +73,13 @@ int sock_diag_put_filterinfo(struct user_namespace *user_ns, struct sock *sk, | |||
73 | goto out; | 73 | goto out; |
74 | } | 74 | } |
75 | 75 | ||
76 | if (filter) | 76 | if (filter) { |
77 | memcpy(nla_data(attr), filter->insns, len); | 77 | struct sock_filter *fb = (struct sock_filter *)nla_data(attr); |
78 | int i; | ||
79 | |||
80 | for (i = 0; i < filter->len; i++, fb++) | ||
81 | sk_decode_filter(&filter->insns[i], fb); | ||
82 | } | ||
78 | 83 | ||
79 | out: | 84 | out: |
80 | rcu_read_unlock(); | 85 | rcu_read_unlock(); |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index 7c79cf8ad449..e189db409b0e 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
@@ -853,7 +853,7 @@ void ip_tunnel_dellink(struct net_device *dev, struct list_head *head) | |||
853 | } | 853 | } |
854 | EXPORT_SYMBOL_GPL(ip_tunnel_dellink); | 854 | EXPORT_SYMBOL_GPL(ip_tunnel_dellink); |
855 | 855 | ||
856 | int __net_init ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, | 856 | int ip_tunnel_init_net(struct net *net, int ip_tnl_net_id, |
857 | struct rtnl_link_ops *ops, char *devname) | 857 | struct rtnl_link_ops *ops, char *devname) |
858 | { | 858 | { |
859 | struct ip_tunnel_net *itn = net_generic(net, ip_tnl_net_id); | 859 | struct ip_tunnel_net *itn = net_generic(net, ip_tnl_net_id); |
@@ -899,7 +899,7 @@ static void ip_tunnel_destroy(struct ip_tunnel_net *itn, struct list_head *head) | |||
899 | unregister_netdevice_queue(itn->fb_tunnel_dev, head); | 899 | unregister_netdevice_queue(itn->fb_tunnel_dev, head); |
900 | } | 900 | } |
901 | 901 | ||
902 | void __net_exit ip_tunnel_delete_net(struct ip_tunnel_net *itn) | 902 | void ip_tunnel_delete_net(struct ip_tunnel_net *itn) |
903 | { | 903 | { |
904 | LIST_HEAD(list); | 904 | LIST_HEAD(list); |
905 | 905 | ||
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index 9d2bdb2c1d3f..c118f6b576bb 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c | |||
@@ -361,8 +361,7 @@ static netdev_tx_t vti_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
361 | tunnel->err_count = 0; | 361 | tunnel->err_count = 0; |
362 | } | 362 | } |
363 | 363 | ||
364 | IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED | | 364 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); |
365 | IPSKB_REROUTED); | ||
366 | skb_dst_drop(skb); | 365 | skb_dst_drop(skb); |
367 | skb_dst_set(skb, &rt->dst); | 366 | skb_dst_set(skb, &rt->dst); |
368 | nf_reset(skb); | 367 | nf_reset(skb); |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 781dd3c99680..b3b5730b48c5 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -1494,7 +1494,7 @@ void ndisc_send_redirect(struct sk_buff *skb, const struct in6_addr *target) | |||
1494 | */ | 1494 | */ |
1495 | 1495 | ||
1496 | if (ha) | 1496 | if (ha) |
1497 | ndisc_fill_addr_option(skb, ND_OPT_TARGET_LL_ADDR, ha); | 1497 | ndisc_fill_addr_option(buff, ND_OPT_TARGET_LL_ADDR, ha); |
1498 | 1498 | ||
1499 | /* | 1499 | /* |
1500 | * build redirect option and copy skb over to the new packet. | 1500 | * build redirect option and copy skb over to the new packet. |
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c index 637a341c1e2d..8dec6876dc50 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c | |||
@@ -346,19 +346,19 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh | |||
346 | skb_put(skb, 2); | 346 | skb_put(skb, 2); |
347 | 347 | ||
348 | /* Copy user data into skb */ | 348 | /* Copy user data into skb */ |
349 | error = memcpy_fromiovec(skb->data, m->msg_iov, total_len); | 349 | error = memcpy_fromiovec(skb_put(skb, total_len), m->msg_iov, |
350 | total_len); | ||
350 | if (error < 0) { | 351 | if (error < 0) { |
351 | kfree_skb(skb); | 352 | kfree_skb(skb); |
352 | goto error_put_sess_tun; | 353 | goto error_put_sess_tun; |
353 | } | 354 | } |
354 | skb_put(skb, total_len); | ||
355 | 355 | ||
356 | l2tp_xmit_skb(session, skb, session->hdr_len); | 356 | l2tp_xmit_skb(session, skb, session->hdr_len); |
357 | 357 | ||
358 | sock_put(ps->tunnel_sock); | 358 | sock_put(ps->tunnel_sock); |
359 | sock_put(sk); | 359 | sock_put(sk); |
360 | 360 | ||
361 | return error; | 361 | return total_len; |
362 | 362 | ||
363 | error_put_sess_tun: | 363 | error_put_sess_tun: |
364 | sock_put(ps->tunnel_sock); | 364 | sock_put(ps->tunnel_sock); |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 30622101d3b5..a1c6e1ceede8 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -1071,6 +1071,12 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev) | |||
1071 | clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state); | 1071 | clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state); |
1072 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); | 1072 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED); |
1073 | 1073 | ||
1074 | if (sdata->wdev.cac_started) { | ||
1075 | cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); | ||
1076 | cfg80211_cac_event(sdata->dev, NL80211_RADAR_CAC_ABORTED, | ||
1077 | GFP_KERNEL); | ||
1078 | } | ||
1079 | |||
1074 | drv_stop_ap(sdata->local, sdata); | 1080 | drv_stop_ap(sdata->local, sdata); |
1075 | 1081 | ||
1076 | /* free all potentially still buffered bcast frames */ | 1082 | /* free all potentially still buffered bcast frames */ |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 9eed6f1d1614..923e1772e8f3 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -1512,10 +1512,11 @@ static inline void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata, | |||
1512 | ieee80211_tx_skb_tid(sdata, skb, 7); | 1512 | ieee80211_tx_skb_tid(sdata, skb, 7); |
1513 | } | 1513 | } |
1514 | 1514 | ||
1515 | u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, bool action, | 1515 | u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, |
1516 | struct ieee802_11_elems *elems, | 1516 | struct ieee802_11_elems *elems, |
1517 | u64 filter, u32 crc); | 1517 | u64 filter, u32 crc); |
1518 | static inline void ieee802_11_parse_elems(u8 *start, size_t len, bool action, | 1518 | static inline void ieee802_11_parse_elems(const u8 *start, size_t len, |
1519 | bool action, | ||
1519 | struct ieee802_11_elems *elems) | 1520 | struct ieee802_11_elems *elems) |
1520 | { | 1521 | { |
1521 | ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0); | 1522 | ieee802_11_parse_elems_crc(start, len, action, elems, 0, 0); |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index f44f4caa69ee..118540b16729 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -2486,8 +2486,11 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, | |||
2486 | u16 capab_info, aid; | 2486 | u16 capab_info, aid; |
2487 | struct ieee802_11_elems elems; | 2487 | struct ieee802_11_elems elems; |
2488 | struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; | 2488 | struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; |
2489 | const struct cfg80211_bss_ies *bss_ies = NULL; | ||
2490 | struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data; | ||
2489 | u32 changed = 0; | 2491 | u32 changed = 0; |
2490 | int err; | 2492 | int err; |
2493 | bool ret; | ||
2491 | 2494 | ||
2492 | /* AssocResp and ReassocResp have identical structure */ | 2495 | /* AssocResp and ReassocResp have identical structure */ |
2493 | 2496 | ||
@@ -2519,21 +2522,86 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, | |||
2519 | ifmgd->aid = aid; | 2522 | ifmgd->aid = aid; |
2520 | 2523 | ||
2521 | /* | 2524 | /* |
2525 | * Some APs are erroneously not including some information in their | ||
2526 | * (re)association response frames. Try to recover by using the data | ||
2527 | * from the beacon or probe response. This seems to afflict mobile | ||
2528 | * 2G/3G/4G wifi routers, reported models include the "Onda PN51T", | ||
2529 | * "Vodafone PocketWiFi 2", "ZTE MF60" and a similar T-Mobile device. | ||
2530 | */ | ||
2531 | if ((assoc_data->wmm && !elems.wmm_param) || | ||
2532 | (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT) && | ||
2533 | (!elems.ht_cap_elem || !elems.ht_operation)) || | ||
2534 | (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) && | ||
2535 | (!elems.vht_cap_elem || !elems.vht_operation))) { | ||
2536 | const struct cfg80211_bss_ies *ies; | ||
2537 | struct ieee802_11_elems bss_elems; | ||
2538 | |||
2539 | rcu_read_lock(); | ||
2540 | ies = rcu_dereference(cbss->ies); | ||
2541 | if (ies) | ||
2542 | bss_ies = kmemdup(ies, sizeof(*ies) + ies->len, | ||
2543 | GFP_ATOMIC); | ||
2544 | rcu_read_unlock(); | ||
2545 | if (!bss_ies) | ||
2546 | return false; | ||
2547 | |||
2548 | ieee802_11_parse_elems(bss_ies->data, bss_ies->len, | ||
2549 | false, &bss_elems); | ||
2550 | if (assoc_data->wmm && | ||
2551 | !elems.wmm_param && bss_elems.wmm_param) { | ||
2552 | elems.wmm_param = bss_elems.wmm_param; | ||
2553 | sdata_info(sdata, | ||
2554 | "AP bug: WMM param missing from AssocResp\n"); | ||
2555 | } | ||
2556 | |||
2557 | /* | ||
2558 | * Also check if we requested HT/VHT, otherwise the AP doesn't | ||
2559 | * have to include the IEs in the (re)association response. | ||
2560 | */ | ||
2561 | if (!elems.ht_cap_elem && bss_elems.ht_cap_elem && | ||
2562 | !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) { | ||
2563 | elems.ht_cap_elem = bss_elems.ht_cap_elem; | ||
2564 | sdata_info(sdata, | ||
2565 | "AP bug: HT capability missing from AssocResp\n"); | ||
2566 | } | ||
2567 | if (!elems.ht_operation && bss_elems.ht_operation && | ||
2568 | !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) { | ||
2569 | elems.ht_operation = bss_elems.ht_operation; | ||
2570 | sdata_info(sdata, | ||
2571 | "AP bug: HT operation missing from AssocResp\n"); | ||
2572 | } | ||
2573 | if (!elems.vht_cap_elem && bss_elems.vht_cap_elem && | ||
2574 | !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) { | ||
2575 | elems.vht_cap_elem = bss_elems.vht_cap_elem; | ||
2576 | sdata_info(sdata, | ||
2577 | "AP bug: VHT capa missing from AssocResp\n"); | ||
2578 | } | ||
2579 | if (!elems.vht_operation && bss_elems.vht_operation && | ||
2580 | !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) { | ||
2581 | elems.vht_operation = bss_elems.vht_operation; | ||
2582 | sdata_info(sdata, | ||
2583 | "AP bug: VHT operation missing from AssocResp\n"); | ||
2584 | } | ||
2585 | } | ||
2586 | |||
2587 | /* | ||
2522 | * We previously checked these in the beacon/probe response, so | 2588 | * We previously checked these in the beacon/probe response, so |
2523 | * they should be present here. This is just a safety net. | 2589 | * they should be present here. This is just a safety net. |
2524 | */ | 2590 | */ |
2525 | if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT) && | 2591 | if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT) && |
2526 | (!elems.wmm_param || !elems.ht_cap_elem || !elems.ht_operation)) { | 2592 | (!elems.wmm_param || !elems.ht_cap_elem || !elems.ht_operation)) { |
2527 | sdata_info(sdata, | 2593 | sdata_info(sdata, |
2528 | "HT AP is missing WMM params or HT capability/operation in AssocResp\n"); | 2594 | "HT AP is missing WMM params or HT capability/operation\n"); |
2529 | return false; | 2595 | ret = false; |
2596 | goto out; | ||
2530 | } | 2597 | } |
2531 | 2598 | ||
2532 | if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) && | 2599 | if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) && |
2533 | (!elems.vht_cap_elem || !elems.vht_operation)) { | 2600 | (!elems.vht_cap_elem || !elems.vht_operation)) { |
2534 | sdata_info(sdata, | 2601 | sdata_info(sdata, |
2535 | "VHT AP is missing VHT capability/operation in AssocResp\n"); | 2602 | "VHT AP is missing VHT capability/operation\n"); |
2536 | return false; | 2603 | ret = false; |
2604 | goto out; | ||
2537 | } | 2605 | } |
2538 | 2606 | ||
2539 | mutex_lock(&sdata->local->sta_mtx); | 2607 | mutex_lock(&sdata->local->sta_mtx); |
@@ -2544,7 +2612,8 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, | |||
2544 | sta = sta_info_get(sdata, cbss->bssid); | 2612 | sta = sta_info_get(sdata, cbss->bssid); |
2545 | if (WARN_ON(!sta)) { | 2613 | if (WARN_ON(!sta)) { |
2546 | mutex_unlock(&sdata->local->sta_mtx); | 2614 | mutex_unlock(&sdata->local->sta_mtx); |
2547 | return false; | 2615 | ret = false; |
2616 | goto out; | ||
2548 | } | 2617 | } |
2549 | 2618 | ||
2550 | sband = local->hw.wiphy->bands[ieee80211_get_sdata_band(sdata)]; | 2619 | sband = local->hw.wiphy->bands[ieee80211_get_sdata_band(sdata)]; |
@@ -2597,7 +2666,8 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, | |||
2597 | sta->sta.addr); | 2666 | sta->sta.addr); |
2598 | WARN_ON(__sta_info_destroy(sta)); | 2667 | WARN_ON(__sta_info_destroy(sta)); |
2599 | mutex_unlock(&sdata->local->sta_mtx); | 2668 | mutex_unlock(&sdata->local->sta_mtx); |
2600 | return false; | 2669 | ret = false; |
2670 | goto out; | ||
2601 | } | 2671 | } |
2602 | 2672 | ||
2603 | mutex_unlock(&sdata->local->sta_mtx); | 2673 | mutex_unlock(&sdata->local->sta_mtx); |
@@ -2637,7 +2707,10 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata, | |||
2637 | ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt); | 2707 | ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt); |
2638 | ieee80211_sta_reset_beacon_monitor(sdata); | 2708 | ieee80211_sta_reset_beacon_monitor(sdata); |
2639 | 2709 | ||
2640 | return true; | 2710 | ret = true; |
2711 | out: | ||
2712 | kfree(bss_ies); | ||
2713 | return ret; | ||
2641 | } | 2714 | } |
2642 | 2715 | ||
2643 | static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, | 2716 | static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, |
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c index d3f414fe67e0..a02bef35b134 100644 --- a/net/mac80211/rate.c +++ b/net/mac80211/rate.c | |||
@@ -615,7 +615,7 @@ static void rate_control_apply_mask(struct ieee80211_sub_if_data *sdata, | |||
615 | if (rates[i].idx < 0) | 615 | if (rates[i].idx < 0) |
616 | break; | 616 | break; |
617 | 617 | ||
618 | rate_idx_match_mask(&rates[i], sband, mask, chan_width, | 618 | rate_idx_match_mask(&rates[i], sband, chan_width, mask, |
619 | mcs_mask); | 619 | mcs_mask); |
620 | } | 620 | } |
621 | } | 621 | } |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 89a83770d152..c75d3db2a31c 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -667,12 +667,12 @@ void ieee80211_queue_delayed_work(struct ieee80211_hw *hw, | |||
667 | } | 667 | } |
668 | EXPORT_SYMBOL(ieee80211_queue_delayed_work); | 668 | EXPORT_SYMBOL(ieee80211_queue_delayed_work); |
669 | 669 | ||
670 | u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, bool action, | 670 | u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action, |
671 | struct ieee802_11_elems *elems, | 671 | struct ieee802_11_elems *elems, |
672 | u64 filter, u32 crc) | 672 | u64 filter, u32 crc) |
673 | { | 673 | { |
674 | size_t left = len; | 674 | size_t left = len; |
675 | u8 *pos = start; | 675 | const u8 *pos = start; |
676 | bool calc_crc = filter != 0; | 676 | bool calc_crc = filter != 0; |
677 | DECLARE_BITMAP(seen_elems, 256); | 677 | DECLARE_BITMAP(seen_elems, 256); |
678 | const u8 *ie; | 678 | const u8 *ie; |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index edb88fbcb1bd..47e510819f54 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
@@ -2542,6 +2542,7 @@ __ip_vs_get_dest_entries(struct net *net, const struct ip_vs_get_dests *get, | |||
2542 | struct ip_vs_dest *dest; | 2542 | struct ip_vs_dest *dest; |
2543 | struct ip_vs_dest_entry entry; | 2543 | struct ip_vs_dest_entry entry; |
2544 | 2544 | ||
2545 | memset(&entry, 0, sizeof(entry)); | ||
2545 | list_for_each_entry(dest, &svc->destinations, n_list) { | 2546 | list_for_each_entry(dest, &svc->destinations, n_list) { |
2546 | if (count >= get->num_dests) | 2547 | if (count >= get->num_dests) |
2547 | break; | 2548 | break; |
diff --git a/net/netfilter/nfnetlink_acct.c b/net/netfilter/nfnetlink_acct.c index dc3fd5d44464..c7b6d466a662 100644 --- a/net/netfilter/nfnetlink_acct.c +++ b/net/netfilter/nfnetlink_acct.c | |||
@@ -149,9 +149,12 @@ nfnl_acct_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
149 | 149 | ||
150 | rcu_read_lock(); | 150 | rcu_read_lock(); |
151 | list_for_each_entry_rcu(cur, &nfnl_acct_list, head) { | 151 | list_for_each_entry_rcu(cur, &nfnl_acct_list, head) { |
152 | if (last && cur != last) | 152 | if (last) { |
153 | continue; | 153 | if (cur != last) |
154 | continue; | ||
154 | 155 | ||
156 | last = NULL; | ||
157 | } | ||
155 | if (nfnl_acct_fill_info(skb, NETLINK_CB(cb->skb).portid, | 158 | if (nfnl_acct_fill_info(skb, NETLINK_CB(cb->skb).portid, |
156 | cb->nlh->nlmsg_seq, | 159 | cb->nlh->nlmsg_seq, |
157 | NFNL_MSG_TYPE(cb->nlh->nlmsg_type), | 160 | NFNL_MSG_TYPE(cb->nlh->nlmsg_type), |
diff --git a/net/netfilter/nfnetlink_cttimeout.c b/net/netfilter/nfnetlink_cttimeout.c index 701c88a20fea..65074dfb9383 100644 --- a/net/netfilter/nfnetlink_cttimeout.c +++ b/net/netfilter/nfnetlink_cttimeout.c | |||
@@ -220,9 +220,12 @@ ctnl_timeout_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
220 | 220 | ||
221 | rcu_read_lock(); | 221 | rcu_read_lock(); |
222 | list_for_each_entry_rcu(cur, &cttimeout_list, head) { | 222 | list_for_each_entry_rcu(cur, &cttimeout_list, head) { |
223 | if (last && cur != last) | 223 | if (last) { |
224 | continue; | 224 | if (cur != last) |
225 | continue; | ||
225 | 226 | ||
227 | last = NULL; | ||
228 | } | ||
226 | if (ctnl_timeout_fill_info(skb, NETLINK_CB(cb->skb).portid, | 229 | if (ctnl_timeout_fill_info(skb, NETLINK_CB(cb->skb).portid, |
227 | cb->nlh->nlmsg_seq, | 230 | cb->nlh->nlmsg_seq, |
228 | NFNL_MSG_TYPE(cb->nlh->nlmsg_type), | 231 | NFNL_MSG_TYPE(cb->nlh->nlmsg_type), |
diff --git a/net/netfilter/nfnetlink_queue_core.c b/net/netfilter/nfnetlink_queue_core.c index c011543bff5d..299a48ae5dc9 100644 --- a/net/netfilter/nfnetlink_queue_core.c +++ b/net/netfilter/nfnetlink_queue_core.c | |||
@@ -641,9 +641,6 @@ nfqnl_enqueue_packet(struct nf_queue_entry *entry, unsigned int queuenum) | |||
641 | if (queue->copy_mode == NFQNL_COPY_NONE) | 641 | if (queue->copy_mode == NFQNL_COPY_NONE) |
642 | return -EINVAL; | 642 | return -EINVAL; |
643 | 643 | ||
644 | if ((queue->flags & NFQA_CFG_F_GSO) || !skb_is_gso(entry->skb)) | ||
645 | return __nfqnl_enqueue_packet(net, queue, entry); | ||
646 | |||
647 | skb = entry->skb; | 644 | skb = entry->skb; |
648 | 645 | ||
649 | switch (entry->pf) { | 646 | switch (entry->pf) { |
@@ -655,6 +652,9 @@ nfqnl_enqueue_packet(struct nf_queue_entry *entry, unsigned int queuenum) | |||
655 | break; | 652 | break; |
656 | } | 653 | } |
657 | 654 | ||
655 | if ((queue->flags & NFQA_CFG_F_GSO) || !skb_is_gso(skb)) | ||
656 | return __nfqnl_enqueue_packet(net, queue, entry); | ||
657 | |||
658 | nf_bridge_adjust_skb_data(skb); | 658 | nf_bridge_adjust_skb_data(skb); |
659 | segs = skb_gso_segment(skb, 0); | 659 | segs = skb_gso_segment(skb, 0); |
660 | /* Does not use PTR_ERR to limit the number of error codes that can be | 660 | /* Does not use PTR_ERR to limit the number of error codes that can be |
diff --git a/net/netfilter/xt_TCPMSS.c b/net/netfilter/xt_TCPMSS.c index a75240f0d42b..7011c71646f0 100644 --- a/net/netfilter/xt_TCPMSS.c +++ b/net/netfilter/xt_TCPMSS.c | |||
@@ -45,17 +45,22 @@ optlen(const u_int8_t *opt, unsigned int offset) | |||
45 | 45 | ||
46 | static int | 46 | static int |
47 | tcpmss_mangle_packet(struct sk_buff *skb, | 47 | tcpmss_mangle_packet(struct sk_buff *skb, |
48 | const struct xt_tcpmss_info *info, | 48 | const struct xt_action_param *par, |
49 | unsigned int in_mtu, | 49 | unsigned int in_mtu, |
50 | unsigned int tcphoff, | 50 | unsigned int tcphoff, |
51 | unsigned int minlen) | 51 | unsigned int minlen) |
52 | { | 52 | { |
53 | const struct xt_tcpmss_info *info = par->targinfo; | ||
53 | struct tcphdr *tcph; | 54 | struct tcphdr *tcph; |
54 | unsigned int tcplen, i; | 55 | unsigned int tcplen, i; |
55 | __be16 oldval; | 56 | __be16 oldval; |
56 | u16 newmss; | 57 | u16 newmss; |
57 | u8 *opt; | 58 | u8 *opt; |
58 | 59 | ||
60 | /* This is a fragment, no TCP header is available */ | ||
61 | if (par->fragoff != 0) | ||
62 | return XT_CONTINUE; | ||
63 | |||
59 | if (!skb_make_writable(skb, skb->len)) | 64 | if (!skb_make_writable(skb, skb->len)) |
60 | return -1; | 65 | return -1; |
61 | 66 | ||
@@ -125,6 +130,18 @@ tcpmss_mangle_packet(struct sk_buff *skb, | |||
125 | 130 | ||
126 | skb_put(skb, TCPOLEN_MSS); | 131 | skb_put(skb, TCPOLEN_MSS); |
127 | 132 | ||
133 | /* | ||
134 | * IPv4: RFC 1122 states "If an MSS option is not received at | ||
135 | * connection setup, TCP MUST assume a default send MSS of 536". | ||
136 | * IPv6: RFC 2460 states IPv6 has a minimum MTU of 1280 and a minimum | ||
137 | * length IPv6 header of 60, ergo the default MSS value is 1220 | ||
138 | * Since no MSS was provided, we must use the default values | ||
139 | */ | ||
140 | if (par->family == NFPROTO_IPV4) | ||
141 | newmss = min(newmss, (u16)536); | ||
142 | else | ||
143 | newmss = min(newmss, (u16)1220); | ||
144 | |||
128 | opt = (u_int8_t *)tcph + sizeof(struct tcphdr); | 145 | opt = (u_int8_t *)tcph + sizeof(struct tcphdr); |
129 | memmove(opt + TCPOLEN_MSS, opt, tcplen - sizeof(struct tcphdr)); | 146 | memmove(opt + TCPOLEN_MSS, opt, tcplen - sizeof(struct tcphdr)); |
130 | 147 | ||
@@ -182,7 +199,7 @@ tcpmss_tg4(struct sk_buff *skb, const struct xt_action_param *par) | |||
182 | __be16 newlen; | 199 | __be16 newlen; |
183 | int ret; | 200 | int ret; |
184 | 201 | ||
185 | ret = tcpmss_mangle_packet(skb, par->targinfo, | 202 | ret = tcpmss_mangle_packet(skb, par, |
186 | tcpmss_reverse_mtu(skb, PF_INET), | 203 | tcpmss_reverse_mtu(skb, PF_INET), |
187 | iph->ihl * 4, | 204 | iph->ihl * 4, |
188 | sizeof(*iph) + sizeof(struct tcphdr)); | 205 | sizeof(*iph) + sizeof(struct tcphdr)); |
@@ -211,7 +228,7 @@ tcpmss_tg6(struct sk_buff *skb, const struct xt_action_param *par) | |||
211 | tcphoff = ipv6_skip_exthdr(skb, sizeof(*ipv6h), &nexthdr, &frag_off); | 228 | tcphoff = ipv6_skip_exthdr(skb, sizeof(*ipv6h), &nexthdr, &frag_off); |
212 | if (tcphoff < 0) | 229 | if (tcphoff < 0) |
213 | return NF_DROP; | 230 | return NF_DROP; |
214 | ret = tcpmss_mangle_packet(skb, par->targinfo, | 231 | ret = tcpmss_mangle_packet(skb, par, |
215 | tcpmss_reverse_mtu(skb, PF_INET6), | 232 | tcpmss_reverse_mtu(skb, PF_INET6), |
216 | tcphoff, | 233 | tcphoff, |
217 | sizeof(*ipv6h) + sizeof(struct tcphdr)); | 234 | sizeof(*ipv6h) + sizeof(struct tcphdr)); |
diff --git a/net/netfilter/xt_TCPOPTSTRIP.c b/net/netfilter/xt_TCPOPTSTRIP.c index 1eb1a44bfd3d..b68fa191710f 100644 --- a/net/netfilter/xt_TCPOPTSTRIP.c +++ b/net/netfilter/xt_TCPOPTSTRIP.c | |||
@@ -48,11 +48,13 @@ tcpoptstrip_mangle_packet(struct sk_buff *skb, | |||
48 | return NF_DROP; | 48 | return NF_DROP; |
49 | 49 | ||
50 | len = skb->len - tcphoff; | 50 | len = skb->len - tcphoff; |
51 | if (len < (int)sizeof(struct tcphdr) || | 51 | if (len < (int)sizeof(struct tcphdr)) |
52 | tcp_hdr(skb)->doff * 4 > len) | ||
53 | return NF_DROP; | 52 | return NF_DROP; |
54 | 53 | ||
55 | tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff); | 54 | tcph = (struct tcphdr *)(skb_network_header(skb) + tcphoff); |
55 | if (tcph->doff * 4 > len) | ||
56 | return NF_DROP; | ||
57 | |||
56 | opt = (u_int8_t *)tcph; | 58 | opt = (u_int8_t *)tcph; |
57 | 59 | ||
58 | /* | 60 | /* |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 8978755251f7..275d901d7e46 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -371,7 +371,7 @@ static int netlink_mmap(struct file *file, struct socket *sock, | |||
371 | err = 0; | 371 | err = 0; |
372 | out: | 372 | out: |
373 | mutex_unlock(&nlk->pg_vec_lock); | 373 | mutex_unlock(&nlk->pg_vec_lock); |
374 | return 0; | 374 | return err; |
375 | } | 375 | } |
376 | 376 | ||
377 | static void netlink_frame_flush_dcache(const struct nl_mmap_hdr *hdr) | 377 | static void netlink_frame_flush_dcache(const struct nl_mmap_hdr *hdr) |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 79fe63246b27..4b66c752eae5 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -2851,12 +2851,11 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr, | |||
2851 | return -EOPNOTSUPP; | 2851 | return -EOPNOTSUPP; |
2852 | 2852 | ||
2853 | uaddr->sa_family = AF_PACKET; | 2853 | uaddr->sa_family = AF_PACKET; |
2854 | memset(uaddr->sa_data, 0, sizeof(uaddr->sa_data)); | ||
2854 | rcu_read_lock(); | 2855 | rcu_read_lock(); |
2855 | dev = dev_get_by_index_rcu(sock_net(sk), pkt_sk(sk)->ifindex); | 2856 | dev = dev_get_by_index_rcu(sock_net(sk), pkt_sk(sk)->ifindex); |
2856 | if (dev) | 2857 | if (dev) |
2857 | strncpy(uaddr->sa_data, dev->name, 14); | 2858 | strlcpy(uaddr->sa_data, dev->name, sizeof(uaddr->sa_data)); |
2858 | else | ||
2859 | memset(uaddr->sa_data, 0, 14); | ||
2860 | rcu_read_unlock(); | 2859 | rcu_read_unlock(); |
2861 | *uaddr_len = sizeof(*uaddr); | 2860 | *uaddr_len = sizeof(*uaddr); |
2862 | 2861 | ||
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 2b935e7cfe7b..281c1bded1f6 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
@@ -291,17 +291,18 @@ struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, struct nlattr *ta | |||
291 | { | 291 | { |
292 | struct qdisc_rate_table *rtab; | 292 | struct qdisc_rate_table *rtab; |
293 | 293 | ||
294 | if (tab == NULL || r->rate == 0 || r->cell_log == 0 || | ||
295 | nla_len(tab) != TC_RTAB_SIZE) | ||
296 | return NULL; | ||
297 | |||
294 | for (rtab = qdisc_rtab_list; rtab; rtab = rtab->next) { | 298 | for (rtab = qdisc_rtab_list; rtab; rtab = rtab->next) { |
295 | if (memcmp(&rtab->rate, r, sizeof(struct tc_ratespec)) == 0) { | 299 | if (!memcmp(&rtab->rate, r, sizeof(struct tc_ratespec)) && |
300 | !memcmp(&rtab->data, nla_data(tab), 1024)) { | ||
296 | rtab->refcnt++; | 301 | rtab->refcnt++; |
297 | return rtab; | 302 | return rtab; |
298 | } | 303 | } |
299 | } | 304 | } |
300 | 305 | ||
301 | if (tab == NULL || r->rate == 0 || r->cell_log == 0 || | ||
302 | nla_len(tab) != TC_RTAB_SIZE) | ||
303 | return NULL; | ||
304 | |||
305 | rtab = kmalloc(sizeof(*rtab), GFP_KERNEL); | 306 | rtab = kmalloc(sizeof(*rtab), GFP_KERNEL); |
306 | if (rtab) { | 307 | if (rtab) { |
307 | rtab->rate = *r; | 308 | rtab->rate = *r; |
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index 32a4625fef77..be35e2dbcc9a 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
@@ -206,6 +206,8 @@ static inline int sctp_cacc_skip(struct sctp_transport *primary, | |||
206 | */ | 206 | */ |
207 | void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q) | 207 | void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q) |
208 | { | 208 | { |
209 | memset(q, 0, sizeof(struct sctp_outq)); | ||
210 | |||
209 | q->asoc = asoc; | 211 | q->asoc = asoc; |
210 | INIT_LIST_HEAD(&q->out_chunk_list); | 212 | INIT_LIST_HEAD(&q->out_chunk_list); |
211 | INIT_LIST_HEAD(&q->control_chunk_list); | 213 | INIT_LIST_HEAD(&q->control_chunk_list); |
@@ -213,11 +215,7 @@ void sctp_outq_init(struct sctp_association *asoc, struct sctp_outq *q) | |||
213 | INIT_LIST_HEAD(&q->sacked); | 215 | INIT_LIST_HEAD(&q->sacked); |
214 | INIT_LIST_HEAD(&q->abandoned); | 216 | INIT_LIST_HEAD(&q->abandoned); |
215 | 217 | ||
216 | q->fast_rtx = 0; | ||
217 | q->outstanding_bytes = 0; | ||
218 | q->empty = 1; | 218 | q->empty = 1; |
219 | q->cork = 0; | ||
220 | q->out_qlen = 0; | ||
221 | } | 219 | } |
222 | 220 | ||
223 | /* Free the outqueue structure and any related pending chunks. | 221 | /* Free the outqueue structure and any related pending chunks. |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 75fe92ac2e9c..32db19ba4a21 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -3996,6 +3996,12 @@ static void sctp_destroy_sock(struct sock *sk) | |||
3996 | 3996 | ||
3997 | /* Release our hold on the endpoint. */ | 3997 | /* Release our hold on the endpoint. */ |
3998 | sp = sctp_sk(sk); | 3998 | sp = sctp_sk(sk); |
3999 | /* This could happen during socket init, thus we bail out | ||
4000 | * early, since the rest of the below is not setup either. | ||
4001 | */ | ||
4002 | if (sp->ep == NULL) | ||
4003 | return; | ||
4004 | |||
3999 | if (sp->do_auto_asconf) { | 4005 | if (sp->do_auto_asconf) { |
4000 | sp->do_auto_asconf = 0; | 4006 | sp->do_auto_asconf = 0; |
4001 | list_del(&sp->auto_asconf_list); | 4007 | list_del(&sp->auto_asconf_list); |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 31d265f36d2c..ea74b9dd9d82 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -1527,12 +1527,18 @@ static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) | |||
1527 | struct cfg80211_registered_device *dev; | 1527 | struct cfg80211_registered_device *dev; |
1528 | s64 filter_wiphy = -1; | 1528 | s64 filter_wiphy = -1; |
1529 | bool split = false; | 1529 | bool split = false; |
1530 | struct nlattr **tb = nl80211_fam.attrbuf; | 1530 | struct nlattr **tb; |
1531 | int res; | 1531 | int res; |
1532 | 1532 | ||
1533 | /* will be zeroed in nlmsg_parse() */ | ||
1534 | tb = kmalloc(sizeof(*tb) * (NL80211_ATTR_MAX + 1), GFP_KERNEL); | ||
1535 | if (!tb) | ||
1536 | return -ENOMEM; | ||
1537 | |||
1533 | rtnl_lock(); | 1538 | rtnl_lock(); |
1539 | |||
1534 | res = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, | 1540 | res = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, |
1535 | tb, nl80211_fam.maxattr, nl80211_policy); | 1541 | tb, NL80211_ATTR_MAX, nl80211_policy); |
1536 | if (res == 0) { | 1542 | if (res == 0) { |
1537 | split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; | 1543 | split = tb[NL80211_ATTR_SPLIT_WIPHY_DUMP]; |
1538 | if (tb[NL80211_ATTR_WIPHY]) | 1544 | if (tb[NL80211_ATTR_WIPHY]) |
@@ -1544,8 +1550,11 @@ static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) | |||
1544 | int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); | 1550 | int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]); |
1545 | 1551 | ||
1546 | netdev = dev_get_by_index(sock_net(skb->sk), ifidx); | 1552 | netdev = dev_get_by_index(sock_net(skb->sk), ifidx); |
1547 | if (!netdev) | 1553 | if (!netdev) { |
1554 | rtnl_unlock(); | ||
1555 | kfree(tb); | ||
1548 | return -ENODEV; | 1556 | return -ENODEV; |
1557 | } | ||
1549 | if (netdev->ieee80211_ptr) { | 1558 | if (netdev->ieee80211_ptr) { |
1550 | dev = wiphy_to_dev( | 1559 | dev = wiphy_to_dev( |
1551 | netdev->ieee80211_ptr->wiphy); | 1560 | netdev->ieee80211_ptr->wiphy); |
@@ -1554,6 +1563,7 @@ static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) | |||
1554 | dev_put(netdev); | 1563 | dev_put(netdev); |
1555 | } | 1564 | } |
1556 | } | 1565 | } |
1566 | kfree(tb); | ||
1557 | 1567 | ||
1558 | list_for_each_entry(dev, &cfg80211_rdev_list, list) { | 1568 | list_for_each_entry(dev, &cfg80211_rdev_list, list) { |
1559 | if (!net_eq(wiphy_net(&dev->wiphy), sock_net(skb->sk))) | 1569 | if (!net_eq(wiphy_net(&dev->wiphy), sock_net(skb->sk))) |
@@ -1589,6 +1599,7 @@ static int nl80211_dump_wiphy(struct sk_buff *skb, struct netlink_callback *cb) | |||
1589 | !skb->len && | 1599 | !skb->len && |
1590 | cb->min_dump_alloc < 4096) { | 1600 | cb->min_dump_alloc < 4096) { |
1591 | cb->min_dump_alloc = 4096; | 1601 | cb->min_dump_alloc = 4096; |
1602 | rtnl_unlock(); | ||
1592 | return 1; | 1603 | return 1; |
1593 | } | 1604 | } |
1594 | idx--; | 1605 | idx--; |
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 8337663aa298..f97869f1f09b 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib | |||
@@ -149,7 +149,7 @@ cpp_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ | |||
149 | 149 | ||
150 | ld_flags = $(LDFLAGS) $(ldflags-y) | 150 | ld_flags = $(LDFLAGS) $(ldflags-y) |
151 | 151 | ||
152 | dtc_cpp_flags = -Wp,-MD,$(depfile).pre -nostdinc \ | 152 | dtc_cpp_flags = -Wp,-MD,$(depfile).pre.tmp -nostdinc \ |
153 | -I$(srctree)/arch/$(SRCARCH)/boot/dts \ | 153 | -I$(srctree)/arch/$(SRCARCH)/boot/dts \ |
154 | -I$(srctree)/arch/$(SRCARCH)/boot/dts/include \ | 154 | -I$(srctree)/arch/$(SRCARCH)/boot/dts/include \ |
155 | -undef -D__DTS__ | 155 | -undef -D__DTS__ |
@@ -265,13 +265,13 @@ quiet_cmd_dtc = DTC $@ | |||
265 | cmd_dtc = $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \ | 265 | cmd_dtc = $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \ |
266 | $(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 \ | 266 | $(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 \ |
267 | -i $(dir $<) $(DTC_FLAGS) \ | 267 | -i $(dir $<) $(DTC_FLAGS) \ |
268 | -d $(depfile).dtc $(dtc-tmp) ; \ | 268 | -d $(depfile).dtc.tmp $(dtc-tmp) ; \ |
269 | cat $(depfile).pre $(depfile).dtc > $(depfile) | 269 | cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile) |
270 | 270 | ||
271 | $(obj)/%.dtb: $(src)/%.dts FORCE | 271 | $(obj)/%.dtb: $(src)/%.dts FORCE |
272 | $(call if_changed_dep,dtc) | 272 | $(call if_changed_dep,dtc) |
273 | 273 | ||
274 | dtc-tmp = $(subst $(comma),_,$(dot-target).dts) | 274 | dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp) |
275 | 275 | ||
276 | # Bzip2 | 276 | # Bzip2 |
277 | # --------------------------------------------------------------------------- | 277 | # --------------------------------------------------------------------------- |
diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l index 254d5af88956..3b41bfca636c 100644 --- a/scripts/dtc/dtc-lexer.l +++ b/scripts/dtc/dtc-lexer.l | |||
@@ -71,7 +71,7 @@ static int pop_input_file(void); | |||
71 | push_input_file(name); | 71 | push_input_file(name); |
72 | } | 72 | } |
73 | 73 | ||
74 | <*>^"#"(line)?{WS}+[0-9]+{WS}+{STRING}({WS}+[0-9]+)? { | 74 | <*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)? { |
75 | char *line, *tmp, *fn; | 75 | char *line, *tmp, *fn; |
76 | /* skip text before line # */ | 76 | /* skip text before line # */ |
77 | line = yytext; | 77 | line = yytext; |
diff --git a/scripts/dtc/dtc-lexer.lex.c_shipped b/scripts/dtc/dtc-lexer.lex.c_shipped index a6c5fcdfc032..2d30f41778b7 100644 --- a/scripts/dtc/dtc-lexer.lex.c_shipped +++ b/scripts/dtc/dtc-lexer.lex.c_shipped | |||
@@ -405,19 +405,19 @@ static yyconst flex_int16_t yy_accept[161] = | |||
405 | static yyconst flex_int32_t yy_ec[256] = | 405 | static yyconst flex_int32_t yy_ec[256] = |
406 | { 0, | 406 | { 0, |
407 | 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, | 407 | 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, |
408 | 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, | 408 | 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, |
409 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 409 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
410 | 1, 2, 4, 5, 6, 1, 1, 7, 8, 1, | 410 | 1, 2, 5, 6, 7, 1, 1, 8, 9, 1, |
411 | 1, 9, 10, 10, 11, 10, 12, 13, 14, 15, | 411 | 1, 10, 11, 11, 12, 11, 13, 14, 15, 16, |
412 | 15, 15, 15, 15, 15, 15, 15, 16, 1, 17, | 412 | 16, 16, 16, 16, 16, 16, 16, 17, 1, 18, |
413 | 18, 19, 10, 10, 20, 20, 20, 20, 20, 20, | 413 | 19, 20, 11, 11, 21, 21, 21, 21, 21, 21, |
414 | 21, 21, 21, 21, 21, 22, 21, 21, 21, 21, | 414 | 22, 22, 22, 22, 22, 23, 22, 22, 22, 22, |
415 | 21, 21, 21, 21, 23, 21, 21, 24, 21, 21, | 415 | 22, 22, 22, 22, 24, 22, 22, 25, 22, 22, |
416 | 1, 25, 26, 1, 21, 1, 20, 27, 28, 29, | 416 | 1, 26, 27, 1, 22, 1, 21, 28, 29, 30, |
417 | 417 | ||
418 | 30, 20, 21, 21, 31, 21, 21, 32, 33, 34, | 418 | 31, 21, 22, 22, 32, 22, 22, 33, 34, 35, |
419 | 35, 36, 21, 37, 38, 39, 40, 41, 21, 24, | 419 | 36, 37, 22, 38, 39, 40, 41, 42, 22, 25, |
420 | 42, 21, 43, 44, 45, 1, 1, 1, 1, 1, | 420 | 43, 22, 44, 45, 46, 1, 1, 1, 1, 1, |
421 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 421 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
422 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 422 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
423 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 423 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
@@ -434,36 +434,36 @@ static yyconst flex_int32_t yy_ec[256] = | |||
434 | 1, 1, 1, 1, 1 | 434 | 1, 1, 1, 1, 1 |
435 | } ; | 435 | } ; |
436 | 436 | ||
437 | static yyconst flex_int32_t yy_meta[46] = | 437 | static yyconst flex_int32_t yy_meta[47] = |
438 | { 0, | 438 | { 0, |
439 | 1, 1, 1, 1, 1, 2, 3, 1, 2, 2, | 439 | 1, 1, 1, 1, 1, 1, 2, 3, 1, 2, |
440 | 2, 4, 5, 5, 5, 6, 1, 1, 1, 7, | 440 | 2, 2, 4, 5, 5, 5, 6, 1, 1, 1, |
441 | 8, 8, 8, 8, 1, 1, 7, 7, 7, 7, | 441 | 7, 8, 8, 8, 8, 1, 1, 7, 7, 7, |
442 | 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | 442 | 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, |
443 | 8, 8, 3, 1, 1 | 443 | 8, 8, 8, 3, 1, 1 |
444 | } ; | 444 | } ; |
445 | 445 | ||
446 | static yyconst flex_int16_t yy_base[175] = | 446 | static yyconst flex_int16_t yy_base[175] = |
447 | { 0, | 447 | { 0, |
448 | 0, 388, 381, 40, 41, 386, 71, 385, 34, 44, | 448 | 0, 385, 378, 40, 41, 383, 72, 382, 34, 44, |
449 | 390, 395, 60, 62, 371, 112, 111, 111, 111, 104, | 449 | 388, 393, 61, 117, 368, 116, 115, 115, 115, 48, |
450 | 370, 106, 371, 342, 124, 119, 0, 144, 395, 0, | 450 | 367, 107, 368, 339, 127, 120, 0, 147, 393, 0, |
451 | 123, 0, 159, 153, 165, 167, 395, 130, 395, 382, | 451 | 127, 0, 133, 156, 168, 153, 393, 125, 393, 380, |
452 | 395, 0, 372, 122, 395, 157, 374, 379, 350, 21, | 452 | 393, 0, 369, 127, 393, 160, 371, 377, 347, 21, |
453 | 346, 349, 395, 395, 395, 395, 395, 362, 395, 395, | 453 | 343, 346, 393, 393, 393, 393, 393, 359, 393, 393, |
454 | 181, 346, 342, 395, 359, 0, 191, 343, 190, 351, | 454 | 183, 343, 339, 393, 356, 0, 183, 340, 187, 348, |
455 | 350, 0, 0, 0, 173, 362, 177, 367, 357, 329, | 455 | 347, 0, 0, 0, 178, 359, 195, 365, 354, 326, |
456 | 335, 328, 337, 331, 206, 329, 334, 327, 395, 338, | 456 | 332, 325, 334, 328, 204, 326, 331, 324, 393, 335, |
457 | 170, 314, 346, 345, 318, 325, 343, 158, 316, 212, | 457 | 150, 311, 343, 342, 315, 322, 340, 179, 313, 207, |
458 | 458 | ||
459 | 322, 319, 320, 395, 340, 336, 308, 305, 314, 304, | 459 | 319, 316, 317, 393, 337, 333, 305, 302, 311, 301, |
460 | 295, 138, 208, 220, 395, 292, 305, 265, 264, 254, | 460 | 310, 190, 338, 337, 393, 307, 322, 301, 305, 277, |
461 | 201, 222, 285, 275, 273, 270, 236, 235, 225, 115, | 461 | 208, 311, 307, 278, 271, 270, 248, 246, 213, 130, |
462 | 395, 395, 252, 216, 216, 217, 214, 230, 209, 220, | 462 | 393, 393, 263, 235, 207, 221, 218, 229, 213, 213, |
463 | 213, 239, 211, 217, 216, 209, 229, 395, 240, 225, | 463 | 206, 234, 218, 210, 208, 193, 219, 393, 223, 204, |
464 | 206, 169, 395, 395, 116, 106, 99, 54, 395, 395, | 464 | 176, 157, 393, 393, 120, 106, 97, 119, 393, 393, |
465 | 254, 260, 268, 272, 276, 282, 289, 293, 301, 309, | 465 | 245, 251, 259, 263, 267, 273, 280, 284, 292, 300, |
466 | 313, 319, 327, 335 | 466 | 304, 310, 318, 326 |
467 | } ; | 467 | } ; |
468 | 468 | ||
469 | static yyconst flex_int16_t yy_def[175] = | 469 | static yyconst flex_int16_t yy_def[175] = |
@@ -489,108 +489,108 @@ static yyconst flex_int16_t yy_def[175] = | |||
489 | 160, 160, 160, 160 | 489 | 160, 160, 160, 160 |
490 | } ; | 490 | } ; |
491 | 491 | ||
492 | static yyconst flex_int16_t yy_nxt[441] = | 492 | static yyconst flex_int16_t yy_nxt[440] = |
493 | { 0, | 493 | { 0, |
494 | 12, 13, 14, 15, 16, 12, 17, 18, 12, 12, | 494 | 12, 13, 14, 13, 15, 16, 12, 17, 18, 12, |
495 | 12, 19, 12, 12, 12, 12, 20, 21, 22, 23, | 495 | 12, 12, 19, 12, 12, 12, 12, 20, 21, 22, |
496 | 23, 23, 23, 23, 12, 12, 23, 23, 23, 23, | 496 | 23, 23, 23, 23, 23, 12, 12, 23, 23, 23, |
497 | 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, | 497 | 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, |
498 | 23, 23, 12, 24, 12, 25, 34, 35, 35, 25, | 498 | 23, 23, 23, 12, 24, 12, 25, 34, 35, 35, |
499 | 81, 26, 26, 27, 27, 27, 34, 35, 35, 82, | 499 | 25, 81, 26, 26, 27, 27, 27, 34, 35, 35, |
500 | 28, 36, 36, 36, 36, 159, 29, 28, 28, 28, | 500 | 82, 28, 36, 36, 36, 53, 54, 29, 28, 28, |
501 | 28, 12, 13, 14, 15, 16, 30, 17, 18, 30, | 501 | 28, 28, 12, 13, 14, 13, 15, 16, 30, 17, |
502 | 30, 30, 26, 30, 30, 30, 12, 20, 21, 22, | 502 | 18, 30, 30, 30, 26, 30, 30, 30, 12, 20, |
503 | 31, 31, 31, 31, 31, 32, 12, 31, 31, 31, | 503 | 21, 22, 31, 31, 31, 31, 31, 32, 12, 31, |
504 | 504 | ||
505 | 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, | 505 | 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, |
506 | 31, 31, 31, 12, 24, 12, 39, 41, 45, 47, | 506 | 31, 31, 31, 31, 31, 12, 24, 12, 36, 36, |
507 | 53, 54, 48, 56, 57, 61, 61, 47, 66, 45, | 507 | 36, 39, 41, 45, 47, 56, 57, 48, 61, 47, |
508 | 48, 66, 66, 66, 39, 46, 40, 49, 59, 50, | 508 | 39, 159, 48, 66, 61, 45, 66, 66, 66, 158, |
509 | 158, 51, 122, 52, 157, 49, 46, 50, 136, 63, | 509 | 46, 40, 49, 59, 50, 157, 51, 49, 52, 50, |
510 | 137, 52, 156, 43, 40, 62, 65, 65, 65, 59, | 510 | 40, 63, 46, 52, 36, 36, 36, 156, 43, 62, |
511 | 61, 61, 123, 65, 75, 69, 69, 69, 36, 36, | 511 | 65, 65, 65, 59, 136, 68, 137, 65, 75, 69, |
512 | 65, 65, 65, 65, 70, 71, 72, 69, 69, 69, | 512 | 69, 69, 70, 71, 65, 65, 65, 65, 70, 71, |
513 | 45, 46, 61, 61, 109, 77, 70, 71, 93, 110, | 513 | 72, 69, 69, 69, 61, 46, 45, 155, 154, 66, |
514 | 68, 70, 71, 85, 85, 85, 66, 46, 155, 66, | 514 | 70, 71, 66, 66, 66, 122, 85, 85, 85, 59, |
515 | 515 | ||
516 | 66, 66, 69, 69, 69, 122, 59, 100, 100, 61, | 516 | 69, 69, 69, 46, 77, 100, 109, 93, 100, 70, |
517 | 61, 70, 71, 100, 100, 148, 112, 154, 85, 85, | 517 | 71, 110, 112, 122, 129, 123, 153, 85, 85, 85, |
518 | 85, 61, 61, 129, 129, 123, 129, 129, 135, 135, | 518 | 135, 135, 135, 148, 148, 160, 135, 135, 135, 152, |
519 | 135, 142, 142, 148, 143, 149, 153, 135, 135, 135, | 519 | 142, 142, 142, 123, 143, 142, 142, 142, 151, 143, |
520 | 142, 142, 160, 143, 152, 151, 150, 146, 145, 144, | 520 | 150, 146, 145, 149, 149, 38, 38, 38, 38, 38, |
521 | 141, 140, 139, 149, 38, 38, 38, 38, 38, 38, | 521 | 38, 38, 38, 42, 144, 141, 140, 42, 42, 44, |
522 | 38, 38, 42, 138, 134, 133, 42, 42, 44, 44, | 522 | 44, 44, 44, 44, 44, 44, 44, 58, 58, 58, |
523 | 44, 44, 44, 44, 44, 44, 58, 58, 58, 58, | 523 | 58, 64, 139, 64, 66, 138, 134, 66, 133, 66, |
524 | 64, 132, 64, 66, 131, 130, 66, 160, 66, 66, | 524 | 66, 67, 132, 131, 67, 67, 67, 67, 73, 130, |
525 | 67, 128, 127, 67, 67, 67, 67, 73, 126, 73, | 525 | 73, 73, 76, 76, 76, 76, 76, 76, 76, 76, |
526 | 526 | ||
527 | 73, 76, 76, 76, 76, 76, 76, 76, 76, 78, | 527 | 78, 78, 78, 78, 78, 78, 78, 78, 91, 160, |
528 | 78, 78, 78, 78, 78, 78, 78, 91, 125, 91, | 528 | 91, 92, 129, 92, 92, 128, 92, 92, 121, 121, |
529 | 92, 124, 92, 92, 120, 92, 92, 121, 121, 121, | 529 | 121, 121, 121, 121, 121, 121, 147, 147, 147, 147, |
530 | 121, 121, 121, 121, 121, 147, 147, 147, 147, 147, | 530 | 147, 147, 147, 147, 127, 126, 125, 124, 61, 61, |
531 | 147, 147, 147, 119, 118, 117, 116, 115, 47, 114, | 531 | 120, 119, 118, 117, 116, 115, 47, 114, 110, 113, |
532 | 110, 113, 111, 108, 107, 106, 48, 105, 104, 89, | 532 | 111, 108, 107, 106, 48, 105, 104, 89, 103, 102, |
533 | 103, 102, 101, 99, 98, 97, 96, 95, 94, 79, | 533 | 101, 99, 98, 97, 96, 95, 94, 79, 77, 90, |
534 | 77, 90, 89, 88, 59, 87, 86, 59, 84, 83, | 534 | 89, 88, 59, 87, 86, 59, 84, 83, 80, 79, |
535 | 80, 79, 77, 74, 160, 60, 59, 55, 37, 160, | 535 | 77, 74, 160, 60, 59, 55, 37, 160, 33, 25, |
536 | 33, 25, 26, 25, 11, 160, 160, 160, 160, 160, | 536 | 26, 25, 11, 160, 160, 160, 160, 160, 160, 160, |
537 | 537 | ||
538 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, | 538 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, |
539 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, | 539 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, |
540 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, | 540 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, |
541 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160 | 541 | 160, 160, 160, 160, 160, 160, 160, 160, 160 |
542 | } ; | 542 | } ; |
543 | 543 | ||
544 | static yyconst flex_int16_t yy_chk[441] = | 544 | static yyconst flex_int16_t yy_chk[440] = |
545 | { 0, | 545 | { 0, |
546 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 546 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
547 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 547 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
548 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 548 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
549 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 549 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
550 | 1, 1, 1, 1, 1, 4, 9, 9, 9, 10, | 550 | 1, 1, 1, 1, 1, 1, 4, 9, 9, 9, |
551 | 50, 4, 5, 5, 5, 5, 10, 10, 10, 50, | 551 | 10, 50, 4, 5, 5, 5, 5, 10, 10, 10, |
552 | 5, 13, 13, 14, 14, 158, 5, 5, 5, 5, | 552 | 50, 5, 13, 13, 13, 20, 20, 5, 5, 5, |
553 | 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, | 553 | 5, 5, 7, 7, 7, 7, 7, 7, 7, 7, |
554 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | 554 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, |
555 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | 555 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, |
556 | 556 | ||
557 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | 557 | 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, |
558 | 7, 7, 7, 7, 7, 7, 16, 17, 18, 19, | 558 | 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, |
559 | 20, 20, 19, 22, 22, 25, 25, 26, 31, 44, | 559 | 14, 16, 17, 18, 19, 22, 22, 19, 25, 26, |
560 | 26, 31, 31, 31, 38, 18, 16, 19, 31, 19, | 560 | 38, 158, 26, 31, 33, 44, 31, 31, 31, 157, |
561 | 157, 19, 112, 19, 156, 26, 44, 26, 130, 26, | 561 | 18, 16, 19, 31, 19, 156, 19, 26, 19, 26, |
562 | 130, 26, 155, 17, 38, 25, 28, 28, 28, 28, | 562 | 38, 26, 44, 26, 36, 36, 36, 155, 17, 25, |
563 | 33, 33, 112, 28, 46, 34, 34, 34, 36, 36, | 563 | 28, 28, 28, 28, 130, 33, 130, 28, 46, 34, |
564 | 28, 28, 28, 28, 34, 34, 34, 35, 35, 35, | 564 | 34, 34, 91, 91, 28, 28, 28, 28, 34, 34, |
565 | 75, 46, 61, 61, 98, 77, 35, 35, 77, 98, | 565 | 34, 35, 35, 35, 61, 46, 75, 152, 151, 67, |
566 | 33, 91, 91, 61, 61, 61, 67, 75, 152, 67, | 566 | 35, 35, 67, 67, 67, 112, 61, 61, 61, 67, |
567 | 567 | ||
568 | 67, 67, 69, 69, 69, 121, 67, 85, 85, 113, | 568 | 69, 69, 69, 75, 77, 85, 98, 77, 100, 69, |
569 | 113, 69, 69, 100, 100, 143, 100, 151, 85, 85, | 569 | 69, 98, 100, 121, 129, 112, 150, 85, 85, 85, |
570 | 85, 114, 114, 122, 122, 121, 129, 129, 135, 135, | 570 | 135, 135, 135, 143, 147, 149, 129, 129, 129, 146, |
571 | 135, 138, 138, 147, 138, 143, 150, 129, 129, 129, | 571 | 138, 138, 138, 121, 138, 142, 142, 142, 145, 142, |
572 | 142, 142, 149, 142, 146, 145, 144, 141, 140, 139, | 572 | 144, 141, 140, 143, 147, 161, 161, 161, 161, 161, |
573 | 137, 136, 134, 147, 161, 161, 161, 161, 161, 161, | 573 | 161, 161, 161, 162, 139, 137, 136, 162, 162, 163, |
574 | 161, 161, 162, 133, 128, 127, 162, 162, 163, 163, | 574 | 163, 163, 163, 163, 163, 163, 163, 164, 164, 164, |
575 | 163, 163, 163, 163, 163, 163, 164, 164, 164, 164, | 575 | 164, 165, 134, 165, 166, 133, 128, 166, 127, 166, |
576 | 165, 126, 165, 166, 125, 124, 166, 123, 166, 166, | 576 | 166, 167, 126, 125, 167, 167, 167, 167, 168, 124, |
577 | 167, 120, 119, 167, 167, 167, 167, 168, 118, 168, | 577 | 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, |
578 | 578 | ||
579 | 168, 169, 169, 169, 169, 169, 169, 169, 169, 170, | 579 | 170, 170, 170, 170, 170, 170, 170, 170, 171, 123, |
580 | 170, 170, 170, 170, 170, 170, 170, 171, 117, 171, | 580 | 171, 172, 122, 172, 172, 120, 172, 172, 173, 173, |
581 | 172, 116, 172, 172, 111, 172, 172, 173, 173, 173, | 581 | 173, 173, 173, 173, 173, 173, 174, 174, 174, 174, |
582 | 173, 173, 173, 173, 173, 174, 174, 174, 174, 174, | 582 | 174, 174, 174, 174, 119, 118, 117, 116, 114, 113, |
583 | 174, 174, 174, 110, 109, 108, 107, 106, 105, 103, | 583 | 111, 110, 109, 108, 107, 106, 105, 103, 102, 101, |
584 | 102, 101, 99, 97, 96, 95, 94, 93, 92, 90, | 584 | 99, 97, 96, 95, 94, 93, 92, 90, 88, 87, |
585 | 88, 87, 86, 84, 83, 82, 81, 80, 79, 78, | 585 | 86, 84, 83, 82, 81, 80, 79, 78, 76, 71, |
586 | 76, 71, 70, 68, 65, 63, 62, 58, 52, 51, | 586 | 70, 68, 65, 63, 62, 58, 52, 51, 49, 48, |
587 | 49, 48, 47, 43, 40, 24, 23, 21, 15, 11, | 587 | 47, 43, 40, 24, 23, 21, 15, 11, 8, 6, |
588 | 8, 6, 3, 2, 160, 160, 160, 160, 160, 160, | 588 | 3, 2, 160, 160, 160, 160, 160, 160, 160, 160, |
589 | 589 | ||
590 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, | 590 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, |
591 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, | 591 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, |
592 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, | 592 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, |
593 | 160, 160, 160, 160, 160, 160, 160, 160, 160, 160 | 593 | 160, 160, 160, 160, 160, 160, 160, 160, 160 |
594 | } ; | 594 | } ; |
595 | 595 | ||
596 | static yy_state_type yy_last_accepting_state; | 596 | static yy_state_type yy_last_accepting_state; |
diff --git a/scripts/dtc/dtc-parser.tab.c_shipped b/scripts/dtc/dtc-parser.tab.c_shipped index 4af55900a15b..ee1d8c3042fb 100644 --- a/scripts/dtc/dtc-parser.tab.c_shipped +++ b/scripts/dtc/dtc-parser.tab.c_shipped | |||
@@ -1,10 +1,8 @@ | |||
1 | /* A Bison parser, made by GNU Bison 2.5. */ | ||
1 | 2 | ||
2 | /* A Bison parser, made by GNU Bison 2.4.1. */ | 3 | /* Bison implementation for Yacc-like parsers in C |
3 | |||
4 | /* Skeleton implementation for Bison's Yacc-like parsers in C | ||
5 | 4 | ||
6 | Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 | 5 | Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. |
7 | Free Software Foundation, Inc. | ||
8 | 6 | ||
9 | This program is free software: you can redistribute it and/or modify | 7 | This program is free software: you can redistribute it and/or modify |
10 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
@@ -46,7 +44,7 @@ | |||
46 | #define YYBISON 1 | 44 | #define YYBISON 1 |
47 | 45 | ||
48 | /* Bison version. */ | 46 | /* Bison version. */ |
49 | #define YYBISON_VERSION "2.4.1" | 47 | #define YYBISON_VERSION "2.5" |
50 | 48 | ||
51 | /* Skeleton name. */ | 49 | /* Skeleton name. */ |
52 | #define YYSKELETON_NAME "yacc.c" | 50 | #define YYSKELETON_NAME "yacc.c" |
@@ -67,7 +65,7 @@ | |||
67 | 65 | ||
68 | /* Copy the first part of user declarations. */ | 66 | /* Copy the first part of user declarations. */ |
69 | 67 | ||
70 | /* Line 189 of yacc.c */ | 68 | /* Line 268 of yacc.c */ |
71 | #line 21 "dtc-parser.y" | 69 | #line 21 "dtc-parser.y" |
72 | 70 | ||
73 | #include <stdio.h> | 71 | #include <stdio.h> |
@@ -88,8 +86,8 @@ static unsigned long long eval_literal(const char *s, int base, int bits); | |||
88 | static unsigned char eval_char_literal(const char *s); | 86 | static unsigned char eval_char_literal(const char *s); |
89 | 87 | ||
90 | 88 | ||
91 | /* Line 189 of yacc.c */ | 89 | /* Line 268 of yacc.c */ |
92 | #line 93 "dtc-parser.tab.c" | 90 | #line 91 "dtc-parser.tab.c" |
93 | 91 | ||
94 | /* Enabling traces. */ | 92 | /* Enabling traces. */ |
95 | #ifndef YYDEBUG | 93 | #ifndef YYDEBUG |
@@ -147,7 +145,7 @@ static unsigned char eval_char_literal(const char *s); | |||
147 | typedef union YYSTYPE | 145 | typedef union YYSTYPE |
148 | { | 146 | { |
149 | 147 | ||
150 | /* Line 214 of yacc.c */ | 148 | /* Line 293 of yacc.c */ |
151 | #line 40 "dtc-parser.y" | 149 | #line 40 "dtc-parser.y" |
152 | 150 | ||
153 | char *propnodename; | 151 | char *propnodename; |
@@ -171,8 +169,8 @@ typedef union YYSTYPE | |||
171 | 169 | ||
172 | 170 | ||
173 | 171 | ||
174 | /* Line 214 of yacc.c */ | 172 | /* Line 293 of yacc.c */ |
175 | #line 176 "dtc-parser.tab.c" | 173 | #line 174 "dtc-parser.tab.c" |
176 | } YYSTYPE; | 174 | } YYSTYPE; |
177 | # define YYSTYPE_IS_TRIVIAL 1 | 175 | # define YYSTYPE_IS_TRIVIAL 1 |
178 | # define yystype YYSTYPE /* obsolescent; will be withdrawn */ | 176 | # define yystype YYSTYPE /* obsolescent; will be withdrawn */ |
@@ -183,8 +181,8 @@ typedef union YYSTYPE | |||
183 | /* Copy the second part of user declarations. */ | 181 | /* Copy the second part of user declarations. */ |
184 | 182 | ||
185 | 183 | ||
186 | /* Line 264 of yacc.c */ | 184 | /* Line 343 of yacc.c */ |
187 | #line 188 "dtc-parser.tab.c" | 185 | #line 186 "dtc-parser.tab.c" |
188 | 186 | ||
189 | #ifdef short | 187 | #ifdef short |
190 | # undef short | 188 | # undef short |
@@ -234,7 +232,7 @@ typedef short int yytype_int16; | |||
234 | #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) | 232 | #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) |
235 | 233 | ||
236 | #ifndef YY_ | 234 | #ifndef YY_ |
237 | # if YYENABLE_NLS | 235 | # if defined YYENABLE_NLS && YYENABLE_NLS |
238 | # if ENABLE_NLS | 236 | # if ENABLE_NLS |
239 | # include <libintl.h> /* INFRINGES ON USER NAME SPACE */ | 237 | # include <libintl.h> /* INFRINGES ON USER NAME SPACE */ |
240 | # define YY_(msgid) dgettext ("bison-runtime", msgid) | 238 | # define YY_(msgid) dgettext ("bison-runtime", msgid) |
@@ -287,11 +285,11 @@ YYID (yyi) | |||
287 | # define alloca _alloca | 285 | # define alloca _alloca |
288 | # else | 286 | # else |
289 | # define YYSTACK_ALLOC alloca | 287 | # define YYSTACK_ALLOC alloca |
290 | # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ | 288 | # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ |
291 | || defined __cplusplus || defined _MSC_VER) | 289 | || defined __cplusplus || defined _MSC_VER) |
292 | # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ | 290 | # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ |
293 | # ifndef _STDLIB_H | 291 | # ifndef EXIT_SUCCESS |
294 | # define _STDLIB_H 1 | 292 | # define EXIT_SUCCESS 0 |
295 | # endif | 293 | # endif |
296 | # endif | 294 | # endif |
297 | # endif | 295 | # endif |
@@ -314,24 +312,24 @@ YYID (yyi) | |||
314 | # ifndef YYSTACK_ALLOC_MAXIMUM | 312 | # ifndef YYSTACK_ALLOC_MAXIMUM |
315 | # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM | 313 | # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM |
316 | # endif | 314 | # endif |
317 | # if (defined __cplusplus && ! defined _STDLIB_H \ | 315 | # if (defined __cplusplus && ! defined EXIT_SUCCESS \ |
318 | && ! ((defined YYMALLOC || defined malloc) \ | 316 | && ! ((defined YYMALLOC || defined malloc) \ |
319 | && (defined YYFREE || defined free))) | 317 | && (defined YYFREE || defined free))) |
320 | # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ | 318 | # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ |
321 | # ifndef _STDLIB_H | 319 | # ifndef EXIT_SUCCESS |
322 | # define _STDLIB_H 1 | 320 | # define EXIT_SUCCESS 0 |
323 | # endif | 321 | # endif |
324 | # endif | 322 | # endif |
325 | # ifndef YYMALLOC | 323 | # ifndef YYMALLOC |
326 | # define YYMALLOC malloc | 324 | # define YYMALLOC malloc |
327 | # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ | 325 | # if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ |
328 | || defined __cplusplus || defined _MSC_VER) | 326 | || defined __cplusplus || defined _MSC_VER) |
329 | void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ | 327 | void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ |
330 | # endif | 328 | # endif |
331 | # endif | 329 | # endif |
332 | # ifndef YYFREE | 330 | # ifndef YYFREE |
333 | # define YYFREE free | 331 | # define YYFREE free |
334 | # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ | 332 | # if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \ |
335 | || defined __cplusplus || defined _MSC_VER) | 333 | || defined __cplusplus || defined _MSC_VER) |
336 | void free (void *); /* INFRINGES ON USER NAME SPACE */ | 334 | void free (void *); /* INFRINGES ON USER NAME SPACE */ |
337 | # endif | 335 | # endif |
@@ -360,23 +358,7 @@ union yyalloc | |||
360 | ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ | 358 | ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ |
361 | + YYSTACK_GAP_MAXIMUM) | 359 | + YYSTACK_GAP_MAXIMUM) |
362 | 360 | ||
363 | /* Copy COUNT objects from FROM to TO. The source and destination do | 361 | # define YYCOPY_NEEDED 1 |
364 | not overlap. */ | ||
365 | # ifndef YYCOPY | ||
366 | # if defined __GNUC__ && 1 < __GNUC__ | ||
367 | # define YYCOPY(To, From, Count) \ | ||
368 | __builtin_memcpy (To, From, (Count) * sizeof (*(From))) | ||
369 | # else | ||
370 | # define YYCOPY(To, From, Count) \ | ||
371 | do \ | ||
372 | { \ | ||
373 | YYSIZE_T yyi; \ | ||
374 | for (yyi = 0; yyi < (Count); yyi++) \ | ||
375 | (To)[yyi] = (From)[yyi]; \ | ||
376 | } \ | ||
377 | while (YYID (0)) | ||
378 | # endif | ||
379 | # endif | ||
380 | 362 | ||
381 | /* Relocate STACK from its old location to the new one. The | 363 | /* Relocate STACK from its old location to the new one. The |
382 | local variables YYSIZE and YYSTACKSIZE give the old and new number of | 364 | local variables YYSIZE and YYSTACKSIZE give the old and new number of |
@@ -396,6 +378,26 @@ union yyalloc | |||
396 | 378 | ||
397 | #endif | 379 | #endif |
398 | 380 | ||
381 | #if defined YYCOPY_NEEDED && YYCOPY_NEEDED | ||
382 | /* Copy COUNT objects from FROM to TO. The source and destination do | ||
383 | not overlap. */ | ||
384 | # ifndef YYCOPY | ||
385 | # if defined __GNUC__ && 1 < __GNUC__ | ||
386 | # define YYCOPY(To, From, Count) \ | ||
387 | __builtin_memcpy (To, From, (Count) * sizeof (*(From))) | ||
388 | # else | ||
389 | # define YYCOPY(To, From, Count) \ | ||
390 | do \ | ||
391 | { \ | ||
392 | YYSIZE_T yyi; \ | ||
393 | for (yyi = 0; yyi < (Count); yyi++) \ | ||
394 | (To)[yyi] = (From)[yyi]; \ | ||
395 | } \ | ||
396 | while (YYID (0)) | ||
397 | # endif | ||
398 | # endif | ||
399 | #endif /* !YYCOPY_NEEDED */ | ||
400 | |||
399 | /* YYFINAL -- State number of the termination state. */ | 401 | /* YYFINAL -- State number of the termination state. */ |
400 | #define YYFINAL 4 | 402 | #define YYFINAL 4 |
401 | /* YYLAST -- Last index in YYTABLE. */ | 403 | /* YYLAST -- Last index in YYTABLE. */ |
@@ -571,8 +573,8 @@ static const yytype_uint8 yyr2[] = | |||
571 | 2, 0, 2, 2, 0, 2, 2, 2, 3, 2 | 573 | 2, 0, 2, 2, 0, 2, 2, 2, 3, 2 |
572 | }; | 574 | }; |
573 | 575 | ||
574 | /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state | 576 | /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM. |
575 | STATE-NUM when YYTABLE doesn't specify something else to do. Zero | 577 | Performed when YYTABLE doesn't specify something else to do. Zero |
576 | means the default is an error. */ | 578 | means the default is an error. */ |
577 | static const yytype_uint8 yydefact[] = | 579 | static const yytype_uint8 yydefact[] = |
578 | { | 580 | { |
@@ -633,8 +635,7 @@ static const yytype_int8 yypgoto[] = | |||
633 | 635 | ||
634 | /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If | 636 | /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If |
635 | positive, shift that token. If negative, reduce the rule which | 637 | positive, shift that token. If negative, reduce the rule which |
636 | number is the opposite. If zero, do what YYDEFACT says. | 638 | number is the opposite. If YYTABLE_NINF, syntax error. */ |
637 | If YYTABLE_NINF, syntax error. */ | ||
638 | #define YYTABLE_NINF -1 | 639 | #define YYTABLE_NINF -1 |
639 | static const yytype_uint8 yytable[] = | 640 | static const yytype_uint8 yytable[] = |
640 | { | 641 | { |
@@ -654,6 +655,12 @@ static const yytype_uint8 yytable[] = | |||
654 | 137, 0, 73, 139 | 655 | 137, 0, 73, 139 |
655 | }; | 656 | }; |
656 | 657 | ||
658 | #define yypact_value_is_default(yystate) \ | ||
659 | ((yystate) == (-78)) | ||
660 | |||
661 | #define yytable_value_is_error(yytable_value) \ | ||
662 | YYID (0) | ||
663 | |||
657 | static const yytype_int16 yycheck[] = | 664 | static const yytype_int16 yycheck[] = |
658 | { | 665 | { |
659 | 5, 38, 39, 17, 18, 19, 12, 12, 17, 18, | 666 | 5, 38, 39, 17, 18, 19, 12, 12, 17, 18, |
@@ -705,9 +712,18 @@ static const yytype_uint8 yystos[] = | |||
705 | 712 | ||
706 | /* Like YYERROR except do call yyerror. This remains here temporarily | 713 | /* Like YYERROR except do call yyerror. This remains here temporarily |
707 | to ease the transition to the new meaning of YYERROR, for GCC. | 714 | to ease the transition to the new meaning of YYERROR, for GCC. |
708 | Once GCC version 2 has supplanted version 1, this can go. */ | 715 | Once GCC version 2 has supplanted version 1, this can go. However, |
716 | YYFAIL appears to be in use. Nevertheless, it is formally deprecated | ||
717 | in Bison 2.4.2's NEWS entry, where a plan to phase it out is | ||
718 | discussed. */ | ||
709 | 719 | ||
710 | #define YYFAIL goto yyerrlab | 720 | #define YYFAIL goto yyerrlab |
721 | #if defined YYFAIL | ||
722 | /* This is here to suppress warnings from the GCC cpp's | ||
723 | -Wunused-macros. Normally we don't worry about that warning, but | ||
724 | some users do, and we want to make it easy for users to remove | ||
725 | YYFAIL uses, which will produce warnings from Bison 2.5. */ | ||
726 | #endif | ||
711 | 727 | ||
712 | #define YYRECOVERING() (!!yyerrstatus) | 728 | #define YYRECOVERING() (!!yyerrstatus) |
713 | 729 | ||
@@ -717,7 +733,6 @@ do \ | |||
717 | { \ | 733 | { \ |
718 | yychar = (Token); \ | 734 | yychar = (Token); \ |
719 | yylval = (Value); \ | 735 | yylval = (Value); \ |
720 | yytoken = YYTRANSLATE (yychar); \ | ||
721 | YYPOPSTACK (1); \ | 736 | YYPOPSTACK (1); \ |
722 | goto yybackup; \ | 737 | goto yybackup; \ |
723 | } \ | 738 | } \ |
@@ -759,19 +774,10 @@ while (YYID (0)) | |||
759 | #endif | 774 | #endif |
760 | 775 | ||
761 | 776 | ||
762 | /* YY_LOCATION_PRINT -- Print the location on the stream. | 777 | /* This macro is provided for backward compatibility. */ |
763 | This macro was not mandated originally: define only if we know | ||
764 | we won't break user code: when these are the locations we know. */ | ||
765 | 778 | ||
766 | #ifndef YY_LOCATION_PRINT | 779 | #ifndef YY_LOCATION_PRINT |
767 | # if YYLTYPE_IS_TRIVIAL | 780 | # define YY_LOCATION_PRINT(File, Loc) ((void) 0) |
768 | # define YY_LOCATION_PRINT(File, Loc) \ | ||
769 | fprintf (File, "%d.%d-%d.%d", \ | ||
770 | (Loc).first_line, (Loc).first_column, \ | ||
771 | (Loc).last_line, (Loc).last_column) | ||
772 | # else | ||
773 | # define YY_LOCATION_PRINT(File, Loc) ((void) 0) | ||
774 | # endif | ||
775 | #endif | 781 | #endif |
776 | 782 | ||
777 | 783 | ||
@@ -963,7 +969,6 @@ int yydebug; | |||
963 | # define YYMAXDEPTH 10000 | 969 | # define YYMAXDEPTH 10000 |
964 | #endif | 970 | #endif |
965 | 971 | ||
966 | |||
967 | 972 | ||
968 | #if YYERROR_VERBOSE | 973 | #if YYERROR_VERBOSE |
969 | 974 | ||
@@ -1066,115 +1071,142 @@ yytnamerr (char *yyres, const char *yystr) | |||
1066 | } | 1071 | } |
1067 | # endif | 1072 | # endif |
1068 | 1073 | ||
1069 | /* Copy into YYRESULT an error message about the unexpected token | 1074 | /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message |
1070 | YYCHAR while in state YYSTATE. Return the number of bytes copied, | 1075 | about the unexpected token YYTOKEN for the state stack whose top is |
1071 | including the terminating null byte. If YYRESULT is null, do not | 1076 | YYSSP. |
1072 | copy anything; just return the number of bytes that would be | ||
1073 | copied. As a special case, return 0 if an ordinary "syntax error" | ||
1074 | message will do. Return YYSIZE_MAXIMUM if overflow occurs during | ||
1075 | size calculation. */ | ||
1076 | static YYSIZE_T | ||
1077 | yysyntax_error (char *yyresult, int yystate, int yychar) | ||
1078 | { | ||
1079 | int yyn = yypact[yystate]; | ||
1080 | 1077 | ||
1081 | if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) | 1078 | Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is |
1082 | return 0; | 1079 | not large enough to hold the message. In that case, also set |
1083 | else | 1080 | *YYMSG_ALLOC to the required number of bytes. Return 2 if the |
1081 | required number of bytes is too large to store. */ | ||
1082 | static int | ||
1083 | yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, | ||
1084 | yytype_int16 *yyssp, int yytoken) | ||
1085 | { | ||
1086 | YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]); | ||
1087 | YYSIZE_T yysize = yysize0; | ||
1088 | YYSIZE_T yysize1; | ||
1089 | enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; | ||
1090 | /* Internationalized format string. */ | ||
1091 | const char *yyformat = 0; | ||
1092 | /* Arguments of yyformat. */ | ||
1093 | char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; | ||
1094 | /* Number of reported tokens (one for the "unexpected", one per | ||
1095 | "expected"). */ | ||
1096 | int yycount = 0; | ||
1097 | |||
1098 | /* There are many possibilities here to consider: | ||
1099 | - Assume YYFAIL is not used. It's too flawed to consider. See | ||
1100 | <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html> | ||
1101 | for details. YYERROR is fine as it does not invoke this | ||
1102 | function. | ||
1103 | - If this state is a consistent state with a default action, then | ||
1104 | the only way this function was invoked is if the default action | ||
1105 | is an error action. In that case, don't check for expected | ||
1106 | tokens because there are none. | ||
1107 | - The only way there can be no lookahead present (in yychar) is if | ||
1108 | this state is a consistent state with a default action. Thus, | ||
1109 | detecting the absence of a lookahead is sufficient to determine | ||
1110 | that there is no unexpected or expected token to report. In that | ||
1111 | case, just report a simple "syntax error". | ||
1112 | - Don't assume there isn't a lookahead just because this state is a | ||
1113 | consistent state with a default action. There might have been a | ||
1114 | previous inconsistent state, consistent state with a non-default | ||
1115 | action, or user semantic action that manipulated yychar. | ||
1116 | - Of course, the expected token list depends on states to have | ||
1117 | correct lookahead information, and it depends on the parser not | ||
1118 | to perform extra reductions after fetching a lookahead from the | ||
1119 | scanner and before detecting a syntax error. Thus, state merging | ||
1120 | (from LALR or IELR) and default reductions corrupt the expected | ||
1121 | token list. However, the list is correct for canonical LR with | ||
1122 | one exception: it will still contain any token that will not be | ||
1123 | accepted due to an error action in a later state. | ||
1124 | */ | ||
1125 | if (yytoken != YYEMPTY) | ||
1084 | { | 1126 | { |
1085 | int yytype = YYTRANSLATE (yychar); | 1127 | int yyn = yypact[*yyssp]; |
1086 | YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); | 1128 | yyarg[yycount++] = yytname[yytoken]; |
1087 | YYSIZE_T yysize = yysize0; | 1129 | if (!yypact_value_is_default (yyn)) |
1088 | YYSIZE_T yysize1; | 1130 | { |
1089 | int yysize_overflow = 0; | 1131 | /* Start YYX at -YYN if negative to avoid negative indexes in |
1090 | enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; | 1132 | YYCHECK. In other words, skip the first -YYN actions for |
1091 | char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; | 1133 | this state because they are default actions. */ |
1092 | int yyx; | 1134 | int yyxbegin = yyn < 0 ? -yyn : 0; |
1093 | 1135 | /* Stay within bounds of both yycheck and yytname. */ | |
1094 | # if 0 | 1136 | int yychecklim = YYLAST - yyn + 1; |
1095 | /* This is so xgettext sees the translatable formats that are | 1137 | int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; |
1096 | constructed on the fly. */ | 1138 | int yyx; |
1097 | YY_("syntax error, unexpected %s"); | 1139 | |
1098 | YY_("syntax error, unexpected %s, expecting %s"); | 1140 | for (yyx = yyxbegin; yyx < yyxend; ++yyx) |
1099 | YY_("syntax error, unexpected %s, expecting %s or %s"); | 1141 | if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR |
1100 | YY_("syntax error, unexpected %s, expecting %s or %s or %s"); | 1142 | && !yytable_value_is_error (yytable[yyx + yyn])) |
1101 | YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); | 1143 | { |
1102 | # endif | 1144 | if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) |
1103 | char *yyfmt; | 1145 | { |
1104 | char const *yyf; | 1146 | yycount = 1; |
1105 | static char const yyunexpected[] = "syntax error, unexpected %s"; | 1147 | yysize = yysize0; |
1106 | static char const yyexpecting[] = ", expecting %s"; | 1148 | break; |
1107 | static char const yyor[] = " or %s"; | 1149 | } |
1108 | char yyformat[sizeof yyunexpected | 1150 | yyarg[yycount++] = yytname[yyx]; |
1109 | + sizeof yyexpecting - 1 | 1151 | yysize1 = yysize + yytnamerr (0, yytname[yyx]); |
1110 | + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) | 1152 | if (! (yysize <= yysize1 |
1111 | * (sizeof yyor - 1))]; | 1153 | && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) |
1112 | char const *yyprefix = yyexpecting; | 1154 | return 2; |
1113 | 1155 | yysize = yysize1; | |
1114 | /* Start YYX at -YYN if negative to avoid negative indexes in | 1156 | } |
1115 | YYCHECK. */ | 1157 | } |
1116 | int yyxbegin = yyn < 0 ? -yyn : 0; | 1158 | } |
1117 | |||
1118 | /* Stay within bounds of both yycheck and yytname. */ | ||
1119 | int yychecklim = YYLAST - yyn + 1; | ||
1120 | int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; | ||
1121 | int yycount = 1; | ||
1122 | |||
1123 | yyarg[0] = yytname[yytype]; | ||
1124 | yyfmt = yystpcpy (yyformat, yyunexpected); | ||
1125 | |||
1126 | for (yyx = yyxbegin; yyx < yyxend; ++yyx) | ||
1127 | if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) | ||
1128 | { | ||
1129 | if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) | ||
1130 | { | ||
1131 | yycount = 1; | ||
1132 | yysize = yysize0; | ||
1133 | yyformat[sizeof yyunexpected - 1] = '\0'; | ||
1134 | break; | ||
1135 | } | ||
1136 | yyarg[yycount++] = yytname[yyx]; | ||
1137 | yysize1 = yysize + yytnamerr (0, yytname[yyx]); | ||
1138 | yysize_overflow |= (yysize1 < yysize); | ||
1139 | yysize = yysize1; | ||
1140 | yyfmt = yystpcpy (yyfmt, yyprefix); | ||
1141 | yyprefix = yyor; | ||
1142 | } | ||
1143 | 1159 | ||
1144 | yyf = YY_(yyformat); | 1160 | switch (yycount) |
1145 | yysize1 = yysize + yystrlen (yyf); | 1161 | { |
1146 | yysize_overflow |= (yysize1 < yysize); | 1162 | # define YYCASE_(N, S) \ |
1147 | yysize = yysize1; | 1163 | case N: \ |
1164 | yyformat = S; \ | ||
1165 | break | ||
1166 | YYCASE_(0, YY_("syntax error")); | ||
1167 | YYCASE_(1, YY_("syntax error, unexpected %s")); | ||
1168 | YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); | ||
1169 | YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); | ||
1170 | YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); | ||
1171 | YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); | ||
1172 | # undef YYCASE_ | ||
1173 | } | ||
1148 | 1174 | ||
1149 | if (yysize_overflow) | 1175 | yysize1 = yysize + yystrlen (yyformat); |
1150 | return YYSIZE_MAXIMUM; | 1176 | if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) |
1177 | return 2; | ||
1178 | yysize = yysize1; | ||
1151 | 1179 | ||
1152 | if (yyresult) | 1180 | if (*yymsg_alloc < yysize) |
1153 | { | 1181 | { |
1154 | /* Avoid sprintf, as that infringes on the user's name space. | 1182 | *yymsg_alloc = 2 * yysize; |
1155 | Don't have undefined behavior even if the translation | 1183 | if (! (yysize <= *yymsg_alloc |
1156 | produced a string with the wrong number of "%s"s. */ | 1184 | && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) |
1157 | char *yyp = yyresult; | 1185 | *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; |
1158 | int yyi = 0; | 1186 | return 1; |
1159 | while ((*yyp = *yyf) != '\0') | ||
1160 | { | ||
1161 | if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) | ||
1162 | { | ||
1163 | yyp += yytnamerr (yyp, yyarg[yyi++]); | ||
1164 | yyf += 2; | ||
1165 | } | ||
1166 | else | ||
1167 | { | ||
1168 | yyp++; | ||
1169 | yyf++; | ||
1170 | } | ||
1171 | } | ||
1172 | } | ||
1173 | return yysize; | ||
1174 | } | 1187 | } |
1188 | |||
1189 | /* Avoid sprintf, as that infringes on the user's name space. | ||
1190 | Don't have undefined behavior even if the translation | ||
1191 | produced a string with the wrong number of "%s"s. */ | ||
1192 | { | ||
1193 | char *yyp = *yymsg; | ||
1194 | int yyi = 0; | ||
1195 | while ((*yyp = *yyformat) != '\0') | ||
1196 | if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) | ||
1197 | { | ||
1198 | yyp += yytnamerr (yyp, yyarg[yyi++]); | ||
1199 | yyformat += 2; | ||
1200 | } | ||
1201 | else | ||
1202 | { | ||
1203 | yyp++; | ||
1204 | yyformat++; | ||
1205 | } | ||
1206 | } | ||
1207 | return 0; | ||
1175 | } | 1208 | } |
1176 | #endif /* YYERROR_VERBOSE */ | 1209 | #endif /* YYERROR_VERBOSE */ |
1177 | |||
1178 | 1210 | ||
1179 | /*-----------------------------------------------. | 1211 | /*-----------------------------------------------. |
1180 | | Release the memory associated to this symbol. | | 1212 | | Release the memory associated to this symbol. | |
@@ -1207,6 +1239,7 @@ yydestruct (yymsg, yytype, yyvaluep) | |||
1207 | } | 1239 | } |
1208 | } | 1240 | } |
1209 | 1241 | ||
1242 | |||
1210 | /* Prevent warnings from -Wmissing-prototypes. */ | 1243 | /* Prevent warnings from -Wmissing-prototypes. */ |
1211 | #ifdef YYPARSE_PARAM | 1244 | #ifdef YYPARSE_PARAM |
1212 | #if defined __STDC__ || defined __cplusplus | 1245 | #if defined __STDC__ || defined __cplusplus |
@@ -1233,10 +1266,9 @@ YYSTYPE yylval; | |||
1233 | int yynerrs; | 1266 | int yynerrs; |
1234 | 1267 | ||
1235 | 1268 | ||
1236 | 1269 | /*----------. | |
1237 | /*-------------------------. | 1270 | | yyparse. | |
1238 | | yyparse or yypush_parse. | | 1271 | `----------*/ |
1239 | `-------------------------*/ | ||
1240 | 1272 | ||
1241 | #ifdef YYPARSE_PARAM | 1273 | #ifdef YYPARSE_PARAM |
1242 | #if (defined __STDC__ || defined __C99__FUNC__ \ | 1274 | #if (defined __STDC__ || defined __C99__FUNC__ \ |
@@ -1260,8 +1292,6 @@ yyparse () | |||
1260 | #endif | 1292 | #endif |
1261 | #endif | 1293 | #endif |
1262 | { | 1294 | { |
1263 | |||
1264 | |||
1265 | int yystate; | 1295 | int yystate; |
1266 | /* Number of tokens to shift before error messages enabled. */ | 1296 | /* Number of tokens to shift before error messages enabled. */ |
1267 | int yyerrstatus; | 1297 | int yyerrstatus; |
@@ -1416,7 +1446,7 @@ yybackup: | |||
1416 | 1446 | ||
1417 | /* First try to decide what to do without reference to lookahead token. */ | 1447 | /* First try to decide what to do without reference to lookahead token. */ |
1418 | yyn = yypact[yystate]; | 1448 | yyn = yypact[yystate]; |
1419 | if (yyn == YYPACT_NINF) | 1449 | if (yypact_value_is_default (yyn)) |
1420 | goto yydefault; | 1450 | goto yydefault; |
1421 | 1451 | ||
1422 | /* Not known => get a lookahead token if don't already have one. */ | 1452 | /* Not known => get a lookahead token if don't already have one. */ |
@@ -1447,8 +1477,8 @@ yybackup: | |||
1447 | yyn = yytable[yyn]; | 1477 | yyn = yytable[yyn]; |
1448 | if (yyn <= 0) | 1478 | if (yyn <= 0) |
1449 | { | 1479 | { |
1450 | if (yyn == 0 || yyn == YYTABLE_NINF) | 1480 | if (yytable_value_is_error (yyn)) |
1451 | goto yyerrlab; | 1481 | goto yyerrlab; |
1452 | yyn = -yyn; | 1482 | yyn = -yyn; |
1453 | goto yyreduce; | 1483 | goto yyreduce; |
1454 | } | 1484 | } |
@@ -1503,72 +1533,72 @@ yyreduce: | |||
1503 | { | 1533 | { |
1504 | case 2: | 1534 | case 2: |
1505 | 1535 | ||
1506 | /* Line 1455 of yacc.c */ | 1536 | /* Line 1806 of yacc.c */ |
1507 | #line 110 "dtc-parser.y" | 1537 | #line 110 "dtc-parser.y" |
1508 | { | 1538 | { |
1509 | the_boot_info = build_boot_info((yyvsp[(3) - (4)].re), (yyvsp[(4) - (4)].node), | 1539 | the_boot_info = build_boot_info((yyvsp[(3) - (4)].re), (yyvsp[(4) - (4)].node), |
1510 | guess_boot_cpuid((yyvsp[(4) - (4)].node))); | 1540 | guess_boot_cpuid((yyvsp[(4) - (4)].node))); |
1511 | ;} | 1541 | } |
1512 | break; | 1542 | break; |
1513 | 1543 | ||
1514 | case 3: | 1544 | case 3: |
1515 | 1545 | ||
1516 | /* Line 1455 of yacc.c */ | 1546 | /* Line 1806 of yacc.c */ |
1517 | #line 118 "dtc-parser.y" | 1547 | #line 118 "dtc-parser.y" |
1518 | { | 1548 | { |
1519 | (yyval.re) = NULL; | 1549 | (yyval.re) = NULL; |
1520 | ;} | 1550 | } |
1521 | break; | 1551 | break; |
1522 | 1552 | ||
1523 | case 4: | 1553 | case 4: |
1524 | 1554 | ||
1525 | /* Line 1455 of yacc.c */ | 1555 | /* Line 1806 of yacc.c */ |
1526 | #line 122 "dtc-parser.y" | 1556 | #line 122 "dtc-parser.y" |
1527 | { | 1557 | { |
1528 | (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re)); | 1558 | (yyval.re) = chain_reserve_entry((yyvsp[(1) - (2)].re), (yyvsp[(2) - (2)].re)); |
1529 | ;} | 1559 | } |
1530 | break; | 1560 | break; |
1531 | 1561 | ||
1532 | case 5: | 1562 | case 5: |
1533 | 1563 | ||
1534 | /* Line 1455 of yacc.c */ | 1564 | /* Line 1806 of yacc.c */ |
1535 | #line 129 "dtc-parser.y" | 1565 | #line 129 "dtc-parser.y" |
1536 | { | 1566 | { |
1537 | (yyval.re) = build_reserve_entry((yyvsp[(2) - (4)].integer), (yyvsp[(3) - (4)].integer)); | 1567 | (yyval.re) = build_reserve_entry((yyvsp[(2) - (4)].integer), (yyvsp[(3) - (4)].integer)); |
1538 | ;} | 1568 | } |
1539 | break; | 1569 | break; |
1540 | 1570 | ||
1541 | case 6: | 1571 | case 6: |
1542 | 1572 | ||
1543 | /* Line 1455 of yacc.c */ | 1573 | /* Line 1806 of yacc.c */ |
1544 | #line 133 "dtc-parser.y" | 1574 | #line 133 "dtc-parser.y" |
1545 | { | 1575 | { |
1546 | add_label(&(yyvsp[(2) - (2)].re)->labels, (yyvsp[(1) - (2)].labelref)); | 1576 | add_label(&(yyvsp[(2) - (2)].re)->labels, (yyvsp[(1) - (2)].labelref)); |
1547 | (yyval.re) = (yyvsp[(2) - (2)].re); | 1577 | (yyval.re) = (yyvsp[(2) - (2)].re); |
1548 | ;} | 1578 | } |
1549 | break; | 1579 | break; |
1550 | 1580 | ||
1551 | case 7: | 1581 | case 7: |
1552 | 1582 | ||
1553 | /* Line 1455 of yacc.c */ | 1583 | /* Line 1806 of yacc.c */ |
1554 | #line 141 "dtc-parser.y" | 1584 | #line 141 "dtc-parser.y" |
1555 | { | 1585 | { |
1556 | (yyval.node) = name_node((yyvsp[(2) - (2)].node), ""); | 1586 | (yyval.node) = name_node((yyvsp[(2) - (2)].node), ""); |
1557 | ;} | 1587 | } |
1558 | break; | 1588 | break; |
1559 | 1589 | ||
1560 | case 8: | 1590 | case 8: |
1561 | 1591 | ||
1562 | /* Line 1455 of yacc.c */ | 1592 | /* Line 1806 of yacc.c */ |
1563 | #line 145 "dtc-parser.y" | 1593 | #line 145 "dtc-parser.y" |
1564 | { | 1594 | { |
1565 | (yyval.node) = merge_nodes((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); | 1595 | (yyval.node) = merge_nodes((yyvsp[(1) - (3)].node), (yyvsp[(3) - (3)].node)); |
1566 | ;} | 1596 | } |
1567 | break; | 1597 | break; |
1568 | 1598 | ||
1569 | case 9: | 1599 | case 9: |
1570 | 1600 | ||
1571 | /* Line 1455 of yacc.c */ | 1601 | /* Line 1806 of yacc.c */ |
1572 | #line 149 "dtc-parser.y" | 1602 | #line 149 "dtc-parser.y" |
1573 | { | 1603 | { |
1574 | struct node *target = get_node_by_ref((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].labelref)); | 1604 | struct node *target = get_node_by_ref((yyvsp[(1) - (3)].node), (yyvsp[(2) - (3)].labelref)); |
@@ -1578,12 +1608,12 @@ yyreduce: | |||
1578 | else | 1608 | else |
1579 | print_error("label or path, '%s', not found", (yyvsp[(2) - (3)].labelref)); | 1609 | print_error("label or path, '%s', not found", (yyvsp[(2) - (3)].labelref)); |
1580 | (yyval.node) = (yyvsp[(1) - (3)].node); | 1610 | (yyval.node) = (yyvsp[(1) - (3)].node); |
1581 | ;} | 1611 | } |
1582 | break; | 1612 | break; |
1583 | 1613 | ||
1584 | case 10: | 1614 | case 10: |
1585 | 1615 | ||
1586 | /* Line 1455 of yacc.c */ | 1616 | /* Line 1806 of yacc.c */ |
1587 | #line 159 "dtc-parser.y" | 1617 | #line 159 "dtc-parser.y" |
1588 | { | 1618 | { |
1589 | struct node *target = get_node_by_ref((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].labelref)); | 1619 | struct node *target = get_node_by_ref((yyvsp[(1) - (4)].node), (yyvsp[(3) - (4)].labelref)); |
@@ -1594,112 +1624,112 @@ yyreduce: | |||
1594 | delete_node(target); | 1624 | delete_node(target); |
1595 | 1625 | ||
1596 | (yyval.node) = (yyvsp[(1) - (4)].node); | 1626 | (yyval.node) = (yyvsp[(1) - (4)].node); |
1597 | ;} | 1627 | } |
1598 | break; | 1628 | break; |
1599 | 1629 | ||
1600 | case 11: | 1630 | case 11: |
1601 | 1631 | ||
1602 | /* Line 1455 of yacc.c */ | 1632 | /* Line 1806 of yacc.c */ |
1603 | #line 173 "dtc-parser.y" | 1633 | #line 173 "dtc-parser.y" |
1604 | { | 1634 | { |
1605 | (yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist)); | 1635 | (yyval.node) = build_node((yyvsp[(2) - (5)].proplist), (yyvsp[(3) - (5)].nodelist)); |
1606 | ;} | 1636 | } |
1607 | break; | 1637 | break; |
1608 | 1638 | ||
1609 | case 12: | 1639 | case 12: |
1610 | 1640 | ||
1611 | /* Line 1455 of yacc.c */ | 1641 | /* Line 1806 of yacc.c */ |
1612 | #line 180 "dtc-parser.y" | 1642 | #line 180 "dtc-parser.y" |
1613 | { | 1643 | { |
1614 | (yyval.proplist) = NULL; | 1644 | (yyval.proplist) = NULL; |
1615 | ;} | 1645 | } |
1616 | break; | 1646 | break; |
1617 | 1647 | ||
1618 | case 13: | 1648 | case 13: |
1619 | 1649 | ||
1620 | /* Line 1455 of yacc.c */ | 1650 | /* Line 1806 of yacc.c */ |
1621 | #line 184 "dtc-parser.y" | 1651 | #line 184 "dtc-parser.y" |
1622 | { | 1652 | { |
1623 | (yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist)); | 1653 | (yyval.proplist) = chain_property((yyvsp[(2) - (2)].prop), (yyvsp[(1) - (2)].proplist)); |
1624 | ;} | 1654 | } |
1625 | break; | 1655 | break; |
1626 | 1656 | ||
1627 | case 14: | 1657 | case 14: |
1628 | 1658 | ||
1629 | /* Line 1455 of yacc.c */ | 1659 | /* Line 1806 of yacc.c */ |
1630 | #line 191 "dtc-parser.y" | 1660 | #line 191 "dtc-parser.y" |
1631 | { | 1661 | { |
1632 | (yyval.prop) = build_property((yyvsp[(1) - (4)].propnodename), (yyvsp[(3) - (4)].data)); | 1662 | (yyval.prop) = build_property((yyvsp[(1) - (4)].propnodename), (yyvsp[(3) - (4)].data)); |
1633 | ;} | 1663 | } |
1634 | break; | 1664 | break; |
1635 | 1665 | ||
1636 | case 15: | 1666 | case 15: |
1637 | 1667 | ||
1638 | /* Line 1455 of yacc.c */ | 1668 | /* Line 1806 of yacc.c */ |
1639 | #line 195 "dtc-parser.y" | 1669 | #line 195 "dtc-parser.y" |
1640 | { | 1670 | { |
1641 | (yyval.prop) = build_property((yyvsp[(1) - (2)].propnodename), empty_data); | 1671 | (yyval.prop) = build_property((yyvsp[(1) - (2)].propnodename), empty_data); |
1642 | ;} | 1672 | } |
1643 | break; | 1673 | break; |
1644 | 1674 | ||
1645 | case 16: | 1675 | case 16: |
1646 | 1676 | ||
1647 | /* Line 1455 of yacc.c */ | 1677 | /* Line 1806 of yacc.c */ |
1648 | #line 199 "dtc-parser.y" | 1678 | #line 199 "dtc-parser.y" |
1649 | { | 1679 | { |
1650 | (yyval.prop) = build_property_delete((yyvsp[(2) - (3)].propnodename)); | 1680 | (yyval.prop) = build_property_delete((yyvsp[(2) - (3)].propnodename)); |
1651 | ;} | 1681 | } |
1652 | break; | 1682 | break; |
1653 | 1683 | ||
1654 | case 17: | 1684 | case 17: |
1655 | 1685 | ||
1656 | /* Line 1455 of yacc.c */ | 1686 | /* Line 1806 of yacc.c */ |
1657 | #line 203 "dtc-parser.y" | 1687 | #line 203 "dtc-parser.y" |
1658 | { | 1688 | { |
1659 | add_label(&(yyvsp[(2) - (2)].prop)->labels, (yyvsp[(1) - (2)].labelref)); | 1689 | add_label(&(yyvsp[(2) - (2)].prop)->labels, (yyvsp[(1) - (2)].labelref)); |
1660 | (yyval.prop) = (yyvsp[(2) - (2)].prop); | 1690 | (yyval.prop) = (yyvsp[(2) - (2)].prop); |
1661 | ;} | 1691 | } |
1662 | break; | 1692 | break; |
1663 | 1693 | ||
1664 | case 18: | 1694 | case 18: |
1665 | 1695 | ||
1666 | /* Line 1455 of yacc.c */ | 1696 | /* Line 1806 of yacc.c */ |
1667 | #line 211 "dtc-parser.y" | 1697 | #line 211 "dtc-parser.y" |
1668 | { | 1698 | { |
1669 | (yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data)); | 1699 | (yyval.data) = data_merge((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].data)); |
1670 | ;} | 1700 | } |
1671 | break; | 1701 | break; |
1672 | 1702 | ||
1673 | case 19: | 1703 | case 19: |
1674 | 1704 | ||
1675 | /* Line 1455 of yacc.c */ | 1705 | /* Line 1806 of yacc.c */ |
1676 | #line 215 "dtc-parser.y" | 1706 | #line 215 "dtc-parser.y" |
1677 | { | 1707 | { |
1678 | (yyval.data) = data_merge((yyvsp[(1) - (3)].data), (yyvsp[(2) - (3)].array).data); | 1708 | (yyval.data) = data_merge((yyvsp[(1) - (3)].data), (yyvsp[(2) - (3)].array).data); |
1679 | ;} | 1709 | } |
1680 | break; | 1710 | break; |
1681 | 1711 | ||
1682 | case 20: | 1712 | case 20: |
1683 | 1713 | ||
1684 | /* Line 1455 of yacc.c */ | 1714 | /* Line 1806 of yacc.c */ |
1685 | #line 219 "dtc-parser.y" | 1715 | #line 219 "dtc-parser.y" |
1686 | { | 1716 | { |
1687 | (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data)); | 1717 | (yyval.data) = data_merge((yyvsp[(1) - (4)].data), (yyvsp[(3) - (4)].data)); |
1688 | ;} | 1718 | } |
1689 | break; | 1719 | break; |
1690 | 1720 | ||
1691 | case 21: | 1721 | case 21: |
1692 | 1722 | ||
1693 | /* Line 1455 of yacc.c */ | 1723 | /* Line 1806 of yacc.c */ |
1694 | #line 223 "dtc-parser.y" | 1724 | #line 223 "dtc-parser.y" |
1695 | { | 1725 | { |
1696 | (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref)); | 1726 | (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), REF_PATH, (yyvsp[(2) - (2)].labelref)); |
1697 | ;} | 1727 | } |
1698 | break; | 1728 | break; |
1699 | 1729 | ||
1700 | case 22: | 1730 | case 22: |
1701 | 1731 | ||
1702 | /* Line 1455 of yacc.c */ | 1732 | /* Line 1806 of yacc.c */ |
1703 | #line 227 "dtc-parser.y" | 1733 | #line 227 "dtc-parser.y" |
1704 | { | 1734 | { |
1705 | FILE *f = srcfile_relative_open((yyvsp[(4) - (9)].data).val, NULL); | 1735 | FILE *f = srcfile_relative_open((yyvsp[(4) - (9)].data).val, NULL); |
@@ -1716,12 +1746,12 @@ yyreduce: | |||
1716 | 1746 | ||
1717 | (yyval.data) = data_merge((yyvsp[(1) - (9)].data), d); | 1747 | (yyval.data) = data_merge((yyvsp[(1) - (9)].data), d); |
1718 | fclose(f); | 1748 | fclose(f); |
1719 | ;} | 1749 | } |
1720 | break; | 1750 | break; |
1721 | 1751 | ||
1722 | case 23: | 1752 | case 23: |
1723 | 1753 | ||
1724 | /* Line 1455 of yacc.c */ | 1754 | /* Line 1806 of yacc.c */ |
1725 | #line 244 "dtc-parser.y" | 1755 | #line 244 "dtc-parser.y" |
1726 | { | 1756 | { |
1727 | FILE *f = srcfile_relative_open((yyvsp[(4) - (5)].data).val, NULL); | 1757 | FILE *f = srcfile_relative_open((yyvsp[(4) - (5)].data).val, NULL); |
@@ -1731,48 +1761,48 @@ yyreduce: | |||
1731 | 1761 | ||
1732 | (yyval.data) = data_merge((yyvsp[(1) - (5)].data), d); | 1762 | (yyval.data) = data_merge((yyvsp[(1) - (5)].data), d); |
1733 | fclose(f); | 1763 | fclose(f); |
1734 | ;} | 1764 | } |
1735 | break; | 1765 | break; |
1736 | 1766 | ||
1737 | case 24: | 1767 | case 24: |
1738 | 1768 | ||
1739 | /* Line 1455 of yacc.c */ | 1769 | /* Line 1806 of yacc.c */ |
1740 | #line 254 "dtc-parser.y" | 1770 | #line 254 "dtc-parser.y" |
1741 | { | 1771 | { |
1742 | (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref)); | 1772 | (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref)); |
1743 | ;} | 1773 | } |
1744 | break; | 1774 | break; |
1745 | 1775 | ||
1746 | case 25: | 1776 | case 25: |
1747 | 1777 | ||
1748 | /* Line 1455 of yacc.c */ | 1778 | /* Line 1806 of yacc.c */ |
1749 | #line 261 "dtc-parser.y" | 1779 | #line 261 "dtc-parser.y" |
1750 | { | 1780 | { |
1751 | (yyval.data) = empty_data; | 1781 | (yyval.data) = empty_data; |
1752 | ;} | 1782 | } |
1753 | break; | 1783 | break; |
1754 | 1784 | ||
1755 | case 26: | 1785 | case 26: |
1756 | 1786 | ||
1757 | /* Line 1455 of yacc.c */ | 1787 | /* Line 1806 of yacc.c */ |
1758 | #line 265 "dtc-parser.y" | 1788 | #line 265 "dtc-parser.y" |
1759 | { | 1789 | { |
1760 | (yyval.data) = (yyvsp[(1) - (2)].data); | 1790 | (yyval.data) = (yyvsp[(1) - (2)].data); |
1761 | ;} | 1791 | } |
1762 | break; | 1792 | break; |
1763 | 1793 | ||
1764 | case 27: | 1794 | case 27: |
1765 | 1795 | ||
1766 | /* Line 1455 of yacc.c */ | 1796 | /* Line 1806 of yacc.c */ |
1767 | #line 269 "dtc-parser.y" | 1797 | #line 269 "dtc-parser.y" |
1768 | { | 1798 | { |
1769 | (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref)); | 1799 | (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref)); |
1770 | ;} | 1800 | } |
1771 | break; | 1801 | break; |
1772 | 1802 | ||
1773 | case 28: | 1803 | case 28: |
1774 | 1804 | ||
1775 | /* Line 1455 of yacc.c */ | 1805 | /* Line 1806 of yacc.c */ |
1776 | #line 276 "dtc-parser.y" | 1806 | #line 276 "dtc-parser.y" |
1777 | { | 1807 | { |
1778 | (yyval.array).data = empty_data; | 1808 | (yyval.array).data = empty_data; |
@@ -1787,22 +1817,22 @@ yyreduce: | |||
1787 | " are currently supported"); | 1817 | " are currently supported"); |
1788 | (yyval.array).bits = 32; | 1818 | (yyval.array).bits = 32; |
1789 | } | 1819 | } |
1790 | ;} | 1820 | } |
1791 | break; | 1821 | break; |
1792 | 1822 | ||
1793 | case 29: | 1823 | case 29: |
1794 | 1824 | ||
1795 | /* Line 1455 of yacc.c */ | 1825 | /* Line 1806 of yacc.c */ |
1796 | #line 291 "dtc-parser.y" | 1826 | #line 291 "dtc-parser.y" |
1797 | { | 1827 | { |
1798 | (yyval.array).data = empty_data; | 1828 | (yyval.array).data = empty_data; |
1799 | (yyval.array).bits = 32; | 1829 | (yyval.array).bits = 32; |
1800 | ;} | 1830 | } |
1801 | break; | 1831 | break; |
1802 | 1832 | ||
1803 | case 30: | 1833 | case 30: |
1804 | 1834 | ||
1805 | /* Line 1455 of yacc.c */ | 1835 | /* Line 1806 of yacc.c */ |
1806 | #line 296 "dtc-parser.y" | 1836 | #line 296 "dtc-parser.y" |
1807 | { | 1837 | { |
1808 | if ((yyvsp[(1) - (2)].array).bits < 64) { | 1838 | if ((yyvsp[(1) - (2)].array).bits < 64) { |
@@ -1822,12 +1852,12 @@ yyreduce: | |||
1822 | } | 1852 | } |
1823 | 1853 | ||
1824 | (yyval.array).data = data_append_integer((yyvsp[(1) - (2)].array).data, (yyvsp[(2) - (2)].integer), (yyvsp[(1) - (2)].array).bits); | 1854 | (yyval.array).data = data_append_integer((yyvsp[(1) - (2)].array).data, (yyvsp[(2) - (2)].integer), (yyvsp[(1) - (2)].array).bits); |
1825 | ;} | 1855 | } |
1826 | break; | 1856 | break; |
1827 | 1857 | ||
1828 | case 31: | 1858 | case 31: |
1829 | 1859 | ||
1830 | /* Line 1455 of yacc.c */ | 1860 | /* Line 1806 of yacc.c */ |
1831 | #line 316 "dtc-parser.y" | 1861 | #line 316 "dtc-parser.y" |
1832 | { | 1862 | { |
1833 | uint64_t val = ~0ULL >> (64 - (yyvsp[(1) - (2)].array).bits); | 1863 | uint64_t val = ~0ULL >> (64 - (yyvsp[(1) - (2)].array).bits); |
@@ -1841,288 +1871,299 @@ yyreduce: | |||
1841 | "arrays with 32-bit elements."); | 1871 | "arrays with 32-bit elements."); |
1842 | 1872 | ||
1843 | (yyval.array).data = data_append_integer((yyvsp[(1) - (2)].array).data, val, (yyvsp[(1) - (2)].array).bits); | 1873 | (yyval.array).data = data_append_integer((yyvsp[(1) - (2)].array).data, val, (yyvsp[(1) - (2)].array).bits); |
1844 | ;} | 1874 | } |
1845 | break; | 1875 | break; |
1846 | 1876 | ||
1847 | case 32: | 1877 | case 32: |
1848 | 1878 | ||
1849 | /* Line 1455 of yacc.c */ | 1879 | /* Line 1806 of yacc.c */ |
1850 | #line 330 "dtc-parser.y" | 1880 | #line 330 "dtc-parser.y" |
1851 | { | 1881 | { |
1852 | (yyval.array).data = data_add_marker((yyvsp[(1) - (2)].array).data, LABEL, (yyvsp[(2) - (2)].labelref)); | 1882 | (yyval.array).data = data_add_marker((yyvsp[(1) - (2)].array).data, LABEL, (yyvsp[(2) - (2)].labelref)); |
1853 | ;} | 1883 | } |
1854 | break; | 1884 | break; |
1855 | 1885 | ||
1856 | case 33: | 1886 | case 33: |
1857 | 1887 | ||
1858 | /* Line 1455 of yacc.c */ | 1888 | /* Line 1806 of yacc.c */ |
1859 | #line 337 "dtc-parser.y" | 1889 | #line 337 "dtc-parser.y" |
1860 | { | 1890 | { |
1861 | (yyval.integer) = eval_literal((yyvsp[(1) - (1)].literal), 0, 64); | 1891 | (yyval.integer) = eval_literal((yyvsp[(1) - (1)].literal), 0, 64); |
1862 | ;} | 1892 | } |
1863 | break; | 1893 | break; |
1864 | 1894 | ||
1865 | case 34: | 1895 | case 34: |
1866 | 1896 | ||
1867 | /* Line 1455 of yacc.c */ | 1897 | /* Line 1806 of yacc.c */ |
1868 | #line 341 "dtc-parser.y" | 1898 | #line 341 "dtc-parser.y" |
1869 | { | 1899 | { |
1870 | (yyval.integer) = eval_char_literal((yyvsp[(1) - (1)].literal)); | 1900 | (yyval.integer) = eval_char_literal((yyvsp[(1) - (1)].literal)); |
1871 | ;} | 1901 | } |
1872 | break; | 1902 | break; |
1873 | 1903 | ||
1874 | case 35: | 1904 | case 35: |
1875 | 1905 | ||
1876 | /* Line 1455 of yacc.c */ | 1906 | /* Line 1806 of yacc.c */ |
1877 | #line 345 "dtc-parser.y" | 1907 | #line 345 "dtc-parser.y" |
1878 | { | 1908 | { |
1879 | (yyval.integer) = (yyvsp[(2) - (3)].integer); | 1909 | (yyval.integer) = (yyvsp[(2) - (3)].integer); |
1880 | ;} | 1910 | } |
1881 | break; | 1911 | break; |
1882 | 1912 | ||
1883 | case 38: | 1913 | case 38: |
1884 | 1914 | ||
1885 | /* Line 1455 of yacc.c */ | 1915 | /* Line 1806 of yacc.c */ |
1886 | #line 356 "dtc-parser.y" | 1916 | #line 356 "dtc-parser.y" |
1887 | { (yyval.integer) = (yyvsp[(1) - (5)].integer) ? (yyvsp[(3) - (5)].integer) : (yyvsp[(5) - (5)].integer); ;} | 1917 | { (yyval.integer) = (yyvsp[(1) - (5)].integer) ? (yyvsp[(3) - (5)].integer) : (yyvsp[(5) - (5)].integer); } |
1888 | break; | 1918 | break; |
1889 | 1919 | ||
1890 | case 40: | 1920 | case 40: |
1891 | 1921 | ||
1892 | /* Line 1455 of yacc.c */ | 1922 | /* Line 1806 of yacc.c */ |
1893 | #line 361 "dtc-parser.y" | 1923 | #line 361 "dtc-parser.y" |
1894 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) || (yyvsp[(3) - (3)].integer); ;} | 1924 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) || (yyvsp[(3) - (3)].integer); } |
1895 | break; | 1925 | break; |
1896 | 1926 | ||
1897 | case 42: | 1927 | case 42: |
1898 | 1928 | ||
1899 | /* Line 1455 of yacc.c */ | 1929 | /* Line 1806 of yacc.c */ |
1900 | #line 366 "dtc-parser.y" | 1930 | #line 366 "dtc-parser.y" |
1901 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) && (yyvsp[(3) - (3)].integer); ;} | 1931 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) && (yyvsp[(3) - (3)].integer); } |
1902 | break; | 1932 | break; |
1903 | 1933 | ||
1904 | case 44: | 1934 | case 44: |
1905 | 1935 | ||
1906 | /* Line 1455 of yacc.c */ | 1936 | /* Line 1806 of yacc.c */ |
1907 | #line 371 "dtc-parser.y" | 1937 | #line 371 "dtc-parser.y" |
1908 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) | (yyvsp[(3) - (3)].integer); ;} | 1938 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) | (yyvsp[(3) - (3)].integer); } |
1909 | break; | 1939 | break; |
1910 | 1940 | ||
1911 | case 46: | 1941 | case 46: |
1912 | 1942 | ||
1913 | /* Line 1455 of yacc.c */ | 1943 | /* Line 1806 of yacc.c */ |
1914 | #line 376 "dtc-parser.y" | 1944 | #line 376 "dtc-parser.y" |
1915 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) ^ (yyvsp[(3) - (3)].integer); ;} | 1945 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) ^ (yyvsp[(3) - (3)].integer); } |
1916 | break; | 1946 | break; |
1917 | 1947 | ||
1918 | case 48: | 1948 | case 48: |
1919 | 1949 | ||
1920 | /* Line 1455 of yacc.c */ | 1950 | /* Line 1806 of yacc.c */ |
1921 | #line 381 "dtc-parser.y" | 1951 | #line 381 "dtc-parser.y" |
1922 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) & (yyvsp[(3) - (3)].integer); ;} | 1952 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) & (yyvsp[(3) - (3)].integer); } |
1923 | break; | 1953 | break; |
1924 | 1954 | ||
1925 | case 50: | 1955 | case 50: |
1926 | 1956 | ||
1927 | /* Line 1455 of yacc.c */ | 1957 | /* Line 1806 of yacc.c */ |
1928 | #line 386 "dtc-parser.y" | 1958 | #line 386 "dtc-parser.y" |
1929 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) == (yyvsp[(3) - (3)].integer); ;} | 1959 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) == (yyvsp[(3) - (3)].integer); } |
1930 | break; | 1960 | break; |
1931 | 1961 | ||
1932 | case 51: | 1962 | case 51: |
1933 | 1963 | ||
1934 | /* Line 1455 of yacc.c */ | 1964 | /* Line 1806 of yacc.c */ |
1935 | #line 387 "dtc-parser.y" | 1965 | #line 387 "dtc-parser.y" |
1936 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) != (yyvsp[(3) - (3)].integer); ;} | 1966 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) != (yyvsp[(3) - (3)].integer); } |
1937 | break; | 1967 | break; |
1938 | 1968 | ||
1939 | case 53: | 1969 | case 53: |
1940 | 1970 | ||
1941 | /* Line 1455 of yacc.c */ | 1971 | /* Line 1806 of yacc.c */ |
1942 | #line 392 "dtc-parser.y" | 1972 | #line 392 "dtc-parser.y" |
1943 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) < (yyvsp[(3) - (3)].integer); ;} | 1973 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) < (yyvsp[(3) - (3)].integer); } |
1944 | break; | 1974 | break; |
1945 | 1975 | ||
1946 | case 54: | 1976 | case 54: |
1947 | 1977 | ||
1948 | /* Line 1455 of yacc.c */ | 1978 | /* Line 1806 of yacc.c */ |
1949 | #line 393 "dtc-parser.y" | 1979 | #line 393 "dtc-parser.y" |
1950 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) > (yyvsp[(3) - (3)].integer); ;} | 1980 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) > (yyvsp[(3) - (3)].integer); } |
1951 | break; | 1981 | break; |
1952 | 1982 | ||
1953 | case 55: | 1983 | case 55: |
1954 | 1984 | ||
1955 | /* Line 1455 of yacc.c */ | 1985 | /* Line 1806 of yacc.c */ |
1956 | #line 394 "dtc-parser.y" | 1986 | #line 394 "dtc-parser.y" |
1957 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) <= (yyvsp[(3) - (3)].integer); ;} | 1987 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) <= (yyvsp[(3) - (3)].integer); } |
1958 | break; | 1988 | break; |
1959 | 1989 | ||
1960 | case 56: | 1990 | case 56: |
1961 | 1991 | ||
1962 | /* Line 1455 of yacc.c */ | 1992 | /* Line 1806 of yacc.c */ |
1963 | #line 395 "dtc-parser.y" | 1993 | #line 395 "dtc-parser.y" |
1964 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) >= (yyvsp[(3) - (3)].integer); ;} | 1994 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) >= (yyvsp[(3) - (3)].integer); } |
1965 | break; | 1995 | break; |
1966 | 1996 | ||
1967 | case 57: | 1997 | case 57: |
1968 | 1998 | ||
1969 | /* Line 1455 of yacc.c */ | 1999 | /* Line 1806 of yacc.c */ |
1970 | #line 399 "dtc-parser.y" | 2000 | #line 399 "dtc-parser.y" |
1971 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) << (yyvsp[(3) - (3)].integer); ;} | 2001 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) << (yyvsp[(3) - (3)].integer); } |
1972 | break; | 2002 | break; |
1973 | 2003 | ||
1974 | case 58: | 2004 | case 58: |
1975 | 2005 | ||
1976 | /* Line 1455 of yacc.c */ | 2006 | /* Line 1806 of yacc.c */ |
1977 | #line 400 "dtc-parser.y" | 2007 | #line 400 "dtc-parser.y" |
1978 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) >> (yyvsp[(3) - (3)].integer); ;} | 2008 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) >> (yyvsp[(3) - (3)].integer); } |
1979 | break; | 2009 | break; |
1980 | 2010 | ||
1981 | case 60: | 2011 | case 60: |
1982 | 2012 | ||
1983 | /* Line 1455 of yacc.c */ | 2013 | /* Line 1806 of yacc.c */ |
1984 | #line 405 "dtc-parser.y" | 2014 | #line 405 "dtc-parser.y" |
1985 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) + (yyvsp[(3) - (3)].integer); ;} | 2015 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) + (yyvsp[(3) - (3)].integer); } |
1986 | break; | 2016 | break; |
1987 | 2017 | ||
1988 | case 61: | 2018 | case 61: |
1989 | 2019 | ||
1990 | /* Line 1455 of yacc.c */ | 2020 | /* Line 1806 of yacc.c */ |
1991 | #line 406 "dtc-parser.y" | 2021 | #line 406 "dtc-parser.y" |
1992 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) - (yyvsp[(3) - (3)].integer); ;} | 2022 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) - (yyvsp[(3) - (3)].integer); } |
1993 | break; | 2023 | break; |
1994 | 2024 | ||
1995 | case 63: | 2025 | case 63: |
1996 | 2026 | ||
1997 | /* Line 1455 of yacc.c */ | 2027 | /* Line 1806 of yacc.c */ |
1998 | #line 411 "dtc-parser.y" | 2028 | #line 411 "dtc-parser.y" |
1999 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) * (yyvsp[(3) - (3)].integer); ;} | 2029 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) * (yyvsp[(3) - (3)].integer); } |
2000 | break; | 2030 | break; |
2001 | 2031 | ||
2002 | case 64: | 2032 | case 64: |
2003 | 2033 | ||
2004 | /* Line 1455 of yacc.c */ | 2034 | /* Line 1806 of yacc.c */ |
2005 | #line 412 "dtc-parser.y" | 2035 | #line 412 "dtc-parser.y" |
2006 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) / (yyvsp[(3) - (3)].integer); ;} | 2036 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) / (yyvsp[(3) - (3)].integer); } |
2007 | break; | 2037 | break; |
2008 | 2038 | ||
2009 | case 65: | 2039 | case 65: |
2010 | 2040 | ||
2011 | /* Line 1455 of yacc.c */ | 2041 | /* Line 1806 of yacc.c */ |
2012 | #line 413 "dtc-parser.y" | 2042 | #line 413 "dtc-parser.y" |
2013 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) % (yyvsp[(3) - (3)].integer); ;} | 2043 | { (yyval.integer) = (yyvsp[(1) - (3)].integer) % (yyvsp[(3) - (3)].integer); } |
2014 | break; | 2044 | break; |
2015 | 2045 | ||
2016 | case 68: | 2046 | case 68: |
2017 | 2047 | ||
2018 | /* Line 1455 of yacc.c */ | 2048 | /* Line 1806 of yacc.c */ |
2019 | #line 419 "dtc-parser.y" | 2049 | #line 419 "dtc-parser.y" |
2020 | { (yyval.integer) = -(yyvsp[(2) - (2)].integer); ;} | 2050 | { (yyval.integer) = -(yyvsp[(2) - (2)].integer); } |
2021 | break; | 2051 | break; |
2022 | 2052 | ||
2023 | case 69: | 2053 | case 69: |
2024 | 2054 | ||
2025 | /* Line 1455 of yacc.c */ | 2055 | /* Line 1806 of yacc.c */ |
2026 | #line 420 "dtc-parser.y" | 2056 | #line 420 "dtc-parser.y" |
2027 | { (yyval.integer) = ~(yyvsp[(2) - (2)].integer); ;} | 2057 | { (yyval.integer) = ~(yyvsp[(2) - (2)].integer); } |
2028 | break; | 2058 | break; |
2029 | 2059 | ||
2030 | case 70: | 2060 | case 70: |
2031 | 2061 | ||
2032 | /* Line 1455 of yacc.c */ | 2062 | /* Line 1806 of yacc.c */ |
2033 | #line 421 "dtc-parser.y" | 2063 | #line 421 "dtc-parser.y" |
2034 | { (yyval.integer) = !(yyvsp[(2) - (2)].integer); ;} | 2064 | { (yyval.integer) = !(yyvsp[(2) - (2)].integer); } |
2035 | break; | 2065 | break; |
2036 | 2066 | ||
2037 | case 71: | 2067 | case 71: |
2038 | 2068 | ||
2039 | /* Line 1455 of yacc.c */ | 2069 | /* Line 1806 of yacc.c */ |
2040 | #line 426 "dtc-parser.y" | 2070 | #line 426 "dtc-parser.y" |
2041 | { | 2071 | { |
2042 | (yyval.data) = empty_data; | 2072 | (yyval.data) = empty_data; |
2043 | ;} | 2073 | } |
2044 | break; | 2074 | break; |
2045 | 2075 | ||
2046 | case 72: | 2076 | case 72: |
2047 | 2077 | ||
2048 | /* Line 1455 of yacc.c */ | 2078 | /* Line 1806 of yacc.c */ |
2049 | #line 430 "dtc-parser.y" | 2079 | #line 430 "dtc-parser.y" |
2050 | { | 2080 | { |
2051 | (yyval.data) = data_append_byte((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].byte)); | 2081 | (yyval.data) = data_append_byte((yyvsp[(1) - (2)].data), (yyvsp[(2) - (2)].byte)); |
2052 | ;} | 2082 | } |
2053 | break; | 2083 | break; |
2054 | 2084 | ||
2055 | case 73: | 2085 | case 73: |
2056 | 2086 | ||
2057 | /* Line 1455 of yacc.c */ | 2087 | /* Line 1806 of yacc.c */ |
2058 | #line 434 "dtc-parser.y" | 2088 | #line 434 "dtc-parser.y" |
2059 | { | 2089 | { |
2060 | (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref)); | 2090 | (yyval.data) = data_add_marker((yyvsp[(1) - (2)].data), LABEL, (yyvsp[(2) - (2)].labelref)); |
2061 | ;} | 2091 | } |
2062 | break; | 2092 | break; |
2063 | 2093 | ||
2064 | case 74: | 2094 | case 74: |
2065 | 2095 | ||
2066 | /* Line 1455 of yacc.c */ | 2096 | /* Line 1806 of yacc.c */ |
2067 | #line 441 "dtc-parser.y" | 2097 | #line 441 "dtc-parser.y" |
2068 | { | 2098 | { |
2069 | (yyval.nodelist) = NULL; | 2099 | (yyval.nodelist) = NULL; |
2070 | ;} | 2100 | } |
2071 | break; | 2101 | break; |
2072 | 2102 | ||
2073 | case 75: | 2103 | case 75: |
2074 | 2104 | ||
2075 | /* Line 1455 of yacc.c */ | 2105 | /* Line 1806 of yacc.c */ |
2076 | #line 445 "dtc-parser.y" | 2106 | #line 445 "dtc-parser.y" |
2077 | { | 2107 | { |
2078 | (yyval.nodelist) = chain_node((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].nodelist)); | 2108 | (yyval.nodelist) = chain_node((yyvsp[(1) - (2)].node), (yyvsp[(2) - (2)].nodelist)); |
2079 | ;} | 2109 | } |
2080 | break; | 2110 | break; |
2081 | 2111 | ||
2082 | case 76: | 2112 | case 76: |
2083 | 2113 | ||
2084 | /* Line 1455 of yacc.c */ | 2114 | /* Line 1806 of yacc.c */ |
2085 | #line 449 "dtc-parser.y" | 2115 | #line 449 "dtc-parser.y" |
2086 | { | 2116 | { |
2087 | print_error("syntax error: properties must precede subnodes"); | 2117 | print_error("syntax error: properties must precede subnodes"); |
2088 | YYERROR; | 2118 | YYERROR; |
2089 | ;} | 2119 | } |
2090 | break; | 2120 | break; |
2091 | 2121 | ||
2092 | case 77: | 2122 | case 77: |
2093 | 2123 | ||
2094 | /* Line 1455 of yacc.c */ | 2124 | /* Line 1806 of yacc.c */ |
2095 | #line 457 "dtc-parser.y" | 2125 | #line 457 "dtc-parser.y" |
2096 | { | 2126 | { |
2097 | (yyval.node) = name_node((yyvsp[(2) - (2)].node), (yyvsp[(1) - (2)].propnodename)); | 2127 | (yyval.node) = name_node((yyvsp[(2) - (2)].node), (yyvsp[(1) - (2)].propnodename)); |
2098 | ;} | 2128 | } |
2099 | break; | 2129 | break; |
2100 | 2130 | ||
2101 | case 78: | 2131 | case 78: |
2102 | 2132 | ||
2103 | /* Line 1455 of yacc.c */ | 2133 | /* Line 1806 of yacc.c */ |
2104 | #line 461 "dtc-parser.y" | 2134 | #line 461 "dtc-parser.y" |
2105 | { | 2135 | { |
2106 | (yyval.node) = name_node(build_node_delete(), (yyvsp[(2) - (3)].propnodename)); | 2136 | (yyval.node) = name_node(build_node_delete(), (yyvsp[(2) - (3)].propnodename)); |
2107 | ;} | 2137 | } |
2108 | break; | 2138 | break; |
2109 | 2139 | ||
2110 | case 79: | 2140 | case 79: |
2111 | 2141 | ||
2112 | /* Line 1455 of yacc.c */ | 2142 | /* Line 1806 of yacc.c */ |
2113 | #line 465 "dtc-parser.y" | 2143 | #line 465 "dtc-parser.y" |
2114 | { | 2144 | { |
2115 | add_label(&(yyvsp[(2) - (2)].node)->labels, (yyvsp[(1) - (2)].labelref)); | 2145 | add_label(&(yyvsp[(2) - (2)].node)->labels, (yyvsp[(1) - (2)].labelref)); |
2116 | (yyval.node) = (yyvsp[(2) - (2)].node); | 2146 | (yyval.node) = (yyvsp[(2) - (2)].node); |
2117 | ;} | 2147 | } |
2118 | break; | 2148 | break; |
2119 | 2149 | ||
2120 | 2150 | ||
2121 | 2151 | ||
2122 | /* Line 1455 of yacc.c */ | 2152 | /* Line 1806 of yacc.c */ |
2123 | #line 2124 "dtc-parser.tab.c" | 2153 | #line 2154 "dtc-parser.tab.c" |
2124 | default: break; | 2154 | default: break; |
2125 | } | 2155 | } |
2156 | /* User semantic actions sometimes alter yychar, and that requires | ||
2157 | that yytoken be updated with the new translation. We take the | ||
2158 | approach of translating immediately before every use of yytoken. | ||
2159 | One alternative is translating here after every semantic action, | ||
2160 | but that translation would be missed if the semantic action invokes | ||
2161 | YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or | ||
2162 | if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an | ||
2163 | incorrect destructor might then be invoked immediately. In the | ||
2164 | case of YYERROR or YYBACKUP, subsequent parser actions might lead | ||
2165 | to an incorrect destructor call or verbose syntax error message | ||
2166 | before the lookahead is translated. */ | ||
2126 | YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); | 2167 | YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); |
2127 | 2168 | ||
2128 | YYPOPSTACK (yylen); | 2169 | YYPOPSTACK (yylen); |
@@ -2150,6 +2191,10 @@ yyreduce: | |||
2150 | | yyerrlab -- here on detecting error | | 2191 | | yyerrlab -- here on detecting error | |
2151 | `------------------------------------*/ | 2192 | `------------------------------------*/ |
2152 | yyerrlab: | 2193 | yyerrlab: |
2194 | /* Make sure we have latest lookahead translation. See comments at | ||
2195 | user semantic actions for why this is necessary. */ | ||
2196 | yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); | ||
2197 | |||
2153 | /* If not already recovering from an error, report this error. */ | 2198 | /* If not already recovering from an error, report this error. */ |
2154 | if (!yyerrstatus) | 2199 | if (!yyerrstatus) |
2155 | { | 2200 | { |
@@ -2157,37 +2202,36 @@ yyerrlab: | |||
2157 | #if ! YYERROR_VERBOSE | 2202 | #if ! YYERROR_VERBOSE |
2158 | yyerror (YY_("syntax error")); | 2203 | yyerror (YY_("syntax error")); |
2159 | #else | 2204 | #else |
2205 | # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ | ||
2206 | yyssp, yytoken) | ||
2160 | { | 2207 | { |
2161 | YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); | 2208 | char const *yymsgp = YY_("syntax error"); |
2162 | if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) | 2209 | int yysyntax_error_status; |
2163 | { | 2210 | yysyntax_error_status = YYSYNTAX_ERROR; |
2164 | YYSIZE_T yyalloc = 2 * yysize; | 2211 | if (yysyntax_error_status == 0) |
2165 | if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) | 2212 | yymsgp = yymsg; |
2166 | yyalloc = YYSTACK_ALLOC_MAXIMUM; | 2213 | else if (yysyntax_error_status == 1) |
2167 | if (yymsg != yymsgbuf) | 2214 | { |
2168 | YYSTACK_FREE (yymsg); | 2215 | if (yymsg != yymsgbuf) |
2169 | yymsg = (char *) YYSTACK_ALLOC (yyalloc); | 2216 | YYSTACK_FREE (yymsg); |
2170 | if (yymsg) | 2217 | yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); |
2171 | yymsg_alloc = yyalloc; | 2218 | if (!yymsg) |
2172 | else | 2219 | { |
2173 | { | 2220 | yymsg = yymsgbuf; |
2174 | yymsg = yymsgbuf; | 2221 | yymsg_alloc = sizeof yymsgbuf; |
2175 | yymsg_alloc = sizeof yymsgbuf; | 2222 | yysyntax_error_status = 2; |
2176 | } | 2223 | } |
2177 | } | 2224 | else |
2178 | 2225 | { | |
2179 | if (0 < yysize && yysize <= yymsg_alloc) | 2226 | yysyntax_error_status = YYSYNTAX_ERROR; |
2180 | { | 2227 | yymsgp = yymsg; |
2181 | (void) yysyntax_error (yymsg, yystate, yychar); | 2228 | } |
2182 | yyerror (yymsg); | 2229 | } |
2183 | } | 2230 | yyerror (yymsgp); |
2184 | else | 2231 | if (yysyntax_error_status == 2) |
2185 | { | 2232 | goto yyexhaustedlab; |
2186 | yyerror (YY_("syntax error")); | ||
2187 | if (yysize != 0) | ||
2188 | goto yyexhaustedlab; | ||
2189 | } | ||
2190 | } | 2233 | } |
2234 | # undef YYSYNTAX_ERROR | ||
2191 | #endif | 2235 | #endif |
2192 | } | 2236 | } |
2193 | 2237 | ||
@@ -2246,7 +2290,7 @@ yyerrlab1: | |||
2246 | for (;;) | 2290 | for (;;) |
2247 | { | 2291 | { |
2248 | yyn = yypact[yystate]; | 2292 | yyn = yypact[yystate]; |
2249 | if (yyn != YYPACT_NINF) | 2293 | if (!yypact_value_is_default (yyn)) |
2250 | { | 2294 | { |
2251 | yyn += YYTERROR; | 2295 | yyn += YYTERROR; |
2252 | if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) | 2296 | if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) |
@@ -2305,8 +2349,13 @@ yyexhaustedlab: | |||
2305 | 2349 | ||
2306 | yyreturn: | 2350 | yyreturn: |
2307 | if (yychar != YYEMPTY) | 2351 | if (yychar != YYEMPTY) |
2308 | yydestruct ("Cleanup: discarding lookahead", | 2352 | { |
2309 | yytoken, &yylval); | 2353 | /* Make sure we have latest lookahead translation. See comments at |
2354 | user semantic actions for why this is necessary. */ | ||
2355 | yytoken = YYTRANSLATE (yychar); | ||
2356 | yydestruct ("Cleanup: discarding lookahead", | ||
2357 | yytoken, &yylval); | ||
2358 | } | ||
2310 | /* Do not reclaim the symbols of the rule which action triggered | 2359 | /* Do not reclaim the symbols of the rule which action triggered |
2311 | this YYABORT or YYACCEPT. */ | 2360 | this YYABORT or YYACCEPT. */ |
2312 | YYPOPSTACK (yylen); | 2361 | YYPOPSTACK (yylen); |
@@ -2331,7 +2380,7 @@ yyreturn: | |||
2331 | 2380 | ||
2332 | 2381 | ||
2333 | 2382 | ||
2334 | /* Line 1675 of yacc.c */ | 2383 | /* Line 2067 of yacc.c */ |
2335 | #line 471 "dtc-parser.y" | 2384 | #line 471 "dtc-parser.y" |
2336 | 2385 | ||
2337 | 2386 | ||
diff --git a/scripts/dtc/dtc-parser.tab.h_shipped b/scripts/dtc/dtc-parser.tab.h_shipped index 9d2dce41211f..25d3b88c6132 100644 --- a/scripts/dtc/dtc-parser.tab.h_shipped +++ b/scripts/dtc/dtc-parser.tab.h_shipped | |||
@@ -1,10 +1,8 @@ | |||
1 | /* A Bison parser, made by GNU Bison 2.5. */ | ||
1 | 2 | ||
2 | /* A Bison parser, made by GNU Bison 2.4.1. */ | 3 | /* Bison interface for Yacc-like parsers in C |
3 | |||
4 | /* Skeleton interface for Bison's Yacc-like parsers in C | ||
5 | 4 | ||
6 | Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 | 5 | Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc. |
7 | Free Software Foundation, Inc. | ||
8 | 6 | ||
9 | This program is free software: you can redistribute it and/or modify | 7 | This program is free software: you can redistribute it and/or modify |
10 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
@@ -70,7 +68,7 @@ | |||
70 | typedef union YYSTYPE | 68 | typedef union YYSTYPE |
71 | { | 69 | { |
72 | 70 | ||
73 | /* Line 1676 of yacc.c */ | 71 | /* Line 2068 of yacc.c */ |
74 | #line 40 "dtc-parser.y" | 72 | #line 40 "dtc-parser.y" |
75 | 73 | ||
76 | char *propnodename; | 74 | char *propnodename; |
@@ -94,8 +92,8 @@ typedef union YYSTYPE | |||
94 | 92 | ||
95 | 93 | ||
96 | 94 | ||
97 | /* Line 1676 of yacc.c */ | 95 | /* Line 2068 of yacc.c */ |
98 | #line 99 "dtc-parser.tab.h" | 96 | #line 97 "dtc-parser.tab.h" |
99 | } YYSTYPE; | 97 | } YYSTYPE; |
100 | # define YYSTYPE_IS_TRIVIAL 1 | 98 | # define YYSTYPE_IS_TRIVIAL 1 |
101 | # define yystype YYSTYPE /* obsolescent; will be withdrawn */ | 99 | # define yystype YYSTYPE /* obsolescent; will be withdrawn */ |
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index ccfa383f1fda..f92818155958 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
@@ -1649,6 +1649,7 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd) | |||
1649 | } | 1649 | } |
1650 | if (!snd_pcm_stream_linked(substream)) { | 1650 | if (!snd_pcm_stream_linked(substream)) { |
1651 | substream->group = group; | 1651 | substream->group = group; |
1652 | group = NULL; | ||
1652 | spin_lock_init(&substream->group->lock); | 1653 | spin_lock_init(&substream->group->lock); |
1653 | INIT_LIST_HEAD(&substream->group->substreams); | 1654 | INIT_LIST_HEAD(&substream->group->substreams); |
1654 | list_add_tail(&substream->link_list, &substream->group->substreams); | 1655 | list_add_tail(&substream->link_list, &substream->group->substreams); |
@@ -1663,8 +1664,7 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd) | |||
1663 | _nolock: | 1664 | _nolock: |
1664 | snd_card_unref(substream1->pcm->card); | 1665 | snd_card_unref(substream1->pcm->card); |
1665 | fput_light(file, fput_needed); | 1666 | fput_light(file, fput_needed); |
1666 | if (res < 0) | 1667 | kfree(group); |
1667 | kfree(group); | ||
1668 | return res; | 1668 | return res; |
1669 | } | 1669 | } |
1670 | 1670 | ||
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ae85bbd2e6f8..4b1524a861f3 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
@@ -788,6 +788,8 @@ static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable) | |||
788 | return; | 788 | return; |
789 | if (codec->inv_eapd) | 789 | if (codec->inv_eapd) |
790 | enable = !enable; | 790 | enable = !enable; |
791 | if (spec->keep_eapd_on && !enable) | ||
792 | return; | ||
791 | snd_hda_codec_update_cache(codec, pin, 0, | 793 | snd_hda_codec_update_cache(codec, pin, 0, |
792 | AC_VERB_SET_EAPD_BTLENABLE, | 794 | AC_VERB_SET_EAPD_BTLENABLE, |
793 | enable ? 0x02 : 0x00); | 795 | enable ? 0x02 : 0x00); |
@@ -1938,17 +1940,7 @@ static int create_speaker_out_ctls(struct hda_codec *codec) | |||
1938 | * independent HP controls | 1940 | * independent HP controls |
1939 | */ | 1941 | */ |
1940 | 1942 | ||
1941 | /* update HP auto-mute state too */ | 1943 | static void call_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack); |
1942 | static void update_hp_automute_hook(struct hda_codec *codec) | ||
1943 | { | ||
1944 | struct hda_gen_spec *spec = codec->spec; | ||
1945 | |||
1946 | if (spec->hp_automute_hook) | ||
1947 | spec->hp_automute_hook(codec, NULL); | ||
1948 | else | ||
1949 | snd_hda_gen_hp_automute(codec, NULL); | ||
1950 | } | ||
1951 | |||
1952 | static int indep_hp_info(struct snd_kcontrol *kcontrol, | 1944 | static int indep_hp_info(struct snd_kcontrol *kcontrol, |
1953 | struct snd_ctl_elem_info *uinfo) | 1945 | struct snd_ctl_elem_info *uinfo) |
1954 | { | 1946 | { |
@@ -2009,7 +2001,7 @@ static int indep_hp_put(struct snd_kcontrol *kcontrol, | |||
2009 | else | 2001 | else |
2010 | *dacp = spec->alt_dac_nid; | 2002 | *dacp = spec->alt_dac_nid; |
2011 | 2003 | ||
2012 | update_hp_automute_hook(codec); | 2004 | call_hp_automute(codec, NULL); |
2013 | ret = 1; | 2005 | ret = 1; |
2014 | } | 2006 | } |
2015 | unlock: | 2007 | unlock: |
@@ -2305,7 +2297,7 @@ static void update_hp_mic(struct hda_codec *codec, int adc_mux, bool force) | |||
2305 | else | 2297 | else |
2306 | val = PIN_HP; | 2298 | val = PIN_HP; |
2307 | set_pin_target(codec, pin, val, true); | 2299 | set_pin_target(codec, pin, val, true); |
2308 | update_hp_automute_hook(codec); | 2300 | call_hp_automute(codec, NULL); |
2309 | } | 2301 | } |
2310 | } | 2302 | } |
2311 | 2303 | ||
@@ -2714,7 +2706,7 @@ static int hp_mic_jack_mode_put(struct snd_kcontrol *kcontrol, | |||
2714 | val = snd_hda_get_default_vref(codec, nid); | 2706 | val = snd_hda_get_default_vref(codec, nid); |
2715 | } | 2707 | } |
2716 | snd_hda_set_pin_ctl_cache(codec, nid, val); | 2708 | snd_hda_set_pin_ctl_cache(codec, nid, val); |
2717 | update_hp_automute_hook(codec); | 2709 | call_hp_automute(codec, NULL); |
2718 | 2710 | ||
2719 | return 1; | 2711 | return 1; |
2720 | } | 2712 | } |
@@ -3859,20 +3851,42 @@ void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, struct hda_jack_tbl *ja | |||
3859 | } | 3851 | } |
3860 | EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch); | 3852 | EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch); |
3861 | 3853 | ||
3862 | /* update jack retasking */ | 3854 | /* call appropriate hooks */ |
3863 | static void update_automute_all(struct hda_codec *codec) | 3855 | static void call_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack) |
3864 | { | 3856 | { |
3865 | struct hda_gen_spec *spec = codec->spec; | 3857 | struct hda_gen_spec *spec = codec->spec; |
3858 | if (spec->hp_automute_hook) | ||
3859 | spec->hp_automute_hook(codec, jack); | ||
3860 | else | ||
3861 | snd_hda_gen_hp_automute(codec, jack); | ||
3862 | } | ||
3866 | 3863 | ||
3867 | update_hp_automute_hook(codec); | 3864 | static void call_line_automute(struct hda_codec *codec, |
3865 | struct hda_jack_tbl *jack) | ||
3866 | { | ||
3867 | struct hda_gen_spec *spec = codec->spec; | ||
3868 | if (spec->line_automute_hook) | 3868 | if (spec->line_automute_hook) |
3869 | spec->line_automute_hook(codec, NULL); | 3869 | spec->line_automute_hook(codec, jack); |
3870 | else | 3870 | else |
3871 | snd_hda_gen_line_automute(codec, NULL); | 3871 | snd_hda_gen_line_automute(codec, jack); |
3872 | } | ||
3873 | |||
3874 | static void call_mic_autoswitch(struct hda_codec *codec, | ||
3875 | struct hda_jack_tbl *jack) | ||
3876 | { | ||
3877 | struct hda_gen_spec *spec = codec->spec; | ||
3872 | if (spec->mic_autoswitch_hook) | 3878 | if (spec->mic_autoswitch_hook) |
3873 | spec->mic_autoswitch_hook(codec, NULL); | 3879 | spec->mic_autoswitch_hook(codec, jack); |
3874 | else | 3880 | else |
3875 | snd_hda_gen_mic_autoswitch(codec, NULL); | 3881 | snd_hda_gen_mic_autoswitch(codec, jack); |
3882 | } | ||
3883 | |||
3884 | /* update jack retasking */ | ||
3885 | static void update_automute_all(struct hda_codec *codec) | ||
3886 | { | ||
3887 | call_hp_automute(codec, NULL); | ||
3888 | call_line_automute(codec, NULL); | ||
3889 | call_mic_autoswitch(codec, NULL); | ||
3876 | } | 3890 | } |
3877 | 3891 | ||
3878 | /* | 3892 | /* |
@@ -4009,9 +4023,7 @@ static int check_auto_mute_availability(struct hda_codec *codec) | |||
4009 | snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n", | 4023 | snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n", |
4010 | nid); | 4024 | nid); |
4011 | snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT, | 4025 | snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT, |
4012 | spec->hp_automute_hook ? | 4026 | call_hp_automute); |
4013 | spec->hp_automute_hook : | ||
4014 | snd_hda_gen_hp_automute); | ||
4015 | spec->detect_hp = 1; | 4027 | spec->detect_hp = 1; |
4016 | } | 4028 | } |
4017 | 4029 | ||
@@ -4024,9 +4036,7 @@ static int check_auto_mute_availability(struct hda_codec *codec) | |||
4024 | snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid); | 4036 | snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid); |
4025 | snd_hda_jack_detect_enable_callback(codec, nid, | 4037 | snd_hda_jack_detect_enable_callback(codec, nid, |
4026 | HDA_GEN_FRONT_EVENT, | 4038 | HDA_GEN_FRONT_EVENT, |
4027 | spec->line_automute_hook ? | 4039 | call_line_automute); |
4028 | spec->line_automute_hook : | ||
4029 | snd_hda_gen_line_automute); | ||
4030 | spec->detect_lo = 1; | 4040 | spec->detect_lo = 1; |
4031 | } | 4041 | } |
4032 | spec->automute_lo_possible = spec->detect_hp; | 4042 | spec->automute_lo_possible = spec->detect_hp; |
@@ -4068,9 +4078,7 @@ static bool auto_mic_check_imux(struct hda_codec *codec) | |||
4068 | snd_hda_jack_detect_enable_callback(codec, | 4078 | snd_hda_jack_detect_enable_callback(codec, |
4069 | spec->am_entry[i].pin, | 4079 | spec->am_entry[i].pin, |
4070 | HDA_GEN_MIC_EVENT, | 4080 | HDA_GEN_MIC_EVENT, |
4071 | spec->mic_autoswitch_hook ? | 4081 | call_mic_autoswitch); |
4072 | spec->mic_autoswitch_hook : | ||
4073 | snd_hda_gen_mic_autoswitch); | ||
4074 | return true; | 4082 | return true; |
4075 | } | 4083 | } |
4076 | 4084 | ||
diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h index 54e665160379..76200314ee95 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h | |||
@@ -222,6 +222,7 @@ struct hda_gen_spec { | |||
222 | unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */ | 222 | unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */ |
223 | unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */ | 223 | unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */ |
224 | unsigned int own_eapd_ctl:1; /* set EAPD by own function */ | 224 | unsigned int own_eapd_ctl:1; /* set EAPD by own function */ |
225 | unsigned int keep_eapd_on:1; /* don't turn off EAPD automatically */ | ||
225 | unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */ | 226 | unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */ |
226 | unsigned int indep_hp:1; /* independent HP supported */ | 227 | unsigned int indep_hp:1; /* independent HP supported */ |
227 | unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */ | 228 | unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */ |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 59d2e91a9ab6..02e22b4458d2 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -3493,6 +3493,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
3493 | SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3493 | SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
3494 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3494 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
3495 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3495 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
3496 | SND_PCI_QUIRK(0x1028, 0x05f8, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
3497 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
3496 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | 3498 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
3497 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), | 3499 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), |
3498 | SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 3500 | SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
@@ -3530,6 +3532,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
3530 | SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK), | 3532 | SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK), |
3531 | SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK), | 3533 | SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK), |
3532 | SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK), | 3534 | SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK), |
3535 | SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK), | ||
3533 | SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK), | 3536 | SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK), |
3534 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), | 3537 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), |
3535 | SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), | 3538 | SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index e0dadcf2030d..e5245544eb52 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
@@ -136,6 +136,7 @@ static struct via_spec *via_new_spec(struct hda_codec *codec) | |||
136 | spec->codec_type = VT1708S; | 136 | spec->codec_type = VT1708S; |
137 | spec->no_pin_power_ctl = 1; | 137 | spec->no_pin_power_ctl = 1; |
138 | spec->gen.indep_hp = 1; | 138 | spec->gen.indep_hp = 1; |
139 | spec->gen.keep_eapd_on = 1; | ||
139 | spec->gen.pcm_playback_hook = via_playback_pcm_hook; | 140 | spec->gen.pcm_playback_hook = via_playback_pcm_hook; |
140 | return spec; | 141 | return spec; |
141 | } | 142 | } |
@@ -231,9 +232,14 @@ static void vt1708_update_hp_work(struct hda_codec *codec) | |||
231 | 232 | ||
232 | static void set_widgets_power_state(struct hda_codec *codec) | 233 | static void set_widgets_power_state(struct hda_codec *codec) |
233 | { | 234 | { |
235 | #if 0 /* FIXME: the assumed connections don't match always with the | ||
236 | * actual routes by the generic parser, so better to disable | ||
237 | * the control for safety. | ||
238 | */ | ||
234 | struct via_spec *spec = codec->spec; | 239 | struct via_spec *spec = codec->spec; |
235 | if (spec->set_widgets_power_state) | 240 | if (spec->set_widgets_power_state) |
236 | spec->set_widgets_power_state(codec); | 241 | spec->set_widgets_power_state(codec); |
242 | #endif | ||
237 | } | 243 | } |
238 | 244 | ||
239 | static void update_power_state(struct hda_codec *codec, hda_nid_t nid, | 245 | static void update_power_state(struct hda_codec *codec, hda_nid_t nid, |
@@ -478,7 +484,9 @@ static int via_suspend(struct hda_codec *codec) | |||
478 | /* Fix pop noise on headphones */ | 484 | /* Fix pop noise on headphones */ |
479 | int i; | 485 | int i; |
480 | for (i = 0; i < spec->gen.autocfg.hp_outs; i++) | 486 | for (i = 0; i < spec->gen.autocfg.hp_outs; i++) |
481 | snd_hda_set_pin_ctl(codec, spec->gen.autocfg.hp_pins[i], 0); | 487 | snd_hda_codec_write(codec, spec->gen.autocfg.hp_pins[i], |
488 | 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
489 | 0x00); | ||
482 | } | 490 | } |
483 | 491 | ||
484 | return 0; | 492 | return 0; |
diff --git a/sound/pci/sis7019.c b/sound/pci/sis7019.c index d59abe1682c5..748e82d4d257 100644 --- a/sound/pci/sis7019.c +++ b/sound/pci/sis7019.c | |||
@@ -1341,7 +1341,8 @@ static int sis_chip_create(struct snd_card *card, | |||
1341 | if (rc) | 1341 | if (rc) |
1342 | goto error_out; | 1342 | goto error_out; |
1343 | 1343 | ||
1344 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(30)) < 0) { | 1344 | rc = pci_set_dma_mask(pci, DMA_BIT_MASK(30)); |
1345 | if (rc < 0) { | ||
1345 | dev_err(&pci->dev, "architecture does not support 30-bit PCI busmaster DMA"); | 1346 | dev_err(&pci->dev, "architecture does not support 30-bit PCI busmaster DMA"); |
1346 | goto error_out_enabled; | 1347 | goto error_out_enabled; |
1347 | } | 1348 | } |
diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c index 030f53c96ec0..987f728718c5 100644 --- a/sound/soc/codecs/cs42l52.c +++ b/sound/soc/codecs/cs42l52.c | |||
@@ -193,6 +193,8 @@ static DECLARE_TLV_DB_SCALE(mic_tlv, 1600, 100, 0); | |||
193 | 193 | ||
194 | static DECLARE_TLV_DB_SCALE(pga_tlv, -600, 50, 0); | 194 | static DECLARE_TLV_DB_SCALE(pga_tlv, -600, 50, 0); |
195 | 195 | ||
196 | static DECLARE_TLV_DB_SCALE(mix_tlv, -50, 50, 0); | ||
197 | |||
196 | static const unsigned int limiter_tlv[] = { | 198 | static const unsigned int limiter_tlv[] = { |
197 | TLV_DB_RANGE_HEAD(2), | 199 | TLV_DB_RANGE_HEAD(2), |
198 | 0, 2, TLV_DB_SCALE_ITEM(-3000, 600, 0), | 200 | 0, 2, TLV_DB_SCALE_ITEM(-3000, 600, 0), |
@@ -260,7 +262,7 @@ static const char * const hp_gain_num_text[] = { | |||
260 | }; | 262 | }; |
261 | 263 | ||
262 | static const struct soc_enum hp_gain_enum = | 264 | static const struct soc_enum hp_gain_enum = |
263 | SOC_ENUM_SINGLE(CS42L52_PB_CTL1, 4, | 265 | SOC_ENUM_SINGLE(CS42L52_PB_CTL1, 5, |
264 | ARRAY_SIZE(hp_gain_num_text), hp_gain_num_text); | 266 | ARRAY_SIZE(hp_gain_num_text), hp_gain_num_text); |
265 | 267 | ||
266 | static const char * const beep_pitch_text[] = { | 268 | static const char * const beep_pitch_text[] = { |
@@ -441,7 +443,7 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = { | |||
441 | 443 | ||
442 | SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", | 444 | SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume", |
443 | CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, | 445 | CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, |
444 | 0, 0x7f, 0x19, hl_tlv), | 446 | 0, 0x7f, 0x19, mix_tlv), |
445 | SOC_DOUBLE_R("PCM Mixer Switch", | 447 | SOC_DOUBLE_R("PCM Mixer Switch", |
446 | CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1), | 448 | CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1), |
447 | 449 | ||
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c index 65d09d60b7c6..1514bf845e4b 100644 --- a/sound/soc/codecs/tlv320aic3x.c +++ b/sound/soc/codecs/tlv320aic3x.c | |||
@@ -187,14 +187,14 @@ static int snd_soc_dapm_put_volsw_aic3x(struct snd_kcontrol *kcontrol, | |||
187 | 187 | ||
188 | break; | 188 | break; |
189 | } | 189 | } |
190 | |||
191 | if (found) | ||
192 | snd_soc_dapm_sync(widget->dapm); | ||
193 | } | 190 | } |
194 | 191 | ||
195 | ret = snd_soc_update_bits(widget->codec, reg, val_mask, val); | ||
196 | |||
197 | mutex_unlock(&widget->codec->mutex); | 192 | mutex_unlock(&widget->codec->mutex); |
193 | |||
194 | if (found) | ||
195 | snd_soc_dapm_sync(widget->dapm); | ||
196 | |||
197 | ret = snd_soc_update_bits_locked(widget->codec, reg, val_mask, val); | ||
198 | return ret; | 198 | return ret; |
199 | } | 199 | } |
200 | 200 | ||
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c index e895d3939eef..100fdadda56a 100644 --- a/sound/soc/codecs/wm5102.c +++ b/sound/soc/codecs/wm5102.c | |||
@@ -1120,7 +1120,8 @@ SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 0, | |||
1120 | ARIZONA_DSP_WIDGETS(DSP1, "DSP1"), | 1120 | ARIZONA_DSP_WIDGETS(DSP1, "DSP1"), |
1121 | 1121 | ||
1122 | SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, | 1122 | SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, |
1123 | ARIZONA_AEC_LOOPBACK_ENA, 0, &wm5102_aec_loopback_mux), | 1123 | ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, |
1124 | &wm5102_aec_loopback_mux), | ||
1124 | 1125 | ||
1125 | SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM, | 1126 | SND_SOC_DAPM_PGA_E("OUT1L", SND_SOC_NOPM, |
1126 | ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev, | 1127 | ARIZONA_OUT1L_ENA_SHIFT, 0, NULL, 0, arizona_hp_ev, |
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c index ba38f0679662..88ad7db52dde 100644 --- a/sound/soc/codecs/wm5110.c +++ b/sound/soc/codecs/wm5110.c | |||
@@ -503,7 +503,8 @@ SND_SOC_DAPM_PGA("ASRC2R", ARIZONA_ASRC_ENABLE, ARIZONA_ASRC2R_ENA_SHIFT, 0, | |||
503 | NULL, 0), | 503 | NULL, 0), |
504 | 504 | ||
505 | SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, | 505 | SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, |
506 | ARIZONA_AEC_LOOPBACK_ENA, 0, &wm5110_aec_loopback_mux), | 506 | ARIZONA_AEC_LOOPBACK_ENA_SHIFT, 0, |
507 | &wm5110_aec_loopback_mux), | ||
507 | 508 | ||
508 | SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0, | 509 | SND_SOC_DAPM_AIF_OUT("AIF1TX1", NULL, 0, |
509 | ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0), | 510 | ARIZONA_AIF1_TX_ENABLES, ARIZONA_AIF1TX1_ENA_SHIFT, 0), |
diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index dfd997aaadfc..29e95f93d482 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c | |||
@@ -3836,12 +3836,13 @@ static irqreturn_t wm8958_mic_irq(int irq, void *data) | |||
3836 | ret); | 3836 | ret); |
3837 | } else if (!(ret & WM1811_JACKDET_LVL)) { | 3837 | } else if (!(ret & WM1811_JACKDET_LVL)) { |
3838 | dev_dbg(codec->dev, "Ignoring removed jack\n"); | 3838 | dev_dbg(codec->dev, "Ignoring removed jack\n"); |
3839 | return IRQ_HANDLED; | 3839 | goto out; |
3840 | } | 3840 | } |
3841 | } else if (!(reg & WM8958_MICD_STS)) { | 3841 | } else if (!(reg & WM8958_MICD_STS)) { |
3842 | snd_soc_jack_report(wm8994->micdet[0].jack, 0, | 3842 | snd_soc_jack_report(wm8994->micdet[0].jack, 0, |
3843 | SND_JACK_MECHANICAL | SND_JACK_HEADSET | | 3843 | SND_JACK_MECHANICAL | SND_JACK_HEADSET | |
3844 | wm8994->btn_mask); | 3844 | wm8994->btn_mask); |
3845 | wm8994->mic_detecting = true; | ||
3845 | goto out; | 3846 | goto out; |
3846 | } | 3847 | } |
3847 | 3848 | ||
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index a80c883bb8be..c7051c457b75 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
@@ -55,7 +55,8 @@ static int dapm_up_seq[] = { | |||
55 | [snd_soc_dapm_clock_supply] = 1, | 55 | [snd_soc_dapm_clock_supply] = 1, |
56 | [snd_soc_dapm_micbias] = 2, | 56 | [snd_soc_dapm_micbias] = 2, |
57 | [snd_soc_dapm_dai_link] = 2, | 57 | [snd_soc_dapm_dai_link] = 2, |
58 | [snd_soc_dapm_dai] = 3, | 58 | [snd_soc_dapm_dai_in] = 3, |
59 | [snd_soc_dapm_dai_out] = 3, | ||
59 | [snd_soc_dapm_aif_in] = 3, | 60 | [snd_soc_dapm_aif_in] = 3, |
60 | [snd_soc_dapm_aif_out] = 3, | 61 | [snd_soc_dapm_aif_out] = 3, |
61 | [snd_soc_dapm_mic] = 4, | 62 | [snd_soc_dapm_mic] = 4, |
@@ -92,7 +93,8 @@ static int dapm_down_seq[] = { | |||
92 | [snd_soc_dapm_value_mux] = 9, | 93 | [snd_soc_dapm_value_mux] = 9, |
93 | [snd_soc_dapm_aif_in] = 10, | 94 | [snd_soc_dapm_aif_in] = 10, |
94 | [snd_soc_dapm_aif_out] = 10, | 95 | [snd_soc_dapm_aif_out] = 10, |
95 | [snd_soc_dapm_dai] = 10, | 96 | [snd_soc_dapm_dai_in] = 10, |
97 | [snd_soc_dapm_dai_out] = 10, | ||
96 | [snd_soc_dapm_dai_link] = 11, | 98 | [snd_soc_dapm_dai_link] = 11, |
97 | [snd_soc_dapm_clock_supply] = 12, | 99 | [snd_soc_dapm_clock_supply] = 12, |
98 | [snd_soc_dapm_regulator_supply] = 12, | 100 | [snd_soc_dapm_regulator_supply] = 12, |
@@ -419,7 +421,8 @@ static void dapm_set_path_status(struct snd_soc_dapm_widget *w, | |||
419 | case snd_soc_dapm_clock_supply: | 421 | case snd_soc_dapm_clock_supply: |
420 | case snd_soc_dapm_aif_in: | 422 | case snd_soc_dapm_aif_in: |
421 | case snd_soc_dapm_aif_out: | 423 | case snd_soc_dapm_aif_out: |
422 | case snd_soc_dapm_dai: | 424 | case snd_soc_dapm_dai_in: |
425 | case snd_soc_dapm_dai_out: | ||
423 | case snd_soc_dapm_hp: | 426 | case snd_soc_dapm_hp: |
424 | case snd_soc_dapm_mic: | 427 | case snd_soc_dapm_mic: |
425 | case snd_soc_dapm_spk: | 428 | case snd_soc_dapm_spk: |
@@ -820,7 +823,7 @@ static int is_connected_output_ep(struct snd_soc_dapm_widget *widget, | |||
820 | switch (widget->id) { | 823 | switch (widget->id) { |
821 | case snd_soc_dapm_adc: | 824 | case snd_soc_dapm_adc: |
822 | case snd_soc_dapm_aif_out: | 825 | case snd_soc_dapm_aif_out: |
823 | case snd_soc_dapm_dai: | 826 | case snd_soc_dapm_dai_out: |
824 | if (widget->active) { | 827 | if (widget->active) { |
825 | widget->outputs = snd_soc_dapm_suspend_check(widget); | 828 | widget->outputs = snd_soc_dapm_suspend_check(widget); |
826 | return widget->outputs; | 829 | return widget->outputs; |
@@ -916,7 +919,7 @@ static int is_connected_input_ep(struct snd_soc_dapm_widget *widget, | |||
916 | switch (widget->id) { | 919 | switch (widget->id) { |
917 | case snd_soc_dapm_dac: | 920 | case snd_soc_dapm_dac: |
918 | case snd_soc_dapm_aif_in: | 921 | case snd_soc_dapm_aif_in: |
919 | case snd_soc_dapm_dai: | 922 | case snd_soc_dapm_dai_in: |
920 | if (widget->active) { | 923 | if (widget->active) { |
921 | widget->inputs = snd_soc_dapm_suspend_check(widget); | 924 | widget->inputs = snd_soc_dapm_suspend_check(widget); |
922 | return widget->inputs; | 925 | return widget->inputs; |
@@ -1135,16 +1138,6 @@ static int dapm_generic_check_power(struct snd_soc_dapm_widget *w) | |||
1135 | return out != 0 && in != 0; | 1138 | return out != 0 && in != 0; |
1136 | } | 1139 | } |
1137 | 1140 | ||
1138 | static int dapm_dai_check_power(struct snd_soc_dapm_widget *w) | ||
1139 | { | ||
1140 | DAPM_UPDATE_STAT(w, power_checks); | ||
1141 | |||
1142 | if (w->active) | ||
1143 | return w->active; | ||
1144 | |||
1145 | return dapm_generic_check_power(w); | ||
1146 | } | ||
1147 | |||
1148 | /* Check to see if an ADC has power */ | 1141 | /* Check to see if an ADC has power */ |
1149 | static int dapm_adc_check_power(struct snd_soc_dapm_widget *w) | 1142 | static int dapm_adc_check_power(struct snd_soc_dapm_widget *w) |
1150 | { | 1143 | { |
@@ -2318,7 +2311,8 @@ static int snd_soc_dapm_add_route(struct snd_soc_dapm_context *dapm, | |||
2318 | case snd_soc_dapm_clock_supply: | 2311 | case snd_soc_dapm_clock_supply: |
2319 | case snd_soc_dapm_aif_in: | 2312 | case snd_soc_dapm_aif_in: |
2320 | case snd_soc_dapm_aif_out: | 2313 | case snd_soc_dapm_aif_out: |
2321 | case snd_soc_dapm_dai: | 2314 | case snd_soc_dapm_dai_in: |
2315 | case snd_soc_dapm_dai_out: | ||
2322 | case snd_soc_dapm_dai_link: | 2316 | case snd_soc_dapm_dai_link: |
2323 | list_add(&path->list, &dapm->card->paths); | 2317 | list_add(&path->list, &dapm->card->paths); |
2324 | list_add(&path->list_sink, &wsink->sources); | 2318 | list_add(&path->list_sink, &wsink->sources); |
@@ -3129,10 +3123,12 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm, | |||
3129 | break; | 3123 | break; |
3130 | case snd_soc_dapm_adc: | 3124 | case snd_soc_dapm_adc: |
3131 | case snd_soc_dapm_aif_out: | 3125 | case snd_soc_dapm_aif_out: |
3126 | case snd_soc_dapm_dai_out: | ||
3132 | w->power_check = dapm_adc_check_power; | 3127 | w->power_check = dapm_adc_check_power; |
3133 | break; | 3128 | break; |
3134 | case snd_soc_dapm_dac: | 3129 | case snd_soc_dapm_dac: |
3135 | case snd_soc_dapm_aif_in: | 3130 | case snd_soc_dapm_aif_in: |
3131 | case snd_soc_dapm_dai_in: | ||
3136 | w->power_check = dapm_dac_check_power; | 3132 | w->power_check = dapm_dac_check_power; |
3137 | break; | 3133 | break; |
3138 | case snd_soc_dapm_pga: | 3134 | case snd_soc_dapm_pga: |
@@ -3152,9 +3148,6 @@ snd_soc_dapm_new_control(struct snd_soc_dapm_context *dapm, | |||
3152 | case snd_soc_dapm_clock_supply: | 3148 | case snd_soc_dapm_clock_supply: |
3153 | w->power_check = dapm_supply_check_power; | 3149 | w->power_check = dapm_supply_check_power; |
3154 | break; | 3150 | break; |
3155 | case snd_soc_dapm_dai: | ||
3156 | w->power_check = dapm_dai_check_power; | ||
3157 | break; | ||
3158 | default: | 3151 | default: |
3159 | w->power_check = dapm_always_on_check_power; | 3152 | w->power_check = dapm_always_on_check_power; |
3160 | break; | 3153 | break; |
@@ -3375,7 +3368,7 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm, | |||
3375 | template.reg = SND_SOC_NOPM; | 3368 | template.reg = SND_SOC_NOPM; |
3376 | 3369 | ||
3377 | if (dai->driver->playback.stream_name) { | 3370 | if (dai->driver->playback.stream_name) { |
3378 | template.id = snd_soc_dapm_dai; | 3371 | template.id = snd_soc_dapm_dai_in; |
3379 | template.name = dai->driver->playback.stream_name; | 3372 | template.name = dai->driver->playback.stream_name; |
3380 | template.sname = dai->driver->playback.stream_name; | 3373 | template.sname = dai->driver->playback.stream_name; |
3381 | 3374 | ||
@@ -3393,7 +3386,7 @@ int snd_soc_dapm_new_dai_widgets(struct snd_soc_dapm_context *dapm, | |||
3393 | } | 3386 | } |
3394 | 3387 | ||
3395 | if (dai->driver->capture.stream_name) { | 3388 | if (dai->driver->capture.stream_name) { |
3396 | template.id = snd_soc_dapm_dai; | 3389 | template.id = snd_soc_dapm_dai_out; |
3397 | template.name = dai->driver->capture.stream_name; | 3390 | template.name = dai->driver->capture.stream_name; |
3398 | template.sname = dai->driver->capture.stream_name; | 3391 | template.sname = dai->driver->capture.stream_name; |
3399 | 3392 | ||
@@ -3423,8 +3416,13 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card) | |||
3423 | 3416 | ||
3424 | /* For each DAI widget... */ | 3417 | /* For each DAI widget... */ |
3425 | list_for_each_entry(dai_w, &card->widgets, list) { | 3418 | list_for_each_entry(dai_w, &card->widgets, list) { |
3426 | if (dai_w->id != snd_soc_dapm_dai) | 3419 | switch (dai_w->id) { |
3420 | case snd_soc_dapm_dai_in: | ||
3421 | case snd_soc_dapm_dai_out: | ||
3422 | break; | ||
3423 | default: | ||
3427 | continue; | 3424 | continue; |
3425 | } | ||
3428 | 3426 | ||
3429 | dai = dai_w->priv; | 3427 | dai = dai_w->priv; |
3430 | 3428 | ||
@@ -3433,8 +3431,13 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card) | |||
3433 | if (w->dapm != dai_w->dapm) | 3431 | if (w->dapm != dai_w->dapm) |
3434 | continue; | 3432 | continue; |
3435 | 3433 | ||
3436 | if (w->id == snd_soc_dapm_dai) | 3434 | switch (w->id) { |
3435 | case snd_soc_dapm_dai_in: | ||
3436 | case snd_soc_dapm_dai_out: | ||
3437 | continue; | 3437 | continue; |
3438 | default: | ||
3439 | break; | ||
3440 | } | ||
3438 | 3441 | ||
3439 | if (!w->sname) | 3442 | if (!w->sname) |
3440 | continue; | 3443 | continue; |
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 73bb8eefa491..ccb6be4d658d 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c | |||
@@ -928,8 +928,13 @@ static int dpcm_add_paths(struct snd_soc_pcm_runtime *fe, int stream, | |||
928 | /* Create any new FE <--> BE connections */ | 928 | /* Create any new FE <--> BE connections */ |
929 | for (i = 0; i < list->num_widgets; i++) { | 929 | for (i = 0; i < list->num_widgets; i++) { |
930 | 930 | ||
931 | if (list->widgets[i]->id != snd_soc_dapm_dai) | 931 | switch (list->widgets[i]->id) { |
932 | case snd_soc_dapm_dai_in: | ||
933 | case snd_soc_dapm_dai_out: | ||
934 | break; | ||
935 | default: | ||
932 | continue; | 936 | continue; |
937 | } | ||
933 | 938 | ||
934 | /* is there a valid BE rtd for this widget */ | 939 | /* is there a valid BE rtd for this widget */ |
935 | be = dpcm_get_be(card, list->widgets[i], stream); | 940 | be = dpcm_get_be(card, list->widgets[i], stream); |
@@ -2011,9 +2016,11 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) | |||
2011 | if (cpu_dai->driver->capture.channels_min) | 2016 | if (cpu_dai->driver->capture.channels_min) |
2012 | capture = 1; | 2017 | capture = 1; |
2013 | } else { | 2018 | } else { |
2014 | if (codec_dai->driver->playback.channels_min) | 2019 | if (codec_dai->driver->playback.channels_min && |
2020 | cpu_dai->driver->playback.channels_min) | ||
2015 | playback = 1; | 2021 | playback = 1; |
2016 | if (codec_dai->driver->capture.channels_min) | 2022 | if (codec_dai->driver->capture.channels_min && |
2023 | cpu_dai->driver->capture.channels_min) | ||
2017 | capture = 1; | 2024 | capture = 1; |
2018 | } | 2025 | } |
2019 | 2026 | ||
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index ca4739c3f650..e5c7f9f20fdd 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
@@ -886,6 +886,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, | |||
886 | case USB_ID(0x046d, 0x0808): | 886 | case USB_ID(0x046d, 0x0808): |
887 | case USB_ID(0x046d, 0x0809): | 887 | case USB_ID(0x046d, 0x0809): |
888 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ | 888 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ |
889 | case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ | ||
889 | case USB_ID(0x046d, 0x0991): | 890 | case USB_ID(0x046d, 0x0991): |
890 | /* Most audio usb devices lie about volume resolution. | 891 | /* Most audio usb devices lie about volume resolution. |
891 | * Most Logitech webcams have res = 384. | 892 | * Most Logitech webcams have res = 384. |
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index 7f1722f82c89..8b75bcf136f6 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h | |||
@@ -215,7 +215,13 @@ | |||
215 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL | 215 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL |
216 | }, | 216 | }, |
217 | { | 217 | { |
218 | USB_DEVICE(0x046d, 0x0990), | 218 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | |
219 | USB_DEVICE_ID_MATCH_INT_CLASS | | ||
220 | USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
221 | .idVendor = 0x046d, | ||
222 | .idProduct = 0x0990, | ||
223 | .bInterfaceClass = USB_CLASS_AUDIO, | ||
224 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
219 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | 225 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |
220 | .vendor_name = "Logitech, Inc.", | 226 | .vendor_name = "Logitech, Inc.", |
221 | .product_name = "QuickCam Pro 9000", | 227 | .product_name = "QuickCam Pro 9000", |
@@ -1792,7 +1798,11 @@ YAMAHA_DEVICE(0x7010, "UB99"), | |||
1792 | USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108), | 1798 | USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108), |
1793 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | 1799 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |
1794 | .ifnum = 0, | 1800 | .ifnum = 0, |
1795 | .type = QUIRK_MIDI_STANDARD_INTERFACE | 1801 | .type = QUIRK_MIDI_FIXED_ENDPOINT, |
1802 | .data = & (const struct snd_usb_midi_endpoint_info) { | ||
1803 | .out_cables = 0x0007, | ||
1804 | .in_cables = 0x0007 | ||
1805 | } | ||
1796 | } | 1806 | } |
1797 | }, | 1807 | }, |
1798 | { | 1808 | { |
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 9e9d34871195..fe702076ca46 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c | |||
@@ -2191,7 +2191,7 @@ int initialize_counters(int cpu_id) | |||
2191 | 2191 | ||
2192 | void allocate_output_buffer() | 2192 | void allocate_output_buffer() |
2193 | { | 2193 | { |
2194 | output_buffer = calloc(1, (1 + topo.num_cpus) * 128); | 2194 | output_buffer = calloc(1, (1 + topo.num_cpus) * 256); |
2195 | outp = output_buffer; | 2195 | outp = output_buffer; |
2196 | if (outp == NULL) { | 2196 | if (outp == NULL) { |
2197 | perror("calloc"); | 2197 | perror("calloc"); |