diff options
392 files changed, 3714 insertions, 2872 deletions
| @@ -1823,6 +1823,11 @@ S: Kattreinstr 38 | |||
| 1823 | S: D-64295 | 1823 | S: D-64295 |
| 1824 | S: Germany | 1824 | S: Germany |
| 1825 | 1825 | ||
| 1826 | N: Avi Kivity | ||
| 1827 | E: avi.kivity@gmail.com | ||
| 1828 | D: Kernel-based Virtual Machine (KVM) | ||
| 1829 | S: Ra'annana, Israel | ||
| 1830 | |||
| 1826 | N: Andi Kleen | 1831 | N: Andi Kleen |
| 1827 | E: andi@firstfloor.org | 1832 | E: andi@firstfloor.org |
| 1828 | U: http://www.halobates.de | 1833 | U: http://www.halobates.de |
diff --git a/Documentation/DMA-API-HOWTO.txt b/Documentation/DMA-API-HOWTO.txt index a0b6250add79..4a4fb295ceef 100644 --- a/Documentation/DMA-API-HOWTO.txt +++ b/Documentation/DMA-API-HOWTO.txt | |||
| @@ -468,11 +468,46 @@ To map a single region, you do: | |||
| 468 | size_t size = buffer->len; | 468 | size_t size = buffer->len; |
| 469 | 469 | ||
| 470 | dma_handle = dma_map_single(dev, addr, size, direction); | 470 | dma_handle = dma_map_single(dev, addr, size, direction); |
| 471 | if (dma_mapping_error(dma_handle)) { | ||
| 472 | /* | ||
| 473 | * reduce current DMA mapping usage, | ||
| 474 | * delay and try again later or | ||
| 475 | * reset driver. | ||
| 476 | */ | ||
| 477 | goto map_error_handling; | ||
| 478 | } | ||
| 471 | 479 | ||
| 472 | and to unmap it: | 480 | and to unmap it: |
| 473 | 481 | ||
| 474 | dma_unmap_single(dev, dma_handle, size, direction); | 482 | dma_unmap_single(dev, dma_handle, size, direction); |
| 475 | 483 | ||
| 484 | You should call dma_mapping_error() as dma_map_single() could fail and return | ||
| 485 | error. Not all dma implementations support dma_mapping_error() interface. | ||
| 486 | However, it is a good practice to call dma_mapping_error() interface, which | ||
| 487 | will invoke the generic mapping error check interface. Doing so will ensure | ||
| 488 | that the mapping code will work correctly on all dma implementations without | ||
| 489 | any dependency on the specifics of the underlying implementation. Using the | ||
| 490 | returned address without checking for errors could result in failures ranging | ||
| 491 | from panics to silent data corruption. Couple of example of incorrect ways to | ||
| 492 | check for errors that make assumptions about the underlying dma implementation | ||
| 493 | are as follows and these are applicable to dma_map_page() as well. | ||
| 494 | |||
| 495 | Incorrect example 1: | ||
| 496 | dma_addr_t dma_handle; | ||
| 497 | |||
| 498 | dma_handle = dma_map_single(dev, addr, size, direction); | ||
| 499 | if ((dma_handle & 0xffff != 0) || (dma_handle >= 0x1000000)) { | ||
| 500 | goto map_error; | ||
| 501 | } | ||
| 502 | |||
| 503 | Incorrect example 2: | ||
| 504 | dma_addr_t dma_handle; | ||
| 505 | |||
| 506 | dma_handle = dma_map_single(dev, addr, size, direction); | ||
| 507 | if (dma_handle == DMA_ERROR_CODE) { | ||
| 508 | goto map_error; | ||
| 509 | } | ||
| 510 | |||
| 476 | You should call dma_unmap_single when the DMA activity is finished, e.g. | 511 | You should call dma_unmap_single when the DMA activity is finished, e.g. |
| 477 | from the interrupt which told you that the DMA transfer is done. | 512 | from the interrupt which told you that the DMA transfer is done. |
| 478 | 513 | ||
| @@ -489,6 +524,14 @@ Specifically: | |||
| 489 | size_t size = buffer->len; | 524 | size_t size = buffer->len; |
| 490 | 525 | ||
| 491 | dma_handle = dma_map_page(dev, page, offset, size, direction); | 526 | dma_handle = dma_map_page(dev, page, offset, size, direction); |
| 527 | if (dma_mapping_error(dma_handle)) { | ||
| 528 | /* | ||
| 529 | * reduce current DMA mapping usage, | ||
| 530 | * delay and try again later or | ||
| 531 | * reset driver. | ||
| 532 | */ | ||
| 533 | goto map_error_handling; | ||
| 534 | } | ||
| 492 | 535 | ||
| 493 | ... | 536 | ... |
| 494 | 537 | ||
| @@ -496,6 +539,12 @@ Specifically: | |||
| 496 | 539 | ||
| 497 | Here, "offset" means byte offset within the given page. | 540 | Here, "offset" means byte offset within the given page. |
| 498 | 541 | ||
| 542 | You should call dma_mapping_error() as dma_map_page() could fail and return | ||
| 543 | error as outlined under the dma_map_single() discussion. | ||
| 544 | |||
| 545 | You should call dma_unmap_page when the DMA activity is finished, e.g. | ||
| 546 | from the interrupt which told you that the DMA transfer is done. | ||
| 547 | |||
| 499 | With scatterlists, you map a region gathered from several regions by: | 548 | With scatterlists, you map a region gathered from several regions by: |
| 500 | 549 | ||
| 501 | int i, count = dma_map_sg(dev, sglist, nents, direction); | 550 | int i, count = dma_map_sg(dev, sglist, nents, direction); |
| @@ -578,6 +627,14 @@ to use the dma_sync_*() interfaces. | |||
| 578 | dma_addr_t mapping; | 627 | dma_addr_t mapping; |
| 579 | 628 | ||
| 580 | mapping = dma_map_single(cp->dev, buffer, len, DMA_FROM_DEVICE); | 629 | mapping = dma_map_single(cp->dev, buffer, len, DMA_FROM_DEVICE); |
| 630 | if (dma_mapping_error(dma_handle)) { | ||
| 631 | /* | ||
| 632 | * reduce current DMA mapping usage, | ||
| 633 | * delay and try again later or | ||
| 634 | * reset driver. | ||
| 635 | */ | ||
| 636 | goto map_error_handling; | ||
| 637 | } | ||
| 581 | 638 | ||
| 582 | cp->rx_buf = buffer; | 639 | cp->rx_buf = buffer; |
| 583 | cp->rx_len = len; | 640 | cp->rx_len = len; |
| @@ -658,6 +715,75 @@ failure can be determined by: | |||
| 658 | * delay and try again later or | 715 | * delay and try again later or |
| 659 | * reset driver. | 716 | * reset driver. |
| 660 | */ | 717 | */ |
| 718 | goto map_error_handling; | ||
| 719 | } | ||
| 720 | |||
| 721 | - unmap pages that are already mapped, when mapping error occurs in the middle | ||
| 722 | of a multiple page mapping attempt. These example are applicable to | ||
| 723 | dma_map_page() as well. | ||
| 724 | |||
| 725 | Example 1: | ||
| 726 | dma_addr_t dma_handle1; | ||
| 727 | dma_addr_t dma_handle2; | ||
| 728 | |||
| 729 | dma_handle1 = dma_map_single(dev, addr, size, direction); | ||
| 730 | if (dma_mapping_error(dev, dma_handle1)) { | ||
| 731 | /* | ||
| 732 | * reduce current DMA mapping usage, | ||
| 733 | * delay and try again later or | ||
| 734 | * reset driver. | ||
| 735 | */ | ||
| 736 | goto map_error_handling1; | ||
| 737 | } | ||
| 738 | dma_handle2 = dma_map_single(dev, addr, size, direction); | ||
| 739 | if (dma_mapping_error(dev, dma_handle2)) { | ||
| 740 | /* | ||
| 741 | * reduce current DMA mapping usage, | ||
| 742 | * delay and try again later or | ||
| 743 | * reset driver. | ||
| 744 | */ | ||
| 745 | goto map_error_handling2; | ||
| 746 | } | ||
| 747 | |||
| 748 | ... | ||
| 749 | |||
| 750 | map_error_handling2: | ||
| 751 | dma_unmap_single(dma_handle1); | ||
| 752 | map_error_handling1: | ||
| 753 | |||
| 754 | Example 2: (if buffers are allocated a loop, unmap all mapped buffers when | ||
| 755 | mapping error is detected in the middle) | ||
| 756 | |||
| 757 | dma_addr_t dma_addr; | ||
| 758 | dma_addr_t array[DMA_BUFFERS]; | ||
| 759 | int save_index = 0; | ||
| 760 | |||
| 761 | for (i = 0; i < DMA_BUFFERS; i++) { | ||
| 762 | |||
| 763 | ... | ||
| 764 | |||
| 765 | dma_addr = dma_map_single(dev, addr, size, direction); | ||
| 766 | if (dma_mapping_error(dev, dma_addr)) { | ||
| 767 | /* | ||
| 768 | * reduce current DMA mapping usage, | ||
| 769 | * delay and try again later or | ||
| 770 | * reset driver. | ||
| 771 | */ | ||
| 772 | goto map_error_handling; | ||
| 773 | } | ||
| 774 | array[i].dma_addr = dma_addr; | ||
| 775 | save_index++; | ||
| 776 | } | ||
| 777 | |||
| 778 | ... | ||
| 779 | |||
| 780 | map_error_handling: | ||
| 781 | |||
| 782 | for (i = 0; i < save_index; i++) { | ||
| 783 | |||
| 784 | ... | ||
| 785 | |||
| 786 | dma_unmap_single(array[i].dma_addr); | ||
| 661 | } | 787 | } |
| 662 | 788 | ||
| 663 | Networking drivers must call dev_kfree_skb to free the socket buffer | 789 | Networking drivers must call dev_kfree_skb to free the socket buffer |
diff --git a/Documentation/DMA-API.txt b/Documentation/DMA-API.txt index 66bd97a95f10..78a6c569d204 100644 --- a/Documentation/DMA-API.txt +++ b/Documentation/DMA-API.txt | |||
| @@ -678,3 +678,15 @@ out of dma_debug_entries. These entries are preallocated at boot. The number | |||
| 678 | of preallocated entries is defined per architecture. If it is too low for you | 678 | of preallocated entries is defined per architecture. If it is too low for you |
| 679 | boot with 'dma_debug_entries=<your_desired_number>' to overwrite the | 679 | boot with 'dma_debug_entries=<your_desired_number>' to overwrite the |
| 680 | architectural default. | 680 | architectural default. |
| 681 | |||
| 682 | void debug_dmap_mapping_error(struct device *dev, dma_addr_t dma_addr); | ||
| 683 | |||
| 684 | dma-debug interface debug_dma_mapping_error() to debug drivers that fail | ||
| 685 | to check dma mapping errors on addresses returned by dma_map_single() and | ||
| 686 | dma_map_page() interfaces. This interface clears a flag set by | ||
| 687 | debug_dma_map_page() to indicate that dma_mapping_error() has been called by | ||
| 688 | the driver. When driver does unmap, debug_dma_unmap() checks the flag and if | ||
| 689 | this flag is still set, prints warning message that includes call trace that | ||
| 690 | leads up to the unmap. This interface can be called from dma_mapping_error() | ||
| 691 | routines to enable dma mapping error check debugging. | ||
| 692 | |||
diff --git a/Documentation/devicetree/bindings/net/mdio-gpio.txt b/Documentation/devicetree/bindings/net/mdio-gpio.txt index bc9549529014..c79bab025369 100644 --- a/Documentation/devicetree/bindings/net/mdio-gpio.txt +++ b/Documentation/devicetree/bindings/net/mdio-gpio.txt | |||
| @@ -8,9 +8,16 @@ gpios property as described in section VIII.1 in the following order: | |||
| 8 | 8 | ||
| 9 | MDC, MDIO. | 9 | MDC, MDIO. |
| 10 | 10 | ||
| 11 | Note: Each gpio-mdio bus should have an alias correctly numbered in "aliases" | ||
| 12 | node. | ||
| 13 | |||
| 11 | Example: | 14 | Example: |
| 12 | 15 | ||
| 13 | mdio { | 16 | aliases { |
| 17 | mdio-gpio0 = <&mdio0>; | ||
| 18 | }; | ||
| 19 | |||
| 20 | mdio0: mdio { | ||
| 14 | compatible = "virtual,mdio-gpio"; | 21 | compatible = "virtual,mdio-gpio"; |
| 15 | #address-cells = <1>; | 22 | #address-cells = <1>; |
| 16 | #size-cells = <0>; | 23 | #size-cells = <0>; |
diff --git a/Documentation/networking/vxlan.txt b/Documentation/networking/vxlan.txt index 5b34b762d7d5..6d993510f091 100644 --- a/Documentation/networking/vxlan.txt +++ b/Documentation/networking/vxlan.txt | |||
| @@ -32,7 +32,7 @@ no entry is in the forwarding table. | |||
| 32 | # ip link delete vxlan0 | 32 | # ip link delete vxlan0 |
| 33 | 33 | ||
| 34 | 3. Show vxlan info | 34 | 3. Show vxlan info |
| 35 | # ip -d show vxlan0 | 35 | # ip -d link show vxlan0 |
| 36 | 36 | ||
| 37 | It is possible to create, destroy and display the vxlan | 37 | It is possible to create, destroy and display the vxlan |
| 38 | forwarding table using the new bridge command. | 38 | forwarding table using the new bridge command. |
| @@ -41,7 +41,7 @@ forwarding table using the new bridge command. | |||
| 41 | # bridge fdb add to 00:17:42:8a:b4:05 dst 192.19.0.2 dev vxlan0 | 41 | # bridge fdb add to 00:17:42:8a:b4:05 dst 192.19.0.2 dev vxlan0 |
| 42 | 42 | ||
| 43 | 2. Delete forwarding table entry | 43 | 2. Delete forwarding table entry |
| 44 | # bridge fdb delete 00:17:42:8a:b4:05 | 44 | # bridge fdb delete 00:17:42:8a:b4:05 dev vxlan0 |
| 45 | 45 | ||
| 46 | 3. Show forwarding table | 46 | 3. Show forwarding table |
| 47 | # bridge fdb show dev vxlan0 | 47 | # bridge fdb show dev vxlan0 |
diff --git a/MAINTAINERS b/MAINTAINERS index bb0b27db673f..9386a63ea8f6 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -526,17 +526,17 @@ F: drivers/video/geode/ | |||
| 526 | F: arch/x86/include/asm/geode.h | 526 | F: arch/x86/include/asm/geode.h |
| 527 | 527 | ||
| 528 | AMD IOMMU (AMD-VI) | 528 | AMD IOMMU (AMD-VI) |
| 529 | M: Joerg Roedel <joerg.roedel@amd.com> | 529 | M: Joerg Roedel <joro@8bytes.org> |
| 530 | L: iommu@lists.linux-foundation.org | 530 | L: iommu@lists.linux-foundation.org |
| 531 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git | 531 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git |
| 532 | S: Supported | 532 | S: Maintained |
| 533 | F: drivers/iommu/amd_iommu*.[ch] | 533 | F: drivers/iommu/amd_iommu*.[ch] |
| 534 | F: include/linux/amd-iommu.h | 534 | F: include/linux/amd-iommu.h |
| 535 | 535 | ||
| 536 | AMD MICROCODE UPDATE SUPPORT | 536 | AMD MICROCODE UPDATE SUPPORT |
| 537 | M: Andreas Herrmann <andreas.herrmann3@amd.com> | 537 | M: Andreas Herrmann <herrmann.der.user@googlemail.com> |
| 538 | L: amd64-microcode@amd64.org | 538 | L: amd64-microcode@amd64.org |
| 539 | S: Supported | 539 | S: Maintained |
| 540 | F: arch/x86/kernel/microcode_amd.c | 540 | F: arch/x86/kernel/microcode_amd.c |
| 541 | 541 | ||
| 542 | AMS (Apple Motion Sensor) DRIVER | 542 | AMS (Apple Motion Sensor) DRIVER |
| @@ -841,6 +841,14 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/kristoffer/linux-hpc.git | |||
| 841 | F: arch/arm/mach-sa1100/jornada720.c | 841 | F: arch/arm/mach-sa1100/jornada720.c |
| 842 | F: arch/arm/mach-sa1100/include/mach/jornada720.h | 842 | F: arch/arm/mach-sa1100/include/mach/jornada720.h |
| 843 | 843 | ||
| 844 | ARM/IGEP MACHINE SUPPORT | ||
| 845 | M: Enric Balletbo i Serra <eballetbo@gmail.com> | ||
| 846 | M: Javier Martinez Canillas <javier@dowhile0.org> | ||
| 847 | L: linux-omap@vger.kernel.org | ||
| 848 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | ||
| 849 | S: Maintained | ||
| 850 | F: arch/arm/mach-omap2/board-igep0020.c | ||
| 851 | |||
| 844 | ARM/INCOME PXA270 SUPPORT | 852 | ARM/INCOME PXA270 SUPPORT |
| 845 | M: Marek Vasut <marek.vasut@gmail.com> | 853 | M: Marek Vasut <marek.vasut@gmail.com> |
| 846 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 854 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
| @@ -2708,10 +2716,10 @@ F: include/linux/edac.h | |||
| 2708 | 2716 | ||
| 2709 | EDAC-AMD64 | 2717 | EDAC-AMD64 |
| 2710 | M: Doug Thompson <dougthompson@xmission.com> | 2718 | M: Doug Thompson <dougthompson@xmission.com> |
| 2711 | M: Borislav Petkov <borislav.petkov@amd.com> | 2719 | M: Borislav Petkov <bp@alien8.de> |
| 2712 | L: linux-edac@vger.kernel.org | 2720 | L: linux-edac@vger.kernel.org |
| 2713 | W: bluesmoke.sourceforge.net | 2721 | W: bluesmoke.sourceforge.net |
| 2714 | S: Supported | 2722 | S: Maintained |
| 2715 | F: drivers/edac/amd64_edac* | 2723 | F: drivers/edac/amd64_edac* |
| 2716 | 2724 | ||
| 2717 | EDAC-E752X | 2725 | EDAC-E752X |
| @@ -3753,7 +3761,7 @@ S: Maintained | |||
| 3753 | F: drivers/platform/x86/ideapad-laptop.c | 3761 | F: drivers/platform/x86/ideapad-laptop.c |
| 3754 | 3762 | ||
| 3755 | IDE/ATAPI DRIVERS | 3763 | IDE/ATAPI DRIVERS |
| 3756 | M: Borislav Petkov <petkovbb@gmail.com> | 3764 | M: Borislav Petkov <bp@alien8.de> |
| 3757 | L: linux-ide@vger.kernel.org | 3765 | L: linux-ide@vger.kernel.org |
| 3758 | S: Maintained | 3766 | S: Maintained |
| 3759 | F: Documentation/cdrom/ide-cd | 3767 | F: Documentation/cdrom/ide-cd |
| @@ -4280,8 +4288,8 @@ F: include/linux/lockd/ | |||
| 4280 | F: include/linux/sunrpc/ | 4288 | F: include/linux/sunrpc/ |
| 4281 | 4289 | ||
| 4282 | KERNEL VIRTUAL MACHINE (KVM) | 4290 | KERNEL VIRTUAL MACHINE (KVM) |
| 4283 | M: Avi Kivity <avi@redhat.com> | ||
| 4284 | M: Marcelo Tosatti <mtosatti@redhat.com> | 4291 | M: Marcelo Tosatti <mtosatti@redhat.com> |
| 4292 | M: Gleb Natapov <gleb@redhat.com> | ||
| 4285 | L: kvm@vger.kernel.org | 4293 | L: kvm@vger.kernel.org |
| 4286 | W: http://kvm.qumranet.com | 4294 | W: http://kvm.qumranet.com |
| 4287 | S: Supported | 4295 | S: Supported |
| @@ -5413,7 +5421,7 @@ S: Maintained | |||
| 5413 | F: sound/drivers/opl4/ | 5421 | F: sound/drivers/opl4/ |
| 5414 | 5422 | ||
| 5415 | OPROFILE | 5423 | OPROFILE |
| 5416 | M: Robert Richter <robert.richter@amd.com> | 5424 | M: Robert Richter <rric@kernel.org> |
| 5417 | L: oprofile-list@lists.sf.net | 5425 | L: oprofile-list@lists.sf.net |
| 5418 | S: Maintained | 5426 | S: Maintained |
| 5419 | F: arch/*/include/asm/oprofile*.h | 5427 | F: arch/*/include/asm/oprofile*.h |
| @@ -8198,7 +8206,7 @@ F: drivers/platform/x86 | |||
| 8198 | 8206 | ||
| 8199 | X86 MCE INFRASTRUCTURE | 8207 | X86 MCE INFRASTRUCTURE |
| 8200 | M: Tony Luck <tony.luck@intel.com> | 8208 | M: Tony Luck <tony.luck@intel.com> |
| 8201 | M: Borislav Petkov <bp@amd64.org> | 8209 | M: Borislav Petkov <bp@alien8.de> |
| 8202 | L: linux-edac@vger.kernel.org | 8210 | L: linux-edac@vger.kernel.org |
| 8203 | S: Maintained | 8211 | S: Maintained |
| 8204 | F: arch/x86/kernel/cpu/mcheck/* | 8212 | F: arch/x86/kernel/cpu/mcheck/* |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 7 | 2 | PATCHLEVEL = 7 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc6 | 4 | EXTRAVERSION = |
| 5 | NAME = Terrified Chipmunk | 5 | NAME = Terrified Chipmunk |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
| @@ -1321,10 +1321,12 @@ kernelversion: | |||
| 1321 | 1321 | ||
| 1322 | # Clear a bunch of variables before executing the submake | 1322 | # Clear a bunch of variables before executing the submake |
| 1323 | tools/: FORCE | 1323 | tools/: FORCE |
| 1324 | $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/ | 1324 | $(Q)mkdir -p $(objtree)/tools |
| 1325 | $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= O=$(objtree) subdir=tools -C $(src)/tools/ | ||
| 1325 | 1326 | ||
| 1326 | tools/%: FORCE | 1327 | tools/%: FORCE |
| 1327 | $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= -C $(src)/tools/ $* | 1328 | $(Q)mkdir -p $(objtree)/tools |
| 1329 | $(Q)$(MAKE) LDFLAGS= MAKEFLAGS= O=$(objtree) subdir=tools -C $(src)/tools/ $* | ||
| 1328 | 1330 | ||
| 1329 | # Single targets | 1331 | # Single targets |
| 1330 | # --------------------------------------------------------------------------- | 1332 | # --------------------------------------------------------------------------- |
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 1e6956a90608..14db93e4c8a8 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c | |||
| @@ -445,7 +445,7 @@ struct procfs_args { | |||
| 445 | * unhappy with OSF UFS. [CHECKME] | 445 | * unhappy with OSF UFS. [CHECKME] |
| 446 | */ | 446 | */ |
| 447 | static int | 447 | static int |
| 448 | osf_ufs_mount(char *dirname, struct ufs_args __user *args, int flags) | 448 | osf_ufs_mount(const char *dirname, struct ufs_args __user *args, int flags) |
| 449 | { | 449 | { |
| 450 | int retval; | 450 | int retval; |
| 451 | struct cdfs_args tmp; | 451 | struct cdfs_args tmp; |
| @@ -465,7 +465,7 @@ osf_ufs_mount(char *dirname, struct ufs_args __user *args, int flags) | |||
| 465 | } | 465 | } |
| 466 | 466 | ||
| 467 | static int | 467 | static int |
| 468 | osf_cdfs_mount(char *dirname, struct cdfs_args __user *args, int flags) | 468 | osf_cdfs_mount(const char *dirname, struct cdfs_args __user *args, int flags) |
| 469 | { | 469 | { |
| 470 | int retval; | 470 | int retval; |
| 471 | struct cdfs_args tmp; | 471 | struct cdfs_args tmp; |
| @@ -485,7 +485,7 @@ osf_cdfs_mount(char *dirname, struct cdfs_args __user *args, int flags) | |||
| 485 | } | 485 | } |
| 486 | 486 | ||
| 487 | static int | 487 | static int |
| 488 | osf_procfs_mount(char *dirname, struct procfs_args __user *args, int flags) | 488 | osf_procfs_mount(const char *dirname, struct procfs_args __user *args, int flags) |
| 489 | { | 489 | { |
| 490 | struct procfs_args tmp; | 490 | struct procfs_args tmp; |
| 491 | 491 | ||
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index ade7e924bef5..9759fec0b704 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -547,6 +547,7 @@ config ARCH_KIRKWOOD | |||
| 547 | select CPU_FEROCEON | 547 | select CPU_FEROCEON |
| 548 | select GENERIC_CLOCKEVENTS | 548 | select GENERIC_CLOCKEVENTS |
| 549 | select PCI | 549 | select PCI |
| 550 | select PCI_QUIRKS | ||
| 550 | select PLAT_ORION_LEGACY | 551 | select PLAT_ORION_LEGACY |
| 551 | help | 552 | help |
| 552 | Support for the following Marvell Kirkwood series SoCs: | 553 | Support for the following Marvell Kirkwood series SoCs: |
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 90275f036cd1..49ca86e37b8d 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
| @@ -652,6 +652,15 @@ __setup_mmu: sub r3, r4, #16384 @ Page directory size | |||
| 652 | mov pc, lr | 652 | mov pc, lr |
| 653 | ENDPROC(__setup_mmu) | 653 | ENDPROC(__setup_mmu) |
| 654 | 654 | ||
| 655 | @ Enable unaligned access on v6, to allow better code generation | ||
| 656 | @ for the decompressor C code: | ||
| 657 | __armv6_mmu_cache_on: | ||
| 658 | mrc p15, 0, r0, c1, c0, 0 @ read SCTLR | ||
| 659 | bic r0, r0, #2 @ A (no unaligned access fault) | ||
| 660 | orr r0, r0, #1 << 22 @ U (v6 unaligned access model) | ||
| 661 | mcr p15, 0, r0, c1, c0, 0 @ write SCTLR | ||
| 662 | b __armv4_mmu_cache_on | ||
| 663 | |||
| 655 | __arm926ejs_mmu_cache_on: | 664 | __arm926ejs_mmu_cache_on: |
| 656 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH | 665 | #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH |
| 657 | mov r0, #4 @ put dcache in WT mode | 666 | mov r0, #4 @ put dcache in WT mode |
| @@ -694,6 +703,9 @@ __armv7_mmu_cache_on: | |||
| 694 | bic r0, r0, #1 << 28 @ clear SCTLR.TRE | 703 | bic r0, r0, #1 << 28 @ clear SCTLR.TRE |
| 695 | orr r0, r0, #0x5000 @ I-cache enable, RR cache replacement | 704 | orr r0, r0, #0x5000 @ I-cache enable, RR cache replacement |
| 696 | orr r0, r0, #0x003c @ write buffer | 705 | orr r0, r0, #0x003c @ write buffer |
| 706 | bic r0, r0, #2 @ A (no unaligned access fault) | ||
| 707 | orr r0, r0, #1 << 22 @ U (v6 unaligned access model) | ||
| 708 | @ (needed for ARM1176) | ||
| 697 | #ifdef CONFIG_MMU | 709 | #ifdef CONFIG_MMU |
| 698 | #ifdef CONFIG_CPU_ENDIAN_BE8 | 710 | #ifdef CONFIG_CPU_ENDIAN_BE8 |
| 699 | orr r0, r0, #1 << 25 @ big-endian page tables | 711 | orr r0, r0, #1 << 25 @ big-endian page tables |
| @@ -914,7 +926,7 @@ proc_types: | |||
| 914 | 926 | ||
| 915 | .word 0x0007b000 @ ARMv6 | 927 | .word 0x0007b000 @ ARMv6 |
| 916 | .word 0x000ff000 | 928 | .word 0x000ff000 |
| 917 | W(b) __armv4_mmu_cache_on | 929 | W(b) __armv6_mmu_cache_on |
| 918 | W(b) __armv4_mmu_cache_off | 930 | W(b) __armv4_mmu_cache_off |
| 919 | W(b) __armv6_mmu_cache_flush | 931 | W(b) __armv6_mmu_cache_flush |
| 920 | 932 | ||
diff --git a/arch/arm/common/timer-sp.c b/arch/arm/common/timer-sp.c index df13a3ffff35..9d2d3ba339ff 100644 --- a/arch/arm/common/timer-sp.c +++ b/arch/arm/common/timer-sp.c | |||
| @@ -162,7 +162,6 @@ static struct clock_event_device sp804_clockevent = { | |||
| 162 | .set_mode = sp804_set_mode, | 162 | .set_mode = sp804_set_mode, |
| 163 | .set_next_event = sp804_set_next_event, | 163 | .set_next_event = sp804_set_next_event, |
| 164 | .rating = 300, | 164 | .rating = 300, |
| 165 | .cpumask = cpu_all_mask, | ||
| 166 | }; | 165 | }; |
| 167 | 166 | ||
| 168 | static struct irqaction sp804_timer_irq = { | 167 | static struct irqaction sp804_timer_irq = { |
| @@ -185,6 +184,7 @@ void __init sp804_clockevents_init(void __iomem *base, unsigned int irq, | |||
| 185 | clkevt_reload = DIV_ROUND_CLOSEST(rate, HZ); | 184 | clkevt_reload = DIV_ROUND_CLOSEST(rate, HZ); |
| 186 | evt->name = name; | 185 | evt->name = name; |
| 187 | evt->irq = irq; | 186 | evt->irq = irq; |
| 187 | evt->cpumask = cpu_possible_mask; | ||
| 188 | 188 | ||
| 189 | setup_irq(irq, &sp804_timer_irq); | 189 | setup_irq(irq, &sp804_timer_irq); |
| 190 | clockevents_config_and_register(evt, rate, 0xf, 0xffffffff); | 190 | clockevents_config_and_register(evt, rate, 0xf, 0xffffffff); |
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index 23004847bb05..78d8e9b5544f 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h | |||
| @@ -91,6 +91,7 @@ static inline dma_addr_t virt_to_dma(struct device *dev, void *addr) | |||
| 91 | */ | 91 | */ |
| 92 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 92 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
| 93 | { | 93 | { |
| 94 | debug_dma_mapping_error(dev, dma_addr); | ||
| 94 | return dma_addr == DMA_ERROR_CODE; | 95 | return dma_addr == DMA_ERROR_CODE; |
| 95 | } | 96 | } |
| 96 | 97 | ||
diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index cd0c8b1e1ecf..14e9947bad6e 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c | |||
| @@ -713,8 +713,7 @@ static int dm644x_venc_setup_clock(enum vpbe_enc_timings_type type, | |||
| 713 | break; | 713 | break; |
| 714 | case VPBE_ENC_CUSTOM_TIMINGS: | 714 | case VPBE_ENC_CUSTOM_TIMINGS: |
| 715 | if (pclock <= 27000000) { | 715 | if (pclock <= 27000000) { |
| 716 | v |= DM644X_VPSS_MUXSEL_PLL2_MODE | | 716 | v |= DM644X_VPSS_DACCLKEN; |
| 717 | DM644X_VPSS_DACCLKEN; | ||
| 718 | writel(v, DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL)); | 717 | writel(v, DAVINCI_SYSMOD_VIRT(SYSMOD_VPSS_CLKCTL)); |
| 719 | } else { | 718 | } else { |
| 720 | /* | 719 | /* |
diff --git a/arch/arm/mach-dove/include/mach/pm.h b/arch/arm/mach-dove/include/mach/pm.h index 7bcd0dfce4b1..b47f75038686 100644 --- a/arch/arm/mach-dove/include/mach/pm.h +++ b/arch/arm/mach-dove/include/mach/pm.h | |||
| @@ -63,7 +63,7 @@ static inline int pmu_to_irq(int pin) | |||
| 63 | 63 | ||
| 64 | static inline int irq_to_pmu(int irq) | 64 | static inline int irq_to_pmu(int irq) |
| 65 | { | 65 | { |
| 66 | if (IRQ_DOVE_PMU_START < irq && irq < NR_IRQS) | 66 | if (IRQ_DOVE_PMU_START <= irq && irq < NR_IRQS) |
| 67 | return irq - IRQ_DOVE_PMU_START; | 67 | return irq - IRQ_DOVE_PMU_START; |
| 68 | 68 | ||
| 69 | return -EINVAL; | 69 | return -EINVAL; |
diff --git a/arch/arm/mach-dove/irq.c b/arch/arm/mach-dove/irq.c index 087711524e8a..bc4344aa1009 100644 --- a/arch/arm/mach-dove/irq.c +++ b/arch/arm/mach-dove/irq.c | |||
| @@ -46,8 +46,20 @@ static void pmu_irq_ack(struct irq_data *d) | |||
| 46 | int pin = irq_to_pmu(d->irq); | 46 | int pin = irq_to_pmu(d->irq); |
| 47 | u32 u; | 47 | u32 u; |
| 48 | 48 | ||
| 49 | /* | ||
| 50 | * The PMU mask register is not RW0C: it is RW. This means that | ||
| 51 | * the bits take whatever value is written to them; if you write | ||
| 52 | * a '1', you will set the interrupt. | ||
| 53 | * | ||
| 54 | * Unfortunately this means there is NO race free way to clear | ||
| 55 | * these interrupts. | ||
| 56 | * | ||
| 57 | * So, let's structure the code so that the window is as small as | ||
| 58 | * possible. | ||
| 59 | */ | ||
| 49 | u = ~(1 << (pin & 31)); | 60 | u = ~(1 << (pin & 31)); |
| 50 | writel(u, PMU_INTERRUPT_CAUSE); | 61 | u &= readl_relaxed(PMU_INTERRUPT_CAUSE); |
| 62 | writel_relaxed(u, PMU_INTERRUPT_CAUSE); | ||
| 51 | } | 63 | } |
| 52 | 64 | ||
| 53 | static struct irq_chip pmu_irq_chip = { | 65 | static struct irq_chip pmu_irq_chip = { |
diff --git a/arch/arm/mach-exynos/dma.c b/arch/arm/mach-exynos/dma.c index 21d568b3b149..87e07d6fc615 100644 --- a/arch/arm/mach-exynos/dma.c +++ b/arch/arm/mach-exynos/dma.c | |||
| @@ -275,6 +275,9 @@ static int __init exynos_dma_init(void) | |||
| 275 | exynos_pdma1_pdata.nr_valid_peri = | 275 | exynos_pdma1_pdata.nr_valid_peri = |
| 276 | ARRAY_SIZE(exynos4210_pdma1_peri); | 276 | ARRAY_SIZE(exynos4210_pdma1_peri); |
| 277 | exynos_pdma1_pdata.peri_id = exynos4210_pdma1_peri; | 277 | exynos_pdma1_pdata.peri_id = exynos4210_pdma1_peri; |
| 278 | |||
| 279 | if (samsung_rev() == EXYNOS4210_REV_0) | ||
| 280 | exynos_mdma1_device.res.start = EXYNOS4_PA_S_MDMA1; | ||
| 278 | } else if (soc_is_exynos4212() || soc_is_exynos4412()) { | 281 | } else if (soc_is_exynos4212() || soc_is_exynos4412()) { |
| 279 | exynos_pdma0_pdata.nr_valid_peri = | 282 | exynos_pdma0_pdata.nr_valid_peri = |
| 280 | ARRAY_SIZE(exynos4212_pdma0_peri); | 283 | ARRAY_SIZE(exynos4212_pdma0_peri); |
diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h index 8480849affb9..ed4da4544cd2 100644 --- a/arch/arm/mach-exynos/include/mach/map.h +++ b/arch/arm/mach-exynos/include/mach/map.h | |||
| @@ -90,6 +90,7 @@ | |||
| 90 | 90 | ||
| 91 | #define EXYNOS4_PA_MDMA0 0x10810000 | 91 | #define EXYNOS4_PA_MDMA0 0x10810000 |
| 92 | #define EXYNOS4_PA_MDMA1 0x12850000 | 92 | #define EXYNOS4_PA_MDMA1 0x12850000 |
| 93 | #define EXYNOS4_PA_S_MDMA1 0x12840000 | ||
| 93 | #define EXYNOS4_PA_PDMA0 0x12680000 | 94 | #define EXYNOS4_PA_PDMA0 0x12680000 |
| 94 | #define EXYNOS4_PA_PDMA1 0x12690000 | 95 | #define EXYNOS4_PA_PDMA1 0x12690000 |
| 95 | #define EXYNOS5_PA_MDMA0 0x10800000 | 96 | #define EXYNOS5_PA_MDMA0 0x10800000 |
diff --git a/arch/arm/mach-ixp4xx/common-pci.c b/arch/arm/mach-ixp4xx/common-pci.c index 1694f01ce2b6..6d6bde3e15fa 100644 --- a/arch/arm/mach-ixp4xx/common-pci.c +++ b/arch/arm/mach-ixp4xx/common-pci.c | |||
| @@ -410,6 +410,7 @@ void __init ixp4xx_pci_preinit(void) | |||
| 410 | * Enable the IO window to be way up high, at 0xfffffc00 | 410 | * Enable the IO window to be way up high, at 0xfffffc00 |
| 411 | */ | 411 | */ |
| 412 | local_write_config(PCI_BASE_ADDRESS_5, 4, 0xfffffc01); | 412 | local_write_config(PCI_BASE_ADDRESS_5, 4, 0xfffffc01); |
| 413 | local_write_config(0x40, 4, 0x000080FF); /* No TRDY time limit */ | ||
| 413 | } else { | 414 | } else { |
| 414 | printk("PCI: IXP4xx is target - No bus scan performed\n"); | 415 | printk("PCI: IXP4xx is target - No bus scan performed\n"); |
| 415 | } | 416 | } |
diff --git a/arch/arm/mach-ixp4xx/common.c b/arch/arm/mach-ixp4xx/common.c index fdf91a160884..8c0c0e2d0727 100644 --- a/arch/arm/mach-ixp4xx/common.c +++ b/arch/arm/mach-ixp4xx/common.c | |||
| @@ -67,15 +67,12 @@ static struct map_desc ixp4xx_io_desc[] __initdata = { | |||
| 67 | .pfn = __phys_to_pfn(IXP4XX_PCI_CFG_BASE_PHYS), | 67 | .pfn = __phys_to_pfn(IXP4XX_PCI_CFG_BASE_PHYS), |
| 68 | .length = IXP4XX_PCI_CFG_REGION_SIZE, | 68 | .length = IXP4XX_PCI_CFG_REGION_SIZE, |
| 69 | .type = MT_DEVICE | 69 | .type = MT_DEVICE |
| 70 | }, | 70 | }, { /* Queue Manager */ |
| 71 | #ifdef CONFIG_DEBUG_LL | 71 | .virtual = (unsigned long)IXP4XX_QMGR_BASE_VIRT, |
| 72 | { /* Debug UART mapping */ | 72 | .pfn = __phys_to_pfn(IXP4XX_QMGR_BASE_PHYS), |
| 73 | .virtual = (unsigned long)IXP4XX_DEBUG_UART_BASE_VIRT, | 73 | .length = IXP4XX_QMGR_REGION_SIZE, |
| 74 | .pfn = __phys_to_pfn(IXP4XX_DEBUG_UART_BASE_PHYS), | ||
| 75 | .length = IXP4XX_DEBUG_UART_REGION_SIZE, | ||
| 76 | .type = MT_DEVICE | 74 | .type = MT_DEVICE |
| 77 | } | 75 | }, |
| 78 | #endif | ||
| 79 | }; | 76 | }; |
| 80 | 77 | ||
| 81 | void __init ixp4xx_map_io(void) | 78 | void __init ixp4xx_map_io(void) |
diff --git a/arch/arm/mach-ixp4xx/goramo_mlr.c b/arch/arm/mach-ixp4xx/goramo_mlr.c index b800a031207c..53b8348dfcc2 100644 --- a/arch/arm/mach-ixp4xx/goramo_mlr.c +++ b/arch/arm/mach-ixp4xx/goramo_mlr.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <asm/mach/arch.h> | 15 | #include <asm/mach/arch.h> |
| 16 | #include <asm/mach/flash.h> | 16 | #include <asm/mach/flash.h> |
| 17 | #include <asm/mach/pci.h> | 17 | #include <asm/mach/pci.h> |
| 18 | #include <asm/system_info.h> | ||
| 18 | 19 | ||
| 19 | #define SLOT_ETHA 0x0B /* IDSEL = AD21 */ | 20 | #define SLOT_ETHA 0x0B /* IDSEL = AD21 */ |
| 20 | #define SLOT_ETHB 0x0C /* IDSEL = AD20 */ | 21 | #define SLOT_ETHB 0x0C /* IDSEL = AD20 */ |
| @@ -329,7 +330,7 @@ static struct platform_device device_hss_tab[] = { | |||
| 329 | }; | 330 | }; |
| 330 | 331 | ||
| 331 | 332 | ||
| 332 | static struct platform_device *device_tab[6] __initdata = { | 333 | static struct platform_device *device_tab[7] __initdata = { |
| 333 | &device_flash, /* index 0 */ | 334 | &device_flash, /* index 0 */ |
| 334 | }; | 335 | }; |
| 335 | 336 | ||
diff --git a/arch/arm/mach-ixp4xx/include/mach/debug-macro.S b/arch/arm/mach-ixp4xx/include/mach/debug-macro.S index 8c9f8d564492..ff686cbc5df4 100644 --- a/arch/arm/mach-ixp4xx/include/mach/debug-macro.S +++ b/arch/arm/mach-ixp4xx/include/mach/debug-macro.S | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | #else | 17 | #else |
| 18 | mov \rp, #0 | 18 | mov \rp, #0 |
| 19 | #endif | 19 | #endif |
| 20 | orr \rv, \rp, #0xff000000 @ virtual | 20 | orr \rv, \rp, #0xfe000000 @ virtual |
| 21 | orr \rv, \rv, #0x00b00000 | 21 | orr \rv, \rv, #0x00f00000 |
| 22 | orr \rp, \rp, #0xc8000000 @ physical | 22 | orr \rp, \rp, #0xc8000000 @ physical |
| 23 | .endm | 23 | .endm |
| 24 | 24 | ||
diff --git a/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h b/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h index eb68b61ce975..c5bae9c035d5 100644 --- a/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h +++ b/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h | |||
| @@ -30,51 +30,43 @@ | |||
| 30 | * | 30 | * |
| 31 | * 0x50000000 0x10000000 ioremap'd EXP BUS | 31 | * 0x50000000 0x10000000 ioremap'd EXP BUS |
| 32 | * | 32 | * |
| 33 | * 0x6000000 0x00004000 ioremap'd QMgr | 33 | * 0xC8000000 0x00013000 0xFEF00000 On-Chip Peripherals |
| 34 | * | 34 | * |
| 35 | * 0xC0000000 0x00001000 0xffbff000 PCI CFG | 35 | * 0xC0000000 0x00001000 0xFEF13000 PCI CFG |
| 36 | * | 36 | * |
| 37 | * 0xC4000000 0x00001000 0xffbfe000 EXP CFG | 37 | * 0xC4000000 0x00001000 0xFEF14000 EXP CFG |
| 38 | * | 38 | * |
| 39 | * 0xC8000000 0x00013000 0xffbeb000 On-Chip Peripherals | 39 | * 0x60000000 0x00004000 0xFEF15000 QMgr |
| 40 | */ | 40 | */ |
| 41 | 41 | ||
| 42 | /* | 42 | /* |
| 43 | * Queue Manager | 43 | * Queue Manager |
| 44 | */ | 44 | */ |
| 45 | #define IXP4XX_QMGR_BASE_PHYS (0x60000000) | 45 | #define IXP4XX_QMGR_BASE_PHYS 0x60000000 |
| 46 | #define IXP4XX_QMGR_REGION_SIZE (0x00004000) | 46 | #define IXP4XX_QMGR_BASE_VIRT IOMEM(0xFEF15000) |
| 47 | #define IXP4XX_QMGR_REGION_SIZE 0x00004000 | ||
| 47 | 48 | ||
| 48 | /* | 49 | /* |
| 49 | * Expansion BUS Configuration registers | 50 | * Peripheral space, including debug UART. Must be section-aligned so that |
| 51 | * it can be used with the low-level debug code. | ||
| 50 | */ | 52 | */ |
| 51 | #define IXP4XX_EXP_CFG_BASE_PHYS (0xC4000000) | 53 | #define IXP4XX_PERIPHERAL_BASE_PHYS 0xC8000000 |
| 52 | #define IXP4XX_EXP_CFG_BASE_VIRT IOMEM(0xFFBFE000) | 54 | #define IXP4XX_PERIPHERAL_BASE_VIRT IOMEM(0xFEF00000) |
| 53 | #define IXP4XX_EXP_CFG_REGION_SIZE (0x00001000) | 55 | #define IXP4XX_PERIPHERAL_REGION_SIZE 0x00013000 |
| 54 | 56 | ||
| 55 | /* | 57 | /* |
| 56 | * PCI Config registers | 58 | * PCI Config registers |
| 57 | */ | 59 | */ |
| 58 | #define IXP4XX_PCI_CFG_BASE_PHYS (0xC0000000) | 60 | #define IXP4XX_PCI_CFG_BASE_PHYS 0xC0000000 |
| 59 | #define IXP4XX_PCI_CFG_BASE_VIRT IOMEM(0xFFBFF000) | 61 | #define IXP4XX_PCI_CFG_BASE_VIRT IOMEM(0xFEF13000) |
| 60 | #define IXP4XX_PCI_CFG_REGION_SIZE (0x00001000) | 62 | #define IXP4XX_PCI_CFG_REGION_SIZE 0x00001000 |
| 61 | |||
| 62 | /* | ||
| 63 | * Peripheral space | ||
| 64 | */ | ||
| 65 | #define IXP4XX_PERIPHERAL_BASE_PHYS (0xC8000000) | ||
| 66 | #define IXP4XX_PERIPHERAL_BASE_VIRT IOMEM(0xFFBEB000) | ||
| 67 | #define IXP4XX_PERIPHERAL_REGION_SIZE (0x00013000) | ||
| 68 | 63 | ||
| 69 | /* | 64 | /* |
| 70 | * Debug UART | 65 | * Expansion BUS Configuration registers |
| 71 | * | ||
| 72 | * This is basically a remap of UART1 into a region that is section | ||
| 73 | * aligned so that it * can be used with the low-level debug code. | ||
| 74 | */ | 66 | */ |
| 75 | #define IXP4XX_DEBUG_UART_BASE_PHYS (0xC8000000) | 67 | #define IXP4XX_EXP_CFG_BASE_PHYS 0xC4000000 |
| 76 | #define IXP4XX_DEBUG_UART_BASE_VIRT IOMEM(0xffb00000) | 68 | #define IXP4XX_EXP_CFG_BASE_VIRT 0xFEF14000 |
| 77 | #define IXP4XX_DEBUG_UART_REGION_SIZE (0x00001000) | 69 | #define IXP4XX_EXP_CFG_REGION_SIZE 0x00001000 |
| 78 | 70 | ||
| 79 | #define IXP4XX_EXP_CS0_OFFSET 0x00 | 71 | #define IXP4XX_EXP_CS0_OFFSET 0x00 |
| 80 | #define IXP4XX_EXP_CS1_OFFSET 0x04 | 72 | #define IXP4XX_EXP_CS1_OFFSET 0x04 |
diff --git a/arch/arm/mach-ixp4xx/include/mach/qmgr.h b/arch/arm/mach-ixp4xx/include/mach/qmgr.h index 9e7cad2d54cb..4de8da536dbb 100644 --- a/arch/arm/mach-ixp4xx/include/mach/qmgr.h +++ b/arch/arm/mach-ixp4xx/include/mach/qmgr.h | |||
| @@ -86,7 +86,7 @@ void qmgr_release_queue(unsigned int queue); | |||
| 86 | 86 | ||
| 87 | static inline void qmgr_put_entry(unsigned int queue, u32 val) | 87 | static inline void qmgr_put_entry(unsigned int queue, u32 val) |
| 88 | { | 88 | { |
| 89 | extern struct qmgr_regs __iomem *qmgr_regs; | 89 | struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; |
| 90 | #if DEBUG_QMGR | 90 | #if DEBUG_QMGR |
| 91 | BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */ | 91 | BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */ |
| 92 | 92 | ||
| @@ -99,7 +99,7 @@ static inline void qmgr_put_entry(unsigned int queue, u32 val) | |||
| 99 | static inline u32 qmgr_get_entry(unsigned int queue) | 99 | static inline u32 qmgr_get_entry(unsigned int queue) |
| 100 | { | 100 | { |
| 101 | u32 val; | 101 | u32 val; |
| 102 | extern struct qmgr_regs __iomem *qmgr_regs; | 102 | const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; |
| 103 | val = __raw_readl(&qmgr_regs->acc[queue][0]); | 103 | val = __raw_readl(&qmgr_regs->acc[queue][0]); |
| 104 | #if DEBUG_QMGR | 104 | #if DEBUG_QMGR |
| 105 | BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */ | 105 | BUG_ON(!qmgr_queue_descs[queue]); /* not yet requested */ |
| @@ -112,14 +112,14 @@ static inline u32 qmgr_get_entry(unsigned int queue) | |||
| 112 | 112 | ||
| 113 | static inline int __qmgr_get_stat1(unsigned int queue) | 113 | static inline int __qmgr_get_stat1(unsigned int queue) |
| 114 | { | 114 | { |
| 115 | extern struct qmgr_regs __iomem *qmgr_regs; | 115 | const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; |
| 116 | return (__raw_readl(&qmgr_regs->stat1[queue >> 3]) | 116 | return (__raw_readl(&qmgr_regs->stat1[queue >> 3]) |
| 117 | >> ((queue & 7) << 2)) & 0xF; | 117 | >> ((queue & 7) << 2)) & 0xF; |
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | static inline int __qmgr_get_stat2(unsigned int queue) | 120 | static inline int __qmgr_get_stat2(unsigned int queue) |
| 121 | { | 121 | { |
| 122 | extern struct qmgr_regs __iomem *qmgr_regs; | 122 | const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; |
| 123 | BUG_ON(queue >= HALF_QUEUES); | 123 | BUG_ON(queue >= HALF_QUEUES); |
| 124 | return (__raw_readl(&qmgr_regs->stat2[queue >> 4]) | 124 | return (__raw_readl(&qmgr_regs->stat2[queue >> 4]) |
| 125 | >> ((queue & 0xF) << 1)) & 0x3; | 125 | >> ((queue & 0xF) << 1)) & 0x3; |
| @@ -145,7 +145,7 @@ static inline int qmgr_stat_empty(unsigned int queue) | |||
| 145 | */ | 145 | */ |
| 146 | static inline int qmgr_stat_below_low_watermark(unsigned int queue) | 146 | static inline int qmgr_stat_below_low_watermark(unsigned int queue) |
| 147 | { | 147 | { |
| 148 | extern struct qmgr_regs __iomem *qmgr_regs; | 148 | const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; |
| 149 | if (queue >= HALF_QUEUES) | 149 | if (queue >= HALF_QUEUES) |
| 150 | return (__raw_readl(&qmgr_regs->statne_h) >> | 150 | return (__raw_readl(&qmgr_regs->statne_h) >> |
| 151 | (queue - HALF_QUEUES)) & 0x01; | 151 | (queue - HALF_QUEUES)) & 0x01; |
| @@ -172,7 +172,7 @@ static inline int qmgr_stat_above_high_watermark(unsigned int queue) | |||
| 172 | */ | 172 | */ |
| 173 | static inline int qmgr_stat_full(unsigned int queue) | 173 | static inline int qmgr_stat_full(unsigned int queue) |
| 174 | { | 174 | { |
| 175 | extern struct qmgr_regs __iomem *qmgr_regs; | 175 | const struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; |
| 176 | if (queue >= HALF_QUEUES) | 176 | if (queue >= HALF_QUEUES) |
| 177 | return (__raw_readl(&qmgr_regs->statf_h) >> | 177 | return (__raw_readl(&qmgr_regs->statf_h) >> |
| 178 | (queue - HALF_QUEUES)) & 0x01; | 178 | (queue - HALF_QUEUES)) & 0x01; |
diff --git a/arch/arm/mach-ixp4xx/ixp4xx_npe.c b/arch/arm/mach-ixp4xx/ixp4xx_npe.c index a17ed79207a4..d4eb09a62863 100644 --- a/arch/arm/mach-ixp4xx/ixp4xx_npe.c +++ b/arch/arm/mach-ixp4xx/ixp4xx_npe.c | |||
| @@ -116,7 +116,11 @@ | |||
| 116 | /* NPE mailbox_status value for reset */ | 116 | /* NPE mailbox_status value for reset */ |
| 117 | #define RESET_MBOX_STAT 0x0000F0F0 | 117 | #define RESET_MBOX_STAT 0x0000F0F0 |
| 118 | 118 | ||
| 119 | const char *npe_names[] = { "NPE-A", "NPE-B", "NPE-C" }; | 119 | #define NPE_A_FIRMWARE "NPE-A" |
| 120 | #define NPE_B_FIRMWARE "NPE-B" | ||
| 121 | #define NPE_C_FIRMWARE "NPE-C" | ||
| 122 | |||
| 123 | const char *npe_names[] = { NPE_A_FIRMWARE, NPE_B_FIRMWARE, NPE_C_FIRMWARE }; | ||
| 120 | 124 | ||
| 121 | #define print_npe(pri, npe, fmt, ...) \ | 125 | #define print_npe(pri, npe, fmt, ...) \ |
| 122 | printk(pri "%s: " fmt, npe_name(npe), ## __VA_ARGS__) | 126 | printk(pri "%s: " fmt, npe_name(npe), ## __VA_ARGS__) |
| @@ -724,6 +728,9 @@ module_exit(npe_cleanup_module); | |||
| 724 | 728 | ||
| 725 | MODULE_AUTHOR("Krzysztof Halasa"); | 729 | MODULE_AUTHOR("Krzysztof Halasa"); |
| 726 | MODULE_LICENSE("GPL v2"); | 730 | MODULE_LICENSE("GPL v2"); |
| 731 | MODULE_FIRMWARE(NPE_A_FIRMWARE); | ||
| 732 | MODULE_FIRMWARE(NPE_B_FIRMWARE); | ||
| 733 | MODULE_FIRMWARE(NPE_C_FIRMWARE); | ||
| 727 | 734 | ||
| 728 | EXPORT_SYMBOL(npe_names); | 735 | EXPORT_SYMBOL(npe_names); |
| 729 | EXPORT_SYMBOL(npe_running); | 736 | EXPORT_SYMBOL(npe_running); |
diff --git a/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c b/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c index 852f7c9f87d0..9d1b6b7c394c 100644 --- a/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c +++ b/arch/arm/mach-ixp4xx/ixp4xx_qmgr.c | |||
| @@ -14,7 +14,7 @@ | |||
| 14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
| 15 | #include <mach/qmgr.h> | 15 | #include <mach/qmgr.h> |
| 16 | 16 | ||
| 17 | struct qmgr_regs __iomem *qmgr_regs; | 17 | static struct qmgr_regs __iomem *qmgr_regs = IXP4XX_QMGR_BASE_VIRT; |
| 18 | static struct resource *mem_res; | 18 | static struct resource *mem_res; |
| 19 | static spinlock_t qmgr_lock; | 19 | static spinlock_t qmgr_lock; |
| 20 | static u32 used_sram_bitmap[4]; /* 128 16-dword pages */ | 20 | static u32 used_sram_bitmap[4]; /* 128 16-dword pages */ |
| @@ -293,12 +293,6 @@ static int qmgr_init(void) | |||
| 293 | if (mem_res == NULL) | 293 | if (mem_res == NULL) |
| 294 | return -EBUSY; | 294 | return -EBUSY; |
| 295 | 295 | ||
| 296 | qmgr_regs = ioremap(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE); | ||
| 297 | if (qmgr_regs == NULL) { | ||
| 298 | err = -ENOMEM; | ||
| 299 | goto error_map; | ||
| 300 | } | ||
| 301 | |||
| 302 | /* reset qmgr registers */ | 296 | /* reset qmgr registers */ |
| 303 | for (i = 0; i < 4; i++) { | 297 | for (i = 0; i < 4; i++) { |
| 304 | __raw_writel(0x33333333, &qmgr_regs->stat1[i]); | 298 | __raw_writel(0x33333333, &qmgr_regs->stat1[i]); |
| @@ -347,8 +341,6 @@ static int qmgr_init(void) | |||
| 347 | error_irq2: | 341 | error_irq2: |
| 348 | free_irq(IRQ_IXP4XX_QM1, NULL); | 342 | free_irq(IRQ_IXP4XX_QM1, NULL); |
| 349 | error_irq: | 343 | error_irq: |
| 350 | iounmap(qmgr_regs); | ||
| 351 | error_map: | ||
| 352 | release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE); | 344 | release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE); |
| 353 | return err; | 345 | return err; |
| 354 | } | 346 | } |
| @@ -359,7 +351,6 @@ static void qmgr_remove(void) | |||
| 359 | free_irq(IRQ_IXP4XX_QM2, NULL); | 351 | free_irq(IRQ_IXP4XX_QM2, NULL); |
| 360 | synchronize_irq(IRQ_IXP4XX_QM1); | 352 | synchronize_irq(IRQ_IXP4XX_QM1); |
| 361 | synchronize_irq(IRQ_IXP4XX_QM2); | 353 | synchronize_irq(IRQ_IXP4XX_QM2); |
| 362 | iounmap(qmgr_regs); | ||
| 363 | release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE); | 354 | release_mem_region(IXP4XX_QMGR_BASE_PHYS, IXP4XX_QMGR_REGION_SIZE); |
| 364 | } | 355 | } |
| 365 | 356 | ||
| @@ -369,7 +360,6 @@ module_exit(qmgr_remove); | |||
| 369 | MODULE_LICENSE("GPL v2"); | 360 | MODULE_LICENSE("GPL v2"); |
| 370 | MODULE_AUTHOR("Krzysztof Halasa"); | 361 | MODULE_AUTHOR("Krzysztof Halasa"); |
| 371 | 362 | ||
| 372 | EXPORT_SYMBOL(qmgr_regs); | ||
| 373 | EXPORT_SYMBOL(qmgr_set_irq); | 363 | EXPORT_SYMBOL(qmgr_set_irq); |
| 374 | EXPORT_SYMBOL(qmgr_enable_irq); | 364 | EXPORT_SYMBOL(qmgr_enable_irq); |
| 375 | EXPORT_SYMBOL(qmgr_disable_irq); | 365 | EXPORT_SYMBOL(qmgr_disable_irq); |
diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index ec544918b12c..74fc5a074fc4 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c | |||
| @@ -207,14 +207,19 @@ static int __init kirkwood_pcie_setup(int nr, struct pci_sys_data *sys) | |||
| 207 | return 1; | 207 | return 1; |
| 208 | } | 208 | } |
| 209 | 209 | ||
| 210 | /* | ||
| 211 | * The root complex has a hardwired class of PCI_CLASS_MEMORY_OTHER, when it | ||
| 212 | * is operating as a root complex this needs to be switched to | ||
| 213 | * PCI_CLASS_BRIDGE_HOST or Linux will errantly try to process the BAR's on | ||
| 214 | * the device. Decoding setup is handled by the orion code. | ||
| 215 | */ | ||
| 210 | static void __devinit rc_pci_fixup(struct pci_dev *dev) | 216 | static void __devinit rc_pci_fixup(struct pci_dev *dev) |
| 211 | { | 217 | { |
| 212 | /* | ||
| 213 | * Prevent enumeration of root complex. | ||
| 214 | */ | ||
| 215 | if (dev->bus->parent == NULL && dev->devfn == 0) { | 218 | if (dev->bus->parent == NULL && dev->devfn == 0) { |
| 216 | int i; | 219 | int i; |
| 217 | 220 | ||
| 221 | dev->class &= 0xff; | ||
| 222 | dev->class |= PCI_CLASS_BRIDGE_HOST << 8; | ||
| 218 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { | 223 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { |
| 219 | dev->resource[i].start = 0; | 224 | dev->resource[i].start = 0; |
| 220 | dev->resource[i].end = 0; | 225 | dev->resource[i].end = 0; |
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index fe40d9e488c9..d6721a7f4c3b 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
| @@ -184,8 +184,6 @@ obj-$(CONFIG_HW_PERF_EVENTS) += pmu.o | |||
| 184 | obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o | 184 | obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o |
| 185 | mailbox_mach-objs := mailbox.o | 185 | mailbox_mach-objs := mailbox.o |
| 186 | 186 | ||
| 187 | obj-$(CONFIG_OMAP_IOMMU) += iommu2.o | ||
| 188 | |||
| 189 | iommu-$(CONFIG_OMAP_IOMMU) := omap-iommu.o | 187 | iommu-$(CONFIG_OMAP_IOMMU) := omap-iommu.o |
| 190 | obj-y += $(iommu-m) $(iommu-y) | 188 | obj-y += $(iommu-m) $(iommu-y) |
| 191 | 189 | ||
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 48d5e41dfbfa..378590694447 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
| @@ -580,6 +580,11 @@ static void __init igep_wlan_bt_init(void) | |||
| 580 | } else | 580 | } else |
| 581 | return; | 581 | return; |
| 582 | 582 | ||
| 583 | /* Make sure that the GPIO pins are muxed correctly */ | ||
| 584 | omap_mux_init_gpio(igep_wlan_bt_gpios[0].gpio, OMAP_PIN_OUTPUT); | ||
| 585 | omap_mux_init_gpio(igep_wlan_bt_gpios[1].gpio, OMAP_PIN_OUTPUT); | ||
| 586 | omap_mux_init_gpio(igep_wlan_bt_gpios[2].gpio, OMAP_PIN_OUTPUT); | ||
| 587 | |||
| 583 | err = gpio_request_array(igep_wlan_bt_gpios, | 588 | err = gpio_request_array(igep_wlan_bt_gpios, |
| 584 | ARRAY_SIZE(igep_wlan_bt_gpios)); | 589 | ARRAY_SIZE(igep_wlan_bt_gpios)); |
| 585 | if (err) { | 590 | if (err) { |
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c index 6efc30c961a5..067c486fe295 100644 --- a/arch/arm/mach-omap2/clock44xx_data.c +++ b/arch/arm/mach-omap2/clock44xx_data.c | |||
| @@ -1316,16 +1316,6 @@ static struct clk dmic_fck = { | |||
| 1316 | .clkdm_name = "abe_clkdm", | 1316 | .clkdm_name = "abe_clkdm", |
| 1317 | }; | 1317 | }; |
| 1318 | 1318 | ||
| 1319 | static struct clk dsp_fck = { | ||
| 1320 | .name = "dsp_fck", | ||
| 1321 | .ops = &clkops_omap2_dflt, | ||
| 1322 | .enable_reg = OMAP4430_CM_TESLA_TESLA_CLKCTRL, | ||
| 1323 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL, | ||
| 1324 | .clkdm_name = "tesla_clkdm", | ||
| 1325 | .parent = &dpll_iva_m4x2_ck, | ||
| 1326 | .recalc = &followparent_recalc, | ||
| 1327 | }; | ||
| 1328 | |||
| 1329 | static struct clk dss_sys_clk = { | 1319 | static struct clk dss_sys_clk = { |
| 1330 | .name = "dss_sys_clk", | 1320 | .name = "dss_sys_clk", |
| 1331 | .ops = &clkops_omap2_dflt, | 1321 | .ops = &clkops_omap2_dflt, |
| @@ -1696,16 +1686,6 @@ static struct clk i2c4_fck = { | |||
| 1696 | .recalc = &followparent_recalc, | 1686 | .recalc = &followparent_recalc, |
| 1697 | }; | 1687 | }; |
| 1698 | 1688 | ||
| 1699 | static struct clk ipu_fck = { | ||
| 1700 | .name = "ipu_fck", | ||
| 1701 | .ops = &clkops_omap2_dflt, | ||
| 1702 | .enable_reg = OMAP4430_CM_DUCATI_DUCATI_CLKCTRL, | ||
| 1703 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL, | ||
| 1704 | .clkdm_name = "ducati_clkdm", | ||
| 1705 | .parent = &ducati_clk_mux_ck, | ||
| 1706 | .recalc = &followparent_recalc, | ||
| 1707 | }; | ||
| 1708 | |||
| 1709 | static struct clk iss_ctrlclk = { | 1689 | static struct clk iss_ctrlclk = { |
| 1710 | .name = "iss_ctrlclk", | 1690 | .name = "iss_ctrlclk", |
| 1711 | .ops = &clkops_omap2_dflt, | 1691 | .ops = &clkops_omap2_dflt, |
| @@ -3151,7 +3131,6 @@ static struct omap_clk omap44xx_clks[] = { | |||
| 3151 | CLK(NULL, "div_ts_ck", &div_ts_ck, CK_446X), | 3131 | CLK(NULL, "div_ts_ck", &div_ts_ck, CK_446X), |
| 3152 | CLK(NULL, "dmic_sync_mux_ck", &dmic_sync_mux_ck, CK_443X), | 3132 | CLK(NULL, "dmic_sync_mux_ck", &dmic_sync_mux_ck, CK_443X), |
| 3153 | CLK(NULL, "dmic_fck", &dmic_fck, CK_443X), | 3133 | CLK(NULL, "dmic_fck", &dmic_fck, CK_443X), |
| 3154 | CLK(NULL, "dsp_fck", &dsp_fck, CK_443X), | ||
| 3155 | CLK(NULL, "dss_sys_clk", &dss_sys_clk, CK_443X), | 3134 | CLK(NULL, "dss_sys_clk", &dss_sys_clk, CK_443X), |
| 3156 | CLK(NULL, "dss_tv_clk", &dss_tv_clk, CK_443X), | 3135 | CLK(NULL, "dss_tv_clk", &dss_tv_clk, CK_443X), |
| 3157 | CLK(NULL, "dss_48mhz_clk", &dss_48mhz_clk, CK_443X), | 3136 | CLK(NULL, "dss_48mhz_clk", &dss_48mhz_clk, CK_443X), |
| @@ -3183,7 +3162,6 @@ static struct omap_clk omap44xx_clks[] = { | |||
| 3183 | CLK(NULL, "i2c2_fck", &i2c2_fck, CK_443X), | 3162 | CLK(NULL, "i2c2_fck", &i2c2_fck, CK_443X), |
| 3184 | CLK(NULL, "i2c3_fck", &i2c3_fck, CK_443X), | 3163 | CLK(NULL, "i2c3_fck", &i2c3_fck, CK_443X), |
| 3185 | CLK(NULL, "i2c4_fck", &i2c4_fck, CK_443X), | 3164 | CLK(NULL, "i2c4_fck", &i2c4_fck, CK_443X), |
| 3186 | CLK(NULL, "ipu_fck", &ipu_fck, CK_443X), | ||
| 3187 | CLK(NULL, "iss_ctrlclk", &iss_ctrlclk, CK_443X), | 3165 | CLK(NULL, "iss_ctrlclk", &iss_ctrlclk, CK_443X), |
| 3188 | CLK(NULL, "iss_fck", &iss_fck, CK_443X), | 3166 | CLK(NULL, "iss_fck", &iss_fck, CK_443X), |
| 3189 | CLK(NULL, "iva_fck", &iva_fck, CK_443X), | 3167 | CLK(NULL, "iva_fck", &iva_fck, CK_443X), |
diff --git a/arch/arm/mach-omap2/common-board-devices.c b/arch/arm/mach-omap2/common-board-devices.c index 48daac2581b4..84551f205e46 100644 --- a/arch/arm/mach-omap2/common-board-devices.c +++ b/arch/arm/mach-omap2/common-board-devices.c | |||
| @@ -64,30 +64,36 @@ void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce, | |||
| 64 | struct spi_board_info *spi_bi = &ads7846_spi_board_info; | 64 | struct spi_board_info *spi_bi = &ads7846_spi_board_info; |
| 65 | int err; | 65 | int err; |
| 66 | 66 | ||
| 67 | err = gpio_request_one(gpio_pendown, GPIOF_IN, "TSPenDown"); | 67 | /* |
| 68 | if (err) { | 68 | * If a board defines get_pendown_state() function, request the pendown |
| 69 | pr_err("Couldn't obtain gpio for TSPenDown: %d\n", err); | 69 | * GPIO and set the GPIO debounce time. |
| 70 | return; | 70 | * If a board does not define the get_pendown_state() function, then |
| 71 | } | 71 | * the ads7846 driver will setup the pendown GPIO itself. |
| 72 | */ | ||
| 73 | if (board_pdata && board_pdata->get_pendown_state) { | ||
| 74 | err = gpio_request_one(gpio_pendown, GPIOF_IN, "TSPenDown"); | ||
| 75 | if (err) { | ||
| 76 | pr_err("Couldn't obtain gpio for TSPenDown: %d\n", err); | ||
| 77 | return; | ||
| 78 | } | ||
| 72 | 79 | ||
| 73 | if (gpio_debounce) | 80 | if (gpio_debounce) |
| 74 | gpio_set_debounce(gpio_pendown, gpio_debounce); | 81 | gpio_set_debounce(gpio_pendown, gpio_debounce); |
| 82 | |||
| 83 | gpio_export(gpio_pendown, 0); | ||
| 84 | } | ||
| 75 | 85 | ||
| 76 | spi_bi->bus_num = bus_num; | 86 | spi_bi->bus_num = bus_num; |
| 77 | spi_bi->irq = gpio_to_irq(gpio_pendown); | 87 | spi_bi->irq = gpio_to_irq(gpio_pendown); |
| 78 | 88 | ||
| 89 | ads7846_config.gpio_pendown = gpio_pendown; | ||
| 90 | |||
| 79 | if (board_pdata) { | 91 | if (board_pdata) { |
| 80 | board_pdata->gpio_pendown = gpio_pendown; | 92 | board_pdata->gpio_pendown = gpio_pendown; |
| 93 | board_pdata->gpio_pendown_debounce = gpio_debounce; | ||
| 81 | spi_bi->platform_data = board_pdata; | 94 | spi_bi->platform_data = board_pdata; |
| 82 | if (board_pdata->get_pendown_state) | ||
| 83 | gpio_export(gpio_pendown, 0); | ||
| 84 | } else { | ||
| 85 | ads7846_config.gpio_pendown = gpio_pendown; | ||
| 86 | } | 95 | } |
| 87 | 96 | ||
| 88 | if (!board_pdata || (board_pdata && !board_pdata->get_pendown_state)) | ||
| 89 | gpio_free(gpio_pendown); | ||
| 90 | |||
| 91 | spi_register_board_info(&ads7846_spi_board_info, 1); | 97 | spi_register_board_info(&ads7846_spi_board_info, 1); |
| 92 | } | 98 | } |
| 93 | #else | 99 | #else |
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index c72b5a727720..787a996ec4eb 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
| @@ -127,7 +127,7 @@ static struct platform_device omap2cam_device = { | |||
| 127 | 127 | ||
| 128 | #if defined(CONFIG_IOMMU_API) | 128 | #if defined(CONFIG_IOMMU_API) |
| 129 | 129 | ||
| 130 | #include <plat/iommu.h> | 130 | #include <linux/platform_data/iommu-omap.h> |
| 131 | 131 | ||
| 132 | static struct resource omap3isp_resources[] = { | 132 | static struct resource omap3isp_resources[] = { |
| 133 | { | 133 | { |
| @@ -214,7 +214,7 @@ static struct platform_device omap3isp_device = { | |||
| 214 | }; | 214 | }; |
| 215 | 215 | ||
| 216 | static struct omap_iommu_arch_data omap3_isp_iommu = { | 216 | static struct omap_iommu_arch_data omap3_isp_iommu = { |
| 217 | .name = "isp", | 217 | .name = "mmu_isp", |
| 218 | }; | 218 | }; |
| 219 | 219 | ||
| 220 | int omap3_init_camera(struct isp_platform_data *pdata) | 220 | int omap3_init_camera(struct isp_platform_data *pdata) |
diff --git a/arch/arm/mach-omap2/omap-iommu.c b/arch/arm/mach-omap2/omap-iommu.c index df298d46707c..7642fc4672c1 100644 --- a/arch/arm/mach-omap2/omap-iommu.c +++ b/arch/arm/mach-omap2/omap-iommu.c | |||
| @@ -12,153 +12,60 @@ | |||
| 12 | 12 | ||
| 13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
| 14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
| 15 | #include <linux/err.h> | ||
| 16 | #include <linux/slab.h> | ||
| 15 | 17 | ||
| 16 | #include <plat/iommu.h> | 18 | #include <linux/platform_data/iommu-omap.h> |
| 19 | #include <plat/omap_hwmod.h> | ||
| 20 | #include <plat/omap_device.h> | ||
| 17 | 21 | ||
| 18 | #include "soc.h" | 22 | static int __init omap_iommu_dev_init(struct omap_hwmod *oh, void *unused) |
| 19 | #include "common.h" | ||
| 20 | |||
| 21 | struct iommu_device { | ||
| 22 | resource_size_t base; | ||
| 23 | int irq; | ||
| 24 | struct iommu_platform_data pdata; | ||
| 25 | struct resource res[2]; | ||
| 26 | }; | ||
| 27 | static struct iommu_device *devices; | ||
| 28 | static int num_iommu_devices; | ||
| 29 | |||
| 30 | #ifdef CONFIG_ARCH_OMAP3 | ||
| 31 | static struct iommu_device omap3_devices[] = { | ||
| 32 | { | ||
| 33 | .base = 0x480bd400, | ||
| 34 | .irq = 24 + OMAP_INTC_START, | ||
| 35 | .pdata = { | ||
| 36 | .name = "isp", | ||
| 37 | .nr_tlb_entries = 8, | ||
| 38 | .clk_name = "cam_ick", | ||
| 39 | .da_start = 0x0, | ||
| 40 | .da_end = 0xFFFFF000, | ||
| 41 | }, | ||
| 42 | }, | ||
| 43 | #if defined(CONFIG_OMAP_IOMMU_IVA2) | ||
| 44 | { | ||
| 45 | .base = 0x5d000000, | ||
| 46 | .irq = 28 + OMAP_INTC_START, | ||
| 47 | .pdata = { | ||
| 48 | .name = "iva2", | ||
| 49 | .nr_tlb_entries = 32, | ||
| 50 | .clk_name = "iva2_ck", | ||
| 51 | .da_start = 0x11000000, | ||
| 52 | .da_end = 0xFFFFF000, | ||
| 53 | }, | ||
| 54 | }, | ||
| 55 | #endif | ||
| 56 | }; | ||
| 57 | #define NR_OMAP3_IOMMU_DEVICES ARRAY_SIZE(omap3_devices) | ||
| 58 | static struct platform_device *omap3_iommu_pdev[NR_OMAP3_IOMMU_DEVICES]; | ||
| 59 | #else | ||
| 60 | #define omap3_devices NULL | ||
| 61 | #define NR_OMAP3_IOMMU_DEVICES 0 | ||
| 62 | #define omap3_iommu_pdev NULL | ||
| 63 | #endif | ||
| 64 | |||
| 65 | #ifdef CONFIG_ARCH_OMAP4 | ||
| 66 | static struct iommu_device omap4_devices[] = { | ||
| 67 | { | ||
| 68 | .base = OMAP4_MMU1_BASE, | ||
| 69 | .irq = 100 + OMAP44XX_IRQ_GIC_START, | ||
| 70 | .pdata = { | ||
| 71 | .name = "ducati", | ||
| 72 | .nr_tlb_entries = 32, | ||
| 73 | .clk_name = "ipu_fck", | ||
| 74 | .da_start = 0x0, | ||
| 75 | .da_end = 0xFFFFF000, | ||
| 76 | }, | ||
| 77 | }, | ||
| 78 | { | ||
| 79 | .base = OMAP4_MMU2_BASE, | ||
| 80 | .irq = 28 + OMAP44XX_IRQ_GIC_START, | ||
| 81 | .pdata = { | ||
| 82 | .name = "tesla", | ||
| 83 | .nr_tlb_entries = 32, | ||
| 84 | .clk_name = "dsp_fck", | ||
| 85 | .da_start = 0x0, | ||
| 86 | .da_end = 0xFFFFF000, | ||
| 87 | }, | ||
| 88 | }, | ||
| 89 | }; | ||
| 90 | #define NR_OMAP4_IOMMU_DEVICES ARRAY_SIZE(omap4_devices) | ||
| 91 | static struct platform_device *omap4_iommu_pdev[NR_OMAP4_IOMMU_DEVICES]; | ||
| 92 | #else | ||
| 93 | #define omap4_devices NULL | ||
| 94 | #define NR_OMAP4_IOMMU_DEVICES 0 | ||
| 95 | #define omap4_iommu_pdev NULL | ||
| 96 | #endif | ||
| 97 | |||
| 98 | static struct platform_device **omap_iommu_pdev; | ||
| 99 | |||
| 100 | static int __init omap_iommu_init(void) | ||
| 101 | { | 23 | { |
| 102 | int i, err; | 24 | struct platform_device *pdev; |
| 103 | struct resource res[] = { | 25 | struct iommu_platform_data *pdata; |
| 104 | { .flags = IORESOURCE_MEM }, | 26 | struct omap_mmu_dev_attr *a = (struct omap_mmu_dev_attr *)oh->dev_attr; |
| 105 | { .flags = IORESOURCE_IRQ }, | 27 | static int i; |
| 106 | }; | 28 | |
| 29 | pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); | ||
| 30 | if (!pdata) | ||
| 31 | return -ENOMEM; | ||
| 32 | |||
| 33 | pdata->name = oh->name; | ||
| 34 | pdata->nr_tlb_entries = a->nr_tlb_entries; | ||
| 35 | pdata->da_start = a->da_start; | ||
| 36 | pdata->da_end = a->da_end; | ||
| 37 | |||
| 38 | if (oh->rst_lines_cnt == 1) { | ||
| 39 | pdata->reset_name = oh->rst_lines->name; | ||
| 40 | pdata->assert_reset = omap_device_assert_hardreset; | ||
| 41 | pdata->deassert_reset = omap_device_deassert_hardreset; | ||
| 42 | } | ||
| 107 | 43 | ||
| 108 | if (cpu_is_omap34xx()) { | 44 | pdev = omap_device_build("omap-iommu", i, oh, pdata, sizeof(*pdata), |
| 109 | devices = omap3_devices; | 45 | NULL, 0, 0); |
| 110 | omap_iommu_pdev = omap3_iommu_pdev; | ||
| 111 | num_iommu_devices = NR_OMAP3_IOMMU_DEVICES; | ||
| 112 | } else if (cpu_is_omap44xx()) { | ||
| 113 | devices = omap4_devices; | ||
| 114 | omap_iommu_pdev = omap4_iommu_pdev; | ||
| 115 | num_iommu_devices = NR_OMAP4_IOMMU_DEVICES; | ||
| 116 | } else | ||
| 117 | return -ENODEV; | ||
| 118 | 46 | ||
| 119 | for (i = 0; i < num_iommu_devices; i++) { | 47 | kfree(pdata); |
| 120 | struct platform_device *pdev; | ||
| 121 | const struct iommu_device *d = &devices[i]; | ||
| 122 | 48 | ||
| 123 | pdev = platform_device_alloc("omap-iommu", i); | 49 | if (IS_ERR(pdev)) { |
| 124 | if (!pdev) { | 50 | pr_err("%s: device build err: %ld\n", __func__, PTR_ERR(pdev)); |
| 125 | err = -ENOMEM; | 51 | return PTR_ERR(pdev); |
| 126 | goto err_out; | 52 | } |
| 127 | } | ||
| 128 | 53 | ||
| 129 | res[0].start = d->base; | 54 | i++; |
| 130 | res[0].end = d->base + MMU_REG_SIZE - 1; | ||
| 131 | res[1].start = res[1].end = d->irq; | ||
| 132 | 55 | ||
| 133 | err = platform_device_add_resources(pdev, res, | ||
| 134 | ARRAY_SIZE(res)); | ||
| 135 | if (err) | ||
| 136 | goto err_out; | ||
| 137 | err = platform_device_add_data(pdev, &d->pdata, | ||
| 138 | sizeof(d->pdata)); | ||
| 139 | if (err) | ||
| 140 | goto err_out; | ||
| 141 | err = platform_device_add(pdev); | ||
| 142 | if (err) | ||
| 143 | goto err_out; | ||
| 144 | omap_iommu_pdev[i] = pdev; | ||
| 145 | } | ||
| 146 | return 0; | 56 | return 0; |
| 57 | } | ||
| 147 | 58 | ||
| 148 | err_out: | 59 | static int __init omap_iommu_init(void) |
| 149 | while (i--) | 60 | { |
| 150 | platform_device_put(omap_iommu_pdev[i]); | 61 | return omap_hwmod_for_each_by_class("mmu", omap_iommu_dev_init, NULL); |
| 151 | return err; | ||
| 152 | } | 62 | } |
| 153 | /* must be ready before omap3isp is probed */ | 63 | /* must be ready before omap3isp is probed */ |
| 154 | subsys_initcall(omap_iommu_init); | 64 | subsys_initcall(omap_iommu_init); |
| 155 | 65 | ||
| 156 | static void __exit omap_iommu_exit(void) | 66 | static void __exit omap_iommu_exit(void) |
| 157 | { | 67 | { |
| 158 | int i; | 68 | /* Do nothing */ |
| 159 | |||
| 160 | for (i = 0; i < num_iommu_devices; i++) | ||
| 161 | platform_device_unregister(omap_iommu_pdev[i]); | ||
| 162 | } | 69 | } |
| 163 | module_exit(omap_iommu_exit); | 70 | module_exit(omap_iommu_exit); |
| 164 | 71 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index f67b7ee07dd4..621bc7137233 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
| @@ -26,8 +26,8 @@ | |||
| 26 | #include <plat/mmc.h> | 26 | #include <plat/mmc.h> |
| 27 | #include <linux/platform_data/asoc-ti-mcbsp.h> | 27 | #include <linux/platform_data/asoc-ti-mcbsp.h> |
| 28 | #include <linux/platform_data/spi-omap2-mcspi.h> | 28 | #include <linux/platform_data/spi-omap2-mcspi.h> |
| 29 | #include <linux/platform_data/iommu-omap.h> | ||
| 29 | #include <plat/dmtimer.h> | 30 | #include <plat/dmtimer.h> |
| 30 | #include <plat/iommu.h> | ||
| 31 | 31 | ||
| 32 | #include "am35xx.h" | 32 | #include "am35xx.h" |
| 33 | 33 | ||
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 0b1249e00398..4b985b9b81d0 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
| @@ -28,10 +28,10 @@ | |||
| 28 | #include <plat/dma.h> | 28 | #include <plat/dma.h> |
| 29 | #include <linux/platform_data/spi-omap2-mcspi.h> | 29 | #include <linux/platform_data/spi-omap2-mcspi.h> |
| 30 | #include <linux/platform_data/asoc-ti-mcbsp.h> | 30 | #include <linux/platform_data/asoc-ti-mcbsp.h> |
| 31 | #include <linux/platform_data/iommu-omap.h> | ||
| 31 | #include <plat/mmc.h> | 32 | #include <plat/mmc.h> |
| 32 | #include <plat/dmtimer.h> | 33 | #include <plat/dmtimer.h> |
| 33 | #include <plat/common.h> | 34 | #include <plat/common.h> |
| 34 | #include <plat/iommu.h> | ||
| 35 | 35 | ||
| 36 | #include "omap_hwmod_common_data.h" | 36 | #include "omap_hwmod_common_data.h" |
| 37 | #include "cm1_44xx.h" | 37 | #include "cm1_44xx.h" |
| @@ -651,7 +651,7 @@ static struct omap_hwmod omap44xx_dsp_hwmod = { | |||
| 651 | .mpu_irqs = omap44xx_dsp_irqs, | 651 | .mpu_irqs = omap44xx_dsp_irqs, |
| 652 | .rst_lines = omap44xx_dsp_resets, | 652 | .rst_lines = omap44xx_dsp_resets, |
| 653 | .rst_lines_cnt = ARRAY_SIZE(omap44xx_dsp_resets), | 653 | .rst_lines_cnt = ARRAY_SIZE(omap44xx_dsp_resets), |
| 654 | .main_clk = "dsp_fck", | 654 | .main_clk = "dpll_iva_m4x2_ck", |
| 655 | .prcm = { | 655 | .prcm = { |
| 656 | .omap4 = { | 656 | .omap4 = { |
| 657 | .clkctrl_offs = OMAP4_CM_TESLA_TESLA_CLKCTRL_OFFSET, | 657 | .clkctrl_offs = OMAP4_CM_TESLA_TESLA_CLKCTRL_OFFSET, |
| @@ -1678,7 +1678,7 @@ static struct omap_hwmod omap44xx_ipu_hwmod = { | |||
| 1678 | .mpu_irqs = omap44xx_ipu_irqs, | 1678 | .mpu_irqs = omap44xx_ipu_irqs, |
| 1679 | .rst_lines = omap44xx_ipu_resets, | 1679 | .rst_lines = omap44xx_ipu_resets, |
| 1680 | .rst_lines_cnt = ARRAY_SIZE(omap44xx_ipu_resets), | 1680 | .rst_lines_cnt = ARRAY_SIZE(omap44xx_ipu_resets), |
| 1681 | .main_clk = "ipu_fck", | 1681 | .main_clk = "ducati_clk_mux_ck", |
| 1682 | .prcm = { | 1682 | .prcm = { |
| 1683 | .omap4 = { | 1683 | .omap4 = { |
| 1684 | .clkctrl_offs = OMAP4_CM_DUCATI_DUCATI_CLKCTRL_OFFSET, | 1684 | .clkctrl_offs = OMAP4_CM_DUCATI_DUCATI_CLKCTRL_OFFSET, |
diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index 44c42057b61c..a256135d8e48 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c | |||
| @@ -73,6 +73,7 @@ void __init omap4_pmic_init(const char *pmic_type, | |||
| 73 | { | 73 | { |
| 74 | /* PMIC part*/ | 74 | /* PMIC part*/ |
| 75 | omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE); | 75 | omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE); |
| 76 | omap_mux_init_signal("fref_clk0_out.sys_drm_msecure", OMAP_PIN_OUTPUT); | ||
| 76 | omap_pmic_init(1, 400, pmic_type, 7 + OMAP44XX_IRQ_GIC_START, pmic_data); | 77 | omap_pmic_init(1, 400, pmic_type, 7 + OMAP44XX_IRQ_GIC_START, pmic_data); |
| 77 | 78 | ||
| 78 | /* Register additional devices on i2c1 bus if needed */ | 79 | /* Register additional devices on i2c1 bus if needed */ |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 86b8b480634f..09c5233f4dfc 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
| @@ -89,7 +89,7 @@ ENTRY(cpu_v6_dcache_clean_area) | |||
| 89 | mov pc, lr | 89 | mov pc, lr |
| 90 | 90 | ||
| 91 | /* | 91 | /* |
| 92 | * cpu_arm926_switch_mm(pgd_phys, tsk) | 92 | * cpu_v6_switch_mm(pgd_phys, tsk) |
| 93 | * | 93 | * |
| 94 | * Set the translation table base pointer to be pgd_phys | 94 | * Set the translation table base pointer to be pgd_phys |
| 95 | * | 95 | * |
diff --git a/arch/arm/plat-omap/i2c.c b/arch/arm/plat-omap/i2c.c index a5683a84c6ee..6013831a043e 100644 --- a/arch/arm/plat-omap/i2c.c +++ b/arch/arm/plat-omap/i2c.c | |||
| @@ -26,12 +26,14 @@ | |||
| 26 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
| 27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
| 28 | #include <linux/i2c.h> | 28 | #include <linux/i2c.h> |
| 29 | #include <linux/i2c-omap.h> | ||
| 29 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
| 30 | #include <linux/err.h> | 31 | #include <linux/err.h> |
| 31 | #include <linux/clk.h> | 32 | #include <linux/clk.h> |
| 32 | 33 | ||
| 33 | #include <mach/irqs.h> | 34 | #include <mach/irqs.h> |
| 34 | #include <plat/i2c.h> | 35 | #include <plat/i2c.h> |
| 36 | #include <plat/omap-pm.h> | ||
| 35 | #include <plat/omap_device.h> | 37 | #include <plat/omap_device.h> |
| 36 | 38 | ||
| 37 | #define OMAP_I2C_SIZE 0x3f | 39 | #define OMAP_I2C_SIZE 0x3f |
| @@ -127,6 +129,16 @@ static inline int omap1_i2c_add_bus(int bus_id) | |||
| 127 | 129 | ||
| 128 | 130 | ||
| 129 | #ifdef CONFIG_ARCH_OMAP2PLUS | 131 | #ifdef CONFIG_ARCH_OMAP2PLUS |
| 132 | /* | ||
| 133 | * XXX This function is a temporary compatibility wrapper - only | ||
| 134 | * needed until the I2C driver can be converted to call | ||
| 135 | * omap_pm_set_max_dev_wakeup_lat() and handle a return code. | ||
| 136 | */ | ||
| 137 | static void omap_pm_set_max_mpu_wakeup_lat_compat(struct device *dev, long t) | ||
| 138 | { | ||
| 139 | omap_pm_set_max_mpu_wakeup_lat(dev, t); | ||
| 140 | } | ||
| 141 | |||
| 130 | static inline int omap2_i2c_add_bus(int bus_id) | 142 | static inline int omap2_i2c_add_bus(int bus_id) |
| 131 | { | 143 | { |
| 132 | int l; | 144 | int l; |
| @@ -158,6 +170,15 @@ static inline int omap2_i2c_add_bus(int bus_id) | |||
| 158 | dev_attr = (struct omap_i2c_dev_attr *)oh->dev_attr; | 170 | dev_attr = (struct omap_i2c_dev_attr *)oh->dev_attr; |
| 159 | pdata->flags = dev_attr->flags; | 171 | pdata->flags = dev_attr->flags; |
| 160 | 172 | ||
| 173 | /* | ||
| 174 | * When waiting for completion of a i2c transfer, we need to | ||
| 175 | * set a wake up latency constraint for the MPU. This is to | ||
| 176 | * ensure quick enough wakeup from idle, when transfer | ||
| 177 | * completes. | ||
| 178 | * Only omap3 has support for constraints | ||
| 179 | */ | ||
| 180 | if (cpu_is_omap34xx()) | ||
| 181 | pdata->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat_compat; | ||
| 161 | pdev = omap_device_build(name, bus_id, oh, pdata, | 182 | pdev = omap_device_build(name, bus_id, oh, pdata, |
| 162 | sizeof(struct omap_i2c_bus_platform_data), | 183 | sizeof(struct omap_i2c_bus_platform_data), |
| 163 | NULL, 0, 0); | 184 | NULL, 0, 0); |
diff --git a/arch/arm/plat-omap/include/plat/iommu2.h b/arch/arm/plat-omap/include/plat/iommu2.h deleted file mode 100644 index d4116b595e40..000000000000 --- a/arch/arm/plat-omap/include/plat/iommu2.h +++ /dev/null | |||
| @@ -1,96 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * omap iommu: omap2 architecture specific definitions | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2009 Nokia Corporation | ||
| 5 | * | ||
| 6 | * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef __MACH_IOMMU2_H | ||
| 14 | #define __MACH_IOMMU2_H | ||
| 15 | |||
| 16 | #include <linux/io.h> | ||
| 17 | |||
| 18 | /* | ||
| 19 | * MMU Register offsets | ||
| 20 | */ | ||
| 21 | #define MMU_REVISION 0x00 | ||
| 22 | #define MMU_SYSCONFIG 0x10 | ||
| 23 | #define MMU_SYSSTATUS 0x14 | ||
| 24 | #define MMU_IRQSTATUS 0x18 | ||
| 25 | #define MMU_IRQENABLE 0x1c | ||
| 26 | #define MMU_WALKING_ST 0x40 | ||
| 27 | #define MMU_CNTL 0x44 | ||
| 28 | #define MMU_FAULT_AD 0x48 | ||
| 29 | #define MMU_TTB 0x4c | ||
| 30 | #define MMU_LOCK 0x50 | ||
| 31 | #define MMU_LD_TLB 0x54 | ||
| 32 | #define MMU_CAM 0x58 | ||
| 33 | #define MMU_RAM 0x5c | ||
| 34 | #define MMU_GFLUSH 0x60 | ||
| 35 | #define MMU_FLUSH_ENTRY 0x64 | ||
| 36 | #define MMU_READ_CAM 0x68 | ||
| 37 | #define MMU_READ_RAM 0x6c | ||
| 38 | #define MMU_EMU_FAULT_AD 0x70 | ||
| 39 | |||
| 40 | #define MMU_REG_SIZE 256 | ||
| 41 | |||
| 42 | /* | ||
| 43 | * MMU Register bit definitions | ||
| 44 | */ | ||
| 45 | #define MMU_LOCK_BASE_SHIFT 10 | ||
| 46 | #define MMU_LOCK_BASE_MASK (0x1f << MMU_LOCK_BASE_SHIFT) | ||
| 47 | #define MMU_LOCK_BASE(x) \ | ||
| 48 | ((x & MMU_LOCK_BASE_MASK) >> MMU_LOCK_BASE_SHIFT) | ||
| 49 | |||
| 50 | #define MMU_LOCK_VICT_SHIFT 4 | ||
| 51 | #define MMU_LOCK_VICT_MASK (0x1f << MMU_LOCK_VICT_SHIFT) | ||
| 52 | #define MMU_LOCK_VICT(x) \ | ||
| 53 | ((x & MMU_LOCK_VICT_MASK) >> MMU_LOCK_VICT_SHIFT) | ||
| 54 | |||
| 55 | #define MMU_CAM_VATAG_SHIFT 12 | ||
| 56 | #define MMU_CAM_VATAG_MASK \ | ||
| 57 | ((~0UL >> MMU_CAM_VATAG_SHIFT) << MMU_CAM_VATAG_SHIFT) | ||
| 58 | #define MMU_CAM_P (1 << 3) | ||
| 59 | #define MMU_CAM_V (1 << 2) | ||
| 60 | #define MMU_CAM_PGSZ_MASK 3 | ||
| 61 | #define MMU_CAM_PGSZ_1M (0 << 0) | ||
| 62 | #define MMU_CAM_PGSZ_64K (1 << 0) | ||
| 63 | #define MMU_CAM_PGSZ_4K (2 << 0) | ||
| 64 | #define MMU_CAM_PGSZ_16M (3 << 0) | ||
| 65 | |||
| 66 | #define MMU_RAM_PADDR_SHIFT 12 | ||
| 67 | #define MMU_RAM_PADDR_MASK \ | ||
| 68 | ((~0UL >> MMU_RAM_PADDR_SHIFT) << MMU_RAM_PADDR_SHIFT) | ||
| 69 | #define MMU_RAM_ENDIAN_SHIFT 9 | ||
| 70 | #define MMU_RAM_ENDIAN_MASK (1 << MMU_RAM_ENDIAN_SHIFT) | ||
| 71 | #define MMU_RAM_ENDIAN_BIG (1 << MMU_RAM_ENDIAN_SHIFT) | ||
| 72 | #define MMU_RAM_ENDIAN_LITTLE (0 << MMU_RAM_ENDIAN_SHIFT) | ||
| 73 | #define MMU_RAM_ELSZ_SHIFT 7 | ||
| 74 | #define MMU_RAM_ELSZ_MASK (3 << MMU_RAM_ELSZ_SHIFT) | ||
| 75 | #define MMU_RAM_ELSZ_8 (0 << MMU_RAM_ELSZ_SHIFT) | ||
| 76 | #define MMU_RAM_ELSZ_16 (1 << MMU_RAM_ELSZ_SHIFT) | ||
| 77 | #define MMU_RAM_ELSZ_32 (2 << MMU_RAM_ELSZ_SHIFT) | ||
| 78 | #define MMU_RAM_ELSZ_NONE (3 << MMU_RAM_ELSZ_SHIFT) | ||
| 79 | #define MMU_RAM_MIXED_SHIFT 6 | ||
| 80 | #define MMU_RAM_MIXED_MASK (1 << MMU_RAM_MIXED_SHIFT) | ||
| 81 | #define MMU_RAM_MIXED MMU_RAM_MIXED_MASK | ||
| 82 | |||
| 83 | /* | ||
| 84 | * register accessors | ||
| 85 | */ | ||
| 86 | static inline u32 iommu_read_reg(struct omap_iommu *obj, size_t offs) | ||
| 87 | { | ||
| 88 | return __raw_readl(obj->regbase + offs); | ||
| 89 | } | ||
| 90 | |||
| 91 | static inline void iommu_write_reg(struct omap_iommu *obj, u32 val, size_t offs) | ||
| 92 | { | ||
| 93 | __raw_writel(val, obj->regbase + offs); | ||
| 94 | } | ||
| 95 | |||
| 96 | #endif /* __MACH_IOMMU2_H */ | ||
diff --git a/arch/arm/plat-omap/include/plat/iovmm.h b/arch/arm/plat-omap/include/plat/iovmm.h deleted file mode 100644 index 498e57cda6cd..000000000000 --- a/arch/arm/plat-omap/include/plat/iovmm.h +++ /dev/null | |||
| @@ -1,89 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * omap iommu: simple virtual address space management | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2009 Nokia Corporation | ||
| 5 | * | ||
| 6 | * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef __IOMMU_MMAP_H | ||
| 14 | #define __IOMMU_MMAP_H | ||
| 15 | |||
| 16 | #include <linux/iommu.h> | ||
| 17 | |||
| 18 | struct iovm_struct { | ||
| 19 | struct omap_iommu *iommu; /* iommu object which this belongs to */ | ||
| 20 | u32 da_start; /* area definition */ | ||
| 21 | u32 da_end; | ||
| 22 | u32 flags; /* IOVMF_: see below */ | ||
| 23 | struct list_head list; /* linked in ascending order */ | ||
| 24 | const struct sg_table *sgt; /* keep 'page' <-> 'da' mapping */ | ||
| 25 | void *va; /* mpu side mapped address */ | ||
| 26 | }; | ||
| 27 | |||
| 28 | /* | ||
| 29 | * IOVMF_FLAGS: attribute for iommu virtual memory area(iovma) | ||
| 30 | * | ||
| 31 | * lower 16 bit is used for h/w and upper 16 bit is for s/w. | ||
| 32 | */ | ||
| 33 | #define IOVMF_SW_SHIFT 16 | ||
| 34 | |||
| 35 | /* | ||
| 36 | * iovma: h/w flags derived from cam and ram attribute | ||
| 37 | */ | ||
| 38 | #define IOVMF_CAM_MASK (~((1 << 10) - 1)) | ||
| 39 | #define IOVMF_RAM_MASK (~IOVMF_CAM_MASK) | ||
| 40 | |||
| 41 | #define IOVMF_PGSZ_MASK (3 << 0) | ||
| 42 | #define IOVMF_PGSZ_1M MMU_CAM_PGSZ_1M | ||
| 43 | #define IOVMF_PGSZ_64K MMU_CAM_PGSZ_64K | ||
| 44 | #define IOVMF_PGSZ_4K MMU_CAM_PGSZ_4K | ||
| 45 | #define IOVMF_PGSZ_16M MMU_CAM_PGSZ_16M | ||
| 46 | |||
| 47 | #define IOVMF_ENDIAN_MASK (1 << 9) | ||
| 48 | #define IOVMF_ENDIAN_BIG MMU_RAM_ENDIAN_BIG | ||
| 49 | #define IOVMF_ENDIAN_LITTLE MMU_RAM_ENDIAN_LITTLE | ||
| 50 | |||
| 51 | #define IOVMF_ELSZ_MASK (3 << 7) | ||
| 52 | #define IOVMF_ELSZ_8 MMU_RAM_ELSZ_8 | ||
| 53 | #define IOVMF_ELSZ_16 MMU_RAM_ELSZ_16 | ||
| 54 | #define IOVMF_ELSZ_32 MMU_RAM_ELSZ_32 | ||
| 55 | #define IOVMF_ELSZ_NONE MMU_RAM_ELSZ_NONE | ||
| 56 | |||
| 57 | #define IOVMF_MIXED_MASK (1 << 6) | ||
| 58 | #define IOVMF_MIXED MMU_RAM_MIXED | ||
| 59 | |||
| 60 | /* | ||
| 61 | * iovma: s/w flags, used for mapping and umapping internally. | ||
| 62 | */ | ||
| 63 | #define IOVMF_MMIO (1 << IOVMF_SW_SHIFT) | ||
| 64 | #define IOVMF_ALLOC (2 << IOVMF_SW_SHIFT) | ||
| 65 | #define IOVMF_ALLOC_MASK (3 << IOVMF_SW_SHIFT) | ||
| 66 | |||
| 67 | /* "superpages" is supported just with physically linear pages */ | ||
| 68 | #define IOVMF_DISCONT (1 << (2 + IOVMF_SW_SHIFT)) | ||
| 69 | #define IOVMF_LINEAR (2 << (2 + IOVMF_SW_SHIFT)) | ||
| 70 | #define IOVMF_LINEAR_MASK (3 << (2 + IOVMF_SW_SHIFT)) | ||
| 71 | |||
| 72 | #define IOVMF_DA_FIXED (1 << (4 + IOVMF_SW_SHIFT)) | ||
| 73 | |||
| 74 | |||
| 75 | extern struct iovm_struct *omap_find_iovm_area(struct device *dev, u32 da); | ||
| 76 | extern u32 | ||
| 77 | omap_iommu_vmap(struct iommu_domain *domain, struct device *dev, u32 da, | ||
| 78 | const struct sg_table *sgt, u32 flags); | ||
| 79 | extern struct sg_table *omap_iommu_vunmap(struct iommu_domain *domain, | ||
| 80 | struct device *dev, u32 da); | ||
| 81 | extern u32 | ||
| 82 | omap_iommu_vmalloc(struct iommu_domain *domain, struct device *dev, | ||
| 83 | u32 da, size_t bytes, u32 flags); | ||
| 84 | extern void | ||
| 85 | omap_iommu_vfree(struct iommu_domain *domain, struct device *dev, | ||
| 86 | const u32 da); | ||
| 87 | extern void *omap_da_to_va(struct device *dev, u32 da); | ||
| 88 | |||
| 89 | #endif /* __IOMMU_MMAP_H */ | ||
diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c index db98e7021f0d..0abd1c469887 100644 --- a/arch/arm/plat-s3c24xx/dma.c +++ b/arch/arm/plat-s3c24xx/dma.c | |||
| @@ -473,12 +473,13 @@ int s3c2410_dma_enqueue(enum dma_ch channel, void *id, | |||
| 473 | pr_debug("dma%d: %s: buffer %p queued onto non-empty channel\n", | 473 | pr_debug("dma%d: %s: buffer %p queued onto non-empty channel\n", |
| 474 | chan->number, __func__, buf); | 474 | chan->number, __func__, buf); |
| 475 | 475 | ||
| 476 | if (chan->end == NULL) | 476 | if (chan->end == NULL) { |
| 477 | pr_debug("dma%d: %s: %p not empty, and chan->end==NULL?\n", | 477 | pr_debug("dma%d: %s: %p not empty, and chan->end==NULL?\n", |
| 478 | chan->number, __func__, chan); | 478 | chan->number, __func__, chan); |
| 479 | 479 | } else { | |
| 480 | chan->end->next = buf; | 480 | chan->end->next = buf; |
| 481 | chan->end = buf; | 481 | chan->end = buf; |
| 482 | } | ||
| 482 | } | 483 | } |
| 483 | 484 | ||
| 484 | /* if necessary, update the next buffer field */ | 485 | /* if necessary, update the next buffer field */ |
diff --git a/arch/arm64/include/asm/dma-mapping.h b/arch/arm64/include/asm/dma-mapping.h index 538f4b44db5d..994776894198 100644 --- a/arch/arm64/include/asm/dma-mapping.h +++ b/arch/arm64/include/asm/dma-mapping.h | |||
| @@ -50,6 +50,7 @@ static inline phys_addr_t dma_to_phys(struct device *dev, dma_addr_t dev_addr) | |||
| 50 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dev_addr) | 50 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dev_addr) |
| 51 | { | 51 | { |
| 52 | struct dma_map_ops *ops = get_dma_ops(dev); | 52 | struct dma_map_ops *ops = get_dma_ops(dev); |
| 53 | debug_dma_mapping_error(dev, dev_addr); | ||
| 53 | return ops->mapping_error(dev, dev_addr); | 54 | return ops->mapping_error(dev, dev_addr); |
| 54 | } | 55 | } |
| 55 | 56 | ||
diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 6d909faebf28..656a6f291a35 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h | |||
| @@ -392,7 +392,7 @@ __SYSCALL(367, sys_fanotify_init) | |||
| 392 | __SYSCALL(368, compat_sys_fanotify_mark_wrapper) | 392 | __SYSCALL(368, compat_sys_fanotify_mark_wrapper) |
| 393 | __SYSCALL(369, sys_prlimit64) | 393 | __SYSCALL(369, sys_prlimit64) |
| 394 | __SYSCALL(370, sys_name_to_handle_at) | 394 | __SYSCALL(370, sys_name_to_handle_at) |
| 395 | __SYSCALL(371, sys_open_by_handle_at) | 395 | __SYSCALL(371, compat_sys_open_by_handle_at) |
| 396 | __SYSCALL(372, sys_clock_adjtime) | 396 | __SYSCALL(372, sys_clock_adjtime) |
| 397 | __SYSCALL(373, sys_syncfs) | 397 | __SYSCALL(373, sys_syncfs) |
| 398 | 398 | ||
diff --git a/arch/c6x/include/asm/dma-mapping.h b/arch/c6x/include/asm/dma-mapping.h index 03579fd99dba..3c694065030f 100644 --- a/arch/c6x/include/asm/dma-mapping.h +++ b/arch/c6x/include/asm/dma-mapping.h | |||
| @@ -32,6 +32,7 @@ static inline int dma_set_mask(struct device *dev, u64 dma_mask) | |||
| 32 | */ | 32 | */ |
| 33 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 33 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
| 34 | { | 34 | { |
| 35 | debug_dma_mapping_error(dev, dma_addr); | ||
| 35 | return dma_addr == ~0; | 36 | return dma_addr == ~0; |
| 36 | } | 37 | } |
| 37 | 38 | ||
diff --git a/arch/c6x/include/asm/setup.h b/arch/c6x/include/asm/setup.h new file mode 100644 index 000000000000..ecead15872a6 --- /dev/null +++ b/arch/c6x/include/asm/setup.h | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | /* | ||
| 2 | * Port on Texas Instruments TMS320C6x architecture | ||
| 3 | * | ||
| 4 | * Copyright (C) 2004, 2009, 2010 2011 Texas Instruments Incorporated | ||
| 5 | * Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | #ifndef _ASM_C6X_SETUP_H | ||
| 12 | #define _ASM_C6X_SETUP_H | ||
| 13 | |||
| 14 | #include <uapi/asm/setup.h> | ||
| 15 | |||
| 16 | #ifndef __ASSEMBLY__ | ||
| 17 | extern char c6x_command_line[COMMAND_LINE_SIZE]; | ||
| 18 | |||
| 19 | extern int c6x_add_memory(phys_addr_t start, unsigned long size); | ||
| 20 | |||
| 21 | extern unsigned long ram_start; | ||
| 22 | extern unsigned long ram_end; | ||
| 23 | |||
| 24 | extern int c6x_num_cores; | ||
| 25 | extern unsigned int c6x_silicon_rev; | ||
| 26 | extern unsigned int c6x_devstat; | ||
| 27 | extern unsigned char c6x_fuse_mac[6]; | ||
| 28 | |||
| 29 | extern void machine_init(unsigned long dt_ptr); | ||
| 30 | extern void time_init(void); | ||
| 31 | |||
| 32 | #endif /* !__ASSEMBLY__ */ | ||
| 33 | #endif /* _ASM_C6X_SETUP_H */ | ||
diff --git a/arch/c6x/include/uapi/asm/Kbuild b/arch/c6x/include/uapi/asm/Kbuild index c312b424c433..e9bc2b2b8147 100644 --- a/arch/c6x/include/uapi/asm/Kbuild +++ b/arch/c6x/include/uapi/asm/Kbuild | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += kvm_para.h | ||
| 5 | |||
| 4 | header-y += byteorder.h | 6 | header-y += byteorder.h |
| 5 | header-y += kvm_para.h | 7 | header-y += kvm_para.h |
| 6 | header-y += ptrace.h | 8 | header-y += ptrace.h |
diff --git a/arch/c6x/include/uapi/asm/kvm_para.h b/arch/c6x/include/uapi/asm/kvm_para.h deleted file mode 100644 index 14fab8f0b957..000000000000 --- a/arch/c6x/include/uapi/asm/kvm_para.h +++ /dev/null | |||
| @@ -1 +0,0 @@ | |||
| 1 | #include <asm-generic/kvm_para.h> | ||
diff --git a/arch/c6x/include/uapi/asm/setup.h b/arch/c6x/include/uapi/asm/setup.h index a01e31896fa9..ad9ac97a8dad 100644 --- a/arch/c6x/include/uapi/asm/setup.h +++ b/arch/c6x/include/uapi/asm/setup.h | |||
| @@ -1,33 +1,6 @@ | |||
| 1 | /* | 1 | #ifndef _UAPI_ASM_C6X_SETUP_H |
| 2 | * Port on Texas Instruments TMS320C6x architecture | 2 | #define _UAPI_ASM_C6X_SETUP_H |
| 3 | * | ||
| 4 | * Copyright (C) 2004, 2009, 2010 2011 Texas Instruments Incorporated | ||
| 5 | * Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | */ | ||
| 11 | #ifndef _ASM_C6X_SETUP_H | ||
| 12 | #define _ASM_C6X_SETUP_H | ||
| 13 | 3 | ||
| 14 | #define COMMAND_LINE_SIZE 1024 | 4 | #define COMMAND_LINE_SIZE 1024 |
| 15 | 5 | ||
| 16 | #ifndef __ASSEMBLY__ | 6 | #endif /* _UAPI_ASM_C6X_SETUP_H */ |
| 17 | extern char c6x_command_line[COMMAND_LINE_SIZE]; | ||
| 18 | |||
| 19 | extern int c6x_add_memory(phys_addr_t start, unsigned long size); | ||
| 20 | |||
| 21 | extern unsigned long ram_start; | ||
| 22 | extern unsigned long ram_end; | ||
| 23 | |||
| 24 | extern int c6x_num_cores; | ||
| 25 | extern unsigned int c6x_silicon_rev; | ||
| 26 | extern unsigned int c6x_devstat; | ||
| 27 | extern unsigned char c6x_fuse_mac[6]; | ||
| 28 | |||
| 29 | extern void machine_init(unsigned long dt_ptr); | ||
| 30 | extern void time_init(void); | ||
| 31 | |||
| 32 | #endif /* !__ASSEMBLY__ */ | ||
| 33 | #endif /* _ASM_C6X_SETUP_H */ | ||
diff --git a/arch/c6x/kernel/entry.S b/arch/c6x/kernel/entry.S index 5449c36018fe..0ed6157dd256 100644 --- a/arch/c6x/kernel/entry.S +++ b/arch/c6x/kernel/entry.S | |||
| @@ -277,6 +277,8 @@ work_rescheduled: | |||
| 277 | [A1] BNOP .S1 work_resched,5 | 277 | [A1] BNOP .S1 work_resched,5 |
| 278 | 278 | ||
| 279 | work_notifysig: | 279 | work_notifysig: |
| 280 | ;; enable interrupts for do_notify_resume() | ||
| 281 | UNMASK_INT B2 | ||
| 280 | B .S2 do_notify_resume | 282 | B .S2 do_notify_resume |
| 281 | LDW .D2T1 *+SP(REGS__END+8),A6 ; syscall flag | 283 | LDW .D2T1 *+SP(REGS__END+8),A6 ; syscall flag |
| 282 | ADDKPC .S2 resume_userspace,B3,1 | 284 | ADDKPC .S2 resume_userspace,B3,1 |
| @@ -427,8 +429,7 @@ ENTRY(ret_from_kernel_execve) | |||
| 427 | ENDPROC(ret_from_kernel_execve) | 429 | ENDPROC(ret_from_kernel_execve) |
| 428 | 430 | ||
| 429 | ;; | 431 | ;; |
| 430 | ;; These are the interrupt handlers, responsible for calling __do_IRQ() | 432 | ;; These are the interrupt handlers, responsible for calling c6x_do_IRQ() |
| 431 | ;; int6 is used for syscalls (see _system_call entry) | ||
| 432 | ;; | 433 | ;; |
| 433 | .macro SAVE_ALL_INT | 434 | .macro SAVE_ALL_INT |
| 434 | SAVE_ALL IRP,ITSR | 435 | SAVE_ALL IRP,ITSR |
diff --git a/arch/ia64/include/asm/dma-mapping.h b/arch/ia64/include/asm/dma-mapping.h index 4f5e8148440d..cf3ab7e784b5 100644 --- a/arch/ia64/include/asm/dma-mapping.h +++ b/arch/ia64/include/asm/dma-mapping.h | |||
| @@ -58,6 +58,7 @@ static inline void dma_free_attrs(struct device *dev, size_t size, | |||
| 58 | static inline int dma_mapping_error(struct device *dev, dma_addr_t daddr) | 58 | static inline int dma_mapping_error(struct device *dev, dma_addr_t daddr) |
| 59 | { | 59 | { |
| 60 | struct dma_map_ops *ops = platform_dma_get_ops(dev); | 60 | struct dma_map_ops *ops = platform_dma_get_ops(dev); |
| 61 | debug_dma_mapping_error(dev, daddr); | ||
| 61 | return ops->mapping_error(dev, daddr); | 62 | return ops->mapping_error(dev, daddr); |
| 62 | } | 63 | } |
| 63 | 64 | ||
diff --git a/arch/m68k/include/asm/signal.h b/arch/m68k/include/asm/signal.h index 67e489d8d1bd..2df26b57c26a 100644 --- a/arch/m68k/include/asm/signal.h +++ b/arch/m68k/include/asm/signal.h | |||
| @@ -41,7 +41,7 @@ struct k_sigaction { | |||
| 41 | static inline void sigaddset(sigset_t *set, int _sig) | 41 | static inline void sigaddset(sigset_t *set, int _sig) |
| 42 | { | 42 | { |
| 43 | asm ("bfset %0{%1,#1}" | 43 | asm ("bfset %0{%1,#1}" |
| 44 | : "+od" (*set) | 44 | : "+o" (*set) |
| 45 | : "id" ((_sig - 1) ^ 31) | 45 | : "id" ((_sig - 1) ^ 31) |
| 46 | : "cc"); | 46 | : "cc"); |
| 47 | } | 47 | } |
| @@ -49,7 +49,7 @@ static inline void sigaddset(sigset_t *set, int _sig) | |||
| 49 | static inline void sigdelset(sigset_t *set, int _sig) | 49 | static inline void sigdelset(sigset_t *set, int _sig) |
| 50 | { | 50 | { |
| 51 | asm ("bfclr %0{%1,#1}" | 51 | asm ("bfclr %0{%1,#1}" |
| 52 | : "+od" (*set) | 52 | : "+o" (*set) |
| 53 | : "id" ((_sig - 1) ^ 31) | 53 | : "id" ((_sig - 1) ^ 31) |
| 54 | : "cc"); | 54 | : "cc"); |
| 55 | } | 55 | } |
| @@ -65,7 +65,7 @@ static inline int __gen_sigismember(sigset_t *set, int _sig) | |||
| 65 | int ret; | 65 | int ret; |
| 66 | asm ("bfextu %1{%2,#1},%0" | 66 | asm ("bfextu %1{%2,#1},%0" |
| 67 | : "=d" (ret) | 67 | : "=d" (ret) |
| 68 | : "od" (*set), "id" ((_sig-1) ^ 31) | 68 | : "o" (*set), "id" ((_sig-1) ^ 31) |
| 69 | : "cc"); | 69 | : "cc"); |
| 70 | return ret; | 70 | return ret; |
| 71 | } | 71 | } |
diff --git a/arch/microblaze/include/asm/dma-mapping.h b/arch/microblaze/include/asm/dma-mapping.h index 01d228286cb0..46460f1c49c4 100644 --- a/arch/microblaze/include/asm/dma-mapping.h +++ b/arch/microblaze/include/asm/dma-mapping.h | |||
| @@ -114,6 +114,8 @@ static inline void __dma_sync(unsigned long paddr, | |||
| 114 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 114 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
| 115 | { | 115 | { |
| 116 | struct dma_map_ops *ops = get_dma_ops(dev); | 116 | struct dma_map_ops *ops = get_dma_ops(dev); |
| 117 | |||
| 118 | debug_dma_mapping_error(dev, dma_addr); | ||
| 117 | if (ops->mapping_error) | 119 | if (ops->mapping_error) |
| 118 | return ops->mapping_error(dev, dma_addr); | 120 | return ops->mapping_error(dev, dma_addr); |
| 119 | 121 | ||
diff --git a/arch/microblaze/kernel/signal.c b/arch/microblaze/kernel/signal.c index 3847e5b9c601..3903e3d11f5a 100644 --- a/arch/microblaze/kernel/signal.c +++ b/arch/microblaze/kernel/signal.c | |||
| @@ -111,7 +111,7 @@ asmlinkage long sys_rt_sigreturn(struct pt_regs *regs) | |||
| 111 | 111 | ||
| 112 | /* It is more difficult to avoid calling this function than to | 112 | /* It is more difficult to avoid calling this function than to |
| 113 | call it and ignore errors. */ | 113 | call it and ignore errors. */ |
| 114 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->r1)) | 114 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->r1) == -EFAULT) |
| 115 | goto badframe; | 115 | goto badframe; |
| 116 | 116 | ||
| 117 | return rval; | 117 | return rval; |
diff --git a/arch/mips/include/asm/dma-mapping.h b/arch/mips/include/asm/dma-mapping.h index be39a12901c6..006b43e38a9c 100644 --- a/arch/mips/include/asm/dma-mapping.h +++ b/arch/mips/include/asm/dma-mapping.h | |||
| @@ -40,6 +40,8 @@ static inline int dma_supported(struct device *dev, u64 mask) | |||
| 40 | static inline int dma_mapping_error(struct device *dev, u64 mask) | 40 | static inline int dma_mapping_error(struct device *dev, u64 mask) |
| 41 | { | 41 | { |
| 42 | struct dma_map_ops *ops = get_dma_ops(dev); | 42 | struct dma_map_ops *ops = get_dma_ops(dev); |
| 43 | |||
| 44 | debug_dma_mapping_error(dev, mask); | ||
| 43 | return ops->mapping_error(dev, mask); | 45 | return ops->mapping_error(dev, mask); |
| 44 | } | 46 | } |
| 45 | 47 | ||
diff --git a/arch/mips/include/asm/hugetlb.h b/arch/mips/include/asm/hugetlb.h index bd94946a18f3..ef99db994c2f 100644 --- a/arch/mips/include/asm/hugetlb.h +++ b/arch/mips/include/asm/hugetlb.h | |||
| @@ -95,7 +95,17 @@ static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma, | |||
| 95 | pte_t *ptep, pte_t pte, | 95 | pte_t *ptep, pte_t pte, |
| 96 | int dirty) | 96 | int dirty) |
| 97 | { | 97 | { |
| 98 | return ptep_set_access_flags(vma, addr, ptep, pte, dirty); | 98 | int changed = !pte_same(*ptep, pte); |
| 99 | |||
| 100 | if (changed) { | ||
| 101 | set_pte_at(vma->vm_mm, addr, ptep, pte); | ||
| 102 | /* | ||
| 103 | * There could be some standard sized pages in there, | ||
| 104 | * get them all. | ||
| 105 | */ | ||
| 106 | flush_tlb_range(vma, addr, addr + HPAGE_SIZE); | ||
| 107 | } | ||
| 108 | return changed; | ||
| 99 | } | 109 | } |
| 100 | 110 | ||
| 101 | static inline pte_t huge_ptep_get(pte_t *ptep) | 111 | static inline pte_t huge_ptep_get(pte_t *ptep) |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index b1fb7af3c350..cce3782c96c9 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
| @@ -510,7 +510,6 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) | |||
| 510 | c->cputype = CPU_R3000A; | 510 | c->cputype = CPU_R3000A; |
| 511 | __cpu_name[cpu] = "R3000A"; | 511 | __cpu_name[cpu] = "R3000A"; |
| 512 | } | 512 | } |
| 513 | break; | ||
| 514 | } else { | 513 | } else { |
| 515 | c->cputype = CPU_R3000; | 514 | c->cputype = CPU_R3000; |
| 516 | __cpu_name[cpu] = "R3000"; | 515 | __cpu_name[cpu] = "R3000"; |
diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index a6c133212003..9b00362f32f6 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S | |||
| @@ -36,6 +36,11 @@ FEXPORT(ret_from_exception) | |||
| 36 | FEXPORT(ret_from_irq) | 36 | FEXPORT(ret_from_irq) |
| 37 | LONG_S s0, TI_REGS($28) | 37 | LONG_S s0, TI_REGS($28) |
| 38 | FEXPORT(__ret_from_irq) | 38 | FEXPORT(__ret_from_irq) |
| 39 | /* | ||
| 40 | * We can be coming here from a syscall done in the kernel space, | ||
| 41 | * e.g. a failed kernel_execve(). | ||
| 42 | */ | ||
| 43 | resume_userspace_check: | ||
| 39 | LONG_L t0, PT_STATUS(sp) # returning to kernel mode? | 44 | LONG_L t0, PT_STATUS(sp) # returning to kernel mode? |
| 40 | andi t0, t0, KU_USER | 45 | andi t0, t0, KU_USER |
| 41 | beqz t0, resume_kernel | 46 | beqz t0, resume_kernel |
| @@ -162,7 +167,7 @@ work_notifysig: # deal with pending signals and | |||
| 162 | move a0, sp | 167 | move a0, sp |
| 163 | li a1, 0 | 168 | li a1, 0 |
| 164 | jal do_notify_resume # a2 already loaded | 169 | jal do_notify_resume # a2 already loaded |
| 165 | j resume_userspace | 170 | j resume_userspace_check |
| 166 | 171 | ||
| 167 | FEXPORT(syscall_exit_partial) | 172 | FEXPORT(syscall_exit_partial) |
| 168 | local_irq_disable # make sure need_resched doesn't | 173 | local_irq_disable # make sure need_resched doesn't |
diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S index f6ba8381ee01..86ec03f0e00c 100644 --- a/arch/mips/kernel/scall64-n32.S +++ b/arch/mips/kernel/scall64-n32.S | |||
| @@ -397,14 +397,14 @@ EXPORT(sysn32_call_table) | |||
| 397 | PTR sys_timerfd_create | 397 | PTR sys_timerfd_create |
| 398 | PTR compat_sys_timerfd_gettime /* 6285 */ | 398 | PTR compat_sys_timerfd_gettime /* 6285 */ |
| 399 | PTR compat_sys_timerfd_settime | 399 | PTR compat_sys_timerfd_settime |
| 400 | PTR sys_signalfd4 | 400 | PTR compat_sys_signalfd4 |
| 401 | PTR sys_eventfd2 | 401 | PTR sys_eventfd2 |
| 402 | PTR sys_epoll_create1 | 402 | PTR sys_epoll_create1 |
| 403 | PTR sys_dup3 /* 6290 */ | 403 | PTR sys_dup3 /* 6290 */ |
| 404 | PTR sys_pipe2 | 404 | PTR sys_pipe2 |
| 405 | PTR sys_inotify_init1 | 405 | PTR sys_inotify_init1 |
| 406 | PTR sys_preadv | 406 | PTR compat_sys_preadv |
| 407 | PTR sys_pwritev | 407 | PTR compat_sys_pwritev |
| 408 | PTR compat_sys_rt_tgsigqueueinfo /* 6295 */ | 408 | PTR compat_sys_rt_tgsigqueueinfo /* 6295 */ |
| 409 | PTR sys_perf_event_open | 409 | PTR sys_perf_event_open |
| 410 | PTR sys_accept4 | 410 | PTR sys_accept4 |
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index a53f8ec37aac..290dc6a1d7a3 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c | |||
| @@ -79,7 +79,7 @@ static struct resource data_resource = { .name = "Kernel data", }; | |||
| 79 | void __init add_memory_region(phys_t start, phys_t size, long type) | 79 | void __init add_memory_region(phys_t start, phys_t size, long type) |
| 80 | { | 80 | { |
| 81 | int x = boot_mem_map.nr_map; | 81 | int x = boot_mem_map.nr_map; |
| 82 | struct boot_mem_map_entry *prev = boot_mem_map.map + x - 1; | 82 | int i; |
| 83 | 83 | ||
| 84 | /* Sanity check */ | 84 | /* Sanity check */ |
| 85 | if (start + size < start) { | 85 | if (start + size < start) { |
| @@ -88,15 +88,29 @@ void __init add_memory_region(phys_t start, phys_t size, long type) | |||
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | /* | 90 | /* |
| 91 | * Try to merge with previous entry if any. This is far less than | 91 | * Try to merge with existing entry, if any. |
| 92 | * perfect but is sufficient for most real world cases. | ||
| 93 | */ | 92 | */ |
| 94 | if (x && prev->addr + prev->size == start && prev->type == type) { | 93 | for (i = 0; i < boot_mem_map.nr_map; i++) { |
| 95 | prev->size += size; | 94 | struct boot_mem_map_entry *entry = boot_mem_map.map + i; |
| 95 | unsigned long top; | ||
| 96 | |||
| 97 | if (entry->type != type) | ||
| 98 | continue; | ||
| 99 | |||
| 100 | if (start + size < entry->addr) | ||
| 101 | continue; /* no overlap */ | ||
| 102 | |||
| 103 | if (entry->addr + entry->size < start) | ||
| 104 | continue; /* no overlap */ | ||
| 105 | |||
| 106 | top = max(entry->addr + entry->size, start + size); | ||
| 107 | entry->addr = min(entry->addr, start); | ||
| 108 | entry->size = top - entry->addr; | ||
| 109 | |||
| 96 | return; | 110 | return; |
| 97 | } | 111 | } |
| 98 | 112 | ||
| 99 | if (x == BOOT_MEM_MAP_MAX) { | 113 | if (boot_mem_map.nr_map == BOOT_MEM_MAP_MAX) { |
| 100 | pr_err("Ooops! Too many entries in the memory map!\n"); | 114 | pr_err("Ooops! Too many entries in the memory map!\n"); |
| 101 | return; | 115 | return; |
| 102 | } | 116 | } |
diff --git a/arch/mips/lib/mips-atomic.c b/arch/mips/lib/mips-atomic.c index e091430dbeb1..cd160be3ce4d 100644 --- a/arch/mips/lib/mips-atomic.c +++ b/arch/mips/lib/mips-atomic.c | |||
| @@ -56,7 +56,7 @@ __asm__( | |||
| 56 | " .set pop \n" | 56 | " .set pop \n" |
| 57 | " .endm \n"); | 57 | " .endm \n"); |
| 58 | 58 | ||
| 59 | void arch_local_irq_disable(void) | 59 | notrace void arch_local_irq_disable(void) |
| 60 | { | 60 | { |
| 61 | preempt_disable(); | 61 | preempt_disable(); |
| 62 | __asm__ __volatile__( | 62 | __asm__ __volatile__( |
| @@ -93,7 +93,7 @@ __asm__( | |||
| 93 | " .set pop \n" | 93 | " .set pop \n" |
| 94 | " .endm \n"); | 94 | " .endm \n"); |
| 95 | 95 | ||
| 96 | unsigned long arch_local_irq_save(void) | 96 | notrace unsigned long arch_local_irq_save(void) |
| 97 | { | 97 | { |
| 98 | unsigned long flags; | 98 | unsigned long flags; |
| 99 | preempt_disable(); | 99 | preempt_disable(); |
| @@ -135,7 +135,7 @@ __asm__( | |||
| 135 | " .set pop \n" | 135 | " .set pop \n" |
| 136 | " .endm \n"); | 136 | " .endm \n"); |
| 137 | 137 | ||
| 138 | void arch_local_irq_restore(unsigned long flags) | 138 | notrace void arch_local_irq_restore(unsigned long flags) |
| 139 | { | 139 | { |
| 140 | unsigned long __tmp1; | 140 | unsigned long __tmp1; |
| 141 | 141 | ||
| @@ -159,7 +159,7 @@ void arch_local_irq_restore(unsigned long flags) | |||
| 159 | EXPORT_SYMBOL(arch_local_irq_restore); | 159 | EXPORT_SYMBOL(arch_local_irq_restore); |
| 160 | 160 | ||
| 161 | 161 | ||
| 162 | void __arch_local_irq_restore(unsigned long flags) | 162 | notrace void __arch_local_irq_restore(unsigned long flags) |
| 163 | { | 163 | { |
| 164 | unsigned long __tmp1; | 164 | unsigned long __tmp1; |
| 165 | 165 | ||
diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c index 4b9b935a070e..88e79ad6f811 100644 --- a/arch/mips/mm/tlb-r4k.c +++ b/arch/mips/mm/tlb-r4k.c | |||
| @@ -120,18 +120,11 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | |||
| 120 | 120 | ||
| 121 | if (cpu_context(cpu, mm) != 0) { | 121 | if (cpu_context(cpu, mm) != 0) { |
| 122 | unsigned long size, flags; | 122 | unsigned long size, flags; |
| 123 | int huge = is_vm_hugetlb_page(vma); | ||
| 124 | 123 | ||
| 125 | ENTER_CRITICAL(flags); | 124 | ENTER_CRITICAL(flags); |
| 126 | if (huge) { | 125 | start = round_down(start, PAGE_SIZE << 1); |
| 127 | start = round_down(start, HPAGE_SIZE); | 126 | end = round_up(end, PAGE_SIZE << 1); |
| 128 | end = round_up(end, HPAGE_SIZE); | 127 | size = (end - start) >> (PAGE_SHIFT + 1); |
| 129 | size = (end - start) >> HPAGE_SHIFT; | ||
| 130 | } else { | ||
| 131 | start = round_down(start, PAGE_SIZE << 1); | ||
| 132 | end = round_up(end, PAGE_SIZE << 1); | ||
| 133 | size = (end - start) >> (PAGE_SHIFT + 1); | ||
| 134 | } | ||
| 135 | if (size <= current_cpu_data.tlbsize/2) { | 128 | if (size <= current_cpu_data.tlbsize/2) { |
| 136 | int oldpid = read_c0_entryhi(); | 129 | int oldpid = read_c0_entryhi(); |
| 137 | int newpid = cpu_asid(cpu, mm); | 130 | int newpid = cpu_asid(cpu, mm); |
| @@ -140,10 +133,7 @@ void local_flush_tlb_range(struct vm_area_struct *vma, unsigned long start, | |||
| 140 | int idx; | 133 | int idx; |
| 141 | 134 | ||
| 142 | write_c0_entryhi(start | newpid); | 135 | write_c0_entryhi(start | newpid); |
| 143 | if (huge) | 136 | start += (PAGE_SIZE << 1); |
| 144 | start += HPAGE_SIZE; | ||
| 145 | else | ||
| 146 | start += (PAGE_SIZE << 1); | ||
| 147 | mtc0_tlbw_hazard(); | 137 | mtc0_tlbw_hazard(); |
| 148 | tlb_probe(); | 138 | tlb_probe(); |
| 149 | tlb_probe_hazard(); | 139 | tlb_probe_hazard(); |
diff --git a/arch/openrisc/kernel/signal.c b/arch/openrisc/kernel/signal.c index 30110297f4f9..ddedc8a77861 100644 --- a/arch/openrisc/kernel/signal.c +++ b/arch/openrisc/kernel/signal.c | |||
| @@ -84,7 +84,6 @@ asmlinkage long _sys_rt_sigreturn(struct pt_regs *regs) | |||
| 84 | { | 84 | { |
| 85 | struct rt_sigframe *frame = (struct rt_sigframe __user *)regs->sp; | 85 | struct rt_sigframe *frame = (struct rt_sigframe __user *)regs->sp; |
| 86 | sigset_t set; | 86 | sigset_t set; |
| 87 | stack_t st; | ||
| 88 | 87 | ||
| 89 | /* | 88 | /* |
| 90 | * Since we stacked the signal on a dword boundary, | 89 | * Since we stacked the signal on a dword boundary, |
| @@ -104,11 +103,10 @@ asmlinkage long _sys_rt_sigreturn(struct pt_regs *regs) | |||
| 104 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) | 103 | if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) |
| 105 | goto badframe; | 104 | goto badframe; |
| 106 | 105 | ||
| 107 | if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) | ||
| 108 | goto badframe; | ||
| 109 | /* It is more difficult to avoid calling this function than to | 106 | /* It is more difficult to avoid calling this function than to |
| 110 | call it and ignore errors. */ | 107 | call it and ignore errors. */ |
| 111 | do_sigaltstack(&st, NULL, regs->sp); | 108 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, regs->sp) == -EFAULT) |
| 109 | goto badframe; | ||
| 112 | 110 | ||
| 113 | return regs->gpr[11]; | 111 | return regs->gpr[11]; |
| 114 | 112 | ||
diff --git a/arch/parisc/kernel/signal32.c b/arch/parisc/kernel/signal32.c index fd49aeda9eb8..5dede04f2f3e 100644 --- a/arch/parisc/kernel/signal32.c +++ b/arch/parisc/kernel/signal32.c | |||
| @@ -65,7 +65,8 @@ put_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz) | |||
| 65 | { | 65 | { |
| 66 | compat_sigset_t s; | 66 | compat_sigset_t s; |
| 67 | 67 | ||
| 68 | if (sz != sizeof *set) panic("put_sigset32()"); | 68 | if (sz != sizeof *set) |
| 69 | return -EINVAL; | ||
| 69 | sigset_64to32(&s, set); | 70 | sigset_64to32(&s, set); |
| 70 | 71 | ||
| 71 | return copy_to_user(up, &s, sizeof s); | 72 | return copy_to_user(up, &s, sizeof s); |
| @@ -77,7 +78,8 @@ get_sigset32(compat_sigset_t __user *up, sigset_t *set, size_t sz) | |||
| 77 | compat_sigset_t s; | 78 | compat_sigset_t s; |
| 78 | int r; | 79 | int r; |
| 79 | 80 | ||
| 80 | if (sz != sizeof *set) panic("put_sigset32()"); | 81 | if (sz != sizeof *set) |
| 82 | return -EINVAL; | ||
| 81 | 83 | ||
| 82 | if ((r = copy_from_user(&s, up, sz)) == 0) { | 84 | if ((r = copy_from_user(&s, up, sz)) == 0) { |
| 83 | sigset_32to64(set, &s); | 85 | sigset_32to64(set, &s); |
diff --git a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c index 7426e40699bd..f76c10863c62 100644 --- a/arch/parisc/kernel/sys_parisc.c +++ b/arch/parisc/kernel/sys_parisc.c | |||
| @@ -73,6 +73,8 @@ static unsigned long get_shared_area(struct address_space *mapping, | |||
| 73 | struct vm_area_struct *vma; | 73 | struct vm_area_struct *vma; |
| 74 | int offset = mapping ? get_offset(mapping) : 0; | 74 | int offset = mapping ? get_offset(mapping) : 0; |
| 75 | 75 | ||
| 76 | offset = (offset + (pgoff << PAGE_SHIFT)) & 0x3FF000; | ||
| 77 | |||
| 76 | addr = DCACHE_ALIGN(addr - offset) + offset; | 78 | addr = DCACHE_ALIGN(addr - offset) + offset; |
| 77 | 79 | ||
| 78 | for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) { | 80 | for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) { |
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 3735abd7f8f6..cbf5d59d5d6a 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
| @@ -60,7 +60,7 @@ | |||
| 60 | ENTRY_SAME(fork_wrapper) | 60 | ENTRY_SAME(fork_wrapper) |
| 61 | ENTRY_SAME(read) | 61 | ENTRY_SAME(read) |
| 62 | ENTRY_SAME(write) | 62 | ENTRY_SAME(write) |
| 63 | ENTRY_SAME(open) /* 5 */ | 63 | ENTRY_COMP(open) /* 5 */ |
| 64 | ENTRY_SAME(close) | 64 | ENTRY_SAME(close) |
| 65 | ENTRY_SAME(waitpid) | 65 | ENTRY_SAME(waitpid) |
| 66 | ENTRY_SAME(creat) | 66 | ENTRY_SAME(creat) |
diff --git a/arch/powerpc/boot/dts/mpc5200b.dtsi b/arch/powerpc/boot/dts/mpc5200b.dtsi index 7ab286ab5300..39ed65a44c5f 100644 --- a/arch/powerpc/boot/dts/mpc5200b.dtsi +++ b/arch/powerpc/boot/dts/mpc5200b.dtsi | |||
| @@ -231,6 +231,12 @@ | |||
| 231 | interrupts = <2 7 0>; | 231 | interrupts = <2 7 0>; |
| 232 | }; | 232 | }; |
| 233 | 233 | ||
| 234 | sclpc@3c00 { | ||
| 235 | compatible = "fsl,mpc5200-lpbfifo"; | ||
| 236 | reg = <0x3c00 0x60>; | ||
| 237 | interrupts = <2 23 0>; | ||
| 238 | }; | ||
| 239 | |||
| 234 | i2c@3d00 { | 240 | i2c@3d00 { |
| 235 | #address-cells = <1>; | 241 | #address-cells = <1>; |
| 236 | #size-cells = <0>; | 242 | #size-cells = <0>; |
diff --git a/arch/powerpc/boot/dts/o2d.dtsi b/arch/powerpc/boot/dts/o2d.dtsi index 3444eb8f0ade..24f668039295 100644 --- a/arch/powerpc/boot/dts/o2d.dtsi +++ b/arch/powerpc/boot/dts/o2d.dtsi | |||
| @@ -86,12 +86,6 @@ | |||
| 86 | reg = <0>; | 86 | reg = <0>; |
| 87 | }; | 87 | }; |
| 88 | }; | 88 | }; |
| 89 | |||
| 90 | sclpc@3c00 { | ||
| 91 | compatible = "fsl,mpc5200-lpbfifo"; | ||
| 92 | reg = <0x3c00 0x60>; | ||
| 93 | interrupts = <3 23 0>; | ||
| 94 | }; | ||
| 95 | }; | 89 | }; |
| 96 | 90 | ||
| 97 | localbus { | 91 | localbus { |
diff --git a/arch/powerpc/boot/dts/pcm030.dts b/arch/powerpc/boot/dts/pcm030.dts index 9e354997eb7e..96512c058033 100644 --- a/arch/powerpc/boot/dts/pcm030.dts +++ b/arch/powerpc/boot/dts/pcm030.dts | |||
| @@ -59,7 +59,7 @@ | |||
| 59 | #gpio-cells = <2>; | 59 | #gpio-cells = <2>; |
| 60 | }; | 60 | }; |
| 61 | 61 | ||
| 62 | psc@2000 { /* PSC1 in ac97 mode */ | 62 | audioplatform: psc@2000 { /* PSC1 in ac97 mode */ |
| 63 | compatible = "mpc5200b-psc-ac97","fsl,mpc5200b-psc-ac97"; | 63 | compatible = "mpc5200b-psc-ac97","fsl,mpc5200b-psc-ac97"; |
| 64 | cell-index = <0>; | 64 | cell-index = <0>; |
| 65 | }; | 65 | }; |
| @@ -134,4 +134,9 @@ | |||
| 134 | localbus { | 134 | localbus { |
| 135 | status = "disabled"; | 135 | status = "disabled"; |
| 136 | }; | 136 | }; |
| 137 | |||
| 138 | sound { | ||
| 139 | compatible = "phytec,pcm030-audio-fabric"; | ||
| 140 | asoc-platform = <&audioplatform>; | ||
| 141 | }; | ||
| 137 | }; | 142 | }; |
diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h index 78160874809a..e27e9ad6818e 100644 --- a/arch/powerpc/include/asm/dma-mapping.h +++ b/arch/powerpc/include/asm/dma-mapping.h | |||
| @@ -172,6 +172,7 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | |||
| 172 | { | 172 | { |
| 173 | struct dma_map_ops *dma_ops = get_dma_ops(dev); | 173 | struct dma_map_ops *dma_ops = get_dma_ops(dev); |
| 174 | 174 | ||
| 175 | debug_dma_mapping_error(dev, dma_addr); | ||
| 175 | if (dma_ops->mapping_error) | 176 | if (dma_ops->mapping_error) |
| 176 | return dma_ops->mapping_error(dev, dma_addr); | 177 | return dma_ops->mapping_error(dev, dma_addr); |
| 177 | 178 | ||
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_pic.c b/arch/powerpc/platforms/52xx/mpc52xx_pic.c index 8520b58a5e9a..b89ef65392dc 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_pic.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_pic.c | |||
| @@ -372,10 +372,11 @@ static int mpc52xx_irqhost_map(struct irq_domain *h, unsigned int virq, | |||
| 372 | case MPC52xx_IRQ_L1_MAIN: irqchip = &mpc52xx_main_irqchip; break; | 372 | case MPC52xx_IRQ_L1_MAIN: irqchip = &mpc52xx_main_irqchip; break; |
| 373 | case MPC52xx_IRQ_L1_PERP: irqchip = &mpc52xx_periph_irqchip; break; | 373 | case MPC52xx_IRQ_L1_PERP: irqchip = &mpc52xx_periph_irqchip; break; |
| 374 | case MPC52xx_IRQ_L1_SDMA: irqchip = &mpc52xx_sdma_irqchip; break; | 374 | case MPC52xx_IRQ_L1_SDMA: irqchip = &mpc52xx_sdma_irqchip; break; |
| 375 | default: | 375 | case MPC52xx_IRQ_L1_CRIT: |
| 376 | pr_err("%s: invalid irq: virq=%i, l1=%i, l2=%i\n", | 376 | pr_warn("%s: Critical IRQ #%d is unsupported! Nopping it.\n", |
| 377 | __func__, virq, l1irq, l2irq); | 377 | __func__, l2irq); |
| 378 | return -EINVAL; | 378 | irq_set_chip(virq, &no_irq_chip); |
| 379 | return 0; | ||
| 379 | } | 380 | } |
| 380 | 381 | ||
| 381 | irq_set_chip_and_handler(virq, irqchip, handle_level_irq); | 382 | irq_set_chip_and_handler(virq, irqchip, handle_level_irq); |
diff --git a/arch/powerpc/platforms/pseries/eeh_pe.c b/arch/powerpc/platforms/pseries/eeh_pe.c index 797cd181dc3f..d16c8ded1084 100644 --- a/arch/powerpc/platforms/pseries/eeh_pe.c +++ b/arch/powerpc/platforms/pseries/eeh_pe.c | |||
| @@ -449,7 +449,7 @@ int eeh_rmv_from_parent_pe(struct eeh_dev *edev, int purge_pe) | |||
| 449 | if (list_empty(&pe->edevs)) { | 449 | if (list_empty(&pe->edevs)) { |
| 450 | cnt = 0; | 450 | cnt = 0; |
| 451 | list_for_each_entry(child, &pe->child_list, child) { | 451 | list_for_each_entry(child, &pe->child_list, child) { |
| 452 | if (!(pe->type & EEH_PE_INVALID)) { | 452 | if (!(child->type & EEH_PE_INVALID)) { |
| 453 | cnt++; | 453 | cnt++; |
| 454 | break; | 454 | break; |
| 455 | } | 455 | } |
diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c index d19f4977c834..e5b084723131 100644 --- a/arch/powerpc/platforms/pseries/msi.c +++ b/arch/powerpc/platforms/pseries/msi.c | |||
| @@ -220,7 +220,8 @@ static struct device_node *find_pe_dn(struct pci_dev *dev, int *total) | |||
| 220 | 220 | ||
| 221 | /* Get the top level device in the PE */ | 221 | /* Get the top level device in the PE */ |
| 222 | edev = of_node_to_eeh_dev(dn); | 222 | edev = of_node_to_eeh_dev(dn); |
| 223 | edev = list_first_entry(&edev->pe->edevs, struct eeh_dev, list); | 223 | if (edev->pe) |
| 224 | edev = list_first_entry(&edev->pe->edevs, struct eeh_dev, list); | ||
| 224 | dn = eeh_dev_to_of_node(edev); | 225 | dn = eeh_dev_to_of_node(edev); |
| 225 | if (!dn) | 226 | if (!dn) |
| 226 | return NULL; | 227 | return NULL; |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index ad79b846535c..827e094a2f49 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
| @@ -28,7 +28,7 @@ ENTRY(sys32_open_wrapper) | |||
| 28 | llgtr %r2,%r2 # const char * | 28 | llgtr %r2,%r2 # const char * |
| 29 | lgfr %r3,%r3 # int | 29 | lgfr %r3,%r3 # int |
| 30 | lgfr %r4,%r4 # int | 30 | lgfr %r4,%r4 # int |
| 31 | jg sys_open # branch to system call | 31 | jg compat_sys_open # branch to system call |
| 32 | 32 | ||
| 33 | ENTRY(sys32_close_wrapper) | 33 | ENTRY(sys32_close_wrapper) |
| 34 | llgfr %r2,%r2 # unsigned int | 34 | llgfr %r2,%r2 # unsigned int |
diff --git a/arch/score/kernel/signal.c b/arch/score/kernel/signal.c index c268bbf8b410..02353bde92d8 100644 --- a/arch/score/kernel/signal.c +++ b/arch/score/kernel/signal.c | |||
| @@ -148,7 +148,6 @@ score_rt_sigreturn(struct pt_regs *regs) | |||
| 148 | { | 148 | { |
| 149 | struct rt_sigframe __user *frame; | 149 | struct rt_sigframe __user *frame; |
| 150 | sigset_t set; | 150 | sigset_t set; |
| 151 | stack_t st; | ||
| 152 | int sig; | 151 | int sig; |
| 153 | 152 | ||
| 154 | /* Always make any pending restarted system calls return -EINTR */ | 153 | /* Always make any pending restarted system calls return -EINTR */ |
| @@ -168,12 +167,10 @@ score_rt_sigreturn(struct pt_regs *regs) | |||
| 168 | else if (sig) | 167 | else if (sig) |
| 169 | force_sig(sig, current); | 168 | force_sig(sig, current); |
| 170 | 169 | ||
| 171 | if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st))) | ||
| 172 | goto badframe; | ||
| 173 | |||
| 174 | /* It is more difficult to avoid calling this function than to | 170 | /* It is more difficult to avoid calling this function than to |
| 175 | call it and ignore errors. */ | 171 | call it and ignore errors. */ |
| 176 | do_sigaltstack((stack_t __user *)&st, NULL, regs->regs[0]); | 172 | if (do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs->regs[0]) == -EFAULT) |
| 173 | goto badframe; | ||
| 177 | regs->is_syscall = 0; | 174 | regs->is_syscall = 0; |
| 178 | 175 | ||
| 179 | __asm__ __volatile__( | 176 | __asm__ __volatile__( |
diff --git a/arch/sh/include/asm/dma-mapping.h b/arch/sh/include/asm/dma-mapping.h index 8bd965e00a15..b437f2c780b8 100644 --- a/arch/sh/include/asm/dma-mapping.h +++ b/arch/sh/include/asm/dma-mapping.h | |||
| @@ -46,6 +46,7 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | |||
| 46 | { | 46 | { |
| 47 | struct dma_map_ops *ops = get_dma_ops(dev); | 47 | struct dma_map_ops *ops = get_dma_ops(dev); |
| 48 | 48 | ||
| 49 | debug_dma_mapping_error(dev, dma_addr); | ||
| 49 | if (ops->mapping_error) | 50 | if (ops->mapping_error) |
| 50 | return ops->mapping_error(dev, dma_addr); | 51 | return ops->mapping_error(dev, dma_addr); |
| 51 | 52 | ||
diff --git a/arch/sh/kernel/signal_64.c b/arch/sh/kernel/signal_64.c index 23853814bd17..d867cd95a622 100644 --- a/arch/sh/kernel/signal_64.c +++ b/arch/sh/kernel/signal_64.c | |||
| @@ -347,7 +347,6 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3, | |||
| 347 | { | 347 | { |
| 348 | struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP; | 348 | struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP; |
| 349 | sigset_t set; | 349 | sigset_t set; |
| 350 | stack_t __user st; | ||
| 351 | long long ret; | 350 | long long ret; |
| 352 | 351 | ||
| 353 | /* Always make any pending restarted system calls return -EINTR */ | 352 | /* Always make any pending restarted system calls return -EINTR */ |
| @@ -365,11 +364,10 @@ asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3, | |||
| 365 | goto badframe; | 364 | goto badframe; |
| 366 | regs->pc -= 4; | 365 | regs->pc -= 4; |
| 367 | 366 | ||
| 368 | if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st))) | ||
| 369 | goto badframe; | ||
| 370 | /* It is more difficult to avoid calling this function than to | 367 | /* It is more difficult to avoid calling this function than to |
| 371 | call it and ignore errors. */ | 368 | call it and ignore errors. */ |
| 372 | do_sigaltstack(&st, NULL, REF_REG_SP); | 369 | if (do_sigaltstack(&frame->uc.uc_stack, NULL, REF_REG_SP) == -EFAULT) |
| 370 | goto badframe; | ||
| 373 | 371 | ||
| 374 | return (int) ret; | 372 | return (int) ret; |
| 375 | 373 | ||
diff --git a/arch/sparc/boot/piggyback.c b/arch/sparc/boot/piggyback.c index c0a798fcf030..bb7c95161d71 100644 --- a/arch/sparc/boot/piggyback.c +++ b/arch/sparc/boot/piggyback.c | |||
| @@ -81,18 +81,18 @@ static void usage(void) | |||
| 81 | 81 | ||
| 82 | static int start_line(const char *line) | 82 | static int start_line(const char *line) |
| 83 | { | 83 | { |
| 84 | if (strcmp(line + 8, " T _start\n") == 0) | 84 | if (strcmp(line + 10, " _start\n") == 0) |
| 85 | return 1; | 85 | return 1; |
| 86 | else if (strcmp(line + 16, " T _start\n") == 0) | 86 | else if (strcmp(line + 18, " _start\n") == 0) |
| 87 | return 1; | 87 | return 1; |
| 88 | return 0; | 88 | return 0; |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | static int end_line(const char *line) | 91 | static int end_line(const char *line) |
| 92 | { | 92 | { |
| 93 | if (strcmp(line + 8, " A _end\n") == 0) | 93 | if (strcmp(line + 10, " _end\n") == 0) |
| 94 | return 1; | 94 | return 1; |
| 95 | else if (strcmp (line + 16, " A _end\n") == 0) | 95 | else if (strcmp (line + 18, " _end\n") == 0) |
| 96 | return 1; | 96 | return 1; |
| 97 | return 0; | 97 | return 0; |
| 98 | } | 98 | } |
| @@ -100,8 +100,8 @@ static int end_line(const char *line) | |||
| 100 | /* | 100 | /* |
| 101 | * Find address for start and end in System.map. | 101 | * Find address for start and end in System.map. |
| 102 | * The file looks like this: | 102 | * The file looks like this: |
| 103 | * f0004000 T _start | 103 | * f0004000 ... _start |
| 104 | * f0379f79 A _end | 104 | * f0379f79 ... _end |
| 105 | * 1234567890123456 | 105 | * 1234567890123456 |
| 106 | * ^coloumn 1 | 106 | * ^coloumn 1 |
| 107 | * There is support for 64 bit addresses too. | 107 | * There is support for 64 bit addresses too. |
diff --git a/arch/sparc/include/asm/dma-mapping.h b/arch/sparc/include/asm/dma-mapping.h index 8493fd3c7ba5..05fe53f5346e 100644 --- a/arch/sparc/include/asm/dma-mapping.h +++ b/arch/sparc/include/asm/dma-mapping.h | |||
| @@ -59,6 +59,7 @@ static inline void dma_free_attrs(struct device *dev, size_t size, | |||
| 59 | 59 | ||
| 60 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 60 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
| 61 | { | 61 | { |
| 62 | debug_dma_mapping_error(dev, dma_addr); | ||
| 62 | return (dma_addr == DMA_ERROR_CODE); | 63 | return (dma_addr == DMA_ERROR_CODE); |
| 63 | } | 64 | } |
| 64 | 65 | ||
diff --git a/arch/sparc/include/asm/prom.h b/arch/sparc/include/asm/prom.h index f93003123bce..67c62578d170 100644 --- a/arch/sparc/include/asm/prom.h +++ b/arch/sparc/include/asm/prom.h | |||
| @@ -63,10 +63,13 @@ extern char *of_console_options; | |||
| 63 | extern void irq_trans_init(struct device_node *dp); | 63 | extern void irq_trans_init(struct device_node *dp); |
| 64 | extern char *build_path_component(struct device_node *dp); | 64 | extern char *build_path_component(struct device_node *dp); |
| 65 | 65 | ||
| 66 | /* SPARC has a local implementation */ | 66 | /* SPARC has local implementations */ |
| 67 | extern int of_address_to_resource(struct device_node *dev, int index, | 67 | extern int of_address_to_resource(struct device_node *dev, int index, |
| 68 | struct resource *r); | 68 | struct resource *r); |
| 69 | #define of_address_to_resource of_address_to_resource | 69 | #define of_address_to_resource of_address_to_resource |
| 70 | 70 | ||
| 71 | void __iomem *of_iomap(struct device_node *node, int index); | ||
| 72 | #define of_iomap of_iomap | ||
| 73 | |||
| 71 | #endif /* __KERNEL__ */ | 74 | #endif /* __KERNEL__ */ |
| 72 | #endif /* _SPARC_PROM_H */ | 75 | #endif /* _SPARC_PROM_H */ |
diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 867de2f8189c..689e1ba62809 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c | |||
| @@ -295,9 +295,7 @@ void do_rt_sigreturn(struct pt_regs *regs) | |||
| 295 | err |= restore_fpu_state(regs, fpu_save); | 295 | err |= restore_fpu_state(regs, fpu_save); |
| 296 | 296 | ||
| 297 | err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); | 297 | err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); |
| 298 | err |= do_sigaltstack(&sf->stack, NULL, (unsigned long)sf); | 298 | if (err || do_sigaltstack(&sf->stack, NULL, (unsigned long)sf) == -EFAULT) |
| 299 | |||
| 300 | if (err) | ||
| 301 | goto segv; | 299 | goto segv; |
| 302 | 300 | ||
| 303 | err |= __get_user(rwin_save, &sf->rwin_save); | 301 | err |= __get_user(rwin_save, &sf->rwin_save); |
diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index 44025f4ba41f..8475a474273a 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S | |||
| @@ -47,7 +47,7 @@ STUB: sra REG1, 0, REG1; \ | |||
| 47 | sra REG4, 0, REG4 | 47 | sra REG4, 0, REG4 |
| 48 | 48 | ||
| 49 | SIGN1(sys32_exit, sparc_exit, %o0) | 49 | SIGN1(sys32_exit, sparc_exit, %o0) |
| 50 | SIGN1(sys32_exit_group, sys_exit_group, %o0) | 50 | SIGN1(sys32_exit_group, sparc_exit_group, %o0) |
| 51 | SIGN1(sys32_wait4, compat_sys_wait4, %o2) | 51 | SIGN1(sys32_wait4, compat_sys_wait4, %o2) |
| 52 | SIGN1(sys32_creat, sys_creat, %o1) | 52 | SIGN1(sys32_creat, sys_creat, %o1) |
| 53 | SIGN1(sys32_mknod, sys_mknod, %o1) | 53 | SIGN1(sys32_mknod, sys_mknod, %o1) |
diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S index 7f5f65d0b3fd..bf2347794e33 100644 --- a/arch/sparc/kernel/syscalls.S +++ b/arch/sparc/kernel/syscalls.S | |||
| @@ -118,10 +118,20 @@ ret_from_syscall: | |||
| 118 | ba,pt %xcc, ret_sys_call | 118 | ba,pt %xcc, ret_sys_call |
| 119 | ldx [%sp + PTREGS_OFF + PT_V9_I0], %o0 | 119 | ldx [%sp + PTREGS_OFF + PT_V9_I0], %o0 |
| 120 | 120 | ||
| 121 | .globl sparc_exit_group | ||
| 122 | .type sparc_exit_group,#function | ||
| 123 | sparc_exit_group: | ||
| 124 | sethi %hi(sys_exit_group), %g7 | ||
| 125 | ba,pt %xcc, 1f | ||
| 126 | or %g7, %lo(sys_exit_group), %g7 | ||
| 127 | .size sparc_exit_group,.-sparc_exit_group | ||
| 128 | |||
| 121 | .globl sparc_exit | 129 | .globl sparc_exit |
| 122 | .type sparc_exit,#function | 130 | .type sparc_exit,#function |
| 123 | sparc_exit: | 131 | sparc_exit: |
| 124 | rdpr %pstate, %g2 | 132 | sethi %hi(sys_exit), %g7 |
| 133 | or %g7, %lo(sys_exit), %g7 | ||
| 134 | 1: rdpr %pstate, %g2 | ||
| 125 | wrpr %g2, PSTATE_IE, %pstate | 135 | wrpr %g2, PSTATE_IE, %pstate |
| 126 | rdpr %otherwin, %g1 | 136 | rdpr %otherwin, %g1 |
| 127 | rdpr %cansave, %g3 | 137 | rdpr %cansave, %g3 |
| @@ -129,7 +139,7 @@ sparc_exit: | |||
| 129 | wrpr %g3, 0x0, %cansave | 139 | wrpr %g3, 0x0, %cansave |
| 130 | wrpr %g0, 0x0, %otherwin | 140 | wrpr %g0, 0x0, %otherwin |
| 131 | wrpr %g2, 0x0, %pstate | 141 | wrpr %g2, 0x0, %pstate |
| 132 | ba,pt %xcc, sys_exit | 142 | jmpl %g7, %g0 |
| 133 | stb %g0, [%g6 + TI_WSAVED] | 143 | stb %g0, [%g6 + TI_WSAVED] |
| 134 | .size sparc_exit,.-sparc_exit | 144 | .size sparc_exit,.-sparc_exit |
| 135 | 145 | ||
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 1c9af9fa38e9..017b74a63dcb 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S | |||
| @@ -133,7 +133,7 @@ sys_call_table: | |||
| 133 | /*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents | 133 | /*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents |
| 134 | .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr | 134 | .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr |
| 135 | /*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall | 135 | /*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall |
| 136 | .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname | 136 | .word sys_setpgid, sys_fremovexattr, sys_tkill, sparc_exit_group, sys_newuname |
| 137 | /*190*/ .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl | 137 | /*190*/ .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl |
| 138 | .word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask | 138 | .word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask |
| 139 | /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall | 139 | /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall |
diff --git a/arch/tile/include/asm/dma-mapping.h b/arch/tile/include/asm/dma-mapping.h index 4b6247d1a315..f2ff191376b4 100644 --- a/arch/tile/include/asm/dma-mapping.h +++ b/arch/tile/include/asm/dma-mapping.h | |||
| @@ -72,6 +72,7 @@ static inline bool dma_capable(struct device *dev, dma_addr_t addr, size_t size) | |||
| 72 | static inline int | 72 | static inline int |
| 73 | dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 73 | dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
| 74 | { | 74 | { |
| 75 | debug_dma_mapping_error(dev, dma_addr); | ||
| 75 | return get_dma_ops(dev)->mapping_error(dev, dma_addr); | 76 | return get_dma_ops(dev)->mapping_error(dev, dma_addr); |
| 76 | } | 77 | } |
| 77 | 78 | ||
diff --git a/arch/um/kernel/exec.c b/arch/um/kernel/exec.c index 3a8ece7d09ca..0d7103c9eff3 100644 --- a/arch/um/kernel/exec.c +++ b/arch/um/kernel/exec.c | |||
| @@ -32,13 +32,14 @@ void flush_thread(void) | |||
| 32 | "err = %d\n", ret); | 32 | "err = %d\n", ret); |
| 33 | force_sig(SIGKILL, current); | 33 | force_sig(SIGKILL, current); |
| 34 | } | 34 | } |
| 35 | get_safe_registers(current_pt_regs()->regs.gp, | ||
| 36 | current_pt_regs()->regs.fp); | ||
| 35 | 37 | ||
| 36 | __switch_mm(¤t->mm->context.id); | 38 | __switch_mm(¤t->mm->context.id); |
| 37 | } | 39 | } |
| 38 | 40 | ||
| 39 | void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp) | 41 | void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp) |
| 40 | { | 42 | { |
| 41 | get_safe_registers(regs->regs.gp, regs->regs.fp); | ||
| 42 | PT_REGS_IP(regs) = eip; | 43 | PT_REGS_IP(regs) = eip; |
| 43 | PT_REGS_SP(regs) = esp; | 44 | PT_REGS_SP(regs) = esp; |
| 44 | current->ptrace &= ~PT_DTRACE; | 45 | current->ptrace &= ~PT_DTRACE; |
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index c760e073963e..e87b0cac14b5 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c | |||
| @@ -12,6 +12,8 @@ | |||
| 12 | #include <asm/setup.h> | 12 | #include <asm/setup.h> |
| 13 | #include <asm/desc.h> | 13 | #include <asm/desc.h> |
| 14 | 14 | ||
| 15 | #undef memcpy /* Use memcpy from misc.c */ | ||
| 16 | |||
| 15 | #include "eboot.h" | 17 | #include "eboot.h" |
| 16 | 18 | ||
| 17 | static efi_system_table_t *sys_table; | 19 | static efi_system_table_t *sys_table; |
diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S index 2a017441b8b2..8c132a625b94 100644 --- a/arch/x86/boot/header.S +++ b/arch/x86/boot/header.S | |||
| @@ -476,6 +476,3 @@ die: | |||
| 476 | setup_corrupt: | 476 | setup_corrupt: |
| 477 | .byte 7 | 477 | .byte 7 |
| 478 | .string "No setup signature found...\n" | 478 | .string "No setup signature found...\n" |
| 479 | |||
| 480 | .data | ||
| 481 | dummy: .long 0 | ||
diff --git a/arch/x86/include/asm/Kbuild b/arch/x86/include/asm/Kbuild index 66e5f0ef0523..79fd8a3418f9 100644 --- a/arch/x86/include/asm/Kbuild +++ b/arch/x86/include/asm/Kbuild | |||
| @@ -12,6 +12,7 @@ header-y += mce.h | |||
| 12 | header-y += msr-index.h | 12 | header-y += msr-index.h |
| 13 | header-y += msr.h | 13 | header-y += msr.h |
| 14 | header-y += mtrr.h | 14 | header-y += mtrr.h |
| 15 | header-y += perf_regs.h | ||
| 15 | header-y += posix_types_32.h | 16 | header-y += posix_types_32.h |
| 16 | header-y += posix_types_64.h | 17 | header-y += posix_types_64.h |
| 17 | header-y += posix_types_x32.h | 18 | header-y += posix_types_x32.h |
| @@ -19,8 +20,10 @@ header-y += prctl.h | |||
| 19 | header-y += processor-flags.h | 20 | header-y += processor-flags.h |
| 20 | header-y += ptrace-abi.h | 21 | header-y += ptrace-abi.h |
| 21 | header-y += sigcontext32.h | 22 | header-y += sigcontext32.h |
| 23 | header-y += svm.h | ||
| 22 | header-y += ucontext.h | 24 | header-y += ucontext.h |
| 23 | header-y += vm86.h | 25 | header-y += vm86.h |
| 26 | header-y += vmx.h | ||
| 24 | header-y += vsyscall.h | 27 | header-y += vsyscall.h |
| 25 | 28 | ||
| 26 | genhdr-y += unistd_32.h | 29 | genhdr-y += unistd_32.h |
diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index f7b4c7903e7e..808dae63eeea 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h | |||
| @@ -47,6 +47,7 @@ static inline struct dma_map_ops *get_dma_ops(struct device *dev) | |||
| 47 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 47 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) |
| 48 | { | 48 | { |
| 49 | struct dma_map_ops *ops = get_dma_ops(dev); | 49 | struct dma_map_ops *ops = get_dma_ops(dev); |
| 50 | debug_dma_mapping_error(dev, dma_addr); | ||
| 50 | if (ops->mapping_error) | 51 | if (ops->mapping_error) |
| 51 | return ops->mapping_error(dev, dma_addr); | 52 | return ops->mapping_error(dev, dma_addr); |
| 52 | 53 | ||
diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h index 831dbb9c6c02..41ab26ea6564 100644 --- a/arch/x86/include/asm/fpu-internal.h +++ b/arch/x86/include/asm/fpu-internal.h | |||
| @@ -399,14 +399,17 @@ static inline void drop_init_fpu(struct task_struct *tsk) | |||
| 399 | typedef struct { int preload; } fpu_switch_t; | 399 | typedef struct { int preload; } fpu_switch_t; |
| 400 | 400 | ||
| 401 | /* | 401 | /* |
| 402 | * FIXME! We could do a totally lazy restore, but we need to | 402 | * Must be run with preemption disabled: this clears the fpu_owner_task, |
| 403 | * add a per-cpu "this was the task that last touched the FPU | 403 | * on this CPU. |
| 404 | * on this CPU" variable, and the task needs to have a "I last | ||
| 405 | * touched the FPU on this CPU" and check them. | ||
| 406 | * | 404 | * |
| 407 | * We don't do that yet, so "fpu_lazy_restore()" always returns | 405 | * This will disable any lazy FPU state restore of the current FPU state, |
| 408 | * false, but some day.. | 406 | * but if the current thread owns the FPU, it will still be saved by. |
| 409 | */ | 407 | */ |
| 408 | static inline void __cpu_disable_lazy_restore(unsigned int cpu) | ||
| 409 | { | ||
| 410 | per_cpu(fpu_owner_task, cpu) = NULL; | ||
| 411 | } | ||
| 412 | |||
| 410 | static inline int fpu_lazy_restore(struct task_struct *new, unsigned int cpu) | 413 | static inline int fpu_lazy_restore(struct task_struct *new, unsigned int cpu) |
| 411 | { | 414 | { |
| 412 | return new == this_cpu_read_stable(fpu_owner_task) && | 415 | return new == this_cpu_read_stable(fpu_owner_task) && |
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index dcfde52979c3..19f16ebaf4fa 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h | |||
| @@ -205,21 +205,14 @@ static inline bool user_64bit_mode(struct pt_regs *regs) | |||
| 205 | } | 205 | } |
| 206 | #endif | 206 | #endif |
| 207 | 207 | ||
| 208 | /* | ||
| 209 | * X86_32 CPUs don't save ss and esp if the CPU is already in kernel mode | ||
| 210 | * when it traps. The previous stack will be directly underneath the saved | ||
| 211 | * registers, and 'sp/ss' won't even have been saved. Thus the '®s->sp'. | ||
| 212 | * | ||
| 213 | * This is valid only for kernel mode traps. | ||
| 214 | */ | ||
| 215 | static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) | ||
| 216 | { | ||
| 217 | #ifdef CONFIG_X86_32 | 208 | #ifdef CONFIG_X86_32 |
| 218 | return (unsigned long)(®s->sp); | 209 | extern unsigned long kernel_stack_pointer(struct pt_regs *regs); |
| 219 | #else | 210 | #else |
| 211 | static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) | ||
| 212 | { | ||
| 220 | return regs->sp; | 213 | return regs->sp; |
| 221 | #endif | ||
| 222 | } | 214 | } |
| 215 | #endif | ||
| 223 | 216 | ||
| 224 | #define GET_IP(regs) ((regs)->ip) | 217 | #define GET_IP(regs) ((regs)->ip) |
| 225 | #define GET_FP(regs) ((regs)->bp) | 218 | #define GET_FP(regs) ((regs)->bp) |
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index f7e98a2c0d12..1b7d1656a042 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c | |||
| @@ -631,6 +631,20 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c) | |||
| 631 | } | 631 | } |
| 632 | } | 632 | } |
| 633 | 633 | ||
| 634 | /* | ||
| 635 | * The way access filter has a performance penalty on some workloads. | ||
| 636 | * Disable it on the affected CPUs. | ||
| 637 | */ | ||
| 638 | if ((c->x86 == 0x15) && | ||
| 639 | (c->x86_model >= 0x02) && (c->x86_model < 0x20)) { | ||
| 640 | u64 val; | ||
| 641 | |||
| 642 | if (!rdmsrl_safe(0xc0011021, &val) && !(val & 0x1E)) { | ||
| 643 | val |= 0x1E; | ||
| 644 | wrmsrl_safe(0xc0011021, val); | ||
| 645 | } | ||
| 646 | } | ||
| 647 | |||
| 634 | cpu_detect_cache_sizes(c); | 648 | cpu_detect_cache_sizes(c); |
| 635 | 649 | ||
| 636 | /* Multi core CPU? */ | 650 | /* Multi core CPU? */ |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index 698b6ec12e0f..1ac581f38dfa 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * | 6 | * |
| 7 | * Written by Jacob Shin - AMD, Inc. | 7 | * Written by Jacob Shin - AMD, Inc. |
| 8 | * | 8 | * |
| 9 | * Support: borislav.petkov@amd.com | 9 | * Maintained by: Borislav Petkov <bp@alien8.de> |
| 10 | * | 10 | * |
| 11 | * April 2006 | 11 | * April 2006 |
| 12 | * - added support for AMD Family 0x10 processors | 12 | * - added support for AMD Family 0x10 processors |
diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel.c b/arch/x86/kernel/cpu/mcheck/mce_intel.c index 5f88abf07e9c..4f9a3cbfc4a3 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_intel.c +++ b/arch/x86/kernel/cpu/mcheck/mce_intel.c | |||
| @@ -285,34 +285,39 @@ void cmci_clear(void) | |||
| 285 | raw_spin_unlock_irqrestore(&cmci_discover_lock, flags); | 285 | raw_spin_unlock_irqrestore(&cmci_discover_lock, flags); |
| 286 | } | 286 | } |
| 287 | 287 | ||
| 288 | static long cmci_rediscover_work_func(void *arg) | ||
| 289 | { | ||
| 290 | int banks; | ||
| 291 | |||
| 292 | /* Recheck banks in case CPUs don't all have the same */ | ||
| 293 | if (cmci_supported(&banks)) | ||
| 294 | cmci_discover(banks); | ||
| 295 | |||
| 296 | return 0; | ||
| 297 | } | ||
| 298 | |||
| 288 | /* | 299 | /* |
| 289 | * After a CPU went down cycle through all the others and rediscover | 300 | * After a CPU went down cycle through all the others and rediscover |
| 290 | * Must run in process context. | 301 | * Must run in process context. |
| 291 | */ | 302 | */ |
| 292 | void cmci_rediscover(int dying) | 303 | void cmci_rediscover(int dying) |
| 293 | { | 304 | { |
| 294 | int banks; | 305 | int cpu, banks; |
| 295 | int cpu; | ||
| 296 | cpumask_var_t old; | ||
| 297 | 306 | ||
| 298 | if (!cmci_supported(&banks)) | 307 | if (!cmci_supported(&banks)) |
| 299 | return; | 308 | return; |
| 300 | if (!alloc_cpumask_var(&old, GFP_KERNEL)) | ||
| 301 | return; | ||
| 302 | cpumask_copy(old, ¤t->cpus_allowed); | ||
| 303 | 309 | ||
| 304 | for_each_online_cpu(cpu) { | 310 | for_each_online_cpu(cpu) { |
| 305 | if (cpu == dying) | 311 | if (cpu == dying) |
| 306 | continue; | 312 | continue; |
| 307 | if (set_cpus_allowed_ptr(current, cpumask_of(cpu))) | 313 | |
| 314 | if (cpu == smp_processor_id()) { | ||
| 315 | cmci_rediscover_work_func(NULL); | ||
| 308 | continue; | 316 | continue; |
| 309 | /* Recheck banks in case CPUs don't all have the same */ | 317 | } |
| 310 | if (cmci_supported(&banks)) | ||
| 311 | cmci_discover(banks); | ||
| 312 | } | ||
| 313 | 318 | ||
| 314 | set_cpus_allowed_ptr(current, old); | 319 | work_on_cpu(cpu, cmci_rediscover_work_func, NULL); |
| 315 | free_cpumask_var(old); | 320 | } |
| 316 | } | 321 | } |
| 317 | 322 | ||
| 318 | /* | 323 | /* |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index b51b2c7ee51f..1328fe49a3f1 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
| @@ -995,8 +995,8 @@ END(interrupt) | |||
| 995 | */ | 995 | */ |
| 996 | .p2align CONFIG_X86_L1_CACHE_SHIFT | 996 | .p2align CONFIG_X86_L1_CACHE_SHIFT |
| 997 | common_interrupt: | 997 | common_interrupt: |
| 998 | ASM_CLAC | ||
| 999 | XCPT_FRAME | 998 | XCPT_FRAME |
| 999 | ASM_CLAC | ||
| 1000 | addq $-0x80,(%rsp) /* Adjust vector to [-256,-1] range */ | 1000 | addq $-0x80,(%rsp) /* Adjust vector to [-256,-1] range */ |
| 1001 | interrupt do_IRQ | 1001 | interrupt do_IRQ |
| 1002 | /* 0(%rsp): old_rsp-ARGOFFSET */ | 1002 | /* 0(%rsp): old_rsp-ARGOFFSET */ |
| @@ -1135,8 +1135,8 @@ END(common_interrupt) | |||
| 1135 | */ | 1135 | */ |
| 1136 | .macro apicinterrupt num sym do_sym | 1136 | .macro apicinterrupt num sym do_sym |
| 1137 | ENTRY(\sym) | 1137 | ENTRY(\sym) |
| 1138 | ASM_CLAC | ||
| 1139 | INTR_FRAME | 1138 | INTR_FRAME |
| 1139 | ASM_CLAC | ||
| 1140 | pushq_cfi $~(\num) | 1140 | pushq_cfi $~(\num) |
| 1141 | .Lcommon_\sym: | 1141 | .Lcommon_\sym: |
| 1142 | interrupt \do_sym | 1142 | interrupt \do_sym |
| @@ -1190,8 +1190,8 @@ apicinterrupt IRQ_WORK_VECTOR \ | |||
| 1190 | */ | 1190 | */ |
| 1191 | .macro zeroentry sym do_sym | 1191 | .macro zeroentry sym do_sym |
| 1192 | ENTRY(\sym) | 1192 | ENTRY(\sym) |
| 1193 | ASM_CLAC | ||
| 1194 | INTR_FRAME | 1193 | INTR_FRAME |
| 1194 | ASM_CLAC | ||
| 1195 | PARAVIRT_ADJUST_EXCEPTION_FRAME | 1195 | PARAVIRT_ADJUST_EXCEPTION_FRAME |
| 1196 | pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */ | 1196 | pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */ |
| 1197 | subq $ORIG_RAX-R15, %rsp | 1197 | subq $ORIG_RAX-R15, %rsp |
| @@ -1208,8 +1208,8 @@ END(\sym) | |||
| 1208 | 1208 | ||
| 1209 | .macro paranoidzeroentry sym do_sym | 1209 | .macro paranoidzeroentry sym do_sym |
| 1210 | ENTRY(\sym) | 1210 | ENTRY(\sym) |
| 1211 | ASM_CLAC | ||
| 1212 | INTR_FRAME | 1211 | INTR_FRAME |
| 1212 | ASM_CLAC | ||
| 1213 | PARAVIRT_ADJUST_EXCEPTION_FRAME | 1213 | PARAVIRT_ADJUST_EXCEPTION_FRAME |
| 1214 | pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */ | 1214 | pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */ |
| 1215 | subq $ORIG_RAX-R15, %rsp | 1215 | subq $ORIG_RAX-R15, %rsp |
| @@ -1227,8 +1227,8 @@ END(\sym) | |||
| 1227 | #define INIT_TSS_IST(x) PER_CPU_VAR(init_tss) + (TSS_ist + ((x) - 1) * 8) | 1227 | #define INIT_TSS_IST(x) PER_CPU_VAR(init_tss) + (TSS_ist + ((x) - 1) * 8) |
| 1228 | .macro paranoidzeroentry_ist sym do_sym ist | 1228 | .macro paranoidzeroentry_ist sym do_sym ist |
| 1229 | ENTRY(\sym) | 1229 | ENTRY(\sym) |
| 1230 | ASM_CLAC | ||
| 1231 | INTR_FRAME | 1230 | INTR_FRAME |
| 1231 | ASM_CLAC | ||
| 1232 | PARAVIRT_ADJUST_EXCEPTION_FRAME | 1232 | PARAVIRT_ADJUST_EXCEPTION_FRAME |
| 1233 | pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */ | 1233 | pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */ |
| 1234 | subq $ORIG_RAX-R15, %rsp | 1234 | subq $ORIG_RAX-R15, %rsp |
| @@ -1247,8 +1247,8 @@ END(\sym) | |||
| 1247 | 1247 | ||
| 1248 | .macro errorentry sym do_sym | 1248 | .macro errorentry sym do_sym |
| 1249 | ENTRY(\sym) | 1249 | ENTRY(\sym) |
| 1250 | ASM_CLAC | ||
| 1251 | XCPT_FRAME | 1250 | XCPT_FRAME |
| 1251 | ASM_CLAC | ||
| 1252 | PARAVIRT_ADJUST_EXCEPTION_FRAME | 1252 | PARAVIRT_ADJUST_EXCEPTION_FRAME |
| 1253 | subq $ORIG_RAX-R15, %rsp | 1253 | subq $ORIG_RAX-R15, %rsp |
| 1254 | CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15 | 1254 | CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15 |
| @@ -1266,8 +1266,8 @@ END(\sym) | |||
| 1266 | /* error code is on the stack already */ | 1266 | /* error code is on the stack already */ |
| 1267 | .macro paranoiderrorentry sym do_sym | 1267 | .macro paranoiderrorentry sym do_sym |
| 1268 | ENTRY(\sym) | 1268 | ENTRY(\sym) |
| 1269 | ASM_CLAC | ||
| 1270 | XCPT_FRAME | 1269 | XCPT_FRAME |
| 1270 | ASM_CLAC | ||
| 1271 | PARAVIRT_ADJUST_EXCEPTION_FRAME | 1271 | PARAVIRT_ADJUST_EXCEPTION_FRAME |
| 1272 | subq $ORIG_RAX-R15, %rsp | 1272 | subq $ORIG_RAX-R15, %rsp |
| 1273 | CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15 | 1273 | CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15 |
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S index 957a47aec64e..4dac2f68ed4a 100644 --- a/arch/x86/kernel/head_32.S +++ b/arch/x86/kernel/head_32.S | |||
| @@ -292,8 +292,8 @@ default_entry: | |||
| 292 | * be using the global pages. | 292 | * be using the global pages. |
| 293 | * | 293 | * |
| 294 | * NOTE! If we are on a 486 we may have no cr4 at all! | 294 | * NOTE! If we are on a 486 we may have no cr4 at all! |
| 295 | * Specifically, cr4 exists if and only if CPUID exists, | 295 | * Specifically, cr4 exists if and only if CPUID exists |
| 296 | * which in turn exists if and only if EFLAGS.ID exists. | 296 | * and has flags other than the FPU flag set. |
| 297 | */ | 297 | */ |
| 298 | movl $X86_EFLAGS_ID,%ecx | 298 | movl $X86_EFLAGS_ID,%ecx |
| 299 | pushl %ecx | 299 | pushl %ecx |
| @@ -308,6 +308,11 @@ default_entry: | |||
| 308 | testl %ecx,%eax | 308 | testl %ecx,%eax |
| 309 | jz 6f # No ID flag = no CPUID = no CR4 | 309 | jz 6f # No ID flag = no CPUID = no CR4 |
| 310 | 310 | ||
| 311 | movl $1,%eax | ||
| 312 | cpuid | ||
| 313 | andl $~1,%edx # Ignore CPUID.FPU | ||
| 314 | jz 6f # No flags or only CPUID.FPU = no CR4 | ||
| 315 | |||
| 311 | movl pa(mmu_cr4_features),%eax | 316 | movl pa(mmu_cr4_features),%eax |
| 312 | movl %eax,%cr4 | 317 | movl %eax,%cr4 |
| 313 | 318 | ||
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index 7720ff5a9ee2..efdec7cd8e01 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c | |||
| @@ -8,8 +8,8 @@ | |||
| 8 | * Tigran Aivazian <tigran@aivazian.fsnet.co.uk> | 8 | * Tigran Aivazian <tigran@aivazian.fsnet.co.uk> |
| 9 | * | 9 | * |
| 10 | * Maintainers: | 10 | * Maintainers: |
| 11 | * Andreas Herrmann <andreas.herrmann3@amd.com> | 11 | * Andreas Herrmann <herrmann.der.user@googlemail.com> |
| 12 | * Borislav Petkov <borislav.petkov@amd.com> | 12 | * Borislav Petkov <bp@alien8.de> |
| 13 | * | 13 | * |
| 14 | * This driver allows to upgrade microcode on F10h AMD | 14 | * This driver allows to upgrade microcode on F10h AMD |
| 15 | * CPUs and later. | 15 | * CPUs and later. |
| @@ -190,6 +190,7 @@ static unsigned int verify_patch_size(int cpu, u32 patch_size, | |||
| 190 | #define F1XH_MPB_MAX_SIZE 2048 | 190 | #define F1XH_MPB_MAX_SIZE 2048 |
| 191 | #define F14H_MPB_MAX_SIZE 1824 | 191 | #define F14H_MPB_MAX_SIZE 1824 |
| 192 | #define F15H_MPB_MAX_SIZE 4096 | 192 | #define F15H_MPB_MAX_SIZE 4096 |
| 193 | #define F16H_MPB_MAX_SIZE 3458 | ||
| 193 | 194 | ||
| 194 | switch (c->x86) { | 195 | switch (c->x86) { |
| 195 | case 0x14: | 196 | case 0x14: |
| @@ -198,6 +199,9 @@ static unsigned int verify_patch_size(int cpu, u32 patch_size, | |||
| 198 | case 0x15: | 199 | case 0x15: |
| 199 | max_size = F15H_MPB_MAX_SIZE; | 200 | max_size = F15H_MPB_MAX_SIZE; |
| 200 | break; | 201 | break; |
| 202 | case 0x16: | ||
| 203 | max_size = F16H_MPB_MAX_SIZE; | ||
| 204 | break; | ||
| 201 | default: | 205 | default: |
| 202 | max_size = F1XH_MPB_MAX_SIZE; | 206 | max_size = F1XH_MPB_MAX_SIZE; |
| 203 | break; | 207 | break; |
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c index b00b33a18390..974b67e46dd0 100644 --- a/arch/x86/kernel/ptrace.c +++ b/arch/x86/kernel/ptrace.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/perf_event.h> | 22 | #include <linux/perf_event.h> |
| 23 | #include <linux/hw_breakpoint.h> | 23 | #include <linux/hw_breakpoint.h> |
| 24 | #include <linux/rcupdate.h> | 24 | #include <linux/rcupdate.h> |
| 25 | #include <linux/module.h> | ||
| 25 | 26 | ||
| 26 | #include <asm/uaccess.h> | 27 | #include <asm/uaccess.h> |
| 27 | #include <asm/pgtable.h> | 28 | #include <asm/pgtable.h> |
| @@ -166,6 +167,35 @@ static inline bool invalid_selector(u16 value) | |||
| 166 | 167 | ||
| 167 | #define FLAG_MASK FLAG_MASK_32 | 168 | #define FLAG_MASK FLAG_MASK_32 |
| 168 | 169 | ||
| 170 | /* | ||
| 171 | * X86_32 CPUs don't save ss and esp if the CPU is already in kernel mode | ||
| 172 | * when it traps. The previous stack will be directly underneath the saved | ||
| 173 | * registers, and 'sp/ss' won't even have been saved. Thus the '®s->sp'. | ||
| 174 | * | ||
| 175 | * Now, if the stack is empty, '®s->sp' is out of range. In this | ||
| 176 | * case we try to take the previous stack. To always return a non-null | ||
| 177 | * stack pointer we fall back to regs as stack if no previous stack | ||
| 178 | * exists. | ||
| 179 | * | ||
| 180 | * This is valid only for kernel mode traps. | ||
| 181 | */ | ||
| 182 | unsigned long kernel_stack_pointer(struct pt_regs *regs) | ||
| 183 | { | ||
| 184 | unsigned long context = (unsigned long)regs & ~(THREAD_SIZE - 1); | ||
| 185 | unsigned long sp = (unsigned long)®s->sp; | ||
| 186 | struct thread_info *tinfo; | ||
| 187 | |||
| 188 | if (context == (sp & ~(THREAD_SIZE - 1))) | ||
| 189 | return sp; | ||
| 190 | |||
| 191 | tinfo = (struct thread_info *)context; | ||
| 192 | if (tinfo->previous_esp) | ||
| 193 | return tinfo->previous_esp; | ||
| 194 | |||
| 195 | return (unsigned long)regs; | ||
| 196 | } | ||
| 197 | EXPORT_SYMBOL_GPL(kernel_stack_pointer); | ||
| 198 | |||
| 169 | static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long regno) | 199 | static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long regno) |
| 170 | { | 200 | { |
| 171 | BUILD_BUG_ON(offsetof(struct pt_regs, bx) != 0); | 201 | BUILD_BUG_ON(offsetof(struct pt_regs, bx) != 0); |
| @@ -1511,6 +1541,13 @@ void syscall_trace_leave(struct pt_regs *regs) | |||
| 1511 | { | 1541 | { |
| 1512 | bool step; | 1542 | bool step; |
| 1513 | 1543 | ||
| 1544 | /* | ||
| 1545 | * We may come here right after calling schedule_user() | ||
| 1546 | * or do_notify_resume(), in which case we can be in RCU | ||
| 1547 | * user mode. | ||
| 1548 | */ | ||
| 1549 | rcu_user_exit(); | ||
| 1550 | |||
| 1514 | audit_syscall_exit(regs); | 1551 | audit_syscall_exit(regs); |
| 1515 | 1552 | ||
| 1516 | if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) | 1553 | if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT))) |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index c80a33bc528b..f3e2ec878b8c 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
| @@ -68,6 +68,8 @@ | |||
| 68 | #include <asm/mwait.h> | 68 | #include <asm/mwait.h> |
| 69 | #include <asm/apic.h> | 69 | #include <asm/apic.h> |
| 70 | #include <asm/io_apic.h> | 70 | #include <asm/io_apic.h> |
| 71 | #include <asm/i387.h> | ||
| 72 | #include <asm/fpu-internal.h> | ||
| 71 | #include <asm/setup.h> | 73 | #include <asm/setup.h> |
| 72 | #include <asm/uv/uv.h> | 74 | #include <asm/uv/uv.h> |
| 73 | #include <linux/mc146818rtc.h> | 75 | #include <linux/mc146818rtc.h> |
| @@ -818,6 +820,9 @@ int __cpuinit native_cpu_up(unsigned int cpu, struct task_struct *tidle) | |||
| 818 | 820 | ||
| 819 | per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; | 821 | per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; |
| 820 | 822 | ||
| 823 | /* the FPU context is blank, nobody can own it */ | ||
| 824 | __cpu_disable_lazy_restore(cpu); | ||
| 825 | |||
| 821 | err = do_boot_cpu(apicid, cpu, tidle); | 826 | err = do_boot_cpu(apicid, cpu, tidle); |
| 822 | if (err) { | 827 | if (err) { |
| 823 | pr_debug("do_boot_cpu failed %d\n", err); | 828 | pr_debug("do_boot_cpu failed %d\n", err); |
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 39171cb307ea..bba39bfa1c4b 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
| @@ -426,8 +426,7 @@ static void invalidate_registers(struct x86_emulate_ctxt *ctxt) | |||
| 426 | _ASM_EXTABLE(1b, 3b) \ | 426 | _ASM_EXTABLE(1b, 3b) \ |
| 427 | : "=m" ((ctxt)->eflags), "=&r" (_tmp), \ | 427 | : "=m" ((ctxt)->eflags), "=&r" (_tmp), \ |
| 428 | "+a" (*rax), "+d" (*rdx), "+qm"(_ex) \ | 428 | "+a" (*rax), "+d" (*rdx), "+qm"(_ex) \ |
| 429 | : "i" (EFLAGS_MASK), "m" ((ctxt)->src.val), \ | 429 | : "i" (EFLAGS_MASK), "m" ((ctxt)->src.val)); \ |
| 430 | "a" (*rax), "d" (*rdx)); \ | ||
| 431 | } while (0) | 430 | } while (0) |
| 432 | 431 | ||
| 433 | /* instruction has only one source operand, destination is implicit (e.g. mul, div, imul, idiv) */ | 432 | /* instruction has only one source operand, destination is implicit (e.g. mul, div, imul, idiv) */ |
diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c index 0777f042e400..60f926cd8b0e 100644 --- a/arch/x86/mm/tlb.c +++ b/arch/x86/mm/tlb.c | |||
| @@ -197,7 +197,7 @@ void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start, | |||
| 197 | } | 197 | } |
| 198 | 198 | ||
| 199 | if (end == TLB_FLUSH_ALL || tlb_flushall_shift == -1 | 199 | if (end == TLB_FLUSH_ALL || tlb_flushall_shift == -1 |
| 200 | || vmflag == VM_HUGETLB) { | 200 | || vmflag & VM_HUGETLB) { |
| 201 | local_flush_tlb(); | 201 | local_flush_tlb(); |
| 202 | goto flush_all; | 202 | goto flush_all; |
| 203 | } | 203 | } |
diff --git a/arch/x86/pci/ce4100.c b/arch/x86/pci/ce4100.c index 41bd2a2d2c50..b914e20b5a00 100644 --- a/arch/x86/pci/ce4100.c +++ b/arch/x86/pci/ce4100.c | |||
| @@ -115,6 +115,16 @@ static void sata_revid_read(struct sim_dev_reg *reg, u32 *value) | |||
| 115 | reg_read(reg, value); | 115 | reg_read(reg, value); |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | static void reg_noirq_read(struct sim_dev_reg *reg, u32 *value) | ||
| 119 | { | ||
| 120 | unsigned long flags; | ||
| 121 | |||
| 122 | raw_spin_lock_irqsave(&pci_config_lock, flags); | ||
| 123 | /* force interrupt pin value to 0 */ | ||
| 124 | *value = reg->sim_reg.value & 0xfff00ff; | ||
| 125 | raw_spin_unlock_irqrestore(&pci_config_lock, flags); | ||
| 126 | } | ||
| 127 | |||
| 118 | static struct sim_dev_reg bus1_fixups[] = { | 128 | static struct sim_dev_reg bus1_fixups[] = { |
| 119 | DEFINE_REG(2, 0, 0x10, (16*MB), reg_init, reg_read, reg_write) | 129 | DEFINE_REG(2, 0, 0x10, (16*MB), reg_init, reg_read, reg_write) |
| 120 | DEFINE_REG(2, 0, 0x14, (256), reg_init, reg_read, reg_write) | 130 | DEFINE_REG(2, 0, 0x14, (256), reg_init, reg_read, reg_write) |
| @@ -144,6 +154,7 @@ static struct sim_dev_reg bus1_fixups[] = { | |||
| 144 | DEFINE_REG(11, 5, 0x10, (64*KB), reg_init, reg_read, reg_write) | 154 | DEFINE_REG(11, 5, 0x10, (64*KB), reg_init, reg_read, reg_write) |
| 145 | DEFINE_REG(11, 6, 0x10, (256), reg_init, reg_read, reg_write) | 155 | DEFINE_REG(11, 6, 0x10, (256), reg_init, reg_read, reg_write) |
| 146 | DEFINE_REG(11, 7, 0x10, (64*KB), reg_init, reg_read, reg_write) | 156 | DEFINE_REG(11, 7, 0x10, (64*KB), reg_init, reg_read, reg_write) |
| 157 | DEFINE_REG(11, 7, 0x3c, 256, reg_init, reg_noirq_read, reg_write) | ||
| 147 | DEFINE_REG(12, 0, 0x10, (128*KB), reg_init, reg_read, reg_write) | 158 | DEFINE_REG(12, 0, 0x10, (128*KB), reg_init, reg_read, reg_write) |
| 148 | DEFINE_REG(12, 0, 0x14, (256), reg_init, reg_read, reg_write) | 159 | DEFINE_REG(12, 0, 0x14, (256), reg_init, reg_read, reg_write) |
| 149 | DEFINE_REG(12, 1, 0x10, (1024), reg_init, reg_read, reg_write) | 160 | DEFINE_REG(12, 1, 0x10, (1024), reg_init, reg_read, reg_write) |
| @@ -161,8 +172,10 @@ static struct sim_dev_reg bus1_fixups[] = { | |||
| 161 | DEFINE_REG(16, 0, 0x10, (64*KB), reg_init, reg_read, reg_write) | 172 | DEFINE_REG(16, 0, 0x10, (64*KB), reg_init, reg_read, reg_write) |
| 162 | DEFINE_REG(16, 0, 0x14, (64*MB), reg_init, reg_read, reg_write) | 173 | DEFINE_REG(16, 0, 0x14, (64*MB), reg_init, reg_read, reg_write) |
| 163 | DEFINE_REG(16, 0, 0x18, (64*MB), reg_init, reg_read, reg_write) | 174 | DEFINE_REG(16, 0, 0x18, (64*MB), reg_init, reg_read, reg_write) |
| 175 | DEFINE_REG(16, 0, 0x3c, 256, reg_init, reg_noirq_read, reg_write) | ||
| 164 | DEFINE_REG(17, 0, 0x10, (128*KB), reg_init, reg_read, reg_write) | 176 | DEFINE_REG(17, 0, 0x10, (128*KB), reg_init, reg_read, reg_write) |
| 165 | DEFINE_REG(18, 0, 0x10, (1*KB), reg_init, reg_read, reg_write) | 177 | DEFINE_REG(18, 0, 0x10, (1*KB), reg_init, reg_read, reg_write) |
| 178 | DEFINE_REG(18, 0, 0x3c, 256, reg_init, reg_noirq_read, reg_write) | ||
| 166 | }; | 179 | }; |
| 167 | 180 | ||
| 168 | static void __init init_sim_regs(void) | 181 | static void __init init_sim_regs(void) |
diff --git a/arch/x86/platform/ce4100/ce4100.c b/arch/x86/platform/ce4100/ce4100.c index 4c61b52191eb..92525cb8e54c 100644 --- a/arch/x86/platform/ce4100/ce4100.c +++ b/arch/x86/platform/ce4100/ce4100.c | |||
| @@ -21,12 +21,25 @@ | |||
| 21 | #include <asm/i8259.h> | 21 | #include <asm/i8259.h> |
| 22 | #include <asm/io.h> | 22 | #include <asm/io.h> |
| 23 | #include <asm/io_apic.h> | 23 | #include <asm/io_apic.h> |
| 24 | #include <asm/emergency-restart.h> | ||
| 24 | 25 | ||
| 25 | static int ce4100_i8042_detect(void) | 26 | static int ce4100_i8042_detect(void) |
| 26 | { | 27 | { |
| 27 | return 0; | 28 | return 0; |
| 28 | } | 29 | } |
| 29 | 30 | ||
| 31 | /* | ||
| 32 | * The CE4100 platform has an internal 8051 Microcontroller which is | ||
| 33 | * responsible for signaling to the external Power Management Unit the | ||
| 34 | * intention to reset, reboot or power off the system. This 8051 device has | ||
| 35 | * its command register mapped at I/O port 0xcf9 and the value 0x4 is used | ||
| 36 | * to power off the system. | ||
| 37 | */ | ||
| 38 | static void ce4100_power_off(void) | ||
| 39 | { | ||
| 40 | outb(0x4, 0xcf9); | ||
| 41 | } | ||
| 42 | |||
| 30 | #ifdef CONFIG_SERIAL_8250 | 43 | #ifdef CONFIG_SERIAL_8250 |
| 31 | 44 | ||
| 32 | static unsigned int mem_serial_in(struct uart_port *p, int offset) | 45 | static unsigned int mem_serial_in(struct uart_port *p, int offset) |
| @@ -139,8 +152,19 @@ void __init x86_ce4100_early_setup(void) | |||
| 139 | x86_init.mpparse.find_smp_config = x86_init_noop; | 152 | x86_init.mpparse.find_smp_config = x86_init_noop; |
| 140 | x86_init.pci.init = ce4100_pci_init; | 153 | x86_init.pci.init = ce4100_pci_init; |
| 141 | 154 | ||
| 155 | /* | ||
| 156 | * By default, the reboot method is ACPI which is supported by the | ||
| 157 | * CE4100 bootloader CEFDK using FADT.ResetReg Address and ResetValue | ||
| 158 | * the bootloader will however issue a system power off instead of | ||
| 159 | * reboot. By using BOOT_KBD we ensure proper system reboot as | ||
| 160 | * expected. | ||
| 161 | */ | ||
| 162 | reboot_type = BOOT_KBD; | ||
| 163 | |||
| 142 | #ifdef CONFIG_X86_IO_APIC | 164 | #ifdef CONFIG_X86_IO_APIC |
| 143 | x86_init.pci.init_irq = sdv_pci_init; | 165 | x86_init.pci.init_irq = sdv_pci_init; |
| 144 | x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc_nocheck; | 166 | x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc_nocheck; |
| 145 | #endif | 167 | #endif |
| 168 | |||
| 169 | pm_power_off = ce4100_power_off; | ||
| 146 | } | 170 | } |
diff --git a/block/blk-exec.c b/block/blk-exec.c index 8b6dc5bd4dd0..f71eac35c1b9 100644 --- a/block/blk-exec.c +++ b/block/blk-exec.c | |||
| @@ -52,11 +52,17 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk, | |||
| 52 | rq_end_io_fn *done) | 52 | rq_end_io_fn *done) |
| 53 | { | 53 | { |
| 54 | int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK; | 54 | int where = at_head ? ELEVATOR_INSERT_FRONT : ELEVATOR_INSERT_BACK; |
| 55 | bool is_pm_resume; | ||
| 55 | 56 | ||
| 56 | WARN_ON(irqs_disabled()); | 57 | WARN_ON(irqs_disabled()); |
| 57 | 58 | ||
| 58 | rq->rq_disk = bd_disk; | 59 | rq->rq_disk = bd_disk; |
| 59 | rq->end_io = done; | 60 | rq->end_io = done; |
| 61 | /* | ||
| 62 | * need to check this before __blk_run_queue(), because rq can | ||
| 63 | * be freed before that returns. | ||
| 64 | */ | ||
| 65 | is_pm_resume = rq->cmd_type == REQ_TYPE_PM_RESUME; | ||
| 60 | 66 | ||
| 61 | spin_lock_irq(q->queue_lock); | 67 | spin_lock_irq(q->queue_lock); |
| 62 | 68 | ||
| @@ -71,7 +77,7 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk, | |||
| 71 | __elv_add_request(q, rq, where); | 77 | __elv_add_request(q, rq, where); |
| 72 | __blk_run_queue(q); | 78 | __blk_run_queue(q); |
| 73 | /* the queue is stopped so it won't be run */ | 79 | /* the queue is stopped so it won't be run */ |
| 74 | if (rq->cmd_type == REQ_TYPE_PM_RESUME) | 80 | if (is_pm_resume) |
| 75 | q->request_fn(q); | 81 | q->request_fn(q); |
| 76 | spin_unlock_irq(q->queue_lock); | 82 | spin_unlock_irq(q->queue_lock); |
| 77 | } | 83 | } |
diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c index b1ae48054dc5..b7078afddb74 100644 --- a/drivers/ata/ahci_platform.c +++ b/drivers/ata/ahci_platform.c | |||
| @@ -238,7 +238,7 @@ static int __devexit ahci_remove(struct platform_device *pdev) | |||
| 238 | return 0; | 238 | return 0; |
| 239 | } | 239 | } |
| 240 | 240 | ||
| 241 | #ifdef CONFIG_PM | 241 | #ifdef CONFIG_PM_SLEEP |
| 242 | static int ahci_suspend(struct device *dev) | 242 | static int ahci_suspend(struct device *dev) |
| 243 | { | 243 | { |
| 244 | struct ahci_platform_data *pdata = dev_get_platdata(dev); | 244 | struct ahci_platform_data *pdata = dev_get_platdata(dev); |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index fd9ecf74e631..5b0ba3f20edc 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
| @@ -1105,10 +1105,15 @@ static int ata_acpi_bind_device(struct ata_port *ap, struct scsi_device *sdev, | |||
| 1105 | struct acpi_device *acpi_dev; | 1105 | struct acpi_device *acpi_dev; |
| 1106 | struct acpi_device_power_state *states; | 1106 | struct acpi_device_power_state *states; |
| 1107 | 1107 | ||
| 1108 | if (ap->flags & ATA_FLAG_ACPI_SATA) | 1108 | if (ap->flags & ATA_FLAG_ACPI_SATA) { |
| 1109 | ata_dev = &ap->link.device[sdev->channel]; | 1109 | if (!sata_pmp_attached(ap)) |
| 1110 | else | 1110 | ata_dev = &ap->link.device[sdev->id]; |
| 1111 | else | ||
| 1112 | ata_dev = &ap->pmp_link[sdev->channel].device[sdev->id]; | ||
| 1113 | } | ||
| 1114 | else { | ||
| 1111 | ata_dev = &ap->link.device[sdev->id]; | 1115 | ata_dev = &ap->link.device[sdev->id]; |
| 1116 | } | ||
| 1112 | 1117 | ||
| 1113 | *handle = ata_dev_acpi_handle(ata_dev); | 1118 | *handle = ata_dev_acpi_handle(ata_dev); |
| 1114 | 1119 | ||
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 3cc7096cfda7..f46fbd3bd3fb 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -2942,6 +2942,10 @@ const struct ata_timing *ata_timing_find_mode(u8 xfer_mode) | |||
| 2942 | 2942 | ||
| 2943 | if (xfer_mode == t->mode) | 2943 | if (xfer_mode == t->mode) |
| 2944 | return t; | 2944 | return t; |
| 2945 | |||
| 2946 | WARN_ONCE(true, "%s: unable to find timing for xfer_mode 0x%x\n", | ||
| 2947 | __func__, xfer_mode); | ||
| 2948 | |||
| 2945 | return NULL; | 2949 | return NULL; |
| 2946 | } | 2950 | } |
| 2947 | 2951 | ||
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index e3bda074fa12..a6df6a351d6e 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -1052,6 +1052,8 @@ static void ata_scsi_sdev_config(struct scsi_device *sdev) | |||
| 1052 | { | 1052 | { |
| 1053 | sdev->use_10_for_rw = 1; | 1053 | sdev->use_10_for_rw = 1; |
| 1054 | sdev->use_10_for_ms = 1; | 1054 | sdev->use_10_for_ms = 1; |
| 1055 | sdev->no_report_opcodes = 1; | ||
| 1056 | sdev->no_write_same = 1; | ||
| 1055 | 1057 | ||
| 1056 | /* Schedule policy is determined by ->qc_defer() callback and | 1058 | /* Schedule policy is determined by ->qc_defer() callback and |
| 1057 | * it needs to see every deferred qc. Set dev_blocked to 1 to | 1059 | * it needs to see every deferred qc. Set dev_blocked to 1 to |
diff --git a/drivers/ata/pata_arasan_cf.c b/drivers/ata/pata_arasan_cf.c index 26201ebef3ca..371fd2c698b7 100644 --- a/drivers/ata/pata_arasan_cf.c +++ b/drivers/ata/pata_arasan_cf.c | |||
| @@ -317,6 +317,12 @@ static int cf_init(struct arasan_cf_dev *acdev) | |||
| 317 | return ret; | 317 | return ret; |
| 318 | } | 318 | } |
| 319 | 319 | ||
| 320 | ret = clk_set_rate(acdev->clk, 166000000); | ||
| 321 | if (ret) { | ||
| 322 | dev_warn(acdev->host->dev, "clock set rate failed"); | ||
| 323 | return ret; | ||
| 324 | } | ||
| 325 | |||
| 320 | spin_lock_irqsave(&acdev->host->lock, flags); | 326 | spin_lock_irqsave(&acdev->host->lock, flags); |
| 321 | /* configure CF interface clock */ | 327 | /* configure CF interface clock */ |
| 322 | writel((pdata->cf_if_clk <= CF_IF_CLK_200M) ? pdata->cf_if_clk : | 328 | writel((pdata->cf_if_clk <= CF_IF_CLK_200M) ? pdata->cf_if_clk : |
| @@ -908,7 +914,7 @@ static int __devexit arasan_cf_remove(struct platform_device *pdev) | |||
| 908 | return 0; | 914 | return 0; |
| 909 | } | 915 | } |
| 910 | 916 | ||
| 911 | #ifdef CONFIG_PM | 917 | #ifdef CONFIG_PM_SLEEP |
| 912 | static int arasan_cf_suspend(struct device *dev) | 918 | static int arasan_cf_suspend(struct device *dev) |
| 913 | { | 919 | { |
| 914 | struct ata_host *host = dev_get_drvdata(dev); | 920 | struct ata_host *host = dev_get_drvdata(dev); |
diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c index 0d7c4c2cd26f..400bf1c3e982 100644 --- a/drivers/ata/sata_highbank.c +++ b/drivers/ata/sata_highbank.c | |||
| @@ -260,7 +260,7 @@ static const struct of_device_id ahci_of_match[] = { | |||
| 260 | }; | 260 | }; |
| 261 | MODULE_DEVICE_TABLE(of, ahci_of_match); | 261 | MODULE_DEVICE_TABLE(of, ahci_of_match); |
| 262 | 262 | ||
| 263 | static int __init ahci_highbank_probe(struct platform_device *pdev) | 263 | static int __devinit ahci_highbank_probe(struct platform_device *pdev) |
| 264 | { | 264 | { |
| 265 | struct device *dev = &pdev->dev; | 265 | struct device *dev = &pdev->dev; |
| 266 | struct ahci_host_priv *hpriv; | 266 | struct ahci_host_priv *hpriv; |
| @@ -378,7 +378,7 @@ static int __devexit ahci_highbank_remove(struct platform_device *pdev) | |||
| 378 | return 0; | 378 | return 0; |
| 379 | } | 379 | } |
| 380 | 380 | ||
| 381 | #ifdef CONFIG_PM | 381 | #ifdef CONFIG_PM_SLEEP |
| 382 | static int ahci_highbank_suspend(struct device *dev) | 382 | static int ahci_highbank_suspend(struct device *dev) |
| 383 | { | 383 | { |
| 384 | struct ata_host *host = dev_get_drvdata(dev); | 384 | struct ata_host *host = dev_get_drvdata(dev); |
diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c index 44a4256533e1..08608de87e4e 100644 --- a/drivers/ata/sata_svw.c +++ b/drivers/ata/sata_svw.c | |||
| @@ -142,6 +142,39 @@ static int k2_sata_scr_write(struct ata_link *link, | |||
| 142 | return 0; | 142 | return 0; |
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | static int k2_sata_softreset(struct ata_link *link, | ||
| 146 | unsigned int *class, unsigned long deadline) | ||
| 147 | { | ||
| 148 | u8 dmactl; | ||
| 149 | void __iomem *mmio = link->ap->ioaddr.bmdma_addr; | ||
| 150 | |||
| 151 | dmactl = readb(mmio + ATA_DMA_CMD); | ||
| 152 | |||
| 153 | /* Clear the start bit */ | ||
| 154 | if (dmactl & ATA_DMA_START) { | ||
| 155 | dmactl &= ~ATA_DMA_START; | ||
| 156 | writeb(dmactl, mmio + ATA_DMA_CMD); | ||
| 157 | } | ||
| 158 | |||
| 159 | return ata_sff_softreset(link, class, deadline); | ||
| 160 | } | ||
| 161 | |||
| 162 | static int k2_sata_hardreset(struct ata_link *link, | ||
| 163 | unsigned int *class, unsigned long deadline) | ||
| 164 | { | ||
| 165 | u8 dmactl; | ||
| 166 | void __iomem *mmio = link->ap->ioaddr.bmdma_addr; | ||
| 167 | |||
| 168 | dmactl = readb(mmio + ATA_DMA_CMD); | ||
| 169 | |||
| 170 | /* Clear the start bit */ | ||
| 171 | if (dmactl & ATA_DMA_START) { | ||
| 172 | dmactl &= ~ATA_DMA_START; | ||
| 173 | writeb(dmactl, mmio + ATA_DMA_CMD); | ||
| 174 | } | ||
| 175 | |||
| 176 | return sata_sff_hardreset(link, class, deadline); | ||
| 177 | } | ||
| 145 | 178 | ||
| 146 | static void k2_sata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) | 179 | static void k2_sata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) |
| 147 | { | 180 | { |
| @@ -346,6 +379,8 @@ static struct scsi_host_template k2_sata_sht = { | |||
| 346 | 379 | ||
| 347 | static struct ata_port_operations k2_sata_ops = { | 380 | static struct ata_port_operations k2_sata_ops = { |
| 348 | .inherits = &ata_bmdma_port_ops, | 381 | .inherits = &ata_bmdma_port_ops, |
| 382 | .softreset = k2_sata_softreset, | ||
| 383 | .hardreset = k2_sata_hardreset, | ||
| 349 | .sff_tf_load = k2_sata_tf_load, | 384 | .sff_tf_load = k2_sata_tf_load, |
| 350 | .sff_tf_read = k2_sata_tf_read, | 385 | .sff_tf_read = k2_sata_tf_read, |
| 351 | .sff_check_status = k2_stat_check_status, | 386 | .sff_check_status = k2_stat_check_status, |
diff --git a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c index 89b30f32ba68..ff7bb8a42ed6 100644 --- a/drivers/atm/ambassador.c +++ b/drivers/atm/ambassador.c | |||
| @@ -1961,6 +1961,7 @@ static int __devinit ucode_init (loader_block * lb, amb_dev * dev) { | |||
| 1961 | res = loader_verify(lb, dev, rec); | 1961 | res = loader_verify(lb, dev, rec); |
| 1962 | if (res) | 1962 | if (res) |
| 1963 | break; | 1963 | break; |
| 1964 | rec = ihex_next_binrec(rec); | ||
| 1964 | } | 1965 | } |
| 1965 | release_firmware(fw); | 1966 | release_firmware(fw); |
| 1966 | if (!res) | 1967 | if (!res) |
diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c index 74a67e0019a2..fbbd4ed2edf2 100644 --- a/drivers/base/power/qos.c +++ b/drivers/base/power/qos.c | |||
| @@ -451,7 +451,7 @@ int dev_pm_qos_add_ancestor_request(struct device *dev, | |||
| 451 | if (ancestor) | 451 | if (ancestor) |
| 452 | error = dev_pm_qos_add_request(ancestor, req, value); | 452 | error = dev_pm_qos_add_request(ancestor, req, value); |
| 453 | 453 | ||
| 454 | if (error) | 454 | if (error < 0) |
| 455 | req->dev = NULL; | 455 | req->dev = NULL; |
| 456 | 456 | ||
| 457 | return error; | 457 | return error; |
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index 3804a0af3ef1..9fe4f1865558 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c | |||
| @@ -935,7 +935,7 @@ aoe_end_request(struct aoedev *d, struct request *rq, int fastfail) | |||
| 935 | 935 | ||
| 936 | /* cf. http://lkml.org/lkml/2006/10/31/28 */ | 936 | /* cf. http://lkml.org/lkml/2006/10/31/28 */ |
| 937 | if (!fastfail) | 937 | if (!fastfail) |
| 938 | q->request_fn(q); | 938 | __blk_run_queue(q); |
| 939 | } | 939 | } |
| 940 | 940 | ||
| 941 | static void | 941 | static void |
diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c index 1c49d7173966..2ddd64a9ffde 100644 --- a/drivers/block/floppy.c +++ b/drivers/block/floppy.c | |||
| @@ -4330,6 +4330,7 @@ out_unreg_region: | |||
| 4330 | out_unreg_blkdev: | 4330 | out_unreg_blkdev: |
| 4331 | unregister_blkdev(FLOPPY_MAJOR, "fd"); | 4331 | unregister_blkdev(FLOPPY_MAJOR, "fd"); |
| 4332 | out_put_disk: | 4332 | out_put_disk: |
| 4333 | destroy_workqueue(floppy_wq); | ||
| 4333 | for (drive = 0; drive < N_DRIVE; drive++) { | 4334 | for (drive = 0; drive < N_DRIVE; drive++) { |
| 4334 | if (!disks[drive]) | 4335 | if (!disks[drive]) |
| 4335 | break; | 4336 | break; |
| @@ -4340,7 +4341,6 @@ out_put_disk: | |||
| 4340 | } | 4341 | } |
| 4341 | put_disk(disks[drive]); | 4342 | put_disk(disks[drive]); |
| 4342 | } | 4343 | } |
| 4343 | destroy_workqueue(floppy_wq); | ||
| 4344 | return err; | 4344 | return err; |
| 4345 | } | 4345 | } |
| 4346 | 4346 | ||
| @@ -4555,6 +4555,8 @@ static void __exit floppy_module_exit(void) | |||
| 4555 | unregister_blkdev(FLOPPY_MAJOR, "fd"); | 4555 | unregister_blkdev(FLOPPY_MAJOR, "fd"); |
| 4556 | platform_driver_unregister(&floppy_driver); | 4556 | platform_driver_unregister(&floppy_driver); |
| 4557 | 4557 | ||
| 4558 | destroy_workqueue(floppy_wq); | ||
| 4559 | |||
| 4558 | for (drive = 0; drive < N_DRIVE; drive++) { | 4560 | for (drive = 0; drive < N_DRIVE; drive++) { |
| 4559 | del_timer_sync(&motor_off_timer[drive]); | 4561 | del_timer_sync(&motor_off_timer[drive]); |
| 4560 | 4562 | ||
| @@ -4578,7 +4580,6 @@ static void __exit floppy_module_exit(void) | |||
| 4578 | 4580 | ||
| 4579 | cancel_delayed_work_sync(&fd_timeout); | 4581 | cancel_delayed_work_sync(&fd_timeout); |
| 4580 | cancel_delayed_work_sync(&fd_timer); | 4582 | cancel_delayed_work_sync(&fd_timer); |
| 4581 | destroy_workqueue(floppy_wq); | ||
| 4582 | 4583 | ||
| 4583 | if (atomic_read(&usage_count)) | 4584 | if (atomic_read(&usage_count)) |
| 4584 | floppy_release_irq_and_dma(); | 4585 | floppy_release_irq_and_dma(); |
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index adc6f36564cf..9694dd99bbbc 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c | |||
| @@ -559,7 +559,7 @@ static void mtip_timeout_function(unsigned long int data) | |||
| 559 | struct mtip_cmd *command; | 559 | struct mtip_cmd *command; |
| 560 | int tag, cmdto_cnt = 0; | 560 | int tag, cmdto_cnt = 0; |
| 561 | unsigned int bit, group; | 561 | unsigned int bit, group; |
| 562 | unsigned int num_command_slots = port->dd->slot_groups * 32; | 562 | unsigned int num_command_slots; |
| 563 | unsigned long to, tagaccum[SLOTBITS_IN_LONGS]; | 563 | unsigned long to, tagaccum[SLOTBITS_IN_LONGS]; |
| 564 | 564 | ||
| 565 | if (unlikely(!port)) | 565 | if (unlikely(!port)) |
| @@ -572,6 +572,7 @@ static void mtip_timeout_function(unsigned long int data) | |||
| 572 | } | 572 | } |
| 573 | /* clear the tag accumulator */ | 573 | /* clear the tag accumulator */ |
| 574 | memset(tagaccum, 0, SLOTBITS_IN_LONGS * sizeof(long)); | 574 | memset(tagaccum, 0, SLOTBITS_IN_LONGS * sizeof(long)); |
| 575 | num_command_slots = port->dd->slot_groups * 32; | ||
| 575 | 576 | ||
| 576 | for (tag = 0; tag < num_command_slots; tag++) { | 577 | for (tag = 0; tag < num_command_slots; tag++) { |
| 577 | /* | 578 | /* |
| @@ -2218,8 +2219,8 @@ static int exec_drive_taskfile(struct driver_data *dd, | |||
| 2218 | fis.device); | 2219 | fis.device); |
| 2219 | 2220 | ||
| 2220 | /* check for erase mode support during secure erase.*/ | 2221 | /* check for erase mode support during secure erase.*/ |
| 2221 | if ((fis.command == ATA_CMD_SEC_ERASE_UNIT) | 2222 | if ((fis.command == ATA_CMD_SEC_ERASE_UNIT) && outbuf && |
| 2222 | && (outbuf[0] & MTIP_SEC_ERASE_MODE)) { | 2223 | (outbuf[0] & MTIP_SEC_ERASE_MODE)) { |
| 2223 | erasemode = 1; | 2224 | erasemode = 1; |
| 2224 | } | 2225 | } |
| 2225 | 2226 | ||
| @@ -2439,7 +2440,7 @@ static int mtip_hw_ioctl(struct driver_data *dd, unsigned int cmd, | |||
| 2439 | * return value | 2440 | * return value |
| 2440 | * None | 2441 | * None |
| 2441 | */ | 2442 | */ |
| 2442 | static void mtip_hw_submit_io(struct driver_data *dd, sector_t start, | 2443 | static void mtip_hw_submit_io(struct driver_data *dd, sector_t sector, |
| 2443 | int nsect, int nents, int tag, void *callback, | 2444 | int nsect, int nents, int tag, void *callback, |
| 2444 | void *data, int dir) | 2445 | void *data, int dir) |
| 2445 | { | 2446 | { |
| @@ -2447,6 +2448,7 @@ static void mtip_hw_submit_io(struct driver_data *dd, sector_t start, | |||
| 2447 | struct mtip_port *port = dd->port; | 2448 | struct mtip_port *port = dd->port; |
| 2448 | struct mtip_cmd *command = &port->commands[tag]; | 2449 | struct mtip_cmd *command = &port->commands[tag]; |
| 2449 | int dma_dir = (dir == READ) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; | 2450 | int dma_dir = (dir == READ) ? DMA_FROM_DEVICE : DMA_TO_DEVICE; |
| 2451 | u64 start = sector; | ||
| 2450 | 2452 | ||
| 2451 | /* Map the scatter list for DMA access */ | 2453 | /* Map the scatter list for DMA access */ |
| 2452 | nents = dma_map_sg(&dd->pdev->dev, command->sg, nents, dma_dir); | 2454 | nents = dma_map_sg(&dd->pdev->dev, command->sg, nents, dma_dir); |
| @@ -2465,8 +2467,12 @@ static void mtip_hw_submit_io(struct driver_data *dd, sector_t start, | |||
| 2465 | fis->opts = 1 << 7; | 2467 | fis->opts = 1 << 7; |
| 2466 | fis->command = | 2468 | fis->command = |
| 2467 | (dir == READ ? ATA_CMD_FPDMA_READ : ATA_CMD_FPDMA_WRITE); | 2469 | (dir == READ ? ATA_CMD_FPDMA_READ : ATA_CMD_FPDMA_WRITE); |
| 2468 | *((unsigned int *) &fis->lba_low) = (start & 0xFFFFFF); | 2470 | fis->lba_low = start & 0xFF; |
| 2469 | *((unsigned int *) &fis->lba_low_ex) = ((start >> 24) & 0xFFFFFF); | 2471 | fis->lba_mid = (start >> 8) & 0xFF; |
| 2472 | fis->lba_hi = (start >> 16) & 0xFF; | ||
| 2473 | fis->lba_low_ex = (start >> 24) & 0xFF; | ||
| 2474 | fis->lba_mid_ex = (start >> 32) & 0xFF; | ||
| 2475 | fis->lba_hi_ex = (start >> 40) & 0xFF; | ||
| 2470 | fis->device = 1 << 6; | 2476 | fis->device = 1 << 6; |
| 2471 | fis->features = nsect & 0xFF; | 2477 | fis->features = nsect & 0xFF; |
| 2472 | fis->features_ex = (nsect >> 8) & 0xFF; | 2478 | fis->features_ex = (nsect >> 8) & 0xFF; |
diff --git a/drivers/block/mtip32xx/mtip32xx.h b/drivers/block/mtip32xx/mtip32xx.h index 5f4a917bd8bb..b1742640556a 100644 --- a/drivers/block/mtip32xx/mtip32xx.h +++ b/drivers/block/mtip32xx/mtip32xx.h | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | #define PCIE_CONFIG_EXT_DEVICE_CONTROL_OFFSET 0x48 | 34 | #define PCIE_CONFIG_EXT_DEVICE_CONTROL_OFFSET 0x48 |
| 35 | 35 | ||
| 36 | /* check for erase mode support during secure erase */ | 36 | /* check for erase mode support during secure erase */ |
| 37 | #define MTIP_SEC_ERASE_MODE 0x3 | 37 | #define MTIP_SEC_ERASE_MODE 0x2 |
| 38 | 38 | ||
| 39 | /* # of times to retry timed out/failed IOs */ | 39 | /* # of times to retry timed out/failed IOs */ |
| 40 | #define MTIP_MAX_RETRIES 2 | 40 | #define MTIP_MAX_RETRIES 2 |
| @@ -155,14 +155,14 @@ enum { | |||
| 155 | MTIP_DDF_REBUILD_FAILED_BIT = 8, | 155 | MTIP_DDF_REBUILD_FAILED_BIT = 8, |
| 156 | }; | 156 | }; |
| 157 | 157 | ||
| 158 | __packed struct smart_attr{ | 158 | struct smart_attr { |
| 159 | u8 attr_id; | 159 | u8 attr_id; |
| 160 | u16 flags; | 160 | u16 flags; |
| 161 | u8 cur; | 161 | u8 cur; |
| 162 | u8 worst; | 162 | u8 worst; |
| 163 | u32 data; | 163 | u32 data; |
| 164 | u8 res[3]; | 164 | u8 res[3]; |
| 165 | }; | 165 | } __packed; |
| 166 | 166 | ||
| 167 | /* Register Frame Information Structure (FIS), host to device. */ | 167 | /* Register Frame Information Structure (FIS), host to device. */ |
| 168 | struct host_to_dev_fis { | 168 | struct host_to_dev_fis { |
diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig index fbd9b2b850ef..c58ea9b80b1a 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig | |||
| @@ -127,12 +127,12 @@ config HW_RANDOM_VIA | |||
| 127 | If unsure, say Y. | 127 | If unsure, say Y. |
| 128 | 128 | ||
| 129 | config HW_RANDOM_IXP4XX | 129 | config HW_RANDOM_IXP4XX |
| 130 | tristate "Intel IXP4xx NPU HW Random Number Generator support" | 130 | tristate "Intel IXP4xx NPU HW Pseudo-Random Number Generator support" |
| 131 | depends on HW_RANDOM && ARCH_IXP4XX | 131 | depends on HW_RANDOM && ARCH_IXP4XX |
| 132 | default HW_RANDOM | 132 | default HW_RANDOM |
| 133 | ---help--- | 133 | ---help--- |
| 134 | This driver provides kernel-side support for the Random | 134 | This driver provides kernel-side support for the Pseudo-Random |
| 135 | Number Generator hardware found on the Intel IXP4xx NPU. | 135 | Number Generator hardware found on the Intel IXP45x/46x NPU. |
| 136 | 136 | ||
| 137 | To compile this driver as a module, choose M here: the | 137 | To compile this driver as a module, choose M here: the |
| 138 | module will be called ixp4xx-rng. | 138 | module will be called ixp4xx-rng. |
diff --git a/drivers/char/hw_random/ixp4xx-rng.c b/drivers/char/hw_random/ixp4xx-rng.c index 263567f5f392..beec1627db3c 100644 --- a/drivers/char/hw_random/ixp4xx-rng.c +++ b/drivers/char/hw_random/ixp4xx-rng.c | |||
| @@ -45,6 +45,9 @@ static int __init ixp4xx_rng_init(void) | |||
| 45 | void __iomem * rng_base; | 45 | void __iomem * rng_base; |
| 46 | int err; | 46 | int err; |
| 47 | 47 | ||
| 48 | if (!cpu_is_ixp46x()) /* includes IXP455 */ | ||
| 49 | return -ENOSYS; | ||
| 50 | |||
| 48 | rng_base = ioremap(0x70002100, 4); | 51 | rng_base = ioremap(0x70002100, 4); |
| 49 | if (!rng_base) | 52 | if (!rng_base) |
| 50 | return -ENOMEM; | 53 | return -ENOMEM; |
| @@ -68,5 +71,5 @@ module_init(ixp4xx_rng_init); | |||
| 68 | module_exit(ixp4xx_rng_exit); | 71 | module_exit(ixp4xx_rng_exit); |
| 69 | 72 | ||
| 70 | MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>"); | 73 | MODULE_AUTHOR("Deepak Saxena <dsaxena@plexity.net>"); |
| 71 | MODULE_DESCRIPTION("H/W Random Number Generator (RNG) driver for IXP4xx"); | 74 | MODULE_DESCRIPTION("H/W Pseudo-Random Number Generator (RNG) driver for IXP45x/46x"); |
| 72 | MODULE_LICENSE("GPL"); | 75 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/char/raw.c b/drivers/char/raw.c index 0bb207eaef2f..54a3a6d09819 100644 --- a/drivers/char/raw.c +++ b/drivers/char/raw.c | |||
| @@ -285,7 +285,7 @@ static long raw_ctl_compat_ioctl(struct file *file, unsigned int cmd, | |||
| 285 | 285 | ||
| 286 | static const struct file_operations raw_fops = { | 286 | static const struct file_operations raw_fops = { |
| 287 | .read = do_sync_read, | 287 | .read = do_sync_read, |
| 288 | .aio_read = blkdev_aio_read, | 288 | .aio_read = generic_file_aio_read, |
| 289 | .write = do_sync_write, | 289 | .write = do_sync_write, |
| 290 | .aio_write = blkdev_aio_write, | 290 | .aio_write = blkdev_aio_write, |
| 291 | .fsync = blkdev_fsync, | 291 | .fsync = blkdev_fsync, |
diff --git a/drivers/crypto/Kconfig b/drivers/crypto/Kconfig index 308c7fb92a60..f6644f59fd9d 100644 --- a/drivers/crypto/Kconfig +++ b/drivers/crypto/Kconfig | |||
| @@ -224,7 +224,7 @@ config CRYPTO_DEV_TALITOS | |||
| 224 | 224 | ||
| 225 | config CRYPTO_DEV_IXP4XX | 225 | config CRYPTO_DEV_IXP4XX |
| 226 | tristate "Driver for IXP4xx crypto hardware acceleration" | 226 | tristate "Driver for IXP4xx crypto hardware acceleration" |
| 227 | depends on ARCH_IXP4XX | 227 | depends on ARCH_IXP4XX && IXP4XX_QMGR && IXP4XX_NPE |
| 228 | select CRYPTO_DES | 228 | select CRYPTO_DES |
| 229 | select CRYPTO_ALGAPI | 229 | select CRYPTO_ALGAPI |
| 230 | select CRYPTO_AUTHENC | 230 | select CRYPTO_AUTHENC |
diff --git a/drivers/crypto/ixp4xx_crypto.c b/drivers/crypto/ixp4xx_crypto.c index 8f3f74ce8c7f..21180d6cad6e 100644 --- a/drivers/crypto/ixp4xx_crypto.c +++ b/drivers/crypto/ixp4xx_crypto.c | |||
| @@ -750,12 +750,12 @@ static int setup_cipher(struct crypto_tfm *tfm, int encrypt, | |||
| 750 | } | 750 | } |
| 751 | if (cipher_cfg & MOD_AES) { | 751 | if (cipher_cfg & MOD_AES) { |
| 752 | switch (key_len) { | 752 | switch (key_len) { |
| 753 | case 16: keylen_cfg = MOD_AES128 | KEYLEN_128; break; | 753 | case 16: keylen_cfg = MOD_AES128; break; |
| 754 | case 24: keylen_cfg = MOD_AES192 | KEYLEN_192; break; | 754 | case 24: keylen_cfg = MOD_AES192; break; |
| 755 | case 32: keylen_cfg = MOD_AES256 | KEYLEN_256; break; | 755 | case 32: keylen_cfg = MOD_AES256; break; |
| 756 | default: | 756 | default: |
| 757 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; | 757 | *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; |
| 758 | return -EINVAL; | 758 | return -EINVAL; |
| 759 | } | 759 | } |
| 760 | cipher_cfg |= keylen_cfg; | 760 | cipher_cfg |= keylen_cfg; |
| 761 | } else if (cipher_cfg & MOD_3DES) { | 761 | } else if (cipher_cfg & MOD_3DES) { |
diff --git a/drivers/edac/amd64_edac.h b/drivers/edac/amd64_edac.h index 8d4804732bac..8c4139647efc 100644 --- a/drivers/edac/amd64_edac.h +++ b/drivers/edac/amd64_edac.h | |||
| @@ -33,7 +33,7 @@ | |||
| 33 | * detection. The mods to Rev F required more family | 33 | * detection. The mods to Rev F required more family |
| 34 | * information detection. | 34 | * information detection. |
| 35 | * | 35 | * |
| 36 | * Changes/Fixes by Borislav Petkov <borislav.petkov@amd.com>: | 36 | * Changes/Fixes by Borislav Petkov <bp@alien8.de>: |
| 37 | * - misc fixes and code cleanups | 37 | * - misc fixes and code cleanups |
| 38 | * | 38 | * |
| 39 | * This module is based on the following documents | 39 | * This module is based on the following documents |
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index 90f0b730e9bb..75c0a1a85fc3 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c | |||
| @@ -416,10 +416,18 @@ struct mem_ctl_info *edac_mc_alloc(unsigned mc_num, | |||
| 416 | dimm->cschannel = chn; | 416 | dimm->cschannel = chn; |
| 417 | 417 | ||
| 418 | /* Increment csrow location */ | 418 | /* Increment csrow location */ |
| 419 | row++; | 419 | if (layers[0].is_virt_csrow) { |
| 420 | if (row == tot_csrows) { | ||
| 421 | row = 0; | ||
| 422 | chn++; | 420 | chn++; |
| 421 | if (chn == tot_channels) { | ||
| 422 | chn = 0; | ||
| 423 | row++; | ||
| 424 | } | ||
| 425 | } else { | ||
| 426 | row++; | ||
| 427 | if (row == tot_csrows) { | ||
| 428 | row = 0; | ||
| 429 | chn++; | ||
| 430 | } | ||
| 423 | } | 431 | } |
| 424 | 432 | ||
| 425 | /* Increment dimm location */ | 433 | /* Increment dimm location */ |
diff --git a/drivers/edac/edac_stub.c b/drivers/edac/edac_stub.c index 6c86f6e54558..351945fa2ecd 100644 --- a/drivers/edac/edac_stub.c +++ b/drivers/edac/edac_stub.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * | 5 | * |
| 6 | * 2007 (c) MontaVista Software, Inc. | 6 | * 2007 (c) MontaVista Software, Inc. |
| 7 | * 2010 (c) Advanced Micro Devices Inc. | 7 | * 2010 (c) Advanced Micro Devices Inc. |
| 8 | * Borislav Petkov <borislav.petkov@amd.com> | 8 | * Borislav Petkov <bp@alien8.de> |
| 9 | * | 9 | * |
| 10 | * This file is licensed under the terms of the GNU General Public | 10 | * This file is licensed under the terms of the GNU General Public |
| 11 | * License version 2. This program is licensed "as is" without any | 11 | * License version 2. This program is licensed "as is" without any |
diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c index a09d0667f72a..9d669cd43618 100644 --- a/drivers/edac/i7300_edac.c +++ b/drivers/edac/i7300_edac.c | |||
| @@ -197,8 +197,8 @@ static const char *ferr_fat_fbd_name[] = { | |||
| 197 | [0] = "Memory Write error on non-redundant retry or " | 197 | [0] = "Memory Write error on non-redundant retry or " |
| 198 | "FBD configuration Write error on retry", | 198 | "FBD configuration Write error on retry", |
| 199 | }; | 199 | }; |
| 200 | #define GET_FBD_FAT_IDX(fbderr) (fbderr & (3 << 28)) | 200 | #define GET_FBD_FAT_IDX(fbderr) (((fbderr) >> 28) & 3) |
| 201 | #define FERR_FAT_FBD_ERR_MASK ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3)) | 201 | #define FERR_FAT_FBD_ERR_MASK ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 22)) |
| 202 | 202 | ||
| 203 | #define FERR_NF_FBD 0xa0 | 203 | #define FERR_NF_FBD 0xa0 |
| 204 | static const char *ferr_nf_fbd_name[] = { | 204 | static const char *ferr_nf_fbd_name[] = { |
| @@ -225,7 +225,7 @@ static const char *ferr_nf_fbd_name[] = { | |||
| 225 | [1] = "Aliased Uncorrectable Non-Mirrored Demand Data ECC", | 225 | [1] = "Aliased Uncorrectable Non-Mirrored Demand Data ECC", |
| 226 | [0] = "Uncorrectable Data ECC on Replay", | 226 | [0] = "Uncorrectable Data ECC on Replay", |
| 227 | }; | 227 | }; |
| 228 | #define GET_FBD_NF_IDX(fbderr) (fbderr & (3 << 28)) | 228 | #define GET_FBD_NF_IDX(fbderr) (((fbderr) >> 28) & 3) |
| 229 | #define FERR_NF_FBD_ERR_MASK ((1 << 24) | (1 << 23) | (1 << 22) | (1 << 21) |\ | 229 | #define FERR_NF_FBD_ERR_MASK ((1 << 24) | (1 << 23) | (1 << 22) | (1 << 21) |\ |
| 230 | (1 << 18) | (1 << 17) | (1 << 16) | (1 << 15) |\ | 230 | (1 << 18) | (1 << 17) | (1 << 16) | (1 << 15) |\ |
| 231 | (1 << 14) | (1 << 13) | (1 << 11) | (1 << 10) |\ | 231 | (1 << 14) | (1 << 13) | (1 << 11) | (1 << 10) |\ |
| @@ -464,7 +464,7 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci) | |||
| 464 | errnum = find_first_bit(&errors, | 464 | errnum = find_first_bit(&errors, |
| 465 | ARRAY_SIZE(ferr_nf_fbd_name)); | 465 | ARRAY_SIZE(ferr_nf_fbd_name)); |
| 466 | specific = GET_ERR_FROM_TABLE(ferr_nf_fbd_name, errnum); | 466 | specific = GET_ERR_FROM_TABLE(ferr_nf_fbd_name, errnum); |
| 467 | branch = (GET_FBD_FAT_IDX(error_reg) == 2) ? 1 : 0; | 467 | branch = (GET_FBD_NF_IDX(error_reg) == 2) ? 1 : 0; |
| 468 | 468 | ||
| 469 | pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, | 469 | pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, |
| 470 | REDMEMA, &syndrome); | 470 | REDMEMA, &syndrome); |
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index 3672101023bd..10c8c00d6469 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c | |||
| @@ -816,7 +816,7 @@ static ssize_t i7core_inject_store_##param( \ | |||
| 816 | struct device_attribute *mattr, \ | 816 | struct device_attribute *mattr, \ |
| 817 | const char *data, size_t count) \ | 817 | const char *data, size_t count) \ |
| 818 | { \ | 818 | { \ |
| 819 | struct mem_ctl_info *mci = to_mci(dev); \ | 819 | struct mem_ctl_info *mci = dev_get_drvdata(dev); \ |
| 820 | struct i7core_pvt *pvt; \ | 820 | struct i7core_pvt *pvt; \ |
| 821 | long value; \ | 821 | long value; \ |
| 822 | int rc; \ | 822 | int rc; \ |
| @@ -845,7 +845,7 @@ static ssize_t i7core_inject_show_##param( \ | |||
| 845 | struct device_attribute *mattr, \ | 845 | struct device_attribute *mattr, \ |
| 846 | char *data) \ | 846 | char *data) \ |
| 847 | { \ | 847 | { \ |
| 848 | struct mem_ctl_info *mci = to_mci(dev); \ | 848 | struct mem_ctl_info *mci = dev_get_drvdata(dev); \ |
| 849 | struct i7core_pvt *pvt; \ | 849 | struct i7core_pvt *pvt; \ |
| 850 | \ | 850 | \ |
| 851 | pvt = mci->pvt_info; \ | 851 | pvt = mci->pvt_info; \ |
| @@ -1052,7 +1052,7 @@ static ssize_t i7core_show_counter_##param( \ | |||
| 1052 | struct device_attribute *mattr, \ | 1052 | struct device_attribute *mattr, \ |
| 1053 | char *data) \ | 1053 | char *data) \ |
| 1054 | { \ | 1054 | { \ |
| 1055 | struct mem_ctl_info *mci = to_mci(dev); \ | 1055 | struct mem_ctl_info *mci = dev_get_drvdata(dev); \ |
| 1056 | struct i7core_pvt *pvt = mci->pvt_info; \ | 1056 | struct i7core_pvt *pvt = mci->pvt_info; \ |
| 1057 | \ | 1057 | \ |
| 1058 | edac_dbg(1, "\n"); \ | 1058 | edac_dbg(1, "\n"); \ |
diff --git a/drivers/edac/i82975x_edac.c b/drivers/edac/i82975x_edac.c index 069e26c11c4f..a98020409fa9 100644 --- a/drivers/edac/i82975x_edac.c +++ b/drivers/edac/i82975x_edac.c | |||
| @@ -370,10 +370,6 @@ static enum dev_type i82975x_dram_type(void __iomem *mch_window, int rank) | |||
| 370 | static void i82975x_init_csrows(struct mem_ctl_info *mci, | 370 | static void i82975x_init_csrows(struct mem_ctl_info *mci, |
| 371 | struct pci_dev *pdev, void __iomem *mch_window) | 371 | struct pci_dev *pdev, void __iomem *mch_window) |
| 372 | { | 372 | { |
| 373 | static const char *labels[4] = { | ||
| 374 | "DIMM A1", "DIMM A2", | ||
| 375 | "DIMM B1", "DIMM B2" | ||
| 376 | }; | ||
| 377 | struct csrow_info *csrow; | 373 | struct csrow_info *csrow; |
| 378 | unsigned long last_cumul_size; | 374 | unsigned long last_cumul_size; |
| 379 | u8 value; | 375 | u8 value; |
| @@ -423,9 +419,10 @@ static void i82975x_init_csrows(struct mem_ctl_info *mci, | |||
| 423 | dimm = mci->csrows[index]->channels[chan]->dimm; | 419 | dimm = mci->csrows[index]->channels[chan]->dimm; |
| 424 | 420 | ||
| 425 | dimm->nr_pages = nr_pages / csrow->nr_channels; | 421 | dimm->nr_pages = nr_pages / csrow->nr_channels; |
| 426 | strncpy(csrow->channels[chan]->dimm->label, | 422 | |
| 427 | labels[(index >> 1) + (chan * 2)], | 423 | snprintf(csrow->channels[chan]->dimm->label, EDAC_MC_LABEL_LEN, "DIMM %c%d", |
| 428 | EDAC_MC_LABEL_LEN); | 424 | (chan == 0) ? 'A' : 'B', |
| 425 | index); | ||
| 429 | dimm->grain = 1 << 7; /* 128Byte cache-line resolution */ | 426 | dimm->grain = 1 << 7; /* 128Byte cache-line resolution */ |
| 430 | dimm->dtype = i82975x_dram_type(mch_window, index); | 427 | dimm->dtype = i82975x_dram_type(mch_window, index); |
| 431 | dimm->mtype = MEM_DDR2; /* I82975x supports only DDR2 */ | 428 | dimm->mtype = MEM_DDR2; /* I82975x supports only DDR2 */ |
diff --git a/drivers/edac/mce_amd_inj.c b/drivers/edac/mce_amd_inj.c index 66b5151c1080..2ae78f20cc28 100644 --- a/drivers/edac/mce_amd_inj.c +++ b/drivers/edac/mce_amd_inj.c | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | * This file may be distributed under the terms of the GNU General Public | 6 | * This file may be distributed under the terms of the GNU General Public |
| 7 | * License version 2. | 7 | * License version 2. |
| 8 | * | 8 | * |
| 9 | * Copyright (c) 2010: Borislav Petkov <borislav.petkov@amd.com> | 9 | * Copyright (c) 2010: Borislav Petkov <bp@alien8.de> |
| 10 | * Advanced Micro Devices Inc. | 10 | * Advanced Micro Devices Inc. |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| @@ -168,6 +168,6 @@ module_init(edac_init_mce_inject); | |||
| 168 | module_exit(edac_exit_mce_inject); | 168 | module_exit(edac_exit_mce_inject); |
| 169 | 169 | ||
| 170 | MODULE_LICENSE("GPL"); | 170 | MODULE_LICENSE("GPL"); |
| 171 | MODULE_AUTHOR("Borislav Petkov <borislav.petkov@amd.com>"); | 171 | MODULE_AUTHOR("Borislav Petkov <bp@alien8.de>"); |
| 172 | MODULE_AUTHOR("AMD Inc."); | 172 | MODULE_AUTHOR("AMD Inc."); |
| 173 | MODULE_DESCRIPTION("MCE injection facility for testing MCE decoding"); | 173 | MODULE_DESCRIPTION("MCE injection facility for testing MCE decoding"); |
diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c index 1162d6b3bf85..bb1b392f5cda 100644 --- a/drivers/firewire/sbp2.c +++ b/drivers/firewire/sbp2.c | |||
| @@ -1546,6 +1546,8 @@ static int sbp2_scsi_slave_configure(struct scsi_device *sdev) | |||
| 1546 | struct sbp2_logical_unit *lu = sdev->hostdata; | 1546 | struct sbp2_logical_unit *lu = sdev->hostdata; |
| 1547 | 1547 | ||
| 1548 | sdev->use_10_for_rw = 1; | 1548 | sdev->use_10_for_rw = 1; |
| 1549 | sdev->no_report_opcodes = 1; | ||
| 1550 | sdev->no_write_same = 1; | ||
| 1549 | 1551 | ||
| 1550 | if (sbp2_param_exclusive_login) | 1552 | if (sbp2_param_exclusive_login) |
| 1551 | sdev->manage_start_stop = 1; | 1553 | sdev->manage_start_stop = 1; |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index f11d8e3b4041..47150f5ded04 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
| @@ -466,7 +466,7 @@ config GPIO_ADP5588_IRQ | |||
| 466 | 466 | ||
| 467 | config GPIO_ADNP | 467 | config GPIO_ADNP |
| 468 | tristate "Avionic Design N-bit GPIO expander" | 468 | tristate "Avionic Design N-bit GPIO expander" |
| 469 | depends on I2C && OF | 469 | depends on I2C && OF_GPIO |
| 470 | help | 470 | help |
| 471 | This option enables support for N GPIOs found on Avionic Design | 471 | This option enables support for N GPIOs found on Avionic Design |
| 472 | I2C GPIO expanders. The register space will be extended by powers | 472 | I2C GPIO expanders. The register space will be extended by powers |
diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c index 0f425189de11..ce1c84760076 100644 --- a/drivers/gpio/gpio-mcp23s08.c +++ b/drivers/gpio/gpio-mcp23s08.c | |||
| @@ -77,7 +77,7 @@ struct mcp23s08_driver_data { | |||
| 77 | 77 | ||
| 78 | /*----------------------------------------------------------------------*/ | 78 | /*----------------------------------------------------------------------*/ |
| 79 | 79 | ||
| 80 | #ifdef CONFIG_I2C | 80 | #if IS_ENABLED(CONFIG_I2C) |
| 81 | 81 | ||
| 82 | static int mcp23008_read(struct mcp23s08 *mcp, unsigned reg) | 82 | static int mcp23008_read(struct mcp23s08 *mcp, unsigned reg) |
| 83 | { | 83 | { |
| @@ -399,7 +399,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev, | |||
| 399 | break; | 399 | break; |
| 400 | #endif /* CONFIG_SPI_MASTER */ | 400 | #endif /* CONFIG_SPI_MASTER */ |
| 401 | 401 | ||
| 402 | #ifdef CONFIG_I2C | 402 | #if IS_ENABLED(CONFIG_I2C) |
| 403 | case MCP_TYPE_008: | 403 | case MCP_TYPE_008: |
| 404 | mcp->ops = &mcp23008_ops; | 404 | mcp->ops = &mcp23008_ops; |
| 405 | mcp->chip.ngpio = 8; | 405 | mcp->chip.ngpio = 8; |
| @@ -473,7 +473,7 @@ fail: | |||
| 473 | 473 | ||
| 474 | /*----------------------------------------------------------------------*/ | 474 | /*----------------------------------------------------------------------*/ |
| 475 | 475 | ||
| 476 | #ifdef CONFIG_I2C | 476 | #if IS_ENABLED(CONFIG_I2C) |
| 477 | 477 | ||
| 478 | static int __devinit mcp230xx_probe(struct i2c_client *client, | 478 | static int __devinit mcp230xx_probe(struct i2c_client *client, |
| 479 | const struct i2c_device_id *id) | 479 | const struct i2c_device_id *id) |
diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c index cf7afb9eb61a..be65c0451ad5 100644 --- a/drivers/gpio/gpio-mvebu.c +++ b/drivers/gpio/gpio-mvebu.c | |||
| @@ -92,6 +92,11 @@ static inline void __iomem *mvebu_gpioreg_out(struct mvebu_gpio_chip *mvchip) | |||
| 92 | return mvchip->membase + GPIO_OUT_OFF; | 92 | return mvchip->membase + GPIO_OUT_OFF; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | static inline void __iomem *mvebu_gpioreg_blink(struct mvebu_gpio_chip *mvchip) | ||
| 96 | { | ||
| 97 | return mvchip->membase + GPIO_BLINK_EN_OFF; | ||
| 98 | } | ||
| 99 | |||
| 95 | static inline void __iomem *mvebu_gpioreg_io_conf(struct mvebu_gpio_chip *mvchip) | 100 | static inline void __iomem *mvebu_gpioreg_io_conf(struct mvebu_gpio_chip *mvchip) |
| 96 | { | 101 | { |
| 97 | return mvchip->membase + GPIO_IO_CONF_OFF; | 102 | return mvchip->membase + GPIO_IO_CONF_OFF; |
| @@ -206,6 +211,23 @@ static int mvebu_gpio_get(struct gpio_chip *chip, unsigned pin) | |||
| 206 | return (u >> pin) & 1; | 211 | return (u >> pin) & 1; |
| 207 | } | 212 | } |
| 208 | 213 | ||
| 214 | static void mvebu_gpio_blink(struct gpio_chip *chip, unsigned pin, int value) | ||
| 215 | { | ||
| 216 | struct mvebu_gpio_chip *mvchip = | ||
| 217 | container_of(chip, struct mvebu_gpio_chip, chip); | ||
| 218 | unsigned long flags; | ||
| 219 | u32 u; | ||
| 220 | |||
| 221 | spin_lock_irqsave(&mvchip->lock, flags); | ||
| 222 | u = readl_relaxed(mvebu_gpioreg_blink(mvchip)); | ||
| 223 | if (value) | ||
| 224 | u |= 1 << pin; | ||
| 225 | else | ||
| 226 | u &= ~(1 << pin); | ||
| 227 | writel_relaxed(u, mvebu_gpioreg_blink(mvchip)); | ||
| 228 | spin_unlock_irqrestore(&mvchip->lock, flags); | ||
| 229 | } | ||
| 230 | |||
| 209 | static int mvebu_gpio_direction_input(struct gpio_chip *chip, unsigned pin) | 231 | static int mvebu_gpio_direction_input(struct gpio_chip *chip, unsigned pin) |
| 210 | { | 232 | { |
| 211 | struct mvebu_gpio_chip *mvchip = | 233 | struct mvebu_gpio_chip *mvchip = |
| @@ -244,6 +266,7 @@ static int mvebu_gpio_direction_output(struct gpio_chip *chip, unsigned pin, | |||
| 244 | if (ret) | 266 | if (ret) |
| 245 | return ret; | 267 | return ret; |
| 246 | 268 | ||
| 269 | mvebu_gpio_blink(chip, pin, 0); | ||
| 247 | mvebu_gpio_set(chip, pin, value); | 270 | mvebu_gpio_set(chip, pin, value); |
| 248 | 271 | ||
| 249 | spin_lock_irqsave(&mvchip->lock, flags); | 272 | spin_lock_irqsave(&mvchip->lock, flags); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index 241ad1eeec64..f2df06c603f7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c | |||
| @@ -226,6 +226,12 @@ static void exynos_drm_encoder_commit(struct drm_encoder *encoder) | |||
| 226 | * already updated or not by exynos_drm_encoder_dpms function. | 226 | * already updated or not by exynos_drm_encoder_dpms function. |
| 227 | */ | 227 | */ |
| 228 | exynos_encoder->updated = true; | 228 | exynos_encoder->updated = true; |
| 229 | |||
| 230 | /* | ||
| 231 | * In case of setcrtc, there is no way to update encoder's dpms | ||
| 232 | * so update it here. | ||
| 233 | */ | ||
| 234 | exynos_encoder->dpms = DRM_MODE_DPMS_ON; | ||
| 229 | } | 235 | } |
| 230 | 236 | ||
| 231 | static void exynos_drm_encoder_disable(struct drm_encoder *encoder) | 237 | static void exynos_drm_encoder_disable(struct drm_encoder *encoder) |
| @@ -507,6 +513,6 @@ void exynos_drm_encoder_plane_disable(struct drm_encoder *encoder, void *data) | |||
| 507 | * because the setting for disabling the overlay will be updated | 513 | * because the setting for disabling the overlay will be updated |
| 508 | * at vsync. | 514 | * at vsync. |
| 509 | */ | 515 | */ |
| 510 | if (overlay_ops->wait_for_vblank) | 516 | if (overlay_ops && overlay_ops->wait_for_vblank) |
| 511 | overlay_ops->wait_for_vblank(manager->dev); | 517 | overlay_ops->wait_for_vblank(manager->dev); |
| 512 | } | 518 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 67eb6ba56edf..e7466c4414cb 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c | |||
| @@ -87,7 +87,8 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper, | |||
| 87 | 87 | ||
| 88 | dev->mode_config.fb_base = (resource_size_t)buffer->dma_addr; | 88 | dev->mode_config.fb_base = (resource_size_t)buffer->dma_addr; |
| 89 | fbi->screen_base = buffer->kvaddr + offset; | 89 | fbi->screen_base = buffer->kvaddr + offset; |
| 90 | fbi->fix.smem_start = (unsigned long)(buffer->dma_addr + offset); | 90 | fbi->fix.smem_start = (unsigned long)(page_to_phys(buffer->pages[0]) + |
| 91 | offset); | ||
| 91 | fbi->screen_size = size; | 92 | fbi->screen_size = size; |
| 92 | fbi->fix.smem_len = size; | 93 | fbi->fix.smem_len = size; |
| 93 | 94 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index 130a2b510d4a..e08478f19f1a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
| @@ -61,11 +61,11 @@ struct fimd_driver_data { | |||
| 61 | unsigned int timing_base; | 61 | unsigned int timing_base; |
| 62 | }; | 62 | }; |
| 63 | 63 | ||
| 64 | struct fimd_driver_data exynos4_fimd_driver_data = { | 64 | static struct fimd_driver_data exynos4_fimd_driver_data = { |
| 65 | .timing_base = 0x0, | 65 | .timing_base = 0x0, |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | struct fimd_driver_data exynos5_fimd_driver_data = { | 68 | static struct fimd_driver_data exynos5_fimd_driver_data = { |
| 69 | .timing_base = 0x20000, | 69 | .timing_base = 0x20000, |
| 70 | }; | 70 | }; |
| 71 | 71 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c b/drivers/gpu/drm/exynos/exynos_drm_plane.c index 60b877a388c2..862ca1eb2102 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_plane.c +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c | |||
| @@ -204,7 +204,6 @@ exynos_update_plane(struct drm_plane *plane, struct drm_crtc *crtc, | |||
| 204 | return ret; | 204 | return ret; |
| 205 | 205 | ||
| 206 | plane->crtc = crtc; | 206 | plane->crtc = crtc; |
| 207 | plane->fb = crtc->fb; | ||
| 208 | 207 | ||
| 209 | exynos_plane_commit(plane); | 208 | exynos_plane_commit(plane); |
| 210 | exynos_plane_dpms(plane, DRM_MODE_DPMS_ON); | 209 | exynos_plane_dpms(plane, DRM_MODE_DPMS_ON); |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 107f09befe92..9b285da4449b 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -1796,7 +1796,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | |||
| 1796 | */ | 1796 | */ |
| 1797 | mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping; | 1797 | mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping; |
| 1798 | gfp = mapping_gfp_mask(mapping); | 1798 | gfp = mapping_gfp_mask(mapping); |
| 1799 | gfp |= __GFP_NORETRY | __GFP_NOWARN; | 1799 | gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD; |
| 1800 | gfp &= ~(__GFP_IO | __GFP_WAIT); | 1800 | gfp &= ~(__GFP_IO | __GFP_WAIT); |
| 1801 | for_each_sg(st->sgl, sg, page_count, i) { | 1801 | for_each_sg(st->sgl, sg, page_count, i) { |
| 1802 | page = shmem_read_mapping_page_gfp(mapping, i, gfp); | 1802 | page = shmem_read_mapping_page_gfp(mapping, i, gfp); |
| @@ -1809,7 +1809,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | |||
| 1809 | * our own buffer, now let the real VM do its job and | 1809 | * our own buffer, now let the real VM do its job and |
| 1810 | * go down in flames if truly OOM. | 1810 | * go down in flames if truly OOM. |
| 1811 | */ | 1811 | */ |
| 1812 | gfp &= ~(__GFP_NORETRY | __GFP_NOWARN); | 1812 | gfp &= ~(__GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD); |
| 1813 | gfp |= __GFP_IO | __GFP_WAIT; | 1813 | gfp |= __GFP_IO | __GFP_WAIT; |
| 1814 | 1814 | ||
| 1815 | i915_gem_shrink_all(dev_priv); | 1815 | i915_gem_shrink_all(dev_priv); |
| @@ -1817,7 +1817,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) | |||
| 1817 | if (IS_ERR(page)) | 1817 | if (IS_ERR(page)) |
| 1818 | goto err_pages; | 1818 | goto err_pages; |
| 1819 | 1819 | ||
| 1820 | gfp |= __GFP_NORETRY | __GFP_NOWARN; | 1820 | gfp |= __GFP_NORETRY | __GFP_NOWARN | __GFP_NO_KSWAPD; |
| 1821 | gfp &= ~(__GFP_IO | __GFP_WAIT); | 1821 | gfp &= ~(__GFP_IO | __GFP_WAIT); |
| 1822 | } | 1822 | } |
| 1823 | 1823 | ||
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 0ed6baff4b0c..56846ed5ee55 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
| @@ -499,12 +499,8 @@ parse_edp(struct drm_i915_private *dev_priv, struct bdb_header *bdb) | |||
| 499 | 499 | ||
| 500 | edp = find_section(bdb, BDB_EDP); | 500 | edp = find_section(bdb, BDB_EDP); |
| 501 | if (!edp) { | 501 | if (!edp) { |
| 502 | if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) { | 502 | if (SUPPORTS_EDP(dev_priv->dev) && dev_priv->edp.support) |
| 503 | DRM_DEBUG_KMS("No eDP BDB found but eDP panel " | 503 | DRM_DEBUG_KMS("No eDP BDB found but eDP panel supported.\n"); |
| 504 | "supported, assume %dbpp panel color " | ||
| 505 | "depth.\n", | ||
| 506 | dev_priv->edp.bpp); | ||
| 507 | } | ||
| 508 | return; | 504 | return; |
| 509 | } | 505 | } |
| 510 | 506 | ||
| @@ -657,9 +653,6 @@ init_vbt_defaults(struct drm_i915_private *dev_priv) | |||
| 657 | dev_priv->lvds_use_ssc = 1; | 653 | dev_priv->lvds_use_ssc = 1; |
| 658 | dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1); | 654 | dev_priv->lvds_ssc_freq = intel_bios_ssc_frequency(dev, 1); |
| 659 | DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq); | 655 | DRM_DEBUG_KMS("Set default to SSC at %dMHz\n", dev_priv->lvds_ssc_freq); |
| 660 | |||
| 661 | /* eDP data */ | ||
| 662 | dev_priv->edp.bpp = 18; | ||
| 663 | } | 656 | } |
| 664 | 657 | ||
| 665 | static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id) | 658 | static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id) |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 4154bcd7a070..b426d44a2b05 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -3845,7 +3845,7 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc, | |||
| 3845 | /* Use VBT settings if we have an eDP panel */ | 3845 | /* Use VBT settings if we have an eDP panel */ |
| 3846 | unsigned int edp_bpc = dev_priv->edp.bpp / 3; | 3846 | unsigned int edp_bpc = dev_priv->edp.bpp / 3; |
| 3847 | 3847 | ||
| 3848 | if (edp_bpc < display_bpc) { | 3848 | if (edp_bpc && edp_bpc < display_bpc) { |
| 3849 | DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc); | 3849 | DRM_DEBUG_KMS("clamping display bpc (was %d) to eDP (%d)\n", display_bpc, edp_bpc); |
| 3850 | display_bpc = edp_bpc; | 3850 | display_bpc = edp_bpc; |
| 3851 | } | 3851 | } |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 72f41aaa71ff..442968f8b201 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
| @@ -2373,15 +2373,9 @@ int intel_enable_rc6(const struct drm_device *dev) | |||
| 2373 | if (i915_enable_rc6 >= 0) | 2373 | if (i915_enable_rc6 >= 0) |
| 2374 | return i915_enable_rc6; | 2374 | return i915_enable_rc6; |
| 2375 | 2375 | ||
| 2376 | if (INTEL_INFO(dev)->gen == 5) { | 2376 | /* Disable RC6 on Ironlake */ |
| 2377 | #ifdef CONFIG_INTEL_IOMMU | 2377 | if (INTEL_INFO(dev)->gen == 5) |
| 2378 | /* Disable rc6 on ilk if VT-d is on. */ | 2378 | return 0; |
| 2379 | if (intel_iommu_gfx_mapped) | ||
| 2380 | return false; | ||
| 2381 | #endif | ||
| 2382 | DRM_DEBUG_DRIVER("Ironlake: only RC6 available\n"); | ||
| 2383 | return INTEL_RC6_ENABLE; | ||
| 2384 | } | ||
| 2385 | 2379 | ||
| 2386 | if (IS_HASWELL(dev)) { | 2380 | if (IS_HASWELL(dev)) { |
| 2387 | DRM_DEBUG_DRIVER("Haswell: only RC6 available\n"); | 2381 | DRM_DEBUG_DRIVER("Haswell: only RC6 available\n"); |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index c600fb06e25e..a6ac0b416964 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -2201,7 +2201,6 @@ intel_sdvo_dvi_init(struct intel_sdvo *intel_sdvo, int device) | |||
| 2201 | connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; | 2201 | connector->connector_type = DRM_MODE_CONNECTOR_HDMIA; |
| 2202 | intel_sdvo->is_hdmi = true; | 2202 | intel_sdvo->is_hdmi = true; |
| 2203 | } | 2203 | } |
| 2204 | intel_sdvo->base.cloneable = true; | ||
| 2205 | 2204 | ||
| 2206 | intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); | 2205 | intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); |
| 2207 | if (intel_sdvo->is_hdmi) | 2206 | if (intel_sdvo->is_hdmi) |
| @@ -2232,7 +2231,6 @@ intel_sdvo_tv_init(struct intel_sdvo *intel_sdvo, int type) | |||
| 2232 | 2231 | ||
| 2233 | intel_sdvo->is_tv = true; | 2232 | intel_sdvo->is_tv = true; |
| 2234 | intel_sdvo->base.needs_tv_clock = true; | 2233 | intel_sdvo->base.needs_tv_clock = true; |
| 2235 | intel_sdvo->base.cloneable = false; | ||
| 2236 | 2234 | ||
| 2237 | intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); | 2235 | intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); |
| 2238 | 2236 | ||
| @@ -2275,8 +2273,6 @@ intel_sdvo_analog_init(struct intel_sdvo *intel_sdvo, int device) | |||
| 2275 | intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB1; | 2273 | intel_sdvo_connector->output_flag = SDVO_OUTPUT_RGB1; |
| 2276 | } | 2274 | } |
| 2277 | 2275 | ||
| 2278 | intel_sdvo->base.cloneable = true; | ||
| 2279 | |||
| 2280 | intel_sdvo_connector_init(intel_sdvo_connector, | 2276 | intel_sdvo_connector_init(intel_sdvo_connector, |
| 2281 | intel_sdvo); | 2277 | intel_sdvo); |
| 2282 | return true; | 2278 | return true; |
| @@ -2307,9 +2303,6 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device) | |||
| 2307 | intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS1; | 2303 | intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS1; |
| 2308 | } | 2304 | } |
| 2309 | 2305 | ||
| 2310 | /* SDVO LVDS is not cloneable because the input mode gets adjusted by the encoder */ | ||
| 2311 | intel_sdvo->base.cloneable = false; | ||
| 2312 | |||
| 2313 | intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); | 2306 | intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo); |
| 2314 | if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector)) | 2307 | if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector)) |
| 2315 | goto err; | 2308 | goto err; |
| @@ -2721,6 +2714,16 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
| 2721 | goto err_output; | 2714 | goto err_output; |
| 2722 | } | 2715 | } |
| 2723 | 2716 | ||
| 2717 | /* | ||
| 2718 | * Cloning SDVO with anything is often impossible, since the SDVO | ||
| 2719 | * encoder can request a special input timing mode. And even if that's | ||
| 2720 | * not the case we have evidence that cloning a plain unscaled mode with | ||
| 2721 | * VGA doesn't really work. Furthermore the cloning flags are way too | ||
| 2722 | * simplistic anyway to express such constraints, so just give up on | ||
| 2723 | * cloning for SDVO encoders. | ||
| 2724 | */ | ||
| 2725 | intel_sdvo->base.cloneable = false; | ||
| 2726 | |||
| 2724 | /* Only enable the hotplug irq if we need it, to work around noisy | 2727 | /* Only enable the hotplug irq if we need it, to work around noisy |
| 2725 | * hotplug lines. | 2728 | * hotplug lines. |
| 2726 | */ | 2729 | */ |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c index 05a909a17cee..15b182c84ce8 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/nv50.c | |||
| @@ -49,13 +49,7 @@ nv50_disp_intr_vblank(struct nv50_disp_priv *priv, int crtc) | |||
| 49 | if (chan->vblank.crtc != crtc) | 49 | if (chan->vblank.crtc != crtc) |
| 50 | continue; | 50 | continue; |
| 51 | 51 | ||
| 52 | if (nv_device(priv)->chipset == 0x50) { | 52 | if (nv_device(priv)->chipset >= 0xc0) { |
| 53 | nv_wr32(priv, 0x001704, chan->vblank.channel); | ||
| 54 | nv_wr32(priv, 0x001710, 0x80000000 | chan->vblank.ctxdma); | ||
| 55 | bar->flush(bar); | ||
| 56 | nv_wr32(priv, 0x001570, chan->vblank.offset); | ||
| 57 | nv_wr32(priv, 0x001574, chan->vblank.value); | ||
| 58 | } else { | ||
| 59 | nv_wr32(priv, 0x001718, 0x80000000 | chan->vblank.channel); | 53 | nv_wr32(priv, 0x001718, 0x80000000 | chan->vblank.channel); |
| 60 | bar->flush(bar); | 54 | bar->flush(bar); |
| 61 | nv_wr32(priv, 0x06000c, | 55 | nv_wr32(priv, 0x06000c, |
| @@ -63,6 +57,17 @@ nv50_disp_intr_vblank(struct nv50_disp_priv *priv, int crtc) | |||
| 63 | nv_wr32(priv, 0x060010, | 57 | nv_wr32(priv, 0x060010, |
| 64 | lower_32_bits(chan->vblank.offset)); | 58 | lower_32_bits(chan->vblank.offset)); |
| 65 | nv_wr32(priv, 0x060014, chan->vblank.value); | 59 | nv_wr32(priv, 0x060014, chan->vblank.value); |
| 60 | } else { | ||
| 61 | nv_wr32(priv, 0x001704, chan->vblank.channel); | ||
| 62 | nv_wr32(priv, 0x001710, 0x80000000 | chan->vblank.ctxdma); | ||
| 63 | bar->flush(bar); | ||
| 64 | if (nv_device(priv)->chipset == 0x50) { | ||
| 65 | nv_wr32(priv, 0x001570, chan->vblank.offset); | ||
| 66 | nv_wr32(priv, 0x001574, chan->vblank.value); | ||
| 67 | } else { | ||
| 68 | nv_wr32(priv, 0x060010, chan->vblank.offset); | ||
| 69 | nv_wr32(priv, 0x060014, chan->vblank.value); | ||
| 70 | } | ||
| 66 | } | 71 | } |
| 67 | 72 | ||
| 68 | list_del(&chan->vblank.head); | 73 | list_del(&chan->vblank.head); |
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnv40.c b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnv40.c index e45035efb8ca..7bbb1e1b7a8d 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/ctxnv40.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/ctxnv40.c | |||
| @@ -669,21 +669,27 @@ nv40_grctx_fill(struct nouveau_device *device, struct nouveau_gpuobj *mem) | |||
| 669 | }); | 669 | }); |
| 670 | } | 670 | } |
| 671 | 671 | ||
| 672 | void | 672 | int |
| 673 | nv40_grctx_init(struct nouveau_device *device, u32 *size) | 673 | nv40_grctx_init(struct nouveau_device *device, u32 *size) |
| 674 | { | 674 | { |
| 675 | u32 ctxprog[256], i; | 675 | u32 *ctxprog = kmalloc(256 * 4, GFP_KERNEL), i; |
| 676 | struct nouveau_grctx ctx = { | 676 | struct nouveau_grctx ctx = { |
| 677 | .device = device, | 677 | .device = device, |
| 678 | .mode = NOUVEAU_GRCTX_PROG, | 678 | .mode = NOUVEAU_GRCTX_PROG, |
| 679 | .data = ctxprog, | 679 | .data = ctxprog, |
| 680 | .ctxprog_max = ARRAY_SIZE(ctxprog) | 680 | .ctxprog_max = 256, |
| 681 | }; | 681 | }; |
| 682 | 682 | ||
| 683 | if (!ctxprog) | ||
| 684 | return -ENOMEM; | ||
| 685 | |||
| 683 | nv40_grctx_generate(&ctx); | 686 | nv40_grctx_generate(&ctx); |
| 684 | 687 | ||
| 685 | nv_wr32(device, 0x400324, 0); | 688 | nv_wr32(device, 0x400324, 0); |
| 686 | for (i = 0; i < ctx.ctxprog_len; i++) | 689 | for (i = 0; i < ctx.ctxprog_len; i++) |
| 687 | nv_wr32(device, 0x400328, ctxprog[i]); | 690 | nv_wr32(device, 0x400328, ctxprog[i]); |
| 688 | *size = ctx.ctxvals_pos * 4; | 691 | *size = ctx.ctxvals_pos * 4; |
| 692 | |||
| 693 | kfree(ctxprog); | ||
| 694 | return 0; | ||
| 689 | } | 695 | } |
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv40.c b/drivers/gpu/drm/nouveau/core/engine/graph/nv40.c index 425001204a89..cc6574eeb80e 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv40.c +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv40.c | |||
| @@ -346,7 +346,9 @@ nv40_graph_init(struct nouveau_object *object) | |||
| 346 | return ret; | 346 | return ret; |
| 347 | 347 | ||
| 348 | /* generate and upload context program */ | 348 | /* generate and upload context program */ |
| 349 | nv40_grctx_init(nv_device(priv), &priv->size); | 349 | ret = nv40_grctx_init(nv_device(priv), &priv->size); |
| 350 | if (ret) | ||
| 351 | return ret; | ||
| 350 | 352 | ||
| 351 | /* No context present currently */ | 353 | /* No context present currently */ |
| 352 | nv_wr32(priv, NV40_PGRAPH_CTXCTL_CUR, 0x00000000); | 354 | nv_wr32(priv, NV40_PGRAPH_CTXCTL_CUR, 0x00000000); |
diff --git a/drivers/gpu/drm/nouveau/core/engine/graph/nv40.h b/drivers/gpu/drm/nouveau/core/engine/graph/nv40.h index d2ac975afc2e..7da35a4e7970 100644 --- a/drivers/gpu/drm/nouveau/core/engine/graph/nv40.h +++ b/drivers/gpu/drm/nouveau/core/engine/graph/nv40.h | |||
| @@ -15,7 +15,7 @@ nv44_graph_class(void *priv) | |||
| 15 | return !(0x0baf & (1 << (device->chipset & 0x0f))); | 15 | return !(0x0baf & (1 << (device->chipset & 0x0f))); |
| 16 | } | 16 | } |
| 17 | 17 | ||
| 18 | void nv40_grctx_init(struct nouveau_device *, u32 *size); | 18 | int nv40_grctx_init(struct nouveau_device *, u32 *size); |
| 19 | void nv40_grctx_fill(struct nouveau_device *, struct nouveau_gpuobj *); | 19 | void nv40_grctx_fill(struct nouveau_device *, struct nouveau_gpuobj *); |
| 20 | 20 | ||
| 21 | #endif | 21 | #endif |
diff --git a/drivers/gpu/drm/nouveau/core/include/core/object.h b/drivers/gpu/drm/nouveau/core/include/core/object.h index 818feabbf4a0..486f1a9217fd 100644 --- a/drivers/gpu/drm/nouveau/core/include/core/object.h +++ b/drivers/gpu/drm/nouveau/core/include/core/object.h | |||
| @@ -175,14 +175,18 @@ nv_mo32(void *obj, u32 addr, u32 mask, u32 data) | |||
| 175 | return temp; | 175 | return temp; |
| 176 | } | 176 | } |
| 177 | 177 | ||
| 178 | static inline bool | 178 | static inline int |
| 179 | nv_strncmp(void *obj, u32 addr, u32 len, const char *str) | 179 | nv_memcmp(void *obj, u32 addr, const char *str, u32 len) |
| 180 | { | 180 | { |
| 181 | unsigned char c1, c2; | ||
| 182 | |||
| 181 | while (len--) { | 183 | while (len--) { |
| 182 | if (nv_ro08(obj, addr++) != *(str++)) | 184 | c1 = nv_ro08(obj, addr++); |
| 183 | return false; | 185 | c2 = *(str++); |
| 186 | if (c1 != c2) | ||
| 187 | return c1 - c2; | ||
| 184 | } | 188 | } |
| 185 | return true; | 189 | return 0; |
| 186 | } | 190 | } |
| 187 | 191 | ||
| 188 | #endif | 192 | #endif |
diff --git a/drivers/gpu/drm/nouveau/core/include/subdev/clock.h b/drivers/gpu/drm/nouveau/core/include/subdev/clock.h index 39e73b91d360..41b7a6a76f19 100644 --- a/drivers/gpu/drm/nouveau/core/include/subdev/clock.h +++ b/drivers/gpu/drm/nouveau/core/include/subdev/clock.h | |||
| @@ -54,6 +54,7 @@ int nv04_clock_pll_calc(struct nouveau_clock *, struct nvbios_pll *, | |||
| 54 | int clk, struct nouveau_pll_vals *); | 54 | int clk, struct nouveau_pll_vals *); |
| 55 | int nv04_clock_pll_prog(struct nouveau_clock *, u32 reg1, | 55 | int nv04_clock_pll_prog(struct nouveau_clock *, u32 reg1, |
| 56 | struct nouveau_pll_vals *); | 56 | struct nouveau_pll_vals *); |
| 57 | 57 | int nva3_clock_pll_calc(struct nouveau_clock *, struct nvbios_pll *, | |
| 58 | int clk, struct nouveau_pll_vals *); | ||
| 58 | 59 | ||
| 59 | #endif | 60 | #endif |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/bios/dcb.c b/drivers/gpu/drm/nouveau/core/subdev/bios/dcb.c index 7d750382a833..c51197157749 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/bios/dcb.c +++ b/drivers/gpu/drm/nouveau/core/subdev/bios/dcb.c | |||
| @@ -64,7 +64,7 @@ dcb_table(struct nouveau_bios *bios, u8 *ver, u8 *hdr, u8 *cnt, u8 *len) | |||
| 64 | } | 64 | } |
| 65 | } else | 65 | } else |
| 66 | if (*ver >= 0x15) { | 66 | if (*ver >= 0x15) { |
| 67 | if (!nv_strncmp(bios, dcb - 7, 7, "DEV_REC")) { | 67 | if (!nv_memcmp(bios, dcb - 7, "DEV_REC", 7)) { |
| 68 | u16 i2c = nv_ro16(bios, dcb + 2); | 68 | u16 i2c = nv_ro16(bios, dcb + 2); |
| 69 | *hdr = 4; | 69 | *hdr = 4; |
| 70 | *cnt = (i2c - dcb) / 10; | 70 | *cnt = (i2c - dcb) / 10; |
diff --git a/drivers/gpu/drm/nouveau/core/subdev/clock/nva3.c b/drivers/gpu/drm/nouveau/core/subdev/clock/nva3.c index cc8d7d162d7c..9068c98b96f6 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/clock/nva3.c +++ b/drivers/gpu/drm/nouveau/core/subdev/clock/nva3.c | |||
| @@ -66,6 +66,24 @@ nva3_clock_pll_set(struct nouveau_clock *clk, u32 type, u32 freq) | |||
| 66 | return ret; | 66 | return ret; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | int | ||
| 70 | nva3_clock_pll_calc(struct nouveau_clock *clock, struct nvbios_pll *info, | ||
| 71 | int clk, struct nouveau_pll_vals *pv) | ||
| 72 | { | ||
| 73 | int ret, N, M, P; | ||
| 74 | |||
| 75 | ret = nva3_pll_calc(clock, info, clk, &N, NULL, &M, &P); | ||
| 76 | |||
| 77 | if (ret > 0) { | ||
| 78 | pv->refclk = info->refclk; | ||
| 79 | pv->N1 = N; | ||
| 80 | pv->M1 = M; | ||
| 81 | pv->log2P = P; | ||
| 82 | } | ||
| 83 | return ret; | ||
| 84 | } | ||
| 85 | |||
| 86 | |||
| 69 | static int | 87 | static int |
| 70 | nva3_clock_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | 88 | nva3_clock_ctor(struct nouveau_object *parent, struct nouveau_object *engine, |
| 71 | struct nouveau_oclass *oclass, void *data, u32 size, | 89 | struct nouveau_oclass *oclass, void *data, u32 size, |
| @@ -80,6 +98,7 @@ nva3_clock_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
| 80 | return ret; | 98 | return ret; |
| 81 | 99 | ||
| 82 | priv->base.pll_set = nva3_clock_pll_set; | 100 | priv->base.pll_set = nva3_clock_pll_set; |
| 101 | priv->base.pll_calc = nva3_clock_pll_calc; | ||
| 83 | return 0; | 102 | return 0; |
| 84 | } | 103 | } |
| 85 | 104 | ||
diff --git a/drivers/gpu/drm/nouveau/core/subdev/clock/nvc0.c b/drivers/gpu/drm/nouveau/core/subdev/clock/nvc0.c index 5ccce0b17bf3..f6962c9b6c36 100644 --- a/drivers/gpu/drm/nouveau/core/subdev/clock/nvc0.c +++ b/drivers/gpu/drm/nouveau/core/subdev/clock/nvc0.c | |||
| @@ -79,6 +79,7 @@ nvc0_clock_ctor(struct nouveau_object *parent, struct nouveau_object *engine, | |||
| 79 | return ret; | 79 | return ret; |
| 80 | 80 | ||
| 81 | priv->base.pll_set = nvc0_clock_pll_set; | 81 | priv->base.pll_set = nvc0_clock_pll_set; |
| 82 | priv->base.pll_calc = nva3_clock_pll_calc; | ||
| 82 | return 0; | 83 | return 0; |
| 83 | } | 84 | } |
| 84 | 85 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c index cc79c796afee..cbf1fc60a386 100644 --- a/drivers/gpu/drm/nouveau/nouveau_abi16.c +++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c | |||
| @@ -241,6 +241,10 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS) | |||
| 241 | 241 | ||
| 242 | if (unlikely(!abi16)) | 242 | if (unlikely(!abi16)) |
| 243 | return -ENOMEM; | 243 | return -ENOMEM; |
| 244 | |||
| 245 | if (!drm->channel) | ||
| 246 | return nouveau_abi16_put(abi16, -ENODEV); | ||
| 247 | |||
| 244 | client = nv_client(abi16->client); | 248 | client = nv_client(abi16->client); |
| 245 | 249 | ||
| 246 | if (init->fb_ctxdma_handle == ~0 || init->tt_ctxdma_handle == ~0) | 250 | if (init->fb_ctxdma_handle == ~0 || init->tt_ctxdma_handle == ~0) |
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c index 0910125cbbc3..8503b2ea570a 100644 --- a/drivers/gpu/drm/nouveau/nouveau_drm.c +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c | |||
| @@ -129,7 +129,8 @@ nouveau_accel_init(struct nouveau_drm *drm) | |||
| 129 | 129 | ||
| 130 | /* initialise synchronisation routines */ | 130 | /* initialise synchronisation routines */ |
| 131 | if (device->card_type < NV_10) ret = nv04_fence_create(drm); | 131 | if (device->card_type < NV_10) ret = nv04_fence_create(drm); |
| 132 | else if (device->chipset < 0x84) ret = nv10_fence_create(drm); | 132 | else if (device->card_type < NV_50) ret = nv10_fence_create(drm); |
| 133 | else if (device->chipset < 0x84) ret = nv50_fence_create(drm); | ||
| 133 | else if (device->card_type < NV_C0) ret = nv84_fence_create(drm); | 134 | else if (device->card_type < NV_C0) ret = nv84_fence_create(drm); |
| 134 | else ret = nvc0_fence_create(drm); | 135 | else ret = nvc0_fence_create(drm); |
| 135 | if (ret) { | 136 | if (ret) { |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 3bce0299f64a..24d932f53203 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -1696,42 +1696,22 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | |||
| 1696 | return ATOM_PPLL2; | 1696 | return ATOM_PPLL2; |
| 1697 | DRM_ERROR("unable to allocate a PPLL\n"); | 1697 | DRM_ERROR("unable to allocate a PPLL\n"); |
| 1698 | return ATOM_PPLL_INVALID; | 1698 | return ATOM_PPLL_INVALID; |
| 1699 | } else if (ASIC_IS_AVIVO(rdev)) { | ||
| 1700 | /* in DP mode, the DP ref clock can come from either PPLL | ||
| 1701 | * depending on the asic: | ||
| 1702 | * DCE3: PPLL1 or PPLL2 | ||
| 1703 | */ | ||
| 1704 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(radeon_crtc->encoder))) { | ||
| 1705 | /* use the same PPLL for all DP monitors */ | ||
| 1706 | pll = radeon_get_shared_dp_ppll(crtc); | ||
| 1707 | if (pll != ATOM_PPLL_INVALID) | ||
| 1708 | return pll; | ||
| 1709 | } else { | ||
| 1710 | /* use the same PPLL for all monitors with the same clock */ | ||
| 1711 | pll = radeon_get_shared_nondp_ppll(crtc); | ||
| 1712 | if (pll != ATOM_PPLL_INVALID) | ||
| 1713 | return pll; | ||
| 1714 | } | ||
| 1715 | /* all other cases */ | ||
| 1716 | pll_in_use = radeon_get_pll_use_mask(crtc); | ||
| 1717 | /* the order shouldn't matter here, but we probably | ||
| 1718 | * need this until we have atomic modeset | ||
| 1719 | */ | ||
| 1720 | if (rdev->flags & RADEON_IS_IGP) { | ||
| 1721 | if (!(pll_in_use & (1 << ATOM_PPLL1))) | ||
| 1722 | return ATOM_PPLL1; | ||
| 1723 | if (!(pll_in_use & (1 << ATOM_PPLL2))) | ||
| 1724 | return ATOM_PPLL2; | ||
| 1725 | } else { | ||
| 1726 | if (!(pll_in_use & (1 << ATOM_PPLL2))) | ||
| 1727 | return ATOM_PPLL2; | ||
| 1728 | if (!(pll_in_use & (1 << ATOM_PPLL1))) | ||
| 1729 | return ATOM_PPLL1; | ||
| 1730 | } | ||
| 1731 | DRM_ERROR("unable to allocate a PPLL\n"); | ||
| 1732 | return ATOM_PPLL_INVALID; | ||
| 1733 | } else { | 1699 | } else { |
| 1734 | /* on pre-R5xx asics, the crtc to pll mapping is hardcoded */ | 1700 | /* on pre-R5xx asics, the crtc to pll mapping is hardcoded */ |
| 1701 | /* some atombios (observed in some DCE2/DCE3) code have a bug, | ||
| 1702 | * the matching btw pll and crtc is done through | ||
| 1703 | * PCLK_CRTC[1|2]_CNTL (0x480/0x484) but atombios code use the | ||
| 1704 | * pll (1 or 2) to select which register to write. ie if using | ||
| 1705 | * pll1 it will use PCLK_CRTC1_CNTL (0x480) and if using pll2 | ||
| 1706 | * it will use PCLK_CRTC2_CNTL (0x484), it then use crtc id to | ||
| 1707 | * choose which value to write. Which is reverse order from | ||
| 1708 | * register logic. So only case that works is when pllid is | ||
| 1709 | * same as crtcid or when both pll and crtc are enabled and | ||
| 1710 | * both use same clock. | ||
| 1711 | * | ||
| 1712 | * So just return crtc id as if crtc and pll were hard linked | ||
| 1713 | * together even if they aren't | ||
| 1714 | */ | ||
| 1735 | return radeon_crtc->crtc_id; | 1715 | return radeon_crtc->crtc_id; |
| 1736 | } | 1716 | } |
| 1737 | } | 1717 | } |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index af31f829f4a8..219942c660d7 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -1330,6 +1330,8 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav | |||
| 1330 | break; | 1330 | break; |
| 1331 | udelay(1); | 1331 | udelay(1); |
| 1332 | } | 1332 | } |
| 1333 | } else { | ||
| 1334 | save->crtc_enabled[i] = false; | ||
| 1333 | } | 1335 | } |
| 1334 | } | 1336 | } |
| 1335 | 1337 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_agp.c b/drivers/gpu/drm/radeon/radeon_agp.c index 10ea17a6b2a6..42433344cb1b 100644 --- a/drivers/gpu/drm/radeon/radeon_agp.c +++ b/drivers/gpu/drm/radeon/radeon_agp.c | |||
| @@ -69,9 +69,12 @@ static struct radeon_agpmode_quirk radeon_agpmode_quirk_list[] = { | |||
| 69 | /* Intel 82830 830 Chipset Host Bridge / Mobility M6 LY Needs AGPMode 2 (fdo #17360)*/ | 69 | /* Intel 82830 830 Chipset Host Bridge / Mobility M6 LY Needs AGPMode 2 (fdo #17360)*/ |
| 70 | { PCI_VENDOR_ID_INTEL, 0x3575, PCI_VENDOR_ID_ATI, 0x4c59, | 70 | { PCI_VENDOR_ID_INTEL, 0x3575, PCI_VENDOR_ID_ATI, 0x4c59, |
| 71 | PCI_VENDOR_ID_DELL, 0x00e3, 2}, | 71 | PCI_VENDOR_ID_DELL, 0x00e3, 2}, |
| 72 | /* Intel 82852/82855 host bridge / Mobility FireGL 9000 R250 Needs AGPMode 1 (lp #296617) */ | 72 | /* Intel 82852/82855 host bridge / Mobility FireGL 9000 RV250 Needs AGPMode 1 (lp #296617) */ |
| 73 | { PCI_VENDOR_ID_INTEL, 0x3580, PCI_VENDOR_ID_ATI, 0x4c66, | 73 | { PCI_VENDOR_ID_INTEL, 0x3580, PCI_VENDOR_ID_ATI, 0x4c66, |
| 74 | PCI_VENDOR_ID_DELL, 0x0149, 1}, | 74 | PCI_VENDOR_ID_DELL, 0x0149, 1}, |
| 75 | /* Intel 82855PM host bridge / Mobility FireGL 9000 RV250 Needs AGPMode 1 for suspend/resume */ | ||
| 76 | { PCI_VENDOR_ID_INTEL, 0x3340, PCI_VENDOR_ID_ATI, 0x4c66, | ||
| 77 | PCI_VENDOR_ID_IBM, 0x0531, 1}, | ||
| 75 | /* Intel 82852/82855 host bridge / Mobility 9600 M10 RV350 Needs AGPMode 1 (deb #467460) */ | 78 | /* Intel 82852/82855 host bridge / Mobility 9600 M10 RV350 Needs AGPMode 1 (deb #467460) */ |
| 76 | { PCI_VENDOR_ID_INTEL, 0x3580, PCI_VENDOR_ID_ATI, 0x4e50, | 79 | { PCI_VENDOR_ID_INTEL, 0x3580, PCI_VENDOR_ID_ATI, 0x4e50, |
| 77 | 0x1025, 0x0061, 1}, | 80 | 0x1025, 0x0061, 1}, |
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c index aa59a254be2c..c02bf208084f 100644 --- a/drivers/i2c/busses/i2c-at91.c +++ b/drivers/i2c/busses/i2c-at91.c | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | #define AT91_TWI_STOP 0x0002 /* Send a Stop Condition */ | 39 | #define AT91_TWI_STOP 0x0002 /* Send a Stop Condition */ |
| 40 | #define AT91_TWI_MSEN 0x0004 /* Master Transfer Enable */ | 40 | #define AT91_TWI_MSEN 0x0004 /* Master Transfer Enable */ |
| 41 | #define AT91_TWI_SVDIS 0x0020 /* Slave Transfer Disable */ | 41 | #define AT91_TWI_SVDIS 0x0020 /* Slave Transfer Disable */ |
| 42 | #define AT91_TWI_QUICK 0x0040 /* SMBus quick command */ | ||
| 42 | #define AT91_TWI_SWRST 0x0080 /* Software Reset */ | 43 | #define AT91_TWI_SWRST 0x0080 /* Software Reset */ |
| 43 | 44 | ||
| 44 | #define AT91_TWI_MMR 0x0004 /* Master Mode Register */ | 45 | #define AT91_TWI_MMR 0x0004 /* Master Mode Register */ |
| @@ -212,7 +213,11 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev) | |||
| 212 | 213 | ||
| 213 | INIT_COMPLETION(dev->cmd_complete); | 214 | INIT_COMPLETION(dev->cmd_complete); |
| 214 | dev->transfer_status = 0; | 215 | dev->transfer_status = 0; |
| 215 | if (dev->msg->flags & I2C_M_RD) { | 216 | |
| 217 | if (!dev->buf_len) { | ||
| 218 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_QUICK); | ||
| 219 | at91_twi_write(dev, AT91_TWI_IER, AT91_TWI_TXCOMP); | ||
| 220 | } else if (dev->msg->flags & I2C_M_RD) { | ||
| 216 | unsigned start_flags = AT91_TWI_START; | 221 | unsigned start_flags = AT91_TWI_START; |
| 217 | 222 | ||
| 218 | if (at91_twi_read(dev, AT91_TWI_SR) & AT91_TWI_RXRDY) { | 223 | if (at91_twi_read(dev, AT91_TWI_SR) & AT91_TWI_RXRDY) { |
diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c index 286ca1917820..0670da79ee5e 100644 --- a/drivers/i2c/busses/i2c-mxs.c +++ b/drivers/i2c/busses/i2c-mxs.c | |||
| @@ -287,12 +287,14 @@ read_init_dma_fail: | |||
| 287 | select_init_dma_fail: | 287 | select_init_dma_fail: |
| 288 | dma_unmap_sg(i2c->dev, &i2c->sg_io[0], 1, DMA_TO_DEVICE); | 288 | dma_unmap_sg(i2c->dev, &i2c->sg_io[0], 1, DMA_TO_DEVICE); |
| 289 | select_init_pio_fail: | 289 | select_init_pio_fail: |
| 290 | dmaengine_terminate_all(i2c->dmach); | ||
| 290 | return -EINVAL; | 291 | return -EINVAL; |
| 291 | 292 | ||
| 292 | /* Write failpath. */ | 293 | /* Write failpath. */ |
| 293 | write_init_dma_fail: | 294 | write_init_dma_fail: |
| 294 | dma_unmap_sg(i2c->dev, i2c->sg_io, 2, DMA_TO_DEVICE); | 295 | dma_unmap_sg(i2c->dev, i2c->sg_io, 2, DMA_TO_DEVICE); |
| 295 | write_init_pio_fail: | 296 | write_init_pio_fail: |
| 297 | dmaengine_terminate_all(i2c->dmach); | ||
| 296 | return -EINVAL; | 298 | return -EINVAL; |
| 297 | } | 299 | } |
| 298 | 300 | ||
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index db31eaed6ea5..3525c9e62cb0 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -43,7 +43,6 @@ | |||
| 43 | #include <linux/slab.h> | 43 | #include <linux/slab.h> |
| 44 | #include <linux/i2c-omap.h> | 44 | #include <linux/i2c-omap.h> |
| 45 | #include <linux/pm_runtime.h> | 45 | #include <linux/pm_runtime.h> |
| 46 | #include <linux/pm_qos.h> | ||
| 47 | 46 | ||
| 48 | /* I2C controller revisions */ | 47 | /* I2C controller revisions */ |
| 49 | #define OMAP_I2C_OMAP1_REV_2 0x20 | 48 | #define OMAP_I2C_OMAP1_REV_2 0x20 |
| @@ -187,8 +186,9 @@ struct omap_i2c_dev { | |||
| 187 | int reg_shift; /* bit shift for I2C register addresses */ | 186 | int reg_shift; /* bit shift for I2C register addresses */ |
| 188 | struct completion cmd_complete; | 187 | struct completion cmd_complete; |
| 189 | struct resource *ioarea; | 188 | struct resource *ioarea; |
| 190 | u32 latency; /* maximum MPU wkup latency */ | 189 | u32 latency; /* maximum mpu wkup latency */ |
| 191 | struct pm_qos_request pm_qos_request; | 190 | void (*set_mpu_wkup_lat)(struct device *dev, |
| 191 | long latency); | ||
| 192 | u32 speed; /* Speed of bus in kHz */ | 192 | u32 speed; /* Speed of bus in kHz */ |
| 193 | u32 dtrev; /* extra revision from DT */ | 193 | u32 dtrev; /* extra revision from DT */ |
| 194 | u32 flags; | 194 | u32 flags; |
| @@ -494,7 +494,9 @@ static void omap_i2c_resize_fifo(struct omap_i2c_dev *dev, u8 size, bool is_rx) | |||
| 494 | dev->b_hw = 1; /* Enable hardware fixes */ | 494 | dev->b_hw = 1; /* Enable hardware fixes */ |
| 495 | 495 | ||
| 496 | /* calculate wakeup latency constraint for MPU */ | 496 | /* calculate wakeup latency constraint for MPU */ |
| 497 | dev->latency = (1000000 * dev->threshold) / (1000 * dev->speed / 8); | 497 | if (dev->set_mpu_wkup_lat != NULL) |
| 498 | dev->latency = (1000000 * dev->threshold) / | ||
| 499 | (1000 * dev->speed / 8); | ||
| 498 | } | 500 | } |
| 499 | 501 | ||
| 500 | /* | 502 | /* |
| @@ -522,6 +524,9 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, | |||
| 522 | dev->buf = msg->buf; | 524 | dev->buf = msg->buf; |
| 523 | dev->buf_len = msg->len; | 525 | dev->buf_len = msg->len; |
| 524 | 526 | ||
| 527 | /* make sure writes to dev->buf_len are ordered */ | ||
| 528 | barrier(); | ||
| 529 | |||
| 525 | omap_i2c_write_reg(dev, OMAP_I2C_CNT_REG, dev->buf_len); | 530 | omap_i2c_write_reg(dev, OMAP_I2C_CNT_REG, dev->buf_len); |
| 526 | 531 | ||
| 527 | /* Clear the FIFO Buffers */ | 532 | /* Clear the FIFO Buffers */ |
| @@ -579,7 +584,6 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, | |||
| 579 | */ | 584 | */ |
| 580 | timeout = wait_for_completion_timeout(&dev->cmd_complete, | 585 | timeout = wait_for_completion_timeout(&dev->cmd_complete, |
| 581 | OMAP_I2C_TIMEOUT); | 586 | OMAP_I2C_TIMEOUT); |
| 582 | dev->buf_len = 0; | ||
| 583 | if (timeout == 0) { | 587 | if (timeout == 0) { |
| 584 | dev_err(dev->dev, "controller timed out\n"); | 588 | dev_err(dev->dev, "controller timed out\n"); |
| 585 | omap_i2c_init(dev); | 589 | omap_i2c_init(dev); |
| @@ -629,16 +633,8 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
| 629 | if (r < 0) | 633 | if (r < 0) |
| 630 | goto out; | 634 | goto out; |
| 631 | 635 | ||
| 632 | /* | 636 | if (dev->set_mpu_wkup_lat != NULL) |
| 633 | * When waiting for completion of a i2c transfer, we need to | 637 | dev->set_mpu_wkup_lat(dev->dev, dev->latency); |
| 634 | * set a wake up latency constraint for the MPU. This is to | ||
| 635 | * ensure quick enough wakeup from idle, when transfer | ||
| 636 | * completes. | ||
| 637 | */ | ||
| 638 | if (dev->latency) | ||
| 639 | pm_qos_add_request(&dev->pm_qos_request, | ||
| 640 | PM_QOS_CPU_DMA_LATENCY, | ||
| 641 | dev->latency); | ||
| 642 | 638 | ||
| 643 | for (i = 0; i < num; i++) { | 639 | for (i = 0; i < num; i++) { |
| 644 | r = omap_i2c_xfer_msg(adap, &msgs[i], (i == (num - 1))); | 640 | r = omap_i2c_xfer_msg(adap, &msgs[i], (i == (num - 1))); |
| @@ -646,8 +642,8 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
| 646 | break; | 642 | break; |
| 647 | } | 643 | } |
| 648 | 644 | ||
| 649 | if (dev->latency) | 645 | if (dev->set_mpu_wkup_lat != NULL) |
| 650 | pm_qos_remove_request(&dev->pm_qos_request); | 646 | dev->set_mpu_wkup_lat(dev->dev, -1); |
| 651 | 647 | ||
| 652 | if (r == 0) | 648 | if (r == 0) |
| 653 | r = num; | 649 | r = num; |
| @@ -1104,6 +1100,7 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 1104 | } else if (pdata != NULL) { | 1100 | } else if (pdata != NULL) { |
| 1105 | dev->speed = pdata->clkrate; | 1101 | dev->speed = pdata->clkrate; |
| 1106 | dev->flags = pdata->flags; | 1102 | dev->flags = pdata->flags; |
| 1103 | dev->set_mpu_wkup_lat = pdata->set_mpu_wkup_lat; | ||
| 1107 | dev->dtrev = pdata->rev; | 1104 | dev->dtrev = pdata->rev; |
| 1108 | } | 1105 | } |
| 1109 | 1106 | ||
| @@ -1159,8 +1156,9 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 1159 | dev->b_hw = 1; /* Enable hardware fixes */ | 1156 | dev->b_hw = 1; /* Enable hardware fixes */ |
| 1160 | 1157 | ||
| 1161 | /* calculate wakeup latency constraint for MPU */ | 1158 | /* calculate wakeup latency constraint for MPU */ |
| 1162 | dev->latency = (1000000 * dev->fifo_size) / | 1159 | if (dev->set_mpu_wkup_lat != NULL) |
| 1163 | (1000 * dev->speed / 8); | 1160 | dev->latency = (1000000 * dev->fifo_size) / |
| 1161 | (1000 * dev->speed / 8); | ||
| 1164 | } | 1162 | } |
| 1165 | 1163 | ||
| 1166 | /* reset ASAP, clearing any IRQs */ | 1164 | /* reset ASAP, clearing any IRQs */ |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 3e0335f1fc60..9d902725bac9 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
| @@ -806,6 +806,7 @@ static int s3c24xx_i2c_parse_dt_gpio(struct s3c24xx_i2c *i2c) | |||
| 806 | dev_err(i2c->dev, "invalid gpio[%d]: %d\n", idx, gpio); | 806 | dev_err(i2c->dev, "invalid gpio[%d]: %d\n", idx, gpio); |
| 807 | goto free_gpio; | 807 | goto free_gpio; |
| 808 | } | 808 | } |
| 809 | i2c->gpios[idx] = gpio; | ||
| 809 | 810 | ||
| 810 | ret = gpio_request(gpio, "i2c-bus"); | 811 | ret = gpio_request(gpio, "i2c-bus"); |
| 811 | if (ret) { | 812 | if (ret) { |
diff --git a/drivers/input/input-mt.c b/drivers/input/input-mt.c index c0ec7d42c3be..1abbc170d8b7 100644 --- a/drivers/input/input-mt.c +++ b/drivers/input/input-mt.c | |||
| @@ -26,10 +26,14 @@ static void copy_abs(struct input_dev *dev, unsigned int dst, unsigned int src) | |||
| 26 | * input_mt_init_slots() - initialize MT input slots | 26 | * input_mt_init_slots() - initialize MT input slots |
| 27 | * @dev: input device supporting MT events and finger tracking | 27 | * @dev: input device supporting MT events and finger tracking |
| 28 | * @num_slots: number of slots used by the device | 28 | * @num_slots: number of slots used by the device |
| 29 | * @flags: mt tasks to handle in core | ||
| 29 | * | 30 | * |
| 30 | * This function allocates all necessary memory for MT slot handling | 31 | * This function allocates all necessary memory for MT slot handling |
| 31 | * in the input device, prepares the ABS_MT_SLOT and | 32 | * in the input device, prepares the ABS_MT_SLOT and |
| 32 | * ABS_MT_TRACKING_ID events for use and sets up appropriate buffers. | 33 | * ABS_MT_TRACKING_ID events for use and sets up appropriate buffers. |
| 34 | * Depending on the flags set, it also performs pointer emulation and | ||
| 35 | * frame synchronization. | ||
| 36 | * | ||
| 33 | * May be called repeatedly. Returns -EINVAL if attempting to | 37 | * May be called repeatedly. Returns -EINVAL if attempting to |
| 34 | * reinitialize with a different number of slots. | 38 | * reinitialize with a different number of slots. |
| 35 | */ | 39 | */ |
diff --git a/drivers/input/matrix-keymap.c b/drivers/input/matrix-keymap.c index 443ad64b7f2a..d88d9be1d1b7 100644 --- a/drivers/input/matrix-keymap.c +++ b/drivers/input/matrix-keymap.c | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #include <linux/input.h> | 23 | #include <linux/input.h> |
| 24 | #include <linux/of.h> | 24 | #include <linux/of.h> |
| 25 | #include <linux/export.h> | 25 | #include <linux/export.h> |
| 26 | #include <linux/module.h> | ||
| 26 | #include <linux/input/matrix_keypad.h> | 27 | #include <linux/input/matrix_keypad.h> |
| 27 | 28 | ||
| 28 | static bool matrix_keypad_map_key(struct input_dev *input_dev, | 29 | static bool matrix_keypad_map_key(struct input_dev *input_dev, |
| @@ -161,3 +162,5 @@ int matrix_keypad_build_keymap(const struct matrix_keymap_data *keymap_data, | |||
| 161 | return 0; | 162 | return 0; |
| 162 | } | 163 | } |
| 163 | EXPORT_SYMBOL(matrix_keypad_build_keymap); | 164 | EXPORT_SYMBOL(matrix_keypad_build_keymap); |
| 165 | |||
| 166 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c index 8f02e3d0e712..4c842c320c2e 100644 --- a/drivers/input/mousedev.c +++ b/drivers/input/mousedev.c | |||
| @@ -12,8 +12,8 @@ | |||
| 12 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 12 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
| 13 | 13 | ||
| 14 | #define MOUSEDEV_MINOR_BASE 32 | 14 | #define MOUSEDEV_MINOR_BASE 32 |
| 15 | #define MOUSEDEV_MINORS 32 | 15 | #define MOUSEDEV_MINORS 31 |
| 16 | #define MOUSEDEV_MIX 31 | 16 | #define MOUSEDEV_MIX 63 |
| 17 | 17 | ||
| 18 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
| 19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c index f02028ec3db6..78e5d9ab0ba7 100644 --- a/drivers/input/touchscreen/ads7846.c +++ b/drivers/input/touchscreen/ads7846.c | |||
| @@ -955,7 +955,8 @@ static int ads7846_resume(struct device *dev) | |||
| 955 | 955 | ||
| 956 | static SIMPLE_DEV_PM_OPS(ads7846_pm, ads7846_suspend, ads7846_resume); | 956 | static SIMPLE_DEV_PM_OPS(ads7846_pm, ads7846_suspend, ads7846_resume); |
| 957 | 957 | ||
| 958 | static int __devinit ads7846_setup_pendown(struct spi_device *spi, struct ads7846 *ts) | 958 | static int __devinit ads7846_setup_pendown(struct spi_device *spi, |
| 959 | struct ads7846 *ts) | ||
| 959 | { | 960 | { |
| 960 | struct ads7846_platform_data *pdata = spi->dev.platform_data; | 961 | struct ads7846_platform_data *pdata = spi->dev.platform_data; |
| 961 | int err; | 962 | int err; |
| @@ -981,6 +982,9 @@ static int __devinit ads7846_setup_pendown(struct spi_device *spi, struct ads784 | |||
| 981 | 982 | ||
| 982 | ts->gpio_pendown = pdata->gpio_pendown; | 983 | ts->gpio_pendown = pdata->gpio_pendown; |
| 983 | 984 | ||
| 985 | if (pdata->gpio_pendown_debounce) | ||
| 986 | gpio_set_debounce(pdata->gpio_pendown, | ||
| 987 | pdata->gpio_pendown_debounce); | ||
| 984 | } else { | 988 | } else { |
| 985 | dev_err(&spi->dev, "no get_pendown_state nor gpio_pendown?\n"); | 989 | dev_err(&spi->dev, "no get_pendown_state nor gpio_pendown?\n"); |
| 986 | return -EINVAL; | 990 | return -EINVAL; |
diff --git a/drivers/iommu/Makefile b/drivers/iommu/Makefile index 14a4d5fc94fa..f66b816d455c 100644 --- a/drivers/iommu/Makefile +++ b/drivers/iommu/Makefile | |||
| @@ -7,6 +7,7 @@ obj-$(CONFIG_DMAR_TABLE) += dmar.o | |||
| 7 | obj-$(CONFIG_INTEL_IOMMU) += iova.o intel-iommu.o | 7 | obj-$(CONFIG_INTEL_IOMMU) += iova.o intel-iommu.o |
| 8 | obj-$(CONFIG_IRQ_REMAP) += intel_irq_remapping.o irq_remapping.o | 8 | obj-$(CONFIG_IRQ_REMAP) += intel_irq_remapping.o irq_remapping.o |
| 9 | obj-$(CONFIG_OMAP_IOMMU) += omap-iommu.o | 9 | obj-$(CONFIG_OMAP_IOMMU) += omap-iommu.o |
| 10 | obj-$(CONFIG_OMAP_IOMMU) += omap-iommu2.o | ||
| 10 | obj-$(CONFIG_OMAP_IOVMM) += omap-iovmm.o | 11 | obj-$(CONFIG_OMAP_IOVMM) += omap-iovmm.o |
| 11 | obj-$(CONFIG_OMAP_IOMMU_DEBUG) += omap-iommu-debug.o | 12 | obj-$(CONFIG_OMAP_IOMMU_DEBUG) += omap-iommu-debug.o |
| 12 | obj-$(CONFIG_TEGRA_IOMMU_GART) += tegra-gart.o | 13 | obj-$(CONFIG_TEGRA_IOMMU_GART) += tegra-gart.o |
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index 55074cba20eb..c1c74e030a58 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c | |||
| @@ -57,17 +57,9 @@ | |||
| 57 | * physically contiguous memory regions it is mapping into page sizes | 57 | * physically contiguous memory regions it is mapping into page sizes |
| 58 | * that we support. | 58 | * that we support. |
| 59 | * | 59 | * |
| 60 | * Traditionally the IOMMU core just handed us the mappings directly, | 60 | * 512GB Pages are not supported due to a hardware bug |
| 61 | * after making sure the size is an order of a 4KiB page and that the | ||
| 62 | * mapping has natural alignment. | ||
| 63 | * | ||
| 64 | * To retain this behavior, we currently advertise that we support | ||
| 65 | * all page sizes that are an order of 4KiB. | ||
| 66 | * | ||
| 67 | * If at some point we'd like to utilize the IOMMU core's new behavior, | ||
| 68 | * we could change this to advertise the real page sizes we support. | ||
| 69 | */ | 61 | */ |
| 70 | #define AMD_IOMMU_PGSIZES (~0xFFFUL) | 62 | #define AMD_IOMMU_PGSIZES ((~0xFFFUL) & ~(2ULL << 38)) |
| 71 | 63 | ||
| 72 | static DEFINE_RWLOCK(amd_iommu_devtable_lock); | 64 | static DEFINE_RWLOCK(amd_iommu_devtable_lock); |
| 73 | 65 | ||
| @@ -140,6 +132,9 @@ static void free_dev_data(struct iommu_dev_data *dev_data) | |||
| 140 | list_del(&dev_data->dev_data_list); | 132 | list_del(&dev_data->dev_data_list); |
| 141 | spin_unlock_irqrestore(&dev_data_list_lock, flags); | 133 | spin_unlock_irqrestore(&dev_data_list_lock, flags); |
| 142 | 134 | ||
| 135 | if (dev_data->group) | ||
| 136 | iommu_group_put(dev_data->group); | ||
| 137 | |||
| 143 | kfree(dev_data); | 138 | kfree(dev_data); |
| 144 | } | 139 | } |
| 145 | 140 | ||
| @@ -274,41 +269,23 @@ static void swap_pci_ref(struct pci_dev **from, struct pci_dev *to) | |||
| 274 | *from = to; | 269 | *from = to; |
| 275 | } | 270 | } |
| 276 | 271 | ||
| 277 | #define REQ_ACS_FLAGS (PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF) | 272 | static struct pci_bus *find_hosted_bus(struct pci_bus *bus) |
| 278 | |||
| 279 | static int iommu_init_device(struct device *dev) | ||
| 280 | { | 273 | { |
| 281 | struct pci_dev *dma_pdev = NULL, *pdev = to_pci_dev(dev); | 274 | while (!bus->self) { |
| 282 | struct iommu_dev_data *dev_data; | 275 | if (!pci_is_root_bus(bus)) |
| 283 | struct iommu_group *group; | 276 | bus = bus->parent; |
| 284 | u16 alias; | 277 | else |
| 285 | int ret; | 278 | return ERR_PTR(-ENODEV); |
| 286 | 279 | } | |
| 287 | if (dev->archdata.iommu) | ||
| 288 | return 0; | ||
| 289 | |||
| 290 | dev_data = find_dev_data(get_device_id(dev)); | ||
| 291 | if (!dev_data) | ||
| 292 | return -ENOMEM; | ||
| 293 | |||
| 294 | alias = amd_iommu_alias_table[dev_data->devid]; | ||
| 295 | if (alias != dev_data->devid) { | ||
| 296 | struct iommu_dev_data *alias_data; | ||
| 297 | 280 | ||
| 298 | alias_data = find_dev_data(alias); | 281 | return bus; |
| 299 | if (alias_data == NULL) { | 282 | } |
| 300 | pr_err("AMD-Vi: Warning: Unhandled device %s\n", | ||
| 301 | dev_name(dev)); | ||
| 302 | free_dev_data(dev_data); | ||
| 303 | return -ENOTSUPP; | ||
| 304 | } | ||
| 305 | dev_data->alias_data = alias_data; | ||
| 306 | 283 | ||
| 307 | dma_pdev = pci_get_bus_and_slot(alias >> 8, alias & 0xff); | 284 | #define REQ_ACS_FLAGS (PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF) |
| 308 | } | ||
| 309 | 285 | ||
| 310 | if (dma_pdev == NULL) | 286 | static struct pci_dev *get_isolation_root(struct pci_dev *pdev) |
| 311 | dma_pdev = pci_dev_get(pdev); | 287 | { |
| 288 | struct pci_dev *dma_pdev = pdev; | ||
| 312 | 289 | ||
| 313 | /* Account for quirked devices */ | 290 | /* Account for quirked devices */ |
| 314 | swap_pci_ref(&dma_pdev, pci_get_dma_source(dma_pdev)); | 291 | swap_pci_ref(&dma_pdev, pci_get_dma_source(dma_pdev)); |
| @@ -330,14 +307,9 @@ static int iommu_init_device(struct device *dev) | |||
| 330 | * Finding the next device may require skipping virtual buses. | 307 | * Finding the next device may require skipping virtual buses. |
| 331 | */ | 308 | */ |
| 332 | while (!pci_is_root_bus(dma_pdev->bus)) { | 309 | while (!pci_is_root_bus(dma_pdev->bus)) { |
| 333 | struct pci_bus *bus = dma_pdev->bus; | 310 | struct pci_bus *bus = find_hosted_bus(dma_pdev->bus); |
| 334 | 311 | if (IS_ERR(bus)) | |
| 335 | while (!bus->self) { | 312 | break; |
| 336 | if (!pci_is_root_bus(bus)) | ||
| 337 | bus = bus->parent; | ||
| 338 | else | ||
| 339 | goto root_bus; | ||
| 340 | } | ||
| 341 | 313 | ||
| 342 | if (pci_acs_path_enabled(bus->self, NULL, REQ_ACS_FLAGS)) | 314 | if (pci_acs_path_enabled(bus->self, NULL, REQ_ACS_FLAGS)) |
| 343 | break; | 315 | break; |
| @@ -345,19 +317,137 @@ static int iommu_init_device(struct device *dev) | |||
| 345 | swap_pci_ref(&dma_pdev, pci_dev_get(bus->self)); | 317 | swap_pci_ref(&dma_pdev, pci_dev_get(bus->self)); |
| 346 | } | 318 | } |
| 347 | 319 | ||
| 348 | root_bus: | 320 | return dma_pdev; |
| 349 | group = iommu_group_get(&dma_pdev->dev); | 321 | } |
| 350 | pci_dev_put(dma_pdev); | 322 | |
| 323 | static int use_pdev_iommu_group(struct pci_dev *pdev, struct device *dev) | ||
| 324 | { | ||
| 325 | struct iommu_group *group = iommu_group_get(&pdev->dev); | ||
| 326 | int ret; | ||
| 327 | |||
| 351 | if (!group) { | 328 | if (!group) { |
| 352 | group = iommu_group_alloc(); | 329 | group = iommu_group_alloc(); |
| 353 | if (IS_ERR(group)) | 330 | if (IS_ERR(group)) |
| 354 | return PTR_ERR(group); | 331 | return PTR_ERR(group); |
| 332 | |||
| 333 | WARN_ON(&pdev->dev != dev); | ||
| 355 | } | 334 | } |
| 356 | 335 | ||
| 357 | ret = iommu_group_add_device(group, dev); | 336 | ret = iommu_group_add_device(group, dev); |
| 358 | |||
| 359 | iommu_group_put(group); | 337 | iommu_group_put(group); |
| 338 | return ret; | ||
| 339 | } | ||
| 340 | |||
| 341 | static int use_dev_data_iommu_group(struct iommu_dev_data *dev_data, | ||
| 342 | struct device *dev) | ||
| 343 | { | ||
| 344 | if (!dev_data->group) { | ||
| 345 | struct iommu_group *group = iommu_group_alloc(); | ||
| 346 | if (IS_ERR(group)) | ||
| 347 | return PTR_ERR(group); | ||
| 348 | |||
| 349 | dev_data->group = group; | ||
| 350 | } | ||
| 351 | |||
| 352 | return iommu_group_add_device(dev_data->group, dev); | ||
| 353 | } | ||
| 354 | |||
| 355 | static int init_iommu_group(struct device *dev) | ||
| 356 | { | ||
| 357 | struct iommu_dev_data *dev_data; | ||
| 358 | struct iommu_group *group; | ||
| 359 | struct pci_dev *dma_pdev; | ||
| 360 | int ret; | ||
| 361 | |||
| 362 | group = iommu_group_get(dev); | ||
| 363 | if (group) { | ||
| 364 | iommu_group_put(group); | ||
| 365 | return 0; | ||
| 366 | } | ||
| 367 | |||
| 368 | dev_data = find_dev_data(get_device_id(dev)); | ||
| 369 | if (!dev_data) | ||
| 370 | return -ENOMEM; | ||
| 371 | |||
| 372 | if (dev_data->alias_data) { | ||
| 373 | u16 alias; | ||
| 374 | struct pci_bus *bus; | ||
| 375 | |||
| 376 | if (dev_data->alias_data->group) | ||
| 377 | goto use_group; | ||
| 378 | |||
| 379 | /* | ||
| 380 | * If the alias device exists, it's effectively just a first | ||
| 381 | * level quirk for finding the DMA source. | ||
| 382 | */ | ||
| 383 | alias = amd_iommu_alias_table[dev_data->devid]; | ||
| 384 | dma_pdev = pci_get_bus_and_slot(alias >> 8, alias & 0xff); | ||
| 385 | if (dma_pdev) { | ||
| 386 | dma_pdev = get_isolation_root(dma_pdev); | ||
| 387 | goto use_pdev; | ||
| 388 | } | ||
| 389 | |||
| 390 | /* | ||
| 391 | * If the alias is virtual, try to find a parent device | ||
| 392 | * and test whether the IOMMU group is actualy rooted above | ||
| 393 | * the alias. Be careful to also test the parent device if | ||
| 394 | * we think the alias is the root of the group. | ||
| 395 | */ | ||
| 396 | bus = pci_find_bus(0, alias >> 8); | ||
| 397 | if (!bus) | ||
| 398 | goto use_group; | ||
| 399 | |||
| 400 | bus = find_hosted_bus(bus); | ||
| 401 | if (IS_ERR(bus) || !bus->self) | ||
| 402 | goto use_group; | ||
| 403 | |||
| 404 | dma_pdev = get_isolation_root(pci_dev_get(bus->self)); | ||
| 405 | if (dma_pdev != bus->self || (dma_pdev->multifunction && | ||
| 406 | !pci_acs_enabled(dma_pdev, REQ_ACS_FLAGS))) | ||
| 407 | goto use_pdev; | ||
| 408 | |||
| 409 | pci_dev_put(dma_pdev); | ||
| 410 | goto use_group; | ||
| 411 | } | ||
| 412 | |||
| 413 | dma_pdev = get_isolation_root(pci_dev_get(to_pci_dev(dev))); | ||
| 414 | use_pdev: | ||
| 415 | ret = use_pdev_iommu_group(dma_pdev, dev); | ||
| 416 | pci_dev_put(dma_pdev); | ||
| 417 | return ret; | ||
| 418 | use_group: | ||
| 419 | return use_dev_data_iommu_group(dev_data->alias_data, dev); | ||
| 420 | } | ||
| 421 | |||
| 422 | static int iommu_init_device(struct device *dev) | ||
| 423 | { | ||
| 424 | struct pci_dev *pdev = to_pci_dev(dev); | ||
| 425 | struct iommu_dev_data *dev_data; | ||
| 426 | u16 alias; | ||
| 427 | int ret; | ||
| 428 | |||
| 429 | if (dev->archdata.iommu) | ||
| 430 | return 0; | ||
| 431 | |||
| 432 | dev_data = find_dev_data(get_device_id(dev)); | ||
| 433 | if (!dev_data) | ||
| 434 | return -ENOMEM; | ||
| 435 | |||
| 436 | alias = amd_iommu_alias_table[dev_data->devid]; | ||
| 437 | if (alias != dev_data->devid) { | ||
| 438 | struct iommu_dev_data *alias_data; | ||
| 439 | |||
| 440 | alias_data = find_dev_data(alias); | ||
| 441 | if (alias_data == NULL) { | ||
| 442 | pr_err("AMD-Vi: Warning: Unhandled device %s\n", | ||
| 443 | dev_name(dev)); | ||
| 444 | free_dev_data(dev_data); | ||
| 445 | return -ENOTSUPP; | ||
| 446 | } | ||
| 447 | dev_data->alias_data = alias_data; | ||
| 448 | } | ||
| 360 | 449 | ||
| 450 | ret = init_iommu_group(dev); | ||
| 361 | if (ret) | 451 | if (ret) |
| 362 | return ret; | 452 | return ret; |
| 363 | 453 | ||
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h index c9aa3d079ff0..e38ab438bb34 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h | |||
| @@ -426,6 +426,7 @@ struct iommu_dev_data { | |||
| 426 | struct iommu_dev_data *alias_data;/* The alias dev_data */ | 426 | struct iommu_dev_data *alias_data;/* The alias dev_data */ |
| 427 | struct protection_domain *domain; /* Domain the device is bound to */ | 427 | struct protection_domain *domain; /* Domain the device is bound to */ |
| 428 | atomic_t bind; /* Domain attach reference count */ | 428 | atomic_t bind; /* Domain attach reference count */ |
| 429 | struct iommu_group *group; /* IOMMU group for virtual aliases */ | ||
| 429 | u16 devid; /* PCI Device ID */ | 430 | u16 devid; /* PCI Device ID */ |
| 430 | bool iommu_v2; /* Device can make use of IOMMUv2 */ | 431 | bool iommu_v2; /* Device can make use of IOMMUv2 */ |
| 431 | bool passthrough; /* Default for device is pt_domain */ | 432 | bool passthrough; /* Default for device is pt_domain */ |
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index ca3ee46a8d61..f7fd3d0aeb4c 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
| @@ -4139,7 +4139,7 @@ static void swap_pci_ref(struct pci_dev **from, struct pci_dev *to) | |||
| 4139 | static int intel_iommu_add_device(struct device *dev) | 4139 | static int intel_iommu_add_device(struct device *dev) |
| 4140 | { | 4140 | { |
| 4141 | struct pci_dev *pdev = to_pci_dev(dev); | 4141 | struct pci_dev *pdev = to_pci_dev(dev); |
| 4142 | struct pci_dev *bridge, *dma_pdev; | 4142 | struct pci_dev *bridge, *dma_pdev = NULL; |
| 4143 | struct iommu_group *group; | 4143 | struct iommu_group *group; |
| 4144 | int ret; | 4144 | int ret; |
| 4145 | 4145 | ||
| @@ -4153,7 +4153,7 @@ static int intel_iommu_add_device(struct device *dev) | |||
| 4153 | dma_pdev = pci_get_domain_bus_and_slot( | 4153 | dma_pdev = pci_get_domain_bus_and_slot( |
| 4154 | pci_domain_nr(pdev->bus), | 4154 | pci_domain_nr(pdev->bus), |
| 4155 | bridge->subordinate->number, 0); | 4155 | bridge->subordinate->number, 0); |
| 4156 | else | 4156 | if (!dma_pdev) |
| 4157 | dma_pdev = pci_dev_get(bridge); | 4157 | dma_pdev = pci_dev_get(bridge); |
| 4158 | } else | 4158 | } else |
| 4159 | dma_pdev = pci_dev_get(pdev); | 4159 | dma_pdev = pci_dev_get(pdev); |
diff --git a/drivers/iommu/omap-iommu-debug.c b/drivers/iommu/omap-iommu-debug.c index f55fc5dfbadc..d97fbe4fb9b1 100644 --- a/drivers/iommu/omap-iommu-debug.c +++ b/drivers/iommu/omap-iommu-debug.c | |||
| @@ -18,11 +18,11 @@ | |||
| 18 | #include <linux/uaccess.h> | 18 | #include <linux/uaccess.h> |
| 19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
| 20 | #include <linux/debugfs.h> | 20 | #include <linux/debugfs.h> |
| 21 | #include <linux/omap-iommu.h> | ||
| 22 | #include <linux/platform_data/iommu-omap.h> | ||
| 21 | 23 | ||
| 22 | #include <plat/iommu.h> | 24 | #include "omap-iopgtable.h" |
| 23 | #include <plat/iovmm.h> | 25 | #include "omap-iommu.h" |
| 24 | |||
| 25 | #include <plat/iopgtable.h> | ||
| 26 | 26 | ||
| 27 | #define MAXCOLUMN 100 /* for short messages */ | 27 | #define MAXCOLUMN 100 /* for short messages */ |
| 28 | 28 | ||
diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c index d0b1234581be..18108c1405e2 100644 --- a/drivers/iommu/omap-iommu.c +++ b/drivers/iommu/omap-iommu.c | |||
| @@ -16,17 +16,20 @@ | |||
| 16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
| 17 | #include <linux/interrupt.h> | 17 | #include <linux/interrupt.h> |
| 18 | #include <linux/ioport.h> | 18 | #include <linux/ioport.h> |
| 19 | #include <linux/clk.h> | ||
| 20 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
| 21 | #include <linux/iommu.h> | 20 | #include <linux/iommu.h> |
| 21 | #include <linux/omap-iommu.h> | ||
| 22 | #include <linux/mutex.h> | 22 | #include <linux/mutex.h> |
| 23 | #include <linux/spinlock.h> | 23 | #include <linux/spinlock.h> |
| 24 | #include <linux/io.h> | ||
| 25 | #include <linux/pm_runtime.h> | ||
| 24 | 26 | ||
| 25 | #include <asm/cacheflush.h> | 27 | #include <asm/cacheflush.h> |
| 26 | 28 | ||
| 27 | #include <plat/iommu.h> | 29 | #include <linux/platform_data/iommu-omap.h> |
| 28 | 30 | ||
| 29 | #include <plat/iopgtable.h> | 31 | #include "omap-iopgtable.h" |
| 32 | #include "omap-iommu.h" | ||
| 30 | 33 | ||
| 31 | #define for_each_iotlb_cr(obj, n, __i, cr) \ | 34 | #define for_each_iotlb_cr(obj, n, __i, cr) \ |
| 32 | for (__i = 0; \ | 35 | for (__i = 0; \ |
| @@ -51,6 +54,21 @@ struct omap_iommu_domain { | |||
| 51 | spinlock_t lock; | 54 | spinlock_t lock; |
| 52 | }; | 55 | }; |
| 53 | 56 | ||
| 57 | #define MMU_LOCK_BASE_SHIFT 10 | ||
| 58 | #define MMU_LOCK_BASE_MASK (0x1f << MMU_LOCK_BASE_SHIFT) | ||
| 59 | #define MMU_LOCK_BASE(x) \ | ||
| 60 | ((x & MMU_LOCK_BASE_MASK) >> MMU_LOCK_BASE_SHIFT) | ||
| 61 | |||
| 62 | #define MMU_LOCK_VICT_SHIFT 4 | ||
| 63 | #define MMU_LOCK_VICT_MASK (0x1f << MMU_LOCK_VICT_SHIFT) | ||
| 64 | #define MMU_LOCK_VICT(x) \ | ||
| 65 | ((x & MMU_LOCK_VICT_MASK) >> MMU_LOCK_VICT_SHIFT) | ||
| 66 | |||
| 67 | struct iotlb_lock { | ||
| 68 | short base; | ||
| 69 | short vict; | ||
| 70 | }; | ||
| 71 | |||
| 54 | /* accommodate the difference between omap1 and omap2/3 */ | 72 | /* accommodate the difference between omap1 and omap2/3 */ |
| 55 | static const struct iommu_functions *arch_iommu; | 73 | static const struct iommu_functions *arch_iommu; |
| 56 | 74 | ||
| @@ -125,31 +143,44 @@ EXPORT_SYMBOL_GPL(omap_iommu_arch_version); | |||
| 125 | static int iommu_enable(struct omap_iommu *obj) | 143 | static int iommu_enable(struct omap_iommu *obj) |
| 126 | { | 144 | { |
| 127 | int err; | 145 | int err; |
| 146 | struct platform_device *pdev = to_platform_device(obj->dev); | ||
| 147 | struct iommu_platform_data *pdata = pdev->dev.platform_data; | ||
| 128 | 148 | ||
| 129 | if (!obj) | 149 | if (!obj || !pdata) |
| 130 | return -EINVAL; | 150 | return -EINVAL; |
| 131 | 151 | ||
| 132 | if (!arch_iommu) | 152 | if (!arch_iommu) |
| 133 | return -ENODEV; | 153 | return -ENODEV; |
| 134 | 154 | ||
| 135 | clk_enable(obj->clk); | 155 | if (pdata->deassert_reset) { |
| 156 | err = pdata->deassert_reset(pdev, pdata->reset_name); | ||
| 157 | if (err) { | ||
| 158 | dev_err(obj->dev, "deassert_reset failed: %d\n", err); | ||
| 159 | return err; | ||
| 160 | } | ||
| 161 | } | ||
| 162 | |||
| 163 | pm_runtime_get_sync(obj->dev); | ||
| 136 | 164 | ||
| 137 | err = arch_iommu->enable(obj); | 165 | err = arch_iommu->enable(obj); |
| 138 | 166 | ||
| 139 | clk_disable(obj->clk); | ||
| 140 | return err; | 167 | return err; |
| 141 | } | 168 | } |
| 142 | 169 | ||
| 143 | static void iommu_disable(struct omap_iommu *obj) | 170 | static void iommu_disable(struct omap_iommu *obj) |
| 144 | { | 171 | { |
| 145 | if (!obj) | 172 | struct platform_device *pdev = to_platform_device(obj->dev); |
| 146 | return; | 173 | struct iommu_platform_data *pdata = pdev->dev.platform_data; |
| 147 | 174 | ||
| 148 | clk_enable(obj->clk); | 175 | if (!obj || !pdata) |
| 176 | return; | ||
| 149 | 177 | ||
| 150 | arch_iommu->disable(obj); | 178 | arch_iommu->disable(obj); |
| 151 | 179 | ||
| 152 | clk_disable(obj->clk); | 180 | pm_runtime_put_sync(obj->dev); |
| 181 | |||
| 182 | if (pdata->assert_reset) | ||
| 183 | pdata->assert_reset(pdev, pdata->reset_name); | ||
| 153 | } | 184 | } |
| 154 | 185 | ||
| 155 | /* | 186 | /* |
| @@ -272,7 +303,7 @@ static int load_iotlb_entry(struct omap_iommu *obj, struct iotlb_entry *e) | |||
| 272 | if (!obj || !obj->nr_tlb_entries || !e) | 303 | if (!obj || !obj->nr_tlb_entries || !e) |
| 273 | return -EINVAL; | 304 | return -EINVAL; |
| 274 | 305 | ||
| 275 | clk_enable(obj->clk); | 306 | pm_runtime_get_sync(obj->dev); |
| 276 | 307 | ||
| 277 | iotlb_lock_get(obj, &l); | 308 | iotlb_lock_get(obj, &l); |
| 278 | if (l.base == obj->nr_tlb_entries) { | 309 | if (l.base == obj->nr_tlb_entries) { |
| @@ -302,7 +333,7 @@ static int load_iotlb_entry(struct omap_iommu *obj, struct iotlb_entry *e) | |||
| 302 | 333 | ||
| 303 | cr = iotlb_alloc_cr(obj, e); | 334 | cr = iotlb_alloc_cr(obj, e); |
| 304 | if (IS_ERR(cr)) { | 335 | if (IS_ERR(cr)) { |
| 305 | clk_disable(obj->clk); | 336 | pm_runtime_put_sync(obj->dev); |
| 306 | return PTR_ERR(cr); | 337 | return PTR_ERR(cr); |
| 307 | } | 338 | } |
| 308 | 339 | ||
| @@ -316,7 +347,7 @@ static int load_iotlb_entry(struct omap_iommu *obj, struct iotlb_entry *e) | |||
| 316 | l.vict = l.base; | 347 | l.vict = l.base; |
| 317 | iotlb_lock_set(obj, &l); | 348 | iotlb_lock_set(obj, &l); |
| 318 | out: | 349 | out: |
| 319 | clk_disable(obj->clk); | 350 | pm_runtime_put_sync(obj->dev); |
| 320 | return err; | 351 | return err; |
| 321 | } | 352 | } |
| 322 | 353 | ||
| @@ -346,7 +377,7 @@ static void flush_iotlb_page(struct omap_iommu *obj, u32 da) | |||
| 346 | int i; | 377 | int i; |
| 347 | struct cr_regs cr; | 378 | struct cr_regs cr; |
| 348 | 379 | ||
| 349 | clk_enable(obj->clk); | 380 | pm_runtime_get_sync(obj->dev); |
| 350 | 381 | ||
| 351 | for_each_iotlb_cr(obj, obj->nr_tlb_entries, i, cr) { | 382 | for_each_iotlb_cr(obj, obj->nr_tlb_entries, i, cr) { |
| 352 | u32 start; | 383 | u32 start; |
| @@ -365,7 +396,7 @@ static void flush_iotlb_page(struct omap_iommu *obj, u32 da) | |||
| 365 | iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY); | 396 | iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY); |
| 366 | } | 397 | } |
| 367 | } | 398 | } |
| 368 | clk_disable(obj->clk); | 399 | pm_runtime_put_sync(obj->dev); |
| 369 | 400 | ||
| 370 | if (i == obj->nr_tlb_entries) | 401 | if (i == obj->nr_tlb_entries) |
| 371 | dev_dbg(obj->dev, "%s: no page for %08x\n", __func__, da); | 402 | dev_dbg(obj->dev, "%s: no page for %08x\n", __func__, da); |
| @@ -379,7 +410,7 @@ static void flush_iotlb_all(struct omap_iommu *obj) | |||
| 379 | { | 410 | { |
| 380 | struct iotlb_lock l; | 411 | struct iotlb_lock l; |
| 381 | 412 | ||
| 382 | clk_enable(obj->clk); | 413 | pm_runtime_get_sync(obj->dev); |
| 383 | 414 | ||
| 384 | l.base = 0; | 415 | l.base = 0; |
| 385 | l.vict = 0; | 416 | l.vict = 0; |
| @@ -387,7 +418,7 @@ static void flush_iotlb_all(struct omap_iommu *obj) | |||
| 387 | 418 | ||
| 388 | iommu_write_reg(obj, 1, MMU_GFLUSH); | 419 | iommu_write_reg(obj, 1, MMU_GFLUSH); |
| 389 | 420 | ||
| 390 | clk_disable(obj->clk); | 421 | pm_runtime_put_sync(obj->dev); |
| 391 | } | 422 | } |
| 392 | 423 | ||
| 393 | #if defined(CONFIG_OMAP_IOMMU_DEBUG) || defined(CONFIG_OMAP_IOMMU_DEBUG_MODULE) | 424 | #if defined(CONFIG_OMAP_IOMMU_DEBUG) || defined(CONFIG_OMAP_IOMMU_DEBUG_MODULE) |
| @@ -397,11 +428,11 @@ ssize_t omap_iommu_dump_ctx(struct omap_iommu *obj, char *buf, ssize_t bytes) | |||
| 397 | if (!obj || !buf) | 428 | if (!obj || !buf) |
| 398 | return -EINVAL; | 429 | return -EINVAL; |
| 399 | 430 | ||
| 400 | clk_enable(obj->clk); | 431 | pm_runtime_get_sync(obj->dev); |
| 401 | 432 | ||
| 402 | bytes = arch_iommu->dump_ctx(obj, buf, bytes); | 433 | bytes = arch_iommu->dump_ctx(obj, buf, bytes); |
| 403 | 434 | ||
| 404 | clk_disable(obj->clk); | 435 | pm_runtime_put_sync(obj->dev); |
| 405 | 436 | ||
| 406 | return bytes; | 437 | return bytes; |
| 407 | } | 438 | } |
| @@ -415,7 +446,7 @@ __dump_tlb_entries(struct omap_iommu *obj, struct cr_regs *crs, int num) | |||
| 415 | struct cr_regs tmp; | 446 | struct cr_regs tmp; |
| 416 | struct cr_regs *p = crs; | 447 | struct cr_regs *p = crs; |
| 417 | 448 | ||
| 418 | clk_enable(obj->clk); | 449 | pm_runtime_get_sync(obj->dev); |
| 419 | iotlb_lock_get(obj, &saved); | 450 | iotlb_lock_get(obj, &saved); |
| 420 | 451 | ||
| 421 | for_each_iotlb_cr(obj, num, i, tmp) { | 452 | for_each_iotlb_cr(obj, num, i, tmp) { |
| @@ -425,7 +456,7 @@ __dump_tlb_entries(struct omap_iommu *obj, struct cr_regs *crs, int num) | |||
| 425 | } | 456 | } |
| 426 | 457 | ||
| 427 | iotlb_lock_set(obj, &saved); | 458 | iotlb_lock_set(obj, &saved); |
| 428 | clk_disable(obj->clk); | 459 | pm_runtime_put_sync(obj->dev); |
| 429 | 460 | ||
| 430 | return p - crs; | 461 | return p - crs; |
| 431 | } | 462 | } |
| @@ -789,9 +820,7 @@ static irqreturn_t iommu_fault_handler(int irq, void *data) | |||
| 789 | if (!obj->refcount) | 820 | if (!obj->refcount) |
| 790 | return IRQ_NONE; | 821 | return IRQ_NONE; |
| 791 | 822 | ||
| 792 | clk_enable(obj->clk); | ||
| 793 | errs = iommu_report_fault(obj, &da); | 823 | errs = iommu_report_fault(obj, &da); |
| 794 | clk_disable(obj->clk); | ||
| 795 | if (errs == 0) | 824 | if (errs == 0) |
| 796 | return IRQ_HANDLED; | 825 | return IRQ_HANDLED; |
| 797 | 826 | ||
| @@ -913,17 +942,10 @@ static int __devinit omap_iommu_probe(struct platform_device *pdev) | |||
| 913 | struct resource *res; | 942 | struct resource *res; |
| 914 | struct iommu_platform_data *pdata = pdev->dev.platform_data; | 943 | struct iommu_platform_data *pdata = pdev->dev.platform_data; |
| 915 | 944 | ||
| 916 | if (pdev->num_resources != 2) | ||
| 917 | return -EINVAL; | ||
| 918 | |||
| 919 | obj = kzalloc(sizeof(*obj) + MMU_REG_SIZE, GFP_KERNEL); | 945 | obj = kzalloc(sizeof(*obj) + MMU_REG_SIZE, GFP_KERNEL); |
| 920 | if (!obj) | 946 | if (!obj) |
| 921 | return -ENOMEM; | 947 | return -ENOMEM; |
| 922 | 948 | ||
| 923 | obj->clk = clk_get(&pdev->dev, pdata->clk_name); | ||
| 924 | if (IS_ERR(obj->clk)) | ||
| 925 | goto err_clk; | ||
| 926 | |||
| 927 | obj->nr_tlb_entries = pdata->nr_tlb_entries; | 949 | obj->nr_tlb_entries = pdata->nr_tlb_entries; |
| 928 | obj->name = pdata->name; | 950 | obj->name = pdata->name; |
| 929 | obj->dev = &pdev->dev; | 951 | obj->dev = &pdev->dev; |
| @@ -966,6 +988,9 @@ static int __devinit omap_iommu_probe(struct platform_device *pdev) | |||
| 966 | goto err_irq; | 988 | goto err_irq; |
| 967 | platform_set_drvdata(pdev, obj); | 989 | platform_set_drvdata(pdev, obj); |
| 968 | 990 | ||
| 991 | pm_runtime_irq_safe(obj->dev); | ||
| 992 | pm_runtime_enable(obj->dev); | ||
| 993 | |||
| 969 | dev_info(&pdev->dev, "%s registered\n", obj->name); | 994 | dev_info(&pdev->dev, "%s registered\n", obj->name); |
| 970 | return 0; | 995 | return 0; |
| 971 | 996 | ||
| @@ -974,8 +999,6 @@ err_irq: | |||
| 974 | err_ioremap: | 999 | err_ioremap: |
| 975 | release_mem_region(res->start, resource_size(res)); | 1000 | release_mem_region(res->start, resource_size(res)); |
| 976 | err_mem: | 1001 | err_mem: |
| 977 | clk_put(obj->clk); | ||
| 978 | err_clk: | ||
| 979 | kfree(obj); | 1002 | kfree(obj); |
| 980 | return err; | 1003 | return err; |
| 981 | } | 1004 | } |
| @@ -996,7 +1019,8 @@ static int __devexit omap_iommu_remove(struct platform_device *pdev) | |||
| 996 | release_mem_region(res->start, resource_size(res)); | 1019 | release_mem_region(res->start, resource_size(res)); |
| 997 | iounmap(obj->regbase); | 1020 | iounmap(obj->regbase); |
| 998 | 1021 | ||
| 999 | clk_put(obj->clk); | 1022 | pm_runtime_disable(obj->dev); |
| 1023 | |||
| 1000 | dev_info(&pdev->dev, "%s removed\n", obj->name); | 1024 | dev_info(&pdev->dev, "%s removed\n", obj->name); |
| 1001 | kfree(obj); | 1025 | kfree(obj); |
| 1002 | return 0; | 1026 | return 0; |
| @@ -1015,6 +1039,23 @@ static void iopte_cachep_ctor(void *iopte) | |||
| 1015 | clean_dcache_area(iopte, IOPTE_TABLE_SIZE); | 1039 | clean_dcache_area(iopte, IOPTE_TABLE_SIZE); |
| 1016 | } | 1040 | } |
| 1017 | 1041 | ||
| 1042 | static u32 iotlb_init_entry(struct iotlb_entry *e, u32 da, u32 pa, | ||
| 1043 | u32 flags) | ||
| 1044 | { | ||
| 1045 | memset(e, 0, sizeof(*e)); | ||
| 1046 | |||
| 1047 | e->da = da; | ||
| 1048 | e->pa = pa; | ||
| 1049 | e->valid = 1; | ||
| 1050 | /* FIXME: add OMAP1 support */ | ||
| 1051 | e->pgsz = flags & MMU_CAM_PGSZ_MASK; | ||
| 1052 | e->endian = flags & MMU_RAM_ENDIAN_MASK; | ||
| 1053 | e->elsz = flags & MMU_RAM_ELSZ_MASK; | ||
| 1054 | e->mixed = flags & MMU_RAM_MIXED_MASK; | ||
| 1055 | |||
| 1056 | return iopgsz_to_bytes(e->pgsz); | ||
| 1057 | } | ||
| 1058 | |||
| 1018 | static int omap_iommu_map(struct iommu_domain *domain, unsigned long da, | 1059 | static int omap_iommu_map(struct iommu_domain *domain, unsigned long da, |
| 1019 | phys_addr_t pa, size_t bytes, int prot) | 1060 | phys_addr_t pa, size_t bytes, int prot) |
| 1020 | { | 1061 | { |
diff --git a/arch/arm/plat-omap/include/plat/iommu.h b/drivers/iommu/omap-iommu.h index 68b5f0362f35..120084206602 100644 --- a/arch/arm/plat-omap/include/plat/iommu.h +++ b/drivers/iommu/omap-iommu.h | |||
| @@ -10,8 +10,9 @@ | |||
| 10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #ifndef __MACH_IOMMU_H | 13 | #if defined(CONFIG_ARCH_OMAP1) |
| 14 | #define __MACH_IOMMU_H | 14 | #error "iommu for this processor not implemented yet" |
| 15 | #endif | ||
| 15 | 16 | ||
| 16 | struct iotlb_entry { | 17 | struct iotlb_entry { |
| 17 | u32 da; | 18 | u32 da; |
| @@ -28,7 +29,6 @@ struct iotlb_entry { | |||
| 28 | struct omap_iommu { | 29 | struct omap_iommu { |
| 29 | const char *name; | 30 | const char *name; |
| 30 | struct module *owner; | 31 | struct module *owner; |
| 31 | struct clk *clk; | ||
| 32 | void __iomem *regbase; | 32 | void __iomem *regbase; |
| 33 | struct device *dev; | 33 | struct device *dev; |
| 34 | void *isr_priv; | 34 | void *isr_priv; |
| @@ -71,11 +71,6 @@ struct cr_regs { | |||
| 71 | }; | 71 | }; |
| 72 | }; | 72 | }; |
| 73 | 73 | ||
| 74 | struct iotlb_lock { | ||
| 75 | short base; | ||
| 76 | short vict; | ||
| 77 | }; | ||
| 78 | |||
| 79 | /* architecture specific functions */ | 74 | /* architecture specific functions */ |
| 80 | struct iommu_functions { | 75 | struct iommu_functions { |
| 81 | unsigned long version; | 76 | unsigned long version; |
| @@ -103,42 +98,6 @@ struct iommu_functions { | |||
| 103 | ssize_t (*dump_ctx)(struct omap_iommu *obj, char *buf, ssize_t len); | 98 | ssize_t (*dump_ctx)(struct omap_iommu *obj, char *buf, ssize_t len); |
| 104 | }; | 99 | }; |
| 105 | 100 | ||
| 106 | /** | ||
| 107 | * struct omap_mmu_dev_attr - OMAP mmu device attributes for omap_hwmod | ||
| 108 | * @da_start: device address where the va space starts. | ||
| 109 | * @da_end: device address where the va space ends. | ||
| 110 | * @nr_tlb_entries: number of entries supported by the translation | ||
| 111 | * look-aside buffer (TLB). | ||
| 112 | */ | ||
| 113 | struct omap_mmu_dev_attr { | ||
| 114 | u32 da_start; | ||
| 115 | u32 da_end; | ||
| 116 | int nr_tlb_entries; | ||
| 117 | }; | ||
| 118 | |||
| 119 | struct iommu_platform_data { | ||
| 120 | const char *name; | ||
| 121 | const char *clk_name; | ||
| 122 | const int nr_tlb_entries; | ||
| 123 | u32 da_start; | ||
| 124 | u32 da_end; | ||
| 125 | }; | ||
| 126 | |||
| 127 | /** | ||
| 128 | * struct iommu_arch_data - omap iommu private data | ||
| 129 | * @name: name of the iommu device | ||
| 130 | * @iommu_dev: handle of the iommu device | ||
| 131 | * | ||
| 132 | * This is an omap iommu private data object, which binds an iommu user | ||
| 133 | * to its iommu device. This object should be placed at the iommu user's | ||
| 134 | * dev_archdata so generic IOMMU API can be used without having to | ||
| 135 | * utilize omap-specific plumbing anymore. | ||
| 136 | */ | ||
| 137 | struct omap_iommu_arch_data { | ||
| 138 | const char *name; | ||
| 139 | struct omap_iommu *iommu_dev; | ||
| 140 | }; | ||
| 141 | |||
| 142 | #ifdef CONFIG_IOMMU_API | 101 | #ifdef CONFIG_IOMMU_API |
| 143 | /** | 102 | /** |
| 144 | * dev_to_omap_iommu() - retrieves an omap iommu object from a user device | 103 | * dev_to_omap_iommu() - retrieves an omap iommu object from a user device |
| @@ -152,18 +111,57 @@ static inline struct omap_iommu *dev_to_omap_iommu(struct device *dev) | |||
| 152 | } | 111 | } |
| 153 | #endif | 112 | #endif |
| 154 | 113 | ||
| 155 | /* IOMMU errors */ | 114 | /* |
| 156 | #define OMAP_IOMMU_ERR_TLB_MISS (1 << 0) | 115 | * MMU Register offsets |
| 157 | #define OMAP_IOMMU_ERR_TRANS_FAULT (1 << 1) | 116 | */ |
| 158 | #define OMAP_IOMMU_ERR_EMU_MISS (1 << 2) | 117 | #define MMU_REVISION 0x00 |
| 159 | #define OMAP_IOMMU_ERR_TBLWALK_FAULT (1 << 3) | 118 | #define MMU_IRQSTATUS 0x18 |
| 160 | #define OMAP_IOMMU_ERR_MULTIHIT_FAULT (1 << 4) | 119 | #define MMU_IRQENABLE 0x1c |
| 120 | #define MMU_WALKING_ST 0x40 | ||
| 121 | #define MMU_CNTL 0x44 | ||
| 122 | #define MMU_FAULT_AD 0x48 | ||
| 123 | #define MMU_TTB 0x4c | ||
| 124 | #define MMU_LOCK 0x50 | ||
| 125 | #define MMU_LD_TLB 0x54 | ||
| 126 | #define MMU_CAM 0x58 | ||
| 127 | #define MMU_RAM 0x5c | ||
| 128 | #define MMU_GFLUSH 0x60 | ||
| 129 | #define MMU_FLUSH_ENTRY 0x64 | ||
| 130 | #define MMU_READ_CAM 0x68 | ||
| 131 | #define MMU_READ_RAM 0x6c | ||
| 132 | #define MMU_EMU_FAULT_AD 0x70 | ||
| 133 | |||
| 134 | #define MMU_REG_SIZE 256 | ||
| 161 | 135 | ||
| 162 | #if defined(CONFIG_ARCH_OMAP1) | 136 | /* |
| 163 | #error "iommu for this processor not implemented yet" | 137 | * MMU Register bit definitions |
| 164 | #else | 138 | */ |
| 165 | #include <plat/iommu2.h> | 139 | #define MMU_CAM_VATAG_SHIFT 12 |
| 166 | #endif | 140 | #define MMU_CAM_VATAG_MASK \ |
| 141 | ((~0UL >> MMU_CAM_VATAG_SHIFT) << MMU_CAM_VATAG_SHIFT) | ||
| 142 | #define MMU_CAM_P (1 << 3) | ||
| 143 | #define MMU_CAM_V (1 << 2) | ||
| 144 | #define MMU_CAM_PGSZ_MASK 3 | ||
| 145 | #define MMU_CAM_PGSZ_1M (0 << 0) | ||
| 146 | #define MMU_CAM_PGSZ_64K (1 << 0) | ||
| 147 | #define MMU_CAM_PGSZ_4K (2 << 0) | ||
| 148 | #define MMU_CAM_PGSZ_16M (3 << 0) | ||
| 149 | |||
| 150 | #define MMU_RAM_PADDR_SHIFT 12 | ||
| 151 | #define MMU_RAM_PADDR_MASK \ | ||
| 152 | ((~0UL >> MMU_RAM_PADDR_SHIFT) << MMU_RAM_PADDR_SHIFT) | ||
| 153 | |||
| 154 | #define MMU_RAM_ENDIAN_MASK (1 << MMU_RAM_ENDIAN_SHIFT) | ||
| 155 | #define MMU_RAM_ENDIAN_BIG (1 << MMU_RAM_ENDIAN_SHIFT) | ||
| 156 | |||
| 157 | #define MMU_RAM_ELSZ_MASK (3 << MMU_RAM_ELSZ_SHIFT) | ||
| 158 | #define MMU_RAM_ELSZ_8 (0 << MMU_RAM_ELSZ_SHIFT) | ||
| 159 | #define MMU_RAM_ELSZ_16 (1 << MMU_RAM_ELSZ_SHIFT) | ||
| 160 | #define MMU_RAM_ELSZ_32 (2 << MMU_RAM_ELSZ_SHIFT) | ||
| 161 | #define MMU_RAM_ELSZ_NONE (3 << MMU_RAM_ELSZ_SHIFT) | ||
| 162 | #define MMU_RAM_MIXED_SHIFT 6 | ||
| 163 | #define MMU_RAM_MIXED_MASK (1 << MMU_RAM_MIXED_SHIFT) | ||
| 164 | #define MMU_RAM_MIXED MMU_RAM_MIXED_MASK | ||
| 167 | 165 | ||
| 168 | /* | 166 | /* |
| 169 | * utilities for super page(16MB, 1MB, 64KB and 4KB) | 167 | * utilities for super page(16MB, 1MB, 64KB and 4KB) |
| @@ -199,23 +197,29 @@ extern void omap_iotlb_cr_to_e(struct cr_regs *cr, struct iotlb_entry *e); | |||
| 199 | extern int | 197 | extern int |
| 200 | omap_iopgtable_store_entry(struct omap_iommu *obj, struct iotlb_entry *e); | 198 | omap_iopgtable_store_entry(struct omap_iommu *obj, struct iotlb_entry *e); |
| 201 | 199 | ||
| 202 | extern int omap_iommu_set_isr(const char *name, | ||
| 203 | int (*isr)(struct omap_iommu *obj, u32 da, u32 iommu_errs, | ||
| 204 | void *priv), | ||
| 205 | void *isr_priv); | ||
| 206 | |||
| 207 | extern void omap_iommu_save_ctx(struct device *dev); | 200 | extern void omap_iommu_save_ctx(struct device *dev); |
| 208 | extern void omap_iommu_restore_ctx(struct device *dev); | 201 | extern void omap_iommu_restore_ctx(struct device *dev); |
| 209 | 202 | ||
| 210 | extern int omap_install_iommu_arch(const struct iommu_functions *ops); | ||
| 211 | extern void omap_uninstall_iommu_arch(const struct iommu_functions *ops); | ||
| 212 | |||
| 213 | extern int omap_foreach_iommu_device(void *data, | 203 | extern int omap_foreach_iommu_device(void *data, |
| 214 | int (*fn)(struct device *, void *)); | 204 | int (*fn)(struct device *, void *)); |
| 215 | 205 | ||
| 206 | extern int omap_install_iommu_arch(const struct iommu_functions *ops); | ||
| 207 | extern void omap_uninstall_iommu_arch(const struct iommu_functions *ops); | ||
| 208 | |||
| 216 | extern ssize_t | 209 | extern ssize_t |
| 217 | omap_iommu_dump_ctx(struct omap_iommu *obj, char *buf, ssize_t len); | 210 | omap_iommu_dump_ctx(struct omap_iommu *obj, char *buf, ssize_t len); |
| 218 | extern size_t | 211 | extern size_t |
| 219 | omap_dump_tlb_entries(struct omap_iommu *obj, char *buf, ssize_t len); | 212 | omap_dump_tlb_entries(struct omap_iommu *obj, char *buf, ssize_t len); |
| 220 | 213 | ||
| 221 | #endif /* __MACH_IOMMU_H */ | 214 | /* |
| 215 | * register accessors | ||
| 216 | */ | ||
| 217 | static inline u32 iommu_read_reg(struct omap_iommu *obj, size_t offs) | ||
| 218 | { | ||
| 219 | return __raw_readl(obj->regbase + offs); | ||
| 220 | } | ||
| 221 | |||
| 222 | static inline void iommu_write_reg(struct omap_iommu *obj, u32 val, size_t offs) | ||
| 223 | { | ||
| 224 | __raw_writel(val, obj->regbase + offs); | ||
| 225 | } | ||
diff --git a/arch/arm/mach-omap2/iommu2.c b/drivers/iommu/omap-iommu2.c index eefc37912ef3..d745094a69dd 100644 --- a/arch/arm/mach-omap2/iommu2.c +++ b/drivers/iommu/omap-iommu2.c | |||
| @@ -13,31 +13,21 @@ | |||
| 13 | 13 | ||
| 14 | #include <linux/err.h> | 14 | #include <linux/err.h> |
| 15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
| 16 | #include <linux/io.h> | ||
| 16 | #include <linux/jiffies.h> | 17 | #include <linux/jiffies.h> |
| 17 | #include <linux/module.h> | 18 | #include <linux/module.h> |
| 19 | #include <linux/omap-iommu.h> | ||
| 18 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
| 19 | #include <linux/stringify.h> | 21 | #include <linux/stringify.h> |
| 22 | #include <linux/platform_data/iommu-omap.h> | ||
| 20 | 23 | ||
| 21 | #include <plat/iommu.h> | 24 | #include "omap-iommu.h" |
| 22 | 25 | ||
| 23 | /* | 26 | /* |
| 24 | * omap2 architecture specific register bit definitions | 27 | * omap2 architecture specific register bit definitions |
| 25 | */ | 28 | */ |
| 26 | #define IOMMU_ARCH_VERSION 0x00000011 | 29 | #define IOMMU_ARCH_VERSION 0x00000011 |
| 27 | 30 | ||
| 28 | /* SYSCONF */ | ||
| 29 | #define MMU_SYS_IDLE_SHIFT 3 | ||
| 30 | #define MMU_SYS_IDLE_FORCE (0 << MMU_SYS_IDLE_SHIFT) | ||
| 31 | #define MMU_SYS_IDLE_NONE (1 << MMU_SYS_IDLE_SHIFT) | ||
| 32 | #define MMU_SYS_IDLE_SMART (2 << MMU_SYS_IDLE_SHIFT) | ||
| 33 | #define MMU_SYS_IDLE_MASK (3 << MMU_SYS_IDLE_SHIFT) | ||
| 34 | |||
| 35 | #define MMU_SYS_SOFTRESET (1 << 1) | ||
| 36 | #define MMU_SYS_AUTOIDLE 1 | ||
| 37 | |||
| 38 | /* SYSSTATUS */ | ||
| 39 | #define MMU_SYS_RESETDONE 1 | ||
| 40 | |||
| 41 | /* IRQSTATUS & IRQENABLE */ | 31 | /* IRQSTATUS & IRQENABLE */ |
| 42 | #define MMU_IRQ_MULTIHITFAULT (1 << 4) | 32 | #define MMU_IRQ_MULTIHITFAULT (1 << 4) |
| 43 | #define MMU_IRQ_TABLEWALKFAULT (1 << 3) | 33 | #define MMU_IRQ_TABLEWALKFAULT (1 << 3) |
| @@ -65,6 +55,12 @@ | |||
| 65 | ((pgsz) == MMU_CAM_PGSZ_64K) ? 0xffff0000 : \ | 55 | ((pgsz) == MMU_CAM_PGSZ_64K) ? 0xffff0000 : \ |
| 66 | ((pgsz) == MMU_CAM_PGSZ_4K) ? 0xfffff000 : 0) | 56 | ((pgsz) == MMU_CAM_PGSZ_4K) ? 0xfffff000 : 0) |
| 67 | 57 | ||
| 58 | /* IOMMU errors */ | ||
| 59 | #define OMAP_IOMMU_ERR_TLB_MISS (1 << 0) | ||
| 60 | #define OMAP_IOMMU_ERR_TRANS_FAULT (1 << 1) | ||
| 61 | #define OMAP_IOMMU_ERR_EMU_MISS (1 << 2) | ||
| 62 | #define OMAP_IOMMU_ERR_TBLWALK_FAULT (1 << 3) | ||
| 63 | #define OMAP_IOMMU_ERR_MULTIHIT_FAULT (1 << 4) | ||
| 68 | 64 | ||
| 69 | static void __iommu_set_twl(struct omap_iommu *obj, bool on) | 65 | static void __iommu_set_twl(struct omap_iommu *obj, bool on) |
| 70 | { | 66 | { |
| @@ -88,7 +84,6 @@ static void __iommu_set_twl(struct omap_iommu *obj, bool on) | |||
| 88 | static int omap2_iommu_enable(struct omap_iommu *obj) | 84 | static int omap2_iommu_enable(struct omap_iommu *obj) |
| 89 | { | 85 | { |
| 90 | u32 l, pa; | 86 | u32 l, pa; |
| 91 | unsigned long timeout; | ||
| 92 | 87 | ||
| 93 | if (!obj->iopgd || !IS_ALIGNED((u32)obj->iopgd, SZ_16K)) | 88 | if (!obj->iopgd || !IS_ALIGNED((u32)obj->iopgd, SZ_16K)) |
| 94 | return -EINVAL; | 89 | return -EINVAL; |
| @@ -97,29 +92,10 @@ static int omap2_iommu_enable(struct omap_iommu *obj) | |||
| 97 | if (!IS_ALIGNED(pa, SZ_16K)) | 92 | if (!IS_ALIGNED(pa, SZ_16K)) |
| 98 | return -EINVAL; | 93 | return -EINVAL; |
| 99 | 94 | ||
| 100 | iommu_write_reg(obj, MMU_SYS_SOFTRESET, MMU_SYSCONFIG); | ||
| 101 | |||
| 102 | timeout = jiffies + msecs_to_jiffies(20); | ||
| 103 | do { | ||
| 104 | l = iommu_read_reg(obj, MMU_SYSSTATUS); | ||
| 105 | if (l & MMU_SYS_RESETDONE) | ||
| 106 | break; | ||
| 107 | } while (!time_after(jiffies, timeout)); | ||
| 108 | |||
| 109 | if (!(l & MMU_SYS_RESETDONE)) { | ||
| 110 | dev_err(obj->dev, "can't take mmu out of reset\n"); | ||
| 111 | return -ENODEV; | ||
| 112 | } | ||
| 113 | |||
| 114 | l = iommu_read_reg(obj, MMU_REVISION); | 95 | l = iommu_read_reg(obj, MMU_REVISION); |
| 115 | dev_info(obj->dev, "%s: version %d.%d\n", obj->name, | 96 | dev_info(obj->dev, "%s: version %d.%d\n", obj->name, |
| 116 | (l >> 4) & 0xf, l & 0xf); | 97 | (l >> 4) & 0xf, l & 0xf); |
| 117 | 98 | ||
| 118 | l = iommu_read_reg(obj, MMU_SYSCONFIG); | ||
| 119 | l &= ~MMU_SYS_IDLE_MASK; | ||
| 120 | l |= (MMU_SYS_IDLE_SMART | MMU_SYS_AUTOIDLE); | ||
| 121 | iommu_write_reg(obj, l, MMU_SYSCONFIG); | ||
| 122 | |||
| 123 | iommu_write_reg(obj, pa, MMU_TTB); | 99 | iommu_write_reg(obj, pa, MMU_TTB); |
| 124 | 100 | ||
| 125 | __iommu_set_twl(obj, true); | 101 | __iommu_set_twl(obj, true); |
| @@ -133,7 +109,6 @@ static void omap2_iommu_disable(struct omap_iommu *obj) | |||
| 133 | 109 | ||
| 134 | l &= ~MMU_CNTL_MASK; | 110 | l &= ~MMU_CNTL_MASK; |
| 135 | iommu_write_reg(obj, l, MMU_CNTL); | 111 | iommu_write_reg(obj, l, MMU_CNTL); |
| 136 | iommu_write_reg(obj, MMU_SYS_IDLE_FORCE, MMU_SYSCONFIG); | ||
| 137 | 112 | ||
| 138 | dev_dbg(obj->dev, "%s is shutting down\n", obj->name); | 113 | dev_dbg(obj->dev, "%s is shutting down\n", obj->name); |
| 139 | } | 114 | } |
| @@ -262,8 +237,6 @@ omap2_iommu_dump_ctx(struct omap_iommu *obj, char *buf, ssize_t len) | |||
| 262 | char *p = buf; | 237 | char *p = buf; |
| 263 | 238 | ||
| 264 | pr_reg(REVISION); | 239 | pr_reg(REVISION); |
| 265 | pr_reg(SYSCONFIG); | ||
| 266 | pr_reg(SYSSTATUS); | ||
| 267 | pr_reg(IRQSTATUS); | 240 | pr_reg(IRQSTATUS); |
| 268 | pr_reg(IRQENABLE); | 241 | pr_reg(IRQENABLE); |
| 269 | pr_reg(WALKING_ST); | 242 | pr_reg(WALKING_ST); |
diff --git a/arch/arm/plat-omap/include/plat/iopgtable.h b/drivers/iommu/omap-iopgtable.h index 66a813977d52..cd4ae9e5b0c6 100644 --- a/arch/arm/plat-omap/include/plat/iopgtable.h +++ b/drivers/iommu/omap-iopgtable.h | |||
| @@ -10,9 +10,6 @@ | |||
| 10 | * published by the Free Software Foundation. | 10 | * published by the Free Software Foundation. |
| 11 | */ | 11 | */ |
| 12 | 12 | ||
| 13 | #ifndef __PLAT_OMAP_IOMMU_H | ||
| 14 | #define __PLAT_OMAP_IOMMU_H | ||
| 15 | |||
| 16 | /* | 13 | /* |
| 17 | * "L2 table" address mask and size definitions. | 14 | * "L2 table" address mask and size definitions. |
| 18 | */ | 15 | */ |
| @@ -97,24 +94,5 @@ static inline phys_addr_t omap_iommu_translate(u32 d, u32 va, u32 mask) | |||
| 97 | #define iopte_index(da) (((da) >> IOPTE_SHIFT) & (PTRS_PER_IOPTE - 1)) | 94 | #define iopte_index(da) (((da) >> IOPTE_SHIFT) & (PTRS_PER_IOPTE - 1)) |
| 98 | #define iopte_offset(iopgd, da) (iopgd_page_vaddr(iopgd) + iopte_index(da)) | 95 | #define iopte_offset(iopgd, da) (iopgd_page_vaddr(iopgd) + iopte_index(da)) |
| 99 | 96 | ||
| 100 | static inline u32 iotlb_init_entry(struct iotlb_entry *e, u32 da, u32 pa, | ||
| 101 | u32 flags) | ||
| 102 | { | ||
| 103 | memset(e, 0, sizeof(*e)); | ||
| 104 | |||
| 105 | e->da = da; | ||
| 106 | e->pa = pa; | ||
| 107 | e->valid = 1; | ||
| 108 | /* FIXME: add OMAP1 support */ | ||
| 109 | e->pgsz = flags & MMU_CAM_PGSZ_MASK; | ||
| 110 | e->endian = flags & MMU_RAM_ENDIAN_MASK; | ||
| 111 | e->elsz = flags & MMU_RAM_ELSZ_MASK; | ||
| 112 | e->mixed = flags & MMU_RAM_MIXED_MASK; | ||
| 113 | |||
| 114 | return iopgsz_to_bytes(e->pgsz); | ||
| 115 | } | ||
| 116 | |||
| 117 | #define to_iommu(dev) \ | 97 | #define to_iommu(dev) \ |
| 118 | (struct omap_iommu *)platform_get_drvdata(to_platform_device(dev)) | 98 | (struct omap_iommu *)platform_get_drvdata(to_platform_device(dev)) |
| 119 | |||
| 120 | #endif /* __PLAT_OMAP_IOMMU_H */ | ||
diff --git a/drivers/iommu/omap-iovmm.c b/drivers/iommu/omap-iovmm.c index 2e10c3e0a7ae..46d875690739 100644 --- a/drivers/iommu/omap-iovmm.c +++ b/drivers/iommu/omap-iovmm.c | |||
| @@ -17,14 +17,58 @@ | |||
| 17 | #include <linux/device.h> | 17 | #include <linux/device.h> |
| 18 | #include <linux/scatterlist.h> | 18 | #include <linux/scatterlist.h> |
| 19 | #include <linux/iommu.h> | 19 | #include <linux/iommu.h> |
| 20 | #include <linux/omap-iommu.h> | ||
| 21 | #include <linux/platform_data/iommu-omap.h> | ||
| 20 | 22 | ||
| 21 | #include <asm/cacheflush.h> | 23 | #include <asm/cacheflush.h> |
| 22 | #include <asm/mach/map.h> | 24 | #include <asm/mach/map.h> |
| 23 | 25 | ||
| 24 | #include <plat/iommu.h> | 26 | #include "omap-iopgtable.h" |
| 25 | #include <plat/iovmm.h> | 27 | #include "omap-iommu.h" |
| 26 | 28 | ||
| 27 | #include <plat/iopgtable.h> | 29 | /* |
| 30 | * IOVMF_FLAGS: attribute for iommu virtual memory area(iovma) | ||
| 31 | * | ||
| 32 | * lower 16 bit is used for h/w and upper 16 bit is for s/w. | ||
| 33 | */ | ||
| 34 | #define IOVMF_SW_SHIFT 16 | ||
| 35 | |||
| 36 | /* | ||
| 37 | * iovma: h/w flags derived from cam and ram attribute | ||
| 38 | */ | ||
| 39 | #define IOVMF_CAM_MASK (~((1 << 10) - 1)) | ||
| 40 | #define IOVMF_RAM_MASK (~IOVMF_CAM_MASK) | ||
| 41 | |||
| 42 | #define IOVMF_PGSZ_MASK (3 << 0) | ||
| 43 | #define IOVMF_PGSZ_1M MMU_CAM_PGSZ_1M | ||
| 44 | #define IOVMF_PGSZ_64K MMU_CAM_PGSZ_64K | ||
| 45 | #define IOVMF_PGSZ_4K MMU_CAM_PGSZ_4K | ||
| 46 | #define IOVMF_PGSZ_16M MMU_CAM_PGSZ_16M | ||
| 47 | |||
| 48 | #define IOVMF_ENDIAN_MASK (1 << 9) | ||
| 49 | #define IOVMF_ENDIAN_BIG MMU_RAM_ENDIAN_BIG | ||
| 50 | |||
| 51 | #define IOVMF_ELSZ_MASK (3 << 7) | ||
| 52 | #define IOVMF_ELSZ_16 MMU_RAM_ELSZ_16 | ||
| 53 | #define IOVMF_ELSZ_32 MMU_RAM_ELSZ_32 | ||
| 54 | #define IOVMF_ELSZ_NONE MMU_RAM_ELSZ_NONE | ||
| 55 | |||
| 56 | #define IOVMF_MIXED_MASK (1 << 6) | ||
| 57 | #define IOVMF_MIXED MMU_RAM_MIXED | ||
| 58 | |||
| 59 | /* | ||
| 60 | * iovma: s/w flags, used for mapping and umapping internally. | ||
| 61 | */ | ||
| 62 | #define IOVMF_MMIO (1 << IOVMF_SW_SHIFT) | ||
| 63 | #define IOVMF_ALLOC (2 << IOVMF_SW_SHIFT) | ||
| 64 | #define IOVMF_ALLOC_MASK (3 << IOVMF_SW_SHIFT) | ||
| 65 | |||
| 66 | /* "superpages" is supported just with physically linear pages */ | ||
| 67 | #define IOVMF_DISCONT (1 << (2 + IOVMF_SW_SHIFT)) | ||
| 68 | #define IOVMF_LINEAR (2 << (2 + IOVMF_SW_SHIFT)) | ||
| 69 | #define IOVMF_LINEAR_MASK (3 << (2 + IOVMF_SW_SHIFT)) | ||
| 70 | |||
| 71 | #define IOVMF_DA_FIXED (1 << (4 + IOVMF_SW_SHIFT)) | ||
| 28 | 72 | ||
| 29 | static struct kmem_cache *iovm_area_cachep; | 73 | static struct kmem_cache *iovm_area_cachep; |
| 30 | 74 | ||
diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c index c16e8fc8a4bd..4c9db62814ff 100644 --- a/drivers/iommu/tegra-gart.c +++ b/drivers/iommu/tegra-gart.c | |||
| @@ -398,6 +398,7 @@ static int tegra_gart_probe(struct platform_device *pdev) | |||
| 398 | do_gart_setup(gart, NULL); | 398 | do_gart_setup(gart, NULL); |
| 399 | 399 | ||
| 400 | gart_handle = gart; | 400 | gart_handle = gart; |
| 401 | bus_set_iommu(&platform_bus_type, &gart_iommu_ops); | ||
| 401 | return 0; | 402 | return 0; |
| 402 | 403 | ||
| 403 | fail: | 404 | fail: |
| @@ -450,7 +451,6 @@ static struct platform_driver tegra_gart_driver = { | |||
| 450 | 451 | ||
| 451 | static int __devinit tegra_gart_init(void) | 452 | static int __devinit tegra_gart_init(void) |
| 452 | { | 453 | { |
| 453 | bus_set_iommu(&platform_bus_type, &gart_iommu_ops); | ||
| 454 | return platform_driver_register(&tegra_gart_driver); | 454 | return platform_driver_register(&tegra_gart_driver); |
| 455 | } | 455 | } |
| 456 | 456 | ||
diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c index a649f146d17b..843123acbb8d 100644 --- a/drivers/iommu/tegra-smmu.c +++ b/drivers/iommu/tegra-smmu.c | |||
| @@ -696,10 +696,8 @@ static void __smmu_iommu_unmap(struct smmu_as *as, dma_addr_t iova) | |||
| 696 | *pte = _PTE_VACANT(iova); | 696 | *pte = _PTE_VACANT(iova); |
| 697 | FLUSH_CPU_DCACHE(pte, page, sizeof(*pte)); | 697 | FLUSH_CPU_DCACHE(pte, page, sizeof(*pte)); |
| 698 | flush_ptc_and_tlb(as->smmu, as, iova, pte, page, 0); | 698 | flush_ptc_and_tlb(as->smmu, as, iova, pte, page, 0); |
| 699 | if (!--(*count)) { | 699 | if (!--(*count)) |
| 700 | free_ptbl(as, iova); | 700 | free_ptbl(as, iova); |
| 701 | smmu_flush_regs(as->smmu, 0); | ||
| 702 | } | ||
| 703 | } | 701 | } |
| 704 | 702 | ||
| 705 | static void __smmu_iommu_map_pfn(struct smmu_as *as, dma_addr_t iova, | 703 | static void __smmu_iommu_map_pfn(struct smmu_as *as, dma_addr_t iova, |
| @@ -1054,6 +1052,7 @@ static int smmu_debugfs_stats_show(struct seq_file *s, void *v) | |||
| 1054 | stats[i], val, offs); | 1052 | stats[i], val, offs); |
| 1055 | } | 1053 | } |
| 1056 | seq_printf(s, "\n"); | 1054 | seq_printf(s, "\n"); |
| 1055 | dput(dent); | ||
| 1057 | 1056 | ||
| 1058 | return 0; | 1057 | return 0; |
| 1059 | } | 1058 | } |
| @@ -1233,6 +1232,7 @@ static int tegra_smmu_probe(struct platform_device *pdev) | |||
| 1233 | 1232 | ||
| 1234 | smmu_debugfs_create(smmu); | 1233 | smmu_debugfs_create(smmu); |
| 1235 | smmu_handle = smmu; | 1234 | smmu_handle = smmu; |
| 1235 | bus_set_iommu(&platform_bus_type, &smmu_iommu_ops); | ||
| 1236 | return 0; | 1236 | return 0; |
| 1237 | } | 1237 | } |
| 1238 | 1238 | ||
| @@ -1277,7 +1277,6 @@ static struct platform_driver tegra_smmu_driver = { | |||
| 1277 | 1277 | ||
| 1278 | static int __devinit tegra_smmu_init(void) | 1278 | static int __devinit tegra_smmu_init(void) |
| 1279 | { | 1279 | { |
| 1280 | bus_set_iommu(&platform_bus_type, &smmu_iommu_ops); | ||
| 1281 | return platform_driver_register(&tegra_smmu_driver); | 1280 | return platform_driver_register(&tegra_smmu_driver); |
| 1282 | } | 1281 | } |
| 1283 | 1282 | ||
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 02db9183ca01..77e6eff41cae 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
| @@ -740,8 +740,14 @@ static void rq_completed(struct mapped_device *md, int rw, int run_queue) | |||
| 740 | if (!md_in_flight(md)) | 740 | if (!md_in_flight(md)) |
| 741 | wake_up(&md->wait); | 741 | wake_up(&md->wait); |
| 742 | 742 | ||
| 743 | /* | ||
| 744 | * Run this off this callpath, as drivers could invoke end_io while | ||
| 745 | * inside their request_fn (and holding the queue lock). Calling | ||
| 746 | * back into ->request_fn() could deadlock attempting to grab the | ||
| 747 | * queue lock again. | ||
| 748 | */ | ||
| 743 | if (run_queue) | 749 | if (run_queue) |
| 744 | blk_run_queue(md->queue); | 750 | blk_run_queue_async(md->queue); |
| 745 | 751 | ||
| 746 | /* | 752 | /* |
| 747 | * dm_put() must be at the end of this function. See the comment above | 753 | * dm_put() must be at the end of this function. See the comment above |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 9ab768acfb62..61200717687b 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -1817,10 +1817,10 @@ retry: | |||
| 1817 | memset(bbp, 0xff, PAGE_SIZE); | 1817 | memset(bbp, 0xff, PAGE_SIZE); |
| 1818 | 1818 | ||
| 1819 | for (i = 0 ; i < bb->count ; i++) { | 1819 | for (i = 0 ; i < bb->count ; i++) { |
| 1820 | u64 internal_bb = *p++; | 1820 | u64 internal_bb = p[i]; |
| 1821 | u64 store_bb = ((BB_OFFSET(internal_bb) << 10) | 1821 | u64 store_bb = ((BB_OFFSET(internal_bb) << 10) |
| 1822 | | BB_LEN(internal_bb)); | 1822 | | BB_LEN(internal_bb)); |
| 1823 | *bbp++ = cpu_to_le64(store_bb); | 1823 | bbp[i] = cpu_to_le64(store_bb); |
| 1824 | } | 1824 | } |
| 1825 | bb->changed = 0; | 1825 | bb->changed = 0; |
| 1826 | if (read_seqretry(&bb->lock, seq)) | 1826 | if (read_seqretry(&bb->lock, seq)) |
| @@ -5294,7 +5294,7 @@ void md_stop_writes(struct mddev *mddev) | |||
| 5294 | } | 5294 | } |
| 5295 | EXPORT_SYMBOL_GPL(md_stop_writes); | 5295 | EXPORT_SYMBOL_GPL(md_stop_writes); |
| 5296 | 5296 | ||
| 5297 | void md_stop(struct mddev *mddev) | 5297 | static void __md_stop(struct mddev *mddev) |
| 5298 | { | 5298 | { |
| 5299 | mddev->ready = 0; | 5299 | mddev->ready = 0; |
| 5300 | mddev->pers->stop(mddev); | 5300 | mddev->pers->stop(mddev); |
| @@ -5304,6 +5304,18 @@ void md_stop(struct mddev *mddev) | |||
| 5304 | mddev->pers = NULL; | 5304 | mddev->pers = NULL; |
| 5305 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); | 5305 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
| 5306 | } | 5306 | } |
| 5307 | |||
| 5308 | void md_stop(struct mddev *mddev) | ||
| 5309 | { | ||
| 5310 | /* stop the array and free an attached data structures. | ||
| 5311 | * This is called from dm-raid | ||
| 5312 | */ | ||
| 5313 | __md_stop(mddev); | ||
| 5314 | bitmap_destroy(mddev); | ||
| 5315 | if (mddev->bio_set) | ||
| 5316 | bioset_free(mddev->bio_set); | ||
| 5317 | } | ||
| 5318 | |||
| 5307 | EXPORT_SYMBOL_GPL(md_stop); | 5319 | EXPORT_SYMBOL_GPL(md_stop); |
| 5308 | 5320 | ||
| 5309 | static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) | 5321 | static int md_set_readonly(struct mddev *mddev, struct block_device *bdev) |
| @@ -5364,7 +5376,7 @@ static int do_md_stop(struct mddev * mddev, int mode, | |||
| 5364 | set_disk_ro(disk, 0); | 5376 | set_disk_ro(disk, 0); |
| 5365 | 5377 | ||
| 5366 | __md_stop_writes(mddev); | 5378 | __md_stop_writes(mddev); |
| 5367 | md_stop(mddev); | 5379 | __md_stop(mddev); |
| 5368 | mddev->queue->merge_bvec_fn = NULL; | 5380 | mddev->queue->merge_bvec_fn = NULL; |
| 5369 | mddev->queue->backing_dev_info.congested_fn = NULL; | 5381 | mddev->queue->backing_dev_info.congested_fn = NULL; |
| 5370 | 5382 | ||
| @@ -7936,9 +7948,9 @@ int md_is_badblock(struct badblocks *bb, sector_t s, int sectors, | |||
| 7936 | sector_t *first_bad, int *bad_sectors) | 7948 | sector_t *first_bad, int *bad_sectors) |
| 7937 | { | 7949 | { |
| 7938 | int hi; | 7950 | int hi; |
| 7939 | int lo = 0; | 7951 | int lo; |
| 7940 | u64 *p = bb->page; | 7952 | u64 *p = bb->page; |
| 7941 | int rv = 0; | 7953 | int rv; |
| 7942 | sector_t target = s + sectors; | 7954 | sector_t target = s + sectors; |
| 7943 | unsigned seq; | 7955 | unsigned seq; |
| 7944 | 7956 | ||
| @@ -7953,7 +7965,8 @@ int md_is_badblock(struct badblocks *bb, sector_t s, int sectors, | |||
| 7953 | 7965 | ||
| 7954 | retry: | 7966 | retry: |
| 7955 | seq = read_seqbegin(&bb->lock); | 7967 | seq = read_seqbegin(&bb->lock); |
| 7956 | 7968 | lo = 0; | |
| 7969 | rv = 0; | ||
| 7957 | hi = bb->count; | 7970 | hi = bb->count; |
| 7958 | 7971 | ||
| 7959 | /* Binary search between lo and hi for 'target' | 7972 | /* Binary search between lo and hi for 'target' |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 636bae0405e8..a0f73092176e 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
| @@ -963,7 +963,7 @@ static void raid1_unplug(struct blk_plug_cb *cb, bool from_schedule) | |||
| 963 | struct r1conf *conf = mddev->private; | 963 | struct r1conf *conf = mddev->private; |
| 964 | struct bio *bio; | 964 | struct bio *bio; |
| 965 | 965 | ||
| 966 | if (from_schedule) { | 966 | if (from_schedule || current->bio_list) { |
| 967 | spin_lock_irq(&conf->device_lock); | 967 | spin_lock_irq(&conf->device_lock); |
| 968 | bio_list_merge(&conf->pending_bio_list, &plug->pending); | 968 | bio_list_merge(&conf->pending_bio_list, &plug->pending); |
| 969 | conf->pending_count += plug->pending_cnt; | 969 | conf->pending_count += plug->pending_cnt; |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index d1295aff4173..c9acbd717131 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -499,7 +499,7 @@ static void raid10_end_write_request(struct bio *bio, int error) | |||
| 499 | */ | 499 | */ |
| 500 | one_write_done(r10_bio); | 500 | one_write_done(r10_bio); |
| 501 | if (dec_rdev) | 501 | if (dec_rdev) |
| 502 | rdev_dec_pending(conf->mirrors[dev].rdev, conf->mddev); | 502 | rdev_dec_pending(rdev, conf->mddev); |
| 503 | } | 503 | } |
| 504 | 504 | ||
| 505 | /* | 505 | /* |
| @@ -1069,7 +1069,7 @@ static void raid10_unplug(struct blk_plug_cb *cb, bool from_schedule) | |||
| 1069 | struct r10conf *conf = mddev->private; | 1069 | struct r10conf *conf = mddev->private; |
| 1070 | struct bio *bio; | 1070 | struct bio *bio; |
| 1071 | 1071 | ||
| 1072 | if (from_schedule) { | 1072 | if (from_schedule || current->bio_list) { |
| 1073 | spin_lock_irq(&conf->device_lock); | 1073 | spin_lock_irq(&conf->device_lock); |
| 1074 | bio_list_merge(&conf->pending_bio_list, &plug->pending); | 1074 | bio_list_merge(&conf->pending_bio_list, &plug->pending); |
| 1075 | conf->pending_count += plug->pending_cnt; | 1075 | conf->pending_count += plug->pending_cnt; |
| @@ -1334,18 +1334,21 @@ retry_write: | |||
| 1334 | blocked_rdev = rrdev; | 1334 | blocked_rdev = rrdev; |
| 1335 | break; | 1335 | break; |
| 1336 | } | 1336 | } |
| 1337 | if (rdev && (test_bit(Faulty, &rdev->flags) | ||
| 1338 | || test_bit(Unmerged, &rdev->flags))) | ||
| 1339 | rdev = NULL; | ||
| 1337 | if (rrdev && (test_bit(Faulty, &rrdev->flags) | 1340 | if (rrdev && (test_bit(Faulty, &rrdev->flags) |
| 1338 | || test_bit(Unmerged, &rrdev->flags))) | 1341 | || test_bit(Unmerged, &rrdev->flags))) |
| 1339 | rrdev = NULL; | 1342 | rrdev = NULL; |
| 1340 | 1343 | ||
| 1341 | r10_bio->devs[i].bio = NULL; | 1344 | r10_bio->devs[i].bio = NULL; |
| 1342 | r10_bio->devs[i].repl_bio = NULL; | 1345 | r10_bio->devs[i].repl_bio = NULL; |
| 1343 | if (!rdev || test_bit(Faulty, &rdev->flags) || | 1346 | |
| 1344 | test_bit(Unmerged, &rdev->flags)) { | 1347 | if (!rdev && !rrdev) { |
| 1345 | set_bit(R10BIO_Degraded, &r10_bio->state); | 1348 | set_bit(R10BIO_Degraded, &r10_bio->state); |
| 1346 | continue; | 1349 | continue; |
| 1347 | } | 1350 | } |
| 1348 | if (test_bit(WriteErrorSeen, &rdev->flags)) { | 1351 | if (rdev && test_bit(WriteErrorSeen, &rdev->flags)) { |
| 1349 | sector_t first_bad; | 1352 | sector_t first_bad; |
| 1350 | sector_t dev_sector = r10_bio->devs[i].addr; | 1353 | sector_t dev_sector = r10_bio->devs[i].addr; |
| 1351 | int bad_sectors; | 1354 | int bad_sectors; |
| @@ -1387,8 +1390,10 @@ retry_write: | |||
| 1387 | max_sectors = good_sectors; | 1390 | max_sectors = good_sectors; |
| 1388 | } | 1391 | } |
| 1389 | } | 1392 | } |
| 1390 | r10_bio->devs[i].bio = bio; | 1393 | if (rdev) { |
| 1391 | atomic_inc(&rdev->nr_pending); | 1394 | r10_bio->devs[i].bio = bio; |
| 1395 | atomic_inc(&rdev->nr_pending); | ||
| 1396 | } | ||
| 1392 | if (rrdev) { | 1397 | if (rrdev) { |
| 1393 | r10_bio->devs[i].repl_bio = bio; | 1398 | r10_bio->devs[i].repl_bio = bio; |
| 1394 | atomic_inc(&rrdev->nr_pending); | 1399 | atomic_inc(&rrdev->nr_pending); |
| @@ -1444,69 +1449,71 @@ retry_write: | |||
| 1444 | for (i = 0; i < conf->copies; i++) { | 1449 | for (i = 0; i < conf->copies; i++) { |
| 1445 | struct bio *mbio; | 1450 | struct bio *mbio; |
| 1446 | int d = r10_bio->devs[i].devnum; | 1451 | int d = r10_bio->devs[i].devnum; |
| 1447 | if (!r10_bio->devs[i].bio) | 1452 | if (r10_bio->devs[i].bio) { |
| 1448 | continue; | 1453 | struct md_rdev *rdev = conf->mirrors[d].rdev; |
| 1454 | mbio = bio_clone_mddev(bio, GFP_NOIO, mddev); | ||
| 1455 | md_trim_bio(mbio, r10_bio->sector - bio->bi_sector, | ||
| 1456 | max_sectors); | ||
| 1457 | r10_bio->devs[i].bio = mbio; | ||
| 1458 | |||
| 1459 | mbio->bi_sector = (r10_bio->devs[i].addr+ | ||
| 1460 | choose_data_offset(r10_bio, | ||
| 1461 | rdev)); | ||
| 1462 | mbio->bi_bdev = rdev->bdev; | ||
| 1463 | mbio->bi_end_io = raid10_end_write_request; | ||
| 1464 | mbio->bi_rw = WRITE | do_sync | do_fua | do_discard; | ||
| 1465 | mbio->bi_private = r10_bio; | ||
| 1449 | 1466 | ||
| 1450 | mbio = bio_clone_mddev(bio, GFP_NOIO, mddev); | 1467 | atomic_inc(&r10_bio->remaining); |
| 1451 | md_trim_bio(mbio, r10_bio->sector - bio->bi_sector, | ||
| 1452 | max_sectors); | ||
| 1453 | r10_bio->devs[i].bio = mbio; | ||
| 1454 | 1468 | ||
| 1455 | mbio->bi_sector = (r10_bio->devs[i].addr+ | 1469 | cb = blk_check_plugged(raid10_unplug, mddev, |
| 1456 | choose_data_offset(r10_bio, | 1470 | sizeof(*plug)); |
| 1457 | conf->mirrors[d].rdev)); | 1471 | if (cb) |
| 1458 | mbio->bi_bdev = conf->mirrors[d].rdev->bdev; | 1472 | plug = container_of(cb, struct raid10_plug_cb, |
| 1459 | mbio->bi_end_io = raid10_end_write_request; | 1473 | cb); |
| 1460 | mbio->bi_rw = WRITE | do_sync | do_fua | do_discard; | 1474 | else |
| 1461 | mbio->bi_private = r10_bio; | 1475 | plug = NULL; |
| 1476 | spin_lock_irqsave(&conf->device_lock, flags); | ||
| 1477 | if (plug) { | ||
| 1478 | bio_list_add(&plug->pending, mbio); | ||
| 1479 | plug->pending_cnt++; | ||
| 1480 | } else { | ||
| 1481 | bio_list_add(&conf->pending_bio_list, mbio); | ||
| 1482 | conf->pending_count++; | ||
| 1483 | } | ||
| 1484 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 1485 | if (!plug) | ||
| 1486 | md_wakeup_thread(mddev->thread); | ||
| 1487 | } | ||
| 1462 | 1488 | ||
| 1463 | atomic_inc(&r10_bio->remaining); | 1489 | if (r10_bio->devs[i].repl_bio) { |
| 1490 | struct md_rdev *rdev = conf->mirrors[d].replacement; | ||
| 1491 | if (rdev == NULL) { | ||
| 1492 | /* Replacement just got moved to main 'rdev' */ | ||
| 1493 | smp_mb(); | ||
| 1494 | rdev = conf->mirrors[d].rdev; | ||
| 1495 | } | ||
| 1496 | mbio = bio_clone_mddev(bio, GFP_NOIO, mddev); | ||
| 1497 | md_trim_bio(mbio, r10_bio->sector - bio->bi_sector, | ||
| 1498 | max_sectors); | ||
| 1499 | r10_bio->devs[i].repl_bio = mbio; | ||
| 1500 | |||
| 1501 | mbio->bi_sector = (r10_bio->devs[i].addr + | ||
| 1502 | choose_data_offset( | ||
| 1503 | r10_bio, rdev)); | ||
| 1504 | mbio->bi_bdev = rdev->bdev; | ||
| 1505 | mbio->bi_end_io = raid10_end_write_request; | ||
| 1506 | mbio->bi_rw = WRITE | do_sync | do_fua | do_discard; | ||
| 1507 | mbio->bi_private = r10_bio; | ||
| 1464 | 1508 | ||
| 1465 | cb = blk_check_plugged(raid10_unplug, mddev, sizeof(*plug)); | 1509 | atomic_inc(&r10_bio->remaining); |
| 1466 | if (cb) | 1510 | spin_lock_irqsave(&conf->device_lock, flags); |
| 1467 | plug = container_of(cb, struct raid10_plug_cb, cb); | ||
| 1468 | else | ||
| 1469 | plug = NULL; | ||
| 1470 | spin_lock_irqsave(&conf->device_lock, flags); | ||
| 1471 | if (plug) { | ||
| 1472 | bio_list_add(&plug->pending, mbio); | ||
| 1473 | plug->pending_cnt++; | ||
| 1474 | } else { | ||
| 1475 | bio_list_add(&conf->pending_bio_list, mbio); | 1511 | bio_list_add(&conf->pending_bio_list, mbio); |
| 1476 | conf->pending_count++; | 1512 | conf->pending_count++; |
| 1513 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 1514 | if (!mddev_check_plugged(mddev)) | ||
| 1515 | md_wakeup_thread(mddev->thread); | ||
| 1477 | } | 1516 | } |
| 1478 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 1479 | if (!plug) | ||
| 1480 | md_wakeup_thread(mddev->thread); | ||
| 1481 | |||
| 1482 | if (!r10_bio->devs[i].repl_bio) | ||
| 1483 | continue; | ||
| 1484 | |||
| 1485 | mbio = bio_clone_mddev(bio, GFP_NOIO, mddev); | ||
| 1486 | md_trim_bio(mbio, r10_bio->sector - bio->bi_sector, | ||
| 1487 | max_sectors); | ||
| 1488 | r10_bio->devs[i].repl_bio = mbio; | ||
| 1489 | |||
| 1490 | /* We are actively writing to the original device | ||
| 1491 | * so it cannot disappear, so the replacement cannot | ||
| 1492 | * become NULL here | ||
| 1493 | */ | ||
| 1494 | mbio->bi_sector = (r10_bio->devs[i].addr + | ||
| 1495 | choose_data_offset( | ||
| 1496 | r10_bio, | ||
| 1497 | conf->mirrors[d].replacement)); | ||
| 1498 | mbio->bi_bdev = conf->mirrors[d].replacement->bdev; | ||
| 1499 | mbio->bi_end_io = raid10_end_write_request; | ||
| 1500 | mbio->bi_rw = WRITE | do_sync | do_fua | do_discard; | ||
| 1501 | mbio->bi_private = r10_bio; | ||
| 1502 | |||
| 1503 | atomic_inc(&r10_bio->remaining); | ||
| 1504 | spin_lock_irqsave(&conf->device_lock, flags); | ||
| 1505 | bio_list_add(&conf->pending_bio_list, mbio); | ||
| 1506 | conf->pending_count++; | ||
| 1507 | spin_unlock_irqrestore(&conf->device_lock, flags); | ||
| 1508 | if (!mddev_check_plugged(mddev)) | ||
| 1509 | md_wakeup_thread(mddev->thread); | ||
| 1510 | } | 1517 | } |
| 1511 | 1518 | ||
| 1512 | /* Don't remove the bias on 'remaining' (one_write_done) until | 1519 | /* Don't remove the bias on 'remaining' (one_write_done) until |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index c5439dce0295..a4502686e7a8 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -2774,10 +2774,12 @@ static void handle_stripe_clean_event(struct r5conf *conf, | |||
| 2774 | dev = &sh->dev[i]; | 2774 | dev = &sh->dev[i]; |
| 2775 | if (!test_bit(R5_LOCKED, &dev->flags) && | 2775 | if (!test_bit(R5_LOCKED, &dev->flags) && |
| 2776 | (test_bit(R5_UPTODATE, &dev->flags) || | 2776 | (test_bit(R5_UPTODATE, &dev->flags) || |
| 2777 | test_and_clear_bit(R5_Discard, &dev->flags))) { | 2777 | test_bit(R5_Discard, &dev->flags))) { |
| 2778 | /* We can return any write requests */ | 2778 | /* We can return any write requests */ |
| 2779 | struct bio *wbi, *wbi2; | 2779 | struct bio *wbi, *wbi2; |
| 2780 | pr_debug("Return write for disc %d\n", i); | 2780 | pr_debug("Return write for disc %d\n", i); |
| 2781 | if (test_and_clear_bit(R5_Discard, &dev->flags)) | ||
| 2782 | clear_bit(R5_UPTODATE, &dev->flags); | ||
| 2781 | wbi = dev->written; | 2783 | wbi = dev->written; |
| 2782 | dev->written = NULL; | 2784 | dev->written = NULL; |
| 2783 | while (wbi && wbi->bi_sector < | 2785 | while (wbi && wbi->bi_sector < |
| @@ -2795,7 +2797,8 @@ static void handle_stripe_clean_event(struct r5conf *conf, | |||
| 2795 | !test_bit(STRIPE_DEGRADED, &sh->state), | 2797 | !test_bit(STRIPE_DEGRADED, &sh->state), |
| 2796 | 0); | 2798 | 0); |
| 2797 | } | 2799 | } |
| 2798 | } | 2800 | } else if (test_bit(R5_Discard, &sh->dev[i].flags)) |
| 2801 | clear_bit(R5_Discard, &sh->dev[i].flags); | ||
| 2799 | 2802 | ||
| 2800 | if (test_and_clear_bit(STRIPE_FULL_WRITE, &sh->state)) | 2803 | if (test_and_clear_bit(STRIPE_FULL_WRITE, &sh->state)) |
| 2801 | if (atomic_dec_and_test(&conf->pending_full_writes)) | 2804 | if (atomic_dec_and_test(&conf->pending_full_writes)) |
| @@ -3490,40 +3493,6 @@ static void handle_stripe(struct stripe_head *sh) | |||
| 3490 | handle_failed_sync(conf, sh, &s); | 3493 | handle_failed_sync(conf, sh, &s); |
| 3491 | } | 3494 | } |
| 3492 | 3495 | ||
| 3493 | /* | ||
| 3494 | * might be able to return some write requests if the parity blocks | ||
| 3495 | * are safe, or on a failed drive | ||
| 3496 | */ | ||
| 3497 | pdev = &sh->dev[sh->pd_idx]; | ||
| 3498 | s.p_failed = (s.failed >= 1 && s.failed_num[0] == sh->pd_idx) | ||
| 3499 | || (s.failed >= 2 && s.failed_num[1] == sh->pd_idx); | ||
| 3500 | qdev = &sh->dev[sh->qd_idx]; | ||
| 3501 | s.q_failed = (s.failed >= 1 && s.failed_num[0] == sh->qd_idx) | ||
| 3502 | || (s.failed >= 2 && s.failed_num[1] == sh->qd_idx) | ||
| 3503 | || conf->level < 6; | ||
| 3504 | |||
| 3505 | if (s.written && | ||
| 3506 | (s.p_failed || ((test_bit(R5_Insync, &pdev->flags) | ||
| 3507 | && !test_bit(R5_LOCKED, &pdev->flags) | ||
| 3508 | && (test_bit(R5_UPTODATE, &pdev->flags) || | ||
| 3509 | test_bit(R5_Discard, &pdev->flags))))) && | ||
| 3510 | (s.q_failed || ((test_bit(R5_Insync, &qdev->flags) | ||
| 3511 | && !test_bit(R5_LOCKED, &qdev->flags) | ||
| 3512 | && (test_bit(R5_UPTODATE, &qdev->flags) || | ||
| 3513 | test_bit(R5_Discard, &qdev->flags)))))) | ||
| 3514 | handle_stripe_clean_event(conf, sh, disks, &s.return_bi); | ||
| 3515 | |||
| 3516 | /* Now we might consider reading some blocks, either to check/generate | ||
| 3517 | * parity, or to satisfy requests | ||
| 3518 | * or to load a block that is being partially written. | ||
| 3519 | */ | ||
| 3520 | if (s.to_read || s.non_overwrite | ||
| 3521 | || (conf->level == 6 && s.to_write && s.failed) | ||
| 3522 | || (s.syncing && (s.uptodate + s.compute < disks)) | ||
| 3523 | || s.replacing | ||
| 3524 | || s.expanding) | ||
| 3525 | handle_stripe_fill(sh, &s, disks); | ||
| 3526 | |||
| 3527 | /* Now we check to see if any write operations have recently | 3496 | /* Now we check to see if any write operations have recently |
| 3528 | * completed | 3497 | * completed |
| 3529 | */ | 3498 | */ |
| @@ -3561,6 +3530,40 @@ static void handle_stripe(struct stripe_head *sh) | |||
| 3561 | s.dec_preread_active = 1; | 3530 | s.dec_preread_active = 1; |
| 3562 | } | 3531 | } |
| 3563 | 3532 | ||
| 3533 | /* | ||
| 3534 | * might be able to return some write requests if the parity blocks | ||
| 3535 | * are safe, or on a failed drive | ||
| 3536 | */ | ||
| 3537 | pdev = &sh->dev[sh->pd_idx]; | ||
| 3538 | s.p_failed = (s.failed >= 1 && s.failed_num[0] == sh->pd_idx) | ||
| 3539 | || (s.failed >= 2 && s.failed_num[1] == sh->pd_idx); | ||
| 3540 | qdev = &sh->dev[sh->qd_idx]; | ||
| 3541 | s.q_failed = (s.failed >= 1 && s.failed_num[0] == sh->qd_idx) | ||
| 3542 | || (s.failed >= 2 && s.failed_num[1] == sh->qd_idx) | ||
| 3543 | || conf->level < 6; | ||
| 3544 | |||
| 3545 | if (s.written && | ||
| 3546 | (s.p_failed || ((test_bit(R5_Insync, &pdev->flags) | ||
| 3547 | && !test_bit(R5_LOCKED, &pdev->flags) | ||
| 3548 | && (test_bit(R5_UPTODATE, &pdev->flags) || | ||
| 3549 | test_bit(R5_Discard, &pdev->flags))))) && | ||
| 3550 | (s.q_failed || ((test_bit(R5_Insync, &qdev->flags) | ||
| 3551 | && !test_bit(R5_LOCKED, &qdev->flags) | ||
| 3552 | && (test_bit(R5_UPTODATE, &qdev->flags) || | ||
| 3553 | test_bit(R5_Discard, &qdev->flags)))))) | ||
| 3554 | handle_stripe_clean_event(conf, sh, disks, &s.return_bi); | ||
| 3555 | |||
| 3556 | /* Now we might consider reading some blocks, either to check/generate | ||
| 3557 | * parity, or to satisfy requests | ||
| 3558 | * or to load a block that is being partially written. | ||
| 3559 | */ | ||
| 3560 | if (s.to_read || s.non_overwrite | ||
| 3561 | || (conf->level == 6 && s.to_write && s.failed) | ||
| 3562 | || (s.syncing && (s.uptodate + s.compute < disks)) | ||
| 3563 | || s.replacing | ||
| 3564 | || s.expanding) | ||
| 3565 | handle_stripe_fill(sh, &s, disks); | ||
| 3566 | |||
| 3564 | /* Now to consider new write requests and what else, if anything | 3567 | /* Now to consider new write requests and what else, if anything |
| 3565 | * should be read. We do not handle new writes when: | 3568 | * should be read. We do not handle new writes when: |
| 3566 | * 1/ A 'write' operation (copy+xor) is already in flight. | 3569 | * 1/ A 'write' operation (copy+xor) is already in flight. |
| @@ -5529,6 +5532,10 @@ static int run(struct mddev *mddev) | |||
| 5529 | * discard data disk but write parity disk | 5532 | * discard data disk but write parity disk |
| 5530 | */ | 5533 | */ |
| 5531 | stripe = stripe * PAGE_SIZE; | 5534 | stripe = stripe * PAGE_SIZE; |
| 5535 | /* Round up to power of 2, as discard handling | ||
| 5536 | * currently assumes that */ | ||
| 5537 | while ((stripe-1) & stripe) | ||
| 5538 | stripe = (stripe | (stripe-1)) + 1; | ||
| 5532 | mddev->queue->limits.discard_alignment = stripe; | 5539 | mddev->queue->limits.discard_alignment = stripe; |
| 5533 | mddev->queue->limits.discard_granularity = stripe; | 5540 | mddev->queue->limits.discard_granularity = stripe; |
| 5534 | /* | 5541 | /* |
diff --git a/drivers/media/dvb-frontends/stv0900_core.c b/drivers/media/dvb-frontends/stv0900_core.c index 262dfa503c2a..b551ca350e00 100644 --- a/drivers/media/dvb-frontends/stv0900_core.c +++ b/drivers/media/dvb-frontends/stv0900_core.c | |||
| @@ -300,15 +300,15 @@ static enum fe_stv0900_error stv0900_set_mclk(struct stv0900_internal *intp, u32 | |||
| 300 | { | 300 | { |
| 301 | u32 m_div, clk_sel; | 301 | u32 m_div, clk_sel; |
| 302 | 302 | ||
| 303 | dprintk("%s: Mclk set to %d, Quartz = %d\n", __func__, mclk, | ||
| 304 | intp->quartz); | ||
| 305 | |||
| 306 | if (intp == NULL) | 303 | if (intp == NULL) |
| 307 | return STV0900_INVALID_HANDLE; | 304 | return STV0900_INVALID_HANDLE; |
| 308 | 305 | ||
| 309 | if (intp->errs) | 306 | if (intp->errs) |
| 310 | return STV0900_I2C_ERROR; | 307 | return STV0900_I2C_ERROR; |
| 311 | 308 | ||
| 309 | dprintk("%s: Mclk set to %d, Quartz = %d\n", __func__, mclk, | ||
| 310 | intp->quartz); | ||
| 311 | |||
| 312 | clk_sel = ((stv0900_get_bits(intp, F0900_SELX1RATIO) == 1) ? 4 : 6); | 312 | clk_sel = ((stv0900_get_bits(intp, F0900_SELX1RATIO) == 1) ? 4 : 6); |
| 313 | m_div = ((clk_sel * mclk) / intp->quartz) - 1; | 313 | m_div = ((clk_sel * mclk) / intp->quartz) - 1; |
| 314 | stv0900_write_bits(intp, F0900_M_DIV, m_div); | 314 | stv0900_write_bits(intp, F0900_M_DIV, m_div); |
diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c index 109bc9b12e74..05f8950f6f91 100644 --- a/drivers/media/i2c/adv7604.c +++ b/drivers/media/i2c/adv7604.c | |||
| @@ -53,8 +53,7 @@ MODULE_LICENSE("GPL"); | |||
| 53 | /* ADV7604 system clock frequency */ | 53 | /* ADV7604 system clock frequency */ |
| 54 | #define ADV7604_fsc (28636360) | 54 | #define ADV7604_fsc (28636360) |
| 55 | 55 | ||
| 56 | #define DIGITAL_INPUT ((state->prim_mode == ADV7604_PRIM_MODE_HDMI_COMP) || \ | 56 | #define DIGITAL_INPUT (state->mode == ADV7604_MODE_HDMI) |
| 57 | (state->prim_mode == ADV7604_PRIM_MODE_HDMI_GR)) | ||
| 58 | 57 | ||
| 59 | /* | 58 | /* |
| 60 | ********************************************************************** | 59 | ********************************************************************** |
| @@ -68,7 +67,7 @@ struct adv7604_state { | |||
| 68 | struct v4l2_subdev sd; | 67 | struct v4l2_subdev sd; |
| 69 | struct media_pad pad; | 68 | struct media_pad pad; |
| 70 | struct v4l2_ctrl_handler hdl; | 69 | struct v4l2_ctrl_handler hdl; |
| 71 | enum adv7604_prim_mode prim_mode; | 70 | enum adv7604_mode mode; |
| 72 | struct v4l2_dv_timings timings; | 71 | struct v4l2_dv_timings timings; |
| 73 | u8 edid[256]; | 72 | u8 edid[256]; |
| 74 | unsigned edid_blocks; | 73 | unsigned edid_blocks; |
| @@ -77,6 +76,7 @@ struct adv7604_state { | |||
| 77 | struct workqueue_struct *work_queues; | 76 | struct workqueue_struct *work_queues; |
| 78 | struct delayed_work delayed_work_enable_hotplug; | 77 | struct delayed_work delayed_work_enable_hotplug; |
| 79 | bool connector_hdmi; | 78 | bool connector_hdmi; |
| 79 | bool restart_stdi_once; | ||
| 80 | 80 | ||
| 81 | /* i2c clients */ | 81 | /* i2c clients */ |
| 82 | struct i2c_client *i2c_avlink; | 82 | struct i2c_client *i2c_avlink; |
| @@ -106,7 +106,6 @@ static const struct v4l2_dv_timings adv7604_timings[] = { | |||
| 106 | V4L2_DV_BT_CEA_720X576P50, | 106 | V4L2_DV_BT_CEA_720X576P50, |
| 107 | V4L2_DV_BT_CEA_1280X720P24, | 107 | V4L2_DV_BT_CEA_1280X720P24, |
| 108 | V4L2_DV_BT_CEA_1280X720P25, | 108 | V4L2_DV_BT_CEA_1280X720P25, |
| 109 | V4L2_DV_BT_CEA_1280X720P30, | ||
| 110 | V4L2_DV_BT_CEA_1280X720P50, | 109 | V4L2_DV_BT_CEA_1280X720P50, |
| 111 | V4L2_DV_BT_CEA_1280X720P60, | 110 | V4L2_DV_BT_CEA_1280X720P60, |
| 112 | V4L2_DV_BT_CEA_1920X1080P24, | 111 | V4L2_DV_BT_CEA_1920X1080P24, |
| @@ -115,6 +114,7 @@ static const struct v4l2_dv_timings adv7604_timings[] = { | |||
| 115 | V4L2_DV_BT_CEA_1920X1080P50, | 114 | V4L2_DV_BT_CEA_1920X1080P50, |
| 116 | V4L2_DV_BT_CEA_1920X1080P60, | 115 | V4L2_DV_BT_CEA_1920X1080P60, |
| 117 | 116 | ||
| 117 | /* sorted by DMT ID */ | ||
| 118 | V4L2_DV_BT_DMT_640X350P85, | 118 | V4L2_DV_BT_DMT_640X350P85, |
| 119 | V4L2_DV_BT_DMT_640X400P85, | 119 | V4L2_DV_BT_DMT_640X400P85, |
| 120 | V4L2_DV_BT_DMT_720X400P85, | 120 | V4L2_DV_BT_DMT_720X400P85, |
| @@ -164,6 +164,89 @@ static const struct v4l2_dv_timings adv7604_timings[] = { | |||
| 164 | { }, | 164 | { }, |
| 165 | }; | 165 | }; |
| 166 | 166 | ||
| 167 | struct adv7604_video_standards { | ||
| 168 | struct v4l2_dv_timings timings; | ||
| 169 | u8 vid_std; | ||
| 170 | u8 v_freq; | ||
| 171 | }; | ||
| 172 | |||
| 173 | /* sorted by number of lines */ | ||
| 174 | static const struct adv7604_video_standards adv7604_prim_mode_comp[] = { | ||
| 175 | /* { V4L2_DV_BT_CEA_720X480P59_94, 0x0a, 0x00 }, TODO flickering */ | ||
| 176 | { V4L2_DV_BT_CEA_720X576P50, 0x0b, 0x00 }, | ||
| 177 | { V4L2_DV_BT_CEA_1280X720P50, 0x19, 0x01 }, | ||
| 178 | { V4L2_DV_BT_CEA_1280X720P60, 0x19, 0x00 }, | ||
| 179 | { V4L2_DV_BT_CEA_1920X1080P24, 0x1e, 0x04 }, | ||
| 180 | { V4L2_DV_BT_CEA_1920X1080P25, 0x1e, 0x03 }, | ||
| 181 | { V4L2_DV_BT_CEA_1920X1080P30, 0x1e, 0x02 }, | ||
| 182 | { V4L2_DV_BT_CEA_1920X1080P50, 0x1e, 0x01 }, | ||
| 183 | { V4L2_DV_BT_CEA_1920X1080P60, 0x1e, 0x00 }, | ||
| 184 | /* TODO add 1920x1080P60_RB (CVT timing) */ | ||
| 185 | { }, | ||
| 186 | }; | ||
| 187 | |||
| 188 | /* sorted by number of lines */ | ||
| 189 | static const struct adv7604_video_standards adv7604_prim_mode_gr[] = { | ||
| 190 | { V4L2_DV_BT_DMT_640X480P60, 0x08, 0x00 }, | ||
| 191 | { V4L2_DV_BT_DMT_640X480P72, 0x09, 0x00 }, | ||
| 192 | { V4L2_DV_BT_DMT_640X480P75, 0x0a, 0x00 }, | ||
| 193 | { V4L2_DV_BT_DMT_640X480P85, 0x0b, 0x00 }, | ||
| 194 | { V4L2_DV_BT_DMT_800X600P56, 0x00, 0x00 }, | ||
| 195 | { V4L2_DV_BT_DMT_800X600P60, 0x01, 0x00 }, | ||
| 196 | { V4L2_DV_BT_DMT_800X600P72, 0x02, 0x00 }, | ||
| 197 | { V4L2_DV_BT_DMT_800X600P75, 0x03, 0x00 }, | ||
| 198 | { V4L2_DV_BT_DMT_800X600P85, 0x04, 0x00 }, | ||
| 199 | { V4L2_DV_BT_DMT_1024X768P60, 0x0c, 0x00 }, | ||
| 200 | { V4L2_DV_BT_DMT_1024X768P70, 0x0d, 0x00 }, | ||
| 201 | { V4L2_DV_BT_DMT_1024X768P75, 0x0e, 0x00 }, | ||
| 202 | { V4L2_DV_BT_DMT_1024X768P85, 0x0f, 0x00 }, | ||
| 203 | { V4L2_DV_BT_DMT_1280X1024P60, 0x05, 0x00 }, | ||
| 204 | { V4L2_DV_BT_DMT_1280X1024P75, 0x06, 0x00 }, | ||
| 205 | { V4L2_DV_BT_DMT_1360X768P60, 0x12, 0x00 }, | ||
| 206 | { V4L2_DV_BT_DMT_1366X768P60, 0x13, 0x00 }, | ||
| 207 | { V4L2_DV_BT_DMT_1400X1050P60, 0x14, 0x00 }, | ||
| 208 | { V4L2_DV_BT_DMT_1400X1050P75, 0x15, 0x00 }, | ||
| 209 | { V4L2_DV_BT_DMT_1600X1200P60, 0x16, 0x00 }, /* TODO not tested */ | ||
| 210 | /* TODO add 1600X1200P60_RB (not a DMT timing) */ | ||
| 211 | { V4L2_DV_BT_DMT_1680X1050P60, 0x18, 0x00 }, | ||
| 212 | { V4L2_DV_BT_DMT_1920X1200P60_RB, 0x19, 0x00 }, /* TODO not tested */ | ||
| 213 | { }, | ||
| 214 | }; | ||
| 215 | |||
| 216 | /* sorted by number of lines */ | ||
| 217 | static const struct adv7604_video_standards adv7604_prim_mode_hdmi_comp[] = { | ||
| 218 | { V4L2_DV_BT_CEA_720X480P59_94, 0x0a, 0x00 }, | ||
| 219 | { V4L2_DV_BT_CEA_720X576P50, 0x0b, 0x00 }, | ||
| 220 | { V4L2_DV_BT_CEA_1280X720P50, 0x13, 0x01 }, | ||
| 221 | { V4L2_DV_BT_CEA_1280X720P60, 0x13, 0x00 }, | ||
| 222 | { V4L2_DV_BT_CEA_1920X1080P24, 0x1e, 0x04 }, | ||
| 223 | { V4L2_DV_BT_CEA_1920X1080P25, 0x1e, 0x03 }, | ||
| 224 | { V4L2_DV_BT_CEA_1920X1080P30, 0x1e, 0x02 }, | ||
| 225 | { V4L2_DV_BT_CEA_1920X1080P50, 0x1e, 0x01 }, | ||
| 226 | { V4L2_DV_BT_CEA_1920X1080P60, 0x1e, 0x00 }, | ||
| 227 | { }, | ||
| 228 | }; | ||
| 229 | |||
| 230 | /* sorted by number of lines */ | ||
| 231 | static const struct adv7604_video_standards adv7604_prim_mode_hdmi_gr[] = { | ||
| 232 | { V4L2_DV_BT_DMT_640X480P60, 0x08, 0x00 }, | ||
| 233 | { V4L2_DV_BT_DMT_640X480P72, 0x09, 0x00 }, | ||
| 234 | { V4L2_DV_BT_DMT_640X480P75, 0x0a, 0x00 }, | ||
| 235 | { V4L2_DV_BT_DMT_640X480P85, 0x0b, 0x00 }, | ||
| 236 | { V4L2_DV_BT_DMT_800X600P56, 0x00, 0x00 }, | ||
| 237 | { V4L2_DV_BT_DMT_800X600P60, 0x01, 0x00 }, | ||
| 238 | { V4L2_DV_BT_DMT_800X600P72, 0x02, 0x00 }, | ||
| 239 | { V4L2_DV_BT_DMT_800X600P75, 0x03, 0x00 }, | ||
| 240 | { V4L2_DV_BT_DMT_800X600P85, 0x04, 0x00 }, | ||
| 241 | { V4L2_DV_BT_DMT_1024X768P60, 0x0c, 0x00 }, | ||
| 242 | { V4L2_DV_BT_DMT_1024X768P70, 0x0d, 0x00 }, | ||
| 243 | { V4L2_DV_BT_DMT_1024X768P75, 0x0e, 0x00 }, | ||
| 244 | { V4L2_DV_BT_DMT_1024X768P85, 0x0f, 0x00 }, | ||
| 245 | { V4L2_DV_BT_DMT_1280X1024P60, 0x05, 0x00 }, | ||
| 246 | { V4L2_DV_BT_DMT_1280X1024P75, 0x06, 0x00 }, | ||
| 247 | { }, | ||
| 248 | }; | ||
| 249 | |||
| 167 | /* ----------------------------------------------------------------------- */ | 250 | /* ----------------------------------------------------------------------- */ |
| 168 | 251 | ||
| 169 | static inline struct adv7604_state *to_state(struct v4l2_subdev *sd) | 252 | static inline struct adv7604_state *to_state(struct v4l2_subdev *sd) |
| @@ -672,64 +755,144 @@ static int adv7604_s_detect_tx_5v_ctrl(struct v4l2_subdev *sd) | |||
| 672 | ((io_read(sd, 0x6f) & 0x10) >> 4)); | 755 | ((io_read(sd, 0x6f) & 0x10) >> 4)); |
| 673 | } | 756 | } |
| 674 | 757 | ||
| 675 | static void configure_free_run(struct v4l2_subdev *sd, const struct v4l2_bt_timings *timings) | 758 | static int find_and_set_predefined_video_timings(struct v4l2_subdev *sd, |
| 759 | u8 prim_mode, | ||
| 760 | const struct adv7604_video_standards *predef_vid_timings, | ||
| 761 | const struct v4l2_dv_timings *timings) | ||
| 762 | { | ||
| 763 | struct adv7604_state *state = to_state(sd); | ||
| 764 | int i; | ||
| 765 | |||
| 766 | for (i = 0; predef_vid_timings[i].timings.bt.width; i++) { | ||
| 767 | if (!v4l_match_dv_timings(timings, &predef_vid_timings[i].timings, | ||
| 768 | DIGITAL_INPUT ? 250000 : 1000000)) | ||
| 769 | continue; | ||
| 770 | io_write(sd, 0x00, predef_vid_timings[i].vid_std); /* video std */ | ||
| 771 | io_write(sd, 0x01, (predef_vid_timings[i].v_freq << 4) + | ||
| 772 | prim_mode); /* v_freq and prim mode */ | ||
| 773 | return 0; | ||
| 774 | } | ||
| 775 | |||
| 776 | return -1; | ||
| 777 | } | ||
| 778 | |||
| 779 | static int configure_predefined_video_timings(struct v4l2_subdev *sd, | ||
| 780 | struct v4l2_dv_timings *timings) | ||
| 676 | { | 781 | { |
| 782 | struct adv7604_state *state = to_state(sd); | ||
| 783 | int err; | ||
| 784 | |||
| 785 | v4l2_dbg(1, debug, sd, "%s", __func__); | ||
| 786 | |||
| 787 | /* reset to default values */ | ||
| 788 | io_write(sd, 0x16, 0x43); | ||
| 789 | io_write(sd, 0x17, 0x5a); | ||
| 790 | /* disable embedded syncs for auto graphics mode */ | ||
| 791 | cp_write_and_or(sd, 0x81, 0xef, 0x00); | ||
| 792 | cp_write(sd, 0x8f, 0x00); | ||
| 793 | cp_write(sd, 0x90, 0x00); | ||
| 794 | cp_write(sd, 0xa2, 0x00); | ||
| 795 | cp_write(sd, 0xa3, 0x00); | ||
| 796 | cp_write(sd, 0xa4, 0x00); | ||
| 797 | cp_write(sd, 0xa5, 0x00); | ||
| 798 | cp_write(sd, 0xa6, 0x00); | ||
| 799 | cp_write(sd, 0xa7, 0x00); | ||
| 800 | cp_write(sd, 0xab, 0x00); | ||
| 801 | cp_write(sd, 0xac, 0x00); | ||
| 802 | |||
| 803 | switch (state->mode) { | ||
| 804 | case ADV7604_MODE_COMP: | ||
| 805 | case ADV7604_MODE_GR: | ||
| 806 | err = find_and_set_predefined_video_timings(sd, | ||
| 807 | 0x01, adv7604_prim_mode_comp, timings); | ||
| 808 | if (err) | ||
| 809 | err = find_and_set_predefined_video_timings(sd, | ||
| 810 | 0x02, adv7604_prim_mode_gr, timings); | ||
| 811 | break; | ||
| 812 | case ADV7604_MODE_HDMI: | ||
| 813 | err = find_and_set_predefined_video_timings(sd, | ||
| 814 | 0x05, adv7604_prim_mode_hdmi_comp, timings); | ||
| 815 | if (err) | ||
| 816 | err = find_and_set_predefined_video_timings(sd, | ||
| 817 | 0x06, adv7604_prim_mode_hdmi_gr, timings); | ||
| 818 | break; | ||
| 819 | default: | ||
| 820 | v4l2_dbg(2, debug, sd, "%s: Unknown mode %d\n", | ||
| 821 | __func__, state->mode); | ||
| 822 | err = -1; | ||
| 823 | break; | ||
| 824 | } | ||
| 825 | |||
| 826 | |||
| 827 | return err; | ||
| 828 | } | ||
| 829 | |||
| 830 | static void configure_custom_video_timings(struct v4l2_subdev *sd, | ||
| 831 | const struct v4l2_bt_timings *bt) | ||
| 832 | { | ||
| 833 | struct adv7604_state *state = to_state(sd); | ||
| 677 | struct i2c_client *client = v4l2_get_subdevdata(sd); | 834 | struct i2c_client *client = v4l2_get_subdevdata(sd); |
| 678 | u32 width = htotal(timings); | 835 | u32 width = htotal(bt); |
| 679 | u32 height = vtotal(timings); | 836 | u32 height = vtotal(bt); |
| 680 | u16 ch1_fr_ll = (((u32)timings->pixelclock / 100) > 0) ? | 837 | u16 cp_start_sav = bt->hsync + bt->hbackporch - 4; |
| 681 | ((width * (ADV7604_fsc / 100)) / ((u32)timings->pixelclock / 100)) : 0; | 838 | u16 cp_start_eav = width - bt->hfrontporch; |
| 839 | u16 cp_start_vbi = height - bt->vfrontporch; | ||
| 840 | u16 cp_end_vbi = bt->vsync + bt->vbackporch; | ||
| 841 | u16 ch1_fr_ll = (((u32)bt->pixelclock / 100) > 0) ? | ||
| 842 | ((width * (ADV7604_fsc / 100)) / ((u32)bt->pixelclock / 100)) : 0; | ||
| 843 | const u8 pll[2] = { | ||
| 844 | 0xc0 | ((width >> 8) & 0x1f), | ||
| 845 | width & 0xff | ||
| 846 | }; | ||
| 682 | 847 | ||
| 683 | v4l2_dbg(2, debug, sd, "%s\n", __func__); | 848 | v4l2_dbg(2, debug, sd, "%s\n", __func__); |
| 684 | 849 | ||
| 685 | cp_write(sd, 0x8f, (ch1_fr_ll >> 8) & 0x7); /* CH1_FR_LL */ | 850 | switch (state->mode) { |
| 686 | cp_write(sd, 0x90, ch1_fr_ll & 0xff); /* CH1_FR_LL */ | 851 | case ADV7604_MODE_COMP: |
| 687 | cp_write(sd, 0xab, (height >> 4) & 0xff); /* CP_LCOUNT_MAX */ | 852 | case ADV7604_MODE_GR: |
| 688 | cp_write(sd, 0xac, (height & 0x0f) << 4); /* CP_LCOUNT_MAX */ | 853 | /* auto graphics */ |
| 689 | /* TODO support interlaced */ | 854 | io_write(sd, 0x00, 0x07); /* video std */ |
| 690 | cp_write(sd, 0x91, 0x10); /* INTERLACED */ | 855 | io_write(sd, 0x01, 0x02); /* prim mode */ |
| 691 | 856 | /* enable embedded syncs for auto graphics mode */ | |
| 692 | /* Should only be set in auto-graphics mode [REF_02 p. 91-92] */ | 857 | cp_write_and_or(sd, 0x81, 0xef, 0x10); |
| 693 | if ((io_read(sd, 0x00) == 0x07) && (io_read(sd, 0x01) == 0x02)) { | ||
| 694 | u16 cp_start_sav, cp_start_eav, cp_start_vbi, cp_end_vbi; | ||
| 695 | const u8 pll[2] = { | ||
| 696 | (0xc0 | ((width >> 8) & 0x1f)), | ||
| 697 | (width & 0xff) | ||
| 698 | }; | ||
| 699 | 858 | ||
| 859 | /* Should only be set in auto-graphics mode [REF_02, p. 91-92] */ | ||
| 700 | /* setup PLL_DIV_MAN_EN and PLL_DIV_RATIO */ | 860 | /* setup PLL_DIV_MAN_EN and PLL_DIV_RATIO */ |
| 701 | /* IO-map reg. 0x16 and 0x17 should be written in sequence */ | 861 | /* IO-map reg. 0x16 and 0x17 should be written in sequence */ |
| 702 | if (adv_smbus_write_i2c_block_data(client, 0x16, 2, pll)) { | 862 | if (adv_smbus_write_i2c_block_data(client, 0x16, 2, pll)) { |
| 703 | v4l2_err(sd, "writing to reg 0x16 and 0x17 failed\n"); | 863 | v4l2_err(sd, "writing to reg 0x16 and 0x17 failed\n"); |
| 704 | return; | 864 | break; |
| 705 | } | 865 | } |
| 706 | 866 | ||
| 707 | /* active video - horizontal timing */ | 867 | /* active video - horizontal timing */ |
| 708 | cp_start_sav = timings->hsync + timings->hbackporch - 4; | ||
| 709 | cp_start_eav = width - timings->hfrontporch; | ||
| 710 | cp_write(sd, 0xa2, (cp_start_sav >> 4) & 0xff); | 868 | cp_write(sd, 0xa2, (cp_start_sav >> 4) & 0xff); |
| 711 | cp_write(sd, 0xa3, ((cp_start_sav & 0x0f) << 4) | ((cp_start_eav >> 8) & 0x0f)); | 869 | cp_write(sd, 0xa3, ((cp_start_sav & 0x0f) << 4) | |
| 870 | ((cp_start_eav >> 8) & 0x0f)); | ||
| 712 | cp_write(sd, 0xa4, cp_start_eav & 0xff); | 871 | cp_write(sd, 0xa4, cp_start_eav & 0xff); |
| 713 | 872 | ||
| 714 | /* active video - vertical timing */ | 873 | /* active video - vertical timing */ |
| 715 | cp_start_vbi = height - timings->vfrontporch; | ||
| 716 | cp_end_vbi = timings->vsync + timings->vbackporch; | ||
| 717 | cp_write(sd, 0xa5, (cp_start_vbi >> 4) & 0xff); | 874 | cp_write(sd, 0xa5, (cp_start_vbi >> 4) & 0xff); |
| 718 | cp_write(sd, 0xa6, ((cp_start_vbi & 0xf) << 4) | ((cp_end_vbi >> 8) & 0xf)); | 875 | cp_write(sd, 0xa6, ((cp_start_vbi & 0xf) << 4) | |
| 876 | ((cp_end_vbi >> 8) & 0xf)); | ||
| 719 | cp_write(sd, 0xa7, cp_end_vbi & 0xff); | 877 | cp_write(sd, 0xa7, cp_end_vbi & 0xff); |
| 720 | } else { | 878 | break; |
| 721 | /* reset to default values */ | 879 | case ADV7604_MODE_HDMI: |
| 722 | io_write(sd, 0x16, 0x43); | 880 | /* set default prim_mode/vid_std for HDMI |
| 723 | io_write(sd, 0x17, 0x5a); | 881 | accoring to [REF_03, c. 4.2] */ |
| 724 | cp_write(sd, 0xa2, 0x00); | 882 | io_write(sd, 0x00, 0x02); /* video std */ |
| 725 | cp_write(sd, 0xa3, 0x00); | 883 | io_write(sd, 0x01, 0x06); /* prim mode */ |
| 726 | cp_write(sd, 0xa4, 0x00); | 884 | break; |
| 727 | cp_write(sd, 0xa5, 0x00); | 885 | default: |
| 728 | cp_write(sd, 0xa6, 0x00); | 886 | v4l2_dbg(2, debug, sd, "%s: Unknown mode %d\n", |
| 729 | cp_write(sd, 0xa7, 0x00); | 887 | __func__, state->mode); |
| 888 | break; | ||
| 730 | } | 889 | } |
| 731 | } | ||
| 732 | 890 | ||
| 891 | cp_write(sd, 0x8f, (ch1_fr_ll >> 8) & 0x7); | ||
| 892 | cp_write(sd, 0x90, ch1_fr_ll & 0xff); | ||
| 893 | cp_write(sd, 0xab, (height >> 4) & 0xff); | ||
| 894 | cp_write(sd, 0xac, (height & 0x0f) << 4); | ||
| 895 | } | ||
| 733 | 896 | ||
| 734 | static void set_rgb_quantization_range(struct v4l2_subdev *sd) | 897 | static void set_rgb_quantization_range(struct v4l2_subdev *sd) |
| 735 | { | 898 | { |
| @@ -738,12 +901,7 @@ static void set_rgb_quantization_range(struct v4l2_subdev *sd) | |||
| 738 | switch (state->rgb_quantization_range) { | 901 | switch (state->rgb_quantization_range) { |
| 739 | case V4L2_DV_RGB_RANGE_AUTO: | 902 | case V4L2_DV_RGB_RANGE_AUTO: |
| 740 | /* automatic */ | 903 | /* automatic */ |
| 741 | if ((hdmi_read(sd, 0x05) & 0x80) || | 904 | if (DIGITAL_INPUT && !(hdmi_read(sd, 0x05) & 0x80)) { |
| 742 | (state->prim_mode == ADV7604_PRIM_MODE_COMP) || | ||
| 743 | (state->prim_mode == ADV7604_PRIM_MODE_RGB)) { | ||
| 744 | /* receiving HDMI or analog signal */ | ||
| 745 | io_write_and_or(sd, 0x02, 0x0f, 0xf0); | ||
| 746 | } else { | ||
| 747 | /* receiving DVI-D signal */ | 905 | /* receiving DVI-D signal */ |
| 748 | 906 | ||
| 749 | /* ADV7604 selects RGB limited range regardless of | 907 | /* ADV7604 selects RGB limited range regardless of |
| @@ -756,6 +914,9 @@ static void set_rgb_quantization_range(struct v4l2_subdev *sd) | |||
| 756 | /* RGB full range (0-255) */ | 914 | /* RGB full range (0-255) */ |
| 757 | io_write_and_or(sd, 0x02, 0x0f, 0x10); | 915 | io_write_and_or(sd, 0x02, 0x0f, 0x10); |
| 758 | } | 916 | } |
| 917 | } else { | ||
| 918 | /* receiving HDMI or analog signal, set automode */ | ||
| 919 | io_write_and_or(sd, 0x02, 0x0f, 0xf0); | ||
| 759 | } | 920 | } |
| 760 | break; | 921 | break; |
| 761 | case V4L2_DV_RGB_RANGE_LIMITED: | 922 | case V4L2_DV_RGB_RANGE_LIMITED: |
| @@ -967,8 +1128,10 @@ static int stdi2dv_timings(struct v4l2_subdev *sd, | |||
| 967 | state->aspect_ratio, timings)) | 1128 | state->aspect_ratio, timings)) |
| 968 | return 0; | 1129 | return 0; |
| 969 | 1130 | ||
| 970 | v4l2_dbg(2, debug, sd, "%s: No format candidate found for lcf=%d, bl = %d\n", | 1131 | v4l2_dbg(2, debug, sd, |
| 971 | __func__, stdi->lcf, stdi->bl); | 1132 | "%s: No format candidate found for lcvs = %d, lcf=%d, bl = %d, %chsync, %cvsync\n", |
| 1133 | __func__, stdi->lcvs, stdi->lcf, stdi->bl, | ||
| 1134 | stdi->hs_pol, stdi->vs_pol); | ||
| 972 | return -1; | 1135 | return -1; |
| 973 | } | 1136 | } |
| 974 | 1137 | ||
| @@ -1123,7 +1286,7 @@ static int adv7604_query_dv_timings(struct v4l2_subdev *sd, | |||
| 1123 | adv7604_fill_optional_dv_timings_fields(sd, timings); | 1286 | adv7604_fill_optional_dv_timings_fields(sd, timings); |
| 1124 | } else { | 1287 | } else { |
| 1125 | /* find format | 1288 | /* find format |
| 1126 | * Since LCVS values are inaccurate (REF_03, page 275-276), | 1289 | * Since LCVS values are inaccurate [REF_03, p. 275-276], |
| 1127 | * stdi2dv_timings() is called with lcvs +-1 if the first attempt fails. | 1290 | * stdi2dv_timings() is called with lcvs +-1 if the first attempt fails. |
| 1128 | */ | 1291 | */ |
| 1129 | if (!stdi2dv_timings(sd, &stdi, timings)) | 1292 | if (!stdi2dv_timings(sd, &stdi, timings)) |
| @@ -1135,9 +1298,31 @@ static int adv7604_query_dv_timings(struct v4l2_subdev *sd, | |||
| 1135 | stdi.lcvs -= 2; | 1298 | stdi.lcvs -= 2; |
| 1136 | v4l2_dbg(1, debug, sd, "%s: lcvs - 1 = %d\n", __func__, stdi.lcvs); | 1299 | v4l2_dbg(1, debug, sd, "%s: lcvs - 1 = %d\n", __func__, stdi.lcvs); |
| 1137 | if (stdi2dv_timings(sd, &stdi, timings)) { | 1300 | if (stdi2dv_timings(sd, &stdi, timings)) { |
| 1301 | /* | ||
| 1302 | * The STDI block may measure wrong values, especially | ||
| 1303 | * for lcvs and lcf. If the driver can not find any | ||
| 1304 | * valid timing, the STDI block is restarted to measure | ||
| 1305 | * the video timings again. The function will return an | ||
| 1306 | * error, but the restart of STDI will generate a new | ||
| 1307 | * STDI interrupt and the format detection process will | ||
| 1308 | * restart. | ||
| 1309 | */ | ||
| 1310 | if (state->restart_stdi_once) { | ||
| 1311 | v4l2_dbg(1, debug, sd, "%s: restart STDI\n", __func__); | ||
| 1312 | /* TODO restart STDI for Sync Channel 2 */ | ||
| 1313 | /* enter one-shot mode */ | ||
| 1314 | cp_write_and_or(sd, 0x86, 0xf9, 0x00); | ||
| 1315 | /* trigger STDI restart */ | ||
| 1316 | cp_write_and_or(sd, 0x86, 0xf9, 0x04); | ||
| 1317 | /* reset to continuous mode */ | ||
| 1318 | cp_write_and_or(sd, 0x86, 0xf9, 0x02); | ||
| 1319 | state->restart_stdi_once = false; | ||
| 1320 | return -ENOLINK; | ||
| 1321 | } | ||
| 1138 | v4l2_dbg(1, debug, sd, "%s: format not supported\n", __func__); | 1322 | v4l2_dbg(1, debug, sd, "%s: format not supported\n", __func__); |
| 1139 | return -ERANGE; | 1323 | return -ERANGE; |
| 1140 | } | 1324 | } |
| 1325 | state->restart_stdi_once = true; | ||
| 1141 | } | 1326 | } |
| 1142 | found: | 1327 | found: |
| 1143 | 1328 | ||
| @@ -1166,6 +1351,7 @@ static int adv7604_s_dv_timings(struct v4l2_subdev *sd, | |||
| 1166 | { | 1351 | { |
| 1167 | struct adv7604_state *state = to_state(sd); | 1352 | struct adv7604_state *state = to_state(sd); |
| 1168 | struct v4l2_bt_timings *bt; | 1353 | struct v4l2_bt_timings *bt; |
| 1354 | int err; | ||
| 1169 | 1355 | ||
| 1170 | if (!timings) | 1356 | if (!timings) |
| 1171 | return -EINVAL; | 1357 | return -EINVAL; |
| @@ -1178,12 +1364,20 @@ static int adv7604_s_dv_timings(struct v4l2_subdev *sd, | |||
| 1178 | __func__, (u32)bt->pixelclock); | 1364 | __func__, (u32)bt->pixelclock); |
| 1179 | return -ERANGE; | 1365 | return -ERANGE; |
| 1180 | } | 1366 | } |
| 1367 | |||
| 1181 | adv7604_fill_optional_dv_timings_fields(sd, timings); | 1368 | adv7604_fill_optional_dv_timings_fields(sd, timings); |
| 1182 | 1369 | ||
| 1183 | state->timings = *timings; | 1370 | state->timings = *timings; |
| 1184 | 1371 | ||
| 1185 | /* freerun */ | 1372 | cp_write(sd, 0x91, bt->interlaced ? 0x50 : 0x10); |
| 1186 | configure_free_run(sd, bt); | 1373 | |
| 1374 | /* Use prim_mode and vid_std when available */ | ||
| 1375 | err = configure_predefined_video_timings(sd, timings); | ||
| 1376 | if (err) { | ||
| 1377 | /* custom settings when the video format | ||
| 1378 | does not have prim_mode/vid_std */ | ||
| 1379 | configure_custom_video_timings(sd, bt); | ||
| 1380 | } | ||
| 1187 | 1381 | ||
| 1188 | set_rgb_quantization_range(sd); | 1382 | set_rgb_quantization_range(sd); |
| 1189 | 1383 | ||
| @@ -1203,24 +1397,25 @@ static int adv7604_g_dv_timings(struct v4l2_subdev *sd, | |||
| 1203 | return 0; | 1397 | return 0; |
| 1204 | } | 1398 | } |
| 1205 | 1399 | ||
| 1206 | static void enable_input(struct v4l2_subdev *sd, enum adv7604_prim_mode prim_mode) | 1400 | static void enable_input(struct v4l2_subdev *sd) |
| 1207 | { | 1401 | { |
| 1208 | switch (prim_mode) { | 1402 | struct adv7604_state *state = to_state(sd); |
| 1209 | case ADV7604_PRIM_MODE_COMP: | 1403 | |
| 1210 | case ADV7604_PRIM_MODE_RGB: | 1404 | switch (state->mode) { |
| 1405 | case ADV7604_MODE_COMP: | ||
| 1406 | case ADV7604_MODE_GR: | ||
| 1211 | /* enable */ | 1407 | /* enable */ |
| 1212 | io_write(sd, 0x15, 0xb0); /* Disable Tristate of Pins (no audio) */ | 1408 | io_write(sd, 0x15, 0xb0); /* Disable Tristate of Pins (no audio) */ |
| 1213 | break; | 1409 | break; |
| 1214 | case ADV7604_PRIM_MODE_HDMI_COMP: | 1410 | case ADV7604_MODE_HDMI: |
| 1215 | case ADV7604_PRIM_MODE_HDMI_GR: | ||
| 1216 | /* enable */ | 1411 | /* enable */ |
| 1217 | hdmi_write(sd, 0x1a, 0x0a); /* Unmute audio */ | 1412 | hdmi_write(sd, 0x1a, 0x0a); /* Unmute audio */ |
| 1218 | hdmi_write(sd, 0x01, 0x00); /* Enable HDMI clock terminators */ | 1413 | hdmi_write(sd, 0x01, 0x00); /* Enable HDMI clock terminators */ |
| 1219 | io_write(sd, 0x15, 0xa0); /* Disable Tristate of Pins */ | 1414 | io_write(sd, 0x15, 0xa0); /* Disable Tristate of Pins */ |
| 1220 | break; | 1415 | break; |
| 1221 | default: | 1416 | default: |
| 1222 | v4l2_err(sd, "%s: reserved primary mode 0x%0x\n", | 1417 | v4l2_dbg(2, debug, sd, "%s: Unknown mode %d\n", |
| 1223 | __func__, prim_mode); | 1418 | __func__, state->mode); |
| 1224 | break; | 1419 | break; |
| 1225 | } | 1420 | } |
| 1226 | } | 1421 | } |
| @@ -1233,17 +1428,13 @@ static void disable_input(struct v4l2_subdev *sd) | |||
| 1233 | hdmi_write(sd, 0x01, 0x78); /* Disable HDMI clock terminators */ | 1428 | hdmi_write(sd, 0x01, 0x78); /* Disable HDMI clock terminators */ |
| 1234 | } | 1429 | } |
| 1235 | 1430 | ||
| 1236 | static void select_input(struct v4l2_subdev *sd, enum adv7604_prim_mode prim_mode) | 1431 | static void select_input(struct v4l2_subdev *sd) |
| 1237 | { | 1432 | { |
| 1238 | switch (prim_mode) { | 1433 | struct adv7604_state *state = to_state(sd); |
| 1239 | case ADV7604_PRIM_MODE_COMP: | ||
| 1240 | case ADV7604_PRIM_MODE_RGB: | ||
| 1241 | /* set mode and select free run resolution */ | ||
| 1242 | io_write(sd, 0x00, 0x07); /* video std */ | ||
| 1243 | io_write(sd, 0x01, 0x02); /* prim mode */ | ||
| 1244 | /* enable embedded syncs for auto graphics mode */ | ||
| 1245 | cp_write_and_or(sd, 0x81, 0xef, 0x10); | ||
| 1246 | 1434 | ||
| 1435 | switch (state->mode) { | ||
| 1436 | case ADV7604_MODE_COMP: | ||
| 1437 | case ADV7604_MODE_GR: | ||
| 1247 | /* reset ADI recommended settings for HDMI: */ | 1438 | /* reset ADI recommended settings for HDMI: */ |
| 1248 | /* "ADV7604 Register Settings Recommendations (rev. 2.5, June 2010)" p. 4. */ | 1439 | /* "ADV7604 Register Settings Recommendations (rev. 2.5, June 2010)" p. 4. */ |
| 1249 | hdmi_write(sd, 0x0d, 0x04); /* HDMI filter optimization */ | 1440 | hdmi_write(sd, 0x0d, 0x04); /* HDMI filter optimization */ |
| @@ -1271,16 +1462,7 @@ static void select_input(struct v4l2_subdev *sd, enum adv7604_prim_mode prim_mod | |||
| 1271 | cp_write(sd, 0x40, 0x5c); /* CP core pre-gain control. Graphics mode */ | 1462 | cp_write(sd, 0x40, 0x5c); /* CP core pre-gain control. Graphics mode */ |
| 1272 | break; | 1463 | break; |
| 1273 | 1464 | ||
| 1274 | case ADV7604_PRIM_MODE_HDMI_COMP: | 1465 | case ADV7604_MODE_HDMI: |
| 1275 | case ADV7604_PRIM_MODE_HDMI_GR: | ||
| 1276 | /* set mode and select free run resolution */ | ||
| 1277 | /* video std */ | ||
| 1278 | io_write(sd, 0x00, | ||
| 1279 | (prim_mode == ADV7604_PRIM_MODE_HDMI_GR) ? 0x02 : 0x1e); | ||
| 1280 | io_write(sd, 0x01, prim_mode); /* prim mode */ | ||
| 1281 | /* disable embedded syncs for auto graphics mode */ | ||
| 1282 | cp_write_and_or(sd, 0x81, 0xef, 0x00); | ||
| 1283 | |||
| 1284 | /* set ADI recommended settings for HDMI: */ | 1466 | /* set ADI recommended settings for HDMI: */ |
| 1285 | /* "ADV7604 Register Settings Recommendations (rev. 2.5, June 2010)" p. 4. */ | 1467 | /* "ADV7604 Register Settings Recommendations (rev. 2.5, June 2010)" p. 4. */ |
| 1286 | hdmi_write(sd, 0x0d, 0x84); /* HDMI filter optimization */ | 1468 | hdmi_write(sd, 0x0d, 0x84); /* HDMI filter optimization */ |
| @@ -1309,7 +1491,8 @@ static void select_input(struct v4l2_subdev *sd, enum adv7604_prim_mode prim_mod | |||
| 1309 | 1491 | ||
| 1310 | break; | 1492 | break; |
| 1311 | default: | 1493 | default: |
| 1312 | v4l2_err(sd, "%s: reserved primary mode 0x%0x\n", __func__, prim_mode); | 1494 | v4l2_dbg(2, debug, sd, "%s: Unknown mode %d\n", |
| 1495 | __func__, state->mode); | ||
| 1313 | break; | 1496 | break; |
| 1314 | } | 1497 | } |
| 1315 | } | 1498 | } |
| @@ -1321,26 +1504,13 @@ static int adv7604_s_routing(struct v4l2_subdev *sd, | |||
| 1321 | 1504 | ||
| 1322 | v4l2_dbg(2, debug, sd, "%s: input %d", __func__, input); | 1505 | v4l2_dbg(2, debug, sd, "%s: input %d", __func__, input); |
| 1323 | 1506 | ||
| 1324 | switch (input) { | 1507 | state->mode = input; |
| 1325 | case 0: | ||
| 1326 | /* TODO select HDMI_COMP or HDMI_GR */ | ||
| 1327 | state->prim_mode = ADV7604_PRIM_MODE_HDMI_COMP; | ||
| 1328 | break; | ||
| 1329 | case 1: | ||
| 1330 | state->prim_mode = ADV7604_PRIM_MODE_RGB; | ||
| 1331 | break; | ||
| 1332 | case 2: | ||
| 1333 | state->prim_mode = ADV7604_PRIM_MODE_COMP; | ||
| 1334 | break; | ||
| 1335 | default: | ||
| 1336 | return -EINVAL; | ||
| 1337 | } | ||
| 1338 | 1508 | ||
| 1339 | disable_input(sd); | 1509 | disable_input(sd); |
| 1340 | 1510 | ||
| 1341 | select_input(sd, state->prim_mode); | 1511 | select_input(sd); |
| 1342 | 1512 | ||
| 1343 | enable_input(sd, state->prim_mode); | 1513 | enable_input(sd); |
| 1344 | 1514 | ||
| 1345 | return 0; | 1515 | return 0; |
| 1346 | } | 1516 | } |
| @@ -1549,8 +1719,9 @@ static int adv7604_log_status(struct v4l2_subdev *sd) | |||
| 1549 | v4l2_info(sd, "CP locked: %s\n", no_lock_cp(sd) ? "false" : "true"); | 1719 | v4l2_info(sd, "CP locked: %s\n", no_lock_cp(sd) ? "false" : "true"); |
| 1550 | v4l2_info(sd, "CP free run: %s\n", | 1720 | v4l2_info(sd, "CP free run: %s\n", |
| 1551 | (!!(cp_read(sd, 0xff) & 0x10) ? "on" : "off")); | 1721 | (!!(cp_read(sd, 0xff) & 0x10) ? "on" : "off")); |
| 1552 | v4l2_info(sd, "Prim-mode = 0x%x, video std = 0x%x\n", | 1722 | v4l2_info(sd, "Prim-mode = 0x%x, video std = 0x%x, v_freq = 0x%x\n", |
| 1553 | io_read(sd, 0x01) & 0x0f, io_read(sd, 0x00) & 0x3f); | 1723 | io_read(sd, 0x01) & 0x0f, io_read(sd, 0x00) & 0x3f, |
| 1724 | (io_read(sd, 0x01) & 0x70) >> 4); | ||
| 1554 | 1725 | ||
| 1555 | v4l2_info(sd, "-----Video Timings-----\n"); | 1726 | v4l2_info(sd, "-----Video Timings-----\n"); |
| 1556 | if (read_stdi(sd, &stdi)) | 1727 | if (read_stdi(sd, &stdi)) |
| @@ -1712,9 +1883,9 @@ static int adv7604_core_init(struct v4l2_subdev *sd) | |||
| 1712 | cp_write(sd, 0xba, (pdata->hdmi_free_run_mode << 1) | 0x01); /* HDMI free run */ | 1883 | cp_write(sd, 0xba, (pdata->hdmi_free_run_mode << 1) | 0x01); /* HDMI free run */ |
| 1713 | cp_write(sd, 0xf3, 0xdc); /* Low threshold to enter/exit free run mode */ | 1884 | cp_write(sd, 0xf3, 0xdc); /* Low threshold to enter/exit free run mode */ |
| 1714 | cp_write(sd, 0xf9, 0x23); /* STDI ch. 1 - LCVS change threshold - | 1885 | cp_write(sd, 0xf9, 0x23); /* STDI ch. 1 - LCVS change threshold - |
| 1715 | ADI recommended setting [REF_01 c. 2.3.3] */ | 1886 | ADI recommended setting [REF_01, c. 2.3.3] */ |
| 1716 | cp_write(sd, 0x45, 0x23); /* STDI ch. 2 - LCVS change threshold - | 1887 | cp_write(sd, 0x45, 0x23); /* STDI ch. 2 - LCVS change threshold - |
| 1717 | ADI recommended setting [REF_01 c. 2.3.3] */ | 1888 | ADI recommended setting [REF_01, c. 2.3.3] */ |
| 1718 | cp_write(sd, 0xc9, 0x2d); /* use prim_mode and vid_std as free run resolution | 1889 | cp_write(sd, 0xc9, 0x2d); /* use prim_mode and vid_std as free run resolution |
| 1719 | for digital formats */ | 1890 | for digital formats */ |
| 1720 | 1891 | ||
| @@ -1724,11 +1895,6 @@ static int adv7604_core_init(struct v4l2_subdev *sd) | |||
| 1724 | afe_write(sd, 0x02, pdata->ain_sel); /* Select analog input muxing mode */ | 1895 | afe_write(sd, 0x02, pdata->ain_sel); /* Select analog input muxing mode */ |
| 1725 | io_write_and_or(sd, 0x30, ~(1 << 4), pdata->output_bus_lsb_to_msb << 4); | 1896 | io_write_and_or(sd, 0x30, ~(1 << 4), pdata->output_bus_lsb_to_msb << 4); |
| 1726 | 1897 | ||
| 1727 | state->prim_mode = pdata->prim_mode; | ||
| 1728 | select_input(sd, pdata->prim_mode); | ||
| 1729 | |||
| 1730 | enable_input(sd, pdata->prim_mode); | ||
| 1731 | |||
| 1732 | /* interrupts */ | 1898 | /* interrupts */ |
| 1733 | io_write(sd, 0x40, 0xc2); /* Configure INT1 */ | 1899 | io_write(sd, 0x40, 0xc2); /* Configure INT1 */ |
| 1734 | io_write(sd, 0x41, 0xd7); /* STDI irq for any change, disable INT2 */ | 1900 | io_write(sd, 0x41, 0xd7); /* STDI irq for any change, disable INT2 */ |
| @@ -1883,6 +2049,7 @@ static int adv7604_probe(struct i2c_client *client, | |||
| 1883 | v4l2_err(sd, "failed to create all i2c clients\n"); | 2049 | v4l2_err(sd, "failed to create all i2c clients\n"); |
| 1884 | goto err_i2c; | 2050 | goto err_i2c; |
| 1885 | } | 2051 | } |
| 2052 | state->restart_stdi_once = true; | ||
| 1886 | 2053 | ||
| 1887 | /* work queues */ | 2054 | /* work queues */ |
| 1888 | state->work_queues = create_singlethread_workqueue(client->name); | 2055 | state->work_queues = create_singlethread_workqueue(client->name); |
diff --git a/drivers/media/i2c/soc_camera/mt9v022.c b/drivers/media/i2c/soc_camera/mt9v022.c index 13057b966ee9..333ef178d6fb 100644 --- a/drivers/media/i2c/soc_camera/mt9v022.c +++ b/drivers/media/i2c/soc_camera/mt9v022.c | |||
| @@ -263,9 +263,14 @@ static int mt9v022_s_crop(struct v4l2_subdev *sd, const struct v4l2_crop *a) | |||
| 263 | if (ret & 1) /* Autoexposure */ | 263 | if (ret & 1) /* Autoexposure */ |
| 264 | ret = reg_write(client, mt9v022->reg->max_total_shutter_width, | 264 | ret = reg_write(client, mt9v022->reg->max_total_shutter_width, |
| 265 | rect.height + mt9v022->y_skip_top + 43); | 265 | rect.height + mt9v022->y_skip_top + 43); |
| 266 | else | 266 | /* |
| 267 | ret = reg_write(client, MT9V022_TOTAL_SHUTTER_WIDTH, | 267 | * If autoexposure is off, there is no need to set |
| 268 | rect.height + mt9v022->y_skip_top + 43); | 268 | * MT9V022_TOTAL_SHUTTER_WIDTH here. Autoexposure can be off |
| 269 | * only if the user has set exposure manually, using the | ||
| 270 | * V4L2_CID_EXPOSURE_AUTO with the value V4L2_EXPOSURE_MANUAL. | ||
| 271 | * In this case the register MT9V022_TOTAL_SHUTTER_WIDTH | ||
| 272 | * already contains the correct value. | ||
| 273 | */ | ||
| 269 | } | 274 | } |
| 270 | /* Setup frame format: defaults apart from width and height */ | 275 | /* Setup frame format: defaults apart from width and height */ |
| 271 | if (!ret) | 276 | if (!ret) |
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c index bfec9e65aefb..19cbb12a12a2 100644 --- a/drivers/media/platform/exynos-gsc/gsc-core.c +++ b/drivers/media/platform/exynos-gsc/gsc-core.c | |||
| @@ -965,8 +965,10 @@ static struct platform_device_id gsc_driver_ids[] = { | |||
| 965 | MODULE_DEVICE_TABLE(platform, gsc_driver_ids); | 965 | MODULE_DEVICE_TABLE(platform, gsc_driver_ids); |
| 966 | 966 | ||
| 967 | static const struct of_device_id exynos_gsc_match[] = { | 967 | static const struct of_device_id exynos_gsc_match[] = { |
| 968 | { .compatible = "samsung,exynos5250-gsc", | 968 | { |
| 969 | .data = &gsc_v_100_drvdata, }, | 969 | .compatible = "samsung,exynos5-gsc", |
| 970 | .data = &gsc_v_100_drvdata, | ||
| 971 | }, | ||
| 970 | {}, | 972 | {}, |
| 971 | }; | 973 | }; |
| 972 | MODULE_DEVICE_TABLE(of, exynos_gsc_match); | 974 | MODULE_DEVICE_TABLE(of, exynos_gsc_match); |
diff --git a/drivers/media/platform/exynos-gsc/gsc-m2m.c b/drivers/media/platform/exynos-gsc/gsc-m2m.c index 3c7f00577bd9..c065d040ed94 100644 --- a/drivers/media/platform/exynos-gsc/gsc-m2m.c +++ b/drivers/media/platform/exynos-gsc/gsc-m2m.c | |||
| @@ -657,8 +657,7 @@ static int gsc_m2m_release(struct file *file) | |||
| 657 | pr_debug("pid: %d, state: 0x%lx, refcnt= %d", | 657 | pr_debug("pid: %d, state: 0x%lx, refcnt= %d", |
| 658 | task_pid_nr(current), gsc->state, gsc->m2m.refcnt); | 658 | task_pid_nr(current), gsc->state, gsc->m2m.refcnt); |
| 659 | 659 | ||
| 660 | if (mutex_lock_interruptible(&gsc->lock)) | 660 | mutex_lock(&gsc->lock); |
| 661 | return -ERESTARTSYS; | ||
| 662 | 661 | ||
| 663 | v4l2_m2m_ctx_release(ctx->m2m_ctx); | 662 | v4l2_m2m_ctx_release(ctx->m2m_ctx); |
| 664 | gsc_ctrls_delete(ctx); | 663 | gsc_ctrls_delete(ctx); |
| @@ -732,6 +731,7 @@ int gsc_register_m2m_device(struct gsc_dev *gsc) | |||
| 732 | gsc->vdev.ioctl_ops = &gsc_m2m_ioctl_ops; | 731 | gsc->vdev.ioctl_ops = &gsc_m2m_ioctl_ops; |
| 733 | gsc->vdev.release = video_device_release_empty; | 732 | gsc->vdev.release = video_device_release_empty; |
| 734 | gsc->vdev.lock = &gsc->lock; | 733 | gsc->vdev.lock = &gsc->lock; |
| 734 | gsc->vdev.vfl_dir = VFL_DIR_M2M; | ||
| 735 | snprintf(gsc->vdev.name, sizeof(gsc->vdev.name), "%s.%d:m2m", | 735 | snprintf(gsc->vdev.name, sizeof(gsc->vdev.name), "%s.%d:m2m", |
| 736 | GSC_MODULE_NAME, gsc->id); | 736 | GSC_MODULE_NAME, gsc->id); |
| 737 | 737 | ||
diff --git a/drivers/media/platform/exynos-gsc/gsc-regs.h b/drivers/media/platform/exynos-gsc/gsc-regs.h index 533e9947a925..4678f9a6a4fd 100644 --- a/drivers/media/platform/exynos-gsc/gsc-regs.h +++ b/drivers/media/platform/exynos-gsc/gsc-regs.h | |||
| @@ -40,10 +40,10 @@ | |||
| 40 | #define GSC_IN_ROT_YFLIP (2 << 16) | 40 | #define GSC_IN_ROT_YFLIP (2 << 16) |
| 41 | #define GSC_IN_ROT_XFLIP (1 << 16) | 41 | #define GSC_IN_ROT_XFLIP (1 << 16) |
| 42 | #define GSC_IN_RGB_TYPE_MASK (3 << 14) | 42 | #define GSC_IN_RGB_TYPE_MASK (3 << 14) |
| 43 | #define GSC_IN_RGB_HD_WIDE (3 << 14) | 43 | #define GSC_IN_RGB_HD_NARROW (3 << 14) |
| 44 | #define GSC_IN_RGB_HD_NARROW (2 << 14) | 44 | #define GSC_IN_RGB_HD_WIDE (2 << 14) |
| 45 | #define GSC_IN_RGB_SD_WIDE (1 << 14) | 45 | #define GSC_IN_RGB_SD_NARROW (1 << 14) |
| 46 | #define GSC_IN_RGB_SD_NARROW (0 << 14) | 46 | #define GSC_IN_RGB_SD_WIDE (0 << 14) |
| 47 | #define GSC_IN_YUV422_1P_ORDER_MASK (1 << 13) | 47 | #define GSC_IN_YUV422_1P_ORDER_MASK (1 << 13) |
| 48 | #define GSC_IN_YUV422_1P_ORDER_LSB_Y (0 << 13) | 48 | #define GSC_IN_YUV422_1P_ORDER_LSB_Y (0 << 13) |
| 49 | #define GSC_IN_YUV422_1P_OEDER_LSB_C (1 << 13) | 49 | #define GSC_IN_YUV422_1P_OEDER_LSB_C (1 << 13) |
| @@ -85,10 +85,10 @@ | |||
| 85 | #define GSC_OUT_GLOBAL_ALPHA_MASK (0xff << 24) | 85 | #define GSC_OUT_GLOBAL_ALPHA_MASK (0xff << 24) |
| 86 | #define GSC_OUT_GLOBAL_ALPHA(x) ((x) << 24) | 86 | #define GSC_OUT_GLOBAL_ALPHA(x) ((x) << 24) |
| 87 | #define GSC_OUT_RGB_TYPE_MASK (3 << 10) | 87 | #define GSC_OUT_RGB_TYPE_MASK (3 << 10) |
| 88 | #define GSC_OUT_RGB_HD_NARROW (3 << 10) | 88 | #define GSC_OUT_RGB_HD_WIDE (3 << 10) |
| 89 | #define GSC_OUT_RGB_HD_WIDE (2 << 10) | 89 | #define GSC_OUT_RGB_HD_NARROW (2 << 10) |
| 90 | #define GSC_OUT_RGB_SD_NARROW (1 << 10) | 90 | #define GSC_OUT_RGB_SD_WIDE (1 << 10) |
| 91 | #define GSC_OUT_RGB_SD_WIDE (0 << 10) | 91 | #define GSC_OUT_RGB_SD_NARROW (0 << 10) |
| 92 | #define GSC_OUT_YUV422_1P_ORDER_MASK (1 << 9) | 92 | #define GSC_OUT_YUV422_1P_ORDER_MASK (1 << 9) |
| 93 | #define GSC_OUT_YUV422_1P_ORDER_LSB_Y (0 << 9) | 93 | #define GSC_OUT_YUV422_1P_ORDER_LSB_Y (0 << 9) |
| 94 | #define GSC_OUT_YUV422_1P_OEDER_LSB_C (1 << 9) | 94 | #define GSC_OUT_YUV422_1P_OEDER_LSB_C (1 << 9) |
diff --git a/drivers/media/platform/omap3isp/isp.c b/drivers/media/platform/omap3isp/isp.c index 99640d8c1db0..7f182f0ff3da 100644 --- a/drivers/media/platform/omap3isp/isp.c +++ b/drivers/media/platform/omap3isp/isp.c | |||
| @@ -61,6 +61,7 @@ | |||
| 61 | #include <linux/i2c.h> | 61 | #include <linux/i2c.h> |
| 62 | #include <linux/interrupt.h> | 62 | #include <linux/interrupt.h> |
| 63 | #include <linux/module.h> | 63 | #include <linux/module.h> |
| 64 | #include <linux/omap-iommu.h> | ||
| 64 | #include <linux/platform_device.h> | 65 | #include <linux/platform_device.h> |
| 65 | #include <linux/regulator/consumer.h> | 66 | #include <linux/regulator/consumer.h> |
| 66 | #include <linux/slab.h> | 67 | #include <linux/slab.h> |
diff --git a/drivers/media/platform/omap3isp/isp.h b/drivers/media/platform/omap3isp/isp.h index 8be7487c326f..8d6866942b85 100644 --- a/drivers/media/platform/omap3isp/isp.h +++ b/drivers/media/platform/omap3isp/isp.h | |||
| @@ -31,11 +31,9 @@ | |||
| 31 | #include <media/v4l2-device.h> | 31 | #include <media/v4l2-device.h> |
| 32 | #include <linux/device.h> | 32 | #include <linux/device.h> |
| 33 | #include <linux/io.h> | 33 | #include <linux/io.h> |
| 34 | #include <linux/iommu.h> | ||
| 34 | #include <linux/platform_device.h> | 35 | #include <linux/platform_device.h> |
| 35 | #include <linux/wait.h> | 36 | #include <linux/wait.h> |
| 36 | #include <linux/iommu.h> | ||
| 37 | #include <plat/iommu.h> | ||
| 38 | #include <plat/iovmm.h> | ||
| 39 | 37 | ||
| 40 | #include "ispstat.h" | 38 | #include "ispstat.h" |
| 41 | #include "ispccdc.h" | 39 | #include "ispccdc.h" |
diff --git a/drivers/media/platform/omap3isp/ispccdc.c b/drivers/media/platform/omap3isp/ispccdc.c index 60181ab96063..60e60aa64fb4 100644 --- a/drivers/media/platform/omap3isp/ispccdc.c +++ b/drivers/media/platform/omap3isp/ispccdc.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/device.h> | 30 | #include <linux/device.h> |
| 31 | #include <linux/dma-mapping.h> | 31 | #include <linux/dma-mapping.h> |
| 32 | #include <linux/mm.h> | 32 | #include <linux/mm.h> |
| 33 | #include <linux/omap-iommu.h> | ||
| 33 | #include <linux/sched.h> | 34 | #include <linux/sched.h> |
| 34 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
| 35 | #include <media/v4l2-event.h> | 36 | #include <media/v4l2-event.h> |
| @@ -1706,7 +1707,7 @@ static long ccdc_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) | |||
| 1706 | } | 1707 | } |
| 1707 | 1708 | ||
| 1708 | static int ccdc_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, | 1709 | static int ccdc_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, |
| 1709 | const struct v4l2_event_subscription *sub) | 1710 | struct v4l2_event_subscription *sub) |
| 1710 | { | 1711 | { |
| 1711 | if (sub->type != V4L2_EVENT_FRAME_SYNC) | 1712 | if (sub->type != V4L2_EVENT_FRAME_SYNC) |
| 1712 | return -EINVAL; | 1713 | return -EINVAL; |
| @@ -1719,7 +1720,7 @@ static int ccdc_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, | |||
| 1719 | } | 1720 | } |
| 1720 | 1721 | ||
| 1721 | static int ccdc_unsubscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, | 1722 | static int ccdc_unsubscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, |
| 1722 | const struct v4l2_event_subscription *sub) | 1723 | struct v4l2_event_subscription *sub) |
| 1723 | { | 1724 | { |
| 1724 | return v4l2_event_unsubscribe(fh, sub); | 1725 | return v4l2_event_unsubscribe(fh, sub); |
| 1725 | } | 1726 | } |
diff --git a/drivers/media/platform/omap3isp/ispstat.c b/drivers/media/platform/omap3isp/ispstat.c index d7ac76b5c2ae..e7939869bda7 100644 --- a/drivers/media/platform/omap3isp/ispstat.c +++ b/drivers/media/platform/omap3isp/ispstat.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | */ | 26 | */ |
| 27 | 27 | ||
| 28 | #include <linux/dma-mapping.h> | 28 | #include <linux/dma-mapping.h> |
| 29 | #include <linux/omap-iommu.h> | ||
| 29 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
| 30 | #include <linux/uaccess.h> | 31 | #include <linux/uaccess.h> |
| 31 | 32 | ||
| @@ -1025,7 +1026,7 @@ void omap3isp_stat_dma_isr(struct ispstat *stat) | |||
| 1025 | 1026 | ||
| 1026 | int omap3isp_stat_subscribe_event(struct v4l2_subdev *subdev, | 1027 | int omap3isp_stat_subscribe_event(struct v4l2_subdev *subdev, |
| 1027 | struct v4l2_fh *fh, | 1028 | struct v4l2_fh *fh, |
| 1028 | const struct v4l2_event_subscription *sub) | 1029 | struct v4l2_event_subscription *sub) |
| 1029 | { | 1030 | { |
| 1030 | struct ispstat *stat = v4l2_get_subdevdata(subdev); | 1031 | struct ispstat *stat = v4l2_get_subdevdata(subdev); |
| 1031 | 1032 | ||
| @@ -1037,7 +1038,7 @@ int omap3isp_stat_subscribe_event(struct v4l2_subdev *subdev, | |||
| 1037 | 1038 | ||
| 1038 | int omap3isp_stat_unsubscribe_event(struct v4l2_subdev *subdev, | 1039 | int omap3isp_stat_unsubscribe_event(struct v4l2_subdev *subdev, |
| 1039 | struct v4l2_fh *fh, | 1040 | struct v4l2_fh *fh, |
| 1040 | const struct v4l2_event_subscription *sub) | 1041 | struct v4l2_event_subscription *sub) |
| 1041 | { | 1042 | { |
| 1042 | return v4l2_event_unsubscribe(fh, sub); | 1043 | return v4l2_event_unsubscribe(fh, sub); |
| 1043 | } | 1044 | } |
diff --git a/drivers/media/platform/omap3isp/ispstat.h b/drivers/media/platform/omap3isp/ispstat.h index a6fe653eb237..9b7c8654dc8a 100644 --- a/drivers/media/platform/omap3isp/ispstat.h +++ b/drivers/media/platform/omap3isp/ispstat.h | |||
| @@ -147,10 +147,10 @@ int omap3isp_stat_init(struct ispstat *stat, const char *name, | |||
| 147 | void omap3isp_stat_cleanup(struct ispstat *stat); | 147 | void omap3isp_stat_cleanup(struct ispstat *stat); |
| 148 | int omap3isp_stat_subscribe_event(struct v4l2_subdev *subdev, | 148 | int omap3isp_stat_subscribe_event(struct v4l2_subdev *subdev, |
| 149 | struct v4l2_fh *fh, | 149 | struct v4l2_fh *fh, |
| 150 | const struct v4l2_event_subscription *sub); | 150 | struct v4l2_event_subscription *sub); |
| 151 | int omap3isp_stat_unsubscribe_event(struct v4l2_subdev *subdev, | 151 | int omap3isp_stat_unsubscribe_event(struct v4l2_subdev *subdev, |
| 152 | struct v4l2_fh *fh, | 152 | struct v4l2_fh *fh, |
| 153 | const struct v4l2_event_subscription *sub); | 153 | struct v4l2_event_subscription *sub); |
| 154 | int omap3isp_stat_s_stream(struct v4l2_subdev *subdev, int enable); | 154 | int omap3isp_stat_s_stream(struct v4l2_subdev *subdev, int enable); |
| 155 | 155 | ||
| 156 | int omap3isp_stat_busy(struct ispstat *stat); | 156 | int omap3isp_stat_busy(struct ispstat *stat); |
diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index a0b737fecf13..6e74346cc357 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/clk.h> | 27 | #include <linux/clk.h> |
| 28 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
| 29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
| 30 | #include <linux/omap-iommu.h> | ||
| 30 | #include <linux/pagemap.h> | 31 | #include <linux/pagemap.h> |
| 31 | #include <linux/scatterlist.h> | 32 | #include <linux/scatterlist.h> |
| 32 | #include <linux/sched.h> | 33 | #include <linux/sched.h> |
| @@ -34,8 +35,6 @@ | |||
| 34 | #include <linux/vmalloc.h> | 35 | #include <linux/vmalloc.h> |
| 35 | #include <media/v4l2-dev.h> | 36 | #include <media/v4l2-dev.h> |
| 36 | #include <media/v4l2-ioctl.h> | 37 | #include <media/v4l2-ioctl.h> |
| 37 | #include <plat/iommu.h> | ||
| 38 | #include <plat/iovmm.h> | ||
| 39 | #include <plat/omap-pm.h> | 38 | #include <plat/omap-pm.h> |
| 40 | 39 | ||
| 41 | #include "ispvideo.h" | 40 | #include "ispvideo.h" |
| @@ -792,7 +791,7 @@ isp_video_get_crop(struct file *file, void *fh, struct v4l2_crop *crop) | |||
| 792 | } | 791 | } |
| 793 | 792 | ||
| 794 | static int | 793 | static int |
| 795 | isp_video_set_crop(struct file *file, void *fh, struct v4l2_crop *crop) | 794 | isp_video_set_crop(struct file *file, void *fh, const struct v4l2_crop *crop) |
| 796 | { | 795 | { |
| 797 | struct isp_video *video = video_drvdata(file); | 796 | struct isp_video *video = video_drvdata(file); |
| 798 | struct v4l2_subdev *subdev; | 797 | struct v4l2_subdev *subdev; |
diff --git a/drivers/media/platform/s5p-fimc/Kconfig b/drivers/media/platform/s5p-fimc/Kconfig index 8f090a8f270e..c16b20d86ed2 100644 --- a/drivers/media/platform/s5p-fimc/Kconfig +++ b/drivers/media/platform/s5p-fimc/Kconfig | |||
| @@ -24,6 +24,7 @@ config VIDEO_S5P_FIMC | |||
| 24 | config VIDEO_S5P_MIPI_CSIS | 24 | config VIDEO_S5P_MIPI_CSIS |
| 25 | tristate "S5P/EXYNOS MIPI-CSI2 receiver (MIPI-CSIS) driver" | 25 | tristate "S5P/EXYNOS MIPI-CSI2 receiver (MIPI-CSIS) driver" |
| 26 | depends on REGULATOR | 26 | depends on REGULATOR |
| 27 | select S5P_SETUP_MIPIPHY | ||
| 27 | help | 28 | help |
| 28 | This is a V4L2 driver for Samsung S5P and EXYNOS4 SoC MIPI-CSI2 | 29 | This is a V4L2 driver for Samsung S5P and EXYNOS4 SoC MIPI-CSI2 |
| 29 | receiver (MIPI-CSIS) devices. | 30 | receiver (MIPI-CSIS) devices. |
diff --git a/drivers/media/platform/s5p-fimc/fimc-capture.c b/drivers/media/platform/s5p-fimc/fimc-capture.c index 367efd164d0f..891ee873c62b 100644 --- a/drivers/media/platform/s5p-fimc/fimc-capture.c +++ b/drivers/media/platform/s5p-fimc/fimc-capture.c | |||
| @@ -556,8 +556,7 @@ static int fimc_capture_close(struct file *file) | |||
| 556 | 556 | ||
| 557 | dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); | 557 | dbg("pid: %d, state: 0x%lx", task_pid_nr(current), fimc->state); |
| 558 | 558 | ||
| 559 | if (mutex_lock_interruptible(&fimc->lock)) | 559 | mutex_lock(&fimc->lock); |
| 560 | return -ERESTARTSYS; | ||
| 561 | 560 | ||
| 562 | if (--fimc->vid_cap.refcnt == 0) { | 561 | if (--fimc->vid_cap.refcnt == 0) { |
| 563 | clear_bit(ST_CAPT_BUSY, &fimc->state); | 562 | clear_bit(ST_CAPT_BUSY, &fimc->state); |
| @@ -1736,7 +1735,9 @@ static int fimc_register_capture_device(struct fimc_dev *fimc, | |||
| 1736 | q->mem_ops = &vb2_dma_contig_memops; | 1735 | q->mem_ops = &vb2_dma_contig_memops; |
| 1737 | q->buf_struct_size = sizeof(struct fimc_vid_buffer); | 1736 | q->buf_struct_size = sizeof(struct fimc_vid_buffer); |
| 1738 | 1737 | ||
| 1739 | vb2_queue_init(q); | 1738 | ret = vb2_queue_init(q); |
| 1739 | if (ret) | ||
| 1740 | goto err_ent; | ||
| 1740 | 1741 | ||
| 1741 | vid_cap->vd_pad.flags = MEDIA_PAD_FL_SINK; | 1742 | vid_cap->vd_pad.flags = MEDIA_PAD_FL_SINK; |
| 1742 | ret = media_entity_init(&vfd->entity, 1, &vid_cap->vd_pad, 0); | 1743 | ret = media_entity_init(&vfd->entity, 1, &vid_cap->vd_pad, 0); |
| @@ -1772,9 +1773,13 @@ static int fimc_capture_subdev_registered(struct v4l2_subdev *sd) | |||
| 1772 | if (ret) | 1773 | if (ret) |
| 1773 | return ret; | 1774 | return ret; |
| 1774 | 1775 | ||
| 1776 | fimc->pipeline_ops = v4l2_get_subdev_hostdata(sd); | ||
| 1777 | |||
| 1775 | ret = fimc_register_capture_device(fimc, sd->v4l2_dev); | 1778 | ret = fimc_register_capture_device(fimc, sd->v4l2_dev); |
| 1776 | if (ret) | 1779 | if (ret) { |
| 1777 | fimc_unregister_m2m_device(fimc); | 1780 | fimc_unregister_m2m_device(fimc); |
| 1781 | fimc->pipeline_ops = NULL; | ||
| 1782 | } | ||
| 1778 | 1783 | ||
| 1779 | return ret; | 1784 | return ret; |
| 1780 | } | 1785 | } |
| @@ -1791,6 +1796,7 @@ static void fimc_capture_subdev_unregistered(struct v4l2_subdev *sd) | |||
| 1791 | if (video_is_registered(&fimc->vid_cap.vfd)) { | 1796 | if (video_is_registered(&fimc->vid_cap.vfd)) { |
| 1792 | video_unregister_device(&fimc->vid_cap.vfd); | 1797 | video_unregister_device(&fimc->vid_cap.vfd); |
| 1793 | media_entity_cleanup(&fimc->vid_cap.vfd.entity); | 1798 | media_entity_cleanup(&fimc->vid_cap.vfd.entity); |
| 1799 | fimc->pipeline_ops = NULL; | ||
| 1794 | } | 1800 | } |
| 1795 | kfree(fimc->vid_cap.ctx); | 1801 | kfree(fimc->vid_cap.ctx); |
| 1796 | fimc->vid_cap.ctx = NULL; | 1802 | fimc->vid_cap.ctx = NULL; |
diff --git a/drivers/media/platform/s5p-fimc/fimc-lite.c b/drivers/media/platform/s5p-fimc/fimc-lite.c index 70bcf39de879..1b309a72f09f 100644 --- a/drivers/media/platform/s5p-fimc/fimc-lite.c +++ b/drivers/media/platform/s5p-fimc/fimc-lite.c | |||
| @@ -491,8 +491,7 @@ static int fimc_lite_close(struct file *file) | |||
| 491 | struct fimc_lite *fimc = video_drvdata(file); | 491 | struct fimc_lite *fimc = video_drvdata(file); |
| 492 | int ret; | 492 | int ret; |
| 493 | 493 | ||
| 494 | if (mutex_lock_interruptible(&fimc->lock)) | 494 | mutex_lock(&fimc->lock); |
| 495 | return -ERESTARTSYS; | ||
| 496 | 495 | ||
| 497 | if (--fimc->ref_count == 0 && fimc->out_path == FIMC_IO_DMA) { | 496 | if (--fimc->ref_count == 0 && fimc->out_path == FIMC_IO_DMA) { |
| 498 | clear_bit(ST_FLITE_IN_USE, &fimc->state); | 497 | clear_bit(ST_FLITE_IN_USE, &fimc->state); |
| @@ -1253,7 +1252,9 @@ static int fimc_lite_subdev_registered(struct v4l2_subdev *sd) | |||
| 1253 | q->buf_struct_size = sizeof(struct flite_buffer); | 1252 | q->buf_struct_size = sizeof(struct flite_buffer); |
| 1254 | q->drv_priv = fimc; | 1253 | q->drv_priv = fimc; |
| 1255 | 1254 | ||
| 1256 | vb2_queue_init(q); | 1255 | ret = vb2_queue_init(q); |
| 1256 | if (ret < 0) | ||
| 1257 | return ret; | ||
| 1257 | 1258 | ||
| 1258 | fimc->vd_pad.flags = MEDIA_PAD_FL_SINK; | 1259 | fimc->vd_pad.flags = MEDIA_PAD_FL_SINK; |
| 1259 | ret = media_entity_init(&vfd->entity, 1, &fimc->vd_pad, 0); | 1260 | ret = media_entity_init(&vfd->entity, 1, &fimc->vd_pad, 0); |
| @@ -1261,10 +1262,12 @@ static int fimc_lite_subdev_registered(struct v4l2_subdev *sd) | |||
| 1261 | return ret; | 1262 | return ret; |
| 1262 | 1263 | ||
| 1263 | video_set_drvdata(vfd, fimc); | 1264 | video_set_drvdata(vfd, fimc); |
| 1265 | fimc->pipeline_ops = v4l2_get_subdev_hostdata(sd); | ||
| 1264 | 1266 | ||
| 1265 | ret = video_register_device(vfd, VFL_TYPE_GRABBER, -1); | 1267 | ret = video_register_device(vfd, VFL_TYPE_GRABBER, -1); |
| 1266 | if (ret < 0) { | 1268 | if (ret < 0) { |
| 1267 | media_entity_cleanup(&vfd->entity); | 1269 | media_entity_cleanup(&vfd->entity); |
| 1270 | fimc->pipeline_ops = NULL; | ||
| 1268 | return ret; | 1271 | return ret; |
| 1269 | } | 1272 | } |
| 1270 | 1273 | ||
| @@ -1283,6 +1286,7 @@ static void fimc_lite_subdev_unregistered(struct v4l2_subdev *sd) | |||
| 1283 | if (video_is_registered(&fimc->vfd)) { | 1286 | if (video_is_registered(&fimc->vfd)) { |
| 1284 | video_unregister_device(&fimc->vfd); | 1287 | video_unregister_device(&fimc->vfd); |
| 1285 | media_entity_cleanup(&fimc->vfd.entity); | 1288 | media_entity_cleanup(&fimc->vfd.entity); |
| 1289 | fimc->pipeline_ops = NULL; | ||
| 1286 | } | 1290 | } |
| 1287 | } | 1291 | } |
| 1288 | 1292 | ||
diff --git a/drivers/media/platform/s5p-fimc/fimc-m2m.c b/drivers/media/platform/s5p-fimc/fimc-m2m.c index 4500e44f6857..62afed3162ea 100644 --- a/drivers/media/platform/s5p-fimc/fimc-m2m.c +++ b/drivers/media/platform/s5p-fimc/fimc-m2m.c | |||
| @@ -718,8 +718,7 @@ static int fimc_m2m_release(struct file *file) | |||
| 718 | dbg("pid: %d, state: 0x%lx, refcnt= %d", | 718 | dbg("pid: %d, state: 0x%lx, refcnt= %d", |
| 719 | task_pid_nr(current), fimc->state, fimc->m2m.refcnt); | 719 | task_pid_nr(current), fimc->state, fimc->m2m.refcnt); |
| 720 | 720 | ||
| 721 | if (mutex_lock_interruptible(&fimc->lock)) | 721 | mutex_lock(&fimc->lock); |
| 722 | return -ERESTARTSYS; | ||
| 723 | 722 | ||
| 724 | v4l2_m2m_ctx_release(ctx->m2m_ctx); | 723 | v4l2_m2m_ctx_release(ctx->m2m_ctx); |
| 725 | fimc_ctrls_delete(ctx); | 724 | fimc_ctrls_delete(ctx); |
diff --git a/drivers/media/platform/s5p-fimc/fimc-mdevice.c b/drivers/media/platform/s5p-fimc/fimc-mdevice.c index 80ada5882f62..0531ab70a94c 100644 --- a/drivers/media/platform/s5p-fimc/fimc-mdevice.c +++ b/drivers/media/platform/s5p-fimc/fimc-mdevice.c | |||
| @@ -343,53 +343,50 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd) | |||
| 343 | static int fimc_register_callback(struct device *dev, void *p) | 343 | static int fimc_register_callback(struct device *dev, void *p) |
| 344 | { | 344 | { |
| 345 | struct fimc_dev *fimc = dev_get_drvdata(dev); | 345 | struct fimc_dev *fimc = dev_get_drvdata(dev); |
| 346 | struct v4l2_subdev *sd = &fimc->vid_cap.subdev; | 346 | struct v4l2_subdev *sd; |
| 347 | struct fimc_md *fmd = p; | 347 | struct fimc_md *fmd = p; |
| 348 | int ret = 0; | 348 | int ret; |
| 349 | |||
| 350 | if (!fimc || !fimc->pdev) | ||
| 351 | return 0; | ||
| 352 | 349 | ||
| 353 | if (fimc->pdev->id < 0 || fimc->pdev->id >= FIMC_MAX_DEVS) | 350 | if (fimc == NULL || fimc->id >= FIMC_MAX_DEVS) |
| 354 | return 0; | 351 | return 0; |
| 355 | 352 | ||
| 356 | fimc->pipeline_ops = &fimc_pipeline_ops; | 353 | sd = &fimc->vid_cap.subdev; |
| 357 | fmd->fimc[fimc->pdev->id] = fimc; | ||
| 358 | sd->grp_id = FIMC_GROUP_ID; | 354 | sd->grp_id = FIMC_GROUP_ID; |
| 355 | v4l2_set_subdev_hostdata(sd, (void *)&fimc_pipeline_ops); | ||
| 359 | 356 | ||
| 360 | ret = v4l2_device_register_subdev(&fmd->v4l2_dev, sd); | 357 | ret = v4l2_device_register_subdev(&fmd->v4l2_dev, sd); |
| 361 | if (ret) { | 358 | if (ret) { |
| 362 | v4l2_err(&fmd->v4l2_dev, "Failed to register FIMC.%d (%d)\n", | 359 | v4l2_err(&fmd->v4l2_dev, "Failed to register FIMC.%d (%d)\n", |
| 363 | fimc->id, ret); | 360 | fimc->id, ret); |
| 361 | return ret; | ||
| 364 | } | 362 | } |
| 365 | 363 | ||
| 366 | return ret; | 364 | fmd->fimc[fimc->id] = fimc; |
| 365 | return 0; | ||
| 367 | } | 366 | } |
| 368 | 367 | ||
| 369 | static int fimc_lite_register_callback(struct device *dev, void *p) | 368 | static int fimc_lite_register_callback(struct device *dev, void *p) |
| 370 | { | 369 | { |
| 371 | struct fimc_lite *fimc = dev_get_drvdata(dev); | 370 | struct fimc_lite *fimc = dev_get_drvdata(dev); |
| 372 | struct v4l2_subdev *sd = &fimc->subdev; | ||
| 373 | struct fimc_md *fmd = p; | 371 | struct fimc_md *fmd = p; |
| 374 | int ret; | 372 | int ret; |
| 375 | 373 | ||
| 376 | if (fimc == NULL) | 374 | if (fimc == NULL || fimc->index >= FIMC_LITE_MAX_DEVS) |
| 377 | return 0; | 375 | return 0; |
| 378 | 376 | ||
| 379 | if (fimc->index >= FIMC_LITE_MAX_DEVS) | 377 | fimc->subdev.grp_id = FLITE_GROUP_ID; |
| 380 | return 0; | 378 | v4l2_set_subdev_hostdata(&fimc->subdev, (void *)&fimc_pipeline_ops); |
| 381 | |||
| 382 | fimc->pipeline_ops = &fimc_pipeline_ops; | ||
| 383 | fmd->fimc_lite[fimc->index] = fimc; | ||
| 384 | sd->grp_id = FLITE_GROUP_ID; | ||
| 385 | 379 | ||
| 386 | ret = v4l2_device_register_subdev(&fmd->v4l2_dev, sd); | 380 | ret = v4l2_device_register_subdev(&fmd->v4l2_dev, &fimc->subdev); |
| 387 | if (ret) { | 381 | if (ret) { |
| 388 | v4l2_err(&fmd->v4l2_dev, | 382 | v4l2_err(&fmd->v4l2_dev, |
| 389 | "Failed to register FIMC-LITE.%d (%d)\n", | 383 | "Failed to register FIMC-LITE.%d (%d)\n", |
| 390 | fimc->index, ret); | 384 | fimc->index, ret); |
| 385 | return ret; | ||
| 391 | } | 386 | } |
| 392 | return ret; | 387 | |
| 388 | fmd->fimc_lite[fimc->index] = fimc; | ||
| 389 | return 0; | ||
| 393 | } | 390 | } |
| 394 | 391 | ||
| 395 | static int csis_register_callback(struct device *dev, void *p) | 392 | static int csis_register_callback(struct device *dev, void *p) |
| @@ -407,10 +404,12 @@ static int csis_register_callback(struct device *dev, void *p) | |||
| 407 | v4l2_info(sd, "csis%d sd: %s\n", pdev->id, sd->name); | 404 | v4l2_info(sd, "csis%d sd: %s\n", pdev->id, sd->name); |
| 408 | 405 | ||
| 409 | id = pdev->id < 0 ? 0 : pdev->id; | 406 | id = pdev->id < 0 ? 0 : pdev->id; |
| 410 | fmd->csis[id].sd = sd; | ||
| 411 | sd->grp_id = CSIS_GROUP_ID; | 407 | sd->grp_id = CSIS_GROUP_ID; |
| 408 | |||
| 412 | ret = v4l2_device_register_subdev(&fmd->v4l2_dev, sd); | 409 | ret = v4l2_device_register_subdev(&fmd->v4l2_dev, sd); |
| 413 | if (ret) | 410 | if (!ret) |
| 411 | fmd->csis[id].sd = sd; | ||
| 412 | else | ||
| 414 | v4l2_err(&fmd->v4l2_dev, | 413 | v4l2_err(&fmd->v4l2_dev, |
| 415 | "Failed to register CSIS subdevice: %d\n", ret); | 414 | "Failed to register CSIS subdevice: %d\n", ret); |
| 416 | return ret; | 415 | return ret; |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c index 130f4ac8649e..3afe879d54d7 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c | |||
| @@ -381,11 +381,8 @@ static void s5p_mfc_handle_frame(struct s5p_mfc_ctx *ctx, | |||
| 381 | ctx->consumed_stream += s5p_mfc_hw_call(dev->mfc_ops, | 381 | ctx->consumed_stream += s5p_mfc_hw_call(dev->mfc_ops, |
| 382 | get_consumed_stream, dev); | 382 | get_consumed_stream, dev); |
| 383 | if (ctx->codec_mode != S5P_MFC_CODEC_H264_DEC && | 383 | if (ctx->codec_mode != S5P_MFC_CODEC_H264_DEC && |
| 384 | s5p_mfc_hw_call(dev->mfc_ops, | 384 | ctx->consumed_stream + STUFF_BYTE < |
| 385 | get_dec_frame_type, dev) == | 385 | src_buf->b->v4l2_planes[0].bytesused) { |
| 386 | S5P_FIMV_DECODE_FRAME_P_FRAME | ||
| 387 | && ctx->consumed_stream + STUFF_BYTE < | ||
| 388 | src_buf->b->v4l2_planes[0].bytesused) { | ||
| 389 | /* Run MFC again on the same buffer */ | 386 | /* Run MFC again on the same buffer */ |
| 390 | mfc_debug(2, "Running again the same buffer\n"); | 387 | mfc_debug(2, "Running again the same buffer\n"); |
| 391 | ctx->after_packed_pb = 1; | 388 | ctx->after_packed_pb = 1; |
diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c index 50b5bee3c44e..3a8cfd9fc1bd 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc_opr_v6.c | |||
| @@ -1762,7 +1762,7 @@ int s5p_mfc_get_dspl_y_adr_v6(struct s5p_mfc_dev *dev) | |||
| 1762 | 1762 | ||
| 1763 | int s5p_mfc_get_dec_y_adr_v6(struct s5p_mfc_dev *dev) | 1763 | int s5p_mfc_get_dec_y_adr_v6(struct s5p_mfc_dev *dev) |
| 1764 | { | 1764 | { |
| 1765 | return mfc_read(dev, S5P_FIMV_D_DISPLAY_LUMA_ADDR_V6); | 1765 | return mfc_read(dev, S5P_FIMV_D_DECODED_LUMA_ADDR_V6); |
| 1766 | } | 1766 | } |
| 1767 | 1767 | ||
| 1768 | int s5p_mfc_get_dspl_status_v6(struct s5p_mfc_dev *dev) | 1768 | int s5p_mfc_get_dspl_status_v6(struct s5p_mfc_dev *dev) |
diff --git a/drivers/media/platform/sh_vou.c b/drivers/media/platform/sh_vou.c index 85fd312f0a82..a1c87f0ceaab 100644 --- a/drivers/media/platform/sh_vou.c +++ b/drivers/media/platform/sh_vou.c | |||
| @@ -935,9 +935,10 @@ static int sh_vou_g_crop(struct file *file, void *fh, struct v4l2_crop *a) | |||
| 935 | /* Assume a dull encoder, do all the work ourselves. */ | 935 | /* Assume a dull encoder, do all the work ourselves. */ |
| 936 | static int sh_vou_s_crop(struct file *file, void *fh, const struct v4l2_crop *a) | 936 | static int sh_vou_s_crop(struct file *file, void *fh, const struct v4l2_crop *a) |
| 937 | { | 937 | { |
| 938 | struct v4l2_crop a_writable = *a; | ||
| 938 | struct video_device *vdev = video_devdata(file); | 939 | struct video_device *vdev = video_devdata(file); |
| 939 | struct sh_vou_device *vou_dev = video_get_drvdata(vdev); | 940 | struct sh_vou_device *vou_dev = video_get_drvdata(vdev); |
| 940 | struct v4l2_rect *rect = &a->c; | 941 | struct v4l2_rect *rect = &a_writable.c; |
| 941 | struct v4l2_crop sd_crop = {.type = V4L2_BUF_TYPE_VIDEO_OUTPUT}; | 942 | struct v4l2_crop sd_crop = {.type = V4L2_BUF_TYPE_VIDEO_OUTPUT}; |
| 942 | struct v4l2_pix_format *pix = &vou_dev->pix; | 943 | struct v4l2_pix_format *pix = &vou_dev->pix; |
| 943 | struct sh_vou_geometry geo; | 944 | struct sh_vou_geometry geo; |
diff --git a/drivers/media/platform/soc_camera/mx1_camera.c b/drivers/media/platform/soc_camera/mx1_camera.c index bbe70991d30b..032b8c9097f9 100644 --- a/drivers/media/platform/soc_camera/mx1_camera.c +++ b/drivers/media/platform/soc_camera/mx1_camera.c | |||
| @@ -470,14 +470,6 @@ static void mx1_camera_remove_device(struct soc_camera_device *icd) | |||
| 470 | pcdev->icd = NULL; | 470 | pcdev->icd = NULL; |
| 471 | } | 471 | } |
| 472 | 472 | ||
| 473 | static int mx1_camera_set_crop(struct soc_camera_device *icd, | ||
| 474 | struct v4l2_crop *a) | ||
| 475 | { | ||
| 476 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); | ||
| 477 | |||
| 478 | return v4l2_subdev_call(sd, video, s_crop, a); | ||
| 479 | } | ||
| 480 | |||
| 481 | static int mx1_camera_set_bus_param(struct soc_camera_device *icd) | 473 | static int mx1_camera_set_bus_param(struct soc_camera_device *icd) |
| 482 | { | 474 | { |
| 483 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); | 475 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); |
| @@ -689,7 +681,6 @@ static struct soc_camera_host_ops mx1_soc_camera_host_ops = { | |||
| 689 | .add = mx1_camera_add_device, | 681 | .add = mx1_camera_add_device, |
| 690 | .remove = mx1_camera_remove_device, | 682 | .remove = mx1_camera_remove_device, |
| 691 | .set_bus_param = mx1_camera_set_bus_param, | 683 | .set_bus_param = mx1_camera_set_bus_param, |
| 692 | .set_crop = mx1_camera_set_crop, | ||
| 693 | .set_fmt = mx1_camera_set_fmt, | 684 | .set_fmt = mx1_camera_set_fmt, |
| 694 | .try_fmt = mx1_camera_try_fmt, | 685 | .try_fmt = mx1_camera_try_fmt, |
| 695 | .init_videobuf = mx1_camera_init_videobuf, | 686 | .init_videobuf = mx1_camera_init_videobuf, |
diff --git a/drivers/media/platform/soc_camera/mx2_camera.c b/drivers/media/platform/soc_camera/mx2_camera.c index 9fd9d1c5b218..9a55f4c4c7f4 100644 --- a/drivers/media/platform/soc_camera/mx2_camera.c +++ b/drivers/media/platform/soc_camera/mx2_camera.c | |||
| @@ -864,8 +864,10 @@ static int mx2_start_streaming(struct vb2_queue *q, unsigned int count) | |||
| 864 | 864 | ||
| 865 | bytesperline = soc_mbus_bytes_per_line(icd->user_width, | 865 | bytesperline = soc_mbus_bytes_per_line(icd->user_width, |
| 866 | icd->current_fmt->host_fmt); | 866 | icd->current_fmt->host_fmt); |
| 867 | if (bytesperline < 0) | 867 | if (bytesperline < 0) { |
| 868 | spin_unlock_irqrestore(&pcdev->lock, flags); | ||
| 868 | return bytesperline; | 869 | return bytesperline; |
| 870 | } | ||
| 869 | 871 | ||
| 870 | /* | 872 | /* |
| 871 | * I didn't manage to properly enable/disable the prp | 873 | * I didn't manage to properly enable/disable the prp |
| @@ -878,8 +880,10 @@ static int mx2_start_streaming(struct vb2_queue *q, unsigned int count) | |||
| 878 | pcdev->discard_buffer = dma_alloc_coherent(ici->v4l2_dev.dev, | 880 | pcdev->discard_buffer = dma_alloc_coherent(ici->v4l2_dev.dev, |
| 879 | pcdev->discard_size, &pcdev->discard_buffer_dma, | 881 | pcdev->discard_size, &pcdev->discard_buffer_dma, |
| 880 | GFP_KERNEL); | 882 | GFP_KERNEL); |
| 881 | if (!pcdev->discard_buffer) | 883 | if (!pcdev->discard_buffer) { |
| 884 | spin_unlock_irqrestore(&pcdev->lock, flags); | ||
| 882 | return -ENOMEM; | 885 | return -ENOMEM; |
| 886 | } | ||
| 883 | 887 | ||
| 884 | pcdev->buf_discard[0].discard = true; | 888 | pcdev->buf_discard[0].discard = true; |
| 885 | list_add_tail(&pcdev->buf_discard[0].queue, | 889 | list_add_tail(&pcdev->buf_discard[0].queue, |
| @@ -1099,9 +1103,10 @@ static int mx2_camera_set_bus_param(struct soc_camera_device *icd) | |||
| 1099 | } | 1103 | } |
| 1100 | 1104 | ||
| 1101 | static int mx2_camera_set_crop(struct soc_camera_device *icd, | 1105 | static int mx2_camera_set_crop(struct soc_camera_device *icd, |
| 1102 | struct v4l2_crop *a) | 1106 | const struct v4l2_crop *a) |
| 1103 | { | 1107 | { |
| 1104 | struct v4l2_rect *rect = &a->c; | 1108 | struct v4l2_crop a_writable = *a; |
| 1109 | struct v4l2_rect *rect = &a_writable.c; | ||
| 1105 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); | 1110 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); |
| 1106 | struct v4l2_mbus_framefmt mf; | 1111 | struct v4l2_mbus_framefmt mf; |
| 1107 | int ret; | 1112 | int ret; |
diff --git a/drivers/media/platform/soc_camera/mx3_camera.c b/drivers/media/platform/soc_camera/mx3_camera.c index 3557ac97e430..261f6e9e1b17 100644 --- a/drivers/media/platform/soc_camera/mx3_camera.c +++ b/drivers/media/platform/soc_camera/mx3_camera.c | |||
| @@ -799,9 +799,10 @@ static inline void stride_align(__u32 *width) | |||
| 799 | * default g_crop and cropcap from soc_camera.c | 799 | * default g_crop and cropcap from soc_camera.c |
| 800 | */ | 800 | */ |
| 801 | static int mx3_camera_set_crop(struct soc_camera_device *icd, | 801 | static int mx3_camera_set_crop(struct soc_camera_device *icd, |
| 802 | struct v4l2_crop *a) | 802 | const struct v4l2_crop *a) |
| 803 | { | 803 | { |
| 804 | struct v4l2_rect *rect = &a->c; | 804 | struct v4l2_crop a_writable = *a; |
| 805 | struct v4l2_rect *rect = &a_writable.c; | ||
| 805 | struct soc_camera_host *ici = to_soc_camera_host(icd->parent); | 806 | struct soc_camera_host *ici = to_soc_camera_host(icd->parent); |
| 806 | struct mx3_camera_dev *mx3_cam = ici->priv; | 807 | struct mx3_camera_dev *mx3_cam = ici->priv; |
| 807 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); | 808 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); |
diff --git a/drivers/media/platform/soc_camera/omap1_camera.c b/drivers/media/platform/soc_camera/omap1_camera.c index fa08c7695ccb..13636a585106 100644 --- a/drivers/media/platform/soc_camera/omap1_camera.c +++ b/drivers/media/platform/soc_camera/omap1_camera.c | |||
| @@ -1215,9 +1215,9 @@ static int set_mbus_format(struct omap1_cam_dev *pcdev, struct device *dev, | |||
| 1215 | } | 1215 | } |
| 1216 | 1216 | ||
| 1217 | static int omap1_cam_set_crop(struct soc_camera_device *icd, | 1217 | static int omap1_cam_set_crop(struct soc_camera_device *icd, |
| 1218 | struct v4l2_crop *crop) | 1218 | const struct v4l2_crop *crop) |
| 1219 | { | 1219 | { |
| 1220 | struct v4l2_rect *rect = &crop->c; | 1220 | const struct v4l2_rect *rect = &crop->c; |
| 1221 | const struct soc_camera_format_xlate *xlate = icd->current_fmt; | 1221 | const struct soc_camera_format_xlate *xlate = icd->current_fmt; |
| 1222 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); | 1222 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); |
| 1223 | struct device *dev = icd->parent; | 1223 | struct device *dev = icd->parent; |
diff --git a/drivers/media/platform/soc_camera/pxa_camera.c b/drivers/media/platform/soc_camera/pxa_camera.c index 1e3776d08dac..3434ffe79c6e 100644 --- a/drivers/media/platform/soc_camera/pxa_camera.c +++ b/drivers/media/platform/soc_camera/pxa_camera.c | |||
| @@ -1337,9 +1337,9 @@ static int pxa_camera_check_frame(u32 width, u32 height) | |||
| 1337 | } | 1337 | } |
| 1338 | 1338 | ||
| 1339 | static int pxa_camera_set_crop(struct soc_camera_device *icd, | 1339 | static int pxa_camera_set_crop(struct soc_camera_device *icd, |
| 1340 | struct v4l2_crop *a) | 1340 | const struct v4l2_crop *a) |
| 1341 | { | 1341 | { |
| 1342 | struct v4l2_rect *rect = &a->c; | 1342 | const struct v4l2_rect *rect = &a->c; |
| 1343 | struct device *dev = icd->parent; | 1343 | struct device *dev = icd->parent; |
| 1344 | struct soc_camera_host *ici = to_soc_camera_host(dev); | 1344 | struct soc_camera_host *ici = to_soc_camera_host(dev); |
| 1345 | struct pxa_camera_dev *pcdev = ici->priv; | 1345 | struct pxa_camera_dev *pcdev = ici->priv; |
diff --git a/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c b/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c index 0a24253dcda2..2d8861c0e8f2 100644 --- a/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c +++ b/drivers/media/platform/soc_camera/sh_mobile_ceu_camera.c | |||
| @@ -1182,13 +1182,13 @@ static void sh_mobile_ceu_put_formats(struct soc_camera_device *icd) | |||
| 1182 | } | 1182 | } |
| 1183 | 1183 | ||
| 1184 | /* Check if any dimension of r1 is smaller than respective one of r2 */ | 1184 | /* Check if any dimension of r1 is smaller than respective one of r2 */ |
| 1185 | static bool is_smaller(struct v4l2_rect *r1, struct v4l2_rect *r2) | 1185 | static bool is_smaller(const struct v4l2_rect *r1, const struct v4l2_rect *r2) |
| 1186 | { | 1186 | { |
| 1187 | return r1->width < r2->width || r1->height < r2->height; | 1187 | return r1->width < r2->width || r1->height < r2->height; |
| 1188 | } | 1188 | } |
| 1189 | 1189 | ||
| 1190 | /* Check if r1 fails to cover r2 */ | 1190 | /* Check if r1 fails to cover r2 */ |
| 1191 | static bool is_inside(struct v4l2_rect *r1, struct v4l2_rect *r2) | 1191 | static bool is_inside(const struct v4l2_rect *r1, const struct v4l2_rect *r2) |
| 1192 | { | 1192 | { |
| 1193 | return r1->left > r2->left || r1->top > r2->top || | 1193 | return r1->left > r2->left || r1->top > r2->top || |
| 1194 | r1->left + r1->width < r2->left + r2->width || | 1194 | r1->left + r1->width < r2->left + r2->width || |
| @@ -1263,7 +1263,7 @@ static void update_subrect(struct sh_mobile_ceu_cam *cam) | |||
| 1263 | * 3. if (2) failed, try to request the maximum image | 1263 | * 3. if (2) failed, try to request the maximum image |
| 1264 | */ | 1264 | */ |
| 1265 | static int client_s_crop(struct soc_camera_device *icd, struct v4l2_crop *crop, | 1265 | static int client_s_crop(struct soc_camera_device *icd, struct v4l2_crop *crop, |
| 1266 | const struct v4l2_crop *cam_crop) | 1266 | struct v4l2_crop *cam_crop) |
| 1267 | { | 1267 | { |
| 1268 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); | 1268 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); |
| 1269 | struct v4l2_rect *rect = &crop->c, *cam_rect = &cam_crop->c; | 1269 | struct v4l2_rect *rect = &crop->c, *cam_rect = &cam_crop->c; |
| @@ -1519,7 +1519,8 @@ static int client_scale(struct soc_camera_device *icd, | |||
| 1519 | static int sh_mobile_ceu_set_crop(struct soc_camera_device *icd, | 1519 | static int sh_mobile_ceu_set_crop(struct soc_camera_device *icd, |
| 1520 | const struct v4l2_crop *a) | 1520 | const struct v4l2_crop *a) |
| 1521 | { | 1521 | { |
| 1522 | struct v4l2_rect *rect = &a->c; | 1522 | struct v4l2_crop a_writable = *a; |
| 1523 | const struct v4l2_rect *rect = &a_writable.c; | ||
| 1523 | struct device *dev = icd->parent; | 1524 | struct device *dev = icd->parent; |
| 1524 | struct soc_camera_host *ici = to_soc_camera_host(dev); | 1525 | struct soc_camera_host *ici = to_soc_camera_host(dev); |
| 1525 | struct sh_mobile_ceu_dev *pcdev = ici->priv; | 1526 | struct sh_mobile_ceu_dev *pcdev = ici->priv; |
| @@ -1545,7 +1546,7 @@ static int sh_mobile_ceu_set_crop(struct soc_camera_device *icd, | |||
| 1545 | * 1. - 2. Apply iterative camera S_CROP for new input window, read back | 1546 | * 1. - 2. Apply iterative camera S_CROP for new input window, read back |
| 1546 | * actual camera rectangle. | 1547 | * actual camera rectangle. |
| 1547 | */ | 1548 | */ |
| 1548 | ret = client_s_crop(icd, a, &cam_crop); | 1549 | ret = client_s_crop(icd, &a_writable, &cam_crop); |
| 1549 | if (ret < 0) | 1550 | if (ret < 0) |
| 1550 | return ret; | 1551 | return ret; |
| 1551 | 1552 | ||
| @@ -1946,7 +1947,7 @@ static int sh_mobile_ceu_try_fmt(struct soc_camera_device *icd, | |||
| 1946 | } | 1947 | } |
| 1947 | 1948 | ||
| 1948 | static int sh_mobile_ceu_set_livecrop(struct soc_camera_device *icd, | 1949 | static int sh_mobile_ceu_set_livecrop(struct soc_camera_device *icd, |
| 1949 | struct v4l2_crop *a) | 1950 | const struct v4l2_crop *a) |
| 1950 | { | 1951 | { |
| 1951 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); | 1952 | struct v4l2_subdev *sd = soc_camera_to_subdev(icd); |
| 1952 | struct soc_camera_host *ici = to_soc_camera_host(icd->parent); | 1953 | struct soc_camera_host *ici = to_soc_camera_host(icd->parent); |
diff --git a/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c b/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c index 9859d2a2449b..ba51f65204de 100644 --- a/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c +++ b/drivers/media/usb/dvb-usb-v2/dvb_usb_core.c | |||
| @@ -283,14 +283,13 @@ static inline int dvb_usb_ctrl_feed(struct dvb_demux_feed *dvbdmxfeed, | |||
| 283 | 283 | ||
| 284 | /* activate the pid on the device pid filter */ | 284 | /* activate the pid on the device pid filter */ |
| 285 | if (adap->props->caps & DVB_USB_ADAP_HAS_PID_FILTER && | 285 | if (adap->props->caps & DVB_USB_ADAP_HAS_PID_FILTER && |
| 286 | adap->pid_filtering && | 286 | adap->pid_filtering && adap->props->pid_filter) { |
| 287 | adap->props->pid_filter) | ||
| 288 | ret = adap->props->pid_filter(adap, dvbdmxfeed->index, | 287 | ret = adap->props->pid_filter(adap, dvbdmxfeed->index, |
| 289 | dvbdmxfeed->pid, (count == 1) ? 1 : 0); | 288 | dvbdmxfeed->pid, (count == 1) ? 1 : 0); |
| 290 | if (ret < 0) | 289 | if (ret < 0) |
| 291 | dev_err(&d->udev->dev, "%s: pid_filter() " \ | 290 | dev_err(&d->udev->dev, "%s: pid_filter() failed=%d\n", |
| 292 | "failed=%d\n", KBUILD_MODNAME, | 291 | KBUILD_MODNAME, ret); |
| 293 | ret); | 292 | } |
| 294 | 293 | ||
| 295 | /* start feeding if it is first pid */ | 294 | /* start feeding if it is first pid */ |
| 296 | if (adap->feed_count == 1 && count == 1) { | 295 | if (adap->feed_count == 1 && count == 1) { |
diff --git a/drivers/media/usb/dvb-usb-v2/dvb_usb_urb.c b/drivers/media/usb/dvb-usb-v2/dvb_usb_urb.c index 0431beed0ef4..5716662b4834 100644 --- a/drivers/media/usb/dvb-usb-v2/dvb_usb_urb.c +++ b/drivers/media/usb/dvb-usb-v2/dvb_usb_urb.c | |||
| @@ -32,9 +32,7 @@ int dvb_usbv2_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, | |||
| 32 | return -EINVAL; | 32 | return -EINVAL; |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | ret = mutex_lock_interruptible(&d->usb_mutex); | 35 | mutex_lock(&d->usb_mutex); |
| 36 | if (ret < 0) | ||
| 37 | return ret; | ||
| 38 | 36 | ||
| 39 | dev_dbg(&d->udev->dev, "%s: >>> %*ph\n", __func__, wlen, wbuf); | 37 | dev_dbg(&d->udev->dev, "%s: >>> %*ph\n", __func__, wlen, wbuf); |
| 40 | 38 | ||
diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c index adabba8d28bc..093f1acce403 100644 --- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c +++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c | |||
| @@ -1346,6 +1346,10 @@ static const struct usb_device_id rtl28xxu_id_table[] = { | |||
| 1346 | &rtl2832u_props, "DigitalNow Quad DVB-T Receiver", NULL) }, | 1346 | &rtl2832u_props, "DigitalNow Quad DVB-T Receiver", NULL) }, |
| 1347 | { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d3, | 1347 | { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d3, |
| 1348 | &rtl2832u_props, "TerraTec Cinergy T Stick RC (Rev. 3)", NULL) }, | 1348 | &rtl2832u_props, "TerraTec Cinergy T Stick RC (Rev. 3)", NULL) }, |
| 1349 | { DVB_USB_DEVICE(USB_VID_DEXATEK, 0x1102, | ||
| 1350 | &rtl2832u_props, "Dexatek DK mini DVB-T Dongle", NULL) }, | ||
| 1351 | { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x00d7, | ||
| 1352 | &rtl2832u_props, "TerraTec Cinergy T Stick+", NULL) }, | ||
| 1349 | { } | 1353 | { } |
| 1350 | }; | 1354 | }; |
| 1351 | MODULE_DEVICE_TABLE(usb, rtl28xxu_id_table); | 1355 | MODULE_DEVICE_TABLE(usb, rtl28xxu_id_table); |
diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c index 1b48f2094806..f4f9bf84bc7b 100644 --- a/drivers/mfd/arizona-core.c +++ b/drivers/mfd/arizona-core.c | |||
| @@ -98,9 +98,9 @@ static irqreturn_t arizona_underclocked(int irq, void *data) | |||
| 98 | 98 | ||
| 99 | if (val & ARIZONA_AIF3_UNDERCLOCKED_STS) | 99 | if (val & ARIZONA_AIF3_UNDERCLOCKED_STS) |
| 100 | dev_err(arizona->dev, "AIF3 underclocked\n"); | 100 | dev_err(arizona->dev, "AIF3 underclocked\n"); |
| 101 | if (val & ARIZONA_AIF3_UNDERCLOCKED_STS) | ||
| 102 | dev_err(arizona->dev, "AIF3 underclocked\n"); | ||
| 103 | if (val & ARIZONA_AIF2_UNDERCLOCKED_STS) | 101 | if (val & ARIZONA_AIF2_UNDERCLOCKED_STS) |
| 102 | dev_err(arizona->dev, "AIF2 underclocked\n"); | ||
| 103 | if (val & ARIZONA_AIF1_UNDERCLOCKED_STS) | ||
| 104 | dev_err(arizona->dev, "AIF1 underclocked\n"); | 104 | dev_err(arizona->dev, "AIF1 underclocked\n"); |
| 105 | if (val & ARIZONA_ISRC2_UNDERCLOCKED_STS) | 105 | if (val & ARIZONA_ISRC2_UNDERCLOCKED_STS) |
| 106 | dev_err(arizona->dev, "ISRC2 underclocked\n"); | 106 | dev_err(arizona->dev, "ISRC2 underclocked\n"); |
| @@ -415,11 +415,19 @@ int __devinit arizona_dev_init(struct arizona *arizona) | |||
| 415 | 415 | ||
| 416 | /* If we have a /RESET GPIO we'll already be reset */ | 416 | /* If we have a /RESET GPIO we'll already be reset */ |
| 417 | if (!arizona->pdata.reset) { | 417 | if (!arizona->pdata.reset) { |
| 418 | regcache_mark_dirty(arizona->regmap); | ||
| 419 | |||
| 418 | ret = regmap_write(arizona->regmap, ARIZONA_SOFTWARE_RESET, 0); | 420 | ret = regmap_write(arizona->regmap, ARIZONA_SOFTWARE_RESET, 0); |
| 419 | if (ret != 0) { | 421 | if (ret != 0) { |
| 420 | dev_err(dev, "Failed to reset device: %d\n", ret); | 422 | dev_err(dev, "Failed to reset device: %d\n", ret); |
| 421 | goto err_reset; | 423 | goto err_reset; |
| 422 | } | 424 | } |
| 425 | |||
| 426 | ret = regcache_sync(arizona->regmap); | ||
| 427 | if (ret != 0) { | ||
| 428 | dev_err(dev, "Failed to sync device: %d\n", ret); | ||
| 429 | goto err_reset; | ||
| 430 | } | ||
| 423 | } | 431 | } |
| 424 | 432 | ||
| 425 | ret = arizona_wait_for_boot(arizona); | 433 | ret = arizona_wait_for_boot(arizona); |
| @@ -520,7 +528,7 @@ int __devinit arizona_dev_init(struct arizona *arizona) | |||
| 520 | break; | 528 | break; |
| 521 | case WM5110: | 529 | case WM5110: |
| 522 | ret = mfd_add_devices(arizona->dev, -1, wm5110_devs, | 530 | ret = mfd_add_devices(arizona->dev, -1, wm5110_devs, |
| 523 | ARRAY_SIZE(wm5102_devs), NULL, 0, NULL); | 531 | ARRAY_SIZE(wm5110_devs), NULL, 0, NULL); |
| 524 | break; | 532 | break; |
| 525 | } | 533 | } |
| 526 | 534 | ||
diff --git a/drivers/mfd/arizona-irq.c b/drivers/mfd/arizona-irq.c index ef0f2d001df2..b1b009177405 100644 --- a/drivers/mfd/arizona-irq.c +++ b/drivers/mfd/arizona-irq.c | |||
| @@ -178,6 +178,7 @@ int arizona_irq_init(struct arizona *arizona) | |||
| 178 | 178 | ||
| 179 | switch (arizona->rev) { | 179 | switch (arizona->rev) { |
| 180 | case 0: | 180 | case 0: |
| 181 | case 1: | ||
| 181 | ctrlif_error = false; | 182 | ctrlif_error = false; |
| 182 | break; | 183 | break; |
| 183 | default: | 184 | default: |
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c index 4ae642320205..a071a8643a47 100644 --- a/drivers/mfd/twl-core.c +++ b/drivers/mfd/twl-core.c | |||
| @@ -671,7 +671,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base, | |||
| 671 | } | 671 | } |
| 672 | 672 | ||
| 673 | if (IS_ENABLED(CONFIG_PWM_TWL6030) && twl_class_is_6030()) { | 673 | if (IS_ENABLED(CONFIG_PWM_TWL6030) && twl_class_is_6030()) { |
| 674 | child = add_child(TWL6030_MODULE_ID1, "twl6030-pwm", NULL, 0, | 674 | child = add_child(SUB_CHIP_ID1, "twl6030-pwm", NULL, 0, |
| 675 | false, 0, 0); | 675 | false, 0, 0); |
| 676 | if (IS_ERR(child)) | 676 | if (IS_ERR(child)) |
| 677 | return PTR_ERR(child); | 677 | return PTR_ERR(child); |
diff --git a/drivers/mfd/twl4030-irq.c b/drivers/mfd/twl4030-irq.c index ad733d76207a..cdd1173ed4e9 100644 --- a/drivers/mfd/twl4030-irq.c +++ b/drivers/mfd/twl4030-irq.c | |||
| @@ -672,7 +672,8 @@ int twl4030_sih_setup(struct device *dev, int module, int irq_base) | |||
| 672 | irq = sih_mod + twl4030_irq_base; | 672 | irq = sih_mod + twl4030_irq_base; |
| 673 | irq_set_handler_data(irq, agent); | 673 | irq_set_handler_data(irq, agent); |
| 674 | agent->irq_name = kasprintf(GFP_KERNEL, "twl4030_%s", sih->name); | 674 | agent->irq_name = kasprintf(GFP_KERNEL, "twl4030_%s", sih->name); |
| 675 | status = request_threaded_irq(irq, NULL, handle_twl4030_sih, 0, | 675 | status = request_threaded_irq(irq, NULL, handle_twl4030_sih, |
| 676 | IRQF_EARLY_RESUME, | ||
| 676 | agent->irq_name ?: sih->name, NULL); | 677 | agent->irq_name ?: sih->name, NULL); |
| 677 | 678 | ||
| 678 | dev_info(dev, "%s (irq %d) chaining IRQs %d..%d\n", sih->name, | 679 | dev_info(dev, "%s (irq %d) chaining IRQs %d..%d\n", sih->name, |
diff --git a/drivers/mfd/wm5102-tables.c b/drivers/mfd/wm5102-tables.c index 01b9255ed631..14490cc785d2 100644 --- a/drivers/mfd/wm5102-tables.c +++ b/drivers/mfd/wm5102-tables.c | |||
| @@ -43,6 +43,7 @@ static const struct reg_default wm5102_reva_patch[] = { | |||
| 43 | { 0x479, 0x0A30 }, | 43 | { 0x479, 0x0A30 }, |
| 44 | { 0x47B, 0x0810 }, | 44 | { 0x47B, 0x0810 }, |
| 45 | { 0x47D, 0x0510 }, | 45 | { 0x47D, 0x0510 }, |
| 46 | { 0x4D1, 0x017F }, | ||
| 46 | { 0x500, 0x000D }, | 47 | { 0x500, 0x000D }, |
| 47 | { 0x507, 0x1820 }, | 48 | { 0x507, 0x1820 }, |
| 48 | { 0x508, 0x1820 }, | 49 | { 0x508, 0x1820 }, |
| @@ -52,524 +53,6 @@ static const struct reg_default wm5102_reva_patch[] = { | |||
| 52 | { 0x580, 0x000D }, | 53 | { 0x580, 0x000D }, |
| 53 | { 0x587, 0x1820 }, | 54 | { 0x587, 0x1820 }, |
| 54 | { 0x588, 0x1820 }, | 55 | { 0x588, 0x1820 }, |
| 55 | { 0x101, 0x8140 }, | ||
| 56 | { 0x3000, 0x2225 }, | ||
| 57 | { 0x3001, 0x3a03 }, | ||
| 58 | { 0x3002, 0x0225 }, | ||
| 59 | { 0x3003, 0x0801 }, | ||
| 60 | { 0x3004, 0x6249 }, | ||
| 61 | { 0x3005, 0x0c04 }, | ||
| 62 | { 0x3006, 0x0225 }, | ||
| 63 | { 0x3007, 0x5901 }, | ||
| 64 | { 0x3008, 0xe249 }, | ||
| 65 | { 0x3009, 0x030d }, | ||
| 66 | { 0x300a, 0x0249 }, | ||
| 67 | { 0x300b, 0x2c01 }, | ||
| 68 | { 0x300c, 0xe249 }, | ||
| 69 | { 0x300d, 0x4342 }, | ||
| 70 | { 0x300e, 0xe249 }, | ||
| 71 | { 0x300f, 0x73c0 }, | ||
| 72 | { 0x3010, 0x4249 }, | ||
| 73 | { 0x3011, 0x0c00 }, | ||
| 74 | { 0x3012, 0x0225 }, | ||
| 75 | { 0x3013, 0x1f01 }, | ||
| 76 | { 0x3014, 0x0225 }, | ||
| 77 | { 0x3015, 0x1e01 }, | ||
| 78 | { 0x3016, 0x0225 }, | ||
| 79 | { 0x3017, 0xfa00 }, | ||
| 80 | { 0x3018, 0x0000 }, | ||
| 81 | { 0x3019, 0xf000 }, | ||
| 82 | { 0x301a, 0x0000 }, | ||
| 83 | { 0x301b, 0xf000 }, | ||
| 84 | { 0x301c, 0x0000 }, | ||
| 85 | { 0x301d, 0xf000 }, | ||
| 86 | { 0x301e, 0x0000 }, | ||
| 87 | { 0x301f, 0xf000 }, | ||
| 88 | { 0x3020, 0x0000 }, | ||
| 89 | { 0x3021, 0xf000 }, | ||
| 90 | { 0x3022, 0x0000 }, | ||
| 91 | { 0x3023, 0xf000 }, | ||
| 92 | { 0x3024, 0x0000 }, | ||
| 93 | { 0x3025, 0xf000 }, | ||
| 94 | { 0x3026, 0x0000 }, | ||
| 95 | { 0x3027, 0xf000 }, | ||
| 96 | { 0x3028, 0x0000 }, | ||
| 97 | { 0x3029, 0xf000 }, | ||
| 98 | { 0x302a, 0x0000 }, | ||
| 99 | { 0x302b, 0xf000 }, | ||
| 100 | { 0x302c, 0x0000 }, | ||
| 101 | { 0x302d, 0xf000 }, | ||
| 102 | { 0x302e, 0x0000 }, | ||
| 103 | { 0x302f, 0xf000 }, | ||
| 104 | { 0x3030, 0x0225 }, | ||
| 105 | { 0x3031, 0x1a01 }, | ||
| 106 | { 0x3032, 0x0225 }, | ||
| 107 | { 0x3033, 0x1e00 }, | ||
| 108 | { 0x3034, 0x0225 }, | ||
| 109 | { 0x3035, 0x1f00 }, | ||
| 110 | { 0x3036, 0x6225 }, | ||
| 111 | { 0x3037, 0xf800 }, | ||
| 112 | { 0x3038, 0x0000 }, | ||
| 113 | { 0x3039, 0xf000 }, | ||
| 114 | { 0x303a, 0x0000 }, | ||
| 115 | { 0x303b, 0xf000 }, | ||
| 116 | { 0x303c, 0x0000 }, | ||
| 117 | { 0x303d, 0xf000 }, | ||
| 118 | { 0x303e, 0x0000 }, | ||
| 119 | { 0x303f, 0xf000 }, | ||
| 120 | { 0x3040, 0x2226 }, | ||
| 121 | { 0x3041, 0x3a03 }, | ||
| 122 | { 0x3042, 0x0226 }, | ||
| 123 | { 0x3043, 0x0801 }, | ||
| 124 | { 0x3044, 0x6249 }, | ||
| 125 | { 0x3045, 0x0c06 }, | ||
| 126 | { 0x3046, 0x0226 }, | ||
| 127 | { 0x3047, 0x5901 }, | ||
| 128 | { 0x3048, 0xe249 }, | ||
| 129 | { 0x3049, 0x030d }, | ||
| 130 | { 0x304a, 0x0249 }, | ||
| 131 | { 0x304b, 0x2c01 }, | ||
| 132 | { 0x304c, 0xe249 }, | ||
| 133 | { 0x304d, 0x4342 }, | ||
| 134 | { 0x304e, 0xe249 }, | ||
| 135 | { 0x304f, 0x73c0 }, | ||
| 136 | { 0x3050, 0x4249 }, | ||
| 137 | { 0x3051, 0x0c00 }, | ||
| 138 | { 0x3052, 0x0226 }, | ||
| 139 | { 0x3053, 0x1f01 }, | ||
| 140 | { 0x3054, 0x0226 }, | ||
| 141 | { 0x3055, 0x1e01 }, | ||
| 142 | { 0x3056, 0x0226 }, | ||
| 143 | { 0x3057, 0xfa00 }, | ||
| 144 | { 0x3058, 0x0000 }, | ||
| 145 | { 0x3059, 0xf000 }, | ||
| 146 | { 0x305a, 0x0000 }, | ||
| 147 | { 0x305b, 0xf000 }, | ||
| 148 | { 0x305c, 0x0000 }, | ||
| 149 | { 0x305d, 0xf000 }, | ||
| 150 | { 0x305e, 0x0000 }, | ||
| 151 | { 0x305f, 0xf000 }, | ||
| 152 | { 0x3060, 0x0000 }, | ||
| 153 | { 0x3061, 0xf000 }, | ||
| 154 | { 0x3062, 0x0000 }, | ||
| 155 | { 0x3063, 0xf000 }, | ||
| 156 | { 0x3064, 0x0000 }, | ||
| 157 | { 0x3065, 0xf000 }, | ||
| 158 | { 0x3066, 0x0000 }, | ||
| 159 | { 0x3067, 0xf000 }, | ||
| 160 | { 0x3068, 0x0000 }, | ||
| 161 | { 0x3069, 0xf000 }, | ||
| 162 | { 0x306a, 0x0000 }, | ||
| 163 | { 0x306b, 0xf000 }, | ||
| 164 | { 0x306c, 0x0000 }, | ||
| 165 | { 0x306d, 0xf000 }, | ||
| 166 | { 0x306e, 0x0000 }, | ||
| 167 | { 0x306f, 0xf000 }, | ||
| 168 | { 0x3070, 0x0226 }, | ||
| 169 | { 0x3071, 0x1a01 }, | ||
| 170 | { 0x3072, 0x0226 }, | ||
| 171 | { 0x3073, 0x1e00 }, | ||
| 172 | { 0x3074, 0x0226 }, | ||
| 173 | { 0x3075, 0x1f00 }, | ||
| 174 | { 0x3076, 0x6226 }, | ||
| 175 | { 0x3077, 0xf800 }, | ||
| 176 | { 0x3078, 0x0000 }, | ||
| 177 | { 0x3079, 0xf000 }, | ||
| 178 | { 0x307a, 0x0000 }, | ||
| 179 | { 0x307b, 0xf000 }, | ||
| 180 | { 0x307c, 0x0000 }, | ||
| 181 | { 0x307d, 0xf000 }, | ||
| 182 | { 0x307e, 0x0000 }, | ||
| 183 | { 0x307f, 0xf000 }, | ||
| 184 | { 0x3080, 0x2227 }, | ||
| 185 | { 0x3081, 0x3a03 }, | ||
| 186 | { 0x3082, 0x0227 }, | ||
| 187 | { 0x3083, 0x0801 }, | ||
| 188 | { 0x3084, 0x6255 }, | ||
| 189 | { 0x3085, 0x0c04 }, | ||
| 190 | { 0x3086, 0x0227 }, | ||
| 191 | { 0x3087, 0x5901 }, | ||
| 192 | { 0x3088, 0xe255 }, | ||
| 193 | { 0x3089, 0x030d }, | ||
| 194 | { 0x308a, 0x0255 }, | ||
| 195 | { 0x308b, 0x2c01 }, | ||
| 196 | { 0x308c, 0xe255 }, | ||
| 197 | { 0x308d, 0x4342 }, | ||
| 198 | { 0x308e, 0xe255 }, | ||
| 199 | { 0x308f, 0x73c0 }, | ||
| 200 | { 0x3090, 0x4255 }, | ||
| 201 | { 0x3091, 0x0c00 }, | ||
| 202 | { 0x3092, 0x0227 }, | ||
| 203 | { 0x3093, 0x1f01 }, | ||
| 204 | { 0x3094, 0x0227 }, | ||
| 205 | { 0x3095, 0x1e01 }, | ||
| 206 | { 0x3096, 0x0227 }, | ||
| 207 | { 0x3097, 0xfa00 }, | ||
| 208 | { 0x3098, 0x0000 }, | ||
| 209 | { 0x3099, 0xf000 }, | ||
| 210 | { 0x309a, 0x0000 }, | ||
| 211 | { 0x309b, 0xf000 }, | ||
| 212 | { 0x309c, 0x0000 }, | ||
| 213 | { 0x309d, 0xf000 }, | ||
| 214 | { 0x309e, 0x0000 }, | ||
| 215 | { 0x309f, 0xf000 }, | ||
| 216 | { 0x30a0, 0x0000 }, | ||
| 217 | { 0x30a1, 0xf000 }, | ||
| 218 | { 0x30a2, 0x0000 }, | ||
| 219 | { 0x30a3, 0xf000 }, | ||
| 220 | { 0x30a4, 0x0000 }, | ||
| 221 | { 0x30a5, 0xf000 }, | ||
| 222 | { 0x30a6, 0x0000 }, | ||
| 223 | { 0x30a7, 0xf000 }, | ||
| 224 | { 0x30a8, 0x0000 }, | ||
| 225 | { 0x30a9, 0xf000 }, | ||
| 226 | { 0x30aa, 0x0000 }, | ||
| 227 | { 0x30ab, 0xf000 }, | ||
| 228 | { 0x30ac, 0x0000 }, | ||
| 229 | { 0x30ad, 0xf000 }, | ||
| 230 | { 0x30ae, 0x0000 }, | ||
| 231 | { 0x30af, 0xf000 }, | ||
| 232 | { 0x30b0, 0x0227 }, | ||
| 233 | { 0x30b1, 0x1a01 }, | ||
| 234 | { 0x30b2, 0x0227 }, | ||
| 235 | { 0x30b3, 0x1e00 }, | ||
| 236 | { 0x30b4, 0x0227 }, | ||
| 237 | { 0x30b5, 0x1f00 }, | ||
| 238 | { 0x30b6, 0x6227 }, | ||
| 239 | { 0x30b7, 0xf800 }, | ||
| 240 | { 0x30b8, 0x0000 }, | ||
| 241 | { 0x30b9, 0xf000 }, | ||
| 242 | { 0x30ba, 0x0000 }, | ||
| 243 | { 0x30bb, 0xf000 }, | ||
| 244 | { 0x30bc, 0x0000 }, | ||
| 245 | { 0x30bd, 0xf000 }, | ||
| 246 | { 0x30be, 0x0000 }, | ||
| 247 | { 0x30bf, 0xf000 }, | ||
| 248 | { 0x30c0, 0x2228 }, | ||
| 249 | { 0x30c1, 0x3a03 }, | ||
| 250 | { 0x30c2, 0x0228 }, | ||
| 251 | { 0x30c3, 0x0801 }, | ||
| 252 | { 0x30c4, 0x6255 }, | ||
| 253 | { 0x30c5, 0x0c06 }, | ||
| 254 | { 0x30c6, 0x0228 }, | ||
| 255 | { 0x30c7, 0x5901 }, | ||
| 256 | { 0x30c8, 0xe255 }, | ||
| 257 | { 0x30c9, 0x030d }, | ||
| 258 | { 0x30ca, 0x0255 }, | ||
| 259 | { 0x30cb, 0x2c01 }, | ||
| 260 | { 0x30cc, 0xe255 }, | ||
| 261 | { 0x30cd, 0x4342 }, | ||
| 262 | { 0x30ce, 0xe255 }, | ||
| 263 | { 0x30cf, 0x73c0 }, | ||
| 264 | { 0x30d0, 0x4255 }, | ||
| 265 | { 0x30d1, 0x0c00 }, | ||
| 266 | { 0x30d2, 0x0228 }, | ||
| 267 | { 0x30d3, 0x1f01 }, | ||
| 268 | { 0x30d4, 0x0228 }, | ||
| 269 | { 0x30d5, 0x1e01 }, | ||
| 270 | { 0x30d6, 0x0228 }, | ||
| 271 | { 0x30d7, 0xfa00 }, | ||
| 272 | { 0x30d8, 0x0000 }, | ||
| 273 | { 0x30d9, 0xf000 }, | ||
| 274 | { 0x30da, 0x0000 }, | ||
| 275 | { 0x30db, 0xf000 }, | ||
| 276 | { 0x30dc, 0x0000 }, | ||
| 277 | { 0x30dd, 0xf000 }, | ||
| 278 | { 0x30de, 0x0000 }, | ||
| 279 | { 0x30df, 0xf000 }, | ||
| 280 | { 0x30e0, 0x0000 }, | ||
| 281 | { 0x30e1, 0xf000 }, | ||
| 282 | { 0x30e2, 0x0000 }, | ||
| 283 | { 0x30e3, 0xf000 }, | ||
| 284 | { 0x30e4, 0x0000 }, | ||
| 285 | { 0x30e5, 0xf000 }, | ||
| 286 | { 0x30e6, 0x0000 }, | ||
| 287 | { 0x30e7, 0xf000 }, | ||
| 288 | { 0x30e8, 0x0000 }, | ||
| 289 | { 0x30e9, 0xf000 }, | ||
| 290 | { 0x30ea, 0x0000 }, | ||
| 291 | { 0x30eb, 0xf000 }, | ||
| 292 | { 0x30ec, 0x0000 }, | ||
| 293 | { 0x30ed, 0xf000 }, | ||
| 294 | { 0x30ee, 0x0000 }, | ||
| 295 | { 0x30ef, 0xf000 }, | ||
| 296 | { 0x30f0, 0x0228 }, | ||
| 297 | { 0x30f1, 0x1a01 }, | ||
| 298 | { 0x30f2, 0x0228 }, | ||
| 299 | { 0x30f3, 0x1e00 }, | ||
| 300 | { 0x30f4, 0x0228 }, | ||
| 301 | { 0x30f5, 0x1f00 }, | ||
| 302 | { 0x30f6, 0x6228 }, | ||
| 303 | { 0x30f7, 0xf800 }, | ||
| 304 | { 0x30f8, 0x0000 }, | ||
| 305 | { 0x30f9, 0xf000 }, | ||
| 306 | { 0x30fa, 0x0000 }, | ||
| 307 | { 0x30fb, 0xf000 }, | ||
| 308 | { 0x30fc, 0x0000 }, | ||
| 309 | { 0x30fd, 0xf000 }, | ||
| 310 | { 0x30fe, 0x0000 }, | ||
| 311 | { 0x30ff, 0xf000 }, | ||
| 312 | { 0x3100, 0x222b }, | ||
| 313 | { 0x3101, 0x3a03 }, | ||
| 314 | { 0x3102, 0x222b }, | ||
| 315 | { 0x3103, 0x5803 }, | ||
| 316 | { 0x3104, 0xe26f }, | ||
| 317 | { 0x3105, 0x030d }, | ||
| 318 | { 0x3106, 0x626f }, | ||
| 319 | { 0x3107, 0x2c01 }, | ||
| 320 | { 0x3108, 0xe26f }, | ||
| 321 | { 0x3109, 0x4342 }, | ||
| 322 | { 0x310a, 0xe26f }, | ||
| 323 | { 0x310b, 0x73c0 }, | ||
| 324 | { 0x310c, 0x026f }, | ||
| 325 | { 0x310d, 0x0c00 }, | ||
| 326 | { 0x310e, 0x022b }, | ||
| 327 | { 0x310f, 0x1f01 }, | ||
| 328 | { 0x3110, 0x022b }, | ||
| 329 | { 0x3111, 0x1e01 }, | ||
| 330 | { 0x3112, 0x022b }, | ||
| 331 | { 0x3113, 0xfa00 }, | ||
| 332 | { 0x3114, 0x0000 }, | ||
| 333 | { 0x3115, 0xf000 }, | ||
| 334 | { 0x3116, 0x0000 }, | ||
| 335 | { 0x3117, 0xf000 }, | ||
| 336 | { 0x3118, 0x0000 }, | ||
| 337 | { 0x3119, 0xf000 }, | ||
| 338 | { 0x311a, 0x0000 }, | ||
| 339 | { 0x311b, 0xf000 }, | ||
| 340 | { 0x311c, 0x0000 }, | ||
| 341 | { 0x311d, 0xf000 }, | ||
| 342 | { 0x311e, 0x0000 }, | ||
| 343 | { 0x311f, 0xf000 }, | ||
| 344 | { 0x3120, 0x022b }, | ||
| 345 | { 0x3121, 0x0a01 }, | ||
| 346 | { 0x3122, 0x022b }, | ||
| 347 | { 0x3123, 0x1e00 }, | ||
| 348 | { 0x3124, 0x022b }, | ||
| 349 | { 0x3125, 0x1f00 }, | ||
| 350 | { 0x3126, 0x622b }, | ||
| 351 | { 0x3127, 0xf800 }, | ||
| 352 | { 0x3128, 0x0000 }, | ||
| 353 | { 0x3129, 0xf000 }, | ||
| 354 | { 0x312a, 0x0000 }, | ||
| 355 | { 0x312b, 0xf000 }, | ||
| 356 | { 0x312c, 0x0000 }, | ||
| 357 | { 0x312d, 0xf000 }, | ||
| 358 | { 0x312e, 0x0000 }, | ||
| 359 | { 0x312f, 0xf000 }, | ||
| 360 | { 0x3130, 0x0000 }, | ||
| 361 | { 0x3131, 0xf000 }, | ||
| 362 | { 0x3132, 0x0000 }, | ||
| 363 | { 0x3133, 0xf000 }, | ||
| 364 | { 0x3134, 0x0000 }, | ||
| 365 | { 0x3135, 0xf000 }, | ||
| 366 | { 0x3136, 0x0000 }, | ||
| 367 | { 0x3137, 0xf000 }, | ||
| 368 | { 0x3138, 0x0000 }, | ||
| 369 | { 0x3139, 0xf000 }, | ||
| 370 | { 0x313a, 0x0000 }, | ||
| 371 | { 0x313b, 0xf000 }, | ||
| 372 | { 0x313c, 0x0000 }, | ||
| 373 | { 0x313d, 0xf000 }, | ||
| 374 | { 0x313e, 0x0000 }, | ||
| 375 | { 0x313f, 0xf000 }, | ||
| 376 | { 0x3140, 0x0000 }, | ||
| 377 | { 0x3141, 0xf000 }, | ||
| 378 | { 0x3142, 0x0000 }, | ||
| 379 | { 0x3143, 0xf000 }, | ||
| 380 | { 0x3144, 0x0000 }, | ||
| 381 | { 0x3145, 0xf000 }, | ||
| 382 | { 0x3146, 0x0000 }, | ||
| 383 | { 0x3147, 0xf000 }, | ||
| 384 | { 0x3148, 0x0000 }, | ||
| 385 | { 0x3149, 0xf000 }, | ||
| 386 | { 0x314a, 0x0000 }, | ||
| 387 | { 0x314b, 0xf000 }, | ||
| 388 | { 0x314c, 0x0000 }, | ||
| 389 | { 0x314d, 0xf000 }, | ||
| 390 | { 0x314e, 0x0000 }, | ||
| 391 | { 0x314f, 0xf000 }, | ||
| 392 | { 0x3150, 0x0000 }, | ||
| 393 | { 0x3151, 0xf000 }, | ||
| 394 | { 0x3152, 0x0000 }, | ||
| 395 | { 0x3153, 0xf000 }, | ||
| 396 | { 0x3154, 0x0000 }, | ||
| 397 | { 0x3155, 0xf000 }, | ||
| 398 | { 0x3156, 0x0000 }, | ||
| 399 | { 0x3157, 0xf000 }, | ||
| 400 | { 0x3158, 0x0000 }, | ||
| 401 | { 0x3159, 0xf000 }, | ||
| 402 | { 0x315a, 0x0000 }, | ||
| 403 | { 0x315b, 0xf000 }, | ||
| 404 | { 0x315c, 0x0000 }, | ||
| 405 | { 0x315d, 0xf000 }, | ||
| 406 | { 0x315e, 0x0000 }, | ||
| 407 | { 0x315f, 0xf000 }, | ||
| 408 | { 0x3160, 0x0000 }, | ||
| 409 | { 0x3161, 0xf000 }, | ||
| 410 | { 0x3162, 0x0000 }, | ||
| 411 | { 0x3163, 0xf000 }, | ||
| 412 | { 0x3164, 0x0000 }, | ||
| 413 | { 0x3165, 0xf000 }, | ||
| 414 | { 0x3166, 0x0000 }, | ||
| 415 | { 0x3167, 0xf000 }, | ||
| 416 | { 0x3168, 0x0000 }, | ||
| 417 | { 0x3169, 0xf000 }, | ||
| 418 | { 0x316a, 0x0000 }, | ||
| 419 | { 0x316b, 0xf000 }, | ||
| 420 | { 0x316c, 0x0000 }, | ||
| 421 | { 0x316d, 0xf000 }, | ||
| 422 | { 0x316e, 0x0000 }, | ||
| 423 | { 0x316f, 0xf000 }, | ||
| 424 | { 0x3170, 0x0000 }, | ||
| 425 | { 0x3171, 0xf000 }, | ||
| 426 | { 0x3172, 0x0000 }, | ||
| 427 | { 0x3173, 0xf000 }, | ||
| 428 | { 0x3174, 0x0000 }, | ||
| 429 | { 0x3175, 0xf000 }, | ||
| 430 | { 0x3176, 0x0000 }, | ||
| 431 | { 0x3177, 0xf000 }, | ||
| 432 | { 0x3178, 0x0000 }, | ||
| 433 | { 0x3179, 0xf000 }, | ||
| 434 | { 0x317a, 0x0000 }, | ||
| 435 | { 0x317b, 0xf000 }, | ||
| 436 | { 0x317c, 0x0000 }, | ||
| 437 | { 0x317d, 0xf000 }, | ||
| 438 | { 0x317e, 0x0000 }, | ||
| 439 | { 0x317f, 0xf000 }, | ||
| 440 | { 0x3180, 0x2001 }, | ||
| 441 | { 0x3181, 0xf101 }, | ||
| 442 | { 0x3182, 0x0000 }, | ||
| 443 | { 0x3183, 0xf000 }, | ||
| 444 | { 0x3184, 0x0000 }, | ||
| 445 | { 0x3185, 0xf000 }, | ||
| 446 | { 0x3186, 0x0000 }, | ||
| 447 | { 0x3187, 0xf000 }, | ||
| 448 | { 0x3188, 0x0000 }, | ||
| 449 | { 0x3189, 0xf000 }, | ||
| 450 | { 0x318a, 0x0000 }, | ||
| 451 | { 0x318b, 0xf000 }, | ||
| 452 | { 0x318c, 0x0000 }, | ||
| 453 | { 0x318d, 0xf000 }, | ||
| 454 | { 0x318e, 0x0000 }, | ||
| 455 | { 0x318f, 0xf000 }, | ||
| 456 | { 0x3190, 0x0000 }, | ||
| 457 | { 0x3191, 0xf000 }, | ||
| 458 | { 0x3192, 0x0000 }, | ||
| 459 | { 0x3193, 0xf000 }, | ||
| 460 | { 0x3194, 0x0000 }, | ||
| 461 | { 0x3195, 0xf000 }, | ||
| 462 | { 0x3196, 0x0000 }, | ||
| 463 | { 0x3197, 0xf000 }, | ||
| 464 | { 0x3198, 0x0000 }, | ||
| 465 | { 0x3199, 0xf000 }, | ||
| 466 | { 0x319a, 0x0000 }, | ||
| 467 | { 0x319b, 0xf000 }, | ||
| 468 | { 0x319c, 0x0000 }, | ||
| 469 | { 0x319d, 0xf000 }, | ||
| 470 | { 0x319e, 0x0000 }, | ||
| 471 | { 0x319f, 0xf000 }, | ||
| 472 | { 0x31a0, 0x0000 }, | ||
| 473 | { 0x31a1, 0xf000 }, | ||
| 474 | { 0x31a2, 0x0000 }, | ||
| 475 | { 0x31a3, 0xf000 }, | ||
| 476 | { 0x31a4, 0x0000 }, | ||
| 477 | { 0x31a5, 0xf000 }, | ||
| 478 | { 0x31a6, 0x0000 }, | ||
| 479 | { 0x31a7, 0xf000 }, | ||
| 480 | { 0x31a8, 0x0000 }, | ||
| 481 | { 0x31a9, 0xf000 }, | ||
| 482 | { 0x31aa, 0x0000 }, | ||
| 483 | { 0x31ab, 0xf000 }, | ||
| 484 | { 0x31ac, 0x0000 }, | ||
| 485 | { 0x31ad, 0xf000 }, | ||
| 486 | { 0x31ae, 0x0000 }, | ||
| 487 | { 0x31af, 0xf000 }, | ||
| 488 | { 0x31b0, 0x0000 }, | ||
| 489 | { 0x31b1, 0xf000 }, | ||
| 490 | { 0x31b2, 0x0000 }, | ||
| 491 | { 0x31b3, 0xf000 }, | ||
| 492 | { 0x31b4, 0x0000 }, | ||
| 493 | { 0x31b5, 0xf000 }, | ||
| 494 | { 0x31b6, 0x0000 }, | ||
| 495 | { 0x31b7, 0xf000 }, | ||
| 496 | { 0x31b8, 0x0000 }, | ||
| 497 | { 0x31b9, 0xf000 }, | ||
| 498 | { 0x31ba, 0x0000 }, | ||
| 499 | { 0x31bb, 0xf000 }, | ||
| 500 | { 0x31bc, 0x0000 }, | ||
| 501 | { 0x31bd, 0xf000 }, | ||
| 502 | { 0x31be, 0x0000 }, | ||
| 503 | { 0x31bf, 0xf000 }, | ||
| 504 | { 0x31c0, 0x0000 }, | ||
| 505 | { 0x31c1, 0xf000 }, | ||
| 506 | { 0x31c2, 0x0000 }, | ||
| 507 | { 0x31c3, 0xf000 }, | ||
| 508 | { 0x31c4, 0x0000 }, | ||
| 509 | { 0x31c5, 0xf000 }, | ||
| 510 | { 0x31c6, 0x0000 }, | ||
| 511 | { 0x31c7, 0xf000 }, | ||
| 512 | { 0x31c8, 0x0000 }, | ||
| 513 | { 0x31c9, 0xf000 }, | ||
| 514 | { 0x31ca, 0x0000 }, | ||
| 515 | { 0x31cb, 0xf000 }, | ||
| 516 | { 0x31cc, 0x0000 }, | ||
| 517 | { 0x31cd, 0xf000 }, | ||
| 518 | { 0x31ce, 0x0000 }, | ||
| 519 | { 0x31cf, 0xf000 }, | ||
| 520 | { 0x31d0, 0x0000 }, | ||
| 521 | { 0x31d1, 0xf000 }, | ||
| 522 | { 0x31d2, 0x0000 }, | ||
| 523 | { 0x31d3, 0xf000 }, | ||
| 524 | { 0x31d4, 0x0000 }, | ||
| 525 | { 0x31d5, 0xf000 }, | ||
| 526 | { 0x31d6, 0x0000 }, | ||
| 527 | { 0x31d7, 0xf000 }, | ||
| 528 | { 0x31d8, 0x0000 }, | ||
| 529 | { 0x31d9, 0xf000 }, | ||
| 530 | { 0x31da, 0x0000 }, | ||
| 531 | { 0x31db, 0xf000 }, | ||
| 532 | { 0x31dc, 0x0000 }, | ||
| 533 | { 0x31dd, 0xf000 }, | ||
| 534 | { 0x31de, 0x0000 }, | ||
| 535 | { 0x31df, 0xf000 }, | ||
| 536 | { 0x31e0, 0x0000 }, | ||
| 537 | { 0x31e1, 0xf000 }, | ||
| 538 | { 0x31e2, 0x0000 }, | ||
| 539 | { 0x31e3, 0xf000 }, | ||
| 540 | { 0x31e4, 0x0000 }, | ||
| 541 | { 0x31e5, 0xf000 }, | ||
| 542 | { 0x31e6, 0x0000 }, | ||
| 543 | { 0x31e7, 0xf000 }, | ||
| 544 | { 0x31e8, 0x0000 }, | ||
| 545 | { 0x31e9, 0xf000 }, | ||
| 546 | { 0x31ea, 0x0000 }, | ||
| 547 | { 0x31eb, 0xf000 }, | ||
| 548 | { 0x31ec, 0x0000 }, | ||
| 549 | { 0x31ed, 0xf000 }, | ||
| 550 | { 0x31ee, 0x0000 }, | ||
| 551 | { 0x31ef, 0xf000 }, | ||
| 552 | { 0x31f0, 0x0000 }, | ||
| 553 | { 0x31f1, 0xf000 }, | ||
| 554 | { 0x31f2, 0x0000 }, | ||
| 555 | { 0x31f3, 0xf000 }, | ||
| 556 | { 0x31f4, 0x0000 }, | ||
| 557 | { 0x31f5, 0xf000 }, | ||
| 558 | { 0x31f6, 0x0000 }, | ||
| 559 | { 0x31f7, 0xf000 }, | ||
| 560 | { 0x31f8, 0x0000 }, | ||
| 561 | { 0x31f9, 0xf000 }, | ||
| 562 | { 0x31fa, 0x0000 }, | ||
| 563 | { 0x31fb, 0xf000 }, | ||
| 564 | { 0x31fc, 0x0000 }, | ||
| 565 | { 0x31fd, 0xf000 }, | ||
| 566 | { 0x31fe, 0x0000 }, | ||
| 567 | { 0x31ff, 0xf000 }, | ||
| 568 | { 0x024d, 0xff50 }, | ||
| 569 | { 0x0252, 0xff50 }, | ||
| 570 | { 0x0259, 0x0112 }, | ||
| 571 | { 0x025e, 0x0112 }, | ||
| 572 | { 0x101, 0x0304 }, | ||
| 573 | { 0x80, 0x0000 }, | 56 | { 0x80, 0x0000 }, |
| 574 | }; | 57 | }; |
| 575 | 58 | ||
diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c index a54dd5d7a5f9..c9ec725884e5 100644 --- a/drivers/mmc/host/sdhci-s3c.c +++ b/drivers/mmc/host/sdhci-s3c.c | |||
| @@ -373,18 +373,25 @@ static struct sdhci_ops sdhci_s3c_ops = { | |||
| 373 | static void sdhci_s3c_notify_change(struct platform_device *dev, int state) | 373 | static void sdhci_s3c_notify_change(struct platform_device *dev, int state) |
| 374 | { | 374 | { |
| 375 | struct sdhci_host *host = platform_get_drvdata(dev); | 375 | struct sdhci_host *host = platform_get_drvdata(dev); |
| 376 | struct sdhci_s3c *sc = sdhci_priv(host); | ||
| 376 | unsigned long flags; | 377 | unsigned long flags; |
| 377 | 378 | ||
| 378 | if (host) { | 379 | if (host) { |
| 379 | spin_lock_irqsave(&host->lock, flags); | 380 | spin_lock_irqsave(&host->lock, flags); |
| 380 | if (state) { | 381 | if (state) { |
| 381 | dev_dbg(&dev->dev, "card inserted.\n"); | 382 | dev_dbg(&dev->dev, "card inserted.\n"); |
| 383 | #ifdef CONFIG_PM_RUNTIME | ||
| 384 | clk_prepare_enable(sc->clk_io); | ||
| 385 | #endif | ||
| 382 | host->flags &= ~SDHCI_DEVICE_DEAD; | 386 | host->flags &= ~SDHCI_DEVICE_DEAD; |
| 383 | host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION; | 387 | host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION; |
| 384 | } else { | 388 | } else { |
| 385 | dev_dbg(&dev->dev, "card removed.\n"); | 389 | dev_dbg(&dev->dev, "card removed.\n"); |
| 386 | host->flags |= SDHCI_DEVICE_DEAD; | 390 | host->flags |= SDHCI_DEVICE_DEAD; |
| 387 | host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION; | 391 | host->quirks &= ~SDHCI_QUIRK_BROKEN_CARD_DETECTION; |
| 392 | #ifdef CONFIG_PM_RUNTIME | ||
| 393 | clk_disable_unprepare(sc->clk_io); | ||
| 394 | #endif | ||
| 388 | } | 395 | } |
| 389 | tasklet_schedule(&host->card_tasklet); | 396 | tasklet_schedule(&host->card_tasklet); |
| 390 | spin_unlock_irqrestore(&host->lock, flags); | 397 | spin_unlock_irqrestore(&host->lock, flags); |
diff --git a/drivers/mmc/host/sh_mmcif.c b/drivers/mmc/host/sh_mmcif.c index d25bc97dc5c6..7eaee3eeb6b2 100644 --- a/drivers/mmc/host/sh_mmcif.c +++ b/drivers/mmc/host/sh_mmcif.c | |||
| @@ -1104,7 +1104,6 @@ static irqreturn_t sh_mmcif_irqt(int irq, void *dev_id) | |||
| 1104 | { | 1104 | { |
| 1105 | struct sh_mmcif_host *host = dev_id; | 1105 | struct sh_mmcif_host *host = dev_id; |
| 1106 | struct mmc_request *mrq = host->mrq; | 1106 | struct mmc_request *mrq = host->mrq; |
| 1107 | struct mmc_data *data = mrq->data; | ||
| 1108 | 1107 | ||
| 1109 | cancel_delayed_work_sync(&host->timeout_work); | 1108 | cancel_delayed_work_sync(&host->timeout_work); |
| 1110 | 1109 | ||
| @@ -1152,13 +1151,14 @@ static irqreturn_t sh_mmcif_irqt(int irq, void *dev_id) | |||
| 1152 | case MMCIF_WAIT_FOR_READ_END: | 1151 | case MMCIF_WAIT_FOR_READ_END: |
| 1153 | case MMCIF_WAIT_FOR_WRITE_END: | 1152 | case MMCIF_WAIT_FOR_WRITE_END: |
| 1154 | if (host->sd_error) | 1153 | if (host->sd_error) |
| 1155 | data->error = sh_mmcif_error_manage(host); | 1154 | mrq->data->error = sh_mmcif_error_manage(host); |
| 1156 | break; | 1155 | break; |
| 1157 | default: | 1156 | default: |
| 1158 | BUG(); | 1157 | BUG(); |
| 1159 | } | 1158 | } |
| 1160 | 1159 | ||
| 1161 | if (host->wait_for != MMCIF_WAIT_FOR_STOP) { | 1160 | if (host->wait_for != MMCIF_WAIT_FOR_STOP) { |
| 1161 | struct mmc_data *data = mrq->data; | ||
| 1162 | if (!mrq->cmd->error && data && !data->error) | 1162 | if (!mrq->cmd->error && data && !data->error) |
| 1163 | data->bytes_xfered = | 1163 | data->bytes_xfered = |
| 1164 | data->blocks * data->blksz; | 1164 | data->blocks * data->blksz; |
| @@ -1231,10 +1231,6 @@ static irqreturn_t sh_mmcif_intr(int irq, void *dev_id) | |||
| 1231 | host->sd_error = true; | 1231 | host->sd_error = true; |
| 1232 | dev_dbg(&host->pd->dev, "int err state = %08x\n", state); | 1232 | dev_dbg(&host->pd->dev, "int err state = %08x\n", state); |
| 1233 | } | 1233 | } |
| 1234 | if (host->state == STATE_IDLE) { | ||
| 1235 | dev_info(&host->pd->dev, "Spurious IRQ status 0x%x", state); | ||
| 1236 | return IRQ_HANDLED; | ||
| 1237 | } | ||
| 1238 | if (state & ~(INT_CMD12RBE | INT_CMD12CRE)) { | 1234 | if (state & ~(INT_CMD12RBE | INT_CMD12CRE)) { |
| 1239 | if (!host->dma_active) | 1235 | if (!host->dma_active) |
| 1240 | return IRQ_WAKE_THREAD; | 1236 | return IRQ_WAKE_THREAD; |
diff --git a/drivers/mtd/devices/slram.c b/drivers/mtd/devices/slram.c index 8f52fc858e48..5a5cd2ace4a6 100644 --- a/drivers/mtd/devices/slram.c +++ b/drivers/mtd/devices/slram.c | |||
| @@ -240,7 +240,7 @@ static int parse_cmdline(char *devname, char *szstart, char *szlength) | |||
| 240 | 240 | ||
| 241 | if (*(szlength) != '+') { | 241 | if (*(szlength) != '+') { |
| 242 | devlength = simple_strtoul(szlength, &buffer, 0); | 242 | devlength = simple_strtoul(szlength, &buffer, 0); |
| 243 | devlength = handle_unit(devlength, buffer) - devstart; | 243 | devlength = handle_unit(devlength, buffer); |
| 244 | if (devlength < devstart) | 244 | if (devlength < devstart) |
| 245 | goto err_out; | 245 | goto err_out; |
| 246 | 246 | ||
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c index 374c46dff7dd..ec794a72975d 100644 --- a/drivers/mtd/mtdcore.c +++ b/drivers/mtd/mtdcore.c | |||
| @@ -1077,7 +1077,8 @@ EXPORT_SYMBOL_GPL(mtd_writev); | |||
| 1077 | * until the request succeeds or until the allocation size falls below | 1077 | * until the request succeeds or until the allocation size falls below |
| 1078 | * the system page size. This attempts to make sure it does not adversely | 1078 | * the system page size. This attempts to make sure it does not adversely |
| 1079 | * impact system performance, so when allocating more than one page, we | 1079 | * impact system performance, so when allocating more than one page, we |
| 1080 | * ask the memory allocator to avoid re-trying. | 1080 | * ask the memory allocator to avoid re-trying, swapping, writing back |
| 1081 | * or performing I/O. | ||
| 1081 | * | 1082 | * |
| 1082 | * Note, this function also makes sure that the allocated buffer is aligned to | 1083 | * Note, this function also makes sure that the allocated buffer is aligned to |
| 1083 | * the MTD device's min. I/O unit, i.e. the "mtd->writesize" value. | 1084 | * the MTD device's min. I/O unit, i.e. the "mtd->writesize" value. |
| @@ -1091,7 +1092,8 @@ EXPORT_SYMBOL_GPL(mtd_writev); | |||
| 1091 | */ | 1092 | */ |
| 1092 | void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size) | 1093 | void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size) |
| 1093 | { | 1094 | { |
| 1094 | gfp_t flags = __GFP_NOWARN | __GFP_WAIT | __GFP_NORETRY; | 1095 | gfp_t flags = __GFP_NOWARN | __GFP_WAIT | |
| 1096 | __GFP_NORETRY | __GFP_NO_KSWAPD; | ||
| 1095 | size_t min_alloc = max_t(size_t, mtd->writesize, PAGE_SIZE); | 1097 | size_t min_alloc = max_t(size_t, mtd->writesize, PAGE_SIZE); |
| 1096 | void *kbuf; | 1098 | void *kbuf; |
| 1097 | 1099 | ||
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index ec6841d8e956..1a03b7f673ce 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
| @@ -2983,13 +2983,15 @@ static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip, | |||
| 2983 | /* | 2983 | /* |
| 2984 | * Field definitions are in the following datasheets: | 2984 | * Field definitions are in the following datasheets: |
| 2985 | * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32) | 2985 | * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32) |
| 2986 | * New style (6 byte ID): Samsung K9GAG08U0F (p.44) | 2986 | * New Samsung (6 byte ID): Samsung K9GAG08U0F (p.44) |
| 2987 | * Hynix MLC (6 byte ID): Hynix H27UBG8T2B (p.22) | 2987 | * Hynix MLC (6 byte ID): Hynix H27UBG8T2B (p.22) |
| 2988 | * | 2988 | * |
| 2989 | * Check for ID length, cell type, and Hynix/Samsung ID to decide what | 2989 | * Check for ID length, non-zero 6th byte, cell type, and Hynix/Samsung |
| 2990 | * to do. | 2990 | * ID to decide what to do. |
| 2991 | */ | 2991 | */ |
| 2992 | if (id_len == 6 && id_data[0] == NAND_MFR_SAMSUNG) { | 2992 | if (id_len == 6 && id_data[0] == NAND_MFR_SAMSUNG && |
| 2993 | (chip->cellinfo & NAND_CI_CELLTYPE_MSK) && | ||
| 2994 | id_data[5] != 0x00) { | ||
| 2993 | /* Calc pagesize */ | 2995 | /* Calc pagesize */ |
| 2994 | mtd->writesize = 2048 << (extid & 0x03); | 2996 | mtd->writesize = 2048 << (extid & 0x03); |
| 2995 | extid >>= 2; | 2997 | extid >>= 2; |
diff --git a/drivers/mtd/ofpart.c b/drivers/mtd/ofpart.c index 64be8f0848b0..d9127e2ed808 100644 --- a/drivers/mtd/ofpart.c +++ b/drivers/mtd/ofpart.c | |||
| @@ -121,7 +121,7 @@ static int parse_ofoldpart_partitions(struct mtd_info *master, | |||
| 121 | nr_parts = plen / sizeof(part[0]); | 121 | nr_parts = plen / sizeof(part[0]); |
| 122 | 122 | ||
| 123 | *pparts = kzalloc(nr_parts * sizeof(*(*pparts)), GFP_KERNEL); | 123 | *pparts = kzalloc(nr_parts * sizeof(*(*pparts)), GFP_KERNEL); |
| 124 | if (!pparts) | 124 | if (!*pparts) |
| 125 | return -ENOMEM; | 125 | return -ENOMEM; |
| 126 | 126 | ||
| 127 | names = of_get_property(dp, "partition-names", &plen); | 127 | names = of_get_property(dp, "partition-names", &plen); |
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c index 7153e0d27101..b3f41f200622 100644 --- a/drivers/mtd/onenand/onenand_base.c +++ b/drivers/mtd/onenand/onenand_base.c | |||
| @@ -3694,7 +3694,7 @@ static int flexonenand_check_blocks_erased(struct mtd_info *mtd, int start, int | |||
| 3694 | * flexonenand_set_boundary - Writes the SLC boundary | 3694 | * flexonenand_set_boundary - Writes the SLC boundary |
| 3695 | * @param mtd - mtd info structure | 3695 | * @param mtd - mtd info structure |
| 3696 | */ | 3696 | */ |
| 3697 | int flexonenand_set_boundary(struct mtd_info *mtd, int die, | 3697 | static int flexonenand_set_boundary(struct mtd_info *mtd, int die, |
| 3698 | int boundary, int lock) | 3698 | int boundary, int lock) |
| 3699 | { | 3699 | { |
| 3700 | struct onenand_chip *this = mtd->priv; | 3700 | struct onenand_chip *this = mtd->priv; |
diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c index da7b44998b40..2144f611196e 100644 --- a/drivers/mtd/ubi/wl.c +++ b/drivers/mtd/ubi/wl.c | |||
| @@ -498,7 +498,7 @@ out: | |||
| 498 | * @ubi: UBI device description object | 498 | * @ubi: UBI device description object |
| 499 | * | 499 | * |
| 500 | * This function returns a physical eraseblock in case of success and a | 500 | * This function returns a physical eraseblock in case of success and a |
| 501 | * negative error code in case of failure. Might sleep. | 501 | * negative error code in case of failure. |
| 502 | */ | 502 | */ |
| 503 | static int __wl_get_peb(struct ubi_device *ubi) | 503 | static int __wl_get_peb(struct ubi_device *ubi) |
| 504 | { | 504 | { |
| @@ -540,13 +540,6 @@ retry: | |||
| 540 | * ubi_wl_get_peb() after removing e from the pool. */ | 540 | * ubi_wl_get_peb() after removing e from the pool. */ |
| 541 | prot_queue_add(ubi, e); | 541 | prot_queue_add(ubi, e); |
| 542 | #endif | 542 | #endif |
| 543 | err = ubi_self_check_all_ff(ubi, e->pnum, ubi->vid_hdr_aloffset, | ||
| 544 | ubi->peb_size - ubi->vid_hdr_aloffset); | ||
| 545 | if (err) { | ||
| 546 | ubi_err("new PEB %d does not contain all 0xFF bytes", e->pnum); | ||
| 547 | return err; | ||
| 548 | } | ||
| 549 | |||
| 550 | return e->pnum; | 543 | return e->pnum; |
| 551 | } | 544 | } |
| 552 | 545 | ||
| @@ -679,17 +672,30 @@ static struct ubi_wl_entry *get_peb_for_wl(struct ubi_device *ubi) | |||
| 679 | #else | 672 | #else |
| 680 | static struct ubi_wl_entry *get_peb_for_wl(struct ubi_device *ubi) | 673 | static struct ubi_wl_entry *get_peb_for_wl(struct ubi_device *ubi) |
| 681 | { | 674 | { |
| 682 | return find_wl_entry(ubi, &ubi->free, WL_FREE_MAX_DIFF); | 675 | struct ubi_wl_entry *e; |
| 676 | |||
| 677 | e = find_wl_entry(ubi, &ubi->free, WL_FREE_MAX_DIFF); | ||
| 678 | self_check_in_wl_tree(ubi, e, &ubi->free); | ||
| 679 | rb_erase(&e->u.rb, &ubi->free); | ||
| 680 | |||
| 681 | return e; | ||
| 683 | } | 682 | } |
| 684 | 683 | ||
| 685 | int ubi_wl_get_peb(struct ubi_device *ubi) | 684 | int ubi_wl_get_peb(struct ubi_device *ubi) |
| 686 | { | 685 | { |
| 687 | int peb; | 686 | int peb, err; |
| 688 | 687 | ||
| 689 | spin_lock(&ubi->wl_lock); | 688 | spin_lock(&ubi->wl_lock); |
| 690 | peb = __wl_get_peb(ubi); | 689 | peb = __wl_get_peb(ubi); |
| 691 | spin_unlock(&ubi->wl_lock); | 690 | spin_unlock(&ubi->wl_lock); |
| 692 | 691 | ||
| 692 | err = ubi_self_check_all_ff(ubi, peb, ubi->vid_hdr_aloffset, | ||
| 693 | ubi->peb_size - ubi->vid_hdr_aloffset); | ||
| 694 | if (err) { | ||
| 695 | ubi_err("new PEB %d does not contain all 0xFF bytes", peb); | ||
| 696 | return err; | ||
| 697 | } | ||
| 698 | |||
| 693 | return peb; | 699 | return peb; |
| 694 | } | 700 | } |
| 695 | #endif | 701 | #endif |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index b2530b002125..a7d47350ea4b 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -1379,6 +1379,8 @@ static void bond_compute_features(struct bonding *bond) | |||
| 1379 | struct net_device *bond_dev = bond->dev; | 1379 | struct net_device *bond_dev = bond->dev; |
| 1380 | netdev_features_t vlan_features = BOND_VLAN_FEATURES; | 1380 | netdev_features_t vlan_features = BOND_VLAN_FEATURES; |
| 1381 | unsigned short max_hard_header_len = ETH_HLEN; | 1381 | unsigned short max_hard_header_len = ETH_HLEN; |
| 1382 | unsigned int gso_max_size = GSO_MAX_SIZE; | ||
| 1383 | u16 gso_max_segs = GSO_MAX_SEGS; | ||
| 1382 | int i; | 1384 | int i; |
| 1383 | unsigned int flags, dst_release_flag = IFF_XMIT_DST_RELEASE; | 1385 | unsigned int flags, dst_release_flag = IFF_XMIT_DST_RELEASE; |
| 1384 | 1386 | ||
| @@ -1394,11 +1396,16 @@ static void bond_compute_features(struct bonding *bond) | |||
| 1394 | dst_release_flag &= slave->dev->priv_flags; | 1396 | dst_release_flag &= slave->dev->priv_flags; |
| 1395 | if (slave->dev->hard_header_len > max_hard_header_len) | 1397 | if (slave->dev->hard_header_len > max_hard_header_len) |
| 1396 | max_hard_header_len = slave->dev->hard_header_len; | 1398 | max_hard_header_len = slave->dev->hard_header_len; |
| 1399 | |||
| 1400 | gso_max_size = min(gso_max_size, slave->dev->gso_max_size); | ||
| 1401 | gso_max_segs = min(gso_max_segs, slave->dev->gso_max_segs); | ||
| 1397 | } | 1402 | } |
| 1398 | 1403 | ||
| 1399 | done: | 1404 | done: |
| 1400 | bond_dev->vlan_features = vlan_features; | 1405 | bond_dev->vlan_features = vlan_features; |
| 1401 | bond_dev->hard_header_len = max_hard_header_len; | 1406 | bond_dev->hard_header_len = max_hard_header_len; |
| 1407 | bond_dev->gso_max_segs = gso_max_segs; | ||
| 1408 | netif_set_gso_max_size(bond_dev, gso_max_size); | ||
| 1402 | 1409 | ||
| 1403 | flags = bond_dev->priv_flags & ~IFF_XMIT_DST_RELEASE; | 1410 | flags = bond_dev->priv_flags & ~IFF_XMIT_DST_RELEASE; |
| 1404 | bond_dev->priv_flags = flags | dst_release_flag; | 1411 | bond_dev->priv_flags = flags | dst_release_flag; |
| @@ -3452,6 +3459,28 @@ static int bond_xmit_hash_policy_l34(struct sk_buff *skb, int count) | |||
| 3452 | 3459 | ||
| 3453 | /*-------------------------- Device entry points ----------------------------*/ | 3460 | /*-------------------------- Device entry points ----------------------------*/ |
| 3454 | 3461 | ||
| 3462 | static void bond_work_init_all(struct bonding *bond) | ||
| 3463 | { | ||
| 3464 | INIT_DELAYED_WORK(&bond->mcast_work, | ||
| 3465 | bond_resend_igmp_join_requests_delayed); | ||
| 3466 | INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor); | ||
| 3467 | INIT_DELAYED_WORK(&bond->mii_work, bond_mii_monitor); | ||
| 3468 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) | ||
| 3469 | INIT_DELAYED_WORK(&bond->arp_work, bond_activebackup_arp_mon); | ||
| 3470 | else | ||
| 3471 | INIT_DELAYED_WORK(&bond->arp_work, bond_loadbalance_arp_mon); | ||
| 3472 | INIT_DELAYED_WORK(&bond->ad_work, bond_3ad_state_machine_handler); | ||
| 3473 | } | ||
| 3474 | |||
| 3475 | static void bond_work_cancel_all(struct bonding *bond) | ||
| 3476 | { | ||
| 3477 | cancel_delayed_work_sync(&bond->mii_work); | ||
| 3478 | cancel_delayed_work_sync(&bond->arp_work); | ||
| 3479 | cancel_delayed_work_sync(&bond->alb_work); | ||
| 3480 | cancel_delayed_work_sync(&bond->ad_work); | ||
| 3481 | cancel_delayed_work_sync(&bond->mcast_work); | ||
| 3482 | } | ||
| 3483 | |||
| 3455 | static int bond_open(struct net_device *bond_dev) | 3484 | static int bond_open(struct net_device *bond_dev) |
| 3456 | { | 3485 | { |
| 3457 | struct bonding *bond = netdev_priv(bond_dev); | 3486 | struct bonding *bond = netdev_priv(bond_dev); |
| @@ -3474,41 +3503,27 @@ static int bond_open(struct net_device *bond_dev) | |||
| 3474 | } | 3503 | } |
| 3475 | read_unlock(&bond->lock); | 3504 | read_unlock(&bond->lock); |
| 3476 | 3505 | ||
| 3477 | INIT_DELAYED_WORK(&bond->mcast_work, bond_resend_igmp_join_requests_delayed); | 3506 | bond_work_init_all(bond); |
| 3478 | 3507 | ||
| 3479 | if (bond_is_lb(bond)) { | 3508 | if (bond_is_lb(bond)) { |
| 3480 | /* bond_alb_initialize must be called before the timer | 3509 | /* bond_alb_initialize must be called before the timer |
| 3481 | * is started. | 3510 | * is started. |
| 3482 | */ | 3511 | */ |
| 3483 | if (bond_alb_initialize(bond, (bond->params.mode == BOND_MODE_ALB))) { | 3512 | if (bond_alb_initialize(bond, (bond->params.mode == BOND_MODE_ALB))) |
| 3484 | /* something went wrong - fail the open operation */ | ||
| 3485 | return -ENOMEM; | 3513 | return -ENOMEM; |
| 3486 | } | ||
| 3487 | |||
| 3488 | INIT_DELAYED_WORK(&bond->alb_work, bond_alb_monitor); | ||
| 3489 | queue_delayed_work(bond->wq, &bond->alb_work, 0); | 3514 | queue_delayed_work(bond->wq, &bond->alb_work, 0); |
| 3490 | } | 3515 | } |
| 3491 | 3516 | ||
| 3492 | if (bond->params.miimon) { /* link check interval, in milliseconds. */ | 3517 | if (bond->params.miimon) /* link check interval, in milliseconds. */ |
| 3493 | INIT_DELAYED_WORK(&bond->mii_work, bond_mii_monitor); | ||
| 3494 | queue_delayed_work(bond->wq, &bond->mii_work, 0); | 3518 | queue_delayed_work(bond->wq, &bond->mii_work, 0); |
| 3495 | } | ||
| 3496 | 3519 | ||
| 3497 | if (bond->params.arp_interval) { /* arp interval, in milliseconds. */ | 3520 | if (bond->params.arp_interval) { /* arp interval, in milliseconds. */ |
| 3498 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) | ||
| 3499 | INIT_DELAYED_WORK(&bond->arp_work, | ||
| 3500 | bond_activebackup_arp_mon); | ||
| 3501 | else | ||
| 3502 | INIT_DELAYED_WORK(&bond->arp_work, | ||
| 3503 | bond_loadbalance_arp_mon); | ||
| 3504 | |||
| 3505 | queue_delayed_work(bond->wq, &bond->arp_work, 0); | 3521 | queue_delayed_work(bond->wq, &bond->arp_work, 0); |
| 3506 | if (bond->params.arp_validate) | 3522 | if (bond->params.arp_validate) |
| 3507 | bond->recv_probe = bond_arp_rcv; | 3523 | bond->recv_probe = bond_arp_rcv; |
| 3508 | } | 3524 | } |
| 3509 | 3525 | ||
| 3510 | if (bond->params.mode == BOND_MODE_8023AD) { | 3526 | if (bond->params.mode == BOND_MODE_8023AD) { |
| 3511 | INIT_DELAYED_WORK(&bond->ad_work, bond_3ad_state_machine_handler); | ||
| 3512 | queue_delayed_work(bond->wq, &bond->ad_work, 0); | 3527 | queue_delayed_work(bond->wq, &bond->ad_work, 0); |
| 3513 | /* register to receive LACPDUs */ | 3528 | /* register to receive LACPDUs */ |
| 3514 | bond->recv_probe = bond_3ad_lacpdu_recv; | 3529 | bond->recv_probe = bond_3ad_lacpdu_recv; |
| @@ -3523,34 +3538,10 @@ static int bond_close(struct net_device *bond_dev) | |||
| 3523 | struct bonding *bond = netdev_priv(bond_dev); | 3538 | struct bonding *bond = netdev_priv(bond_dev); |
| 3524 | 3539 | ||
| 3525 | write_lock_bh(&bond->lock); | 3540 | write_lock_bh(&bond->lock); |
| 3526 | |||
| 3527 | bond->send_peer_notif = 0; | 3541 | bond->send_peer_notif = 0; |
| 3528 | |||
| 3529 | write_unlock_bh(&bond->lock); | 3542 | write_unlock_bh(&bond->lock); |
| 3530 | 3543 | ||
| 3531 | if (bond->params.miimon) { /* link check interval, in milliseconds. */ | 3544 | bond_work_cancel_all(bond); |
| 3532 | cancel_delayed_work_sync(&bond->mii_work); | ||
| 3533 | } | ||
| 3534 | |||
| 3535 | if (bond->params.arp_interval) { /* arp interval, in milliseconds. */ | ||
| 3536 | cancel_delayed_work_sync(&bond->arp_work); | ||
| 3537 | } | ||
| 3538 | |||
| 3539 | switch (bond->params.mode) { | ||
| 3540 | case BOND_MODE_8023AD: | ||
| 3541 | cancel_delayed_work_sync(&bond->ad_work); | ||
| 3542 | break; | ||
| 3543 | case BOND_MODE_TLB: | ||
| 3544 | case BOND_MODE_ALB: | ||
| 3545 | cancel_delayed_work_sync(&bond->alb_work); | ||
| 3546 | break; | ||
| 3547 | default: | ||
| 3548 | break; | ||
| 3549 | } | ||
| 3550 | |||
| 3551 | if (delayed_work_pending(&bond->mcast_work)) | ||
| 3552 | cancel_delayed_work_sync(&bond->mcast_work); | ||
| 3553 | |||
| 3554 | if (bond_is_lb(bond)) { | 3545 | if (bond_is_lb(bond)) { |
| 3555 | /* Must be called only after all | 3546 | /* Must be called only after all |
| 3556 | * slaves have been released | 3547 | * slaves have been released |
| @@ -4429,26 +4420,6 @@ static void bond_setup(struct net_device *bond_dev) | |||
| 4429 | bond_dev->features |= bond_dev->hw_features; | 4420 | bond_dev->features |= bond_dev->hw_features; |
| 4430 | } | 4421 | } |
| 4431 | 4422 | ||
| 4432 | static void bond_work_cancel_all(struct bonding *bond) | ||
| 4433 | { | ||
| 4434 | if (bond->params.miimon && delayed_work_pending(&bond->mii_work)) | ||
| 4435 | cancel_delayed_work_sync(&bond->mii_work); | ||
| 4436 | |||
| 4437 | if (bond->params.arp_interval && delayed_work_pending(&bond->arp_work)) | ||
| 4438 | cancel_delayed_work_sync(&bond->arp_work); | ||
| 4439 | |||
| 4440 | if (bond->params.mode == BOND_MODE_ALB && | ||
| 4441 | delayed_work_pending(&bond->alb_work)) | ||
| 4442 | cancel_delayed_work_sync(&bond->alb_work); | ||
| 4443 | |||
| 4444 | if (bond->params.mode == BOND_MODE_8023AD && | ||
| 4445 | delayed_work_pending(&bond->ad_work)) | ||
| 4446 | cancel_delayed_work_sync(&bond->ad_work); | ||
| 4447 | |||
| 4448 | if (delayed_work_pending(&bond->mcast_work)) | ||
| 4449 | cancel_delayed_work_sync(&bond->mcast_work); | ||
| 4450 | } | ||
| 4451 | |||
| 4452 | /* | 4423 | /* |
| 4453 | * Destroy a bonding device. | 4424 | * Destroy a bonding device. |
| 4454 | * Must be under rtnl_lock when this function is called. | 4425 | * Must be under rtnl_lock when this function is called. |
| @@ -4699,12 +4670,13 @@ static int bond_check_params(struct bond_params *params) | |||
| 4699 | arp_ip_count++) { | 4670 | arp_ip_count++) { |
| 4700 | /* not complete check, but should be good enough to | 4671 | /* not complete check, but should be good enough to |
| 4701 | catch mistakes */ | 4672 | catch mistakes */ |
| 4702 | if (!isdigit(arp_ip_target[arp_ip_count][0])) { | 4673 | __be32 ip = in_aton(arp_ip_target[arp_ip_count]); |
| 4674 | if (!isdigit(arp_ip_target[arp_ip_count][0]) || | ||
| 4675 | ip == 0 || ip == htonl(INADDR_BROADCAST)) { | ||
| 4703 | pr_warning("Warning: bad arp_ip_target module parameter (%s), ARP monitoring will not be performed\n", | 4676 | pr_warning("Warning: bad arp_ip_target module parameter (%s), ARP monitoring will not be performed\n", |
| 4704 | arp_ip_target[arp_ip_count]); | 4677 | arp_ip_target[arp_ip_count]); |
| 4705 | arp_interval = 0; | 4678 | arp_interval = 0; |
| 4706 | } else { | 4679 | } else { |
| 4707 | __be32 ip = in_aton(arp_ip_target[arp_ip_count]); | ||
| 4708 | arp_target[arp_ip_count] = ip; | 4680 | arp_target[arp_ip_count] = ip; |
| 4709 | } | 4681 | } |
| 4710 | } | 4682 | } |
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index ef8d2a080d17..1877ed7ca086 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c | |||
| @@ -513,6 +513,8 @@ static ssize_t bonding_store_arp_interval(struct device *d, | |||
| 513 | int new_value, ret = count; | 513 | int new_value, ret = count; |
| 514 | struct bonding *bond = to_bond(d); | 514 | struct bonding *bond = to_bond(d); |
| 515 | 515 | ||
| 516 | if (!rtnl_trylock()) | ||
| 517 | return restart_syscall(); | ||
| 516 | if (sscanf(buf, "%d", &new_value) != 1) { | 518 | if (sscanf(buf, "%d", &new_value) != 1) { |
| 517 | pr_err("%s: no arp_interval value specified.\n", | 519 | pr_err("%s: no arp_interval value specified.\n", |
| 518 | bond->dev->name); | 520 | bond->dev->name); |
| @@ -539,10 +541,6 @@ static ssize_t bonding_store_arp_interval(struct device *d, | |||
| 539 | pr_info("%s: ARP monitoring cannot be used with MII monitoring. %s Disabling MII monitoring.\n", | 541 | pr_info("%s: ARP monitoring cannot be used with MII monitoring. %s Disabling MII monitoring.\n", |
| 540 | bond->dev->name, bond->dev->name); | 542 | bond->dev->name, bond->dev->name); |
| 541 | bond->params.miimon = 0; | 543 | bond->params.miimon = 0; |
| 542 | if (delayed_work_pending(&bond->mii_work)) { | ||
| 543 | cancel_delayed_work(&bond->mii_work); | ||
| 544 | flush_workqueue(bond->wq); | ||
| 545 | } | ||
| 546 | } | 544 | } |
| 547 | if (!bond->params.arp_targets[0]) { | 545 | if (!bond->params.arp_targets[0]) { |
| 548 | pr_info("%s: ARP monitoring has been set up, but no ARP targets have been specified.\n", | 546 | pr_info("%s: ARP monitoring has been set up, but no ARP targets have been specified.\n", |
| @@ -554,19 +552,12 @@ static ssize_t bonding_store_arp_interval(struct device *d, | |||
| 554 | * timer will get fired off when the open function | 552 | * timer will get fired off when the open function |
| 555 | * is called. | 553 | * is called. |
| 556 | */ | 554 | */ |
| 557 | if (!delayed_work_pending(&bond->arp_work)) { | 555 | cancel_delayed_work_sync(&bond->mii_work); |
| 558 | if (bond->params.mode == BOND_MODE_ACTIVEBACKUP) | 556 | queue_delayed_work(bond->wq, &bond->arp_work, 0); |
| 559 | INIT_DELAYED_WORK(&bond->arp_work, | ||
| 560 | bond_activebackup_arp_mon); | ||
| 561 | else | ||
| 562 | INIT_DELAYED_WORK(&bond->arp_work, | ||
| 563 | bond_loadbalance_arp_mon); | ||
| 564 | |||
| 565 | queue_delayed_work(bond->wq, &bond->arp_work, 0); | ||
| 566 | } | ||
| 567 | } | 557 | } |
| 568 | 558 | ||
| 569 | out: | 559 | out: |
| 560 | rtnl_unlock(); | ||
| 570 | return ret; | 561 | return ret; |
| 571 | } | 562 | } |
| 572 | static DEVICE_ATTR(arp_interval, S_IRUGO | S_IWUSR, | 563 | static DEVICE_ATTR(arp_interval, S_IRUGO | S_IWUSR, |
| @@ -962,6 +953,8 @@ static ssize_t bonding_store_miimon(struct device *d, | |||
| 962 | int new_value, ret = count; | 953 | int new_value, ret = count; |
| 963 | struct bonding *bond = to_bond(d); | 954 | struct bonding *bond = to_bond(d); |
| 964 | 955 | ||
| 956 | if (!rtnl_trylock()) | ||
| 957 | return restart_syscall(); | ||
| 965 | if (sscanf(buf, "%d", &new_value) != 1) { | 958 | if (sscanf(buf, "%d", &new_value) != 1) { |
| 966 | pr_err("%s: no miimon value specified.\n", | 959 | pr_err("%s: no miimon value specified.\n", |
| 967 | bond->dev->name); | 960 | bond->dev->name); |
| @@ -993,10 +986,6 @@ static ssize_t bonding_store_miimon(struct device *d, | |||
| 993 | bond->params.arp_validate = | 986 | bond->params.arp_validate = |
| 994 | BOND_ARP_VALIDATE_NONE; | 987 | BOND_ARP_VALIDATE_NONE; |
| 995 | } | 988 | } |
| 996 | if (delayed_work_pending(&bond->arp_work)) { | ||
| 997 | cancel_delayed_work(&bond->arp_work); | ||
| 998 | flush_workqueue(bond->wq); | ||
| 999 | } | ||
| 1000 | } | 989 | } |
| 1001 | 990 | ||
| 1002 | if (bond->dev->flags & IFF_UP) { | 991 | if (bond->dev->flags & IFF_UP) { |
| @@ -1005,15 +994,12 @@ static ssize_t bonding_store_miimon(struct device *d, | |||
| 1005 | * timer will get fired off when the open function | 994 | * timer will get fired off when the open function |
| 1006 | * is called. | 995 | * is called. |
| 1007 | */ | 996 | */ |
| 1008 | if (!delayed_work_pending(&bond->mii_work)) { | 997 | cancel_delayed_work_sync(&bond->arp_work); |
| 1009 | INIT_DELAYED_WORK(&bond->mii_work, | 998 | queue_delayed_work(bond->wq, &bond->mii_work, 0); |
| 1010 | bond_mii_monitor); | ||
| 1011 | queue_delayed_work(bond->wq, | ||
| 1012 | &bond->mii_work, 0); | ||
| 1013 | } | ||
| 1014 | } | 999 | } |
| 1015 | } | 1000 | } |
| 1016 | out: | 1001 | out: |
| 1002 | rtnl_unlock(); | ||
| 1017 | return ret; | 1003 | return ret; |
| 1018 | } | 1004 | } |
| 1019 | static DEVICE_ATTR(miimon, S_IRUGO | S_IWUSR, | 1005 | static DEVICE_ATTR(miimon, S_IRUGO | S_IWUSR, |
| @@ -1582,6 +1568,7 @@ static ssize_t bonding_store_slaves_active(struct device *d, | |||
| 1582 | goto out; | 1568 | goto out; |
| 1583 | } | 1569 | } |
| 1584 | 1570 | ||
| 1571 | read_lock(&bond->lock); | ||
| 1585 | bond_for_each_slave(bond, slave, i) { | 1572 | bond_for_each_slave(bond, slave, i) { |
| 1586 | if (!bond_is_active_slave(slave)) { | 1573 | if (!bond_is_active_slave(slave)) { |
| 1587 | if (new_value) | 1574 | if (new_value) |
| @@ -1590,6 +1577,7 @@ static ssize_t bonding_store_slaves_active(struct device *d, | |||
| 1590 | slave->inactive = 1; | 1577 | slave->inactive = 1; |
| 1591 | } | 1578 | } |
| 1592 | } | 1579 | } |
| 1580 | read_unlock(&bond->lock); | ||
| 1593 | out: | 1581 | out: |
| 1594 | return ret; | 1582 | return ret; |
| 1595 | } | 1583 | } |
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c index 86f26a1ede4c..25723d8ee201 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb.c | |||
| @@ -519,8 +519,10 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, | |||
| 519 | mc->pdev->dev.can.state = new_state; | 519 | mc->pdev->dev.can.state = new_state; |
| 520 | 520 | ||
| 521 | if (status_len & PCAN_USB_STATUSLEN_TIMESTAMP) { | 521 | if (status_len & PCAN_USB_STATUSLEN_TIMESTAMP) { |
| 522 | struct skb_shared_hwtstamps *hwts = skb_hwtstamps(skb); | ||
| 523 | |||
| 522 | peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv); | 524 | peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv); |
| 523 | skb->tstamp = timeval_to_ktime(tv); | 525 | hwts->hwtstamp = timeval_to_ktime(tv); |
| 524 | } | 526 | } |
| 525 | 527 | ||
| 526 | netif_rx(skb); | 528 | netif_rx(skb); |
| @@ -605,6 +607,7 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len) | |||
| 605 | struct sk_buff *skb; | 607 | struct sk_buff *skb; |
| 606 | struct can_frame *cf; | 608 | struct can_frame *cf; |
| 607 | struct timeval tv; | 609 | struct timeval tv; |
| 610 | struct skb_shared_hwtstamps *hwts; | ||
| 608 | 611 | ||
| 609 | skb = alloc_can_skb(mc->netdev, &cf); | 612 | skb = alloc_can_skb(mc->netdev, &cf); |
| 610 | if (!skb) | 613 | if (!skb) |
| @@ -652,7 +655,8 @@ static int pcan_usb_decode_data(struct pcan_usb_msg_context *mc, u8 status_len) | |||
| 652 | 655 | ||
| 653 | /* convert timestamp into kernel time */ | 656 | /* convert timestamp into kernel time */ |
| 654 | peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv); | 657 | peak_usb_get_ts_tv(&mc->pdev->time_ref, mc->ts16, &tv); |
| 655 | skb->tstamp = timeval_to_ktime(tv); | 658 | hwts = skb_hwtstamps(skb); |
| 659 | hwts->hwtstamp = timeval_to_ktime(tv); | ||
| 656 | 660 | ||
| 657 | /* push the skb */ | 661 | /* push the skb */ |
| 658 | netif_rx(skb); | 662 | netif_rx(skb); |
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c index e1626d92511a..30d79bfa5b10 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c | |||
| @@ -532,6 +532,7 @@ static int pcan_usb_pro_handle_canmsg(struct pcan_usb_pro_interface *usb_if, | |||
| 532 | struct can_frame *can_frame; | 532 | struct can_frame *can_frame; |
| 533 | struct sk_buff *skb; | 533 | struct sk_buff *skb; |
| 534 | struct timeval tv; | 534 | struct timeval tv; |
| 535 | struct skb_shared_hwtstamps *hwts; | ||
| 535 | 536 | ||
| 536 | skb = alloc_can_skb(netdev, &can_frame); | 537 | skb = alloc_can_skb(netdev, &can_frame); |
| 537 | if (!skb) | 538 | if (!skb) |
| @@ -549,7 +550,8 @@ static int pcan_usb_pro_handle_canmsg(struct pcan_usb_pro_interface *usb_if, | |||
| 549 | memcpy(can_frame->data, rx->data, can_frame->can_dlc); | 550 | memcpy(can_frame->data, rx->data, can_frame->can_dlc); |
| 550 | 551 | ||
| 551 | peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(rx->ts32), &tv); | 552 | peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(rx->ts32), &tv); |
| 552 | skb->tstamp = timeval_to_ktime(tv); | 553 | hwts = skb_hwtstamps(skb); |
| 554 | hwts->hwtstamp = timeval_to_ktime(tv); | ||
| 553 | 555 | ||
| 554 | netif_rx(skb); | 556 | netif_rx(skb); |
| 555 | netdev->stats.rx_packets++; | 557 | netdev->stats.rx_packets++; |
| @@ -570,6 +572,7 @@ static int pcan_usb_pro_handle_error(struct pcan_usb_pro_interface *usb_if, | |||
| 570 | u8 err_mask = 0; | 572 | u8 err_mask = 0; |
| 571 | struct sk_buff *skb; | 573 | struct sk_buff *skb; |
| 572 | struct timeval tv; | 574 | struct timeval tv; |
| 575 | struct skb_shared_hwtstamps *hwts; | ||
| 573 | 576 | ||
| 574 | /* nothing should be sent while in BUS_OFF state */ | 577 | /* nothing should be sent while in BUS_OFF state */ |
| 575 | if (dev->can.state == CAN_STATE_BUS_OFF) | 578 | if (dev->can.state == CAN_STATE_BUS_OFF) |
| @@ -664,7 +667,8 @@ static int pcan_usb_pro_handle_error(struct pcan_usb_pro_interface *usb_if, | |||
| 664 | dev->can.state = new_state; | 667 | dev->can.state = new_state; |
| 665 | 668 | ||
| 666 | peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(er->ts32), &tv); | 669 | peak_usb_get_ts_tv(&usb_if->time_ref, le32_to_cpu(er->ts32), &tv); |
| 667 | skb->tstamp = timeval_to_ktime(tv); | 670 | hwts = skb_hwtstamps(skb); |
| 671 | hwts->hwtstamp = timeval_to_ktime(tv); | ||
| 668 | netif_rx(skb); | 672 | netif_rx(skb); |
| 669 | netdev->stats.rx_packets++; | 673 | netdev->stats.rx_packets++; |
| 670 | netdev->stats.rx_bytes += can_frame->can_dlc; | 674 | netdev->stats.rx_bytes += can_frame->can_dlc; |
diff --git a/drivers/net/ethernet/8390/ne.c b/drivers/net/ethernet/8390/ne.c index d04911d33b64..47618e505355 100644 --- a/drivers/net/ethernet/8390/ne.c +++ b/drivers/net/ethernet/8390/ne.c | |||
| @@ -813,6 +813,7 @@ static int __init ne_drv_probe(struct platform_device *pdev) | |||
| 813 | dev->irq = irq[this_dev]; | 813 | dev->irq = irq[this_dev]; |
| 814 | dev->mem_end = bad[this_dev]; | 814 | dev->mem_end = bad[this_dev]; |
| 815 | } | 815 | } |
| 816 | SET_NETDEV_DEV(dev, &pdev->dev); | ||
| 816 | err = do_ne_probe(dev); | 817 | err = do_ne_probe(dev); |
| 817 | if (err) { | 818 | if (err) { |
| 818 | free_netdev(dev); | 819 | free_netdev(dev); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index bd1fd3d87c24..01611b33a93d 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
| @@ -9545,10 +9545,13 @@ static int __devinit bnx2x_prev_unload_common(struct bnx2x *bp) | |||
| 9545 | */ | 9545 | */ |
| 9546 | static void __devinit bnx2x_prev_interrupted_dmae(struct bnx2x *bp) | 9546 | static void __devinit bnx2x_prev_interrupted_dmae(struct bnx2x *bp) |
| 9547 | { | 9547 | { |
| 9548 | u32 val = REG_RD(bp, PGLUE_B_REG_PGLUE_B_INT_STS); | 9548 | if (!CHIP_IS_E1x(bp)) { |
| 9549 | if (val & PGLUE_B_PGLUE_B_INT_STS_REG_WAS_ERROR_ATTN) { | 9549 | u32 val = REG_RD(bp, PGLUE_B_REG_PGLUE_B_INT_STS); |
| 9550 | BNX2X_ERR("was error bit was found to be set in pglueb upon startup. Clearing"); | 9550 | if (val & PGLUE_B_PGLUE_B_INT_STS_REG_WAS_ERROR_ATTN) { |
| 9551 | REG_WR(bp, PGLUE_B_REG_WAS_ERROR_PF_7_0_CLR, 1 << BP_FUNC(bp)); | 9551 | BNX2X_ERR("was error bit was found to be set in pglueb upon startup. Clearing"); |
| 9552 | REG_WR(bp, PGLUE_B_REG_WAS_ERROR_PF_7_0_CLR, | ||
| 9553 | 1 << BP_FUNC(bp)); | ||
| 9554 | } | ||
| 9552 | } | 9555 | } |
| 9553 | } | 9556 | } |
| 9554 | 9557 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c b/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c index 5d36795877cb..b799ab12a291 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c | |||
| @@ -237,7 +237,7 @@ static int mlx4_en_dcbnl_ieee_setmaxrate(struct net_device *dev, | |||
| 237 | if (err) | 237 | if (err) |
| 238 | return err; | 238 | return err; |
| 239 | 239 | ||
| 240 | memcpy(priv->maxrate, tmp, sizeof(*priv->maxrate)); | 240 | memcpy(priv->maxrate, tmp, sizeof(priv->maxrate)); |
| 241 | 241 | ||
| 242 | return 0; | 242 | return 0; |
| 243 | } | 243 | } |
diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c index 1c818254b7be..609125a249d9 100644 --- a/drivers/net/ethernet/realtek/8139cp.c +++ b/drivers/net/ethernet/realtek/8139cp.c | |||
| @@ -979,17 +979,6 @@ static void cp_init_hw (struct cp_private *cp) | |||
| 979 | cpw32_f (MAC0 + 0, le32_to_cpu (*(__le32 *) (dev->dev_addr + 0))); | 979 | cpw32_f (MAC0 + 0, le32_to_cpu (*(__le32 *) (dev->dev_addr + 0))); |
| 980 | cpw32_f (MAC0 + 4, le32_to_cpu (*(__le32 *) (dev->dev_addr + 4))); | 980 | cpw32_f (MAC0 + 4, le32_to_cpu (*(__le32 *) (dev->dev_addr + 4))); |
| 981 | 981 | ||
| 982 | cpw32_f(HiTxRingAddr, 0); | ||
| 983 | cpw32_f(HiTxRingAddr + 4, 0); | ||
| 984 | |||
| 985 | ring_dma = cp->ring_dma; | ||
| 986 | cpw32_f(RxRingAddr, ring_dma & 0xffffffff); | ||
| 987 | cpw32_f(RxRingAddr + 4, (ring_dma >> 16) >> 16); | ||
| 988 | |||
| 989 | ring_dma += sizeof(struct cp_desc) * CP_RX_RING_SIZE; | ||
| 990 | cpw32_f(TxRingAddr, ring_dma & 0xffffffff); | ||
| 991 | cpw32_f(TxRingAddr + 4, (ring_dma >> 16) >> 16); | ||
| 992 | |||
| 993 | cp_start_hw(cp); | 982 | cp_start_hw(cp); |
| 994 | cpw8(TxThresh, 0x06); /* XXX convert magic num to a constant */ | 983 | cpw8(TxThresh, 0x06); /* XXX convert magic num to a constant */ |
| 995 | 984 | ||
| @@ -1003,6 +992,17 @@ static void cp_init_hw (struct cp_private *cp) | |||
| 1003 | 992 | ||
| 1004 | cpw8(Config5, cpr8(Config5) & PMEStatus); | 993 | cpw8(Config5, cpr8(Config5) & PMEStatus); |
| 1005 | 994 | ||
| 995 | cpw32_f(HiTxRingAddr, 0); | ||
| 996 | cpw32_f(HiTxRingAddr + 4, 0); | ||
| 997 | |||
| 998 | ring_dma = cp->ring_dma; | ||
| 999 | cpw32_f(RxRingAddr, ring_dma & 0xffffffff); | ||
| 1000 | cpw32_f(RxRingAddr + 4, (ring_dma >> 16) >> 16); | ||
| 1001 | |||
| 1002 | ring_dma += sizeof(struct cp_desc) * CP_RX_RING_SIZE; | ||
| 1003 | cpw32_f(TxRingAddr, ring_dma & 0xffffffff); | ||
| 1004 | cpw32_f(TxRingAddr + 4, (ring_dma >> 16) >> 16); | ||
| 1005 | |||
| 1006 | cpw16(MultiIntr, 0); | 1006 | cpw16(MultiIntr, 0); |
| 1007 | 1007 | ||
| 1008 | cpw8_f(Cfg9346, Cfg9346_Lock); | 1008 | cpw8_f(Cfg9346, Cfg9346_Lock); |
| @@ -1060,17 +1060,22 @@ static int cp_init_rings (struct cp_private *cp) | |||
| 1060 | 1060 | ||
| 1061 | static int cp_alloc_rings (struct cp_private *cp) | 1061 | static int cp_alloc_rings (struct cp_private *cp) |
| 1062 | { | 1062 | { |
| 1063 | struct device *d = &cp->pdev->dev; | ||
| 1063 | void *mem; | 1064 | void *mem; |
| 1065 | int rc; | ||
| 1064 | 1066 | ||
| 1065 | mem = dma_alloc_coherent(&cp->pdev->dev, CP_RING_BYTES, | 1067 | mem = dma_alloc_coherent(d, CP_RING_BYTES, &cp->ring_dma, GFP_KERNEL); |
| 1066 | &cp->ring_dma, GFP_KERNEL); | ||
| 1067 | if (!mem) | 1068 | if (!mem) |
| 1068 | return -ENOMEM; | 1069 | return -ENOMEM; |
| 1069 | 1070 | ||
| 1070 | cp->rx_ring = mem; | 1071 | cp->rx_ring = mem; |
| 1071 | cp->tx_ring = &cp->rx_ring[CP_RX_RING_SIZE]; | 1072 | cp->tx_ring = &cp->rx_ring[CP_RX_RING_SIZE]; |
| 1072 | 1073 | ||
| 1073 | return cp_init_rings(cp); | 1074 | rc = cp_init_rings(cp); |
| 1075 | if (rc < 0) | ||
| 1076 | dma_free_coherent(d, CP_RING_BYTES, cp->rx_ring, cp->ring_dma); | ||
| 1077 | |||
| 1078 | return rc; | ||
| 1074 | } | 1079 | } |
| 1075 | 1080 | ||
| 1076 | static void cp_clean_rings (struct cp_private *cp) | 1081 | static void cp_clean_rings (struct cp_private *cp) |
diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c index fb9f6b38511f..edf5edb13140 100644 --- a/drivers/net/ethernet/sis/sis900.c +++ b/drivers/net/ethernet/sis/sis900.c | |||
| @@ -2479,7 +2479,7 @@ static int sis900_resume(struct pci_dev *pci_dev) | |||
| 2479 | netif_start_queue(net_dev); | 2479 | netif_start_queue(net_dev); |
| 2480 | 2480 | ||
| 2481 | /* Workaround for EDB */ | 2481 | /* Workaround for EDB */ |
| 2482 | sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); | 2482 | sis900_set_mode(sis_priv, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); |
| 2483 | 2483 | ||
| 2484 | /* Enable all known interrupts by setting the interrupt mask. */ | 2484 | /* Enable all known interrupts by setting the interrupt mask. */ |
| 2485 | sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); | 2485 | sw32(imr, RxSOVR | RxORN | RxERR | RxOK | TxURN | TxERR | TxIDLE); |
diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index 77e6db9dcfed..a788501e978e 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c | |||
| @@ -894,6 +894,8 @@ out: | |||
| 894 | return IRQ_HANDLED; | 894 | return IRQ_HANDLED; |
| 895 | } | 895 | } |
| 896 | 896 | ||
| 897 | static void axienet_dma_err_handler(unsigned long data); | ||
| 898 | |||
| 897 | /** | 899 | /** |
| 898 | * axienet_open - Driver open routine. | 900 | * axienet_open - Driver open routine. |
| 899 | * @ndev: Pointer to net_device structure | 901 | * @ndev: Pointer to net_device structure |
diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c index 98934bdf6acf..477d6729b17f 100644 --- a/drivers/net/ethernet/xscale/ixp4xx_eth.c +++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c | |||
| @@ -1102,10 +1102,12 @@ static int init_queues(struct port *port) | |||
| 1102 | { | 1102 | { |
| 1103 | int i; | 1103 | int i; |
| 1104 | 1104 | ||
| 1105 | if (!ports_open) | 1105 | if (!ports_open) { |
| 1106 | if (!(dma_pool = dma_pool_create(DRV_NAME, NULL, | 1106 | dma_pool = dma_pool_create(DRV_NAME, &port->netdev->dev, |
| 1107 | POOL_ALLOC_SIZE, 32, 0))) | 1107 | POOL_ALLOC_SIZE, 32, 0); |
| 1108 | if (!dma_pool) | ||
| 1108 | return -ENOMEM; | 1109 | return -ENOMEM; |
| 1110 | } | ||
| 1109 | 1111 | ||
| 1110 | if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL, | 1112 | if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL, |
| 1111 | &port->desc_tab_phys))) | 1113 | &port->desc_tab_phys))) |
diff --git a/drivers/net/irda/sir_dev.c b/drivers/net/irda/sir_dev.c index 5039f08f5a5b..43e9ab4f4d7e 100644 --- a/drivers/net/irda/sir_dev.c +++ b/drivers/net/irda/sir_dev.c | |||
| @@ -222,7 +222,7 @@ static void sirdev_config_fsm(struct work_struct *work) | |||
| 222 | break; | 222 | break; |
| 223 | 223 | ||
| 224 | case SIRDEV_STATE_DONGLE_SPEED: | 224 | case SIRDEV_STATE_DONGLE_SPEED: |
| 225 | if (dev->dongle_drv->reset) { | 225 | if (dev->dongle_drv->set_speed) { |
| 226 | ret = dev->dongle_drv->set_speed(dev, fsm->param); | 226 | ret = dev->dongle_drv->set_speed(dev, fsm->param); |
| 227 | if (ret < 0) { | 227 | if (ret < 0) { |
| 228 | fsm->result = ret; | 228 | fsm->result = ret; |
diff --git a/drivers/net/phy/mdio-gpio.c b/drivers/net/phy/mdio-gpio.c index 899274f2f9b1..2ed1140df3e9 100644 --- a/drivers/net/phy/mdio-gpio.c +++ b/drivers/net/phy/mdio-gpio.c | |||
| @@ -185,17 +185,20 @@ static int __devinit mdio_gpio_probe(struct platform_device *pdev) | |||
| 185 | { | 185 | { |
| 186 | struct mdio_gpio_platform_data *pdata; | 186 | struct mdio_gpio_platform_data *pdata; |
| 187 | struct mii_bus *new_bus; | 187 | struct mii_bus *new_bus; |
| 188 | int ret; | 188 | int ret, bus_id; |
| 189 | 189 | ||
| 190 | if (pdev->dev.of_node) | 190 | if (pdev->dev.of_node) { |
| 191 | pdata = mdio_gpio_of_get_data(pdev); | 191 | pdata = mdio_gpio_of_get_data(pdev); |
| 192 | else | 192 | bus_id = of_alias_get_id(pdev->dev.of_node, "mdio-gpio"); |
| 193 | } else { | ||
| 193 | pdata = pdev->dev.platform_data; | 194 | pdata = pdev->dev.platform_data; |
| 195 | bus_id = pdev->id; | ||
| 196 | } | ||
| 194 | 197 | ||
| 195 | if (!pdata) | 198 | if (!pdata) |
| 196 | return -ENODEV; | 199 | return -ENODEV; |
| 197 | 200 | ||
| 198 | new_bus = mdio_gpio_bus_init(&pdev->dev, pdata, pdev->id); | 201 | new_bus = mdio_gpio_bus_init(&pdev->dev, pdata, bus_id); |
| 199 | if (!new_bus) | 202 | if (!new_bus) |
| 200 | return -ENODEV; | 203 | return -ENODEV; |
| 201 | 204 | ||
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index d44cca327588..ad86660fb8f9 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
| @@ -1794,10 +1794,12 @@ static void team_setup(struct net_device *dev) | |||
| 1794 | 1794 | ||
| 1795 | dev->features |= NETIF_F_LLTX; | 1795 | dev->features |= NETIF_F_LLTX; |
| 1796 | dev->features |= NETIF_F_GRO; | 1796 | dev->features |= NETIF_F_GRO; |
| 1797 | dev->hw_features = NETIF_F_HW_VLAN_TX | | 1797 | dev->hw_features = TEAM_VLAN_FEATURES | |
| 1798 | NETIF_F_HW_VLAN_TX | | ||
| 1798 | NETIF_F_HW_VLAN_RX | | 1799 | NETIF_F_HW_VLAN_RX | |
| 1799 | NETIF_F_HW_VLAN_FILTER; | 1800 | NETIF_F_HW_VLAN_FILTER; |
| 1800 | 1801 | ||
| 1802 | dev->hw_features &= ~(NETIF_F_ALL_CSUM & ~NETIF_F_HW_CSUM); | ||
| 1801 | dev->features |= dev->hw_features; | 1803 | dev->features |= dev->hw_features; |
| 1802 | } | 1804 | } |
| 1803 | 1805 | ||
diff --git a/drivers/net/team/team_mode_broadcast.c b/drivers/net/team/team_mode_broadcast.c index 9db0171e9366..c5db428e73fa 100644 --- a/drivers/net/team/team_mode_broadcast.c +++ b/drivers/net/team/team_mode_broadcast.c | |||
| @@ -29,8 +29,8 @@ static bool bc_transmit(struct team *team, struct sk_buff *skb) | |||
| 29 | if (last) { | 29 | if (last) { |
| 30 | skb2 = skb_clone(skb, GFP_ATOMIC); | 30 | skb2 = skb_clone(skb, GFP_ATOMIC); |
| 31 | if (skb2) { | 31 | if (skb2) { |
| 32 | ret = team_dev_queue_xmit(team, last, | 32 | ret = !team_dev_queue_xmit(team, last, |
| 33 | skb2); | 33 | skb2); |
| 34 | if (!sum_ret) | 34 | if (!sum_ret) |
| 35 | sum_ret = ret; | 35 | sum_ret = ret; |
| 36 | } | 36 | } |
| @@ -39,7 +39,7 @@ static bool bc_transmit(struct team *team, struct sk_buff *skb) | |||
| 39 | } | 39 | } |
| 40 | } | 40 | } |
| 41 | if (last) { | 41 | if (last) { |
| 42 | ret = team_dev_queue_xmit(team, last, skb); | 42 | ret = !team_dev_queue_xmit(team, last, skb); |
| 43 | if (!sum_ret) | 43 | if (!sum_ret) |
| 44 | sum_ret = ret; | 44 | sum_ret = ret; |
| 45 | } | 45 | } |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 3b566fa0f8e6..1ea91f4237f0 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
| @@ -385,6 +385,7 @@ static const struct usb_device_id products[] = { | |||
| 385 | }, | 385 | }, |
| 386 | 386 | ||
| 387 | /* 3. Combined interface devices matching on interface number */ | 387 | /* 3. Combined interface devices matching on interface number */ |
| 388 | {QMI_FIXED_INTF(0x12d1, 0x140c, 1)}, /* Huawei E173 */ | ||
| 388 | {QMI_FIXED_INTF(0x19d2, 0x0002, 1)}, | 389 | {QMI_FIXED_INTF(0x19d2, 0x0002, 1)}, |
| 389 | {QMI_FIXED_INTF(0x19d2, 0x0012, 1)}, | 390 | {QMI_FIXED_INTF(0x19d2, 0x0012, 1)}, |
| 390 | {QMI_FIXED_INTF(0x19d2, 0x0017, 3)}, | 391 | {QMI_FIXED_INTF(0x19d2, 0x0017, 3)}, |
diff --git a/drivers/net/wan/ixp4xx_hss.c b/drivers/net/wan/ixp4xx_hss.c index 3f575afd8cfc..760776b3d66c 100644 --- a/drivers/net/wan/ixp4xx_hss.c +++ b/drivers/net/wan/ixp4xx_hss.c | |||
| @@ -969,10 +969,12 @@ static int init_hdlc_queues(struct port *port) | |||
| 969 | { | 969 | { |
| 970 | int i; | 970 | int i; |
| 971 | 971 | ||
| 972 | if (!ports_open) | 972 | if (!ports_open) { |
| 973 | if (!(dma_pool = dma_pool_create(DRV_NAME, NULL, | 973 | dma_pool = dma_pool_create(DRV_NAME, &port->netdev->dev, |
| 974 | POOL_ALLOC_SIZE, 32, 0))) | 974 | POOL_ALLOC_SIZE, 32, 0); |
| 975 | if (!dma_pool) | ||
| 975 | return -ENOMEM; | 976 | return -ENOMEM; |
| 977 | } | ||
| 976 | 978 | ||
| 977 | if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL, | 979 | if (!(port->desc_tab = dma_pool_alloc(dma_pool, GFP_KERNEL, |
| 978 | &port->desc_tab_phys))) | 980 | &port->desc_tab_phys))) |
| @@ -1363,7 +1365,7 @@ static int __devinit hss_init_one(struct platform_device *pdev) | |||
| 1363 | 1365 | ||
| 1364 | platform_set_drvdata(pdev, port); | 1366 | platform_set_drvdata(pdev, port); |
| 1365 | 1367 | ||
| 1366 | netdev_info(dev, "HSS-%i\n", port->id); | 1368 | netdev_info(dev, "initialized\n"); |
| 1367 | return 0; | 1369 | return 0; |
| 1368 | 1370 | ||
| 1369 | err_free_netdev: | 1371 | err_free_netdev: |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 8e1559aba495..1829b445d0b0 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -1456,7 +1456,7 @@ static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type) | |||
| 1456 | switch (type) { | 1456 | switch (type) { |
| 1457 | case ATH9K_RESET_POWER_ON: | 1457 | case ATH9K_RESET_POWER_ON: |
| 1458 | ret = ath9k_hw_set_reset_power_on(ah); | 1458 | ret = ath9k_hw_set_reset_power_on(ah); |
| 1459 | if (!ret) | 1459 | if (ret) |
| 1460 | ah->reset_power_on = true; | 1460 | ah->reset_power_on = true; |
| 1461 | break; | 1461 | break; |
| 1462 | case ATH9K_RESET_WARM: | 1462 | case ATH9K_RESET_WARM: |
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c index fa4d1b8cd9f6..2d9eee93c743 100644 --- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c | |||
| @@ -1354,6 +1354,20 @@ static int iwlagn_mac_add_interface(struct ieee80211_hw *hw, | |||
| 1354 | vif_priv->ctx = ctx; | 1354 | vif_priv->ctx = ctx; |
| 1355 | ctx->vif = vif; | 1355 | ctx->vif = vif; |
| 1356 | 1356 | ||
| 1357 | /* | ||
| 1358 | * In SNIFFER device type, the firmware reports the FCS to | ||
| 1359 | * the host, rather than snipping it off. Unfortunately, | ||
| 1360 | * mac80211 doesn't (yet) provide a per-packet flag for | ||
| 1361 | * this, so that we have to set the hardware flag based | ||
| 1362 | * on the interfaces added. As the monitor interface can | ||
| 1363 | * only be present by itself, and will be removed before | ||
| 1364 | * other interfaces are added, this is safe. | ||
| 1365 | */ | ||
| 1366 | if (vif->type == NL80211_IFTYPE_MONITOR) | ||
| 1367 | priv->hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS; | ||
| 1368 | else | ||
| 1369 | priv->hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS; | ||
| 1370 | |||
| 1357 | err = iwl_setup_interface(priv, ctx); | 1371 | err = iwl_setup_interface(priv, ctx); |
| 1358 | if (!err || reset) | 1372 | if (!err || reset) |
| 1359 | goto out; | 1373 | goto out; |
diff --git a/drivers/net/wireless/iwlwifi/dvm/rxon.c b/drivers/net/wireless/iwlwifi/dvm/rxon.c index 10896393e5a0..2830ea290502 100644 --- a/drivers/net/wireless/iwlwifi/dvm/rxon.c +++ b/drivers/net/wireless/iwlwifi/dvm/rxon.c | |||
| @@ -1012,12 +1012,12 @@ static void iwl_calc_basic_rates(struct iwl_priv *priv, | |||
| 1012 | * As a consequence, it's not as complicated as it sounds, just add | 1012 | * As a consequence, it's not as complicated as it sounds, just add |
| 1013 | * any lower rates to the ACK rate bitmap. | 1013 | * any lower rates to the ACK rate bitmap. |
| 1014 | */ | 1014 | */ |
| 1015 | if (IWL_RATE_11M_INDEX < lowest_present_ofdm) | 1015 | if (IWL_RATE_11M_INDEX < lowest_present_cck) |
| 1016 | ofdm |= IWL_RATE_11M_MASK >> IWL_FIRST_CCK_RATE; | 1016 | cck |= IWL_RATE_11M_MASK >> IWL_FIRST_CCK_RATE; |
| 1017 | if (IWL_RATE_5M_INDEX < lowest_present_ofdm) | 1017 | if (IWL_RATE_5M_INDEX < lowest_present_cck) |
| 1018 | ofdm |= IWL_RATE_5M_MASK >> IWL_FIRST_CCK_RATE; | 1018 | cck |= IWL_RATE_5M_MASK >> IWL_FIRST_CCK_RATE; |
| 1019 | if (IWL_RATE_2M_INDEX < lowest_present_ofdm) | 1019 | if (IWL_RATE_2M_INDEX < lowest_present_cck) |
| 1020 | ofdm |= IWL_RATE_2M_MASK >> IWL_FIRST_CCK_RATE; | 1020 | cck |= IWL_RATE_2M_MASK >> IWL_FIRST_CCK_RATE; |
| 1021 | /* 1M already there or needed so always add */ | 1021 | /* 1M already there or needed so always add */ |
| 1022 | cck |= IWL_RATE_1M_MASK >> IWL_FIRST_CCK_RATE; | 1022 | cck |= IWL_RATE_1M_MASK >> IWL_FIRST_CCK_RATE; |
| 1023 | 1023 | ||
diff --git a/drivers/net/wireless/iwlwifi/pcie/tx.c b/drivers/net/wireless/iwlwifi/pcie/tx.c index 105e3af3c621..79a4ddc002d3 100644 --- a/drivers/net/wireless/iwlwifi/pcie/tx.c +++ b/drivers/net/wireless/iwlwifi/pcie/tx.c | |||
| @@ -480,20 +480,12 @@ void iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, int fifo, | |||
| 480 | void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id) | 480 | void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id) |
| 481 | { | 481 | { |
| 482 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | 482 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); |
| 483 | u16 rd_ptr, wr_ptr; | ||
| 484 | int n_bd = trans_pcie->txq[txq_id].q.n_bd; | ||
| 485 | 483 | ||
| 486 | if (!test_and_clear_bit(txq_id, trans_pcie->queue_used)) { | 484 | if (!test_and_clear_bit(txq_id, trans_pcie->queue_used)) { |
| 487 | WARN_ONCE(1, "queue %d not used", txq_id); | 485 | WARN_ONCE(1, "queue %d not used", txq_id); |
| 488 | return; | 486 | return; |
| 489 | } | 487 | } |
| 490 | 488 | ||
| 491 | rd_ptr = iwl_read_prph(trans, SCD_QUEUE_RDPTR(txq_id)) & (n_bd - 1); | ||
| 492 | wr_ptr = iwl_read_prph(trans, SCD_QUEUE_WRPTR(txq_id)); | ||
| 493 | |||
| 494 | WARN_ONCE(rd_ptr != wr_ptr, "queue %d isn't empty: [%d,%d]", | ||
| 495 | txq_id, rd_ptr, wr_ptr); | ||
| 496 | |||
| 497 | iwl_txq_set_inactive(trans, txq_id); | 489 | iwl_txq_set_inactive(trans, txq_id); |
| 498 | IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id); | 490 | IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id); |
| 499 | } | 491 | } |
diff --git a/drivers/net/wireless/mwifiex/cmdevt.c b/drivers/net/wireless/mwifiex/cmdevt.c index 8d465107f52b..ae9010ed58de 100644 --- a/drivers/net/wireless/mwifiex/cmdevt.c +++ b/drivers/net/wireless/mwifiex/cmdevt.c | |||
| @@ -890,9 +890,6 @@ mwifiex_cmd_timeout_func(unsigned long function_context) | |||
| 890 | return; | 890 | return; |
| 891 | } | 891 | } |
| 892 | cmd_node = adapter->curr_cmd; | 892 | cmd_node = adapter->curr_cmd; |
| 893 | if (cmd_node->wait_q_enabled) | ||
| 894 | adapter->cmd_wait_q.status = -ETIMEDOUT; | ||
| 895 | |||
| 896 | if (cmd_node) { | 893 | if (cmd_node) { |
| 897 | adapter->dbg.timeout_cmd_id = | 894 | adapter->dbg.timeout_cmd_id = |
| 898 | adapter->dbg.last_cmd_id[adapter->dbg.last_cmd_index]; | 895 | adapter->dbg.last_cmd_id[adapter->dbg.last_cmd_index]; |
| @@ -938,6 +935,14 @@ mwifiex_cmd_timeout_func(unsigned long function_context) | |||
| 938 | 935 | ||
| 939 | dev_err(adapter->dev, "ps_mode=%d ps_state=%d\n", | 936 | dev_err(adapter->dev, "ps_mode=%d ps_state=%d\n", |
| 940 | adapter->ps_mode, adapter->ps_state); | 937 | adapter->ps_mode, adapter->ps_state); |
| 938 | |||
| 939 | if (cmd_node->wait_q_enabled) { | ||
| 940 | adapter->cmd_wait_q.status = -ETIMEDOUT; | ||
| 941 | wake_up_interruptible(&adapter->cmd_wait_q.wait); | ||
| 942 | mwifiex_cancel_pending_ioctl(adapter); | ||
| 943 | /* reset cmd_sent flag to unblock new commands */ | ||
| 944 | adapter->cmd_sent = false; | ||
| 945 | } | ||
| 941 | } | 946 | } |
| 942 | if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) | 947 | if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) |
| 943 | mwifiex_init_fw_complete(adapter); | 948 | mwifiex_init_fw_complete(adapter); |
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c index fc8a9bfa1248..82cf0fa2d9f6 100644 --- a/drivers/net/wireless/mwifiex/sdio.c +++ b/drivers/net/wireless/mwifiex/sdio.c | |||
| @@ -161,7 +161,6 @@ static int mwifiex_sdio_suspend(struct device *dev) | |||
| 161 | struct sdio_mmc_card *card; | 161 | struct sdio_mmc_card *card; |
| 162 | struct mwifiex_adapter *adapter; | 162 | struct mwifiex_adapter *adapter; |
| 163 | mmc_pm_flag_t pm_flag = 0; | 163 | mmc_pm_flag_t pm_flag = 0; |
| 164 | int hs_actived = 0; | ||
| 165 | int i; | 164 | int i; |
| 166 | int ret = 0; | 165 | int ret = 0; |
| 167 | 166 | ||
| @@ -188,12 +187,14 @@ static int mwifiex_sdio_suspend(struct device *dev) | |||
| 188 | adapter = card->adapter; | 187 | adapter = card->adapter; |
| 189 | 188 | ||
| 190 | /* Enable the Host Sleep */ | 189 | /* Enable the Host Sleep */ |
| 191 | hs_actived = mwifiex_enable_hs(adapter); | 190 | if (!mwifiex_enable_hs(adapter)) { |
| 192 | if (hs_actived) { | 191 | dev_err(adapter->dev, "cmd: failed to suspend\n"); |
| 193 | pr_debug("cmd: suspend with MMC_PM_KEEP_POWER\n"); | 192 | return -EFAULT; |
| 194 | ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); | ||
| 195 | } | 193 | } |
| 196 | 194 | ||
| 195 | dev_dbg(adapter->dev, "cmd: suspend with MMC_PM_KEEP_POWER\n"); | ||
| 196 | ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER); | ||
| 197 | |||
| 197 | /* Indicate device suspended */ | 198 | /* Indicate device suspended */ |
| 198 | adapter->is_suspended = true; | 199 | adapter->is_suspended = true; |
| 199 | 200 | ||
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c index 9970c2b1b199..b7e6607e6b6d 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | |||
| @@ -297,6 +297,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { | |||
| 297 | /*=== Customer ID ===*/ | 297 | /*=== Customer ID ===*/ |
| 298 | /****** 8188CU ********/ | 298 | /****** 8188CU ********/ |
| 299 | {RTL_USB_DEVICE(0x050d, 0x1102, rtl92cu_hal_cfg)}, /*Belkin - Edimax*/ | 299 | {RTL_USB_DEVICE(0x050d, 0x1102, rtl92cu_hal_cfg)}, /*Belkin - Edimax*/ |
| 300 | {RTL_USB_DEVICE(0x050d, 0x11f2, rtl92cu_hal_cfg)}, /*Belkin - ISY*/ | ||
| 300 | {RTL_USB_DEVICE(0x06f8, 0xe033, rtl92cu_hal_cfg)}, /*Hercules - Edimax*/ | 301 | {RTL_USB_DEVICE(0x06f8, 0xe033, rtl92cu_hal_cfg)}, /*Hercules - Edimax*/ |
| 301 | {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ | 302 | {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ |
| 302 | {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ | 303 | {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index caa011008cd0..fc24eb9b3948 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -452,29 +452,85 @@ static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev, | |||
| 452 | /* Grant backend access to each skb fragment page. */ | 452 | /* Grant backend access to each skb fragment page. */ |
| 453 | for (i = 0; i < frags; i++) { | 453 | for (i = 0; i < frags; i++) { |
| 454 | skb_frag_t *frag = skb_shinfo(skb)->frags + i; | 454 | skb_frag_t *frag = skb_shinfo(skb)->frags + i; |
| 455 | struct page *page = skb_frag_page(frag); | ||
| 455 | 456 | ||
| 456 | tx->flags |= XEN_NETTXF_more_data; | 457 | len = skb_frag_size(frag); |
| 458 | offset = frag->page_offset; | ||
| 457 | 459 | ||
| 458 | id = get_id_from_freelist(&np->tx_skb_freelist, np->tx_skbs); | 460 | /* Data must not cross a page boundary. */ |
| 459 | np->tx_skbs[id].skb = skb_get(skb); | 461 | BUG_ON(len + offset > PAGE_SIZE<<compound_order(page)); |
| 460 | tx = RING_GET_REQUEST(&np->tx, prod++); | ||
| 461 | tx->id = id; | ||
| 462 | ref = gnttab_claim_grant_reference(&np->gref_tx_head); | ||
| 463 | BUG_ON((signed short)ref < 0); | ||
| 464 | 462 | ||
| 465 | mfn = pfn_to_mfn(page_to_pfn(skb_frag_page(frag))); | 463 | /* Skip unused frames from start of page */ |
| 466 | gnttab_grant_foreign_access_ref(ref, np->xbdev->otherend_id, | 464 | page += offset >> PAGE_SHIFT; |
| 467 | mfn, GNTMAP_readonly); | 465 | offset &= ~PAGE_MASK; |
| 468 | 466 | ||
| 469 | tx->gref = np->grant_tx_ref[id] = ref; | 467 | while (len > 0) { |
| 470 | tx->offset = frag->page_offset; | 468 | unsigned long bytes; |
| 471 | tx->size = skb_frag_size(frag); | 469 | |
| 472 | tx->flags = 0; | 470 | BUG_ON(offset >= PAGE_SIZE); |
| 471 | |||
| 472 | bytes = PAGE_SIZE - offset; | ||
| 473 | if (bytes > len) | ||
| 474 | bytes = len; | ||
| 475 | |||
| 476 | tx->flags |= XEN_NETTXF_more_data; | ||
| 477 | |||
| 478 | id = get_id_from_freelist(&np->tx_skb_freelist, | ||
| 479 | np->tx_skbs); | ||
| 480 | np->tx_skbs[id].skb = skb_get(skb); | ||
| 481 | tx = RING_GET_REQUEST(&np->tx, prod++); | ||
| 482 | tx->id = id; | ||
| 483 | ref = gnttab_claim_grant_reference(&np->gref_tx_head); | ||
| 484 | BUG_ON((signed short)ref < 0); | ||
| 485 | |||
| 486 | mfn = pfn_to_mfn(page_to_pfn(page)); | ||
| 487 | gnttab_grant_foreign_access_ref(ref, | ||
| 488 | np->xbdev->otherend_id, | ||
| 489 | mfn, GNTMAP_readonly); | ||
| 490 | |||
| 491 | tx->gref = np->grant_tx_ref[id] = ref; | ||
| 492 | tx->offset = offset; | ||
| 493 | tx->size = bytes; | ||
| 494 | tx->flags = 0; | ||
| 495 | |||
| 496 | offset += bytes; | ||
| 497 | len -= bytes; | ||
| 498 | |||
| 499 | /* Next frame */ | ||
| 500 | if (offset == PAGE_SIZE && len) { | ||
| 501 | BUG_ON(!PageCompound(page)); | ||
| 502 | page++; | ||
| 503 | offset = 0; | ||
| 504 | } | ||
| 505 | } | ||
| 473 | } | 506 | } |
| 474 | 507 | ||
| 475 | np->tx.req_prod_pvt = prod; | 508 | np->tx.req_prod_pvt = prod; |
| 476 | } | 509 | } |
| 477 | 510 | ||
| 511 | /* | ||
| 512 | * Count how many ring slots are required to send the frags of this | ||
| 513 | * skb. Each frag might be a compound page. | ||
| 514 | */ | ||
| 515 | static int xennet_count_skb_frag_slots(struct sk_buff *skb) | ||
| 516 | { | ||
| 517 | int i, frags = skb_shinfo(skb)->nr_frags; | ||
| 518 | int pages = 0; | ||
| 519 | |||
| 520 | for (i = 0; i < frags; i++) { | ||
| 521 | skb_frag_t *frag = skb_shinfo(skb)->frags + i; | ||
| 522 | unsigned long size = skb_frag_size(frag); | ||
| 523 | unsigned long offset = frag->page_offset; | ||
| 524 | |||
| 525 | /* Skip unused frames from start of page */ | ||
| 526 | offset &= ~PAGE_MASK; | ||
| 527 | |||
| 528 | pages += PFN_UP(offset + size); | ||
| 529 | } | ||
| 530 | |||
| 531 | return pages; | ||
| 532 | } | ||
| 533 | |||
| 478 | static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) | 534 | static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) |
| 479 | { | 535 | { |
| 480 | unsigned short id; | 536 | unsigned short id; |
| @@ -487,23 +543,23 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 487 | grant_ref_t ref; | 543 | grant_ref_t ref; |
| 488 | unsigned long mfn; | 544 | unsigned long mfn; |
| 489 | int notify; | 545 | int notify; |
| 490 | int frags = skb_shinfo(skb)->nr_frags; | 546 | int slots; |
| 491 | unsigned int offset = offset_in_page(data); | 547 | unsigned int offset = offset_in_page(data); |
| 492 | unsigned int len = skb_headlen(skb); | 548 | unsigned int len = skb_headlen(skb); |
| 493 | unsigned long flags; | 549 | unsigned long flags; |
| 494 | 550 | ||
| 495 | frags += DIV_ROUND_UP(offset + len, PAGE_SIZE); | 551 | slots = DIV_ROUND_UP(offset + len, PAGE_SIZE) + |
| 496 | if (unlikely(frags > MAX_SKB_FRAGS + 1)) { | 552 | xennet_count_skb_frag_slots(skb); |
| 497 | printk(KERN_ALERT "xennet: skb rides the rocket: %d frags\n", | 553 | if (unlikely(slots > MAX_SKB_FRAGS + 1)) { |
| 498 | frags); | 554 | net_alert_ratelimited( |
| 499 | dump_stack(); | 555 | "xennet: skb rides the rocket: %d slots\n", slots); |
| 500 | goto drop; | 556 | goto drop; |
| 501 | } | 557 | } |
| 502 | 558 | ||
| 503 | spin_lock_irqsave(&np->tx_lock, flags); | 559 | spin_lock_irqsave(&np->tx_lock, flags); |
| 504 | 560 | ||
| 505 | if (unlikely(!netif_carrier_ok(dev) || | 561 | if (unlikely(!netif_carrier_ok(dev) || |
| 506 | (frags > 1 && !xennet_can_sg(dev)) || | 562 | (slots > 1 && !xennet_can_sg(dev)) || |
| 507 | netif_needs_gso(skb, netif_skb_features(skb)))) { | 563 | netif_needs_gso(skb, netif_skb_features(skb)))) { |
| 508 | spin_unlock_irqrestore(&np->tx_lock, flags); | 564 | spin_unlock_irqrestore(&np->tx_lock, flags); |
| 509 | goto drop; | 565 | goto drop; |
diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c index 97c440a8cd61..30ae18a03a9c 100644 --- a/drivers/nfc/pn533.c +++ b/drivers/nfc/pn533.c | |||
| @@ -698,13 +698,14 @@ static void pn533_wq_cmd(struct work_struct *work) | |||
| 698 | 698 | ||
| 699 | cmd = list_first_entry(&dev->cmd_queue, struct pn533_cmd, queue); | 699 | cmd = list_first_entry(&dev->cmd_queue, struct pn533_cmd, queue); |
| 700 | 700 | ||
| 701 | list_del(&cmd->queue); | ||
| 702 | |||
| 701 | mutex_unlock(&dev->cmd_lock); | 703 | mutex_unlock(&dev->cmd_lock); |
| 702 | 704 | ||
| 703 | __pn533_send_cmd_frame_async(dev, cmd->out_frame, cmd->in_frame, | 705 | __pn533_send_cmd_frame_async(dev, cmd->out_frame, cmd->in_frame, |
| 704 | cmd->in_frame_len, cmd->cmd_complete, | 706 | cmd->in_frame_len, cmd->cmd_complete, |
| 705 | cmd->arg, cmd->flags); | 707 | cmd->arg, cmd->flags); |
| 706 | 708 | ||
| 707 | list_del(&cmd->queue); | ||
| 708 | kfree(cmd); | 709 | kfree(cmd); |
| 709 | } | 710 | } |
| 710 | 711 | ||
| @@ -1678,11 +1679,14 @@ static void pn533_deactivate_target(struct nfc_dev *nfc_dev, | |||
| 1678 | static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg, | 1679 | static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg, |
| 1679 | u8 *params, int params_len) | 1680 | u8 *params, int params_len) |
| 1680 | { | 1681 | { |
| 1681 | struct pn533_cmd_jump_dep *cmd; | ||
| 1682 | struct pn533_cmd_jump_dep_response *resp; | 1682 | struct pn533_cmd_jump_dep_response *resp; |
| 1683 | struct nfc_target nfc_target; | 1683 | struct nfc_target nfc_target; |
| 1684 | u8 target_gt_len; | 1684 | u8 target_gt_len; |
| 1685 | int rc; | 1685 | int rc; |
| 1686 | struct pn533_cmd_jump_dep *cmd = (struct pn533_cmd_jump_dep *)arg; | ||
| 1687 | u8 active = cmd->active; | ||
| 1688 | |||
| 1689 | kfree(arg); | ||
| 1686 | 1690 | ||
| 1687 | if (params_len == -ENOENT) { | 1691 | if (params_len == -ENOENT) { |
| 1688 | nfc_dev_dbg(&dev->interface->dev, ""); | 1692 | nfc_dev_dbg(&dev->interface->dev, ""); |
| @@ -1704,7 +1708,6 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg, | |||
| 1704 | } | 1708 | } |
| 1705 | 1709 | ||
| 1706 | resp = (struct pn533_cmd_jump_dep_response *) params; | 1710 | resp = (struct pn533_cmd_jump_dep_response *) params; |
| 1707 | cmd = (struct pn533_cmd_jump_dep *) arg; | ||
| 1708 | rc = resp->status & PN533_CMD_RET_MASK; | 1711 | rc = resp->status & PN533_CMD_RET_MASK; |
| 1709 | if (rc != PN533_CMD_RET_SUCCESS) { | 1712 | if (rc != PN533_CMD_RET_SUCCESS) { |
| 1710 | nfc_dev_err(&dev->interface->dev, | 1713 | nfc_dev_err(&dev->interface->dev, |
| @@ -1734,7 +1737,7 @@ static int pn533_in_dep_link_up_complete(struct pn533 *dev, void *arg, | |||
| 1734 | if (rc == 0) | 1737 | if (rc == 0) |
| 1735 | rc = nfc_dep_link_is_up(dev->nfc_dev, | 1738 | rc = nfc_dep_link_is_up(dev->nfc_dev, |
| 1736 | dev->nfc_dev->targets[0].idx, | 1739 | dev->nfc_dev->targets[0].idx, |
| 1737 | !cmd->active, NFC_RF_INITIATOR); | 1740 | !active, NFC_RF_INITIATOR); |
| 1738 | 1741 | ||
| 1739 | return 0; | 1742 | return 0; |
| 1740 | } | 1743 | } |
| @@ -1819,12 +1822,8 @@ static int pn533_dep_link_up(struct nfc_dev *nfc_dev, struct nfc_target *target, | |||
| 1819 | rc = pn533_send_cmd_frame_async(dev, dev->out_frame, dev->in_frame, | 1822 | rc = pn533_send_cmd_frame_async(dev, dev->out_frame, dev->in_frame, |
| 1820 | dev->in_maxlen, pn533_in_dep_link_up_complete, | 1823 | dev->in_maxlen, pn533_in_dep_link_up_complete, |
| 1821 | cmd, GFP_KERNEL); | 1824 | cmd, GFP_KERNEL); |
| 1822 | if (rc) | 1825 | if (rc < 0) |
| 1823 | goto out; | 1826 | kfree(cmd); |
| 1824 | |||
| 1825 | |||
| 1826 | out: | ||
| 1827 | kfree(cmd); | ||
| 1828 | 1827 | ||
| 1829 | return rc; | 1828 | return rc; |
| 1830 | } | 1829 | } |
| @@ -2078,8 +2077,12 @@ error: | |||
| 2078 | static int pn533_tm_send_complete(struct pn533 *dev, void *arg, | 2077 | static int pn533_tm_send_complete(struct pn533 *dev, void *arg, |
| 2079 | u8 *params, int params_len) | 2078 | u8 *params, int params_len) |
| 2080 | { | 2079 | { |
| 2080 | struct sk_buff *skb_out = arg; | ||
| 2081 | |||
| 2081 | nfc_dev_dbg(&dev->interface->dev, "%s", __func__); | 2082 | nfc_dev_dbg(&dev->interface->dev, "%s", __func__); |
| 2082 | 2083 | ||
| 2084 | dev_kfree_skb(skb_out); | ||
| 2085 | |||
| 2083 | if (params_len < 0) { | 2086 | if (params_len < 0) { |
| 2084 | nfc_dev_err(&dev->interface->dev, | 2087 | nfc_dev_err(&dev->interface->dev, |
| 2085 | "Error %d when sending data", | 2088 | "Error %d when sending data", |
| @@ -2117,7 +2120,7 @@ static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb) | |||
| 2117 | 2120 | ||
| 2118 | rc = pn533_send_cmd_frame_async(dev, out_frame, dev->in_frame, | 2121 | rc = pn533_send_cmd_frame_async(dev, out_frame, dev->in_frame, |
| 2119 | dev->in_maxlen, pn533_tm_send_complete, | 2122 | dev->in_maxlen, pn533_tm_send_complete, |
| 2120 | NULL, GFP_KERNEL); | 2123 | skb, GFP_KERNEL); |
| 2121 | if (rc) { | 2124 | if (rc) { |
| 2122 | nfc_dev_err(&dev->interface->dev, | 2125 | nfc_dev_err(&dev->interface->dev, |
| 2123 | "Error %d when trying to send data", rc); | 2126 | "Error %d when trying to send data", rc); |
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index d96caefd914a..aeecf0f72cad 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig | |||
| @@ -178,7 +178,7 @@ config PINCTRL_COH901 | |||
| 178 | ports of 8 GPIO pins each. | 178 | ports of 8 GPIO pins each. |
| 179 | 179 | ||
| 180 | config PINCTRL_SAMSUNG | 180 | config PINCTRL_SAMSUNG |
| 181 | bool "Samsung pinctrl driver" | 181 | bool |
| 182 | depends on OF && GPIOLIB | 182 | depends on OF && GPIOLIB |
| 183 | select PINMUX | 183 | select PINMUX |
| 184 | select PINCONF | 184 | select PINCONF |
diff --git a/drivers/remoteproc/remoteproc_virtio.c b/drivers/remoteproc/remoteproc_virtio.c index e7a4780e93db..9e198e590675 100644 --- a/drivers/remoteproc/remoteproc_virtio.c +++ b/drivers/remoteproc/remoteproc_virtio.c | |||
| @@ -120,15 +120,11 @@ static struct virtqueue *rp_find_vq(struct virtio_device *vdev, | |||
| 120 | return vq; | 120 | return vq; |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | static void rproc_virtio_del_vqs(struct virtio_device *vdev) | 123 | static void __rproc_virtio_del_vqs(struct virtio_device *vdev) |
| 124 | { | 124 | { |
| 125 | struct virtqueue *vq, *n; | 125 | struct virtqueue *vq, *n; |
| 126 | struct rproc *rproc = vdev_to_rproc(vdev); | ||
| 127 | struct rproc_vring *rvring; | 126 | struct rproc_vring *rvring; |
| 128 | 127 | ||
| 129 | /* power down the remote processor before deleting vqs */ | ||
| 130 | rproc_shutdown(rproc); | ||
| 131 | |||
| 132 | list_for_each_entry_safe(vq, n, &vdev->vqs, list) { | 128 | list_for_each_entry_safe(vq, n, &vdev->vqs, list) { |
| 133 | rvring = vq->priv; | 129 | rvring = vq->priv; |
| 134 | rvring->vq = NULL; | 130 | rvring->vq = NULL; |
| @@ -137,6 +133,16 @@ static void rproc_virtio_del_vqs(struct virtio_device *vdev) | |||
| 137 | } | 133 | } |
| 138 | } | 134 | } |
| 139 | 135 | ||
| 136 | static void rproc_virtio_del_vqs(struct virtio_device *vdev) | ||
| 137 | { | ||
| 138 | struct rproc *rproc = vdev_to_rproc(vdev); | ||
| 139 | |||
| 140 | /* power down the remote processor before deleting vqs */ | ||
| 141 | rproc_shutdown(rproc); | ||
| 142 | |||
| 143 | __rproc_virtio_del_vqs(vdev); | ||
| 144 | } | ||
| 145 | |||
| 140 | static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs, | 146 | static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs, |
| 141 | struct virtqueue *vqs[], | 147 | struct virtqueue *vqs[], |
| 142 | vq_callback_t *callbacks[], | 148 | vq_callback_t *callbacks[], |
| @@ -163,7 +169,7 @@ static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs, | |||
| 163 | return 0; | 169 | return 0; |
| 164 | 170 | ||
| 165 | error: | 171 | error: |
| 166 | rproc_virtio_del_vqs(vdev); | 172 | __rproc_virtio_del_vqs(vdev); |
| 167 | return ret; | 173 | return ret; |
| 168 | } | 174 | } |
| 169 | 175 | ||
diff --git a/drivers/rtc/rtc-tps65910.c b/drivers/rtc/rtc-tps65910.c index 7a82337e4dee..073108dcf9e7 100644 --- a/drivers/rtc/rtc-tps65910.c +++ b/drivers/rtc/rtc-tps65910.c | |||
| @@ -288,11 +288,11 @@ static int __devinit tps65910_rtc_probe(struct platform_device *pdev) | |||
| 288 | static int __devexit tps65910_rtc_remove(struct platform_device *pdev) | 288 | static int __devexit tps65910_rtc_remove(struct platform_device *pdev) |
| 289 | { | 289 | { |
| 290 | /* leave rtc running, but disable irqs */ | 290 | /* leave rtc running, but disable irqs */ |
| 291 | struct rtc_device *rtc = platform_get_drvdata(pdev); | 291 | struct tps65910_rtc *tps_rtc = platform_get_drvdata(pdev); |
| 292 | 292 | ||
| 293 | tps65910_rtc_alarm_irq_enable(&rtc->dev, 0); | 293 | tps65910_rtc_alarm_irq_enable(&pdev->dev, 0); |
| 294 | 294 | ||
| 295 | rtc_device_unregister(rtc); | 295 | rtc_device_unregister(tps_rtc->rtc); |
| 296 | return 0; | 296 | return 0; |
| 297 | } | 297 | } |
| 298 | 298 | ||
diff --git a/drivers/scsi/isci/request.c b/drivers/scsi/isci/request.c index c1bafc3f3fb1..9594ab62702b 100644 --- a/drivers/scsi/isci/request.c +++ b/drivers/scsi/isci/request.c | |||
| @@ -1972,7 +1972,7 @@ sci_io_request_frame_handler(struct isci_request *ireq, | |||
| 1972 | frame_index, | 1972 | frame_index, |
| 1973 | (void **)&frame_buffer); | 1973 | (void **)&frame_buffer); |
| 1974 | 1974 | ||
| 1975 | sci_controller_copy_sata_response(&ireq->stp.req, | 1975 | sci_controller_copy_sata_response(&ireq->stp.rsp, |
| 1976 | frame_header, | 1976 | frame_header, |
| 1977 | frame_buffer); | 1977 | frame_buffer); |
| 1978 | 1978 | ||
diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h index 16b7a72a70c4..3b2365c8eab2 100644 --- a/drivers/scsi/megaraid/megaraid_sas.h +++ b/drivers/scsi/megaraid/megaraid_sas.h | |||
| @@ -1276,7 +1276,7 @@ struct megasas_evt_detail { | |||
| 1276 | } __attribute__ ((packed)); | 1276 | } __attribute__ ((packed)); |
| 1277 | 1277 | ||
| 1278 | struct megasas_aen_event { | 1278 | struct megasas_aen_event { |
| 1279 | struct work_struct hotplug_work; | 1279 | struct delayed_work hotplug_work; |
| 1280 | struct megasas_instance *instance; | 1280 | struct megasas_instance *instance; |
| 1281 | }; | 1281 | }; |
| 1282 | 1282 | ||
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index d2c5366aff7f..e4f2baacf1e1 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c | |||
| @@ -2060,9 +2060,9 @@ megasas_service_aen(struct megasas_instance *instance, struct megasas_cmd *cmd) | |||
| 2060 | } else { | 2060 | } else { |
| 2061 | ev->instance = instance; | 2061 | ev->instance = instance; |
| 2062 | instance->ev = ev; | 2062 | instance->ev = ev; |
| 2063 | INIT_WORK(&ev->hotplug_work, megasas_aen_polling); | 2063 | INIT_DELAYED_WORK(&ev->hotplug_work, |
| 2064 | schedule_delayed_work( | 2064 | megasas_aen_polling); |
| 2065 | (struct delayed_work *)&ev->hotplug_work, 0); | 2065 | schedule_delayed_work(&ev->hotplug_work, 0); |
| 2066 | } | 2066 | } |
| 2067 | } | 2067 | } |
| 2068 | } | 2068 | } |
| @@ -4352,8 +4352,7 @@ megasas_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 4352 | /* cancel the delayed work if this work still in queue */ | 4352 | /* cancel the delayed work if this work still in queue */ |
| 4353 | if (instance->ev != NULL) { | 4353 | if (instance->ev != NULL) { |
| 4354 | struct megasas_aen_event *ev = instance->ev; | 4354 | struct megasas_aen_event *ev = instance->ev; |
| 4355 | cancel_delayed_work_sync( | 4355 | cancel_delayed_work_sync(&ev->hotplug_work); |
| 4356 | (struct delayed_work *)&ev->hotplug_work); | ||
| 4357 | instance->ev = NULL; | 4356 | instance->ev = NULL; |
| 4358 | } | 4357 | } |
| 4359 | 4358 | ||
| @@ -4545,8 +4544,7 @@ static void __devexit megasas_detach_one(struct pci_dev *pdev) | |||
| 4545 | /* cancel the delayed work if this work still in queue*/ | 4544 | /* cancel the delayed work if this work still in queue*/ |
| 4546 | if (instance->ev != NULL) { | 4545 | if (instance->ev != NULL) { |
| 4547 | struct megasas_aen_event *ev = instance->ev; | 4546 | struct megasas_aen_event *ev = instance->ev; |
| 4548 | cancel_delayed_work_sync( | 4547 | cancel_delayed_work_sync(&ev->hotplug_work); |
| 4549 | (struct delayed_work *)&ev->hotplug_work); | ||
| 4550 | instance->ev = NULL; | 4548 | instance->ev = NULL; |
| 4551 | } | 4549 | } |
| 4552 | 4550 | ||
| @@ -5190,7 +5188,7 @@ static void | |||
| 5190 | megasas_aen_polling(struct work_struct *work) | 5188 | megasas_aen_polling(struct work_struct *work) |
| 5191 | { | 5189 | { |
| 5192 | struct megasas_aen_event *ev = | 5190 | struct megasas_aen_event *ev = |
| 5193 | container_of(work, struct megasas_aen_event, hotplug_work); | 5191 | container_of(work, struct megasas_aen_event, hotplug_work.work); |
| 5194 | struct megasas_instance *instance = ev->instance; | 5192 | struct megasas_instance *instance = ev->instance; |
| 5195 | union megasas_evt_class_locale class_locale; | 5193 | union megasas_evt_class_locale class_locale; |
| 5196 | struct Scsi_Host *host; | 5194 | struct Scsi_Host *host; |
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 2936b447cae9..2c0d0ec8150b 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
| @@ -55,6 +55,7 @@ | |||
| 55 | #include <linux/cpu.h> | 55 | #include <linux/cpu.h> |
| 56 | #include <linux/mutex.h> | 56 | #include <linux/mutex.h> |
| 57 | #include <linux/async.h> | 57 | #include <linux/async.h> |
| 58 | #include <asm/unaligned.h> | ||
| 58 | 59 | ||
| 59 | #include <scsi/scsi.h> | 60 | #include <scsi/scsi.h> |
| 60 | #include <scsi/scsi_cmnd.h> | 61 | #include <scsi/scsi_cmnd.h> |
| @@ -1062,6 +1063,50 @@ int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf, | |||
| 1062 | EXPORT_SYMBOL_GPL(scsi_get_vpd_page); | 1063 | EXPORT_SYMBOL_GPL(scsi_get_vpd_page); |
| 1063 | 1064 | ||
| 1064 | /** | 1065 | /** |
| 1066 | * scsi_report_opcode - Find out if a given command opcode is supported | ||
| 1067 | * @sdev: scsi device to query | ||
| 1068 | * @buffer: scratch buffer (must be at least 20 bytes long) | ||
| 1069 | * @len: length of buffer | ||
| 1070 | * @opcode: opcode for command to look up | ||
| 1071 | * | ||
| 1072 | * Uses the REPORT SUPPORTED OPERATION CODES to look up the given | ||
| 1073 | * opcode. Returns 0 if RSOC fails or if the command opcode is | ||
| 1074 | * unsupported. Returns 1 if the device claims to support the command. | ||
| 1075 | */ | ||
| 1076 | int scsi_report_opcode(struct scsi_device *sdev, unsigned char *buffer, | ||
| 1077 | unsigned int len, unsigned char opcode) | ||
| 1078 | { | ||
| 1079 | unsigned char cmd[16]; | ||
| 1080 | struct scsi_sense_hdr sshdr; | ||
| 1081 | int result; | ||
| 1082 | |||
| 1083 | if (sdev->no_report_opcodes || sdev->scsi_level < SCSI_SPC_3) | ||
| 1084 | return 0; | ||
| 1085 | |||
| 1086 | memset(cmd, 0, 16); | ||
| 1087 | cmd[0] = MAINTENANCE_IN; | ||
| 1088 | cmd[1] = MI_REPORT_SUPPORTED_OPERATION_CODES; | ||
| 1089 | cmd[2] = 1; /* One command format */ | ||
| 1090 | cmd[3] = opcode; | ||
| 1091 | put_unaligned_be32(len, &cmd[6]); | ||
| 1092 | memset(buffer, 0, len); | ||
| 1093 | |||
| 1094 | result = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buffer, len, | ||
| 1095 | &sshdr, 30 * HZ, 3, NULL); | ||
| 1096 | |||
| 1097 | if (result && scsi_sense_valid(&sshdr) && | ||
| 1098 | sshdr.sense_key == ILLEGAL_REQUEST && | ||
| 1099 | (sshdr.asc == 0x20 || sshdr.asc == 0x24) && sshdr.ascq == 0x00) | ||
| 1100 | return 0; | ||
| 1101 | |||
| 1102 | if ((buffer[1] & 3) == 3) /* Command supported */ | ||
| 1103 | return 1; | ||
| 1104 | |||
| 1105 | return 0; | ||
| 1106 | } | ||
| 1107 | EXPORT_SYMBOL(scsi_report_opcode); | ||
| 1108 | |||
| 1109 | /** | ||
| 1065 | * scsi_device_get - get an additional reference to a scsi_device | 1110 | * scsi_device_get - get an additional reference to a scsi_device |
| 1066 | * @sdev: device to get a reference to | 1111 | * @sdev: device to get a reference to |
| 1067 | * | 1112 | * |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index da36a3a81a9e..9032e910bca3 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -900,11 +900,23 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
| 900 | action = ACTION_FAIL; | 900 | action = ACTION_FAIL; |
| 901 | error = -EILSEQ; | 901 | error = -EILSEQ; |
| 902 | /* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */ | 902 | /* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */ |
| 903 | } else if ((sshdr.asc == 0x20 || sshdr.asc == 0x24) && | 903 | } else if (sshdr.asc == 0x20 || sshdr.asc == 0x24) { |
| 904 | (cmd->cmnd[0] == UNMAP || | 904 | switch (cmd->cmnd[0]) { |
| 905 | cmd->cmnd[0] == WRITE_SAME_16 || | 905 | case UNMAP: |
| 906 | cmd->cmnd[0] == WRITE_SAME)) { | 906 | description = "Discard failure"; |
| 907 | description = "Discard failure"; | 907 | break; |
| 908 | case WRITE_SAME: | ||
| 909 | case WRITE_SAME_16: | ||
| 910 | if (cmd->cmnd[1] & 0x8) | ||
| 911 | description = "Discard failure"; | ||
| 912 | else | ||
| 913 | description = | ||
| 914 | "Write same failure"; | ||
| 915 | break; | ||
| 916 | default: | ||
| 917 | description = "Invalid command failure"; | ||
| 918 | break; | ||
| 919 | } | ||
| 908 | action = ACTION_FAIL; | 920 | action = ACTION_FAIL; |
| 909 | error = -EREMOTEIO; | 921 | error = -EREMOTEIO; |
| 910 | } else | 922 | } else |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 12f6fdfc1147..352bc77b7c88 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
| @@ -99,6 +99,7 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_RBC); | |||
| 99 | #endif | 99 | #endif |
| 100 | 100 | ||
| 101 | static void sd_config_discard(struct scsi_disk *, unsigned int); | 101 | static void sd_config_discard(struct scsi_disk *, unsigned int); |
| 102 | static void sd_config_write_same(struct scsi_disk *); | ||
| 102 | static int sd_revalidate_disk(struct gendisk *); | 103 | static int sd_revalidate_disk(struct gendisk *); |
| 103 | static void sd_unlock_native_capacity(struct gendisk *disk); | 104 | static void sd_unlock_native_capacity(struct gendisk *disk); |
| 104 | static int sd_probe(struct device *); | 105 | static int sd_probe(struct device *); |
| @@ -395,6 +396,45 @@ sd_store_max_medium_access_timeouts(struct device *dev, | |||
| 395 | return err ? err : count; | 396 | return err ? err : count; |
| 396 | } | 397 | } |
| 397 | 398 | ||
| 399 | static ssize_t | ||
| 400 | sd_show_write_same_blocks(struct device *dev, struct device_attribute *attr, | ||
| 401 | char *buf) | ||
| 402 | { | ||
| 403 | struct scsi_disk *sdkp = to_scsi_disk(dev); | ||
| 404 | |||
| 405 | return snprintf(buf, 20, "%u\n", sdkp->max_ws_blocks); | ||
| 406 | } | ||
| 407 | |||
| 408 | static ssize_t | ||
| 409 | sd_store_write_same_blocks(struct device *dev, struct device_attribute *attr, | ||
| 410 | const char *buf, size_t count) | ||
| 411 | { | ||
| 412 | struct scsi_disk *sdkp = to_scsi_disk(dev); | ||
| 413 | struct scsi_device *sdp = sdkp->device; | ||
| 414 | unsigned long max; | ||
| 415 | int err; | ||
| 416 | |||
| 417 | if (!capable(CAP_SYS_ADMIN)) | ||
| 418 | return -EACCES; | ||
| 419 | |||
| 420 | if (sdp->type != TYPE_DISK) | ||
| 421 | return -EINVAL; | ||
| 422 | |||
| 423 | err = kstrtoul(buf, 10, &max); | ||
| 424 | |||
| 425 | if (err) | ||
| 426 | return err; | ||
| 427 | |||
| 428 | if (max == 0) | ||
| 429 | sdp->no_write_same = 1; | ||
| 430 | else if (max <= SD_MAX_WS16_BLOCKS) | ||
| 431 | sdkp->max_ws_blocks = max; | ||
| 432 | |||
| 433 | sd_config_write_same(sdkp); | ||
| 434 | |||
| 435 | return count; | ||
| 436 | } | ||
| 437 | |||
| 398 | static struct device_attribute sd_disk_attrs[] = { | 438 | static struct device_attribute sd_disk_attrs[] = { |
| 399 | __ATTR(cache_type, S_IRUGO|S_IWUSR, sd_show_cache_type, | 439 | __ATTR(cache_type, S_IRUGO|S_IWUSR, sd_show_cache_type, |
| 400 | sd_store_cache_type), | 440 | sd_store_cache_type), |
| @@ -410,6 +450,8 @@ static struct device_attribute sd_disk_attrs[] = { | |||
| 410 | __ATTR(thin_provisioning, S_IRUGO, sd_show_thin_provisioning, NULL), | 450 | __ATTR(thin_provisioning, S_IRUGO, sd_show_thin_provisioning, NULL), |
| 411 | __ATTR(provisioning_mode, S_IRUGO|S_IWUSR, sd_show_provisioning_mode, | 451 | __ATTR(provisioning_mode, S_IRUGO|S_IWUSR, sd_show_provisioning_mode, |
| 412 | sd_store_provisioning_mode), | 452 | sd_store_provisioning_mode), |
| 453 | __ATTR(max_write_same_blocks, S_IRUGO|S_IWUSR, | ||
| 454 | sd_show_write_same_blocks, sd_store_write_same_blocks), | ||
| 413 | __ATTR(max_medium_access_timeouts, S_IRUGO|S_IWUSR, | 455 | __ATTR(max_medium_access_timeouts, S_IRUGO|S_IWUSR, |
| 414 | sd_show_max_medium_access_timeouts, | 456 | sd_show_max_medium_access_timeouts, |
| 415 | sd_store_max_medium_access_timeouts), | 457 | sd_store_max_medium_access_timeouts), |
| @@ -561,19 +603,23 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode) | |||
| 561 | return; | 603 | return; |
| 562 | 604 | ||
| 563 | case SD_LBP_UNMAP: | 605 | case SD_LBP_UNMAP: |
| 564 | max_blocks = min_not_zero(sdkp->max_unmap_blocks, 0xffffffff); | 606 | max_blocks = min_not_zero(sdkp->max_unmap_blocks, |
| 607 | (u32)SD_MAX_WS16_BLOCKS); | ||
| 565 | break; | 608 | break; |
| 566 | 609 | ||
| 567 | case SD_LBP_WS16: | 610 | case SD_LBP_WS16: |
| 568 | max_blocks = min_not_zero(sdkp->max_ws_blocks, 0xffffffff); | 611 | max_blocks = min_not_zero(sdkp->max_ws_blocks, |
| 612 | (u32)SD_MAX_WS16_BLOCKS); | ||
| 569 | break; | 613 | break; |
| 570 | 614 | ||
| 571 | case SD_LBP_WS10: | 615 | case SD_LBP_WS10: |
| 572 | max_blocks = min_not_zero(sdkp->max_ws_blocks, (u32)0xffff); | 616 | max_blocks = min_not_zero(sdkp->max_ws_blocks, |
| 617 | (u32)SD_MAX_WS10_BLOCKS); | ||
| 573 | break; | 618 | break; |
| 574 | 619 | ||
| 575 | case SD_LBP_ZERO: | 620 | case SD_LBP_ZERO: |
| 576 | max_blocks = min_not_zero(sdkp->max_ws_blocks, (u32)0xffff); | 621 | max_blocks = min_not_zero(sdkp->max_ws_blocks, |
| 622 | (u32)SD_MAX_WS10_BLOCKS); | ||
| 577 | q->limits.discard_zeroes_data = 1; | 623 | q->limits.discard_zeroes_data = 1; |
| 578 | break; | 624 | break; |
| 579 | } | 625 | } |
| @@ -583,29 +629,26 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode) | |||
| 583 | } | 629 | } |
| 584 | 630 | ||
| 585 | /** | 631 | /** |
| 586 | * scsi_setup_discard_cmnd - unmap blocks on thinly provisioned device | 632 | * sd_setup_discard_cmnd - unmap blocks on thinly provisioned device |
| 587 | * @sdp: scsi device to operate one | 633 | * @sdp: scsi device to operate one |
| 588 | * @rq: Request to prepare | 634 | * @rq: Request to prepare |
| 589 | * | 635 | * |
| 590 | * Will issue either UNMAP or WRITE SAME(16) depending on preference | 636 | * Will issue either UNMAP or WRITE SAME(16) depending on preference |
| 591 | * indicated by target device. | 637 | * indicated by target device. |
| 592 | **/ | 638 | **/ |
| 593 | static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq) | 639 | static int sd_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq) |
| 594 | { | 640 | { |
| 595 | struct scsi_disk *sdkp = scsi_disk(rq->rq_disk); | 641 | struct scsi_disk *sdkp = scsi_disk(rq->rq_disk); |
| 596 | struct bio *bio = rq->bio; | 642 | sector_t sector = blk_rq_pos(rq); |
| 597 | sector_t sector = bio->bi_sector; | 643 | unsigned int nr_sectors = blk_rq_sectors(rq); |
| 598 | unsigned int nr_sectors = bio_sectors(bio); | 644 | unsigned int nr_bytes = blk_rq_bytes(rq); |
| 599 | unsigned int len; | 645 | unsigned int len; |
| 600 | int ret; | 646 | int ret; |
| 601 | char *buf; | 647 | char *buf; |
| 602 | struct page *page; | 648 | struct page *page; |
| 603 | 649 | ||
| 604 | if (sdkp->device->sector_size == 4096) { | 650 | sector >>= ilog2(sdp->sector_size) - 9; |
| 605 | sector >>= 3; | 651 | nr_sectors >>= ilog2(sdp->sector_size) - 9; |
| 606 | nr_sectors >>= 3; | ||
| 607 | } | ||
| 608 | |||
| 609 | rq->timeout = SD_TIMEOUT; | 652 | rq->timeout = SD_TIMEOUT; |
| 610 | 653 | ||
| 611 | memset(rq->cmd, 0, rq->cmd_len); | 654 | memset(rq->cmd, 0, rq->cmd_len); |
| @@ -660,6 +703,7 @@ static int scsi_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq) | |||
| 660 | blk_add_request_payload(rq, page, len); | 703 | blk_add_request_payload(rq, page, len); |
| 661 | ret = scsi_setup_blk_pc_cmnd(sdp, rq); | 704 | ret = scsi_setup_blk_pc_cmnd(sdp, rq); |
| 662 | rq->buffer = page_address(page); | 705 | rq->buffer = page_address(page); |
| 706 | rq->__data_len = nr_bytes; | ||
| 663 | 707 | ||
| 664 | out: | 708 | out: |
| 665 | if (ret != BLKPREP_OK) { | 709 | if (ret != BLKPREP_OK) { |
| @@ -669,6 +713,83 @@ out: | |||
| 669 | return ret; | 713 | return ret; |
| 670 | } | 714 | } |
| 671 | 715 | ||
| 716 | static void sd_config_write_same(struct scsi_disk *sdkp) | ||
| 717 | { | ||
| 718 | struct request_queue *q = sdkp->disk->queue; | ||
| 719 | unsigned int logical_block_size = sdkp->device->sector_size; | ||
| 720 | unsigned int blocks = 0; | ||
| 721 | |||
| 722 | if (sdkp->device->no_write_same) { | ||
| 723 | sdkp->max_ws_blocks = 0; | ||
| 724 | goto out; | ||
| 725 | } | ||
| 726 | |||
| 727 | /* Some devices can not handle block counts above 0xffff despite | ||
| 728 | * supporting WRITE SAME(16). Consequently we default to 64k | ||
| 729 | * blocks per I/O unless the device explicitly advertises a | ||
| 730 | * bigger limit. | ||
| 731 | */ | ||
| 732 | if (sdkp->max_ws_blocks == 0) | ||
| 733 | sdkp->max_ws_blocks = SD_MAX_WS10_BLOCKS; | ||
| 734 | |||
| 735 | if (sdkp->ws16 || sdkp->max_ws_blocks > SD_MAX_WS10_BLOCKS) | ||
| 736 | blocks = min_not_zero(sdkp->max_ws_blocks, | ||
| 737 | (u32)SD_MAX_WS16_BLOCKS); | ||
| 738 | else | ||
| 739 | blocks = min_not_zero(sdkp->max_ws_blocks, | ||
| 740 | (u32)SD_MAX_WS10_BLOCKS); | ||
| 741 | |||
| 742 | out: | ||
| 743 | blk_queue_max_write_same_sectors(q, blocks * (logical_block_size >> 9)); | ||
| 744 | } | ||
| 745 | |||
| 746 | /** | ||
| 747 | * sd_setup_write_same_cmnd - write the same data to multiple blocks | ||
| 748 | * @sdp: scsi device to operate one | ||
| 749 | * @rq: Request to prepare | ||
| 750 | * | ||
| 751 | * Will issue either WRITE SAME(10) or WRITE SAME(16) depending on | ||
| 752 | * preference indicated by target device. | ||
| 753 | **/ | ||
| 754 | static int sd_setup_write_same_cmnd(struct scsi_device *sdp, struct request *rq) | ||
| 755 | { | ||
| 756 | struct scsi_disk *sdkp = scsi_disk(rq->rq_disk); | ||
| 757 | struct bio *bio = rq->bio; | ||
| 758 | sector_t sector = blk_rq_pos(rq); | ||
| 759 | unsigned int nr_sectors = blk_rq_sectors(rq); | ||
| 760 | unsigned int nr_bytes = blk_rq_bytes(rq); | ||
| 761 | int ret; | ||
| 762 | |||
| 763 | if (sdkp->device->no_write_same) | ||
| 764 | return BLKPREP_KILL; | ||
| 765 | |||
| 766 | BUG_ON(bio_offset(bio) || bio_iovec(bio)->bv_len != sdp->sector_size); | ||
| 767 | |||
| 768 | sector >>= ilog2(sdp->sector_size) - 9; | ||
| 769 | nr_sectors >>= ilog2(sdp->sector_size) - 9; | ||
| 770 | |||
| 771 | rq->__data_len = sdp->sector_size; | ||
| 772 | rq->timeout = SD_WRITE_SAME_TIMEOUT; | ||
| 773 | memset(rq->cmd, 0, rq->cmd_len); | ||
| 774 | |||
| 775 | if (sdkp->ws16 || sector > 0xffffffff || nr_sectors > 0xffff) { | ||
| 776 | rq->cmd_len = 16; | ||
| 777 | rq->cmd[0] = WRITE_SAME_16; | ||
| 778 | put_unaligned_be64(sector, &rq->cmd[2]); | ||
| 779 | put_unaligned_be32(nr_sectors, &rq->cmd[10]); | ||
| 780 | } else { | ||
| 781 | rq->cmd_len = 10; | ||
| 782 | rq->cmd[0] = WRITE_SAME; | ||
| 783 | put_unaligned_be32(sector, &rq->cmd[2]); | ||
| 784 | put_unaligned_be16(nr_sectors, &rq->cmd[7]); | ||
| 785 | } | ||
| 786 | |||
| 787 | ret = scsi_setup_blk_pc_cmnd(sdp, rq); | ||
| 788 | rq->__data_len = nr_bytes; | ||
| 789 | |||
| 790 | return ret; | ||
| 791 | } | ||
| 792 | |||
| 672 | static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq) | 793 | static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq) |
| 673 | { | 794 | { |
| 674 | rq->timeout = SD_FLUSH_TIMEOUT; | 795 | rq->timeout = SD_FLUSH_TIMEOUT; |
| @@ -712,7 +833,10 @@ static int sd_prep_fn(struct request_queue *q, struct request *rq) | |||
| 712 | * block PC requests to make life easier. | 833 | * block PC requests to make life easier. |
| 713 | */ | 834 | */ |
| 714 | if (rq->cmd_flags & REQ_DISCARD) { | 835 | if (rq->cmd_flags & REQ_DISCARD) { |
| 715 | ret = scsi_setup_discard_cmnd(sdp, rq); | 836 | ret = sd_setup_discard_cmnd(sdp, rq); |
| 837 | goto out; | ||
| 838 | } else if (rq->cmd_flags & REQ_WRITE_SAME) { | ||
| 839 | ret = sd_setup_write_same_cmnd(sdp, rq); | ||
| 716 | goto out; | 840 | goto out; |
| 717 | } else if (rq->cmd_flags & REQ_FLUSH) { | 841 | } else if (rq->cmd_flags & REQ_FLUSH) { |
| 718 | ret = scsi_setup_flush_cmnd(sdp, rq); | 842 | ret = scsi_setup_flush_cmnd(sdp, rq); |
| @@ -1482,12 +1606,21 @@ static int sd_done(struct scsi_cmnd *SCpnt) | |||
| 1482 | unsigned int good_bytes = result ? 0 : scsi_bufflen(SCpnt); | 1606 | unsigned int good_bytes = result ? 0 : scsi_bufflen(SCpnt); |
| 1483 | struct scsi_sense_hdr sshdr; | 1607 | struct scsi_sense_hdr sshdr; |
| 1484 | struct scsi_disk *sdkp = scsi_disk(SCpnt->request->rq_disk); | 1608 | struct scsi_disk *sdkp = scsi_disk(SCpnt->request->rq_disk); |
| 1609 | struct request *req = SCpnt->request; | ||
| 1485 | int sense_valid = 0; | 1610 | int sense_valid = 0; |
| 1486 | int sense_deferred = 0; | 1611 | int sense_deferred = 0; |
| 1487 | unsigned char op = SCpnt->cmnd[0]; | 1612 | unsigned char op = SCpnt->cmnd[0]; |
| 1613 | unsigned char unmap = SCpnt->cmnd[1] & 8; | ||
| 1488 | 1614 | ||
| 1489 | if ((SCpnt->request->cmd_flags & REQ_DISCARD) && !result) | 1615 | if (req->cmd_flags & REQ_DISCARD || req->cmd_flags & REQ_WRITE_SAME) { |
| 1490 | scsi_set_resid(SCpnt, 0); | 1616 | if (!result) { |
| 1617 | good_bytes = blk_rq_bytes(req); | ||
| 1618 | scsi_set_resid(SCpnt, 0); | ||
| 1619 | } else { | ||
| 1620 | good_bytes = 0; | ||
| 1621 | scsi_set_resid(SCpnt, blk_rq_bytes(req)); | ||
| 1622 | } | ||
| 1623 | } | ||
| 1491 | 1624 | ||
| 1492 | if (result) { | 1625 | if (result) { |
| 1493 | sense_valid = scsi_command_normalize_sense(SCpnt, &sshdr); | 1626 | sense_valid = scsi_command_normalize_sense(SCpnt, &sshdr); |
| @@ -1536,9 +1669,25 @@ static int sd_done(struct scsi_cmnd *SCpnt) | |||
| 1536 | if (sshdr.asc == 0x10) /* DIX: Host detected corruption */ | 1669 | if (sshdr.asc == 0x10) /* DIX: Host detected corruption */ |
| 1537 | good_bytes = sd_completed_bytes(SCpnt); | 1670 | good_bytes = sd_completed_bytes(SCpnt); |
| 1538 | /* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */ | 1671 | /* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */ |
| 1539 | if ((sshdr.asc == 0x20 || sshdr.asc == 0x24) && | 1672 | if (sshdr.asc == 0x20 || sshdr.asc == 0x24) { |
| 1540 | (op == UNMAP || op == WRITE_SAME_16 || op == WRITE_SAME)) | 1673 | switch (op) { |
| 1541 | sd_config_discard(sdkp, SD_LBP_DISABLE); | 1674 | case UNMAP: |
| 1675 | sd_config_discard(sdkp, SD_LBP_DISABLE); | ||
| 1676 | break; | ||
| 1677 | case WRITE_SAME_16: | ||
| 1678 | case WRITE_SAME: | ||
| 1679 | if (unmap) | ||
| 1680 | sd_config_discard(sdkp, SD_LBP_DISABLE); | ||
| 1681 | else { | ||
| 1682 | sdkp->device->no_write_same = 1; | ||
| 1683 | sd_config_write_same(sdkp); | ||
| 1684 | |||
| 1685 | good_bytes = 0; | ||
| 1686 | req->__data_len = blk_rq_bytes(req); | ||
| 1687 | req->cmd_flags |= REQ_QUIET; | ||
| 1688 | } | ||
| 1689 | } | ||
| 1690 | } | ||
| 1542 | break; | 1691 | break; |
| 1543 | default: | 1692 | default: |
| 1544 | break; | 1693 | break; |
| @@ -2374,9 +2523,7 @@ static void sd_read_block_limits(struct scsi_disk *sdkp) | |||
| 2374 | if (buffer[3] == 0x3c) { | 2523 | if (buffer[3] == 0x3c) { |
| 2375 | unsigned int lba_count, desc_count; | 2524 | unsigned int lba_count, desc_count; |
| 2376 | 2525 | ||
| 2377 | sdkp->max_ws_blocks = | 2526 | sdkp->max_ws_blocks = (u32)get_unaligned_be64(&buffer[36]); |
| 2378 | (u32) min_not_zero(get_unaligned_be64(&buffer[36]), | ||
| 2379 | (u64)0xffffffff); | ||
| 2380 | 2527 | ||
| 2381 | if (!sdkp->lbpme) | 2528 | if (!sdkp->lbpme) |
| 2382 | goto out; | 2529 | goto out; |
| @@ -2469,6 +2616,13 @@ static void sd_read_block_provisioning(struct scsi_disk *sdkp) | |||
| 2469 | kfree(buffer); | 2616 | kfree(buffer); |
| 2470 | } | 2617 | } |
| 2471 | 2618 | ||
| 2619 | static void sd_read_write_same(struct scsi_disk *sdkp, unsigned char *buffer) | ||
| 2620 | { | ||
| 2621 | if (scsi_report_opcode(sdkp->device, buffer, SD_BUF_SIZE, | ||
| 2622 | WRITE_SAME_16)) | ||
| 2623 | sdkp->ws16 = 1; | ||
| 2624 | } | ||
| 2625 | |||
| 2472 | static int sd_try_extended_inquiry(struct scsi_device *sdp) | 2626 | static int sd_try_extended_inquiry(struct scsi_device *sdp) |
| 2473 | { | 2627 | { |
| 2474 | /* | 2628 | /* |
| @@ -2528,6 +2682,7 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
| 2528 | sd_read_write_protect_flag(sdkp, buffer); | 2682 | sd_read_write_protect_flag(sdkp, buffer); |
| 2529 | sd_read_cache_type(sdkp, buffer); | 2683 | sd_read_cache_type(sdkp, buffer); |
| 2530 | sd_read_app_tag_own(sdkp, buffer); | 2684 | sd_read_app_tag_own(sdkp, buffer); |
| 2685 | sd_read_write_same(sdkp, buffer); | ||
| 2531 | } | 2686 | } |
| 2532 | 2687 | ||
| 2533 | sdkp->first_scan = 0; | 2688 | sdkp->first_scan = 0; |
| @@ -2545,6 +2700,7 @@ static int sd_revalidate_disk(struct gendisk *disk) | |||
| 2545 | blk_queue_flush(sdkp->disk->queue, flush); | 2700 | blk_queue_flush(sdkp->disk->queue, flush); |
| 2546 | 2701 | ||
| 2547 | set_capacity(disk, sdkp->capacity); | 2702 | set_capacity(disk, sdkp->capacity); |
| 2703 | sd_config_write_same(sdkp); | ||
| 2548 | kfree(buffer); | 2704 | kfree(buffer); |
| 2549 | 2705 | ||
| 2550 | out: | 2706 | out: |
diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h index 47c52a6d733c..74a1e4ca5401 100644 --- a/drivers/scsi/sd.h +++ b/drivers/scsi/sd.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #define SD_TIMEOUT (30 * HZ) | 14 | #define SD_TIMEOUT (30 * HZ) |
| 15 | #define SD_MOD_TIMEOUT (75 * HZ) | 15 | #define SD_MOD_TIMEOUT (75 * HZ) |
| 16 | #define SD_FLUSH_TIMEOUT (60 * HZ) | 16 | #define SD_FLUSH_TIMEOUT (60 * HZ) |
| 17 | #define SD_WRITE_SAME_TIMEOUT (120 * HZ) | ||
| 17 | 18 | ||
| 18 | /* | 19 | /* |
| 19 | * Number of allowed retries | 20 | * Number of allowed retries |
| @@ -39,6 +40,11 @@ enum { | |||
| 39 | }; | 40 | }; |
| 40 | 41 | ||
| 41 | enum { | 42 | enum { |
| 43 | SD_MAX_WS10_BLOCKS = 0xffff, | ||
| 44 | SD_MAX_WS16_BLOCKS = 0x7fffff, | ||
| 45 | }; | ||
| 46 | |||
| 47 | enum { | ||
| 42 | SD_LBP_FULL = 0, /* Full logical block provisioning */ | 48 | SD_LBP_FULL = 0, /* Full logical block provisioning */ |
| 43 | SD_LBP_UNMAP, /* Use UNMAP command */ | 49 | SD_LBP_UNMAP, /* Use UNMAP command */ |
| 44 | SD_LBP_WS16, /* Use WRITE SAME(16) with UNMAP bit */ | 50 | SD_LBP_WS16, /* Use WRITE SAME(16) with UNMAP bit */ |
| @@ -77,6 +83,7 @@ struct scsi_disk { | |||
| 77 | unsigned lbpws : 1; | 83 | unsigned lbpws : 1; |
| 78 | unsigned lbpws10 : 1; | 84 | unsigned lbpws10 : 1; |
| 79 | unsigned lbpvpd : 1; | 85 | unsigned lbpvpd : 1; |
| 86 | unsigned ws16 : 1; | ||
| 80 | }; | 87 | }; |
| 81 | #define to_scsi_disk(obj) container_of(obj,struct scsi_disk,dev) | 88 | #define to_scsi_disk(obj) container_of(obj,struct scsi_disk,dev) |
| 82 | 89 | ||
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 9097155e9ebe..dcecbfb17243 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
| @@ -1819,8 +1819,10 @@ void target_execute_cmd(struct se_cmd *cmd) | |||
| 1819 | /* | 1819 | /* |
| 1820 | * If the received CDB has aleady been aborted stop processing it here. | 1820 | * If the received CDB has aleady been aborted stop processing it here. |
| 1821 | */ | 1821 | */ |
| 1822 | if (transport_check_aborted_status(cmd, 1)) | 1822 | if (transport_check_aborted_status(cmd, 1)) { |
| 1823 | complete(&cmd->t_transport_stop_comp); | ||
| 1823 | return; | 1824 | return; |
| 1825 | } | ||
| 1824 | 1826 | ||
| 1825 | /* | 1827 | /* |
| 1826 | * Determine if IOCTL context caller in requesting the stopping of this | 1828 | * Determine if IOCTL context caller in requesting the stopping of this |
| @@ -3067,7 +3069,7 @@ void transport_send_task_abort(struct se_cmd *cmd) | |||
| 3067 | unsigned long flags; | 3069 | unsigned long flags; |
| 3068 | 3070 | ||
| 3069 | spin_lock_irqsave(&cmd->t_state_lock, flags); | 3071 | spin_lock_irqsave(&cmd->t_state_lock, flags); |
| 3070 | if (cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) { | 3072 | if (cmd->se_cmd_flags & (SCF_SENT_CHECK_CONDITION | SCF_SENT_DELAYED_TAS)) { |
| 3071 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); | 3073 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); |
| 3072 | return; | 3074 | return; |
| 3073 | } | 3075 | } |
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index f87d7e8964bf..4e0d0c3734b3 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c | |||
| @@ -539,25 +539,25 @@ static void insert_char(struct vc_data *vc, unsigned int nr) | |||
| 539 | { | 539 | { |
| 540 | unsigned short *p = (unsigned short *) vc->vc_pos; | 540 | unsigned short *p = (unsigned short *) vc->vc_pos; |
| 541 | 541 | ||
| 542 | scr_memmovew(p + nr, p, vc->vc_cols - vc->vc_x); | 542 | scr_memmovew(p + nr, p, (vc->vc_cols - vc->vc_x) * 2); |
| 543 | scr_memsetw(p, vc->vc_video_erase_char, nr * 2); | 543 | scr_memsetw(p, vc->vc_video_erase_char, nr * 2); |
| 544 | vc->vc_need_wrap = 0; | 544 | vc->vc_need_wrap = 0; |
| 545 | if (DO_UPDATE(vc)) | 545 | if (DO_UPDATE(vc)) |
| 546 | do_update_region(vc, (unsigned long) p, | 546 | do_update_region(vc, (unsigned long) p, |
| 547 | (vc->vc_cols - vc->vc_x) / 2 + 1); | 547 | vc->vc_cols - vc->vc_x); |
| 548 | } | 548 | } |
| 549 | 549 | ||
| 550 | static void delete_char(struct vc_data *vc, unsigned int nr) | 550 | static void delete_char(struct vc_data *vc, unsigned int nr) |
| 551 | { | 551 | { |
| 552 | unsigned short *p = (unsigned short *) vc->vc_pos; | 552 | unsigned short *p = (unsigned short *) vc->vc_pos; |
| 553 | 553 | ||
| 554 | scr_memcpyw(p, p + nr, vc->vc_cols - vc->vc_x - nr); | 554 | scr_memcpyw(p, p + nr, (vc->vc_cols - vc->vc_x - nr) * 2); |
| 555 | scr_memsetw(p + vc->vc_cols - vc->vc_x - nr, vc->vc_video_erase_char, | 555 | scr_memsetw(p + vc->vc_cols - vc->vc_x - nr, vc->vc_video_erase_char, |
| 556 | nr * 2); | 556 | nr * 2); |
| 557 | vc->vc_need_wrap = 0; | 557 | vc->vc_need_wrap = 0; |
| 558 | if (DO_UPDATE(vc)) | 558 | if (DO_UPDATE(vc)) |
| 559 | do_update_region(vc, (unsigned long) p, | 559 | do_update_region(vc, (unsigned long) p, |
| 560 | (vc->vc_cols - vc->vc_x) / 2); | 560 | vc->vc_cols - vc->vc_x); |
| 561 | } | 561 | } |
| 562 | 562 | ||
| 563 | static int softcursor_original; | 563 | static int softcursor_original; |
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index a3d54366afcc..92f35abee92d 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c | |||
| @@ -186,6 +186,12 @@ static int slave_configure(struct scsi_device *sdev) | |||
| 186 | /* Some devices don't handle VPD pages correctly */ | 186 | /* Some devices don't handle VPD pages correctly */ |
| 187 | sdev->skip_vpd_pages = 1; | 187 | sdev->skip_vpd_pages = 1; |
| 188 | 188 | ||
| 189 | /* Do not attempt to use REPORT SUPPORTED OPERATION CODES */ | ||
| 190 | sdev->no_report_opcodes = 1; | ||
| 191 | |||
| 192 | /* Do not attempt to use WRITE SAME */ | ||
| 193 | sdev->no_write_same = 1; | ||
| 194 | |||
| 189 | /* Some disks return the total number of blocks in response | 195 | /* Some disks return the total number of blocks in response |
| 190 | * to READ CAPACITY rather than the highest block number. | 196 | * to READ CAPACITY rather than the highest block number. |
| 191 | * If this device makes that mistake, tell the sd driver. */ | 197 | * If this device makes that mistake, tell the sd driver. */ |
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index 99ac2cb08b43..dedaf81d8f36 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
| @@ -1076,7 +1076,7 @@ static int translate_desc(struct vhost_dev *dev, u64 addr, u32 len, | |||
| 1076 | } | 1076 | } |
| 1077 | _iov = iov + ret; | 1077 | _iov = iov + ret; |
| 1078 | size = reg->memory_size - addr + reg->guest_phys_addr; | 1078 | size = reg->memory_size - addr + reg->guest_phys_addr; |
| 1079 | _iov->iov_len = min((u64)len, size); | 1079 | _iov->iov_len = min((u64)len - s, size); |
| 1080 | _iov->iov_base = (void __user *)(unsigned long) | 1080 | _iov->iov_base = (void __user *)(unsigned long) |
| 1081 | (reg->userspace_addr + addr - reg->guest_phys_addr); | 1081 | (reg->userspace_addr + addr - reg->guest_phys_addr); |
| 1082 | s += size; | 1082 | s += size; |
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c index d64ac3842884..bee92846cfab 100644 --- a/drivers/video/omap2/dss/dsi.c +++ b/drivers/video/omap2/dss/dsi.c | |||
| @@ -365,11 +365,20 @@ struct platform_device *dsi_get_dsidev_from_id(int module) | |||
| 365 | struct omap_dss_output *out; | 365 | struct omap_dss_output *out; |
| 366 | enum omap_dss_output_id id; | 366 | enum omap_dss_output_id id; |
| 367 | 367 | ||
| 368 | id = module == 0 ? OMAP_DSS_OUTPUT_DSI1 : OMAP_DSS_OUTPUT_DSI2; | 368 | switch (module) { |
| 369 | case 0: | ||
| 370 | id = OMAP_DSS_OUTPUT_DSI1; | ||
| 371 | break; | ||
| 372 | case 1: | ||
| 373 | id = OMAP_DSS_OUTPUT_DSI2; | ||
| 374 | break; | ||
| 375 | default: | ||
| 376 | return NULL; | ||
| 377 | } | ||
| 369 | 378 | ||
| 370 | out = omap_dss_get_output(id); | 379 | out = omap_dss_get_output(id); |
| 371 | 380 | ||
| 372 | return out->pdev; | 381 | return out ? out->pdev : NULL; |
| 373 | } | 382 | } |
| 374 | 383 | ||
| 375 | static inline void dsi_write_reg(struct platform_device *dsidev, | 384 | static inline void dsi_write_reg(struct platform_device *dsidev, |
diff --git a/drivers/video/omap2/dss/dss.c b/drivers/video/omap2/dss/dss.c index 2ab1c3e96553..5f6eea801b06 100644 --- a/drivers/video/omap2/dss/dss.c +++ b/drivers/video/omap2/dss/dss.c | |||
| @@ -697,11 +697,15 @@ static int dss_get_clocks(void) | |||
| 697 | 697 | ||
| 698 | dss.dss_clk = clk; | 698 | dss.dss_clk = clk; |
| 699 | 699 | ||
| 700 | clk = clk_get(NULL, dss.feat->clk_name); | 700 | if (dss.feat->clk_name) { |
| 701 | if (IS_ERR(clk)) { | 701 | clk = clk_get(NULL, dss.feat->clk_name); |
| 702 | DSSERR("Failed to get %s\n", dss.feat->clk_name); | 702 | if (IS_ERR(clk)) { |
| 703 | r = PTR_ERR(clk); | 703 | DSSERR("Failed to get %s\n", dss.feat->clk_name); |
| 704 | goto err; | 704 | r = PTR_ERR(clk); |
| 705 | goto err; | ||
| 706 | } | ||
| 707 | } else { | ||
| 708 | clk = NULL; | ||
| 705 | } | 709 | } |
| 706 | 710 | ||
| 707 | dss.dpll4_m4_ck = clk; | 711 | dss.dpll4_m4_ck = clk; |
| @@ -805,10 +809,10 @@ static int __init dss_init_features(struct device *dev) | |||
| 805 | 809 | ||
| 806 | if (cpu_is_omap24xx()) | 810 | if (cpu_is_omap24xx()) |
| 807 | src = &omap24xx_dss_feats; | 811 | src = &omap24xx_dss_feats; |
| 808 | else if (cpu_is_omap34xx()) | ||
| 809 | src = &omap34xx_dss_feats; | ||
| 810 | else if (cpu_is_omap3630()) | 812 | else if (cpu_is_omap3630()) |
| 811 | src = &omap3630_dss_feats; | 813 | src = &omap3630_dss_feats; |
| 814 | else if (cpu_is_omap34xx()) | ||
| 815 | src = &omap34xx_dss_feats; | ||
| 812 | else if (cpu_is_omap44xx()) | 816 | else if (cpu_is_omap44xx()) |
| 813 | src = &omap44xx_dss_feats; | 817 | src = &omap44xx_dss_feats; |
| 814 | else if (soc_is_omap54xx()) | 818 | else if (soc_is_omap54xx()) |
diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c index a48a7dd75b33..8c9b8b3b7f77 100644 --- a/drivers/video/omap2/dss/hdmi.c +++ b/drivers/video/omap2/dss/hdmi.c | |||
| @@ -644,8 +644,10 @@ static void hdmi_dump_regs(struct seq_file *s) | |||
| 644 | { | 644 | { |
| 645 | mutex_lock(&hdmi.lock); | 645 | mutex_lock(&hdmi.lock); |
| 646 | 646 | ||
| 647 | if (hdmi_runtime_get()) | 647 | if (hdmi_runtime_get()) { |
| 648 | mutex_unlock(&hdmi.lock); | ||
| 648 | return; | 649 | return; |
| 650 | } | ||
| 649 | 651 | ||
| 650 | hdmi.ip_data.ops->dump_wrapper(&hdmi.ip_data, s); | 652 | hdmi.ip_data.ops->dump_wrapper(&hdmi.ip_data, s); |
| 651 | hdmi.ip_data.ops->dump_pll(&hdmi.ip_data, s); | 653 | hdmi.ip_data.ops->dump_pll(&hdmi.ip_data, s); |
diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c index 606b89f12351..d630b26a005c 100644 --- a/drivers/video/omap2/omapfb/omapfb-ioctl.c +++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c | |||
| @@ -787,7 +787,7 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) | |||
| 787 | 787 | ||
| 788 | case OMAPFB_WAITFORVSYNC: | 788 | case OMAPFB_WAITFORVSYNC: |
| 789 | DBG("ioctl WAITFORVSYNC\n"); | 789 | DBG("ioctl WAITFORVSYNC\n"); |
| 790 | if (!display && !display->output && !display->output->manager) { | 790 | if (!display || !display->output || !display->output->manager) { |
| 791 | r = -EINVAL; | 791 | r = -EINVAL; |
| 792 | break; | 792 | break; |
| 793 | } | 793 | } |
diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c index 8adb9cc267f9..71f5c459b088 100644 --- a/drivers/xen/privcmd.c +++ b/drivers/xen/privcmd.c | |||
| @@ -361,13 +361,13 @@ static long privcmd_ioctl_mmap_batch(void __user *udata, int version) | |||
| 361 | down_write(&mm->mmap_sem); | 361 | down_write(&mm->mmap_sem); |
| 362 | 362 | ||
| 363 | vma = find_vma(mm, m.addr); | 363 | vma = find_vma(mm, m.addr); |
| 364 | ret = -EINVAL; | ||
| 365 | if (!vma || | 364 | if (!vma || |
| 366 | vma->vm_ops != &privcmd_vm_ops || | 365 | vma->vm_ops != &privcmd_vm_ops || |
| 367 | (m.addr != vma->vm_start) || | 366 | (m.addr != vma->vm_start) || |
| 368 | ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) || | 367 | ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) || |
| 369 | !privcmd_enforce_singleshot_mapping(vma)) { | 368 | !privcmd_enforce_singleshot_mapping(vma)) { |
| 370 | up_write(&mm->mmap_sem); | 369 | up_write(&mm->mmap_sem); |
| 370 | ret = -EINVAL; | ||
| 371 | goto out; | 371 | goto out; |
| 372 | } | 372 | } |
| 373 | 373 | ||
| @@ -383,12 +383,16 @@ static long privcmd_ioctl_mmap_batch(void __user *udata, int version) | |||
| 383 | 383 | ||
| 384 | up_write(&mm->mmap_sem); | 384 | up_write(&mm->mmap_sem); |
| 385 | 385 | ||
| 386 | if (state.global_error && (version == 1)) { | 386 | if (version == 1) { |
| 387 | /* Write back errors in second pass. */ | 387 | if (state.global_error) { |
| 388 | state.user_mfn = (xen_pfn_t *)m.arr; | 388 | /* Write back errors in second pass. */ |
| 389 | state.err = err_array; | 389 | state.user_mfn = (xen_pfn_t *)m.arr; |
| 390 | ret = traverse_pages(m.num, sizeof(xen_pfn_t), | 390 | state.err = err_array; |
| 391 | &pagelist, mmap_return_errors_v1, &state); | 391 | ret = traverse_pages(m.num, sizeof(xen_pfn_t), |
| 392 | &pagelist, mmap_return_errors_v1, &state); | ||
| 393 | } else | ||
| 394 | ret = 0; | ||
| 395 | |||
| 392 | } else if (version == 2) { | 396 | } else if (version == 2) { |
| 393 | ret = __copy_to_user(m.err, err_array, m.num * sizeof(int)); | 397 | ret = __copy_to_user(m.err, err_array, m.num * sizeof(int)); |
| 394 | if (ret) | 398 | if (ret) |
diff --git a/fs/block_dev.c b/fs/block_dev.c index 1a1e5e3b1eaf..ab3a456f6650 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -70,19 +70,6 @@ static void bdev_inode_switch_bdi(struct inode *inode, | |||
| 70 | spin_unlock(&dst->wb.list_lock); | 70 | spin_unlock(&dst->wb.list_lock); |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | sector_t blkdev_max_block(struct block_device *bdev) | ||
| 74 | { | ||
| 75 | sector_t retval = ~((sector_t)0); | ||
| 76 | loff_t sz = i_size_read(bdev->bd_inode); | ||
| 77 | |||
| 78 | if (sz) { | ||
| 79 | unsigned int size = block_size(bdev); | ||
| 80 | unsigned int sizebits = blksize_bits(size); | ||
| 81 | retval = (sz >> sizebits); | ||
| 82 | } | ||
| 83 | return retval; | ||
| 84 | } | ||
| 85 | |||
| 86 | /* Kill _all_ buffers and pagecache , dirty or not.. */ | 73 | /* Kill _all_ buffers and pagecache , dirty or not.. */ |
| 87 | void kill_bdev(struct block_device *bdev) | 74 | void kill_bdev(struct block_device *bdev) |
| 88 | { | 75 | { |
| @@ -116,8 +103,6 @@ EXPORT_SYMBOL(invalidate_bdev); | |||
| 116 | 103 | ||
| 117 | int set_blocksize(struct block_device *bdev, int size) | 104 | int set_blocksize(struct block_device *bdev, int size) |
| 118 | { | 105 | { |
| 119 | struct address_space *mapping; | ||
| 120 | |||
| 121 | /* Size must be a power of two, and between 512 and PAGE_SIZE */ | 106 | /* Size must be a power of two, and between 512 and PAGE_SIZE */ |
| 122 | if (size > PAGE_SIZE || size < 512 || !is_power_of_2(size)) | 107 | if (size > PAGE_SIZE || size < 512 || !is_power_of_2(size)) |
| 123 | return -EINVAL; | 108 | return -EINVAL; |
| @@ -126,19 +111,6 @@ int set_blocksize(struct block_device *bdev, int size) | |||
| 126 | if (size < bdev_logical_block_size(bdev)) | 111 | if (size < bdev_logical_block_size(bdev)) |
| 127 | return -EINVAL; | 112 | return -EINVAL; |
| 128 | 113 | ||
| 129 | /* Prevent starting I/O or mapping the device */ | ||
| 130 | percpu_down_write(&bdev->bd_block_size_semaphore); | ||
| 131 | |||
| 132 | /* Check that the block device is not memory mapped */ | ||
| 133 | mapping = bdev->bd_inode->i_mapping; | ||
| 134 | mutex_lock(&mapping->i_mmap_mutex); | ||
| 135 | if (mapping_mapped(mapping)) { | ||
| 136 | mutex_unlock(&mapping->i_mmap_mutex); | ||
| 137 | percpu_up_write(&bdev->bd_block_size_semaphore); | ||
| 138 | return -EBUSY; | ||
| 139 | } | ||
| 140 | mutex_unlock(&mapping->i_mmap_mutex); | ||
| 141 | |||
| 142 | /* Don't change the size if it is same as current */ | 114 | /* Don't change the size if it is same as current */ |
| 143 | if (bdev->bd_block_size != size) { | 115 | if (bdev->bd_block_size != size) { |
| 144 | sync_blockdev(bdev); | 116 | sync_blockdev(bdev); |
| @@ -146,9 +118,6 @@ int set_blocksize(struct block_device *bdev, int size) | |||
| 146 | bdev->bd_inode->i_blkbits = blksize_bits(size); | 118 | bdev->bd_inode->i_blkbits = blksize_bits(size); |
| 147 | kill_bdev(bdev); | 119 | kill_bdev(bdev); |
| 148 | } | 120 | } |
| 149 | |||
| 150 | percpu_up_write(&bdev->bd_block_size_semaphore); | ||
| 151 | |||
| 152 | return 0; | 121 | return 0; |
| 153 | } | 122 | } |
| 154 | 123 | ||
| @@ -181,52 +150,12 @@ static int | |||
| 181 | blkdev_get_block(struct inode *inode, sector_t iblock, | 150 | blkdev_get_block(struct inode *inode, sector_t iblock, |
| 182 | struct buffer_head *bh, int create) | 151 | struct buffer_head *bh, int create) |
| 183 | { | 152 | { |
| 184 | if (iblock >= blkdev_max_block(I_BDEV(inode))) { | ||
| 185 | if (create) | ||
| 186 | return -EIO; | ||
| 187 | |||
| 188 | /* | ||
| 189 | * for reads, we're just trying to fill a partial page. | ||
| 190 | * return a hole, they will have to call get_block again | ||
| 191 | * before they can fill it, and they will get -EIO at that | ||
| 192 | * time | ||
| 193 | */ | ||
| 194 | return 0; | ||
| 195 | } | ||
| 196 | bh->b_bdev = I_BDEV(inode); | 153 | bh->b_bdev = I_BDEV(inode); |
| 197 | bh->b_blocknr = iblock; | 154 | bh->b_blocknr = iblock; |
| 198 | set_buffer_mapped(bh); | 155 | set_buffer_mapped(bh); |
| 199 | return 0; | 156 | return 0; |
| 200 | } | 157 | } |
| 201 | 158 | ||
| 202 | static int | ||
| 203 | blkdev_get_blocks(struct inode *inode, sector_t iblock, | ||
| 204 | struct buffer_head *bh, int create) | ||
| 205 | { | ||
| 206 | sector_t end_block = blkdev_max_block(I_BDEV(inode)); | ||
| 207 | unsigned long max_blocks = bh->b_size >> inode->i_blkbits; | ||
| 208 | |||
| 209 | if ((iblock + max_blocks) > end_block) { | ||
| 210 | max_blocks = end_block - iblock; | ||
| 211 | if ((long)max_blocks <= 0) { | ||
| 212 | if (create) | ||
| 213 | return -EIO; /* write fully beyond EOF */ | ||
| 214 | /* | ||
| 215 | * It is a read which is fully beyond EOF. We return | ||
| 216 | * a !buffer_mapped buffer | ||
| 217 | */ | ||
| 218 | max_blocks = 0; | ||
| 219 | } | ||
| 220 | } | ||
| 221 | |||
| 222 | bh->b_bdev = I_BDEV(inode); | ||
| 223 | bh->b_blocknr = iblock; | ||
| 224 | bh->b_size = max_blocks << inode->i_blkbits; | ||
| 225 | if (max_blocks) | ||
| 226 | set_buffer_mapped(bh); | ||
| 227 | return 0; | ||
| 228 | } | ||
| 229 | |||
| 230 | static ssize_t | 159 | static ssize_t |
| 231 | blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | 160 | blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, |
| 232 | loff_t offset, unsigned long nr_segs) | 161 | loff_t offset, unsigned long nr_segs) |
| @@ -235,7 +164,7 @@ blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | |||
| 235 | struct inode *inode = file->f_mapping->host; | 164 | struct inode *inode = file->f_mapping->host; |
| 236 | 165 | ||
| 237 | return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset, | 166 | return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iov, offset, |
| 238 | nr_segs, blkdev_get_blocks, NULL, NULL, 0); | 167 | nr_segs, blkdev_get_block, NULL, NULL, 0); |
| 239 | } | 168 | } |
| 240 | 169 | ||
| 241 | int __sync_blockdev(struct block_device *bdev, int wait) | 170 | int __sync_blockdev(struct block_device *bdev, int wait) |
| @@ -459,12 +388,6 @@ static struct inode *bdev_alloc_inode(struct super_block *sb) | |||
| 459 | struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, GFP_KERNEL); | 388 | struct bdev_inode *ei = kmem_cache_alloc(bdev_cachep, GFP_KERNEL); |
| 460 | if (!ei) | 389 | if (!ei) |
| 461 | return NULL; | 390 | return NULL; |
| 462 | |||
| 463 | if (unlikely(percpu_init_rwsem(&ei->bdev.bd_block_size_semaphore))) { | ||
| 464 | kmem_cache_free(bdev_cachep, ei); | ||
| 465 | return NULL; | ||
| 466 | } | ||
| 467 | |||
| 468 | return &ei->vfs_inode; | 391 | return &ei->vfs_inode; |
| 469 | } | 392 | } |
| 470 | 393 | ||
| @@ -473,8 +396,6 @@ static void bdev_i_callback(struct rcu_head *head) | |||
| 473 | struct inode *inode = container_of(head, struct inode, i_rcu); | 396 | struct inode *inode = container_of(head, struct inode, i_rcu); |
| 474 | struct bdev_inode *bdi = BDEV_I(inode); | 397 | struct bdev_inode *bdi = BDEV_I(inode); |
| 475 | 398 | ||
| 476 | percpu_free_rwsem(&bdi->bdev.bd_block_size_semaphore); | ||
| 477 | |||
| 478 | kmem_cache_free(bdev_cachep, bdi); | 399 | kmem_cache_free(bdev_cachep, bdi); |
| 479 | } | 400 | } |
| 480 | 401 | ||
| @@ -1593,22 +1514,6 @@ static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg) | |||
| 1593 | return blkdev_ioctl(bdev, mode, cmd, arg); | 1514 | return blkdev_ioctl(bdev, mode, cmd, arg); |
| 1594 | } | 1515 | } |
| 1595 | 1516 | ||
| 1596 | ssize_t blkdev_aio_read(struct kiocb *iocb, const struct iovec *iov, | ||
| 1597 | unsigned long nr_segs, loff_t pos) | ||
| 1598 | { | ||
| 1599 | ssize_t ret; | ||
| 1600 | struct block_device *bdev = I_BDEV(iocb->ki_filp->f_mapping->host); | ||
| 1601 | |||
| 1602 | percpu_down_read(&bdev->bd_block_size_semaphore); | ||
| 1603 | |||
| 1604 | ret = generic_file_aio_read(iocb, iov, nr_segs, pos); | ||
| 1605 | |||
| 1606 | percpu_up_read(&bdev->bd_block_size_semaphore); | ||
| 1607 | |||
| 1608 | return ret; | ||
| 1609 | } | ||
| 1610 | EXPORT_SYMBOL_GPL(blkdev_aio_read); | ||
| 1611 | |||
| 1612 | /* | 1517 | /* |
| 1613 | * Write data to the block device. Only intended for the block device itself | 1518 | * Write data to the block device. Only intended for the block device itself |
| 1614 | * and the raw driver which basically is a fake block device. | 1519 | * and the raw driver which basically is a fake block device. |
| @@ -1620,16 +1525,12 @@ ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 1620 | unsigned long nr_segs, loff_t pos) | 1525 | unsigned long nr_segs, loff_t pos) |
| 1621 | { | 1526 | { |
| 1622 | struct file *file = iocb->ki_filp; | 1527 | struct file *file = iocb->ki_filp; |
| 1623 | struct block_device *bdev = I_BDEV(file->f_mapping->host); | ||
| 1624 | struct blk_plug plug; | 1528 | struct blk_plug plug; |
| 1625 | ssize_t ret; | 1529 | ssize_t ret; |
| 1626 | 1530 | ||
| 1627 | BUG_ON(iocb->ki_pos != pos); | 1531 | BUG_ON(iocb->ki_pos != pos); |
| 1628 | 1532 | ||
| 1629 | blk_start_plug(&plug); | 1533 | blk_start_plug(&plug); |
| 1630 | |||
| 1631 | percpu_down_read(&bdev->bd_block_size_semaphore); | ||
| 1632 | |||
| 1633 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); | 1534 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); |
| 1634 | if (ret > 0 || ret == -EIOCBQUEUED) { | 1535 | if (ret > 0 || ret == -EIOCBQUEUED) { |
| 1635 | ssize_t err; | 1536 | ssize_t err; |
| @@ -1638,62 +1539,27 @@ ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 1638 | if (err < 0 && ret > 0) | 1539 | if (err < 0 && ret > 0) |
| 1639 | ret = err; | 1540 | ret = err; |
| 1640 | } | 1541 | } |
| 1641 | |||
| 1642 | percpu_up_read(&bdev->bd_block_size_semaphore); | ||
| 1643 | |||
| 1644 | blk_finish_plug(&plug); | 1542 | blk_finish_plug(&plug); |
| 1645 | |||
| 1646 | return ret; | 1543 | return ret; |
| 1647 | } | 1544 | } |
| 1648 | EXPORT_SYMBOL_GPL(blkdev_aio_write); | 1545 | EXPORT_SYMBOL_GPL(blkdev_aio_write); |
| 1649 | 1546 | ||
| 1650 | static int blkdev_mmap(struct file *file, struct vm_area_struct *vma) | 1547 | static ssize_t blkdev_aio_read(struct kiocb *iocb, const struct iovec *iov, |
| 1651 | { | 1548 | unsigned long nr_segs, loff_t pos) |
| 1652 | int ret; | ||
| 1653 | struct block_device *bdev = I_BDEV(file->f_mapping->host); | ||
| 1654 | |||
| 1655 | percpu_down_read(&bdev->bd_block_size_semaphore); | ||
| 1656 | |||
| 1657 | ret = generic_file_mmap(file, vma); | ||
| 1658 | |||
| 1659 | percpu_up_read(&bdev->bd_block_size_semaphore); | ||
| 1660 | |||
| 1661 | return ret; | ||
| 1662 | } | ||
| 1663 | |||
| 1664 | static ssize_t blkdev_splice_read(struct file *file, loff_t *ppos, | ||
| 1665 | struct pipe_inode_info *pipe, size_t len, | ||
| 1666 | unsigned int flags) | ||
| 1667 | { | ||
| 1668 | ssize_t ret; | ||
| 1669 | struct block_device *bdev = I_BDEV(file->f_mapping->host); | ||
| 1670 | |||
| 1671 | percpu_down_read(&bdev->bd_block_size_semaphore); | ||
| 1672 | |||
| 1673 | ret = generic_file_splice_read(file, ppos, pipe, len, flags); | ||
| 1674 | |||
| 1675 | percpu_up_read(&bdev->bd_block_size_semaphore); | ||
| 1676 | |||
| 1677 | return ret; | ||
| 1678 | } | ||
| 1679 | |||
| 1680 | static ssize_t blkdev_splice_write(struct pipe_inode_info *pipe, | ||
| 1681 | struct file *file, loff_t *ppos, size_t len, | ||
| 1682 | unsigned int flags) | ||
| 1683 | { | 1549 | { |
| 1684 | ssize_t ret; | 1550 | struct file *file = iocb->ki_filp; |
| 1685 | struct block_device *bdev = I_BDEV(file->f_mapping->host); | 1551 | struct inode *bd_inode = file->f_mapping->host; |
| 1686 | 1552 | loff_t size = i_size_read(bd_inode); | |
| 1687 | percpu_down_read(&bdev->bd_block_size_semaphore); | ||
| 1688 | |||
| 1689 | ret = generic_file_splice_write(pipe, file, ppos, len, flags); | ||
| 1690 | 1553 | ||
| 1691 | percpu_up_read(&bdev->bd_block_size_semaphore); | 1554 | if (pos >= size) |
| 1555 | return 0; | ||
| 1692 | 1556 | ||
| 1693 | return ret; | 1557 | size -= pos; |
| 1558 | if (size < INT_MAX) | ||
| 1559 | nr_segs = iov_shorten((struct iovec *)iov, nr_segs, size); | ||
| 1560 | return generic_file_aio_read(iocb, iov, nr_segs, pos); | ||
| 1694 | } | 1561 | } |
| 1695 | 1562 | ||
| 1696 | |||
| 1697 | /* | 1563 | /* |
| 1698 | * Try to release a page associated with block device when the system | 1564 | * Try to release a page associated with block device when the system |
| 1699 | * is under memory pressure. | 1565 | * is under memory pressure. |
| @@ -1724,16 +1590,16 @@ const struct file_operations def_blk_fops = { | |||
| 1724 | .llseek = block_llseek, | 1590 | .llseek = block_llseek, |
| 1725 | .read = do_sync_read, | 1591 | .read = do_sync_read, |
| 1726 | .write = do_sync_write, | 1592 | .write = do_sync_write, |
| 1727 | .aio_read = blkdev_aio_read, | 1593 | .aio_read = blkdev_aio_read, |
| 1728 | .aio_write = blkdev_aio_write, | 1594 | .aio_write = blkdev_aio_write, |
| 1729 | .mmap = blkdev_mmap, | 1595 | .mmap = generic_file_mmap, |
| 1730 | .fsync = blkdev_fsync, | 1596 | .fsync = blkdev_fsync, |
| 1731 | .unlocked_ioctl = block_ioctl, | 1597 | .unlocked_ioctl = block_ioctl, |
| 1732 | #ifdef CONFIG_COMPAT | 1598 | #ifdef CONFIG_COMPAT |
| 1733 | .compat_ioctl = compat_blkdev_ioctl, | 1599 | .compat_ioctl = compat_blkdev_ioctl, |
| 1734 | #endif | 1600 | #endif |
| 1735 | .splice_read = blkdev_splice_read, | 1601 | .splice_read = generic_file_splice_read, |
| 1736 | .splice_write = blkdev_splice_write, | 1602 | .splice_write = generic_file_splice_write, |
| 1737 | }; | 1603 | }; |
| 1738 | 1604 | ||
| 1739 | int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg) | 1605 | int ioctl_by_bdev(struct block_device *bdev, unsigned cmd, unsigned long arg) |
diff --git a/fs/buffer.c b/fs/buffer.c index b5f044283edb..ec0aca8ba6bf 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
| @@ -911,6 +911,18 @@ link_dev_buffers(struct page *page, struct buffer_head *head) | |||
| 911 | attach_page_buffers(page, head); | 911 | attach_page_buffers(page, head); |
| 912 | } | 912 | } |
| 913 | 913 | ||
| 914 | static sector_t blkdev_max_block(struct block_device *bdev, unsigned int size) | ||
| 915 | { | ||
| 916 | sector_t retval = ~((sector_t)0); | ||
| 917 | loff_t sz = i_size_read(bdev->bd_inode); | ||
| 918 | |||
| 919 | if (sz) { | ||
| 920 | unsigned int sizebits = blksize_bits(size); | ||
| 921 | retval = (sz >> sizebits); | ||
| 922 | } | ||
| 923 | return retval; | ||
| 924 | } | ||
| 925 | |||
| 914 | /* | 926 | /* |
| 915 | * Initialise the state of a blockdev page's buffers. | 927 | * Initialise the state of a blockdev page's buffers. |
| 916 | */ | 928 | */ |
| @@ -921,7 +933,7 @@ init_page_buffers(struct page *page, struct block_device *bdev, | |||
| 921 | struct buffer_head *head = page_buffers(page); | 933 | struct buffer_head *head = page_buffers(page); |
| 922 | struct buffer_head *bh = head; | 934 | struct buffer_head *bh = head; |
| 923 | int uptodate = PageUptodate(page); | 935 | int uptodate = PageUptodate(page); |
| 924 | sector_t end_block = blkdev_max_block(I_BDEV(bdev->bd_inode)); | 936 | sector_t end_block = blkdev_max_block(I_BDEV(bdev->bd_inode), size); |
| 925 | 937 | ||
| 926 | do { | 938 | do { |
| 927 | if (!buffer_mapped(bh)) { | 939 | if (!buffer_mapped(bh)) { |
| @@ -1553,6 +1565,28 @@ void unmap_underlying_metadata(struct block_device *bdev, sector_t block) | |||
| 1553 | EXPORT_SYMBOL(unmap_underlying_metadata); | 1565 | EXPORT_SYMBOL(unmap_underlying_metadata); |
| 1554 | 1566 | ||
| 1555 | /* | 1567 | /* |
| 1568 | * Size is a power-of-two in the range 512..PAGE_SIZE, | ||
| 1569 | * and the case we care about most is PAGE_SIZE. | ||
| 1570 | * | ||
| 1571 | * So this *could* possibly be written with those | ||
| 1572 | * constraints in mind (relevant mostly if some | ||
| 1573 | * architecture has a slow bit-scan instruction) | ||
| 1574 | */ | ||
| 1575 | static inline int block_size_bits(unsigned int blocksize) | ||
| 1576 | { | ||
| 1577 | return ilog2(blocksize); | ||
| 1578 | } | ||
| 1579 | |||
| 1580 | static struct buffer_head *create_page_buffers(struct page *page, struct inode *inode, unsigned int b_state) | ||
| 1581 | { | ||
| 1582 | BUG_ON(!PageLocked(page)); | ||
| 1583 | |||
| 1584 | if (!page_has_buffers(page)) | ||
| 1585 | create_empty_buffers(page, 1 << ACCESS_ONCE(inode->i_blkbits), b_state); | ||
| 1586 | return page_buffers(page); | ||
| 1587 | } | ||
| 1588 | |||
| 1589 | /* | ||
| 1556 | * NOTE! All mapped/uptodate combinations are valid: | 1590 | * NOTE! All mapped/uptodate combinations are valid: |
| 1557 | * | 1591 | * |
| 1558 | * Mapped Uptodate Meaning | 1592 | * Mapped Uptodate Meaning |
| @@ -1589,19 +1623,13 @@ static int __block_write_full_page(struct inode *inode, struct page *page, | |||
| 1589 | sector_t block; | 1623 | sector_t block; |
| 1590 | sector_t last_block; | 1624 | sector_t last_block; |
| 1591 | struct buffer_head *bh, *head; | 1625 | struct buffer_head *bh, *head; |
| 1592 | const unsigned blocksize = 1 << inode->i_blkbits; | 1626 | unsigned int blocksize, bbits; |
| 1593 | int nr_underway = 0; | 1627 | int nr_underway = 0; |
| 1594 | int write_op = (wbc->sync_mode == WB_SYNC_ALL ? | 1628 | int write_op = (wbc->sync_mode == WB_SYNC_ALL ? |
| 1595 | WRITE_SYNC : WRITE); | 1629 | WRITE_SYNC : WRITE); |
| 1596 | 1630 | ||
| 1597 | BUG_ON(!PageLocked(page)); | 1631 | head = create_page_buffers(page, inode, |
| 1598 | |||
| 1599 | last_block = (i_size_read(inode) - 1) >> inode->i_blkbits; | ||
| 1600 | |||
| 1601 | if (!page_has_buffers(page)) { | ||
| 1602 | create_empty_buffers(page, blocksize, | ||
| 1603 | (1 << BH_Dirty)|(1 << BH_Uptodate)); | 1632 | (1 << BH_Dirty)|(1 << BH_Uptodate)); |
| 1604 | } | ||
| 1605 | 1633 | ||
| 1606 | /* | 1634 | /* |
| 1607 | * Be very careful. We have no exclusion from __set_page_dirty_buffers | 1635 | * Be very careful. We have no exclusion from __set_page_dirty_buffers |
| @@ -1613,9 +1641,12 @@ static int __block_write_full_page(struct inode *inode, struct page *page, | |||
| 1613 | * handle that here by just cleaning them. | 1641 | * handle that here by just cleaning them. |
| 1614 | */ | 1642 | */ |
| 1615 | 1643 | ||
| 1616 | block = (sector_t)page->index << (PAGE_CACHE_SHIFT - inode->i_blkbits); | ||
| 1617 | head = page_buffers(page); | ||
| 1618 | bh = head; | 1644 | bh = head; |
| 1645 | blocksize = bh->b_size; | ||
| 1646 | bbits = block_size_bits(blocksize); | ||
| 1647 | |||
| 1648 | block = (sector_t)page->index << (PAGE_CACHE_SHIFT - bbits); | ||
| 1649 | last_block = (i_size_read(inode) - 1) >> bbits; | ||
| 1619 | 1650 | ||
| 1620 | /* | 1651 | /* |
| 1621 | * Get all the dirty buffers mapped to disk addresses and | 1652 | * Get all the dirty buffers mapped to disk addresses and |
| @@ -1806,12 +1837,10 @@ int __block_write_begin(struct page *page, loff_t pos, unsigned len, | |||
| 1806 | BUG_ON(to > PAGE_CACHE_SIZE); | 1837 | BUG_ON(to > PAGE_CACHE_SIZE); |
| 1807 | BUG_ON(from > to); | 1838 | BUG_ON(from > to); |
| 1808 | 1839 | ||
| 1809 | blocksize = 1 << inode->i_blkbits; | 1840 | head = create_page_buffers(page, inode, 0); |
| 1810 | if (!page_has_buffers(page)) | 1841 | blocksize = head->b_size; |
| 1811 | create_empty_buffers(page, blocksize, 0); | 1842 | bbits = block_size_bits(blocksize); |
| 1812 | head = page_buffers(page); | ||
| 1813 | 1843 | ||
| 1814 | bbits = inode->i_blkbits; | ||
| 1815 | block = (sector_t)page->index << (PAGE_CACHE_SHIFT - bbits); | 1844 | block = (sector_t)page->index << (PAGE_CACHE_SHIFT - bbits); |
| 1816 | 1845 | ||
| 1817 | for(bh = head, block_start = 0; bh != head || !block_start; | 1846 | for(bh = head, block_start = 0; bh != head || !block_start; |
| @@ -1881,11 +1910,11 @@ static int __block_commit_write(struct inode *inode, struct page *page, | |||
| 1881 | unsigned blocksize; | 1910 | unsigned blocksize; |
| 1882 | struct buffer_head *bh, *head; | 1911 | struct buffer_head *bh, *head; |
| 1883 | 1912 | ||
| 1884 | blocksize = 1 << inode->i_blkbits; | 1913 | bh = head = page_buffers(page); |
| 1914 | blocksize = bh->b_size; | ||
| 1885 | 1915 | ||
| 1886 | for(bh = head = page_buffers(page), block_start = 0; | 1916 | block_start = 0; |
| 1887 | bh != head || !block_start; | 1917 | do { |
| 1888 | block_start=block_end, bh = bh->b_this_page) { | ||
| 1889 | block_end = block_start + blocksize; | 1918 | block_end = block_start + blocksize; |
| 1890 | if (block_end <= from || block_start >= to) { | 1919 | if (block_end <= from || block_start >= to) { |
| 1891 | if (!buffer_uptodate(bh)) | 1920 | if (!buffer_uptodate(bh)) |
| @@ -1895,7 +1924,10 @@ static int __block_commit_write(struct inode *inode, struct page *page, | |||
| 1895 | mark_buffer_dirty(bh); | 1924 | mark_buffer_dirty(bh); |
| 1896 | } | 1925 | } |
| 1897 | clear_buffer_new(bh); | 1926 | clear_buffer_new(bh); |
| 1898 | } | 1927 | |
| 1928 | block_start = block_end; | ||
| 1929 | bh = bh->b_this_page; | ||
| 1930 | } while (bh != head); | ||
| 1899 | 1931 | ||
| 1900 | /* | 1932 | /* |
| 1901 | * If this is a partial write which happened to make all buffers | 1933 | * If this is a partial write which happened to make all buffers |
| @@ -2020,7 +2052,6 @@ EXPORT_SYMBOL(generic_write_end); | |||
| 2020 | int block_is_partially_uptodate(struct page *page, read_descriptor_t *desc, | 2052 | int block_is_partially_uptodate(struct page *page, read_descriptor_t *desc, |
| 2021 | unsigned long from) | 2053 | unsigned long from) |
| 2022 | { | 2054 | { |
| 2023 | struct inode *inode = page->mapping->host; | ||
| 2024 | unsigned block_start, block_end, blocksize; | 2055 | unsigned block_start, block_end, blocksize; |
| 2025 | unsigned to; | 2056 | unsigned to; |
| 2026 | struct buffer_head *bh, *head; | 2057 | struct buffer_head *bh, *head; |
| @@ -2029,13 +2060,13 @@ int block_is_partially_uptodate(struct page *page, read_descriptor_t *desc, | |||
| 2029 | if (!page_has_buffers(page)) | 2060 | if (!page_has_buffers(page)) |
| 2030 | return 0; | 2061 | return 0; |
| 2031 | 2062 | ||
| 2032 | blocksize = 1 << inode->i_blkbits; | 2063 | head = page_buffers(page); |
| 2064 | blocksize = head->b_size; | ||
| 2033 | to = min_t(unsigned, PAGE_CACHE_SIZE - from, desc->count); | 2065 | to = min_t(unsigned, PAGE_CACHE_SIZE - from, desc->count); |
| 2034 | to = from + to; | 2066 | to = from + to; |
| 2035 | if (from < blocksize && to > PAGE_CACHE_SIZE - blocksize) | 2067 | if (from < blocksize && to > PAGE_CACHE_SIZE - blocksize) |
| 2036 | return 0; | 2068 | return 0; |
| 2037 | 2069 | ||
| 2038 | head = page_buffers(page); | ||
| 2039 | bh = head; | 2070 | bh = head; |
| 2040 | block_start = 0; | 2071 | block_start = 0; |
| 2041 | do { | 2072 | do { |
| @@ -2068,18 +2099,16 @@ int block_read_full_page(struct page *page, get_block_t *get_block) | |||
| 2068 | struct inode *inode = page->mapping->host; | 2099 | struct inode *inode = page->mapping->host; |
| 2069 | sector_t iblock, lblock; | 2100 | sector_t iblock, lblock; |
| 2070 | struct buffer_head *bh, *head, *arr[MAX_BUF_PER_PAGE]; | 2101 | struct buffer_head *bh, *head, *arr[MAX_BUF_PER_PAGE]; |
| 2071 | unsigned int blocksize; | 2102 | unsigned int blocksize, bbits; |
| 2072 | int nr, i; | 2103 | int nr, i; |
| 2073 | int fully_mapped = 1; | 2104 | int fully_mapped = 1; |
| 2074 | 2105 | ||
| 2075 | BUG_ON(!PageLocked(page)); | 2106 | head = create_page_buffers(page, inode, 0); |
| 2076 | blocksize = 1 << inode->i_blkbits; | 2107 | blocksize = head->b_size; |
| 2077 | if (!page_has_buffers(page)) | 2108 | bbits = block_size_bits(blocksize); |
| 2078 | create_empty_buffers(page, blocksize, 0); | ||
| 2079 | head = page_buffers(page); | ||
| 2080 | 2109 | ||
| 2081 | iblock = (sector_t)page->index << (PAGE_CACHE_SHIFT - inode->i_blkbits); | 2110 | iblock = (sector_t)page->index << (PAGE_CACHE_SHIFT - bbits); |
| 2082 | lblock = (i_size_read(inode)+blocksize-1) >> inode->i_blkbits; | 2111 | lblock = (i_size_read(inode)+blocksize-1) >> bbits; |
| 2083 | bh = head; | 2112 | bh = head; |
| 2084 | nr = 0; | 2113 | nr = 0; |
| 2085 | i = 0; | 2114 | i = 0; |
| @@ -2864,6 +2893,55 @@ static void end_bio_bh_io_sync(struct bio *bio, int err) | |||
| 2864 | bio_put(bio); | 2893 | bio_put(bio); |
| 2865 | } | 2894 | } |
| 2866 | 2895 | ||
| 2896 | /* | ||
| 2897 | * This allows us to do IO even on the odd last sectors | ||
| 2898 | * of a device, even if the bh block size is some multiple | ||
| 2899 | * of the physical sector size. | ||
| 2900 | * | ||
| 2901 | * We'll just truncate the bio to the size of the device, | ||
| 2902 | * and clear the end of the buffer head manually. | ||
| 2903 | * | ||
| 2904 | * Truly out-of-range accesses will turn into actual IO | ||
| 2905 | * errors, this only handles the "we need to be able to | ||
| 2906 | * do IO at the final sector" case. | ||
| 2907 | */ | ||
| 2908 | static void guard_bh_eod(int rw, struct bio *bio, struct buffer_head *bh) | ||
| 2909 | { | ||
| 2910 | sector_t maxsector; | ||
| 2911 | unsigned bytes; | ||
| 2912 | |||
| 2913 | maxsector = i_size_read(bio->bi_bdev->bd_inode) >> 9; | ||
| 2914 | if (!maxsector) | ||
| 2915 | return; | ||
| 2916 | |||
| 2917 | /* | ||
| 2918 | * If the *whole* IO is past the end of the device, | ||
| 2919 | * let it through, and the IO layer will turn it into | ||
| 2920 | * an EIO. | ||
| 2921 | */ | ||
| 2922 | if (unlikely(bio->bi_sector >= maxsector)) | ||
| 2923 | return; | ||
| 2924 | |||
| 2925 | maxsector -= bio->bi_sector; | ||
| 2926 | bytes = bio->bi_size; | ||
| 2927 | if (likely((bytes >> 9) <= maxsector)) | ||
| 2928 | return; | ||
| 2929 | |||
| 2930 | /* Uhhuh. We've got a bh that straddles the device size! */ | ||
| 2931 | bytes = maxsector << 9; | ||
| 2932 | |||
| 2933 | /* Truncate the bio.. */ | ||
| 2934 | bio->bi_size = bytes; | ||
| 2935 | bio->bi_io_vec[0].bv_len = bytes; | ||
| 2936 | |||
| 2937 | /* ..and clear the end of the buffer for reads */ | ||
| 2938 | if ((rw & RW_MASK) == READ) { | ||
| 2939 | void *kaddr = kmap_atomic(bh->b_page); | ||
| 2940 | memset(kaddr + bh_offset(bh) + bytes, 0, bh->b_size - bytes); | ||
| 2941 | kunmap_atomic(kaddr); | ||
| 2942 | } | ||
| 2943 | } | ||
| 2944 | |||
| 2867 | int submit_bh(int rw, struct buffer_head * bh) | 2945 | int submit_bh(int rw, struct buffer_head * bh) |
| 2868 | { | 2946 | { |
| 2869 | struct bio *bio; | 2947 | struct bio *bio; |
| @@ -2900,6 +2978,9 @@ int submit_bh(int rw, struct buffer_head * bh) | |||
| 2900 | bio->bi_end_io = end_bio_bh_io_sync; | 2978 | bio->bi_end_io = end_bio_bh_io_sync; |
| 2901 | bio->bi_private = bh; | 2979 | bio->bi_private = bh; |
| 2902 | 2980 | ||
| 2981 | /* Take care of bh's that straddle the end of the device */ | ||
| 2982 | guard_bh_eod(rw, bio, bh); | ||
| 2983 | |||
| 2903 | bio_get(bio); | 2984 | bio_get(bio); |
| 2904 | submit_bio(rw, bio); | 2985 | submit_bio(rw, bio); |
| 2905 | 2986 | ||
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index edb25b4bbb95..70b6f4c3a0c1 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -1794,7 +1794,6 @@ static int cifs_writepages(struct address_space *mapping, | |||
| 1794 | struct TCP_Server_Info *server; | 1794 | struct TCP_Server_Info *server; |
| 1795 | struct page *page; | 1795 | struct page *page; |
| 1796 | int rc = 0; | 1796 | int rc = 0; |
| 1797 | loff_t isize = i_size_read(mapping->host); | ||
| 1798 | 1797 | ||
| 1799 | /* | 1798 | /* |
| 1800 | * If wsize is smaller than the page cache size, default to writing | 1799 | * If wsize is smaller than the page cache size, default to writing |
| @@ -1899,7 +1898,7 @@ retry: | |||
| 1899 | */ | 1898 | */ |
| 1900 | set_page_writeback(page); | 1899 | set_page_writeback(page); |
| 1901 | 1900 | ||
| 1902 | if (page_offset(page) >= isize) { | 1901 | if (page_offset(page) >= i_size_read(mapping->host)) { |
| 1903 | done = true; | 1902 | done = true; |
| 1904 | unlock_page(page); | 1903 | unlock_page(page); |
| 1905 | end_page_writeback(page); | 1904 | end_page_writeback(page); |
| @@ -1932,7 +1931,8 @@ retry: | |||
| 1932 | wdata->offset = page_offset(wdata->pages[0]); | 1931 | wdata->offset = page_offset(wdata->pages[0]); |
| 1933 | wdata->pagesz = PAGE_CACHE_SIZE; | 1932 | wdata->pagesz = PAGE_CACHE_SIZE; |
| 1934 | wdata->tailsz = | 1933 | wdata->tailsz = |
| 1935 | min(isize - page_offset(wdata->pages[nr_pages - 1]), | 1934 | min(i_size_read(mapping->host) - |
| 1935 | page_offset(wdata->pages[nr_pages - 1]), | ||
| 1936 | (loff_t)PAGE_CACHE_SIZE); | 1936 | (loff_t)PAGE_CACHE_SIZE); |
| 1937 | wdata->bytes = ((nr_pages - 1) * PAGE_CACHE_SIZE) + | 1937 | wdata->bytes = ((nr_pages - 1) * PAGE_CACHE_SIZE) + |
| 1938 | wdata->tailsz; | 1938 | wdata->tailsz; |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index f9b5d3d6cf33..1c576e871366 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
| @@ -86,14 +86,17 @@ cifs_readdir_lookup(struct dentry *parent, struct qstr *name, | |||
| 86 | 86 | ||
| 87 | dentry = d_lookup(parent, name); | 87 | dentry = d_lookup(parent, name); |
| 88 | if (dentry) { | 88 | if (dentry) { |
| 89 | int err; | ||
| 89 | inode = dentry->d_inode; | 90 | inode = dentry->d_inode; |
| 90 | /* update inode in place if i_ino didn't change */ | 91 | /* update inode in place if i_ino didn't change */ |
| 91 | if (inode && CIFS_I(inode)->uniqueid == fattr->cf_uniqueid) { | 92 | if (inode && CIFS_I(inode)->uniqueid == fattr->cf_uniqueid) { |
| 92 | cifs_fattr_to_inode(inode, fattr); | 93 | cifs_fattr_to_inode(inode, fattr); |
| 93 | return dentry; | 94 | return dentry; |
| 94 | } | 95 | } |
| 95 | d_drop(dentry); | 96 | err = d_invalidate(dentry); |
| 96 | dput(dentry); | 97 | dput(dentry); |
| 98 | if (err) | ||
| 99 | return NULL; | ||
| 97 | } | 100 | } |
| 98 | 101 | ||
| 99 | dentry = d_alloc(parent, name); | 102 | dentry = d_alloc(parent, name); |
diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c index 56cc4be87807..34cea2798333 100644 --- a/fs/cifs/smb1ops.c +++ b/fs/cifs/smb1ops.c | |||
| @@ -766,7 +766,6 @@ smb_set_file_info(struct inode *inode, const char *full_path, | |||
| 766 | struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); | 766 | struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); |
| 767 | struct tcon_link *tlink = NULL; | 767 | struct tcon_link *tlink = NULL; |
| 768 | struct cifs_tcon *tcon; | 768 | struct cifs_tcon *tcon; |
| 769 | FILE_BASIC_INFO info_buf; | ||
| 770 | 769 | ||
| 771 | /* if the file is already open for write, just use that fileid */ | 770 | /* if the file is already open for write, just use that fileid */ |
| 772 | open_file = find_writable_file(cinode, true); | 771 | open_file = find_writable_file(cinode, true); |
| @@ -817,7 +816,7 @@ smb_set_file_info(struct inode *inode, const char *full_path, | |||
| 817 | netpid = current->tgid; | 816 | netpid = current->tgid; |
| 818 | 817 | ||
| 819 | set_via_filehandle: | 818 | set_via_filehandle: |
| 820 | rc = CIFSSMBSetFileInfo(xid, tcon, &info_buf, netfid, netpid); | 819 | rc = CIFSSMBSetFileInfo(xid, tcon, buf, netfid, netpid); |
| 821 | if (!rc) | 820 | if (!rc) |
| 822 | cinode->cifsAttrs = le32_to_cpu(buf->Attributes); | 821 | cinode->cifsAttrs = le32_to_cpu(buf->Attributes); |
| 823 | 822 | ||
diff --git a/fs/direct-io.c b/fs/direct-io.c index f86c720dba0e..cf5b44b10c67 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
| @@ -540,6 +540,7 @@ static int get_more_blocks(struct dio *dio, struct dio_submit *sdio, | |||
| 540 | sector_t fs_endblk; /* Into file, in filesystem-sized blocks */ | 540 | sector_t fs_endblk; /* Into file, in filesystem-sized blocks */ |
| 541 | unsigned long fs_count; /* Number of filesystem-sized blocks */ | 541 | unsigned long fs_count; /* Number of filesystem-sized blocks */ |
| 542 | int create; | 542 | int create; |
| 543 | unsigned int i_blkbits = sdio->blkbits + sdio->blkfactor; | ||
| 543 | 544 | ||
| 544 | /* | 545 | /* |
| 545 | * If there was a memory error and we've overwritten all the | 546 | * If there was a memory error and we've overwritten all the |
| @@ -554,7 +555,7 @@ static int get_more_blocks(struct dio *dio, struct dio_submit *sdio, | |||
| 554 | fs_count = fs_endblk - fs_startblk + 1; | 555 | fs_count = fs_endblk - fs_startblk + 1; |
| 555 | 556 | ||
| 556 | map_bh->b_state = 0; | 557 | map_bh->b_state = 0; |
| 557 | map_bh->b_size = fs_count << dio->inode->i_blkbits; | 558 | map_bh->b_size = fs_count << i_blkbits; |
| 558 | 559 | ||
| 559 | /* | 560 | /* |
| 560 | * For writes inside i_size on a DIO_SKIP_HOLES filesystem we | 561 | * For writes inside i_size on a DIO_SKIP_HOLES filesystem we |
| @@ -1053,7 +1054,8 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | |||
| 1053 | int seg; | 1054 | int seg; |
| 1054 | size_t size; | 1055 | size_t size; |
| 1055 | unsigned long addr; | 1056 | unsigned long addr; |
| 1056 | unsigned blkbits = inode->i_blkbits; | 1057 | unsigned i_blkbits = ACCESS_ONCE(inode->i_blkbits); |
| 1058 | unsigned blkbits = i_blkbits; | ||
| 1057 | unsigned blocksize_mask = (1 << blkbits) - 1; | 1059 | unsigned blocksize_mask = (1 << blkbits) - 1; |
| 1058 | ssize_t retval = -EINVAL; | 1060 | ssize_t retval = -EINVAL; |
| 1059 | loff_t end = offset; | 1061 | loff_t end = offset; |
| @@ -1149,7 +1151,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | |||
| 1149 | dio->inode = inode; | 1151 | dio->inode = inode; |
| 1150 | dio->rw = rw; | 1152 | dio->rw = rw; |
| 1151 | sdio.blkbits = blkbits; | 1153 | sdio.blkbits = blkbits; |
| 1152 | sdio.blkfactor = inode->i_blkbits - blkbits; | 1154 | sdio.blkfactor = i_blkbits - blkbits; |
| 1153 | sdio.block_in_file = offset >> blkbits; | 1155 | sdio.block_in_file = offset >> blkbits; |
| 1154 | 1156 | ||
| 1155 | sdio.get_block = get_block; | 1157 | sdio.get_block = get_block; |
diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c index 7320a66e958f..22548f56197b 100644 --- a/fs/ext3/balloc.c +++ b/fs/ext3/balloc.c | |||
| @@ -2101,8 +2101,9 @@ int ext3_trim_fs(struct super_block *sb, struct fstrim_range *range) | |||
| 2101 | end = start + (range->len >> sb->s_blocksize_bits) - 1; | 2101 | end = start + (range->len >> sb->s_blocksize_bits) - 1; |
| 2102 | minlen = range->minlen >> sb->s_blocksize_bits; | 2102 | minlen = range->minlen >> sb->s_blocksize_bits; |
| 2103 | 2103 | ||
| 2104 | if (unlikely(minlen > EXT3_BLOCKS_PER_GROUP(sb)) || | 2104 | if (minlen > EXT3_BLOCKS_PER_GROUP(sb) || |
| 2105 | unlikely(start >= max_blks)) | 2105 | start >= max_blks || |
| 2106 | range->len < sb->s_blocksize) | ||
| 2106 | return -EINVAL; | 2107 | return -EINVAL; |
| 2107 | if (end >= max_blks) | 2108 | if (end >= max_blks) |
| 2108 | end = max_blks - 1; | 2109 | end = max_blks - 1; |
| @@ -685,7 +685,6 @@ void do_close_on_exec(struct files_struct *files) | |||
| 685 | struct fdtable *fdt; | 685 | struct fdtable *fdt; |
| 686 | 686 | ||
| 687 | /* exec unshares first */ | 687 | /* exec unshares first */ |
| 688 | BUG_ON(atomic_read(&files->count) != 1); | ||
| 689 | spin_lock(&files->file_lock); | 688 | spin_lock(&files->file_lock); |
| 690 | for (i = 0; ; i++) { | 689 | for (i = 0; ; i++) { |
| 691 | unsigned long set; | 690 | unsigned long set; |
| @@ -995,16 +994,18 @@ int iterate_fd(struct files_struct *files, unsigned n, | |||
| 995 | const void *p) | 994 | const void *p) |
| 996 | { | 995 | { |
| 997 | struct fdtable *fdt; | 996 | struct fdtable *fdt; |
| 998 | struct file *file; | ||
| 999 | int res = 0; | 997 | int res = 0; |
| 1000 | if (!files) | 998 | if (!files) |
| 1001 | return 0; | 999 | return 0; |
| 1002 | spin_lock(&files->file_lock); | 1000 | spin_lock(&files->file_lock); |
| 1003 | fdt = files_fdtable(files); | 1001 | for (fdt = files_fdtable(files); n < fdt->max_fds; n++) { |
| 1004 | while (!res && n < fdt->max_fds) { | 1002 | struct file *file; |
| 1005 | file = rcu_dereference_check_fdtable(files, fdt->fd[n++]); | 1003 | file = rcu_dereference_check_fdtable(files, fdt->fd[n]); |
| 1006 | if (file) | 1004 | if (!file) |
| 1007 | res = f(p, file, n); | 1005 | continue; |
| 1006 | res = f(p, file, n); | ||
| 1007 | if (res) | ||
| 1008 | break; | ||
| 1008 | } | 1009 | } |
| 1009 | spin_unlock(&files->file_lock); | 1010 | spin_unlock(&files->file_lock); |
| 1010 | return res; | 1011 | return res; |
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 51ea267d444c..3e3422f7f0a4 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c | |||
| @@ -228,6 +228,8 @@ static void requeue_io(struct inode *inode, struct bdi_writeback *wb) | |||
| 228 | static void inode_sync_complete(struct inode *inode) | 228 | static void inode_sync_complete(struct inode *inode) |
| 229 | { | 229 | { |
| 230 | inode->i_state &= ~I_SYNC; | 230 | inode->i_state &= ~I_SYNC; |
| 231 | /* If inode is clean an unused, put it into LRU now... */ | ||
| 232 | inode_add_lru(inode); | ||
| 231 | /* Waiters must see I_SYNC cleared before being woken up */ | 233 | /* Waiters must see I_SYNC cleared before being woken up */ |
| 232 | smp_mb(); | 234 | smp_mb(); |
| 233 | wake_up_bit(&inode->i_state, __I_SYNC); | 235 | wake_up_bit(&inode->i_state, __I_SYNC); |
diff --git a/fs/inode.c b/fs/inode.c index b03c71957246..64999f144153 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
| @@ -408,6 +408,19 @@ static void inode_lru_list_add(struct inode *inode) | |||
| 408 | spin_unlock(&inode->i_sb->s_inode_lru_lock); | 408 | spin_unlock(&inode->i_sb->s_inode_lru_lock); |
| 409 | } | 409 | } |
| 410 | 410 | ||
| 411 | /* | ||
| 412 | * Add inode to LRU if needed (inode is unused and clean). | ||
| 413 | * | ||
| 414 | * Needs inode->i_lock held. | ||
| 415 | */ | ||
| 416 | void inode_add_lru(struct inode *inode) | ||
| 417 | { | ||
| 418 | if (!(inode->i_state & (I_DIRTY | I_SYNC | I_FREEING | I_WILL_FREE)) && | ||
| 419 | !atomic_read(&inode->i_count) && inode->i_sb->s_flags & MS_ACTIVE) | ||
| 420 | inode_lru_list_add(inode); | ||
| 421 | } | ||
| 422 | |||
| 423 | |||
| 411 | static void inode_lru_list_del(struct inode *inode) | 424 | static void inode_lru_list_del(struct inode *inode) |
| 412 | { | 425 | { |
| 413 | spin_lock(&inode->i_sb->s_inode_lru_lock); | 426 | spin_lock(&inode->i_sb->s_inode_lru_lock); |
| @@ -1390,8 +1403,7 @@ static void iput_final(struct inode *inode) | |||
| 1390 | 1403 | ||
| 1391 | if (!drop && (sb->s_flags & MS_ACTIVE)) { | 1404 | if (!drop && (sb->s_flags & MS_ACTIVE)) { |
| 1392 | inode->i_state |= I_REFERENCED; | 1405 | inode->i_state |= I_REFERENCED; |
| 1393 | if (!(inode->i_state & (I_DIRTY|I_SYNC))) | 1406 | inode_add_lru(inode); |
| 1394 | inode_lru_list_add(inode); | ||
| 1395 | spin_unlock(&inode->i_lock); | 1407 | spin_unlock(&inode->i_lock); |
| 1396 | return; | 1408 | return; |
| 1397 | } | 1409 | } |
diff --git a/fs/internal.h b/fs/internal.h index 916b7cbf3e3e..2f6af7f645eb 100644 --- a/fs/internal.h +++ b/fs/internal.h | |||
| @@ -110,6 +110,7 @@ extern int open_check_o_direct(struct file *f); | |||
| 110 | * inode.c | 110 | * inode.c |
| 111 | */ | 111 | */ |
| 112 | extern spinlock_t inode_sb_list_lock; | 112 | extern spinlock_t inode_sb_list_lock; |
| 113 | extern void inode_add_lru(struct inode *inode); | ||
| 113 | 114 | ||
| 114 | /* | 115 | /* |
| 115 | * fs-writeback.c | 116 | * fs-writeback.c |
diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c index 78b7f84241d4..7f5120bf0ec2 100644 --- a/fs/jbd/transaction.c +++ b/fs/jbd/transaction.c | |||
| @@ -1961,7 +1961,9 @@ retry: | |||
| 1961 | spin_unlock(&journal->j_list_lock); | 1961 | spin_unlock(&journal->j_list_lock); |
| 1962 | jbd_unlock_bh_state(bh); | 1962 | jbd_unlock_bh_state(bh); |
| 1963 | spin_unlock(&journal->j_state_lock); | 1963 | spin_unlock(&journal->j_state_lock); |
| 1964 | unlock_buffer(bh); | ||
| 1964 | log_wait_commit(journal, tid); | 1965 | log_wait_commit(journal, tid); |
| 1966 | lock_buffer(bh); | ||
| 1965 | goto retry; | 1967 | goto retry; |
| 1966 | } | 1968 | } |
| 1967 | /* | 1969 | /* |
diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c index 60ef3fb707ff..1506673c087e 100644 --- a/fs/jffs2/file.c +++ b/fs/jffs2/file.c | |||
| @@ -138,33 +138,39 @@ static int jffs2_write_begin(struct file *filp, struct address_space *mapping, | |||
| 138 | struct page *pg; | 138 | struct page *pg; |
| 139 | struct inode *inode = mapping->host; | 139 | struct inode *inode = mapping->host; |
| 140 | struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); | 140 | struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); |
| 141 | struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); | ||
| 142 | struct jffs2_raw_inode ri; | ||
| 143 | uint32_t alloc_len = 0; | ||
| 141 | pgoff_t index = pos >> PAGE_CACHE_SHIFT; | 144 | pgoff_t index = pos >> PAGE_CACHE_SHIFT; |
| 142 | uint32_t pageofs = index << PAGE_CACHE_SHIFT; | 145 | uint32_t pageofs = index << PAGE_CACHE_SHIFT; |
| 143 | int ret = 0; | 146 | int ret = 0; |
| 144 | 147 | ||
| 148 | jffs2_dbg(1, "%s()\n", __func__); | ||
| 149 | |||
| 150 | if (pageofs > inode->i_size) { | ||
| 151 | ret = jffs2_reserve_space(c, sizeof(ri), &alloc_len, | ||
| 152 | ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); | ||
| 153 | if (ret) | ||
| 154 | return ret; | ||
| 155 | } | ||
| 156 | |||
| 157 | mutex_lock(&f->sem); | ||
| 145 | pg = grab_cache_page_write_begin(mapping, index, flags); | 158 | pg = grab_cache_page_write_begin(mapping, index, flags); |
| 146 | if (!pg) | 159 | if (!pg) { |
| 160 | if (alloc_len) | ||
| 161 | jffs2_complete_reservation(c); | ||
| 162 | mutex_unlock(&f->sem); | ||
| 147 | return -ENOMEM; | 163 | return -ENOMEM; |
| 164 | } | ||
| 148 | *pagep = pg; | 165 | *pagep = pg; |
| 149 | 166 | ||
| 150 | jffs2_dbg(1, "%s()\n", __func__); | 167 | if (alloc_len) { |
| 151 | |||
| 152 | if (pageofs > inode->i_size) { | ||
| 153 | /* Make new hole frag from old EOF to new page */ | 168 | /* Make new hole frag from old EOF to new page */ |
| 154 | struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); | ||
| 155 | struct jffs2_raw_inode ri; | ||
| 156 | struct jffs2_full_dnode *fn; | 169 | struct jffs2_full_dnode *fn; |
| 157 | uint32_t alloc_len; | ||
| 158 | 170 | ||
| 159 | jffs2_dbg(1, "Writing new hole frag 0x%x-0x%x between current EOF and new page\n", | 171 | jffs2_dbg(1, "Writing new hole frag 0x%x-0x%x between current EOF and new page\n", |
| 160 | (unsigned int)inode->i_size, pageofs); | 172 | (unsigned int)inode->i_size, pageofs); |
| 161 | 173 | ||
| 162 | ret = jffs2_reserve_space(c, sizeof(ri), &alloc_len, | ||
| 163 | ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); | ||
| 164 | if (ret) | ||
| 165 | goto out_page; | ||
| 166 | |||
| 167 | mutex_lock(&f->sem); | ||
| 168 | memset(&ri, 0, sizeof(ri)); | 174 | memset(&ri, 0, sizeof(ri)); |
| 169 | 175 | ||
| 170 | ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); | 176 | ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); |
| @@ -191,7 +197,6 @@ static int jffs2_write_begin(struct file *filp, struct address_space *mapping, | |||
| 191 | if (IS_ERR(fn)) { | 197 | if (IS_ERR(fn)) { |
| 192 | ret = PTR_ERR(fn); | 198 | ret = PTR_ERR(fn); |
| 193 | jffs2_complete_reservation(c); | 199 | jffs2_complete_reservation(c); |
| 194 | mutex_unlock(&f->sem); | ||
| 195 | goto out_page; | 200 | goto out_page; |
| 196 | } | 201 | } |
| 197 | ret = jffs2_add_full_dnode_to_inode(c, f, fn); | 202 | ret = jffs2_add_full_dnode_to_inode(c, f, fn); |
| @@ -206,12 +211,10 @@ static int jffs2_write_begin(struct file *filp, struct address_space *mapping, | |||
| 206 | jffs2_mark_node_obsolete(c, fn->raw); | 211 | jffs2_mark_node_obsolete(c, fn->raw); |
| 207 | jffs2_free_full_dnode(fn); | 212 | jffs2_free_full_dnode(fn); |
| 208 | jffs2_complete_reservation(c); | 213 | jffs2_complete_reservation(c); |
| 209 | mutex_unlock(&f->sem); | ||
| 210 | goto out_page; | 214 | goto out_page; |
| 211 | } | 215 | } |
| 212 | jffs2_complete_reservation(c); | 216 | jffs2_complete_reservation(c); |
| 213 | inode->i_size = pageofs; | 217 | inode->i_size = pageofs; |
| 214 | mutex_unlock(&f->sem); | ||
| 215 | } | 218 | } |
| 216 | 219 | ||
| 217 | /* | 220 | /* |
| @@ -220,18 +223,18 @@ static int jffs2_write_begin(struct file *filp, struct address_space *mapping, | |||
| 220 | * case of a short-copy. | 223 | * case of a short-copy. |
| 221 | */ | 224 | */ |
| 222 | if (!PageUptodate(pg)) { | 225 | if (!PageUptodate(pg)) { |
| 223 | mutex_lock(&f->sem); | ||
| 224 | ret = jffs2_do_readpage_nolock(inode, pg); | 226 | ret = jffs2_do_readpage_nolock(inode, pg); |
| 225 | mutex_unlock(&f->sem); | ||
| 226 | if (ret) | 227 | if (ret) |
| 227 | goto out_page; | 228 | goto out_page; |
| 228 | } | 229 | } |
| 230 | mutex_unlock(&f->sem); | ||
| 229 | jffs2_dbg(1, "end write_begin(). pg->flags %lx\n", pg->flags); | 231 | jffs2_dbg(1, "end write_begin(). pg->flags %lx\n", pg->flags); |
| 230 | return ret; | 232 | return ret; |
| 231 | 233 | ||
| 232 | out_page: | 234 | out_page: |
| 233 | unlock_page(pg); | 235 | unlock_page(pg); |
| 234 | page_cache_release(pg); | 236 | page_cache_release(pg); |
| 237 | mutex_unlock(&f->sem); | ||
| 235 | return ret; | 238 | return ret; |
| 236 | } | 239 | } |
| 237 | 240 | ||
diff --git a/fs/namei.c b/fs/namei.c index 937f9d50c84b..5f4cdf3ad913 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -2131,6 +2131,11 @@ struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) | |||
| 2131 | if (!len) | 2131 | if (!len) |
| 2132 | return ERR_PTR(-EACCES); | 2132 | return ERR_PTR(-EACCES); |
| 2133 | 2133 | ||
| 2134 | if (unlikely(name[0] == '.')) { | ||
| 2135 | if (len < 2 || (len == 2 && name[1] == '.')) | ||
| 2136 | return ERR_PTR(-EACCES); | ||
| 2137 | } | ||
| 2138 | |||
| 2134 | while (len--) { | 2139 | while (len--) { |
| 2135 | c = *(const unsigned char *)name++; | 2140 | c = *(const unsigned char *)name++; |
| 2136 | if (c == '/' || c == '\0') | 2141 | if (c == '/' || c == '\0') |
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index ce8cb926526b..b9e66b7e0c14 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
| @@ -450,7 +450,8 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry) | |||
| 450 | nfs_refresh_inode(dentry->d_inode, entry->fattr); | 450 | nfs_refresh_inode(dentry->d_inode, entry->fattr); |
| 451 | goto out; | 451 | goto out; |
| 452 | } else { | 452 | } else { |
| 453 | d_drop(dentry); | 453 | if (d_invalidate(dentry) != 0) |
| 454 | goto out; | ||
| 454 | dput(dentry); | 455 | dput(dentry); |
| 455 | } | 456 | } |
| 456 | } | 457 | } |
| @@ -1100,6 +1101,8 @@ out_set_verifier: | |||
| 1100 | out_zap_parent: | 1101 | out_zap_parent: |
| 1101 | nfs_zap_caches(dir); | 1102 | nfs_zap_caches(dir); |
| 1102 | out_bad: | 1103 | out_bad: |
| 1104 | nfs_free_fattr(fattr); | ||
| 1105 | nfs_free_fhandle(fhandle); | ||
| 1103 | nfs_mark_for_revalidate(dir); | 1106 | nfs_mark_for_revalidate(dir); |
| 1104 | if (inode && S_ISDIR(inode->i_mode)) { | 1107 | if (inode && S_ISDIR(inode->i_mode)) { |
| 1105 | /* Purge readdir caches. */ | 1108 | /* Purge readdir caches. */ |
| @@ -1112,8 +1115,6 @@ out_zap_parent: | |||
| 1112 | shrink_dcache_parent(dentry); | 1115 | shrink_dcache_parent(dentry); |
| 1113 | } | 1116 | } |
| 1114 | d_drop(dentry); | 1117 | d_drop(dentry); |
| 1115 | nfs_free_fattr(fattr); | ||
| 1116 | nfs_free_fhandle(fhandle); | ||
| 1117 | dput(parent); | 1118 | dput(parent); |
| 1118 | dfprintk(LOOKUPCACHE, "NFS: %s(%s/%s) is invalid\n", | 1119 | dfprintk(LOOKUPCACHE, "NFS: %s(%s/%s) is invalid\n", |
| 1119 | __func__, dentry->d_parent->d_name.name, | 1120 | __func__, dentry->d_parent->d_name.name, |
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index 721d692fa8d4..6fcaeb8c902e 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c | |||
| @@ -258,7 +258,8 @@ static ssize_t copy_event_to_user(struct fsnotify_group *group, | |||
| 258 | if (ret) | 258 | if (ret) |
| 259 | goto out_close_fd; | 259 | goto out_close_fd; |
| 260 | 260 | ||
| 261 | fd_install(fd, f); | 261 | if (fd != FAN_NOFD) |
| 262 | fd_install(fd, f); | ||
| 262 | return fanotify_event_metadata.event_len; | 263 | return fanotify_event_metadata.event_len; |
| 263 | 264 | ||
| 264 | out_close_fd: | 265 | out_close_fd: |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 3c231adf8450..9e28356a959a 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -1877,8 +1877,9 @@ static struct dentry *proc_map_files_lookup(struct inode *dir, | |||
| 1877 | if (!vma) | 1877 | if (!vma) |
| 1878 | goto out_no_vma; | 1878 | goto out_no_vma; |
| 1879 | 1879 | ||
| 1880 | result = proc_map_files_instantiate(dir, dentry, task, | 1880 | if (vma->vm_file) |
| 1881 | (void *)(unsigned long)vma->vm_file->f_mode); | 1881 | result = proc_map_files_instantiate(dir, dentry, task, |
| 1882 | (void *)(unsigned long)vma->vm_file->f_mode); | ||
| 1882 | 1883 | ||
| 1883 | out_no_vma: | 1884 | out_no_vma: |
| 1884 | up_read(&mm->mmap_sem); | 1885 | up_read(&mm->mmap_sem); |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index f27f01a98aa2..d83736fbc26c 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
| @@ -1782,8 +1782,9 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
| 1782 | 1782 | ||
| 1783 | BUG_ON(!th->t_trans_id); | 1783 | BUG_ON(!th->t_trans_id); |
| 1784 | 1784 | ||
| 1785 | dquot_initialize(inode); | 1785 | reiserfs_write_unlock(inode->i_sb); |
| 1786 | err = dquot_alloc_inode(inode); | 1786 | err = dquot_alloc_inode(inode); |
| 1787 | reiserfs_write_lock(inode->i_sb); | ||
| 1787 | if (err) | 1788 | if (err) |
| 1788 | goto out_end_trans; | 1789 | goto out_end_trans; |
| 1789 | if (!dir->i_nlink) { | 1790 | if (!dir->i_nlink) { |
| @@ -1979,8 +1980,10 @@ int reiserfs_new_inode(struct reiserfs_transaction_handle *th, | |||
| 1979 | 1980 | ||
| 1980 | out_end_trans: | 1981 | out_end_trans: |
| 1981 | journal_end(th, th->t_super, th->t_blocks_allocated); | 1982 | journal_end(th, th->t_super, th->t_blocks_allocated); |
| 1983 | reiserfs_write_unlock(inode->i_sb); | ||
| 1982 | /* Drop can be outside and it needs more credits so it's better to have it outside */ | 1984 | /* Drop can be outside and it needs more credits so it's better to have it outside */ |
| 1983 | dquot_drop(inode); | 1985 | dquot_drop(inode); |
| 1986 | reiserfs_write_lock(inode->i_sb); | ||
| 1984 | inode->i_flags |= S_NOQUOTA; | 1987 | inode->i_flags |= S_NOQUOTA; |
| 1985 | make_bad_inode(inode); | 1988 | make_bad_inode(inode); |
| 1986 | 1989 | ||
| @@ -3103,10 +3106,9 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 3103 | /* must be turned off for recursive notify_change calls */ | 3106 | /* must be turned off for recursive notify_change calls */ |
| 3104 | ia_valid = attr->ia_valid &= ~(ATTR_KILL_SUID|ATTR_KILL_SGID); | 3107 | ia_valid = attr->ia_valid &= ~(ATTR_KILL_SUID|ATTR_KILL_SGID); |
| 3105 | 3108 | ||
| 3106 | depth = reiserfs_write_lock_once(inode->i_sb); | ||
| 3107 | if (is_quota_modification(inode, attr)) | 3109 | if (is_quota_modification(inode, attr)) |
| 3108 | dquot_initialize(inode); | 3110 | dquot_initialize(inode); |
| 3109 | 3111 | depth = reiserfs_write_lock_once(inode->i_sb); | |
| 3110 | if (attr->ia_valid & ATTR_SIZE) { | 3112 | if (attr->ia_valid & ATTR_SIZE) { |
| 3111 | /* version 2 items will be caught by the s_maxbytes check | 3113 | /* version 2 items will be caught by the s_maxbytes check |
| 3112 | ** done for us in vmtruncate | 3114 | ** done for us in vmtruncate |
| @@ -3170,7 +3172,9 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 3170 | error = journal_begin(&th, inode->i_sb, jbegin_count); | 3172 | error = journal_begin(&th, inode->i_sb, jbegin_count); |
| 3171 | if (error) | 3173 | if (error) |
| 3172 | goto out; | 3174 | goto out; |
| 3175 | reiserfs_write_unlock_once(inode->i_sb, depth); | ||
| 3173 | error = dquot_transfer(inode, attr); | 3176 | error = dquot_transfer(inode, attr); |
| 3177 | depth = reiserfs_write_lock_once(inode->i_sb); | ||
| 3174 | if (error) { | 3178 | if (error) { |
| 3175 | journal_end(&th, inode->i_sb, jbegin_count); | 3179 | journal_end(&th, inode->i_sb, jbegin_count); |
| 3176 | goto out; | 3180 | goto out; |
diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c index f8afa4b162b8..2f40a4c70a4d 100644 --- a/fs/reiserfs/stree.c +++ b/fs/reiserfs/stree.c | |||
| @@ -1968,7 +1968,9 @@ int reiserfs_paste_into_item(struct reiserfs_transaction_handle *th, struct tree | |||
| 1968 | key2type(&(key->on_disk_key))); | 1968 | key2type(&(key->on_disk_key))); |
| 1969 | #endif | 1969 | #endif |
| 1970 | 1970 | ||
| 1971 | reiserfs_write_unlock(inode->i_sb); | ||
| 1971 | retval = dquot_alloc_space_nodirty(inode, pasted_size); | 1972 | retval = dquot_alloc_space_nodirty(inode, pasted_size); |
| 1973 | reiserfs_write_lock(inode->i_sb); | ||
| 1972 | if (retval) { | 1974 | if (retval) { |
| 1973 | pathrelse(search_path); | 1975 | pathrelse(search_path); |
| 1974 | return retval; | 1976 | return retval; |
| @@ -2061,9 +2063,11 @@ int reiserfs_insert_item(struct reiserfs_transaction_handle *th, | |||
| 2061 | "reiserquota insert_item(): allocating %u id=%u type=%c", | 2063 | "reiserquota insert_item(): allocating %u id=%u type=%c", |
| 2062 | quota_bytes, inode->i_uid, head2type(ih)); | 2064 | quota_bytes, inode->i_uid, head2type(ih)); |
| 2063 | #endif | 2065 | #endif |
| 2066 | reiserfs_write_unlock(inode->i_sb); | ||
| 2064 | /* We can't dirty inode here. It would be immediately written but | 2067 | /* We can't dirty inode here. It would be immediately written but |
| 2065 | * appropriate stat item isn't inserted yet... */ | 2068 | * appropriate stat item isn't inserted yet... */ |
| 2066 | retval = dquot_alloc_space_nodirty(inode, quota_bytes); | 2069 | retval = dquot_alloc_space_nodirty(inode, quota_bytes); |
| 2070 | reiserfs_write_lock(inode->i_sb); | ||
| 2067 | if (retval) { | 2071 | if (retval) { |
| 2068 | pathrelse(path); | 2072 | pathrelse(path); |
| 2069 | return retval; | 2073 | return retval; |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 1078ae179993..418bdc3a57da 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
| @@ -298,7 +298,9 @@ static int finish_unfinished(struct super_block *s) | |||
| 298 | retval = remove_save_link_only(s, &save_link_key, 0); | 298 | retval = remove_save_link_only(s, &save_link_key, 0); |
| 299 | continue; | 299 | continue; |
| 300 | } | 300 | } |
| 301 | reiserfs_write_unlock(s); | ||
| 301 | dquot_initialize(inode); | 302 | dquot_initialize(inode); |
| 303 | reiserfs_write_lock(s); | ||
| 302 | 304 | ||
| 303 | if (truncate && S_ISDIR(inode->i_mode)) { | 305 | if (truncate && S_ISDIR(inode->i_mode)) { |
| 304 | /* We got a truncate request for a dir which is impossible. | 306 | /* We got a truncate request for a dir which is impossible. |
| @@ -1335,7 +1337,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
| 1335 | kfree(qf_names[i]); | 1337 | kfree(qf_names[i]); |
| 1336 | #endif | 1338 | #endif |
| 1337 | err = -EINVAL; | 1339 | err = -EINVAL; |
| 1338 | goto out_err; | 1340 | goto out_unlock; |
| 1339 | } | 1341 | } |
| 1340 | #ifdef CONFIG_QUOTA | 1342 | #ifdef CONFIG_QUOTA |
| 1341 | handle_quota_files(s, qf_names, &qfmt); | 1343 | handle_quota_files(s, qf_names, &qfmt); |
| @@ -1379,7 +1381,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
| 1379 | if (blocks) { | 1381 | if (blocks) { |
| 1380 | err = reiserfs_resize(s, blocks); | 1382 | err = reiserfs_resize(s, blocks); |
| 1381 | if (err != 0) | 1383 | if (err != 0) |
| 1382 | goto out_err; | 1384 | goto out_unlock; |
| 1383 | } | 1385 | } |
| 1384 | 1386 | ||
| 1385 | if (*mount_flags & MS_RDONLY) { | 1387 | if (*mount_flags & MS_RDONLY) { |
| @@ -1389,9 +1391,15 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
| 1389 | /* it is read-only already */ | 1391 | /* it is read-only already */ |
| 1390 | goto out_ok; | 1392 | goto out_ok; |
| 1391 | 1393 | ||
| 1394 | /* | ||
| 1395 | * Drop write lock. Quota will retake it when needed and lock | ||
| 1396 | * ordering requires calling dquot_suspend() without it. | ||
| 1397 | */ | ||
| 1398 | reiserfs_write_unlock(s); | ||
| 1392 | err = dquot_suspend(s, -1); | 1399 | err = dquot_suspend(s, -1); |
| 1393 | if (err < 0) | 1400 | if (err < 0) |
| 1394 | goto out_err; | 1401 | goto out_err; |
| 1402 | reiserfs_write_lock(s); | ||
| 1395 | 1403 | ||
| 1396 | /* try to remount file system with read-only permissions */ | 1404 | /* try to remount file system with read-only permissions */ |
| 1397 | if (sb_umount_state(rs) == REISERFS_VALID_FS | 1405 | if (sb_umount_state(rs) == REISERFS_VALID_FS |
| @@ -1401,7 +1409,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
| 1401 | 1409 | ||
| 1402 | err = journal_begin(&th, s, 10); | 1410 | err = journal_begin(&th, s, 10); |
| 1403 | if (err) | 1411 | if (err) |
| 1404 | goto out_err; | 1412 | goto out_unlock; |
| 1405 | 1413 | ||
| 1406 | /* Mounting a rw partition read-only. */ | 1414 | /* Mounting a rw partition read-only. */ |
| 1407 | reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1); | 1415 | reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1); |
| @@ -1416,7 +1424,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
| 1416 | 1424 | ||
| 1417 | if (reiserfs_is_journal_aborted(journal)) { | 1425 | if (reiserfs_is_journal_aborted(journal)) { |
| 1418 | err = journal->j_errno; | 1426 | err = journal->j_errno; |
| 1419 | goto out_err; | 1427 | goto out_unlock; |
| 1420 | } | 1428 | } |
| 1421 | 1429 | ||
| 1422 | handle_data_mode(s, mount_options); | 1430 | handle_data_mode(s, mount_options); |
| @@ -1425,7 +1433,7 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
| 1425 | s->s_flags &= ~MS_RDONLY; /* now it is safe to call journal_begin */ | 1433 | s->s_flags &= ~MS_RDONLY; /* now it is safe to call journal_begin */ |
| 1426 | err = journal_begin(&th, s, 10); | 1434 | err = journal_begin(&th, s, 10); |
| 1427 | if (err) | 1435 | if (err) |
| 1428 | goto out_err; | 1436 | goto out_unlock; |
| 1429 | 1437 | ||
| 1430 | /* Mount a partition which is read-only, read-write */ | 1438 | /* Mount a partition which is read-only, read-write */ |
| 1431 | reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1); | 1439 | reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1); |
| @@ -1442,10 +1450,16 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg) | |||
| 1442 | SB_JOURNAL(s)->j_must_wait = 1; | 1450 | SB_JOURNAL(s)->j_must_wait = 1; |
| 1443 | err = journal_end(&th, s, 10); | 1451 | err = journal_end(&th, s, 10); |
| 1444 | if (err) | 1452 | if (err) |
| 1445 | goto out_err; | 1453 | goto out_unlock; |
| 1446 | 1454 | ||
| 1447 | if (!(*mount_flags & MS_RDONLY)) { | 1455 | if (!(*mount_flags & MS_RDONLY)) { |
| 1456 | /* | ||
| 1457 | * Drop write lock. Quota will retake it when needed and lock | ||
| 1458 | * ordering requires calling dquot_resume() without it. | ||
| 1459 | */ | ||
| 1460 | reiserfs_write_unlock(s); | ||
| 1448 | dquot_resume(s, -1); | 1461 | dquot_resume(s, -1); |
| 1462 | reiserfs_write_lock(s); | ||
| 1449 | finish_unfinished(s); | 1463 | finish_unfinished(s); |
| 1450 | reiserfs_xattr_init(s, *mount_flags); | 1464 | reiserfs_xattr_init(s, *mount_flags); |
| 1451 | } | 1465 | } |
| @@ -1455,9 +1469,10 @@ out_ok: | |||
| 1455 | reiserfs_write_unlock(s); | 1469 | reiserfs_write_unlock(s); |
| 1456 | return 0; | 1470 | return 0; |
| 1457 | 1471 | ||
| 1472 | out_unlock: | ||
| 1473 | reiserfs_write_unlock(s); | ||
| 1458 | out_err: | 1474 | out_err: |
| 1459 | kfree(new_opts); | 1475 | kfree(new_opts); |
| 1460 | reiserfs_write_unlock(s); | ||
| 1461 | return err; | 1476 | return err; |
| 1462 | } | 1477 | } |
| 1463 | 1478 | ||
| @@ -2095,13 +2110,15 @@ static int reiserfs_write_dquot(struct dquot *dquot) | |||
| 2095 | REISERFS_QUOTA_TRANS_BLOCKS(dquot->dq_sb)); | 2110 | REISERFS_QUOTA_TRANS_BLOCKS(dquot->dq_sb)); |
| 2096 | if (ret) | 2111 | if (ret) |
| 2097 | goto out; | 2112 | goto out; |
| 2113 | reiserfs_write_unlock(dquot->dq_sb); | ||
| 2098 | ret = dquot_commit(dquot); | 2114 | ret = dquot_commit(dquot); |
| 2115 | reiserfs_write_lock(dquot->dq_sb); | ||
| 2099 | err = | 2116 | err = |
| 2100 | journal_end(&th, dquot->dq_sb, | 2117 | journal_end(&th, dquot->dq_sb, |
| 2101 | REISERFS_QUOTA_TRANS_BLOCKS(dquot->dq_sb)); | 2118 | REISERFS_QUOTA_TRANS_BLOCKS(dquot->dq_sb)); |
| 2102 | if (!ret && err) | 2119 | if (!ret && err) |
| 2103 | ret = err; | 2120 | ret = err; |
| 2104 | out: | 2121 | out: |
| 2105 | reiserfs_write_unlock(dquot->dq_sb); | 2122 | reiserfs_write_unlock(dquot->dq_sb); |
| 2106 | return ret; | 2123 | return ret; |
| 2107 | } | 2124 | } |
| @@ -2117,13 +2134,15 @@ static int reiserfs_acquire_dquot(struct dquot *dquot) | |||
| 2117 | REISERFS_QUOTA_INIT_BLOCKS(dquot->dq_sb)); | 2134 | REISERFS_QUOTA_INIT_BLOCKS(dquot->dq_sb)); |
| 2118 | if (ret) | 2135 | if (ret) |
| 2119 | goto out; | 2136 | goto out; |
| 2137 | reiserfs_write_unlock(dquot->dq_sb); | ||
| 2120 | ret = dquot_acquire(dquot); | 2138 | ret = dquot_acquire(dquot); |
| 2139 | reiserfs_write_lock(dquot->dq_sb); | ||
| 2121 | err = | 2140 | err = |
| 2122 | journal_end(&th, dquot->dq_sb, | 2141 | journal_end(&th, dquot->dq_sb, |
| 2123 | REISERFS_QUOTA_INIT_BLOCKS(dquot->dq_sb)); | 2142 | REISERFS_QUOTA_INIT_BLOCKS(dquot->dq_sb)); |
| 2124 | if (!ret && err) | 2143 | if (!ret && err) |
| 2125 | ret = err; | 2144 | ret = err; |
| 2126 | out: | 2145 | out: |
| 2127 | reiserfs_write_unlock(dquot->dq_sb); | 2146 | reiserfs_write_unlock(dquot->dq_sb); |
| 2128 | return ret; | 2147 | return ret; |
| 2129 | } | 2148 | } |
| @@ -2137,19 +2156,21 @@ static int reiserfs_release_dquot(struct dquot *dquot) | |||
| 2137 | ret = | 2156 | ret = |
| 2138 | journal_begin(&th, dquot->dq_sb, | 2157 | journal_begin(&th, dquot->dq_sb, |
| 2139 | REISERFS_QUOTA_DEL_BLOCKS(dquot->dq_sb)); | 2158 | REISERFS_QUOTA_DEL_BLOCKS(dquot->dq_sb)); |
| 2159 | reiserfs_write_unlock(dquot->dq_sb); | ||
| 2140 | if (ret) { | 2160 | if (ret) { |
| 2141 | /* Release dquot anyway to avoid endless cycle in dqput() */ | 2161 | /* Release dquot anyway to avoid endless cycle in dqput() */ |
| 2142 | dquot_release(dquot); | 2162 | dquot_release(dquot); |
| 2143 | goto out; | 2163 | goto out; |
| 2144 | } | 2164 | } |
| 2145 | ret = dquot_release(dquot); | 2165 | ret = dquot_release(dquot); |
| 2166 | reiserfs_write_lock(dquot->dq_sb); | ||
| 2146 | err = | 2167 | err = |
| 2147 | journal_end(&th, dquot->dq_sb, | 2168 | journal_end(&th, dquot->dq_sb, |
| 2148 | REISERFS_QUOTA_DEL_BLOCKS(dquot->dq_sb)); | 2169 | REISERFS_QUOTA_DEL_BLOCKS(dquot->dq_sb)); |
| 2149 | if (!ret && err) | 2170 | if (!ret && err) |
| 2150 | ret = err; | 2171 | ret = err; |
| 2151 | out: | ||
| 2152 | reiserfs_write_unlock(dquot->dq_sb); | 2172 | reiserfs_write_unlock(dquot->dq_sb); |
| 2173 | out: | ||
| 2153 | return ret; | 2174 | return ret; |
| 2154 | } | 2175 | } |
| 2155 | 2176 | ||
| @@ -2174,11 +2195,13 @@ static int reiserfs_write_info(struct super_block *sb, int type) | |||
| 2174 | ret = journal_begin(&th, sb, 2); | 2195 | ret = journal_begin(&th, sb, 2); |
| 2175 | if (ret) | 2196 | if (ret) |
| 2176 | goto out; | 2197 | goto out; |
| 2198 | reiserfs_write_unlock(sb); | ||
| 2177 | ret = dquot_commit_info(sb, type); | 2199 | ret = dquot_commit_info(sb, type); |
| 2200 | reiserfs_write_lock(sb); | ||
| 2178 | err = journal_end(&th, sb, 2); | 2201 | err = journal_end(&th, sb, 2); |
| 2179 | if (!ret && err) | 2202 | if (!ret && err) |
| 2180 | ret = err; | 2203 | ret = err; |
| 2181 | out: | 2204 | out: |
| 2182 | reiserfs_write_unlock(sb); | 2205 | reiserfs_write_unlock(sb); |
| 2183 | return ret; | 2206 | return ret; |
| 2184 | } | 2207 | } |
| @@ -2203,8 +2226,11 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, | |||
| 2203 | struct reiserfs_transaction_handle th; | 2226 | struct reiserfs_transaction_handle th; |
| 2204 | int opt = type == USRQUOTA ? REISERFS_USRQUOTA : REISERFS_GRPQUOTA; | 2227 | int opt = type == USRQUOTA ? REISERFS_USRQUOTA : REISERFS_GRPQUOTA; |
| 2205 | 2228 | ||
| 2206 | if (!(REISERFS_SB(sb)->s_mount_opt & (1 << opt))) | 2229 | reiserfs_write_lock(sb); |
| 2207 | return -EINVAL; | 2230 | if (!(REISERFS_SB(sb)->s_mount_opt & (1 << opt))) { |
| 2231 | err = -EINVAL; | ||
| 2232 | goto out; | ||
| 2233 | } | ||
| 2208 | 2234 | ||
| 2209 | /* Quotafile not on the same filesystem? */ | 2235 | /* Quotafile not on the same filesystem? */ |
| 2210 | if (path->dentry->d_sb != sb) { | 2236 | if (path->dentry->d_sb != sb) { |
| @@ -2246,8 +2272,10 @@ static int reiserfs_quota_on(struct super_block *sb, int type, int format_id, | |||
| 2246 | if (err) | 2272 | if (err) |
| 2247 | goto out; | 2273 | goto out; |
| 2248 | } | 2274 | } |
| 2249 | err = dquot_quota_on(sb, type, format_id, path); | 2275 | reiserfs_write_unlock(sb); |
| 2276 | return dquot_quota_on(sb, type, format_id, path); | ||
| 2250 | out: | 2277 | out: |
| 2278 | reiserfs_write_unlock(sb); | ||
| 2251 | return err; | 2279 | return err; |
| 2252 | } | 2280 | } |
| 2253 | 2281 | ||
| @@ -2320,7 +2348,9 @@ static ssize_t reiserfs_quota_write(struct super_block *sb, int type, | |||
| 2320 | tocopy = sb->s_blocksize - offset < towrite ? | 2348 | tocopy = sb->s_blocksize - offset < towrite ? |
| 2321 | sb->s_blocksize - offset : towrite; | 2349 | sb->s_blocksize - offset : towrite; |
| 2322 | tmp_bh.b_state = 0; | 2350 | tmp_bh.b_state = 0; |
| 2351 | reiserfs_write_lock(sb); | ||
| 2323 | err = reiserfs_get_block(inode, blk, &tmp_bh, GET_BLOCK_CREATE); | 2352 | err = reiserfs_get_block(inode, blk, &tmp_bh, GET_BLOCK_CREATE); |
| 2353 | reiserfs_write_unlock(sb); | ||
| 2324 | if (err) | 2354 | if (err) |
| 2325 | goto out; | 2355 | goto out; |
| 2326 | if (offset || tocopy != sb->s_blocksize) | 2356 | if (offset || tocopy != sb->s_blocksize) |
| @@ -2336,10 +2366,12 @@ static ssize_t reiserfs_quota_write(struct super_block *sb, int type, | |||
| 2336 | flush_dcache_page(bh->b_page); | 2366 | flush_dcache_page(bh->b_page); |
| 2337 | set_buffer_uptodate(bh); | 2367 | set_buffer_uptodate(bh); |
| 2338 | unlock_buffer(bh); | 2368 | unlock_buffer(bh); |
| 2369 | reiserfs_write_lock(sb); | ||
| 2339 | reiserfs_prepare_for_journal(sb, bh, 1); | 2370 | reiserfs_prepare_for_journal(sb, bh, 1); |
| 2340 | journal_mark_dirty(current->journal_info, sb, bh); | 2371 | journal_mark_dirty(current->journal_info, sb, bh); |
| 2341 | if (!journal_quota) | 2372 | if (!journal_quota) |
| 2342 | reiserfs_add_ordered_list(inode, bh); | 2373 | reiserfs_add_ordered_list(inode, bh); |
| 2374 | reiserfs_write_unlock(sb); | ||
| 2343 | brelse(bh); | 2375 | brelse(bh); |
| 2344 | offset = 0; | 2376 | offset = 0; |
| 2345 | towrite -= tocopy; | 2377 | towrite -= tocopy; |
diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index e562dd43f41f..e57e2daa357c 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c | |||
| @@ -481,11 +481,17 @@ static inline int bio_add_buffer(struct bio *bio, struct buffer_head *bh) | |||
| 481 | * | 481 | * |
| 482 | * The fix is two passes across the ioend list - one to start writeback on the | 482 | * The fix is two passes across the ioend list - one to start writeback on the |
| 483 | * buffer_heads, and then submit them for I/O on the second pass. | 483 | * buffer_heads, and then submit them for I/O on the second pass. |
| 484 | * | ||
| 485 | * If @fail is non-zero, it means that we have a situation where some part of | ||
| 486 | * the submission process has failed after we have marked paged for writeback | ||
| 487 | * and unlocked them. In this situation, we need to fail the ioend chain rather | ||
| 488 | * than submit it to IO. This typically only happens on a filesystem shutdown. | ||
| 484 | */ | 489 | */ |
| 485 | STATIC void | 490 | STATIC void |
| 486 | xfs_submit_ioend( | 491 | xfs_submit_ioend( |
| 487 | struct writeback_control *wbc, | 492 | struct writeback_control *wbc, |
| 488 | xfs_ioend_t *ioend) | 493 | xfs_ioend_t *ioend, |
| 494 | int fail) | ||
| 489 | { | 495 | { |
| 490 | xfs_ioend_t *head = ioend; | 496 | xfs_ioend_t *head = ioend; |
| 491 | xfs_ioend_t *next; | 497 | xfs_ioend_t *next; |
| @@ -506,6 +512,18 @@ xfs_submit_ioend( | |||
| 506 | next = ioend->io_list; | 512 | next = ioend->io_list; |
| 507 | bio = NULL; | 513 | bio = NULL; |
| 508 | 514 | ||
| 515 | /* | ||
| 516 | * If we are failing the IO now, just mark the ioend with an | ||
| 517 | * error and finish it. This will run IO completion immediately | ||
| 518 | * as there is only one reference to the ioend at this point in | ||
| 519 | * time. | ||
| 520 | */ | ||
| 521 | if (fail) { | ||
| 522 | ioend->io_error = -fail; | ||
| 523 | xfs_finish_ioend(ioend); | ||
| 524 | continue; | ||
| 525 | } | ||
| 526 | |||
| 509 | for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) { | 527 | for (bh = ioend->io_buffer_head; bh; bh = bh->b_private) { |
| 510 | 528 | ||
| 511 | if (!bio) { | 529 | if (!bio) { |
| @@ -1060,7 +1078,18 @@ xfs_vm_writepage( | |||
| 1060 | 1078 | ||
| 1061 | xfs_start_page_writeback(page, 1, count); | 1079 | xfs_start_page_writeback(page, 1, count); |
| 1062 | 1080 | ||
| 1063 | if (ioend && imap_valid) { | 1081 | /* if there is no IO to be submitted for this page, we are done */ |
| 1082 | if (!ioend) | ||
| 1083 | return 0; | ||
| 1084 | |||
| 1085 | ASSERT(iohead); | ||
| 1086 | |||
| 1087 | /* | ||
| 1088 | * Any errors from this point onwards need tobe reported through the IO | ||
| 1089 | * completion path as we have marked the initial page as under writeback | ||
| 1090 | * and unlocked it. | ||
| 1091 | */ | ||
| 1092 | if (imap_valid) { | ||
| 1064 | xfs_off_t end_index; | 1093 | xfs_off_t end_index; |
| 1065 | 1094 | ||
| 1066 | end_index = imap.br_startoff + imap.br_blockcount; | 1095 | end_index = imap.br_startoff + imap.br_blockcount; |
| @@ -1079,20 +1108,15 @@ xfs_vm_writepage( | |||
| 1079 | wbc, end_index); | 1108 | wbc, end_index); |
| 1080 | } | 1109 | } |
| 1081 | 1110 | ||
| 1082 | if (iohead) { | ||
| 1083 | /* | ||
| 1084 | * Reserve log space if we might write beyond the on-disk | ||
| 1085 | * inode size. | ||
| 1086 | */ | ||
| 1087 | if (ioend->io_type != XFS_IO_UNWRITTEN && | ||
| 1088 | xfs_ioend_is_append(ioend)) { | ||
| 1089 | err = xfs_setfilesize_trans_alloc(ioend); | ||
| 1090 | if (err) | ||
| 1091 | goto error; | ||
| 1092 | } | ||
| 1093 | 1111 | ||
| 1094 | xfs_submit_ioend(wbc, iohead); | 1112 | /* |
| 1095 | } | 1113 | * Reserve log space if we might write beyond the on-disk inode size. |
| 1114 | */ | ||
| 1115 | err = 0; | ||
| 1116 | if (ioend->io_type != XFS_IO_UNWRITTEN && xfs_ioend_is_append(ioend)) | ||
| 1117 | err = xfs_setfilesize_trans_alloc(ioend); | ||
| 1118 | |||
| 1119 | xfs_submit_ioend(wbc, iohead, err); | ||
| 1096 | 1120 | ||
| 1097 | return 0; | 1121 | return 0; |
| 1098 | 1122 | ||
diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index d330111ca738..70eec1829776 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c | |||
| @@ -1291,6 +1291,7 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, | |||
| 1291 | leaf2 = blk2->bp->b_addr; | 1291 | leaf2 = blk2->bp->b_addr; |
| 1292 | ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); | 1292 | ASSERT(leaf1->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); |
| 1293 | ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); | 1293 | ASSERT(leaf2->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC)); |
| 1294 | ASSERT(leaf2->hdr.count == 0); | ||
| 1294 | args = state->args; | 1295 | args = state->args; |
| 1295 | 1296 | ||
| 1296 | trace_xfs_attr_leaf_rebalance(args); | 1297 | trace_xfs_attr_leaf_rebalance(args); |
| @@ -1361,6 +1362,7 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, | |||
| 1361 | * I assert that since all callers pass in an empty | 1362 | * I assert that since all callers pass in an empty |
| 1362 | * second buffer, this code should never execute. | 1363 | * second buffer, this code should never execute. |
| 1363 | */ | 1364 | */ |
| 1365 | ASSERT(0); | ||
| 1364 | 1366 | ||
| 1365 | /* | 1367 | /* |
| 1366 | * Figure the total bytes to be added to the destination leaf. | 1368 | * Figure the total bytes to be added to the destination leaf. |
| @@ -1422,10 +1424,24 @@ xfs_attr_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1, | |||
| 1422 | args->index2 = 0; | 1424 | args->index2 = 0; |
| 1423 | args->blkno2 = blk2->blkno; | 1425 | args->blkno2 = blk2->blkno; |
| 1424 | } else { | 1426 | } else { |
| 1427 | /* | ||
| 1428 | * On a double leaf split, the original attr location | ||
| 1429 | * is already stored in blkno2/index2, so don't | ||
| 1430 | * overwrite it overwise we corrupt the tree. | ||
| 1431 | */ | ||
| 1425 | blk2->index = blk1->index | 1432 | blk2->index = blk1->index |
| 1426 | - be16_to_cpu(leaf1->hdr.count); | 1433 | - be16_to_cpu(leaf1->hdr.count); |
| 1427 | args->index = args->index2 = blk2->index; | 1434 | args->index = blk2->index; |
| 1428 | args->blkno = args->blkno2 = blk2->blkno; | 1435 | args->blkno = blk2->blkno; |
| 1436 | if (!state->extravalid) { | ||
| 1437 | /* | ||
| 1438 | * set the new attr location to match the old | ||
| 1439 | * one and let the higher level split code | ||
| 1440 | * decide where in the leaf to place it. | ||
| 1441 | */ | ||
| 1442 | args->index2 = blk2->index; | ||
| 1443 | args->blkno2 = blk2->blkno; | ||
| 1444 | } | ||
| 1429 | } | 1445 | } |
| 1430 | } else { | 1446 | } else { |
| 1431 | ASSERT(state->inleaf == 1); | 1447 | ASSERT(state->inleaf == 1); |
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 933b7930b863..4b0b8dd1b7b0 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c | |||
| @@ -1197,9 +1197,14 @@ xfs_buf_bio_end_io( | |||
| 1197 | { | 1197 | { |
| 1198 | xfs_buf_t *bp = (xfs_buf_t *)bio->bi_private; | 1198 | xfs_buf_t *bp = (xfs_buf_t *)bio->bi_private; |
| 1199 | 1199 | ||
| 1200 | xfs_buf_ioerror(bp, -error); | 1200 | /* |
| 1201 | * don't overwrite existing errors - otherwise we can lose errors on | ||
| 1202 | * buffers that require multiple bios to complete. | ||
| 1203 | */ | ||
| 1204 | if (!bp->b_error) | ||
| 1205 | xfs_buf_ioerror(bp, -error); | ||
| 1201 | 1206 | ||
| 1202 | if (!error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ)) | 1207 | if (!bp->b_error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ)) |
| 1203 | invalidate_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); | 1208 | invalidate_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); |
| 1204 | 1209 | ||
| 1205 | _xfs_buf_ioend(bp, 1); | 1210 | _xfs_buf_ioend(bp, 1); |
| @@ -1279,6 +1284,11 @@ next_chunk: | |||
| 1279 | if (size) | 1284 | if (size) |
| 1280 | goto next_chunk; | 1285 | goto next_chunk; |
| 1281 | } else { | 1286 | } else { |
| 1287 | /* | ||
| 1288 | * This is guaranteed not to be the last io reference count | ||
| 1289 | * because the caller (xfs_buf_iorequest) holds a count itself. | ||
| 1290 | */ | ||
| 1291 | atomic_dec(&bp->b_io_remaining); | ||
| 1282 | xfs_buf_ioerror(bp, EIO); | 1292 | xfs_buf_ioerror(bp, EIO); |
| 1283 | bio_put(bio); | 1293 | bio_put(bio); |
| 1284 | } | 1294 | } |
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index af1cbaf535ed..c5c35e629426 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h | |||
| @@ -210,6 +210,7 @@ | |||
| 210 | {0x1002, 0x6798, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 210 | {0x1002, 0x6798, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| 211 | {0x1002, 0x6799, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 211 | {0x1002, 0x6799, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| 212 | {0x1002, 0x679A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 212 | {0x1002, 0x679A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| 213 | {0x1002, 0x679B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | ||
| 213 | {0x1002, 0x679E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 214 | {0x1002, 0x679E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| 214 | {0x1002, 0x679F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ | 215 | {0x1002, 0x679F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI|RADEON_NEW_MEMMAP}, \ |
| 215 | {0x1002, 0x6800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 216 | {0x1002, 0x6800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
diff --git a/include/linux/bug.h b/include/linux/bug.h index aaac4bba6f5c..b1cf40de847e 100644 --- a/include/linux/bug.h +++ b/include/linux/bug.h | |||
| @@ -15,6 +15,7 @@ struct pt_regs; | |||
| 15 | #define BUILD_BUG_ON_NOT_POWER_OF_2(n) | 15 | #define BUILD_BUG_ON_NOT_POWER_OF_2(n) |
| 16 | #define BUILD_BUG_ON_ZERO(e) (0) | 16 | #define BUILD_BUG_ON_ZERO(e) (0) |
| 17 | #define BUILD_BUG_ON_NULL(e) ((void*)0) | 17 | #define BUILD_BUG_ON_NULL(e) ((void*)0) |
| 18 | #define BUILD_BUG_ON_INVALID(e) (0) | ||
| 18 | #define BUILD_BUG_ON(condition) | 19 | #define BUILD_BUG_ON(condition) |
| 19 | #define BUILD_BUG() (0) | 20 | #define BUILD_BUG() (0) |
| 20 | #else /* __CHECKER__ */ | 21 | #else /* __CHECKER__ */ |
diff --git a/include/linux/dma-debug.h b/include/linux/dma-debug.h index 171ad8aedc83..fc0e34ce038f 100644 --- a/include/linux/dma-debug.h +++ b/include/linux/dma-debug.h | |||
| @@ -39,6 +39,8 @@ extern void debug_dma_map_page(struct device *dev, struct page *page, | |||
| 39 | int direction, dma_addr_t dma_addr, | 39 | int direction, dma_addr_t dma_addr, |
| 40 | bool map_single); | 40 | bool map_single); |
| 41 | 41 | ||
| 42 | extern void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr); | ||
| 43 | |||
| 42 | extern void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, | 44 | extern void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, |
| 43 | size_t size, int direction, bool map_single); | 45 | size_t size, int direction, bool map_single); |
| 44 | 46 | ||
| @@ -105,6 +107,11 @@ static inline void debug_dma_map_page(struct device *dev, struct page *page, | |||
| 105 | { | 107 | { |
| 106 | } | 108 | } |
| 107 | 109 | ||
| 110 | static inline void debug_dma_mapping_error(struct device *dev, | ||
| 111 | dma_addr_t dma_addr) | ||
| 112 | { | ||
| 113 | } | ||
| 114 | |||
| 108 | static inline void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, | 115 | static inline void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, |
| 109 | size_t size, int direction, | 116 | size_t size, int direction, |
| 110 | bool map_single) | 117 | bool map_single) |
diff --git a/include/linux/fs.h b/include/linux/fs.h index b33cfc97b9ca..75fe9a134803 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -462,8 +462,6 @@ struct block_device { | |||
| 462 | int bd_fsfreeze_count; | 462 | int bd_fsfreeze_count; |
| 463 | /* Mutex for freeze */ | 463 | /* Mutex for freeze */ |
| 464 | struct mutex bd_fsfreeze_mutex; | 464 | struct mutex bd_fsfreeze_mutex; |
| 465 | /* A semaphore that prevents I/O while block size is being changed */ | ||
| 466 | struct percpu_rw_semaphore bd_block_size_semaphore; | ||
| 467 | }; | 465 | }; |
| 468 | 466 | ||
| 469 | /* | 467 | /* |
| @@ -2049,7 +2047,6 @@ extern void unregister_blkdev(unsigned int, const char *); | |||
| 2049 | extern struct block_device *bdget(dev_t); | 2047 | extern struct block_device *bdget(dev_t); |
| 2050 | extern struct block_device *bdgrab(struct block_device *bdev); | 2048 | extern struct block_device *bdgrab(struct block_device *bdev); |
| 2051 | extern void bd_set_size(struct block_device *, loff_t size); | 2049 | extern void bd_set_size(struct block_device *, loff_t size); |
| 2052 | extern sector_t blkdev_max_block(struct block_device *bdev); | ||
| 2053 | extern void bd_forget(struct inode *inode); | 2050 | extern void bd_forget(struct inode *inode); |
| 2054 | extern void bdput(struct block_device *); | 2051 | extern void bdput(struct block_device *); |
| 2055 | extern void invalidate_bdev(struct block_device *); | 2052 | extern void invalidate_bdev(struct block_device *); |
| @@ -2379,8 +2376,6 @@ extern int generic_segment_checks(const struct iovec *iov, | |||
| 2379 | unsigned long *nr_segs, size_t *count, int access_flags); | 2376 | unsigned long *nr_segs, size_t *count, int access_flags); |
| 2380 | 2377 | ||
| 2381 | /* fs/block_dev.c */ | 2378 | /* fs/block_dev.c */ |
| 2382 | extern ssize_t blkdev_aio_read(struct kiocb *iocb, const struct iovec *iov, | ||
| 2383 | unsigned long nr_segs, loff_t pos); | ||
| 2384 | extern ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, | 2379 | extern ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, |
| 2385 | unsigned long nr_segs, loff_t pos); | 2380 | unsigned long nr_segs, loff_t pos); |
| 2386 | extern int blkdev_fsync(struct file *filp, loff_t start, loff_t end, | 2381 | extern int blkdev_fsync(struct file *filp, loff_t start, loff_t end, |
diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 02c1c9710be0..d0a79678f169 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h | |||
| @@ -31,6 +31,7 @@ struct vm_area_struct; | |||
| 31 | #define ___GFP_THISNODE 0x40000u | 31 | #define ___GFP_THISNODE 0x40000u |
| 32 | #define ___GFP_RECLAIMABLE 0x80000u | 32 | #define ___GFP_RECLAIMABLE 0x80000u |
| 33 | #define ___GFP_NOTRACK 0x200000u | 33 | #define ___GFP_NOTRACK 0x200000u |
| 34 | #define ___GFP_NO_KSWAPD 0x400000u | ||
| 34 | #define ___GFP_OTHER_NODE 0x800000u | 35 | #define ___GFP_OTHER_NODE 0x800000u |
| 35 | #define ___GFP_WRITE 0x1000000u | 36 | #define ___GFP_WRITE 0x1000000u |
| 36 | 37 | ||
| @@ -85,6 +86,7 @@ struct vm_area_struct; | |||
| 85 | #define __GFP_RECLAIMABLE ((__force gfp_t)___GFP_RECLAIMABLE) /* Page is reclaimable */ | 86 | #define __GFP_RECLAIMABLE ((__force gfp_t)___GFP_RECLAIMABLE) /* Page is reclaimable */ |
| 86 | #define __GFP_NOTRACK ((__force gfp_t)___GFP_NOTRACK) /* Don't track with kmemcheck */ | 87 | #define __GFP_NOTRACK ((__force gfp_t)___GFP_NOTRACK) /* Don't track with kmemcheck */ |
| 87 | 88 | ||
| 89 | #define __GFP_NO_KSWAPD ((__force gfp_t)___GFP_NO_KSWAPD) | ||
| 88 | #define __GFP_OTHER_NODE ((__force gfp_t)___GFP_OTHER_NODE) /* On behalf of other node */ | 90 | #define __GFP_OTHER_NODE ((__force gfp_t)___GFP_OTHER_NODE) /* On behalf of other node */ |
| 89 | #define __GFP_WRITE ((__force gfp_t)___GFP_WRITE) /* Allocator intends to dirty page */ | 91 | #define __GFP_WRITE ((__force gfp_t)___GFP_WRITE) /* Allocator intends to dirty page */ |
| 90 | 92 | ||
| @@ -114,7 +116,8 @@ struct vm_area_struct; | |||
| 114 | __GFP_MOVABLE) | 116 | __GFP_MOVABLE) |
| 115 | #define GFP_IOFS (__GFP_IO | __GFP_FS) | 117 | #define GFP_IOFS (__GFP_IO | __GFP_FS) |
| 116 | #define GFP_TRANSHUGE (GFP_HIGHUSER_MOVABLE | __GFP_COMP | \ | 118 | #define GFP_TRANSHUGE (GFP_HIGHUSER_MOVABLE | __GFP_COMP | \ |
| 117 | __GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN) | 119 | __GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN | \ |
| 120 | __GFP_NO_KSWAPD) | ||
| 118 | 121 | ||
| 119 | #ifdef CONFIG_NUMA | 122 | #ifdef CONFIG_NUMA |
| 120 | #define GFP_THISNODE (__GFP_THISNODE | __GFP_NOWARN | __GFP_NORETRY) | 123 | #define GFP_THISNODE (__GFP_THISNODE | __GFP_NOWARN | __GFP_NORETRY) |
diff --git a/include/linux/hw_breakpoint.h b/include/linux/hw_breakpoint.h index 6ae9c631a1be..0464c85e63fd 100644 --- a/include/linux/hw_breakpoint.h +++ b/include/linux/hw_breakpoint.h | |||
| @@ -1,35 +1,8 @@ | |||
| 1 | #ifndef _LINUX_HW_BREAKPOINT_H | 1 | #ifndef _LINUX_HW_BREAKPOINT_H |
| 2 | #define _LINUX_HW_BREAKPOINT_H | 2 | #define _LINUX_HW_BREAKPOINT_H |
| 3 | 3 | ||
| 4 | enum { | ||
| 5 | HW_BREAKPOINT_LEN_1 = 1, | ||
| 6 | HW_BREAKPOINT_LEN_2 = 2, | ||
| 7 | HW_BREAKPOINT_LEN_4 = 4, | ||
| 8 | HW_BREAKPOINT_LEN_8 = 8, | ||
| 9 | }; | ||
| 10 | |||
| 11 | enum { | ||
| 12 | HW_BREAKPOINT_EMPTY = 0, | ||
| 13 | HW_BREAKPOINT_R = 1, | ||
| 14 | HW_BREAKPOINT_W = 2, | ||
| 15 | HW_BREAKPOINT_RW = HW_BREAKPOINT_R | HW_BREAKPOINT_W, | ||
| 16 | HW_BREAKPOINT_X = 4, | ||
| 17 | HW_BREAKPOINT_INVALID = HW_BREAKPOINT_RW | HW_BREAKPOINT_X, | ||
| 18 | }; | ||
| 19 | |||
| 20 | enum bp_type_idx { | ||
| 21 | TYPE_INST = 0, | ||
| 22 | #ifdef CONFIG_HAVE_MIXED_BREAKPOINTS_REGS | ||
| 23 | TYPE_DATA = 0, | ||
| 24 | #else | ||
| 25 | TYPE_DATA = 1, | ||
| 26 | #endif | ||
| 27 | TYPE_MAX | ||
| 28 | }; | ||
| 29 | |||
| 30 | #ifdef __KERNEL__ | ||
| 31 | |||
| 32 | #include <linux/perf_event.h> | 4 | #include <linux/perf_event.h> |
| 5 | #include <uapi/linux/hw_breakpoint.h> | ||
| 33 | 6 | ||
| 34 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | 7 | #ifdef CONFIG_HAVE_HW_BREAKPOINT |
| 35 | 8 | ||
| @@ -151,6 +124,4 @@ static inline struct arch_hw_breakpoint *counter_arch_bp(struct perf_event *bp) | |||
| 151 | } | 124 | } |
| 152 | 125 | ||
| 153 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ | 126 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
| 154 | #endif /* __KERNEL__ */ | ||
| 155 | |||
| 156 | #endif /* _LINUX_HW_BREAKPOINT_H */ | 127 | #endif /* _LINUX_HW_BREAKPOINT_H */ |
diff --git a/include/linux/i2c-omap.h b/include/linux/i2c-omap.h index df804ba73e0b..92a0dc75bc74 100644 --- a/include/linux/i2c-omap.h +++ b/include/linux/i2c-omap.h | |||
| @@ -34,6 +34,7 @@ struct omap_i2c_bus_platform_data { | |||
| 34 | u32 clkrate; | 34 | u32 clkrate; |
| 35 | u32 rev; | 35 | u32 rev; |
| 36 | u32 flags; | 36 | u32 flags; |
| 37 | void (*set_mpu_wkup_lat)(struct device *dev, long set); | ||
| 37 | }; | 38 | }; |
| 38 | 39 | ||
| 39 | #endif | 40 | #endif |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index a123b13b70fd..7d8dfc7392f1 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -701,6 +701,13 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { } | |||
| 701 | #define COMPACTION_BUILD 0 | 701 | #define COMPACTION_BUILD 0 |
| 702 | #endif | 702 | #endif |
| 703 | 703 | ||
| 704 | /* This helps us to avoid #ifdef CONFIG_SYMBOL_PREFIX */ | ||
| 705 | #ifdef CONFIG_SYMBOL_PREFIX | ||
| 706 | #define SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX | ||
| 707 | #else | ||
| 708 | #define SYMBOL_PREFIX "" | ||
| 709 | #endif | ||
| 710 | |||
| 704 | /* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */ | 711 | /* Rebuild everything on CONFIG_FTRACE_MCOUNT_RECORD */ |
| 705 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD | 712 | #ifdef CONFIG_FTRACE_MCOUNT_RECORD |
| 706 | # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD | 713 | # define REBUILD_DUE_TO_FTRACE_MCOUNT_RECORD |
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index e5ccb9ddd90e..dbd212723b74 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h | |||
| @@ -82,16 +82,6 @@ static inline void mpol_cond_put(struct mempolicy *pol) | |||
| 82 | __mpol_put(pol); | 82 | __mpol_put(pol); |
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | extern struct mempolicy *__mpol_cond_copy(struct mempolicy *tompol, | ||
| 86 | struct mempolicy *frompol); | ||
| 87 | static inline struct mempolicy *mpol_cond_copy(struct mempolicy *tompol, | ||
| 88 | struct mempolicy *frompol) | ||
| 89 | { | ||
| 90 | if (!frompol) | ||
| 91 | return frompol; | ||
| 92 | return __mpol_cond_copy(tompol, frompol); | ||
| 93 | } | ||
| 94 | |||
| 95 | extern struct mempolicy *__mpol_dup(struct mempolicy *pol); | 85 | extern struct mempolicy *__mpol_dup(struct mempolicy *pol); |
| 96 | static inline struct mempolicy *mpol_dup(struct mempolicy *pol) | 86 | static inline struct mempolicy *mpol_dup(struct mempolicy *pol) |
| 97 | { | 87 | { |
| @@ -215,12 +205,6 @@ static inline void mpol_cond_put(struct mempolicy *pol) | |||
| 215 | { | 205 | { |
| 216 | } | 206 | } |
| 217 | 207 | ||
| 218 | static inline struct mempolicy *mpol_cond_copy(struct mempolicy *to, | ||
| 219 | struct mempolicy *from) | ||
| 220 | { | ||
| 221 | return from; | ||
| 222 | } | ||
| 223 | |||
| 224 | static inline void mpol_get(struct mempolicy *pol) | 208 | static inline void mpol_get(struct mempolicy *pol) |
| 225 | { | 209 | { |
| 226 | } | 210 | } |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index f8eda0276f03..a848ffc327f4 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -1488,6 +1488,9 @@ struct napi_gro_cb { | |||
| 1488 | 1488 | ||
| 1489 | /* Used in ipv6_gro_receive() */ | 1489 | /* Used in ipv6_gro_receive() */ |
| 1490 | int proto; | 1490 | int proto; |
| 1491 | |||
| 1492 | /* used in skb_gro_receive() slow path */ | ||
| 1493 | struct sk_buff *last; | ||
| 1491 | }; | 1494 | }; |
| 1492 | 1495 | ||
| 1493 | #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb) | 1496 | #define NAPI_GRO_CB(skb) ((struct napi_gro_cb *)(skb)->cb) |
diff --git a/include/linux/of_address.h b/include/linux/of_address.h index e20e3af68fb6..0506eb53519b 100644 --- a/include/linux/of_address.h +++ b/include/linux/of_address.h | |||
| @@ -42,10 +42,12 @@ static inline struct device_node *of_find_matching_node_by_address( | |||
| 42 | { | 42 | { |
| 43 | return NULL; | 43 | return NULL; |
| 44 | } | 44 | } |
| 45 | #ifndef of_iomap | ||
| 45 | static inline void __iomem *of_iomap(struct device_node *device, int index) | 46 | static inline void __iomem *of_iomap(struct device_node *device, int index) |
| 46 | { | 47 | { |
| 47 | return NULL; | 48 | return NULL; |
| 48 | } | 49 | } |
| 50 | #endif | ||
| 49 | static inline const __be32 *of_get_address(struct device_node *dev, int index, | 51 | static inline const __be32 *of_get_address(struct device_node *dev, int index, |
| 50 | u64 *size, unsigned int *flags) | 52 | u64 *size, unsigned int *flags) |
| 51 | { | 53 | { |
diff --git a/include/linux/omap-iommu.h b/include/linux/omap-iommu.h new file mode 100644 index 000000000000..cac78de09c07 --- /dev/null +++ b/include/linux/omap-iommu.h | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | /* | ||
| 2 | * omap iommu: simple virtual address space management | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2009 Nokia Corporation | ||
| 5 | * | ||
| 6 | * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef _INTEL_IOMMU_H_ | ||
| 14 | #define _INTEL_IOMMU_H_ | ||
| 15 | |||
| 16 | struct iovm_struct { | ||
| 17 | struct omap_iommu *iommu; /* iommu object which this belongs to */ | ||
| 18 | u32 da_start; /* area definition */ | ||
| 19 | u32 da_end; | ||
| 20 | u32 flags; /* IOVMF_: see below */ | ||
| 21 | struct list_head list; /* linked in ascending order */ | ||
| 22 | const struct sg_table *sgt; /* keep 'page' <-> 'da' mapping */ | ||
| 23 | void *va; /* mpu side mapped address */ | ||
| 24 | }; | ||
| 25 | |||
| 26 | #define MMU_RAM_ENDIAN_SHIFT 9 | ||
| 27 | #define MMU_RAM_ENDIAN_LITTLE (0 << MMU_RAM_ENDIAN_SHIFT) | ||
| 28 | #define MMU_RAM_ELSZ_8 (0 << MMU_RAM_ELSZ_SHIFT) | ||
| 29 | #define IOVMF_ENDIAN_LITTLE MMU_RAM_ENDIAN_LITTLE | ||
| 30 | #define MMU_RAM_ELSZ_SHIFT 7 | ||
| 31 | #define IOVMF_ELSZ_8 MMU_RAM_ELSZ_8 | ||
| 32 | |||
| 33 | struct iommu_domain; | ||
| 34 | |||
| 35 | extern struct iovm_struct *omap_find_iovm_area(struct device *dev, u32 da); | ||
| 36 | extern u32 | ||
| 37 | omap_iommu_vmap(struct iommu_domain *domain, struct device *dev, u32 da, | ||
| 38 | const struct sg_table *sgt, u32 flags); | ||
| 39 | extern struct sg_table *omap_iommu_vunmap(struct iommu_domain *domain, | ||
| 40 | struct device *dev, u32 da); | ||
| 41 | extern u32 | ||
| 42 | omap_iommu_vmalloc(struct iommu_domain *domain, struct device *dev, | ||
| 43 | u32 da, size_t bytes, u32 flags); | ||
| 44 | extern void | ||
| 45 | omap_iommu_vfree(struct iommu_domain *domain, struct device *dev, | ||
| 46 | const u32 da); | ||
| 47 | extern void *omap_da_to_va(struct device *dev, u32 da); | ||
| 48 | |||
| 49 | extern void omap_iommu_save_ctx(struct device *dev); | ||
| 50 | extern void omap_iommu_restore_ctx(struct device *dev); | ||
| 51 | |||
| 52 | #endif | ||
diff --git a/include/linux/percpu-rwsem.h b/include/linux/percpu-rwsem.h index 250a4acddb2b..bd1e86071e57 100644 --- a/include/linux/percpu-rwsem.h +++ b/include/linux/percpu-rwsem.h | |||
| @@ -13,7 +13,7 @@ struct percpu_rw_semaphore { | |||
| 13 | }; | 13 | }; |
| 14 | 14 | ||
| 15 | #define light_mb() barrier() | 15 | #define light_mb() barrier() |
| 16 | #define heavy_mb() synchronize_sched() | 16 | #define heavy_mb() synchronize_sched_expedited() |
| 17 | 17 | ||
| 18 | static inline void percpu_down_read(struct percpu_rw_semaphore *p) | 18 | static inline void percpu_down_read(struct percpu_rw_semaphore *p) |
| 19 | { | 19 | { |
| @@ -51,7 +51,7 @@ static inline void percpu_down_write(struct percpu_rw_semaphore *p) | |||
| 51 | { | 51 | { |
| 52 | mutex_lock(&p->mtx); | 52 | mutex_lock(&p->mtx); |
| 53 | p->locked = true; | 53 | p->locked = true; |
| 54 | synchronize_sched(); /* make sure that all readers exit the rcu_read_lock_sched region */ | 54 | synchronize_sched_expedited(); /* make sure that all readers exit the rcu_read_lock_sched region */ |
| 55 | while (__percpu_count(p->counters)) | 55 | while (__percpu_count(p->counters)) |
| 56 | msleep(1); | 56 | msleep(1); |
| 57 | heavy_mb(); /* C, between read of p->counter and write to data, paired with B */ | 57 | heavy_mb(); /* C, between read of p->counter and write to data, paired with B */ |
diff --git a/include/linux/platform_data/iommu-omap.h b/include/linux/platform_data/iommu-omap.h new file mode 100644 index 000000000000..5b429c43a297 --- /dev/null +++ b/include/linux/platform_data/iommu-omap.h | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | /* | ||
| 2 | * omap iommu: main structures | ||
| 3 | * | ||
| 4 | * Copyright (C) 2008-2009 Nokia Corporation | ||
| 5 | * | ||
| 6 | * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com> | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or modify | ||
| 9 | * it under the terms of the GNU General Public License version 2 as | ||
| 10 | * published by the Free Software Foundation. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include <linux/platform_device.h> | ||
| 14 | |||
| 15 | #define MMU_REG_SIZE 256 | ||
| 16 | |||
| 17 | /** | ||
| 18 | * struct iommu_arch_data - omap iommu private data | ||
| 19 | * @name: name of the iommu device | ||
| 20 | * @iommu_dev: handle of the iommu device | ||
| 21 | * | ||
| 22 | * This is an omap iommu private data object, which binds an iommu user | ||
| 23 | * to its iommu device. This object should be placed at the iommu user's | ||
| 24 | * dev_archdata so generic IOMMU API can be used without having to | ||
| 25 | * utilize omap-specific plumbing anymore. | ||
| 26 | */ | ||
| 27 | struct omap_iommu_arch_data { | ||
| 28 | const char *name; | ||
| 29 | struct omap_iommu *iommu_dev; | ||
| 30 | }; | ||
| 31 | |||
| 32 | /** | ||
| 33 | * struct omap_mmu_dev_attr - OMAP mmu device attributes for omap_hwmod | ||
| 34 | * @da_start: device address where the va space starts. | ||
| 35 | * @da_end: device address where the va space ends. | ||
| 36 | * @nr_tlb_entries: number of entries supported by the translation | ||
| 37 | * look-aside buffer (TLB). | ||
| 38 | */ | ||
| 39 | struct omap_mmu_dev_attr { | ||
| 40 | u32 da_start; | ||
| 41 | u32 da_end; | ||
| 42 | int nr_tlb_entries; | ||
| 43 | }; | ||
| 44 | |||
| 45 | struct iommu_platform_data { | ||
| 46 | const char *name; | ||
| 47 | const char *reset_name; | ||
| 48 | int nr_tlb_entries; | ||
| 49 | u32 da_start; | ||
| 50 | u32 da_end; | ||
| 51 | |||
| 52 | int (*assert_reset)(struct platform_device *pdev, const char *name); | ||
| 53 | int (*deassert_reset)(struct platform_device *pdev, const char *name); | ||
| 54 | }; | ||
diff --git a/include/linux/spi/ads7846.h b/include/linux/spi/ads7846.h index c64de9dd7631..2f694f3846a9 100644 --- a/include/linux/spi/ads7846.h +++ b/include/linux/spi/ads7846.h | |||
| @@ -46,8 +46,9 @@ struct ads7846_platform_data { | |||
| 46 | u16 debounce_rep; /* additional consecutive good readings | 46 | u16 debounce_rep; /* additional consecutive good readings |
| 47 | * required after the first two */ | 47 | * required after the first two */ |
| 48 | int gpio_pendown; /* the GPIO used to decide the pendown | 48 | int gpio_pendown; /* the GPIO used to decide the pendown |
| 49 | * state if get_pendown_state == NULL | 49 | * state if get_pendown_state == NULL */ |
| 50 | */ | 50 | int gpio_pendown_debounce; /* platform specific debounce time for |
| 51 | * the gpio_pendown */ | ||
| 51 | int (*get_pendown_state)(void); | 52 | int (*get_pendown_state)(void); |
| 52 | int (*filter_init) (const struct ads7846_platform_data *pdata, | 53 | int (*filter_init) (const struct ads7846_platform_data *pdata, |
| 53 | void **filter_data); | 54 | void **filter_data); |
diff --git a/include/media/adv7604.h b/include/media/adv7604.h index 171b957db743..dc004bc926c9 100644 --- a/include/media/adv7604.h +++ b/include/media/adv7604.h | |||
| @@ -40,14 +40,6 @@ enum adv7604_op_ch_sel { | |||
| 40 | ADV7604_OP_CH_SEL_RBG = 5, | 40 | ADV7604_OP_CH_SEL_RBG = 5, |
| 41 | }; | 41 | }; |
| 42 | 42 | ||
| 43 | /* Primary mode (IO register 0x01, [3:0]) */ | ||
| 44 | enum adv7604_prim_mode { | ||
| 45 | ADV7604_PRIM_MODE_COMP = 1, | ||
| 46 | ADV7604_PRIM_MODE_RGB = 2, | ||
| 47 | ADV7604_PRIM_MODE_HDMI_COMP = 5, | ||
| 48 | ADV7604_PRIM_MODE_HDMI_GR = 6, | ||
| 49 | }; | ||
| 50 | |||
| 51 | /* Input Color Space (IO register 0x02, [7:4]) */ | 43 | /* Input Color Space (IO register 0x02, [7:4]) */ |
| 52 | enum adv7604_inp_color_space { | 44 | enum adv7604_inp_color_space { |
| 53 | ADV7604_INP_COLOR_SPACE_LIM_RGB = 0, | 45 | ADV7604_INP_COLOR_SPACE_LIM_RGB = 0, |
| @@ -103,9 +95,6 @@ struct adv7604_platform_data { | |||
| 103 | /* Bus rotation and reordering */ | 95 | /* Bus rotation and reordering */ |
| 104 | enum adv7604_op_ch_sel op_ch_sel; | 96 | enum adv7604_op_ch_sel op_ch_sel; |
| 105 | 97 | ||
| 106 | /* Primary mode */ | ||
| 107 | enum adv7604_prim_mode prim_mode; | ||
| 108 | |||
| 109 | /* Select output format */ | 98 | /* Select output format */ |
| 110 | enum adv7604_op_format_sel op_format_sel; | 99 | enum adv7604_op_format_sel op_format_sel; |
| 111 | 100 | ||
| @@ -142,6 +131,16 @@ struct adv7604_platform_data { | |||
| 142 | u8 i2c_vdp; | 131 | u8 i2c_vdp; |
| 143 | }; | 132 | }; |
| 144 | 133 | ||
| 134 | /* | ||
| 135 | * Mode of operation. | ||
| 136 | * This is used as the input argument of the s_routing video op. | ||
| 137 | */ | ||
| 138 | enum adv7604_mode { | ||
| 139 | ADV7604_MODE_COMP, | ||
| 140 | ADV7604_MODE_GR, | ||
| 141 | ADV7604_MODE_HDMI, | ||
| 142 | }; | ||
| 143 | |||
| 145 | #define V4L2_CID_ADV_RX_ANALOG_SAMPLING_PHASE (V4L2_CID_DV_CLASS_BASE + 0x1000) | 144 | #define V4L2_CID_ADV_RX_ANALOG_SAMPLING_PHASE (V4L2_CID_DV_CLASS_BASE + 0x1000) |
| 146 | #define V4L2_CID_ADV_RX_FREE_RUN_COLOR_MANUAL (V4L2_CID_DV_CLASS_BASE + 0x1001) | 145 | #define V4L2_CID_ADV_RX_FREE_RUN_COLOR_MANUAL (V4L2_CID_DV_CLASS_BASE + 0x1001) |
| 147 | #define V4L2_CID_ADV_RX_FREE_RUN_COLOR (V4L2_CID_DV_CLASS_BASE + 0x1002) | 146 | #define V4L2_CID_ADV_RX_FREE_RUN_COLOR (V4L2_CID_DV_CLASS_BASE + 0x1002) |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 6feeccd83dd7..4af45e33105d 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -525,6 +525,7 @@ static inline __u32 cookie_v6_init_sequence(struct sock *sk, | |||
| 525 | extern void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss, | 525 | extern void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss, |
| 526 | int nonagle); | 526 | int nonagle); |
| 527 | extern bool tcp_may_send_now(struct sock *sk); | 527 | extern bool tcp_may_send_now(struct sock *sk); |
| 528 | extern int __tcp_retransmit_skb(struct sock *, struct sk_buff *); | ||
| 528 | extern int tcp_retransmit_skb(struct sock *, struct sk_buff *); | 529 | extern int tcp_retransmit_skb(struct sock *, struct sk_buff *); |
| 529 | extern void tcp_retransmit_timer(struct sock *sk); | 530 | extern void tcp_retransmit_timer(struct sock *sk); |
| 530 | extern void tcp_xmit_retransmit_queue(struct sock *); | 531 | extern void tcp_xmit_retransmit_queue(struct sock *); |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 6f0ba01afe73..63445ede48bb 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
| @@ -1351,7 +1351,7 @@ struct xfrm6_tunnel { | |||
| 1351 | }; | 1351 | }; |
| 1352 | 1352 | ||
| 1353 | extern void xfrm_init(void); | 1353 | extern void xfrm_init(void); |
| 1354 | extern void xfrm4_init(int rt_hash_size); | 1354 | extern void xfrm4_init(void); |
| 1355 | extern int xfrm_state_init(struct net *net); | 1355 | extern int xfrm_state_init(struct net *net); |
| 1356 | extern void xfrm_state_fini(struct net *net); | 1356 | extern void xfrm_state_fini(struct net *net); |
| 1357 | extern void xfrm4_state_init(void); | 1357 | extern void xfrm4_state_init(void); |
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index 88fae8d20154..55367b04dc94 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h | |||
| @@ -135,6 +135,8 @@ struct scsi_device { | |||
| 135 | * because we did a bus reset. */ | 135 | * because we did a bus reset. */ |
| 136 | unsigned use_10_for_rw:1; /* first try 10-byte read / write */ | 136 | unsigned use_10_for_rw:1; /* first try 10-byte read / write */ |
| 137 | unsigned use_10_for_ms:1; /* first try 10-byte mode sense/select */ | 137 | unsigned use_10_for_ms:1; /* first try 10-byte mode sense/select */ |
| 138 | unsigned no_report_opcodes:1; /* no REPORT SUPPORTED OPERATION CODES */ | ||
| 139 | unsigned no_write_same:1; /* no WRITE SAME command */ | ||
| 138 | unsigned skip_ms_page_8:1; /* do not use MODE SENSE page 0x08 */ | 140 | unsigned skip_ms_page_8:1; /* do not use MODE SENSE page 0x08 */ |
| 139 | unsigned skip_ms_page_3f:1; /* do not use MODE SENSE page 0x3f */ | 141 | unsigned skip_ms_page_3f:1; /* do not use MODE SENSE page 0x3f */ |
| 140 | unsigned skip_vpd_pages:1; /* do not read VPD pages */ | 142 | unsigned skip_vpd_pages:1; /* do not read VPD pages */ |
| @@ -362,6 +364,8 @@ extern int scsi_test_unit_ready(struct scsi_device *sdev, int timeout, | |||
| 362 | int retries, struct scsi_sense_hdr *sshdr); | 364 | int retries, struct scsi_sense_hdr *sshdr); |
| 363 | extern int scsi_get_vpd_page(struct scsi_device *, u8 page, unsigned char *buf, | 365 | extern int scsi_get_vpd_page(struct scsi_device *, u8 page, unsigned char *buf, |
| 364 | int buf_len); | 366 | int buf_len); |
| 367 | extern int scsi_report_opcode(struct scsi_device *sdev, unsigned char *buffer, | ||
| 368 | unsigned int len, unsigned char opcode); | ||
| 365 | extern int scsi_device_set_state(struct scsi_device *sdev, | 369 | extern int scsi_device_set_state(struct scsi_device *sdev, |
| 366 | enum scsi_device_state state); | 370 | enum scsi_device_state state); |
| 367 | extern struct scsi_event *sdev_evt_alloc(enum scsi_device_event evt_type, | 371 | extern struct scsi_event *sdev_evt_alloc(enum scsi_device_event evt_type, |
diff --git a/include/trace/events/gfpflags.h b/include/trace/events/gfpflags.h index 9391706e9254..d6fd8e5b14b7 100644 --- a/include/trace/events/gfpflags.h +++ b/include/trace/events/gfpflags.h | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | {(unsigned long)__GFP_RECLAIMABLE, "GFP_RECLAIMABLE"}, \ | 36 | {(unsigned long)__GFP_RECLAIMABLE, "GFP_RECLAIMABLE"}, \ |
| 37 | {(unsigned long)__GFP_MOVABLE, "GFP_MOVABLE"}, \ | 37 | {(unsigned long)__GFP_MOVABLE, "GFP_MOVABLE"}, \ |
| 38 | {(unsigned long)__GFP_NOTRACK, "GFP_NOTRACK"}, \ | 38 | {(unsigned long)__GFP_NOTRACK, "GFP_NOTRACK"}, \ |
| 39 | {(unsigned long)__GFP_NO_KSWAPD, "GFP_NO_KSWAPD"}, \ | ||
| 39 | {(unsigned long)__GFP_OTHER_NODE, "GFP_OTHER_NODE"} \ | 40 | {(unsigned long)__GFP_OTHER_NODE, "GFP_OTHER_NODE"} \ |
| 40 | ) : "GFP_NOWAIT" | 41 | ) : "GFP_NOWAIT" |
| 41 | 42 | ||
diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index e194387ef784..19e765fbfef7 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild | |||
| @@ -415,3 +415,4 @@ header-y += wireless.h | |||
| 415 | header-y += x25.h | 415 | header-y += x25.h |
| 416 | header-y += xattr.h | 416 | header-y += xattr.h |
| 417 | header-y += xfrm.h | 417 | header-y += xfrm.h |
| 418 | header-y += hw_breakpoint.h | ||
diff --git a/include/uapi/linux/hw_breakpoint.h b/include/uapi/linux/hw_breakpoint.h new file mode 100644 index 000000000000..b04000a2296a --- /dev/null +++ b/include/uapi/linux/hw_breakpoint.h | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | #ifndef _UAPI_LINUX_HW_BREAKPOINT_H | ||
| 2 | #define _UAPI_LINUX_HW_BREAKPOINT_H | ||
| 3 | |||
| 4 | enum { | ||
| 5 | HW_BREAKPOINT_LEN_1 = 1, | ||
| 6 | HW_BREAKPOINT_LEN_2 = 2, | ||
| 7 | HW_BREAKPOINT_LEN_4 = 4, | ||
| 8 | HW_BREAKPOINT_LEN_8 = 8, | ||
| 9 | }; | ||
| 10 | |||
| 11 | enum { | ||
| 12 | HW_BREAKPOINT_EMPTY = 0, | ||
| 13 | HW_BREAKPOINT_R = 1, | ||
| 14 | HW_BREAKPOINT_W = 2, | ||
| 15 | HW_BREAKPOINT_RW = HW_BREAKPOINT_R | HW_BREAKPOINT_W, | ||
| 16 | HW_BREAKPOINT_X = 4, | ||
| 17 | HW_BREAKPOINT_INVALID = HW_BREAKPOINT_RW | HW_BREAKPOINT_X, | ||
| 18 | }; | ||
| 19 | |||
| 20 | enum bp_type_idx { | ||
| 21 | TYPE_INST = 0, | ||
| 22 | #ifdef CONFIG_HAVE_MIXED_BREAKPOINTS_REGS | ||
| 23 | TYPE_DATA = 0, | ||
| 24 | #else | ||
| 25 | TYPE_DATA = 1, | ||
| 26 | #endif | ||
| 27 | TYPE_MAX | ||
| 28 | }; | ||
| 29 | |||
| 30 | #endif /* _UAPI_LINUX_HW_BREAKPOINT_H */ | ||
diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index 9a7b487c6fe2..fe8a916507ed 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c | |||
| @@ -111,14 +111,16 @@ static unsigned int max_task_bp_pinned(int cpu, enum bp_type_idx type) | |||
| 111 | * Count the number of breakpoints of the same type and same task. | 111 | * Count the number of breakpoints of the same type and same task. |
| 112 | * The given event must be not on the list. | 112 | * The given event must be not on the list. |
| 113 | */ | 113 | */ |
| 114 | static int task_bp_pinned(struct perf_event *bp, enum bp_type_idx type) | 114 | static int task_bp_pinned(int cpu, struct perf_event *bp, enum bp_type_idx type) |
| 115 | { | 115 | { |
| 116 | struct task_struct *tsk = bp->hw.bp_target; | 116 | struct task_struct *tsk = bp->hw.bp_target; |
| 117 | struct perf_event *iter; | 117 | struct perf_event *iter; |
| 118 | int count = 0; | 118 | int count = 0; |
| 119 | 119 | ||
| 120 | list_for_each_entry(iter, &bp_task_head, hw.bp_list) { | 120 | list_for_each_entry(iter, &bp_task_head, hw.bp_list) { |
| 121 | if (iter->hw.bp_target == tsk && find_slot_idx(iter) == type) | 121 | if (iter->hw.bp_target == tsk && |
| 122 | find_slot_idx(iter) == type && | ||
| 123 | cpu == iter->cpu) | ||
| 122 | count += hw_breakpoint_weight(iter); | 124 | count += hw_breakpoint_weight(iter); |
| 123 | } | 125 | } |
| 124 | 126 | ||
| @@ -141,7 +143,7 @@ fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp, | |||
| 141 | if (!tsk) | 143 | if (!tsk) |
| 142 | slots->pinned += max_task_bp_pinned(cpu, type); | 144 | slots->pinned += max_task_bp_pinned(cpu, type); |
| 143 | else | 145 | else |
| 144 | slots->pinned += task_bp_pinned(bp, type); | 146 | slots->pinned += task_bp_pinned(cpu, bp, type); |
| 145 | slots->flexible = per_cpu(nr_bp_flexible[type], cpu); | 147 | slots->flexible = per_cpu(nr_bp_flexible[type], cpu); |
| 146 | 148 | ||
| 147 | return; | 149 | return; |
| @@ -154,7 +156,7 @@ fetch_bp_busy_slots(struct bp_busy_slots *slots, struct perf_event *bp, | |||
| 154 | if (!tsk) | 156 | if (!tsk) |
| 155 | nr += max_task_bp_pinned(cpu, type); | 157 | nr += max_task_bp_pinned(cpu, type); |
| 156 | else | 158 | else |
| 157 | nr += task_bp_pinned(bp, type); | 159 | nr += task_bp_pinned(cpu, bp, type); |
| 158 | 160 | ||
| 159 | if (nr > slots->pinned) | 161 | if (nr > slots->pinned) |
| 160 | slots->pinned = nr; | 162 | slots->pinned = nr; |
| @@ -188,7 +190,7 @@ static void toggle_bp_task_slot(struct perf_event *bp, int cpu, bool enable, | |||
| 188 | int old_idx = 0; | 190 | int old_idx = 0; |
| 189 | int idx = 0; | 191 | int idx = 0; |
| 190 | 192 | ||
| 191 | old_count = task_bp_pinned(bp, type); | 193 | old_count = task_bp_pinned(cpu, bp, type); |
| 192 | old_idx = old_count - 1; | 194 | old_idx = old_count - 1; |
| 193 | idx = old_idx + weight; | 195 | idx = old_idx + weight; |
| 194 | 196 | ||
diff --git a/kernel/futex.c b/kernel/futex.c index 20ef219bbe9b..19eb089ca003 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -843,6 +843,9 @@ static void wake_futex(struct futex_q *q) | |||
| 843 | { | 843 | { |
| 844 | struct task_struct *p = q->task; | 844 | struct task_struct *p = q->task; |
| 845 | 845 | ||
| 846 | if (WARN(q->pi_state || q->rt_waiter, "refusing to wake PI futex\n")) | ||
| 847 | return; | ||
| 848 | |||
| 846 | /* | 849 | /* |
| 847 | * We set q->lock_ptr = NULL _before_ we wake up the task. If | 850 | * We set q->lock_ptr = NULL _before_ we wake up the task. If |
| 848 | * a non-futex wake up happens on another CPU then the task | 851 | * a non-futex wake up happens on another CPU then the task |
| @@ -1078,6 +1081,10 @@ retry_private: | |||
| 1078 | 1081 | ||
| 1079 | plist_for_each_entry_safe(this, next, head, list) { | 1082 | plist_for_each_entry_safe(this, next, head, list) { |
| 1080 | if (match_futex (&this->key, &key1)) { | 1083 | if (match_futex (&this->key, &key1)) { |
| 1084 | if (this->pi_state || this->rt_waiter) { | ||
| 1085 | ret = -EINVAL; | ||
| 1086 | goto out_unlock; | ||
| 1087 | } | ||
| 1081 | wake_futex(this); | 1088 | wake_futex(this); |
| 1082 | if (++ret >= nr_wake) | 1089 | if (++ret >= nr_wake) |
| 1083 | break; | 1090 | break; |
| @@ -1090,6 +1097,10 @@ retry_private: | |||
| 1090 | op_ret = 0; | 1097 | op_ret = 0; |
| 1091 | plist_for_each_entry_safe(this, next, head, list) { | 1098 | plist_for_each_entry_safe(this, next, head, list) { |
| 1092 | if (match_futex (&this->key, &key2)) { | 1099 | if (match_futex (&this->key, &key2)) { |
| 1100 | if (this->pi_state || this->rt_waiter) { | ||
| 1101 | ret = -EINVAL; | ||
| 1102 | goto out_unlock; | ||
| 1103 | } | ||
| 1093 | wake_futex(this); | 1104 | wake_futex(this); |
| 1094 | if (++op_ret >= nr_wake2) | 1105 | if (++op_ret >= nr_wake2) |
| 1095 | break; | 1106 | break; |
| @@ -1098,6 +1109,7 @@ retry_private: | |||
| 1098 | ret += op_ret; | 1109 | ret += op_ret; |
| 1099 | } | 1110 | } |
| 1100 | 1111 | ||
| 1112 | out_unlock: | ||
| 1101 | double_unlock_hb(hb1, hb2); | 1113 | double_unlock_hb(hb1, hb2); |
| 1102 | out_put_keys: | 1114 | out_put_keys: |
| 1103 | put_futex_key(&key2); | 1115 | put_futex_key(&key2); |
| @@ -1387,9 +1399,13 @@ retry_private: | |||
| 1387 | /* | 1399 | /* |
| 1388 | * FUTEX_WAIT_REQEUE_PI and FUTEX_CMP_REQUEUE_PI should always | 1400 | * FUTEX_WAIT_REQEUE_PI and FUTEX_CMP_REQUEUE_PI should always |
| 1389 | * be paired with each other and no other futex ops. | 1401 | * be paired with each other and no other futex ops. |
| 1402 | * | ||
| 1403 | * We should never be requeueing a futex_q with a pi_state, | ||
| 1404 | * which is awaiting a futex_unlock_pi(). | ||
| 1390 | */ | 1405 | */ |
| 1391 | if ((requeue_pi && !this->rt_waiter) || | 1406 | if ((requeue_pi && !this->rt_waiter) || |
| 1392 | (!requeue_pi && this->rt_waiter)) { | 1407 | (!requeue_pi && this->rt_waiter) || |
| 1408 | this->pi_state) { | ||
| 1393 | ret = -EINVAL; | 1409 | ret = -EINVAL; |
| 1394 | break; | 1410 | break; |
| 1395 | } | 1411 | } |
diff --git a/kernel/modsign_pubkey.c b/kernel/modsign_pubkey.c index 4646eb2c3820..767e559dfb10 100644 --- a/kernel/modsign_pubkey.c +++ b/kernel/modsign_pubkey.c | |||
| @@ -21,10 +21,10 @@ struct key *modsign_keyring; | |||
| 21 | extern __initdata const u8 modsign_certificate_list[]; | 21 | extern __initdata const u8 modsign_certificate_list[]; |
| 22 | extern __initdata const u8 modsign_certificate_list_end[]; | 22 | extern __initdata const u8 modsign_certificate_list_end[]; |
| 23 | asm(".section .init.data,\"aw\"\n" | 23 | asm(".section .init.data,\"aw\"\n" |
| 24 | "modsign_certificate_list:\n" | 24 | SYMBOL_PREFIX "modsign_certificate_list:\n" |
| 25 | ".incbin \"signing_key.x509\"\n" | 25 | ".incbin \"signing_key.x509\"\n" |
| 26 | ".incbin \"extra_certificates\"\n" | 26 | ".incbin \"extra_certificates\"\n" |
| 27 | "modsign_certificate_list_end:" | 27 | SYMBOL_PREFIX "modsign_certificate_list_end:" |
| 28 | ); | 28 | ); |
| 29 | 29 | ||
| 30 | /* | 30 | /* |
diff --git a/kernel/module_signing.c b/kernel/module_signing.c index ea1b1df5dbb0..f2970bddc5ea 100644 --- a/kernel/module_signing.c +++ b/kernel/module_signing.c | |||
| @@ -27,13 +27,13 @@ | |||
| 27 | * - Information block | 27 | * - Information block |
| 28 | */ | 28 | */ |
| 29 | struct module_signature { | 29 | struct module_signature { |
| 30 | enum pkey_algo algo : 8; /* Public-key crypto algorithm */ | 30 | u8 algo; /* Public-key crypto algorithm [enum pkey_algo] */ |
| 31 | enum pkey_hash_algo hash : 8; /* Digest algorithm */ | 31 | u8 hash; /* Digest algorithm [enum pkey_hash_algo] */ |
| 32 | enum pkey_id_type id_type : 8; /* Key identifier type */ | 32 | u8 id_type; /* Key identifier type [enum pkey_id_type] */ |
| 33 | u8 signer_len; /* Length of signer's name */ | 33 | u8 signer_len; /* Length of signer's name */ |
| 34 | u8 key_id_len; /* Length of key identifier */ | 34 | u8 key_id_len; /* Length of key identifier */ |
| 35 | u8 __pad[3]; | 35 | u8 __pad[3]; |
| 36 | __be32 sig_len; /* Length of signature data */ | 36 | __be32 sig_len; /* Length of signature data */ |
| 37 | }; | 37 | }; |
| 38 | 38 | ||
| 39 | /* | 39 | /* |
diff --git a/kernel/sched/auto_group.c b/kernel/sched/auto_group.c index 0984a21076a3..15f60d01198b 100644 --- a/kernel/sched/auto_group.c +++ b/kernel/sched/auto_group.c | |||
| @@ -143,15 +143,11 @@ autogroup_move_group(struct task_struct *p, struct autogroup *ag) | |||
| 143 | 143 | ||
| 144 | p->signal->autogroup = autogroup_kref_get(ag); | 144 | p->signal->autogroup = autogroup_kref_get(ag); |
| 145 | 145 | ||
| 146 | if (!ACCESS_ONCE(sysctl_sched_autogroup_enabled)) | ||
| 147 | goto out; | ||
| 148 | |||
| 149 | t = p; | 146 | t = p; |
| 150 | do { | 147 | do { |
| 151 | sched_move_task(t); | 148 | sched_move_task(t); |
| 152 | } while_each_thread(p, t); | 149 | } while_each_thread(p, t); |
| 153 | 150 | ||
| 154 | out: | ||
| 155 | unlock_task_sighand(p, &flags); | 151 | unlock_task_sighand(p, &flags); |
| 156 | autogroup_kref_put(prev); | 152 | autogroup_kref_put(prev); |
| 157 | } | 153 | } |
diff --git a/kernel/sched/auto_group.h b/kernel/sched/auto_group.h index 8bd047142816..443232ebbb53 100644 --- a/kernel/sched/auto_group.h +++ b/kernel/sched/auto_group.h | |||
| @@ -4,11 +4,6 @@ | |||
| 4 | #include <linux/rwsem.h> | 4 | #include <linux/rwsem.h> |
| 5 | 5 | ||
| 6 | struct autogroup { | 6 | struct autogroup { |
| 7 | /* | ||
| 8 | * reference doesn't mean how many thread attach to this | ||
| 9 | * autogroup now. It just stands for the number of task | ||
| 10 | * could use this autogroup. | ||
| 11 | */ | ||
| 12 | struct kref kref; | 7 | struct kref kref; |
| 13 | struct task_group *tg; | 8 | struct task_group *tg; |
| 14 | struct rw_semaphore lock; | 9 | struct rw_semaphore lock; |
diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 9d4c8d5a1f53..c8c21be11ab4 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c | |||
| @@ -116,7 +116,7 @@ static unsigned long get_timestamp(int this_cpu) | |||
| 116 | return cpu_clock(this_cpu) >> 30LL; /* 2^30 ~= 10^9 */ | 116 | return cpu_clock(this_cpu) >> 30LL; /* 2^30 ~= 10^9 */ |
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | static unsigned long get_sample_period(void) | 119 | static u64 get_sample_period(void) |
| 120 | { | 120 | { |
| 121 | /* | 121 | /* |
| 122 | * convert watchdog_thresh from seconds to ns | 122 | * convert watchdog_thresh from seconds to ns |
| @@ -125,7 +125,7 @@ static unsigned long get_sample_period(void) | |||
| 125 | * and hard thresholds) to increment before the | 125 | * and hard thresholds) to increment before the |
| 126 | * hardlockup detector generates a warning | 126 | * hardlockup detector generates a warning |
| 127 | */ | 127 | */ |
| 128 | return get_softlockup_thresh() * (NSEC_PER_SEC / 5); | 128 | return get_softlockup_thresh() * ((u64)NSEC_PER_SEC / 5); |
| 129 | } | 129 | } |
| 130 | 130 | ||
| 131 | /* Commands for resetting the watchdog */ | 131 | /* Commands for resetting the watchdog */ |
| @@ -368,6 +368,9 @@ static void watchdog_disable(unsigned int cpu) | |||
| 368 | { | 368 | { |
| 369 | struct hrtimer *hrtimer = &__raw_get_cpu_var(watchdog_hrtimer); | 369 | struct hrtimer *hrtimer = &__raw_get_cpu_var(watchdog_hrtimer); |
| 370 | 370 | ||
| 371 | if (!watchdog_enabled) | ||
| 372 | return; | ||
| 373 | |||
| 371 | watchdog_set_prio(SCHED_NORMAL, 0); | 374 | watchdog_set_prio(SCHED_NORMAL, 0); |
| 372 | hrtimer_cancel(hrtimer); | 375 | hrtimer_cancel(hrtimer); |
| 373 | /* disable the perf event */ | 376 | /* disable the perf event */ |
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 042d221d33cc..1dae900df798 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -1361,8 +1361,19 @@ static void __queue_delayed_work(int cpu, struct workqueue_struct *wq, | |||
| 1361 | 1361 | ||
| 1362 | WARN_ON_ONCE(timer->function != delayed_work_timer_fn || | 1362 | WARN_ON_ONCE(timer->function != delayed_work_timer_fn || |
| 1363 | timer->data != (unsigned long)dwork); | 1363 | timer->data != (unsigned long)dwork); |
| 1364 | BUG_ON(timer_pending(timer)); | 1364 | WARN_ON_ONCE(timer_pending(timer)); |
| 1365 | BUG_ON(!list_empty(&work->entry)); | 1365 | WARN_ON_ONCE(!list_empty(&work->entry)); |
| 1366 | |||
| 1367 | /* | ||
| 1368 | * If @delay is 0, queue @dwork->work immediately. This is for | ||
| 1369 | * both optimization and correctness. The earliest @timer can | ||
| 1370 | * expire is on the closest next tick and delayed_work users depend | ||
| 1371 | * on that there's no such delay when @delay is 0. | ||
| 1372 | */ | ||
| 1373 | if (!delay) { | ||
| 1374 | __queue_work(cpu, wq, &dwork->work); | ||
| 1375 | return; | ||
| 1376 | } | ||
| 1366 | 1377 | ||
| 1367 | timer_stats_timer_set_start_info(&dwork->timer); | 1378 | timer_stats_timer_set_start_info(&dwork->timer); |
| 1368 | 1379 | ||
| @@ -1417,9 +1428,6 @@ bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, | |||
| 1417 | bool ret = false; | 1428 | bool ret = false; |
| 1418 | unsigned long flags; | 1429 | unsigned long flags; |
| 1419 | 1430 | ||
| 1420 | if (!delay) | ||
| 1421 | return queue_work_on(cpu, wq, &dwork->work); | ||
| 1422 | |||
| 1423 | /* read the comment in __queue_work() */ | 1431 | /* read the comment in __queue_work() */ |
| 1424 | local_irq_save(flags); | 1432 | local_irq_save(flags); |
| 1425 | 1433 | ||
| @@ -2407,8 +2415,10 @@ static int rescuer_thread(void *__wq) | |||
| 2407 | repeat: | 2415 | repeat: |
| 2408 | set_current_state(TASK_INTERRUPTIBLE); | 2416 | set_current_state(TASK_INTERRUPTIBLE); |
| 2409 | 2417 | ||
| 2410 | if (kthread_should_stop()) | 2418 | if (kthread_should_stop()) { |
| 2419 | __set_current_state(TASK_RUNNING); | ||
| 2411 | return 0; | 2420 | return 0; |
| 2421 | } | ||
| 2412 | 2422 | ||
| 2413 | /* | 2423 | /* |
| 2414 | * See whether any cpu is asking for help. Unbounded | 2424 | * See whether any cpu is asking for help. Unbounded |
diff --git a/lib/Makefile b/lib/Makefile index 821a16229111..a08b791200f3 100644 --- a/lib/Makefile +++ b/lib/Makefile | |||
| @@ -163,7 +163,7 @@ $(obj)/crc32table.h: $(obj)/gen_crc32table | |||
| 163 | # | 163 | # |
| 164 | obj-$(CONFIG_OID_REGISTRY) += oid_registry.o | 164 | obj-$(CONFIG_OID_REGISTRY) += oid_registry.o |
| 165 | 165 | ||
| 166 | $(obj)/oid_registry.c: $(obj)/oid_registry_data.c | 166 | $(obj)/oid_registry.o: $(obj)/oid_registry_data.c |
| 167 | 167 | ||
| 168 | $(obj)/oid_registry_data.c: $(srctree)/include/linux/oid_registry.h \ | 168 | $(obj)/oid_registry_data.c: $(srctree)/include/linux/oid_registry.h \ |
| 169 | $(src)/build_OID_registry | 169 | $(src)/build_OID_registry |
diff --git a/lib/asn1_decoder.c b/lib/asn1_decoder.c index de2c8b5a715b..5293d2433029 100644 --- a/lib/asn1_decoder.c +++ b/lib/asn1_decoder.c | |||
| @@ -91,7 +91,7 @@ next_tag: | |||
| 91 | 91 | ||
| 92 | /* Extract the length */ | 92 | /* Extract the length */ |
| 93 | len = data[dp++]; | 93 | len = data[dp++]; |
| 94 | if (len < 0x7f) { | 94 | if (len <= 0x7f) { |
| 95 | dp += len; | 95 | dp += len; |
| 96 | goto next_tag; | 96 | goto next_tag; |
| 97 | } | 97 | } |
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index d84beb994f36..5e396accd3d0 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
| @@ -45,6 +45,12 @@ enum { | |||
| 45 | dma_debug_coherent, | 45 | dma_debug_coherent, |
| 46 | }; | 46 | }; |
| 47 | 47 | ||
| 48 | enum map_err_types { | ||
| 49 | MAP_ERR_CHECK_NOT_APPLICABLE, | ||
| 50 | MAP_ERR_NOT_CHECKED, | ||
| 51 | MAP_ERR_CHECKED, | ||
| 52 | }; | ||
| 53 | |||
| 48 | #define DMA_DEBUG_STACKTRACE_ENTRIES 5 | 54 | #define DMA_DEBUG_STACKTRACE_ENTRIES 5 |
| 49 | 55 | ||
| 50 | struct dma_debug_entry { | 56 | struct dma_debug_entry { |
| @@ -57,6 +63,7 @@ struct dma_debug_entry { | |||
| 57 | int direction; | 63 | int direction; |
| 58 | int sg_call_ents; | 64 | int sg_call_ents; |
| 59 | int sg_mapped_ents; | 65 | int sg_mapped_ents; |
| 66 | enum map_err_types map_err_type; | ||
| 60 | #ifdef CONFIG_STACKTRACE | 67 | #ifdef CONFIG_STACKTRACE |
| 61 | struct stack_trace stacktrace; | 68 | struct stack_trace stacktrace; |
| 62 | unsigned long st_entries[DMA_DEBUG_STACKTRACE_ENTRIES]; | 69 | unsigned long st_entries[DMA_DEBUG_STACKTRACE_ENTRIES]; |
| @@ -114,6 +121,12 @@ static struct device_driver *current_driver __read_mostly; | |||
| 114 | 121 | ||
| 115 | static DEFINE_RWLOCK(driver_name_lock); | 122 | static DEFINE_RWLOCK(driver_name_lock); |
| 116 | 123 | ||
| 124 | static const char *const maperr2str[] = { | ||
| 125 | [MAP_ERR_CHECK_NOT_APPLICABLE] = "dma map error check not applicable", | ||
| 126 | [MAP_ERR_NOT_CHECKED] = "dma map error not checked", | ||
| 127 | [MAP_ERR_CHECKED] = "dma map error checked", | ||
| 128 | }; | ||
| 129 | |||
| 117 | static const char *type2name[4] = { "single", "page", | 130 | static const char *type2name[4] = { "single", "page", |
| 118 | "scather-gather", "coherent" }; | 131 | "scather-gather", "coherent" }; |
| 119 | 132 | ||
| @@ -376,11 +389,12 @@ void debug_dma_dump_mappings(struct device *dev) | |||
| 376 | list_for_each_entry(entry, &bucket->list, list) { | 389 | list_for_each_entry(entry, &bucket->list, list) { |
| 377 | if (!dev || dev == entry->dev) { | 390 | if (!dev || dev == entry->dev) { |
| 378 | dev_info(entry->dev, | 391 | dev_info(entry->dev, |
| 379 | "%s idx %d P=%Lx D=%Lx L=%Lx %s\n", | 392 | "%s idx %d P=%Lx D=%Lx L=%Lx %s %s\n", |
| 380 | type2name[entry->type], idx, | 393 | type2name[entry->type], idx, |
| 381 | (unsigned long long)entry->paddr, | 394 | (unsigned long long)entry->paddr, |
| 382 | entry->dev_addr, entry->size, | 395 | entry->dev_addr, entry->size, |
| 383 | dir2name[entry->direction]); | 396 | dir2name[entry->direction], |
| 397 | maperr2str[entry->map_err_type]); | ||
| 384 | } | 398 | } |
| 385 | } | 399 | } |
| 386 | 400 | ||
| @@ -844,16 +858,16 @@ static void check_unmap(struct dma_debug_entry *ref) | |||
| 844 | struct hash_bucket *bucket; | 858 | struct hash_bucket *bucket; |
| 845 | unsigned long flags; | 859 | unsigned long flags; |
| 846 | 860 | ||
| 847 | if (dma_mapping_error(ref->dev, ref->dev_addr)) { | ||
| 848 | err_printk(ref->dev, NULL, "DMA-API: device driver tries " | ||
| 849 | "to free an invalid DMA memory address\n"); | ||
| 850 | return; | ||
| 851 | } | ||
| 852 | |||
| 853 | bucket = get_hash_bucket(ref, &flags); | 861 | bucket = get_hash_bucket(ref, &flags); |
| 854 | entry = bucket_find_exact(bucket, ref); | 862 | entry = bucket_find_exact(bucket, ref); |
| 855 | 863 | ||
| 856 | if (!entry) { | 864 | if (!entry) { |
| 865 | if (dma_mapping_error(ref->dev, ref->dev_addr)) { | ||
| 866 | err_printk(ref->dev, NULL, | ||
| 867 | "DMA-API: device driver tries " | ||
| 868 | "to free an invalid DMA memory address\n"); | ||
| 869 | return; | ||
| 870 | } | ||
| 857 | err_printk(ref->dev, NULL, "DMA-API: device driver tries " | 871 | err_printk(ref->dev, NULL, "DMA-API: device driver tries " |
| 858 | "to free DMA memory it has not allocated " | 872 | "to free DMA memory it has not allocated " |
| 859 | "[device address=0x%016llx] [size=%llu bytes]\n", | 873 | "[device address=0x%016llx] [size=%llu bytes]\n", |
| @@ -910,6 +924,15 @@ static void check_unmap(struct dma_debug_entry *ref) | |||
| 910 | dir2name[ref->direction]); | 924 | dir2name[ref->direction]); |
| 911 | } | 925 | } |
| 912 | 926 | ||
| 927 | if (entry->map_err_type == MAP_ERR_NOT_CHECKED) { | ||
| 928 | err_printk(ref->dev, entry, | ||
| 929 | "DMA-API: device driver failed to check map error" | ||
| 930 | "[device address=0x%016llx] [size=%llu bytes] " | ||
| 931 | "[mapped as %s]", | ||
| 932 | ref->dev_addr, ref->size, | ||
| 933 | type2name[entry->type]); | ||
| 934 | } | ||
| 935 | |||
| 913 | hash_bucket_del(entry); | 936 | hash_bucket_del(entry); |
| 914 | dma_entry_free(entry); | 937 | dma_entry_free(entry); |
| 915 | 938 | ||
| @@ -1017,7 +1040,7 @@ void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, | |||
| 1017 | if (unlikely(global_disable)) | 1040 | if (unlikely(global_disable)) |
| 1018 | return; | 1041 | return; |
| 1019 | 1042 | ||
| 1020 | if (unlikely(dma_mapping_error(dev, dma_addr))) | 1043 | if (dma_mapping_error(dev, dma_addr)) |
| 1021 | return; | 1044 | return; |
| 1022 | 1045 | ||
| 1023 | entry = dma_entry_alloc(); | 1046 | entry = dma_entry_alloc(); |
| @@ -1030,6 +1053,7 @@ void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, | |||
| 1030 | entry->dev_addr = dma_addr; | 1053 | entry->dev_addr = dma_addr; |
| 1031 | entry->size = size; | 1054 | entry->size = size; |
| 1032 | entry->direction = direction; | 1055 | entry->direction = direction; |
| 1056 | entry->map_err_type = MAP_ERR_NOT_CHECKED; | ||
| 1033 | 1057 | ||
| 1034 | if (map_single) | 1058 | if (map_single) |
| 1035 | entry->type = dma_debug_single; | 1059 | entry->type = dma_debug_single; |
| @@ -1045,6 +1069,30 @@ void debug_dma_map_page(struct device *dev, struct page *page, size_t offset, | |||
| 1045 | } | 1069 | } |
| 1046 | EXPORT_SYMBOL(debug_dma_map_page); | 1070 | EXPORT_SYMBOL(debug_dma_map_page); |
| 1047 | 1071 | ||
| 1072 | void debug_dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | ||
| 1073 | { | ||
| 1074 | struct dma_debug_entry ref; | ||
| 1075 | struct dma_debug_entry *entry; | ||
| 1076 | struct hash_bucket *bucket; | ||
| 1077 | unsigned long flags; | ||
| 1078 | |||
| 1079 | if (unlikely(global_disable)) | ||
| 1080 | return; | ||
| 1081 | |||
| 1082 | ref.dev = dev; | ||
| 1083 | ref.dev_addr = dma_addr; | ||
| 1084 | bucket = get_hash_bucket(&ref, &flags); | ||
| 1085 | entry = bucket_find_exact(bucket, &ref); | ||
| 1086 | |||
| 1087 | if (!entry) | ||
| 1088 | goto out; | ||
| 1089 | |||
| 1090 | entry->map_err_type = MAP_ERR_CHECKED; | ||
| 1091 | out: | ||
| 1092 | put_hash_bucket(bucket, &flags); | ||
| 1093 | } | ||
| 1094 | EXPORT_SYMBOL(debug_dma_mapping_error); | ||
| 1095 | |||
| 1048 | void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, | 1096 | void debug_dma_unmap_page(struct device *dev, dma_addr_t addr, |
| 1049 | size_t size, int direction, bool map_single) | 1097 | size_t size, int direction, bool map_single) |
| 1050 | { | 1098 | { |
diff --git a/lib/mpi/longlong.h b/lib/mpi/longlong.h index 678ce4f1e124..095ab157a521 100644 --- a/lib/mpi/longlong.h +++ b/lib/mpi/longlong.h | |||
| @@ -641,7 +641,14 @@ do { \ | |||
| 641 | ************** MIPS ***************** | 641 | ************** MIPS ***************** |
| 642 | ***************************************/ | 642 | ***************************************/ |
| 643 | #if defined(__mips__) && W_TYPE_SIZE == 32 | 643 | #if defined(__mips__) && W_TYPE_SIZE == 32 |
| 644 | #if __GNUC__ > 2 || __GNUC_MINOR__ >= 7 | 644 | #if __GNUC__ >= 4 && __GNUC_MINOR__ >= 4 |
| 645 | #define umul_ppmm(w1, w0, u, v) \ | ||
| 646 | do { \ | ||
| 647 | UDItype __ll = (UDItype)(u) * (v); \ | ||
| 648 | w1 = __ll >> 32; \ | ||
| 649 | w0 = __ll; \ | ||
| 650 | } while (0) | ||
| 651 | #elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7 | ||
| 645 | #define umul_ppmm(w1, w0, u, v) \ | 652 | #define umul_ppmm(w1, w0, u, v) \ |
| 646 | __asm__ ("multu %2,%3" \ | 653 | __asm__ ("multu %2,%3" \ |
| 647 | : "=l" ((USItype)(w0)), \ | 654 | : "=l" ((USItype)(w0)), \ |
| @@ -666,7 +673,15 @@ do { \ | |||
| 666 | ************** MIPS/64 ************** | 673 | ************** MIPS/64 ************** |
| 667 | ***************************************/ | 674 | ***************************************/ |
| 668 | #if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64 | 675 | #if (defined(__mips) && __mips >= 3) && W_TYPE_SIZE == 64 |
| 669 | #if __GNUC__ > 2 || __GNUC_MINOR__ >= 7 | 676 | #if __GNUC__ >= 4 && __GNUC_MINOR__ >= 4 |
| 677 | #define umul_ppmm(w1, w0, u, v) \ | ||
| 678 | do { \ | ||
| 679 | typedef unsigned int __ll_UTItype __attribute__((mode(TI))); \ | ||
| 680 | __ll_UTItype __ll = (__ll_UTItype)(u) * (v); \ | ||
| 681 | w1 = __ll >> 64; \ | ||
| 682 | w0 = __ll; \ | ||
| 683 | } while (0) | ||
| 684 | #elif __GNUC__ > 2 || __GNUC_MINOR__ >= 7 | ||
| 670 | #define umul_ppmm(w1, w0, u, v) \ | 685 | #define umul_ppmm(w1, w0, u, v) \ |
| 671 | __asm__ ("dmultu %2,%3" \ | 686 | __asm__ ("dmultu %2,%3" \ |
| 672 | : "=l" ((UDItype)(w0)), \ | 687 | : "=l" ((UDItype)(w0)), \ |
diff --git a/mm/compaction.c b/mm/compaction.c index 9eef55838fca..694eaabaaebd 100644 --- a/mm/compaction.c +++ b/mm/compaction.c | |||
| @@ -713,7 +713,15 @@ static void isolate_freepages(struct zone *zone, | |||
| 713 | 713 | ||
| 714 | /* Found a block suitable for isolating free pages from */ | 714 | /* Found a block suitable for isolating free pages from */ |
| 715 | isolated = 0; | 715 | isolated = 0; |
| 716 | end_pfn = min(pfn + pageblock_nr_pages, zone_end_pfn); | 716 | |
| 717 | /* | ||
| 718 | * As pfn may not start aligned, pfn+pageblock_nr_page | ||
| 719 | * may cross a MAX_ORDER_NR_PAGES boundary and miss | ||
| 720 | * a pfn_valid check. Ensure isolate_freepages_block() | ||
| 721 | * only scans within a pageblock | ||
| 722 | */ | ||
| 723 | end_pfn = ALIGN(pfn + 1, pageblock_nr_pages); | ||
| 724 | end_pfn = min(end_pfn, zone_end_pfn); | ||
| 717 | isolated = isolate_freepages_block(cc, pfn, end_pfn, | 725 | isolated = isolate_freepages_block(cc, pfn, end_pfn, |
| 718 | freelist, false); | 726 | freelist, false); |
| 719 | nr_freepages += isolated; | 727 | nr_freepages += isolated; |
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 6c5899b9034a..8b20278be6a6 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c | |||
| @@ -1476,9 +1476,17 @@ int soft_offline_page(struct page *page, int flags) | |||
| 1476 | { | 1476 | { |
| 1477 | int ret; | 1477 | int ret; |
| 1478 | unsigned long pfn = page_to_pfn(page); | 1478 | unsigned long pfn = page_to_pfn(page); |
| 1479 | struct page *hpage = compound_trans_head(page); | ||
| 1479 | 1480 | ||
| 1480 | if (PageHuge(page)) | 1481 | if (PageHuge(page)) |
| 1481 | return soft_offline_huge_page(page, flags); | 1482 | return soft_offline_huge_page(page, flags); |
| 1483 | if (PageTransHuge(hpage)) { | ||
| 1484 | if (PageAnon(hpage) && unlikely(split_huge_page(hpage))) { | ||
| 1485 | pr_info("soft offline: %#lx: failed to split THP\n", | ||
| 1486 | pfn); | ||
| 1487 | return -EBUSY; | ||
| 1488 | } | ||
| 1489 | } | ||
| 1482 | 1490 | ||
| 1483 | ret = get_any_page(page, pfn, flags); | 1491 | ret = get_any_page(page, pfn, flags); |
| 1484 | if (ret < 0) | 1492 | if (ret < 0) |
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index d04a8a54c294..4ea600da8940 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -2037,28 +2037,6 @@ struct mempolicy *__mpol_dup(struct mempolicy *old) | |||
| 2037 | return new; | 2037 | return new; |
| 2038 | } | 2038 | } |
| 2039 | 2039 | ||
| 2040 | /* | ||
| 2041 | * If *frompol needs [has] an extra ref, copy *frompol to *tompol , | ||
| 2042 | * eliminate the * MPOL_F_* flags that require conditional ref and | ||
| 2043 | * [NOTE!!!] drop the extra ref. Not safe to reference *frompol directly | ||
| 2044 | * after return. Use the returned value. | ||
| 2045 | * | ||
| 2046 | * Allows use of a mempolicy for, e.g., multiple allocations with a single | ||
| 2047 | * policy lookup, even if the policy needs/has extra ref on lookup. | ||
| 2048 | * shmem_readahead needs this. | ||
| 2049 | */ | ||
| 2050 | struct mempolicy *__mpol_cond_copy(struct mempolicy *tompol, | ||
| 2051 | struct mempolicy *frompol) | ||
| 2052 | { | ||
| 2053 | if (!mpol_needs_cond_ref(frompol)) | ||
| 2054 | return frompol; | ||
| 2055 | |||
| 2056 | *tompol = *frompol; | ||
| 2057 | tompol->flags &= ~MPOL_F_SHARED; /* copy doesn't need unref */ | ||
| 2058 | __mpol_put(frompol); | ||
| 2059 | return tompol; | ||
| 2060 | } | ||
| 2061 | |||
| 2062 | /* Slow path of a mempolicy comparison */ | 2040 | /* Slow path of a mempolicy comparison */ |
| 2063 | bool __mpol_equal(struct mempolicy *a, struct mempolicy *b) | 2041 | bool __mpol_equal(struct mempolicy *a, struct mempolicy *b) |
| 2064 | { | 2042 | { |
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 7bb35ac0964a..7e208f0ad68c 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -1405,7 +1405,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype) | |||
| 1405 | 1405 | ||
| 1406 | mt = get_pageblock_migratetype(page); | 1406 | mt = get_pageblock_migratetype(page); |
| 1407 | if (unlikely(mt != MIGRATE_ISOLATE)) | 1407 | if (unlikely(mt != MIGRATE_ISOLATE)) |
| 1408 | __mod_zone_freepage_state(zone, -(1UL << order), mt); | 1408 | __mod_zone_freepage_state(zone, -(1UL << alloc_order), mt); |
| 1409 | 1409 | ||
| 1410 | if (alloc_order != order) | 1410 | if (alloc_order != order) |
| 1411 | expand(zone, page, alloc_order, order, | 1411 | expand(zone, page, alloc_order, order, |
| @@ -1422,7 +1422,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype) | |||
| 1422 | } | 1422 | } |
| 1423 | } | 1423 | } |
| 1424 | 1424 | ||
| 1425 | return 1UL << order; | 1425 | return 1UL << alloc_order; |
| 1426 | } | 1426 | } |
| 1427 | 1427 | ||
| 1428 | /* | 1428 | /* |
| @@ -2416,8 +2416,9 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, | |||
| 2416 | goto nopage; | 2416 | goto nopage; |
| 2417 | 2417 | ||
| 2418 | restart: | 2418 | restart: |
| 2419 | wake_all_kswapd(order, zonelist, high_zoneidx, | 2419 | if (!(gfp_mask & __GFP_NO_KSWAPD)) |
| 2420 | zone_idx(preferred_zone)); | 2420 | wake_all_kswapd(order, zonelist, high_zoneidx, |
| 2421 | zone_idx(preferred_zone)); | ||
| 2421 | 2422 | ||
| 2422 | /* | 2423 | /* |
| 2423 | * OK, we're below the kswapd watermark and have kicked background | 2424 | * OK, we're below the kswapd watermark and have kicked background |
| @@ -2494,7 +2495,7 @@ rebalance: | |||
| 2494 | * system then fail the allocation instead of entering direct reclaim. | 2495 | * system then fail the allocation instead of entering direct reclaim. |
| 2495 | */ | 2496 | */ |
| 2496 | if ((deferred_compaction || contended_compaction) && | 2497 | if ((deferred_compaction || contended_compaction) && |
| 2497 | (gfp_mask & (__GFP_MOVABLE|__GFP_REPEAT)) == __GFP_MOVABLE) | 2498 | (gfp_mask & __GFP_NO_KSWAPD)) |
| 2498 | goto nopage; | 2499 | goto nopage; |
| 2499 | 2500 | ||
| 2500 | /* Try direct reclaim and then allocating */ | 2501 | /* Try direct reclaim and then allocating */ |
diff --git a/mm/shmem.c b/mm/shmem.c index 89341b658bd0..50c5b8f3a359 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
| @@ -910,25 +910,29 @@ static struct mempolicy *shmem_get_sbmpol(struct shmem_sb_info *sbinfo) | |||
| 910 | static struct page *shmem_swapin(swp_entry_t swap, gfp_t gfp, | 910 | static struct page *shmem_swapin(swp_entry_t swap, gfp_t gfp, |
| 911 | struct shmem_inode_info *info, pgoff_t index) | 911 | struct shmem_inode_info *info, pgoff_t index) |
| 912 | { | 912 | { |
| 913 | struct mempolicy mpol, *spol; | ||
| 914 | struct vm_area_struct pvma; | 913 | struct vm_area_struct pvma; |
| 915 | 914 | struct page *page; | |
| 916 | spol = mpol_cond_copy(&mpol, | ||
| 917 | mpol_shared_policy_lookup(&info->policy, index)); | ||
| 918 | 915 | ||
| 919 | /* Create a pseudo vma that just contains the policy */ | 916 | /* Create a pseudo vma that just contains the policy */ |
| 920 | pvma.vm_start = 0; | 917 | pvma.vm_start = 0; |
| 921 | /* Bias interleave by inode number to distribute better across nodes */ | 918 | /* Bias interleave by inode number to distribute better across nodes */ |
| 922 | pvma.vm_pgoff = index + info->vfs_inode.i_ino; | 919 | pvma.vm_pgoff = index + info->vfs_inode.i_ino; |
| 923 | pvma.vm_ops = NULL; | 920 | pvma.vm_ops = NULL; |
| 924 | pvma.vm_policy = spol; | 921 | pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, index); |
| 925 | return swapin_readahead(swap, gfp, &pvma, 0); | 922 | |
| 923 | page = swapin_readahead(swap, gfp, &pvma, 0); | ||
| 924 | |||
| 925 | /* Drop reference taken by mpol_shared_policy_lookup() */ | ||
| 926 | mpol_cond_put(pvma.vm_policy); | ||
| 927 | |||
| 928 | return page; | ||
| 926 | } | 929 | } |
| 927 | 930 | ||
| 928 | static struct page *shmem_alloc_page(gfp_t gfp, | 931 | static struct page *shmem_alloc_page(gfp_t gfp, |
| 929 | struct shmem_inode_info *info, pgoff_t index) | 932 | struct shmem_inode_info *info, pgoff_t index) |
| 930 | { | 933 | { |
| 931 | struct vm_area_struct pvma; | 934 | struct vm_area_struct pvma; |
| 935 | struct page *page; | ||
| 932 | 936 | ||
| 933 | /* Create a pseudo vma that just contains the policy */ | 937 | /* Create a pseudo vma that just contains the policy */ |
| 934 | pvma.vm_start = 0; | 938 | pvma.vm_start = 0; |
| @@ -937,10 +941,12 @@ static struct page *shmem_alloc_page(gfp_t gfp, | |||
| 937 | pvma.vm_ops = NULL; | 941 | pvma.vm_ops = NULL; |
| 938 | pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, index); | 942 | pvma.vm_policy = mpol_shared_policy_lookup(&info->policy, index); |
| 939 | 943 | ||
| 940 | /* | 944 | page = alloc_page_vma(gfp, &pvma, 0); |
| 941 | * alloc_page_vma() will drop the shared policy reference | 945 | |
| 942 | */ | 946 | /* Drop reference taken by mpol_shared_policy_lookup() */ |
| 943 | return alloc_page_vma(gfp, &pvma, 0); | 947 | mpol_cond_put(pvma.vm_policy); |
| 948 | |||
| 949 | return page; | ||
| 944 | } | 950 | } |
| 945 | #else /* !CONFIG_NUMA */ | 951 | #else /* !CONFIG_NUMA */ |
| 946 | #ifdef CONFIG_TMPFS | 952 | #ifdef CONFIG_TMPFS |
diff --git a/mm/sparse.c b/mm/sparse.c index fac95f2888f2..a83de2f72b30 100644 --- a/mm/sparse.c +++ b/mm/sparse.c | |||
| @@ -617,7 +617,7 @@ static void __kfree_section_memmap(struct page *memmap, unsigned long nr_pages) | |||
| 617 | { | 617 | { |
| 618 | return; /* XXX: Not implemented yet */ | 618 | return; /* XXX: Not implemented yet */ |
| 619 | } | 619 | } |
| 620 | static void free_map_bootmem(struct page *page, unsigned long nr_pages) | 620 | static void free_map_bootmem(struct page *memmap, unsigned long nr_pages) |
| 621 | { | 621 | { |
| 622 | } | 622 | } |
| 623 | #else | 623 | #else |
| @@ -658,10 +658,11 @@ static void __kfree_section_memmap(struct page *memmap, unsigned long nr_pages) | |||
| 658 | get_order(sizeof(struct page) * nr_pages)); | 658 | get_order(sizeof(struct page) * nr_pages)); |
| 659 | } | 659 | } |
| 660 | 660 | ||
| 661 | static void free_map_bootmem(struct page *page, unsigned long nr_pages) | 661 | static void free_map_bootmem(struct page *memmap, unsigned long nr_pages) |
| 662 | { | 662 | { |
| 663 | unsigned long maps_section_nr, removing_section_nr, i; | 663 | unsigned long maps_section_nr, removing_section_nr, i; |
| 664 | unsigned long magic; | 664 | unsigned long magic; |
| 665 | struct page *page = virt_to_page(memmap); | ||
| 665 | 666 | ||
| 666 | for (i = 0; i < nr_pages; i++, page++) { | 667 | for (i = 0; i < nr_pages; i++, page++) { |
| 667 | magic = (unsigned long) page->lru.next; | 668 | magic = (unsigned long) page->lru.next; |
| @@ -710,13 +711,10 @@ static void free_section_usemap(struct page *memmap, unsigned long *usemap) | |||
| 710 | */ | 711 | */ |
| 711 | 712 | ||
| 712 | if (memmap) { | 713 | if (memmap) { |
| 713 | struct page *memmap_page; | ||
| 714 | memmap_page = virt_to_page(memmap); | ||
| 715 | |||
| 716 | nr_pages = PAGE_ALIGN(PAGES_PER_SECTION * sizeof(struct page)) | 714 | nr_pages = PAGE_ALIGN(PAGES_PER_SECTION * sizeof(struct page)) |
| 717 | >> PAGE_SHIFT; | 715 | >> PAGE_SHIFT; |
| 718 | 716 | ||
| 719 | free_map_bootmem(memmap_page, nr_pages); | 717 | free_map_bootmem(memmap, nr_pages); |
| 720 | } | 718 | } |
| 721 | } | 719 | } |
| 722 | 720 | ||
diff --git a/mm/vmscan.c b/mm/vmscan.c index 48550c66f1f2..b7ed37675644 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -2207,9 +2207,12 @@ static bool pfmemalloc_watermark_ok(pg_data_t *pgdat) | |||
| 2207 | * Throttle direct reclaimers if backing storage is backed by the network | 2207 | * Throttle direct reclaimers if backing storage is backed by the network |
| 2208 | * and the PFMEMALLOC reserve for the preferred node is getting dangerously | 2208 | * and the PFMEMALLOC reserve for the preferred node is getting dangerously |
| 2209 | * depleted. kswapd will continue to make progress and wake the processes | 2209 | * depleted. kswapd will continue to make progress and wake the processes |
| 2210 | * when the low watermark is reached | 2210 | * when the low watermark is reached. |
| 2211 | * | ||
| 2212 | * Returns true if a fatal signal was delivered during throttling. If this | ||
| 2213 | * happens, the page allocator should not consider triggering the OOM killer. | ||
| 2211 | */ | 2214 | */ |
| 2212 | static void throttle_direct_reclaim(gfp_t gfp_mask, struct zonelist *zonelist, | 2215 | static bool throttle_direct_reclaim(gfp_t gfp_mask, struct zonelist *zonelist, |
| 2213 | nodemask_t *nodemask) | 2216 | nodemask_t *nodemask) |
| 2214 | { | 2217 | { |
| 2215 | struct zone *zone; | 2218 | struct zone *zone; |
| @@ -2224,13 +2227,20 @@ static void throttle_direct_reclaim(gfp_t gfp_mask, struct zonelist *zonelist, | |||
| 2224 | * processes to block on log_wait_commit(). | 2227 | * processes to block on log_wait_commit(). |
| 2225 | */ | 2228 | */ |
| 2226 | if (current->flags & PF_KTHREAD) | 2229 | if (current->flags & PF_KTHREAD) |
| 2227 | return; | 2230 | goto out; |
| 2231 | |||
| 2232 | /* | ||
| 2233 | * If a fatal signal is pending, this process should not throttle. | ||
| 2234 | * It should return quickly so it can exit and free its memory | ||
| 2235 | */ | ||
| 2236 | if (fatal_signal_pending(current)) | ||
| 2237 | goto out; | ||
| 2228 | 2238 | ||
| 2229 | /* Check if the pfmemalloc reserves are ok */ | 2239 | /* Check if the pfmemalloc reserves are ok */ |
| 2230 | first_zones_zonelist(zonelist, high_zoneidx, NULL, &zone); | 2240 | first_zones_zonelist(zonelist, high_zoneidx, NULL, &zone); |
| 2231 | pgdat = zone->zone_pgdat; | 2241 | pgdat = zone->zone_pgdat; |
| 2232 | if (pfmemalloc_watermark_ok(pgdat)) | 2242 | if (pfmemalloc_watermark_ok(pgdat)) |
| 2233 | return; | 2243 | goto out; |
| 2234 | 2244 | ||
| 2235 | /* Account for the throttling */ | 2245 | /* Account for the throttling */ |
| 2236 | count_vm_event(PGSCAN_DIRECT_THROTTLE); | 2246 | count_vm_event(PGSCAN_DIRECT_THROTTLE); |
| @@ -2246,12 +2256,20 @@ static void throttle_direct_reclaim(gfp_t gfp_mask, struct zonelist *zonelist, | |||
| 2246 | if (!(gfp_mask & __GFP_FS)) { | 2256 | if (!(gfp_mask & __GFP_FS)) { |
| 2247 | wait_event_interruptible_timeout(pgdat->pfmemalloc_wait, | 2257 | wait_event_interruptible_timeout(pgdat->pfmemalloc_wait, |
| 2248 | pfmemalloc_watermark_ok(pgdat), HZ); | 2258 | pfmemalloc_watermark_ok(pgdat), HZ); |
| 2249 | return; | 2259 | |
| 2260 | goto check_pending; | ||
| 2250 | } | 2261 | } |
| 2251 | 2262 | ||
| 2252 | /* Throttle until kswapd wakes the process */ | 2263 | /* Throttle until kswapd wakes the process */ |
| 2253 | wait_event_killable(zone->zone_pgdat->pfmemalloc_wait, | 2264 | wait_event_killable(zone->zone_pgdat->pfmemalloc_wait, |
| 2254 | pfmemalloc_watermark_ok(pgdat)); | 2265 | pfmemalloc_watermark_ok(pgdat)); |
| 2266 | |||
| 2267 | check_pending: | ||
| 2268 | if (fatal_signal_pending(current)) | ||
| 2269 | return true; | ||
| 2270 | |||
| 2271 | out: | ||
| 2272 | return false; | ||
| 2255 | } | 2273 | } |
| 2256 | 2274 | ||
| 2257 | unsigned long try_to_free_pages(struct zonelist *zonelist, int order, | 2275 | unsigned long try_to_free_pages(struct zonelist *zonelist, int order, |
| @@ -2273,13 +2291,12 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order, | |||
| 2273 | .gfp_mask = sc.gfp_mask, | 2291 | .gfp_mask = sc.gfp_mask, |
| 2274 | }; | 2292 | }; |
| 2275 | 2293 | ||
| 2276 | throttle_direct_reclaim(gfp_mask, zonelist, nodemask); | ||
| 2277 | |||
| 2278 | /* | 2294 | /* |
| 2279 | * Do not enter reclaim if fatal signal is pending. 1 is returned so | 2295 | * Do not enter reclaim if fatal signal was delivered while throttled. |
| 2280 | * that the page allocator does not consider triggering OOM | 2296 | * 1 is returned so that the page allocator does not OOM kill at this |
| 2297 | * point. | ||
| 2281 | */ | 2298 | */ |
| 2282 | if (fatal_signal_pending(current)) | 2299 | if (throttle_direct_reclaim(gfp_mask, zonelist, nodemask)) |
| 2283 | return 1; | 2300 | return 1; |
| 2284 | 2301 | ||
| 2285 | trace_mm_vmscan_direct_reclaim_begin(order, | 2302 | trace_mm_vmscan_direct_reclaim_begin(order, |
| @@ -2397,6 +2414,19 @@ static void age_active_anon(struct zone *zone, struct scan_control *sc) | |||
| 2397 | } while (memcg); | 2414 | } while (memcg); |
| 2398 | } | 2415 | } |
| 2399 | 2416 | ||
| 2417 | static bool zone_balanced(struct zone *zone, int order, | ||
| 2418 | unsigned long balance_gap, int classzone_idx) | ||
| 2419 | { | ||
| 2420 | if (!zone_watermark_ok_safe(zone, order, high_wmark_pages(zone) + | ||
| 2421 | balance_gap, classzone_idx, 0)) | ||
| 2422 | return false; | ||
| 2423 | |||
| 2424 | if (COMPACTION_BUILD && order && !compaction_suitable(zone, order)) | ||
| 2425 | return false; | ||
| 2426 | |||
| 2427 | return true; | ||
| 2428 | } | ||
| 2429 | |||
| 2400 | /* | 2430 | /* |
| 2401 | * pgdat_balanced is used when checking if a node is balanced for high-order | 2431 | * pgdat_balanced is used when checking if a node is balanced for high-order |
| 2402 | * allocations. Only zones that meet watermarks and are in a zone allowed | 2432 | * allocations. Only zones that meet watermarks and are in a zone allowed |
| @@ -2475,8 +2505,7 @@ static bool prepare_kswapd_sleep(pg_data_t *pgdat, int order, long remaining, | |||
| 2475 | continue; | 2505 | continue; |
| 2476 | } | 2506 | } |
| 2477 | 2507 | ||
| 2478 | if (!zone_watermark_ok_safe(zone, order, high_wmark_pages(zone), | 2508 | if (!zone_balanced(zone, order, 0, i)) |
| 2479 | i, 0)) | ||
| 2480 | all_zones_ok = false; | 2509 | all_zones_ok = false; |
| 2481 | else | 2510 | else |
| 2482 | balanced += zone->present_pages; | 2511 | balanced += zone->present_pages; |
| @@ -2585,8 +2614,7 @@ loop_again: | |||
| 2585 | break; | 2614 | break; |
| 2586 | } | 2615 | } |
| 2587 | 2616 | ||
| 2588 | if (!zone_watermark_ok_safe(zone, order, | 2617 | if (!zone_balanced(zone, order, 0, 0)) { |
| 2589 | high_wmark_pages(zone), 0, 0)) { | ||
| 2590 | end_zone = i; | 2618 | end_zone = i; |
| 2591 | break; | 2619 | break; |
| 2592 | } else { | 2620 | } else { |
| @@ -2662,9 +2690,8 @@ loop_again: | |||
| 2662 | testorder = 0; | 2690 | testorder = 0; |
| 2663 | 2691 | ||
| 2664 | if ((buffer_heads_over_limit && is_highmem_idx(i)) || | 2692 | if ((buffer_heads_over_limit && is_highmem_idx(i)) || |
| 2665 | !zone_watermark_ok_safe(zone, testorder, | 2693 | !zone_balanced(zone, testorder, |
| 2666 | high_wmark_pages(zone) + balance_gap, | 2694 | balance_gap, end_zone)) { |
| 2667 | end_zone, 0)) { | ||
| 2668 | shrink_zone(zone, &sc); | 2695 | shrink_zone(zone, &sc); |
| 2669 | 2696 | ||
| 2670 | reclaim_state->reclaimed_slab = 0; | 2697 | reclaim_state->reclaimed_slab = 0; |
| @@ -2691,8 +2718,7 @@ loop_again: | |||
| 2691 | continue; | 2718 | continue; |
| 2692 | } | 2719 | } |
| 2693 | 2720 | ||
| 2694 | if (!zone_watermark_ok_safe(zone, testorder, | 2721 | if (!zone_balanced(zone, testorder, 0, end_zone)) { |
| 2695 | high_wmark_pages(zone), end_zone, 0)) { | ||
| 2696 | all_zones_ok = 0; | 2722 | all_zones_ok = 0; |
| 2697 | /* | 2723 | /* |
| 2698 | * We are still under min water mark. This | 2724 | * We are still under min water mark. This |
| @@ -2797,29 +2823,10 @@ out: | |||
| 2797 | if (!populated_zone(zone)) | 2823 | if (!populated_zone(zone)) |
| 2798 | continue; | 2824 | continue; |
| 2799 | 2825 | ||
| 2800 | if (zone->all_unreclaimable && | ||
| 2801 | sc.priority != DEF_PRIORITY) | ||
| 2802 | continue; | ||
| 2803 | |||
| 2804 | /* Would compaction fail due to lack of free memory? */ | ||
| 2805 | if (COMPACTION_BUILD && | ||
| 2806 | compaction_suitable(zone, order) == COMPACT_SKIPPED) | ||
| 2807 | goto loop_again; | ||
| 2808 | |||
| 2809 | /* Confirm the zone is balanced for order-0 */ | ||
| 2810 | if (!zone_watermark_ok(zone, 0, | ||
| 2811 | high_wmark_pages(zone), 0, 0)) { | ||
| 2812 | order = sc.order = 0; | ||
| 2813 | goto loop_again; | ||
| 2814 | } | ||
| 2815 | |||
| 2816 | /* Check if the memory needs to be defragmented. */ | 2826 | /* Check if the memory needs to be defragmented. */ |
| 2817 | if (zone_watermark_ok(zone, order, | 2827 | if (zone_watermark_ok(zone, order, |
| 2818 | low_wmark_pages(zone), *classzone_idx, 0)) | 2828 | low_wmark_pages(zone), *classzone_idx, 0)) |
| 2819 | zones_need_compaction = 0; | 2829 | zones_need_compaction = 0; |
| 2820 | |||
| 2821 | /* If balanced, clear the congested flag */ | ||
| 2822 | zone_clear_flag(zone, ZONE_CONGESTED); | ||
| 2823 | } | 2830 | } |
| 2824 | 2831 | ||
| 2825 | if (zones_need_compaction) | 2832 | if (zones_need_compaction) |
diff --git a/net/can/bcm.c b/net/can/bcm.c index 6f747582718e..969b7cdff59d 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
| @@ -1084,6 +1084,9 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, | |||
| 1084 | op->sk = sk; | 1084 | op->sk = sk; |
| 1085 | op->ifindex = ifindex; | 1085 | op->ifindex = ifindex; |
| 1086 | 1086 | ||
| 1087 | /* ifindex for timeout events w/o previous frame reception */ | ||
| 1088 | op->rx_ifindex = ifindex; | ||
| 1089 | |||
| 1087 | /* initialize uninitialized (kzalloc) structure */ | 1090 | /* initialize uninitialized (kzalloc) structure */ |
| 1088 | hrtimer_init(&op->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 1091 | hrtimer_init(&op->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); |
| 1089 | op->timer.function = bcm_rx_timeout_handler; | 1092 | op->timer.function = bcm_rx_timeout_handler; |
diff --git a/net/core/dev.c b/net/core/dev.c index c0946cb2b354..e5942bf45a6d 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -3451,6 +3451,8 @@ static int napi_gro_complete(struct sk_buff *skb) | |||
| 3451 | struct list_head *head = &ptype_base[ntohs(type) & PTYPE_HASH_MASK]; | 3451 | struct list_head *head = &ptype_base[ntohs(type) & PTYPE_HASH_MASK]; |
| 3452 | int err = -ENOENT; | 3452 | int err = -ENOENT; |
| 3453 | 3453 | ||
| 3454 | BUILD_BUG_ON(sizeof(struct napi_gro_cb) > sizeof(skb->cb)); | ||
| 3455 | |||
| 3454 | if (NAPI_GRO_CB(skb)->count == 1) { | 3456 | if (NAPI_GRO_CB(skb)->count == 1) { |
| 3455 | skb_shinfo(skb)->gso_size = 0; | 3457 | skb_shinfo(skb)->gso_size = 0; |
| 3456 | goto out; | 3458 | goto out; |
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index bcf02f608cbf..017a8bacfb27 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
| @@ -429,6 +429,17 @@ static struct attribute_group netstat_group = { | |||
| 429 | .name = "statistics", | 429 | .name = "statistics", |
| 430 | .attrs = netstat_attrs, | 430 | .attrs = netstat_attrs, |
| 431 | }; | 431 | }; |
| 432 | |||
| 433 | #if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211) | ||
| 434 | static struct attribute *wireless_attrs[] = { | ||
| 435 | NULL | ||
| 436 | }; | ||
| 437 | |||
| 438 | static struct attribute_group wireless_group = { | ||
| 439 | .name = "wireless", | ||
| 440 | .attrs = wireless_attrs, | ||
| 441 | }; | ||
| 442 | #endif | ||
| 432 | #endif /* CONFIG_SYSFS */ | 443 | #endif /* CONFIG_SYSFS */ |
| 433 | 444 | ||
| 434 | #ifdef CONFIG_RPS | 445 | #ifdef CONFIG_RPS |
| @@ -1409,6 +1420,15 @@ int netdev_register_kobject(struct net_device *net) | |||
| 1409 | groups++; | 1420 | groups++; |
| 1410 | 1421 | ||
| 1411 | *groups++ = &netstat_group; | 1422 | *groups++ = &netstat_group; |
| 1423 | |||
| 1424 | #if IS_ENABLED(CONFIG_WIRELESS_EXT) || IS_ENABLED(CONFIG_CFG80211) | ||
| 1425 | if (net->ieee80211_ptr) | ||
| 1426 | *groups++ = &wireless_group; | ||
| 1427 | #if IS_ENABLED(CONFIG_WIRELESS_EXT) | ||
| 1428 | else if (net->wireless_handlers) | ||
| 1429 | *groups++ = &wireless_group; | ||
| 1430 | #endif | ||
| 1431 | #endif | ||
| 1412 | #endif /* CONFIG_SYSFS */ | 1432 | #endif /* CONFIG_SYSFS */ |
| 1413 | 1433 | ||
| 1414 | error = device_add(dev); | 1434 | error = device_add(dev); |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 4007c1437fda..3f0636cd76cd 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -3004,7 +3004,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb) | |||
| 3004 | skb_shinfo(nskb)->gso_size = pinfo->gso_size; | 3004 | skb_shinfo(nskb)->gso_size = pinfo->gso_size; |
| 3005 | pinfo->gso_size = 0; | 3005 | pinfo->gso_size = 0; |
| 3006 | skb_header_release(p); | 3006 | skb_header_release(p); |
| 3007 | nskb->prev = p; | 3007 | NAPI_GRO_CB(nskb)->last = p; |
| 3008 | 3008 | ||
| 3009 | nskb->data_len += p->len; | 3009 | nskb->data_len += p->len; |
| 3010 | nskb->truesize += p->truesize; | 3010 | nskb->truesize += p->truesize; |
| @@ -3030,8 +3030,8 @@ merge: | |||
| 3030 | 3030 | ||
| 3031 | __skb_pull(skb, offset); | 3031 | __skb_pull(skb, offset); |
| 3032 | 3032 | ||
| 3033 | p->prev->next = skb; | 3033 | NAPI_GRO_CB(p)->last->next = skb; |
| 3034 | p->prev = skb; | 3034 | NAPI_GRO_CB(p)->last = skb; |
| 3035 | skb_header_release(skb); | 3035 | skb_header_release(skb); |
| 3036 | 3036 | ||
| 3037 | done: | 3037 | done: |
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index f2eccd531746..17ff9fd7cdda 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
| @@ -257,7 +257,8 @@ static inline bool icmpv4_xrlim_allow(struct net *net, struct rtable *rt, | |||
| 257 | struct inet_peer *peer = inet_getpeer_v4(net->ipv4.peers, fl4->daddr, 1); | 257 | struct inet_peer *peer = inet_getpeer_v4(net->ipv4.peers, fl4->daddr, 1); |
| 258 | rc = inet_peer_xrlim_allow(peer, | 258 | rc = inet_peer_xrlim_allow(peer, |
| 259 | net->ipv4.sysctl_icmp_ratelimit); | 259 | net->ipv4.sysctl_icmp_ratelimit); |
| 260 | inet_putpeer(peer); | 260 | if (peer) |
| 261 | inet_putpeer(peer); | ||
| 261 | } | 262 | } |
| 262 | out: | 263 | out: |
| 263 | return rc; | 264 | return rc; |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 0c34bfabc11f..e23e16dc501d 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
| @@ -44,6 +44,10 @@ struct inet_diag_entry { | |||
| 44 | u16 dport; | 44 | u16 dport; |
| 45 | u16 family; | 45 | u16 family; |
| 46 | u16 userlocks; | 46 | u16 userlocks; |
| 47 | #if IS_ENABLED(CONFIG_IPV6) | ||
| 48 | struct in6_addr saddr_storage; /* for IPv4-mapped-IPv6 addresses */ | ||
| 49 | struct in6_addr daddr_storage; /* for IPv4-mapped-IPv6 addresses */ | ||
| 50 | #endif | ||
| 47 | }; | 51 | }; |
| 48 | 52 | ||
| 49 | static DEFINE_MUTEX(inet_diag_table_mutex); | 53 | static DEFINE_MUTEX(inet_diag_table_mutex); |
| @@ -428,25 +432,31 @@ static int inet_diag_bc_run(const struct nlattr *_bc, | |||
| 428 | break; | 432 | break; |
| 429 | } | 433 | } |
| 430 | 434 | ||
| 431 | if (cond->prefix_len == 0) | ||
| 432 | break; | ||
| 433 | |||
| 434 | if (op->code == INET_DIAG_BC_S_COND) | 435 | if (op->code == INET_DIAG_BC_S_COND) |
| 435 | addr = entry->saddr; | 436 | addr = entry->saddr; |
| 436 | else | 437 | else |
| 437 | addr = entry->daddr; | 438 | addr = entry->daddr; |
| 438 | 439 | ||
| 440 | if (cond->family != AF_UNSPEC && | ||
| 441 | cond->family != entry->family) { | ||
| 442 | if (entry->family == AF_INET6 && | ||
| 443 | cond->family == AF_INET) { | ||
| 444 | if (addr[0] == 0 && addr[1] == 0 && | ||
| 445 | addr[2] == htonl(0xffff) && | ||
| 446 | bitstring_match(addr + 3, | ||
| 447 | cond->addr, | ||
| 448 | cond->prefix_len)) | ||
| 449 | break; | ||
| 450 | } | ||
| 451 | yes = 0; | ||
| 452 | break; | ||
| 453 | } | ||
| 454 | |||
| 455 | if (cond->prefix_len == 0) | ||
| 456 | break; | ||
| 439 | if (bitstring_match(addr, cond->addr, | 457 | if (bitstring_match(addr, cond->addr, |
| 440 | cond->prefix_len)) | 458 | cond->prefix_len)) |
| 441 | break; | 459 | break; |
| 442 | if (entry->family == AF_INET6 && | ||
| 443 | cond->family == AF_INET) { | ||
| 444 | if (addr[0] == 0 && addr[1] == 0 && | ||
| 445 | addr[2] == htonl(0xffff) && | ||
| 446 | bitstring_match(addr + 3, cond->addr, | ||
| 447 | cond->prefix_len)) | ||
| 448 | break; | ||
| 449 | } | ||
| 450 | yes = 0; | 460 | yes = 0; |
| 451 | break; | 461 | break; |
| 452 | } | 462 | } |
| @@ -509,6 +519,55 @@ static int valid_cc(const void *bc, int len, int cc) | |||
| 509 | return 0; | 519 | return 0; |
| 510 | } | 520 | } |
| 511 | 521 | ||
| 522 | /* Validate an inet_diag_hostcond. */ | ||
| 523 | static bool valid_hostcond(const struct inet_diag_bc_op *op, int len, | ||
| 524 | int *min_len) | ||
| 525 | { | ||
| 526 | int addr_len; | ||
| 527 | struct inet_diag_hostcond *cond; | ||
| 528 | |||
| 529 | /* Check hostcond space. */ | ||
| 530 | *min_len += sizeof(struct inet_diag_hostcond); | ||
| 531 | if (len < *min_len) | ||
| 532 | return false; | ||
| 533 | cond = (struct inet_diag_hostcond *)(op + 1); | ||
| 534 | |||
| 535 | /* Check address family and address length. */ | ||
| 536 | switch (cond->family) { | ||
| 537 | case AF_UNSPEC: | ||
| 538 | addr_len = 0; | ||
| 539 | break; | ||
| 540 | case AF_INET: | ||
| 541 | addr_len = sizeof(struct in_addr); | ||
| 542 | break; | ||
| 543 | case AF_INET6: | ||
| 544 | addr_len = sizeof(struct in6_addr); | ||
| 545 | break; | ||
| 546 | default: | ||
| 547 | return false; | ||
| 548 | } | ||
| 549 | *min_len += addr_len; | ||
| 550 | if (len < *min_len) | ||
| 551 | return false; | ||
| 552 | |||
| 553 | /* Check prefix length (in bits) vs address length (in bytes). */ | ||
| 554 | if (cond->prefix_len > 8 * addr_len) | ||
| 555 | return false; | ||
| 556 | |||
| 557 | return true; | ||
| 558 | } | ||
| 559 | |||
| 560 | /* Validate a port comparison operator. */ | ||
| 561 | static inline bool valid_port_comparison(const struct inet_diag_bc_op *op, | ||
| 562 | int len, int *min_len) | ||
| 563 | { | ||
| 564 | /* Port comparisons put the port in a follow-on inet_diag_bc_op. */ | ||
| 565 | *min_len += sizeof(struct inet_diag_bc_op); | ||
| 566 | if (len < *min_len) | ||
| 567 | return false; | ||
| 568 | return true; | ||
| 569 | } | ||
| 570 | |||
| 512 | static int inet_diag_bc_audit(const void *bytecode, int bytecode_len) | 571 | static int inet_diag_bc_audit(const void *bytecode, int bytecode_len) |
| 513 | { | 572 | { |
| 514 | const void *bc = bytecode; | 573 | const void *bc = bytecode; |
| @@ -516,29 +575,39 @@ static int inet_diag_bc_audit(const void *bytecode, int bytecode_len) | |||
| 516 | 575 | ||
| 517 | while (len > 0) { | 576 | while (len > 0) { |
| 518 | const struct inet_diag_bc_op *op = bc; | 577 | const struct inet_diag_bc_op *op = bc; |
| 578 | int min_len = sizeof(struct inet_diag_bc_op); | ||
| 519 | 579 | ||
| 520 | //printk("BC: %d %d %d {%d} / %d\n", op->code, op->yes, op->no, op[1].no, len); | 580 | //printk("BC: %d %d %d {%d} / %d\n", op->code, op->yes, op->no, op[1].no, len); |
| 521 | switch (op->code) { | 581 | switch (op->code) { |
| 522 | case INET_DIAG_BC_AUTO: | ||
| 523 | case INET_DIAG_BC_S_COND: | 582 | case INET_DIAG_BC_S_COND: |
| 524 | case INET_DIAG_BC_D_COND: | 583 | case INET_DIAG_BC_D_COND: |
| 584 | if (!valid_hostcond(bc, len, &min_len)) | ||
| 585 | return -EINVAL; | ||
| 586 | break; | ||
| 525 | case INET_DIAG_BC_S_GE: | 587 | case INET_DIAG_BC_S_GE: |
| 526 | case INET_DIAG_BC_S_LE: | 588 | case INET_DIAG_BC_S_LE: |
| 527 | case INET_DIAG_BC_D_GE: | 589 | case INET_DIAG_BC_D_GE: |
| 528 | case INET_DIAG_BC_D_LE: | 590 | case INET_DIAG_BC_D_LE: |
| 529 | case INET_DIAG_BC_JMP: | 591 | if (!valid_port_comparison(bc, len, &min_len)) |
| 530 | if (op->no < 4 || op->no > len + 4 || op->no & 3) | ||
| 531 | return -EINVAL; | ||
| 532 | if (op->no < len && | ||
| 533 | !valid_cc(bytecode, bytecode_len, len - op->no)) | ||
| 534 | return -EINVAL; | 592 | return -EINVAL; |
| 535 | break; | 593 | break; |
| 594 | case INET_DIAG_BC_AUTO: | ||
| 595 | case INET_DIAG_BC_JMP: | ||
| 536 | case INET_DIAG_BC_NOP: | 596 | case INET_DIAG_BC_NOP: |
| 537 | break; | 597 | break; |
| 538 | default: | 598 | default: |
| 539 | return -EINVAL; | 599 | return -EINVAL; |
| 540 | } | 600 | } |
| 541 | if (op->yes < 4 || op->yes > len + 4 || op->yes & 3) | 601 | |
| 602 | if (op->code != INET_DIAG_BC_NOP) { | ||
| 603 | if (op->no < min_len || op->no > len + 4 || op->no & 3) | ||
| 604 | return -EINVAL; | ||
| 605 | if (op->no < len && | ||
| 606 | !valid_cc(bytecode, bytecode_len, len - op->no)) | ||
| 607 | return -EINVAL; | ||
| 608 | } | ||
| 609 | |||
| 610 | if (op->yes < min_len || op->yes > len + 4 || op->yes & 3) | ||
| 542 | return -EINVAL; | 611 | return -EINVAL; |
| 543 | bc += op->yes; | 612 | bc += op->yes; |
| 544 | len -= op->yes; | 613 | len -= op->yes; |
| @@ -596,6 +665,36 @@ static int inet_twsk_diag_dump(struct inet_timewait_sock *tw, | |||
| 596 | cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh); | 665 | cb->nlh->nlmsg_seq, NLM_F_MULTI, cb->nlh); |
| 597 | } | 666 | } |
| 598 | 667 | ||
| 668 | /* Get the IPv4, IPv6, or IPv4-mapped-IPv6 local and remote addresses | ||
| 669 | * from a request_sock. For IPv4-mapped-IPv6 we must map IPv4 to IPv6. | ||
| 670 | */ | ||
| 671 | static inline void inet_diag_req_addrs(const struct sock *sk, | ||
| 672 | const struct request_sock *req, | ||
| 673 | struct inet_diag_entry *entry) | ||
| 674 | { | ||
| 675 | struct inet_request_sock *ireq = inet_rsk(req); | ||
| 676 | |||
| 677 | #if IS_ENABLED(CONFIG_IPV6) | ||
| 678 | if (sk->sk_family == AF_INET6) { | ||
| 679 | if (req->rsk_ops->family == AF_INET6) { | ||
| 680 | entry->saddr = inet6_rsk(req)->loc_addr.s6_addr32; | ||
| 681 | entry->daddr = inet6_rsk(req)->rmt_addr.s6_addr32; | ||
| 682 | } else if (req->rsk_ops->family == AF_INET) { | ||
| 683 | ipv6_addr_set_v4mapped(ireq->loc_addr, | ||
| 684 | &entry->saddr_storage); | ||
| 685 | ipv6_addr_set_v4mapped(ireq->rmt_addr, | ||
| 686 | &entry->daddr_storage); | ||
| 687 | entry->saddr = entry->saddr_storage.s6_addr32; | ||
| 688 | entry->daddr = entry->daddr_storage.s6_addr32; | ||
| 689 | } | ||
| 690 | } else | ||
| 691 | #endif | ||
| 692 | { | ||
| 693 | entry->saddr = &ireq->loc_addr; | ||
| 694 | entry->daddr = &ireq->rmt_addr; | ||
| 695 | } | ||
| 696 | } | ||
| 697 | |||
| 599 | static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk, | 698 | static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk, |
| 600 | struct request_sock *req, | 699 | struct request_sock *req, |
| 601 | struct user_namespace *user_ns, | 700 | struct user_namespace *user_ns, |
| @@ -637,8 +736,10 @@ static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk, | |||
| 637 | r->idiag_inode = 0; | 736 | r->idiag_inode = 0; |
| 638 | #if IS_ENABLED(CONFIG_IPV6) | 737 | #if IS_ENABLED(CONFIG_IPV6) |
| 639 | if (r->idiag_family == AF_INET6) { | 738 | if (r->idiag_family == AF_INET6) { |
| 640 | *(struct in6_addr *)r->id.idiag_src = inet6_rsk(req)->loc_addr; | 739 | struct inet_diag_entry entry; |
| 641 | *(struct in6_addr *)r->id.idiag_dst = inet6_rsk(req)->rmt_addr; | 740 | inet_diag_req_addrs(sk, req, &entry); |
| 741 | memcpy(r->id.idiag_src, entry.saddr, sizeof(struct in6_addr)); | ||
| 742 | memcpy(r->id.idiag_dst, entry.daddr, sizeof(struct in6_addr)); | ||
| 642 | } | 743 | } |
| 643 | #endif | 744 | #endif |
| 644 | 745 | ||
| @@ -691,18 +792,7 @@ static int inet_diag_dump_reqs(struct sk_buff *skb, struct sock *sk, | |||
| 691 | continue; | 792 | continue; |
| 692 | 793 | ||
| 693 | if (bc) { | 794 | if (bc) { |
| 694 | entry.saddr = | 795 | inet_diag_req_addrs(sk, req, &entry); |
| 695 | #if IS_ENABLED(CONFIG_IPV6) | ||
| 696 | (entry.family == AF_INET6) ? | ||
| 697 | inet6_rsk(req)->loc_addr.s6_addr32 : | ||
| 698 | #endif | ||
| 699 | &ireq->loc_addr; | ||
| 700 | entry.daddr = | ||
| 701 | #if IS_ENABLED(CONFIG_IPV6) | ||
| 702 | (entry.family == AF_INET6) ? | ||
| 703 | inet6_rsk(req)->rmt_addr.s6_addr32 : | ||
| 704 | #endif | ||
| 705 | &ireq->rmt_addr; | ||
| 706 | entry.dport = ntohs(ireq->rmt_port); | 796 | entry.dport = ntohs(ireq->rmt_port); |
| 707 | 797 | ||
| 708 | if (!inet_diag_bc_run(bc, &entry)) | 798 | if (!inet_diag_bc_run(bc, &entry)) |
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index 448e68546827..8d5cc75dac88 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
| @@ -707,28 +707,27 @@ EXPORT_SYMBOL(ip_defrag); | |||
| 707 | 707 | ||
| 708 | struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user) | 708 | struct sk_buff *ip_check_defrag(struct sk_buff *skb, u32 user) |
| 709 | { | 709 | { |
| 710 | const struct iphdr *iph; | 710 | struct iphdr iph; |
| 711 | u32 len; | 711 | u32 len; |
| 712 | 712 | ||
| 713 | if (skb->protocol != htons(ETH_P_IP)) | 713 | if (skb->protocol != htons(ETH_P_IP)) |
| 714 | return skb; | 714 | return skb; |
| 715 | 715 | ||
| 716 | if (!pskb_may_pull(skb, sizeof(struct iphdr))) | 716 | if (!skb_copy_bits(skb, 0, &iph, sizeof(iph))) |
| 717 | return skb; | 717 | return skb; |
| 718 | 718 | ||
| 719 | iph = ip_hdr(skb); | 719 | if (iph.ihl < 5 || iph.version != 4) |
| 720 | if (iph->ihl < 5 || iph->version != 4) | ||
| 721 | return skb; | 720 | return skb; |
| 722 | if (!pskb_may_pull(skb, iph->ihl*4)) | 721 | |
| 723 | return skb; | 722 | len = ntohs(iph.tot_len); |
| 724 | iph = ip_hdr(skb); | 723 | if (skb->len < len || len < (iph.ihl * 4)) |
| 725 | len = ntohs(iph->tot_len); | ||
| 726 | if (skb->len < len || len < (iph->ihl * 4)) | ||
| 727 | return skb; | 724 | return skb; |
| 728 | 725 | ||
| 729 | if (ip_is_fragment(ip_hdr(skb))) { | 726 | if (ip_is_fragment(&iph)) { |
| 730 | skb = skb_share_check(skb, GFP_ATOMIC); | 727 | skb = skb_share_check(skb, GFP_ATOMIC); |
| 731 | if (skb) { | 728 | if (skb) { |
| 729 | if (!pskb_may_pull(skb, iph.ihl*4)) | ||
| 730 | return skb; | ||
| 732 | if (pskb_trim_rcsum(skb, len)) | 731 | if (pskb_trim_rcsum(skb, len)) |
| 733 | return skb; | 732 | return skb; |
| 734 | memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); | 733 | memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 6168c4dc58b1..3eab2b2ffd34 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -1318,6 +1318,10 @@ int ip_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, unsi | |||
| 1318 | if (get_user(v, (u32 __user *)optval)) | 1318 | if (get_user(v, (u32 __user *)optval)) |
| 1319 | return -EFAULT; | 1319 | return -EFAULT; |
| 1320 | 1320 | ||
| 1321 | /* "pimreg%u" should not exceed 16 bytes (IFNAMSIZ) */ | ||
| 1322 | if (v != RT_TABLE_DEFAULT && v >= 1000000000) | ||
| 1323 | return -EINVAL; | ||
| 1324 | |||
| 1321 | rtnl_lock(); | 1325 | rtnl_lock(); |
| 1322 | ret = 0; | 1326 | ret = 0; |
| 1323 | if (sk == rtnl_dereference(mrt->mroute_sk)) { | 1327 | if (sk == rtnl_dereference(mrt->mroute_sk)) { |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index a8c651216fa6..df251424d816 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -1785,6 +1785,7 @@ static struct rtable *__mkroute_output(const struct fib_result *res, | |||
| 1785 | if (dev_out->flags & IFF_LOOPBACK) | 1785 | if (dev_out->flags & IFF_LOOPBACK) |
| 1786 | flags |= RTCF_LOCAL; | 1786 | flags |= RTCF_LOCAL; |
| 1787 | 1787 | ||
| 1788 | do_cache = true; | ||
| 1788 | if (type == RTN_BROADCAST) { | 1789 | if (type == RTN_BROADCAST) { |
| 1789 | flags |= RTCF_BROADCAST | RTCF_LOCAL; | 1790 | flags |= RTCF_BROADCAST | RTCF_LOCAL; |
| 1790 | fi = NULL; | 1791 | fi = NULL; |
| @@ -1793,6 +1794,8 @@ static struct rtable *__mkroute_output(const struct fib_result *res, | |||
| 1793 | if (!ip_check_mc_rcu(in_dev, fl4->daddr, fl4->saddr, | 1794 | if (!ip_check_mc_rcu(in_dev, fl4->daddr, fl4->saddr, |
| 1794 | fl4->flowi4_proto)) | 1795 | fl4->flowi4_proto)) |
| 1795 | flags &= ~RTCF_LOCAL; | 1796 | flags &= ~RTCF_LOCAL; |
| 1797 | else | ||
| 1798 | do_cache = false; | ||
| 1796 | /* If multicast route do not exist use | 1799 | /* If multicast route do not exist use |
| 1797 | * default one, but do not gateway in this case. | 1800 | * default one, but do not gateway in this case. |
| 1798 | * Yes, it is hack. | 1801 | * Yes, it is hack. |
| @@ -1802,8 +1805,8 @@ static struct rtable *__mkroute_output(const struct fib_result *res, | |||
| 1802 | } | 1805 | } |
| 1803 | 1806 | ||
| 1804 | fnhe = NULL; | 1807 | fnhe = NULL; |
| 1805 | do_cache = fi != NULL; | 1808 | do_cache &= fi != NULL; |
| 1806 | if (fi) { | 1809 | if (do_cache) { |
| 1807 | struct rtable __rcu **prth; | 1810 | struct rtable __rcu **prth; |
| 1808 | struct fib_nh *nh = &FIB_RES_NH(*res); | 1811 | struct fib_nh *nh = &FIB_RES_NH(*res); |
| 1809 | 1812 | ||
| @@ -2597,7 +2600,7 @@ int __init ip_rt_init(void) | |||
| 2597 | pr_err("Unable to create route proc files\n"); | 2600 | pr_err("Unable to create route proc files\n"); |
| 2598 | #ifdef CONFIG_XFRM | 2601 | #ifdef CONFIG_XFRM |
| 2599 | xfrm_init(); | 2602 | xfrm_init(); |
| 2600 | xfrm4_init(ip_rt_max_size); | 2603 | xfrm4_init(); |
| 2601 | #endif | 2604 | #endif |
| 2602 | rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL, NULL); | 2605 | rtnl_register(PF_INET, RTM_GETROUTE, inet_rtm_getroute, NULL, NULL); |
| 2603 | 2606 | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 083092e3aed6..e457c7ab2e28 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -830,8 +830,8 @@ static int tcp_send_mss(struct sock *sk, int *size_goal, int flags) | |||
| 830 | return mss_now; | 830 | return mss_now; |
| 831 | } | 831 | } |
| 832 | 832 | ||
| 833 | static ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, | 833 | static ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset, |
| 834 | size_t psize, int flags) | 834 | size_t size, int flags) |
| 835 | { | 835 | { |
| 836 | struct tcp_sock *tp = tcp_sk(sk); | 836 | struct tcp_sock *tp = tcp_sk(sk); |
| 837 | int mss_now, size_goal; | 837 | int mss_now, size_goal; |
| @@ -858,12 +858,9 @@ static ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffse | |||
| 858 | if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) | 858 | if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) |
| 859 | goto out_err; | 859 | goto out_err; |
| 860 | 860 | ||
| 861 | while (psize > 0) { | 861 | while (size > 0) { |
| 862 | struct sk_buff *skb = tcp_write_queue_tail(sk); | 862 | struct sk_buff *skb = tcp_write_queue_tail(sk); |
| 863 | struct page *page = pages[poffset / PAGE_SIZE]; | ||
| 864 | int copy, i; | 863 | int copy, i; |
| 865 | int offset = poffset % PAGE_SIZE; | ||
| 866 | int size = min_t(size_t, psize, PAGE_SIZE - offset); | ||
| 867 | bool can_coalesce; | 864 | bool can_coalesce; |
| 868 | 865 | ||
| 869 | if (!tcp_send_head(sk) || (copy = size_goal - skb->len) <= 0) { | 866 | if (!tcp_send_head(sk) || (copy = size_goal - skb->len) <= 0) { |
| @@ -912,8 +909,8 @@ new_segment: | |||
| 912 | TCP_SKB_CB(skb)->tcp_flags &= ~TCPHDR_PSH; | 909 | TCP_SKB_CB(skb)->tcp_flags &= ~TCPHDR_PSH; |
| 913 | 910 | ||
| 914 | copied += copy; | 911 | copied += copy; |
| 915 | poffset += copy; | 912 | offset += copy; |
| 916 | if (!(psize -= copy)) | 913 | if (!(size -= copy)) |
| 917 | goto out; | 914 | goto out; |
| 918 | 915 | ||
| 919 | if (skb->len < size_goal || (flags & MSG_OOB)) | 916 | if (skb->len < size_goal || (flags & MSG_OOB)) |
| @@ -960,7 +957,7 @@ int tcp_sendpage(struct sock *sk, struct page *page, int offset, | |||
| 960 | flags); | 957 | flags); |
| 961 | 958 | ||
| 962 | lock_sock(sk); | 959 | lock_sock(sk); |
| 963 | res = do_tcp_sendpages(sk, &page, offset, size, flags); | 960 | res = do_tcp_sendpages(sk, page, offset, size, flags); |
| 964 | release_sock(sk); | 961 | release_sock(sk); |
| 965 | return res; | 962 | return res; |
| 966 | } | 963 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 609ff98aeb47..181fc8234a52 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -5645,7 +5645,11 @@ static bool tcp_rcv_fastopen_synack(struct sock *sk, struct sk_buff *synack, | |||
| 5645 | tcp_fastopen_cache_set(sk, mss, cookie, syn_drop); | 5645 | tcp_fastopen_cache_set(sk, mss, cookie, syn_drop); |
| 5646 | 5646 | ||
| 5647 | if (data) { /* Retransmit unacked data in SYN */ | 5647 | if (data) { /* Retransmit unacked data in SYN */ |
| 5648 | tcp_retransmit_skb(sk, data); | 5648 | tcp_for_write_queue_from(data, sk) { |
| 5649 | if (data == tcp_send_head(sk) || | ||
| 5650 | __tcp_retransmit_skb(sk, data)) | ||
| 5651 | break; | ||
| 5652 | } | ||
| 5649 | tcp_rearm_rto(sk); | 5653 | tcp_rearm_rto(sk); |
| 5650 | return true; | 5654 | return true; |
| 5651 | } | 5655 | } |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 2798706cb063..948ac275b9b5 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -2309,12 +2309,11 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *to, | |||
| 2309 | * state updates are done by the caller. Returns non-zero if an | 2309 | * state updates are done by the caller. Returns non-zero if an |
| 2310 | * error occurred which prevented the send. | 2310 | * error occurred which prevented the send. |
| 2311 | */ | 2311 | */ |
| 2312 | int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | 2312 | int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) |
| 2313 | { | 2313 | { |
| 2314 | struct tcp_sock *tp = tcp_sk(sk); | 2314 | struct tcp_sock *tp = tcp_sk(sk); |
| 2315 | struct inet_connection_sock *icsk = inet_csk(sk); | 2315 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 2316 | unsigned int cur_mss; | 2316 | unsigned int cur_mss; |
| 2317 | int err; | ||
| 2318 | 2317 | ||
| 2319 | /* Inconslusive MTU probe */ | 2318 | /* Inconslusive MTU probe */ |
| 2320 | if (icsk->icsk_mtup.probe_size) { | 2319 | if (icsk->icsk_mtup.probe_size) { |
| @@ -2387,11 +2386,17 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 2387 | if (unlikely(NET_IP_ALIGN && ((unsigned long)skb->data & 3))) { | 2386 | if (unlikely(NET_IP_ALIGN && ((unsigned long)skb->data & 3))) { |
| 2388 | struct sk_buff *nskb = __pskb_copy(skb, MAX_TCP_HEADER, | 2387 | struct sk_buff *nskb = __pskb_copy(skb, MAX_TCP_HEADER, |
| 2389 | GFP_ATOMIC); | 2388 | GFP_ATOMIC); |
| 2390 | err = nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : | 2389 | return nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : |
| 2391 | -ENOBUFS; | 2390 | -ENOBUFS; |
| 2392 | } else { | 2391 | } else { |
| 2393 | err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); | 2392 | return tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); |
| 2394 | } | 2393 | } |
| 2394 | } | ||
| 2395 | |||
| 2396 | int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | ||
| 2397 | { | ||
| 2398 | struct tcp_sock *tp = tcp_sk(sk); | ||
| 2399 | int err = __tcp_retransmit_skb(sk, skb); | ||
| 2395 | 2400 | ||
| 2396 | if (err == 0) { | 2401 | if (err == 0) { |
| 2397 | /* Update global TCP statistics. */ | 2402 | /* Update global TCP statistics. */ |
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c index 05c5ab8d983c..3be0ac2c1920 100644 --- a/net/ipv4/xfrm4_policy.c +++ b/net/ipv4/xfrm4_policy.c | |||
| @@ -279,19 +279,8 @@ static void __exit xfrm4_policy_fini(void) | |||
| 279 | xfrm_policy_unregister_afinfo(&xfrm4_policy_afinfo); | 279 | xfrm_policy_unregister_afinfo(&xfrm4_policy_afinfo); |
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | void __init xfrm4_init(int rt_max_size) | 282 | void __init xfrm4_init(void) |
| 283 | { | 283 | { |
| 284 | /* | ||
| 285 | * Select a default value for the gc_thresh based on the main route | ||
| 286 | * table hash size. It seems to me the worst case scenario is when | ||
| 287 | * we have ipsec operating in transport mode, in which we create a | ||
| 288 | * dst_entry per socket. The xfrm gc algorithm starts trying to remove | ||
| 289 | * entries at gc_thresh, and prevents new allocations as 2*gc_thresh | ||
| 290 | * so lets set an initial xfrm gc_thresh value at the rt_max_size/2. | ||
| 291 | * That will let us store an ipsec connection per route table entry, | ||
| 292 | * and start cleaning when were 1/2 full | ||
| 293 | */ | ||
| 294 | xfrm4_dst_ops.gc_thresh = rt_max_size/2; | ||
| 295 | dst_entries_init(&xfrm4_dst_ops); | 284 | dst_entries_init(&xfrm4_dst_ops); |
| 296 | 285 | ||
| 297 | xfrm4_state_init(); | 286 | xfrm4_state_init(); |
diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index c4f934176cab..30647857a375 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c | |||
| @@ -252,6 +252,7 @@ struct dst_entry *inet6_csk_update_pmtu(struct sock *sk, u32 mtu) | |||
| 252 | return NULL; | 252 | return NULL; |
| 253 | dst->ops->update_pmtu(dst, sk, NULL, mtu); | 253 | dst->ops->update_pmtu(dst, sk, NULL, mtu); |
| 254 | 254 | ||
| 255 | return inet6_csk_route_socket(sk, &fl6); | 255 | dst = inet6_csk_route_socket(sk, &fl6); |
| 256 | return IS_ERR(dst) ? NULL : dst; | ||
| 256 | } | 257 | } |
| 257 | EXPORT_SYMBOL_GPL(inet6_csk_update_pmtu); | 258 | EXPORT_SYMBOL_GPL(inet6_csk_update_pmtu); |
diff --git a/net/irda/irttp.c b/net/irda/irttp.c index 1002e3396f72..ae43c62f9045 100644 --- a/net/irda/irttp.c +++ b/net/irda/irttp.c | |||
| @@ -441,6 +441,7 @@ struct tsap_cb *irttp_open_tsap(__u8 stsap_sel, int credit, notify_t *notify) | |||
| 441 | lsap = irlmp_open_lsap(stsap_sel, &ttp_notify, 0); | 441 | lsap = irlmp_open_lsap(stsap_sel, &ttp_notify, 0); |
| 442 | if (lsap == NULL) { | 442 | if (lsap == NULL) { |
| 443 | IRDA_DEBUG(0, "%s: unable to allocate LSAP!!\n", __func__); | 443 | IRDA_DEBUG(0, "%s: unable to allocate LSAP!!\n", __func__); |
| 444 | __irttp_close_tsap(self); | ||
| 444 | return NULL; | 445 | return NULL; |
| 445 | } | 446 | } |
| 446 | 447 | ||
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index bf87c70ac6c5..c21e33d1abd0 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c | |||
| @@ -1151,10 +1151,6 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) | |||
| 1151 | 1151 | ||
| 1152 | mutex_lock(&sdata->u.ibss.mtx); | 1152 | mutex_lock(&sdata->u.ibss.mtx); |
| 1153 | 1153 | ||
| 1154 | sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH; | ||
| 1155 | memset(sdata->u.ibss.bssid, 0, ETH_ALEN); | ||
| 1156 | sdata->u.ibss.ssid_len = 0; | ||
| 1157 | |||
| 1158 | active_ibss = ieee80211_sta_active_ibss(sdata); | 1154 | active_ibss = ieee80211_sta_active_ibss(sdata); |
| 1159 | 1155 | ||
| 1160 | if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) { | 1156 | if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) { |
| @@ -1175,6 +1171,10 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) | |||
| 1175 | } | 1171 | } |
| 1176 | } | 1172 | } |
| 1177 | 1173 | ||
| 1174 | ifibss->state = IEEE80211_IBSS_MLME_SEARCH; | ||
| 1175 | memset(ifibss->bssid, 0, ETH_ALEN); | ||
| 1176 | ifibss->ssid_len = 0; | ||
| 1177 | |||
| 1178 | sta_info_flush(sdata->local, sdata); | 1178 | sta_info_flush(sdata->local, sdata); |
| 1179 | 1179 | ||
| 1180 | spin_lock_bh(&ifibss->incomplete_lock); | 1180 | spin_lock_bh(&ifibss->incomplete_lock); |
diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c index 83608ac16780..2c84185dfdb0 100644 --- a/net/mac80211/offchannel.c +++ b/net/mac80211/offchannel.c | |||
| @@ -458,8 +458,6 @@ void ieee80211_roc_purge(struct ieee80211_sub_if_data *sdata) | |||
| 458 | list_move_tail(&roc->list, &tmp_list); | 458 | list_move_tail(&roc->list, &tmp_list); |
| 459 | roc->abort = true; | 459 | roc->abort = true; |
| 460 | } | 460 | } |
| 461 | |||
| 462 | ieee80211_start_next_roc(local); | ||
| 463 | mutex_unlock(&local->mtx); | 461 | mutex_unlock(&local->mtx); |
| 464 | 462 | ||
| 465 | list_for_each_entry_safe(roc, tmp, &tmp_list, list) { | 463 | list_for_each_entry_safe(roc, tmp, &tmp_list, list) { |
diff --git a/net/netfilter/ipset/ip_set_hash_ip.c b/net/netfilter/ipset/ip_set_hash_ip.c index ec3dba5dcd62..5c0b78528e55 100644 --- a/net/netfilter/ipset/ip_set_hash_ip.c +++ b/net/netfilter/ipset/ip_set_hash_ip.c | |||
| @@ -173,6 +173,7 @@ hash_ip4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 173 | return adtfn(set, &nip, timeout, flags); | 173 | return adtfn(set, &nip, timeout, flags); |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | ip_to = ip; | ||
| 176 | if (tb[IPSET_ATTR_IP_TO]) { | 177 | if (tb[IPSET_ATTR_IP_TO]) { |
| 177 | ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); | 178 | ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); |
| 178 | if (ret) | 179 | if (ret) |
| @@ -185,8 +186,7 @@ hash_ip4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 185 | if (!cidr || cidr > 32) | 186 | if (!cidr || cidr > 32) |
| 186 | return -IPSET_ERR_INVALID_CIDR; | 187 | return -IPSET_ERR_INVALID_CIDR; |
| 187 | ip_set_mask_from_to(ip, ip_to, cidr); | 188 | ip_set_mask_from_to(ip, ip_to, cidr); |
| 188 | } else | 189 | } |
| 189 | ip_to = ip; | ||
| 190 | 190 | ||
| 191 | hosts = h->netmask == 32 ? 1 : 2 << (32 - h->netmask - 1); | 191 | hosts = h->netmask == 32 ? 1 : 2 << (32 - h->netmask - 1); |
| 192 | 192 | ||
diff --git a/net/netfilter/ipset/ip_set_hash_ipport.c b/net/netfilter/ipset/ip_set_hash_ipport.c index 0171f7502fa5..6283351f4eeb 100644 --- a/net/netfilter/ipset/ip_set_hash_ipport.c +++ b/net/netfilter/ipset/ip_set_hash_ipport.c | |||
| @@ -162,7 +162,7 @@ hash_ipport4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 162 | const struct ip_set_hash *h = set->data; | 162 | const struct ip_set_hash *h = set->data; |
| 163 | ipset_adtfn adtfn = set->variant->adt[adt]; | 163 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 164 | struct hash_ipport4_elem data = { }; | 164 | struct hash_ipport4_elem data = { }; |
| 165 | u32 ip, ip_to = 0, p = 0, port, port_to; | 165 | u32 ip, ip_to, p = 0, port, port_to; |
| 166 | u32 timeout = h->timeout; | 166 | u32 timeout = h->timeout; |
| 167 | bool with_ports = false; | 167 | bool with_ports = false; |
| 168 | int ret; | 168 | int ret; |
| @@ -210,7 +210,7 @@ hash_ipport4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 210 | return ip_set_eexist(ret, flags) ? 0 : ret; | 210 | return ip_set_eexist(ret, flags) ? 0 : ret; |
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | ip = ntohl(data.ip); | 213 | ip_to = ip = ntohl(data.ip); |
| 214 | if (tb[IPSET_ATTR_IP_TO]) { | 214 | if (tb[IPSET_ATTR_IP_TO]) { |
| 215 | ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); | 215 | ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); |
| 216 | if (ret) | 216 | if (ret) |
| @@ -223,8 +223,7 @@ hash_ipport4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 223 | if (!cidr || cidr > 32) | 223 | if (!cidr || cidr > 32) |
| 224 | return -IPSET_ERR_INVALID_CIDR; | 224 | return -IPSET_ERR_INVALID_CIDR; |
| 225 | ip_set_mask_from_to(ip, ip_to, cidr); | 225 | ip_set_mask_from_to(ip, ip_to, cidr); |
| 226 | } else | 226 | } |
| 227 | ip_to = ip; | ||
| 228 | 227 | ||
| 229 | port_to = port = ntohs(data.port); | 228 | port_to = port = ntohs(data.port); |
| 230 | if (with_ports && tb[IPSET_ATTR_PORT_TO]) { | 229 | if (with_ports && tb[IPSET_ATTR_PORT_TO]) { |
diff --git a/net/netfilter/ipset/ip_set_hash_ipportip.c b/net/netfilter/ipset/ip_set_hash_ipportip.c index 6344ef551ec8..6a21271c8d5a 100644 --- a/net/netfilter/ipset/ip_set_hash_ipportip.c +++ b/net/netfilter/ipset/ip_set_hash_ipportip.c | |||
| @@ -166,7 +166,7 @@ hash_ipportip4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 166 | const struct ip_set_hash *h = set->data; | 166 | const struct ip_set_hash *h = set->data; |
| 167 | ipset_adtfn adtfn = set->variant->adt[adt]; | 167 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 168 | struct hash_ipportip4_elem data = { }; | 168 | struct hash_ipportip4_elem data = { }; |
| 169 | u32 ip, ip_to = 0, p = 0, port, port_to; | 169 | u32 ip, ip_to, p = 0, port, port_to; |
| 170 | u32 timeout = h->timeout; | 170 | u32 timeout = h->timeout; |
| 171 | bool with_ports = false; | 171 | bool with_ports = false; |
| 172 | int ret; | 172 | int ret; |
| @@ -218,7 +218,7 @@ hash_ipportip4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 218 | return ip_set_eexist(ret, flags) ? 0 : ret; | 218 | return ip_set_eexist(ret, flags) ? 0 : ret; |
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | ip = ntohl(data.ip); | 221 | ip_to = ip = ntohl(data.ip); |
| 222 | if (tb[IPSET_ATTR_IP_TO]) { | 222 | if (tb[IPSET_ATTR_IP_TO]) { |
| 223 | ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); | 223 | ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); |
| 224 | if (ret) | 224 | if (ret) |
| @@ -231,8 +231,7 @@ hash_ipportip4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 231 | if (!cidr || cidr > 32) | 231 | if (!cidr || cidr > 32) |
| 232 | return -IPSET_ERR_INVALID_CIDR; | 232 | return -IPSET_ERR_INVALID_CIDR; |
| 233 | ip_set_mask_from_to(ip, ip_to, cidr); | 233 | ip_set_mask_from_to(ip, ip_to, cidr); |
| 234 | } else | 234 | } |
| 235 | ip_to = ip; | ||
| 236 | 235 | ||
| 237 | port_to = port = ntohs(data.port); | 236 | port_to = port = ntohs(data.port); |
| 238 | if (with_ports && tb[IPSET_ATTR_PORT_TO]) { | 237 | if (with_ports && tb[IPSET_ATTR_PORT_TO]) { |
diff --git a/net/netfilter/ipset/ip_set_hash_ipportnet.c b/net/netfilter/ipset/ip_set_hash_ipportnet.c index cb71f9a774e7..2d5cd4ee30eb 100644 --- a/net/netfilter/ipset/ip_set_hash_ipportnet.c +++ b/net/netfilter/ipset/ip_set_hash_ipportnet.c | |||
| @@ -215,8 +215,8 @@ hash_ipportnet4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 215 | const struct ip_set_hash *h = set->data; | 215 | const struct ip_set_hash *h = set->data; |
| 216 | ipset_adtfn adtfn = set->variant->adt[adt]; | 216 | ipset_adtfn adtfn = set->variant->adt[adt]; |
| 217 | struct hash_ipportnet4_elem data = { .cidr = HOST_MASK - 1 }; | 217 | struct hash_ipportnet4_elem data = { .cidr = HOST_MASK - 1 }; |
| 218 | u32 ip, ip_to = 0, p = 0, port, port_to; | 218 | u32 ip, ip_to, p = 0, port, port_to; |
| 219 | u32 ip2_from = 0, ip2_to, ip2_last, ip2; | 219 | u32 ip2_from, ip2_to, ip2_last, ip2; |
| 220 | u32 timeout = h->timeout; | 220 | u32 timeout = h->timeout; |
| 221 | bool with_ports = false; | 221 | bool with_ports = false; |
| 222 | u8 cidr; | 222 | u8 cidr; |
| @@ -286,6 +286,7 @@ hash_ipportnet4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 286 | return ip_set_eexist(ret, flags) ? 0 : ret; | 286 | return ip_set_eexist(ret, flags) ? 0 : ret; |
| 287 | } | 287 | } |
| 288 | 288 | ||
| 289 | ip_to = ip; | ||
| 289 | if (tb[IPSET_ATTR_IP_TO]) { | 290 | if (tb[IPSET_ATTR_IP_TO]) { |
| 290 | ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); | 291 | ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP_TO], &ip_to); |
| 291 | if (ret) | 292 | if (ret) |
| @@ -306,6 +307,8 @@ hash_ipportnet4_uadt(struct ip_set *set, struct nlattr *tb[], | |||
| 306 | if (port > port_to) | 307 | if (port > port_to) |
| 307 | swap(port, port_to); | 308 | swap(port, port_to); |
| 308 | } | 309 | } |
| 310 | |||
| 311 | ip2_to = ip2_from; | ||
| 309 | if (tb[IPSET_ATTR_IP2_TO]) { | 312 | if (tb[IPSET_ATTR_IP2_TO]) { |
| 310 | ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP2_TO], &ip2_to); | 313 | ret = ip_set_get_hostipaddr4(tb[IPSET_ATTR_IP2_TO], &ip2_to); |
| 311 | if (ret) | 314 | if (ret) |
diff --git a/net/netfilter/ipset/ip_set_hash_netiface.c b/net/netfilter/ipset/ip_set_hash_netiface.c index b9a63381e349..45a101439bc5 100644 --- a/net/netfilter/ipset/ip_set_hash_netiface.c +++ b/net/netfilter/ipset/ip_set_hash_netiface.c | |||
| @@ -793,7 +793,7 @@ static struct ip_set_type hash_netiface_type __read_mostly = { | |||
| 793 | [IPSET_ATTR_IP] = { .type = NLA_NESTED }, | 793 | [IPSET_ATTR_IP] = { .type = NLA_NESTED }, |
| 794 | [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, | 794 | [IPSET_ATTR_IP_TO] = { .type = NLA_NESTED }, |
| 795 | [IPSET_ATTR_IFACE] = { .type = NLA_NUL_STRING, | 795 | [IPSET_ATTR_IFACE] = { .type = NLA_NUL_STRING, |
| 796 | .len = IPSET_MAXNAMELEN - 1 }, | 796 | .len = IFNAMSIZ - 1 }, |
| 797 | [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, | 797 | [IPSET_ATTR_CADT_FLAGS] = { .type = NLA_U32 }, |
| 798 | [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, | 798 | [IPSET_ATTR_CIDR] = { .type = NLA_U8 }, |
| 799 | [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, | 799 | [IPSET_ATTR_TIMEOUT] = { .type = NLA_U32 }, |
diff --git a/net/netfilter/nfnetlink_cttimeout.c b/net/netfilter/nfnetlink_cttimeout.c index 8847b4d8be06..701c88a20fea 100644 --- a/net/netfilter/nfnetlink_cttimeout.c +++ b/net/netfilter/nfnetlink_cttimeout.c | |||
| @@ -41,7 +41,8 @@ MODULE_DESCRIPTION("cttimeout: Extended Netfilter Connection Tracking timeout tu | |||
| 41 | static LIST_HEAD(cttimeout_list); | 41 | static LIST_HEAD(cttimeout_list); |
| 42 | 42 | ||
| 43 | static const struct nla_policy cttimeout_nla_policy[CTA_TIMEOUT_MAX+1] = { | 43 | static const struct nla_policy cttimeout_nla_policy[CTA_TIMEOUT_MAX+1] = { |
| 44 | [CTA_TIMEOUT_NAME] = { .type = NLA_NUL_STRING }, | 44 | [CTA_TIMEOUT_NAME] = { .type = NLA_NUL_STRING, |
| 45 | .len = CTNL_TIMEOUT_NAME_MAX - 1}, | ||
| 45 | [CTA_TIMEOUT_L3PROTO] = { .type = NLA_U16 }, | 46 | [CTA_TIMEOUT_L3PROTO] = { .type = NLA_U16 }, |
| 46 | [CTA_TIMEOUT_L4PROTO] = { .type = NLA_U8 }, | 47 | [CTA_TIMEOUT_L4PROTO] = { .type = NLA_U8 }, |
| 47 | [CTA_TIMEOUT_DATA] = { .type = NLA_NESTED }, | 48 | [CTA_TIMEOUT_DATA] = { .type = NLA_NESTED }, |
diff --git a/net/nfc/llcp/llcp.c b/net/nfc/llcp/llcp.c index cc10d073c338..9e8f4b2801f6 100644 --- a/net/nfc/llcp/llcp.c +++ b/net/nfc/llcp/llcp.c | |||
| @@ -1210,7 +1210,7 @@ int nfc_llcp_register_device(struct nfc_dev *ndev) | |||
| 1210 | local->remote_miu = LLCP_DEFAULT_MIU; | 1210 | local->remote_miu = LLCP_DEFAULT_MIU; |
| 1211 | local->remote_lto = LLCP_DEFAULT_LTO; | 1211 | local->remote_lto = LLCP_DEFAULT_LTO; |
| 1212 | 1212 | ||
| 1213 | list_add(&llcp_devices, &local->list); | 1213 | list_add(&local->list, &llcp_devices); |
| 1214 | 1214 | ||
| 1215 | return 0; | 1215 | return 0; |
| 1216 | } | 1216 | } |
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 98c70630ad06..733cbf49ed1f 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c | |||
| @@ -702,15 +702,11 @@ int ovs_flow_extract(struct sk_buff *skb, u16 in_port, struct sw_flow_key *key, | |||
| 702 | /* We only match on the lower 8 bits of the opcode. */ | 702 | /* We only match on the lower 8 bits of the opcode. */ |
| 703 | if (ntohs(arp->ar_op) <= 0xff) | 703 | if (ntohs(arp->ar_op) <= 0xff) |
| 704 | key->ip.proto = ntohs(arp->ar_op); | 704 | key->ip.proto = ntohs(arp->ar_op); |
| 705 | 705 | memcpy(&key->ipv4.addr.src, arp->ar_sip, sizeof(key->ipv4.addr.src)); | |
| 706 | if (key->ip.proto == ARPOP_REQUEST | 706 | memcpy(&key->ipv4.addr.dst, arp->ar_tip, sizeof(key->ipv4.addr.dst)); |
| 707 | || key->ip.proto == ARPOP_REPLY) { | 707 | memcpy(key->ipv4.arp.sha, arp->ar_sha, ETH_ALEN); |
| 708 | memcpy(&key->ipv4.addr.src, arp->ar_sip, sizeof(key->ipv4.addr.src)); | 708 | memcpy(key->ipv4.arp.tha, arp->ar_tha, ETH_ALEN); |
| 709 | memcpy(&key->ipv4.addr.dst, arp->ar_tip, sizeof(key->ipv4.addr.dst)); | 709 | key_len = SW_FLOW_KEY_OFFSET(ipv4.arp); |
| 710 | memcpy(key->ipv4.arp.sha, arp->ar_sha, ETH_ALEN); | ||
| 711 | memcpy(key->ipv4.arp.tha, arp->ar_tha, ETH_ALEN); | ||
| 712 | key_len = SW_FLOW_KEY_OFFSET(ipv4.arp); | ||
| 713 | } | ||
| 714 | } | 710 | } |
| 715 | } else if (key->eth.type == htons(ETH_P_IPV6)) { | 711 | } else if (key->eth.type == htons(ETH_P_IPV6)) { |
| 716 | int nh_len; /* IPv6 Header + Extensions */ | 712 | int nh_len; /* IPv6 Header + Extensions */ |
diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c index 3c1e58ba714b..a9033481fa5e 100644 --- a/net/openvswitch/vport-netdev.c +++ b/net/openvswitch/vport-netdev.c | |||
| @@ -158,7 +158,7 @@ static int netdev_send(struct vport *vport, struct sk_buff *skb) | |||
| 158 | 158 | ||
| 159 | if (unlikely(packet_length(skb) > mtu && !skb_is_gso(skb))) { | 159 | if (unlikely(packet_length(skb) > mtu && !skb_is_gso(skb))) { |
| 160 | net_warn_ratelimited("%s: dropped over-mtu packet: %d > %d\n", | 160 | net_warn_ratelimited("%s: dropped over-mtu packet: %d > %d\n", |
| 161 | ovs_dp_name(vport->dp), | 161 | netdev_vport->dev->name, |
| 162 | packet_length(skb), mtu); | 162 | packet_length(skb), mtu); |
| 163 | goto error; | 163 | goto error; |
| 164 | } | 164 | } |
diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c index 7c2df9c33df3..69ce21e3716f 100644 --- a/net/sctp/chunk.c +++ b/net/sctp/chunk.c | |||
| @@ -183,7 +183,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, | |||
| 183 | 183 | ||
| 184 | msg = sctp_datamsg_new(GFP_KERNEL); | 184 | msg = sctp_datamsg_new(GFP_KERNEL); |
| 185 | if (!msg) | 185 | if (!msg) |
| 186 | return NULL; | 186 | return ERR_PTR(-ENOMEM); |
| 187 | 187 | ||
| 188 | /* Note: Calculate this outside of the loop, so that all fragments | 188 | /* Note: Calculate this outside of the loop, so that all fragments |
| 189 | * have the same expiration. | 189 | * have the same expiration. |
| @@ -280,11 +280,14 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, | |||
| 280 | 280 | ||
| 281 | chunk = sctp_make_datafrag_empty(asoc, sinfo, len, frag, 0); | 281 | chunk = sctp_make_datafrag_empty(asoc, sinfo, len, frag, 0); |
| 282 | 282 | ||
| 283 | if (!chunk) | 283 | if (!chunk) { |
| 284 | err = -ENOMEM; | ||
| 284 | goto errout; | 285 | goto errout; |
| 286 | } | ||
| 287 | |||
| 285 | err = sctp_user_addto_chunk(chunk, offset, len, msgh->msg_iov); | 288 | err = sctp_user_addto_chunk(chunk, offset, len, msgh->msg_iov); |
| 286 | if (err < 0) | 289 | if (err < 0) |
| 287 | goto errout; | 290 | goto errout_chunk_free; |
| 288 | 291 | ||
| 289 | offset += len; | 292 | offset += len; |
| 290 | 293 | ||
| @@ -315,8 +318,10 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, | |||
| 315 | 318 | ||
| 316 | chunk = sctp_make_datafrag_empty(asoc, sinfo, over, frag, 0); | 319 | chunk = sctp_make_datafrag_empty(asoc, sinfo, over, frag, 0); |
| 317 | 320 | ||
| 318 | if (!chunk) | 321 | if (!chunk) { |
| 322 | err = -ENOMEM; | ||
| 319 | goto errout; | 323 | goto errout; |
| 324 | } | ||
| 320 | 325 | ||
| 321 | err = sctp_user_addto_chunk(chunk, offset, over,msgh->msg_iov); | 326 | err = sctp_user_addto_chunk(chunk, offset, over,msgh->msg_iov); |
| 322 | 327 | ||
| @@ -324,7 +329,7 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, | |||
| 324 | __skb_pull(chunk->skb, (__u8 *)chunk->chunk_hdr | 329 | __skb_pull(chunk->skb, (__u8 *)chunk->chunk_hdr |
| 325 | - (__u8 *)chunk->skb->data); | 330 | - (__u8 *)chunk->skb->data); |
| 326 | if (err < 0) | 331 | if (err < 0) |
| 327 | goto errout; | 332 | goto errout_chunk_free; |
| 328 | 333 | ||
| 329 | sctp_datamsg_assign(msg, chunk); | 334 | sctp_datamsg_assign(msg, chunk); |
| 330 | list_add_tail(&chunk->frag_list, &msg->chunks); | 335 | list_add_tail(&chunk->frag_list, &msg->chunks); |
| @@ -332,6 +337,9 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, | |||
| 332 | 337 | ||
| 333 | return msg; | 338 | return msg; |
| 334 | 339 | ||
| 340 | errout_chunk_free: | ||
| 341 | sctp_chunk_free(chunk); | ||
| 342 | |||
| 335 | errout: | 343 | errout: |
| 336 | list_for_each_safe(pos, temp, &msg->chunks) { | 344 | list_for_each_safe(pos, temp, &msg->chunks) { |
| 337 | list_del_init(pos); | 345 | list_del_init(pos); |
| @@ -339,7 +347,7 @@ errout: | |||
| 339 | sctp_chunk_free(chunk); | 347 | sctp_chunk_free(chunk); |
| 340 | } | 348 | } |
| 341 | sctp_datamsg_put(msg); | 349 | sctp_datamsg_put(msg); |
| 342 | return NULL; | 350 | return ERR_PTR(err); |
| 343 | } | 351 | } |
| 344 | 352 | ||
| 345 | /* Check whether this message has expired. */ | 353 | /* Check whether this message has expired. */ |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index a60d1f8b41c5..406d957d08fb 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
| @@ -1915,8 +1915,8 @@ SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 1915 | 1915 | ||
| 1916 | /* Break the message into multiple chunks of maximum size. */ | 1916 | /* Break the message into multiple chunks of maximum size. */ |
| 1917 | datamsg = sctp_datamsg_from_user(asoc, sinfo, msg, msg_len); | 1917 | datamsg = sctp_datamsg_from_user(asoc, sinfo, msg, msg_len); |
| 1918 | if (!datamsg) { | 1918 | if (IS_ERR(datamsg)) { |
| 1919 | err = -ENOMEM; | 1919 | err = PTR_ERR(datamsg); |
| 1920 | goto out_free; | 1920 | goto out_free; |
| 1921 | } | 1921 | } |
| 1922 | 1922 | ||
diff --git a/net/sctp/transport.c b/net/sctp/transport.c index 953c21e4af97..206cf5238fd3 100644 --- a/net/sctp/transport.c +++ b/net/sctp/transport.c | |||
| @@ -331,7 +331,7 @@ void sctp_transport_update_rto(struct sctp_transport *tp, __u32 rtt) | |||
| 331 | * 1/8, rto_alpha would be expressed as 3. | 331 | * 1/8, rto_alpha would be expressed as 3. |
| 332 | */ | 332 | */ |
| 333 | tp->rttvar = tp->rttvar - (tp->rttvar >> net->sctp.rto_beta) | 333 | tp->rttvar = tp->rttvar - (tp->rttvar >> net->sctp.rto_beta) |
| 334 | + ((abs(tp->srtt - rtt)) >> net->sctp.rto_beta); | 334 | + (((__u32)abs64((__s64)tp->srtt - (__s64)rtt)) >> net->sctp.rto_beta); |
| 335 | tp->srtt = tp->srtt - (tp->srtt >> net->sctp.rto_alpha) | 335 | tp->srtt = tp->srtt - (tp->srtt >> net->sctp.rto_alpha) |
| 336 | + (rtt >> net->sctp.rto_alpha); | 336 | + (rtt >> net->sctp.rto_alpha); |
| 337 | } else { | 337 | } else { |
diff --git a/scripts/headers_install.pl b/scripts/headers_install.pl index 239d22d4207b..6c353ae8a451 100644 --- a/scripts/headers_install.pl +++ b/scripts/headers_install.pl | |||
| @@ -42,6 +42,9 @@ foreach my $filename (@files) { | |||
| 42 | $line =~ s/(^|\s)(inline)\b/$1__$2__/g; | 42 | $line =~ s/(^|\s)(inline)\b/$1__$2__/g; |
| 43 | $line =~ s/(^|\s)(asm)\b(\s|[(]|$)/$1__$2__$3/g; | 43 | $line =~ s/(^|\s)(asm)\b(\s|[(]|$)/$1__$2__$3/g; |
| 44 | $line =~ s/(^|\s|[(])(volatile)\b(\s|[(]|$)/$1__$2__$3/g; | 44 | $line =~ s/(^|\s|[(])(volatile)\b(\s|[(]|$)/$1__$2__$3/g; |
| 45 | $line =~ s/#ifndef _UAPI/#ifndef /; | ||
| 46 | $line =~ s/#define _UAPI/#define /; | ||
| 47 | $line =~ s!#endif /[*] _UAPI!#endif /* !; | ||
| 45 | printf {$out} "%s", $line; | 48 | printf {$out} "%s", $line; |
| 46 | } | 49 | } |
| 47 | close $out; | 50 | close $out; |
diff --git a/scripts/sign-file b/scripts/sign-file index 87ca59d36e7e..974a20b661b7 100755 --- a/scripts/sign-file +++ b/scripts/sign-file | |||
| @@ -156,12 +156,12 @@ sub asn1_extract($$@) | |||
| 156 | 156 | ||
| 157 | if ($l == 0x1) { | 157 | if ($l == 0x1) { |
| 158 | $len = unpack("C", substr(${$cursor->[2]}, $cursor->[0], 1)); | 158 | $len = unpack("C", substr(${$cursor->[2]}, $cursor->[0], 1)); |
| 159 | } elsif ($l = 0x2) { | 159 | } elsif ($l == 0x2) { |
| 160 | $len = unpack("n", substr(${$cursor->[2]}, $cursor->[0], 2)); | 160 | $len = unpack("n", substr(${$cursor->[2]}, $cursor->[0], 2)); |
| 161 | } elsif ($l = 0x3) { | 161 | } elsif ($l == 0x3) { |
| 162 | $len = unpack("C", substr(${$cursor->[2]}, $cursor->[0], 1)) << 16; | 162 | $len = unpack("C", substr(${$cursor->[2]}, $cursor->[0], 1)) << 16; |
| 163 | $len = unpack("n", substr(${$cursor->[2]}, $cursor->[0] + 1, 2)); | 163 | $len = unpack("n", substr(${$cursor->[2]}, $cursor->[0] + 1, 2)); |
| 164 | } elsif ($l = 0x4) { | 164 | } elsif ($l == 0x4) { |
| 165 | $len = unpack("N", substr(${$cursor->[2]}, $cursor->[0], 4)); | 165 | $len = unpack("N", substr(${$cursor->[2]}, $cursor->[0], 4)); |
| 166 | } else { | 166 | } else { |
| 167 | die $x509, ": ", $cursor->[0], ": ASN.1 element too long (", $l, ")\n"; | 167 | die $x509, ": ", $cursor->[0], ": ASN.1 element too long (", $l, ")\n"; |
diff --git a/security/selinux/netnode.c b/security/selinux/netnode.c index 28f911cdd7c7..c5454c0477c3 100644 --- a/security/selinux/netnode.c +++ b/security/selinux/netnode.c | |||
| @@ -174,7 +174,8 @@ static void sel_netnode_insert(struct sel_netnode *node) | |||
| 174 | if (sel_netnode_hash[idx].size == SEL_NETNODE_HASH_BKT_LIMIT) { | 174 | if (sel_netnode_hash[idx].size == SEL_NETNODE_HASH_BKT_LIMIT) { |
| 175 | struct sel_netnode *tail; | 175 | struct sel_netnode *tail; |
| 176 | tail = list_entry( | 176 | tail = list_entry( |
| 177 | rcu_dereference(sel_netnode_hash[idx].list.prev), | 177 | rcu_dereference_protected(sel_netnode_hash[idx].list.prev, |
| 178 | lockdep_is_held(&sel_netnode_lock)), | ||
| 178 | struct sel_netnode, list); | 179 | struct sel_netnode, list); |
| 179 | list_del_rcu(&tail->list); | 180 | list_del_rcu(&tail->list); |
| 180 | kfree_rcu(tail, rcu); | 181 | kfree_rcu(tail, rcu); |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index 70d4848b5cd0..d010de12335e 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -95,6 +95,7 @@ int snd_hda_delete_codec_preset(struct hda_codec_preset_list *preset) | |||
| 95 | EXPORT_SYMBOL_HDA(snd_hda_delete_codec_preset); | 95 | EXPORT_SYMBOL_HDA(snd_hda_delete_codec_preset); |
| 96 | 96 | ||
| 97 | #ifdef CONFIG_PM | 97 | #ifdef CONFIG_PM |
| 98 | #define codec_in_pm(codec) ((codec)->in_pm) | ||
| 98 | static void hda_power_work(struct work_struct *work); | 99 | static void hda_power_work(struct work_struct *work); |
| 99 | static void hda_keep_power_on(struct hda_codec *codec); | 100 | static void hda_keep_power_on(struct hda_codec *codec); |
| 100 | #define hda_codec_is_power_on(codec) ((codec)->power_on) | 101 | #define hda_codec_is_power_on(codec) ((codec)->power_on) |
| @@ -104,6 +105,7 @@ static inline void hda_call_pm_notify(struct hda_bus *bus, bool power_up) | |||
| 104 | bus->ops.pm_notify(bus, power_up); | 105 | bus->ops.pm_notify(bus, power_up); |
| 105 | } | 106 | } |
| 106 | #else | 107 | #else |
| 108 | #define codec_in_pm(codec) 0 | ||
| 107 | static inline void hda_keep_power_on(struct hda_codec *codec) {} | 109 | static inline void hda_keep_power_on(struct hda_codec *codec) {} |
| 108 | #define hda_codec_is_power_on(codec) 1 | 110 | #define hda_codec_is_power_on(codec) 1 |
| 109 | #define hda_call_pm_notify(bus, state) {} | 111 | #define hda_call_pm_notify(bus, state) {} |
| @@ -228,7 +230,7 @@ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd, | |||
| 228 | } | 230 | } |
| 229 | mutex_unlock(&bus->cmd_mutex); | 231 | mutex_unlock(&bus->cmd_mutex); |
| 230 | snd_hda_power_down(codec); | 232 | snd_hda_power_down(codec); |
| 231 | if (res && *res == -1 && bus->rirb_error) { | 233 | if (!codec_in_pm(codec) && res && *res == -1 && bus->rirb_error) { |
| 232 | if (bus->response_reset) { | 234 | if (bus->response_reset) { |
| 233 | snd_printd("hda_codec: resetting BUS due to " | 235 | snd_printd("hda_codec: resetting BUS due to " |
| 234 | "fatal communication error\n"); | 236 | "fatal communication error\n"); |
| @@ -238,7 +240,7 @@ static int codec_exec_verb(struct hda_codec *codec, unsigned int cmd, | |||
| 238 | goto again; | 240 | goto again; |
| 239 | } | 241 | } |
| 240 | /* clear reset-flag when the communication gets recovered */ | 242 | /* clear reset-flag when the communication gets recovered */ |
| 241 | if (!err) | 243 | if (!err || codec_in_pm(codec)) |
| 242 | bus->response_reset = 0; | 244 | bus->response_reset = 0; |
| 243 | return err; | 245 | return err; |
| 244 | } | 246 | } |
| @@ -3616,6 +3618,8 @@ static unsigned int hda_call_codec_suspend(struct hda_codec *codec, bool in_wq) | |||
| 3616 | { | 3618 | { |
| 3617 | unsigned int state; | 3619 | unsigned int state; |
| 3618 | 3620 | ||
| 3621 | codec->in_pm = 1; | ||
| 3622 | |||
| 3619 | if (codec->patch_ops.suspend) | 3623 | if (codec->patch_ops.suspend) |
| 3620 | codec->patch_ops.suspend(codec); | 3624 | codec->patch_ops.suspend(codec); |
| 3621 | hda_cleanup_all_streams(codec); | 3625 | hda_cleanup_all_streams(codec); |
| @@ -3630,6 +3634,7 @@ static unsigned int hda_call_codec_suspend(struct hda_codec *codec, bool in_wq) | |||
| 3630 | codec->power_transition = 0; | 3634 | codec->power_transition = 0; |
| 3631 | codec->power_jiffies = jiffies; | 3635 | codec->power_jiffies = jiffies; |
| 3632 | spin_unlock(&codec->power_lock); | 3636 | spin_unlock(&codec->power_lock); |
| 3637 | codec->in_pm = 0; | ||
| 3633 | return state; | 3638 | return state; |
| 3634 | } | 3639 | } |
| 3635 | 3640 | ||
| @@ -3638,6 +3643,8 @@ static unsigned int hda_call_codec_suspend(struct hda_codec *codec, bool in_wq) | |||
| 3638 | */ | 3643 | */ |
| 3639 | static void hda_call_codec_resume(struct hda_codec *codec) | 3644 | static void hda_call_codec_resume(struct hda_codec *codec) |
| 3640 | { | 3645 | { |
| 3646 | codec->in_pm = 1; | ||
| 3647 | |||
| 3641 | /* set as if powered on for avoiding re-entering the resume | 3648 | /* set as if powered on for avoiding re-entering the resume |
| 3642 | * in the resume / power-save sequence | 3649 | * in the resume / power-save sequence |
| 3643 | */ | 3650 | */ |
| @@ -3656,6 +3663,8 @@ static void hda_call_codec_resume(struct hda_codec *codec) | |||
| 3656 | snd_hda_codec_resume_cache(codec); | 3663 | snd_hda_codec_resume_cache(codec); |
| 3657 | } | 3664 | } |
| 3658 | snd_hda_jack_report_sync(codec); | 3665 | snd_hda_jack_report_sync(codec); |
| 3666 | |||
| 3667 | codec->in_pm = 0; | ||
| 3659 | snd_hda_power_down(codec); /* flag down before returning */ | 3668 | snd_hda_power_down(codec); /* flag down before returning */ |
| 3660 | } | 3669 | } |
| 3661 | #endif /* CONFIG_PM */ | 3670 | #endif /* CONFIG_PM */ |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 507fe8a917b6..4f4e545c0f4b 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
| @@ -869,6 +869,7 @@ struct hda_codec { | |||
| 869 | unsigned int power_on :1; /* current (global) power-state */ | 869 | unsigned int power_on :1; /* current (global) power-state */ |
| 870 | unsigned int d3_stop_clk:1; /* support D3 operation without BCLK */ | 870 | unsigned int d3_stop_clk:1; /* support D3 operation without BCLK */ |
| 871 | unsigned int pm_down_notified:1; /* PM notified to controller */ | 871 | unsigned int pm_down_notified:1; /* PM notified to controller */ |
| 872 | unsigned int in_pm:1; /* suspend/resume being performed */ | ||
| 872 | int power_transition; /* power-state in transition */ | 873 | int power_transition; /* power-state in transition */ |
| 873 | int power_count; /* current (global) power refcount */ | 874 | int power_count; /* current (global) power refcount */ |
| 874 | struct delayed_work power_work; /* delayed task for powerdown */ | 875 | struct delayed_work power_work; /* delayed task for powerdown */ |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index cd2dbaf1be78..f9d870e554d9 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -556,6 +556,12 @@ enum { | |||
| 556 | #define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */ | 556 | #define AZX_DCAPS_ALIGN_BUFSIZE (1 << 22) /* buffer size alignment */ |
| 557 | #define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */ | 557 | #define AZX_DCAPS_4K_BDLE_BOUNDARY (1 << 23) /* BDLE in 4k boundary */ |
| 558 | #define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */ | 558 | #define AZX_DCAPS_COUNT_LPIB_DELAY (1 << 25) /* Take LPIB as delay */ |
| 559 | #define AZX_DCAPS_PM_RUNTIME (1 << 26) /* runtime PM support */ | ||
| 560 | |||
| 561 | /* quirks for Intel PCH */ | ||
| 562 | #define AZX_DCAPS_INTEL_PCH \ | ||
| 563 | (AZX_DCAPS_SCH_SNOOP | AZX_DCAPS_BUFSIZE | \ | ||
| 564 | AZX_DCAPS_COUNT_LPIB_DELAY | AZX_DCAPS_PM_RUNTIME) | ||
| 559 | 565 | ||
| 560 | /* quirks for ATI SB / AMD Hudson */ | 566 | /* quirks for ATI SB / AMD Hudson */ |
| 561 | #define AZX_DCAPS_PRESET_ATI_SB \ | 567 | #define AZX_DCAPS_PRESET_ATI_SB \ |
| @@ -2433,6 +2439,9 @@ static void azx_power_notify(struct hda_bus *bus, bool power_up) | |||
| 2433 | { | 2439 | { |
| 2434 | struct azx *chip = bus->private_data; | 2440 | struct azx *chip = bus->private_data; |
| 2435 | 2441 | ||
| 2442 | if (!(chip->driver_caps & AZX_DCAPS_PM_RUNTIME)) | ||
| 2443 | return; | ||
| 2444 | |||
| 2436 | if (power_up) | 2445 | if (power_up) |
| 2437 | pm_runtime_get_sync(&chip->pci->dev); | 2446 | pm_runtime_get_sync(&chip->pci->dev); |
| 2438 | else | 2447 | else |
| @@ -2548,7 +2557,8 @@ static int azx_runtime_suspend(struct device *dev) | |||
| 2548 | struct snd_card *card = dev_get_drvdata(dev); | 2557 | struct snd_card *card = dev_get_drvdata(dev); |
| 2549 | struct azx *chip = card->private_data; | 2558 | struct azx *chip = card->private_data; |
| 2550 | 2559 | ||
| 2551 | if (!power_save_controller) | 2560 | if (!power_save_controller || |
| 2561 | !(chip->driver_caps & AZX_DCAPS_PM_RUNTIME)) | ||
| 2552 | return -EAGAIN; | 2562 | return -EAGAIN; |
| 2553 | 2563 | ||
| 2554 | azx_stop_chip(chip); | 2564 | azx_stop_chip(chip); |
| @@ -3429,39 +3439,30 @@ static void __devexit azx_remove(struct pci_dev *pci) | |||
| 3429 | static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | 3439 | static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { |
| 3430 | /* CPT */ | 3440 | /* CPT */ |
| 3431 | { PCI_DEVICE(0x8086, 0x1c20), | 3441 | { PCI_DEVICE(0x8086, 0x1c20), |
| 3432 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | 3442 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
| 3433 | AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
| 3434 | /* PBG */ | 3443 | /* PBG */ |
| 3435 | { PCI_DEVICE(0x8086, 0x1d20), | 3444 | { PCI_DEVICE(0x8086, 0x1d20), |
| 3436 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | 3445 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
| 3437 | AZX_DCAPS_BUFSIZE}, | ||
| 3438 | /* Panther Point */ | 3446 | /* Panther Point */ |
| 3439 | { PCI_DEVICE(0x8086, 0x1e20), | 3447 | { PCI_DEVICE(0x8086, 0x1e20), |
| 3440 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | 3448 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
| 3441 | AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
| 3442 | /* Lynx Point */ | 3449 | /* Lynx Point */ |
| 3443 | { PCI_DEVICE(0x8086, 0x8c20), | 3450 | { PCI_DEVICE(0x8086, 0x8c20), |
| 3444 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | 3451 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
| 3445 | AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
| 3446 | /* Lynx Point-LP */ | 3452 | /* Lynx Point-LP */ |
| 3447 | { PCI_DEVICE(0x8086, 0x9c20), | 3453 | { PCI_DEVICE(0x8086, 0x9c20), |
| 3448 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | 3454 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
| 3449 | AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
| 3450 | /* Lynx Point-LP */ | 3455 | /* Lynx Point-LP */ |
| 3451 | { PCI_DEVICE(0x8086, 0x9c21), | 3456 | { PCI_DEVICE(0x8086, 0x9c21), |
| 3452 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP | | 3457 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
| 3453 | AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
| 3454 | /* Haswell */ | 3458 | /* Haswell */ |
| 3455 | { PCI_DEVICE(0x8086, 0x0c0c), | 3459 | { PCI_DEVICE(0x8086, 0x0c0c), |
| 3456 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | | 3460 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH }, |
| 3457 | AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
| 3458 | { PCI_DEVICE(0x8086, 0x0d0c), | 3461 | { PCI_DEVICE(0x8086, 0x0d0c), |
| 3459 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | | 3462 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH }, |
| 3460 | AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
| 3461 | /* 5 Series/3400 */ | 3463 | /* 5 Series/3400 */ |
| 3462 | { PCI_DEVICE(0x8086, 0x3b56), | 3464 | { PCI_DEVICE(0x8086, 0x3b56), |
| 3463 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | | 3465 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_INTEL_PCH }, |
| 3464 | AZX_DCAPS_BUFSIZE | AZX_DCAPS_COUNT_LPIB_DELAY }, | ||
| 3465 | /* SCH */ | 3466 | /* SCH */ |
| 3466 | { PCI_DEVICE(0x8086, 0x811b), | 3467 | { PCI_DEVICE(0x8086, 0x811b), |
| 3467 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | | 3468 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP | |
diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c index d5f3a26d608d..3bcb67172358 100644 --- a/sound/pci/hda/patch_cirrus.c +++ b/sound/pci/hda/patch_cirrus.c | |||
| @@ -466,6 +466,7 @@ static int parse_output(struct hda_codec *codec) | |||
| 466 | memcpy(cfg->speaker_pins, cfg->line_out_pins, | 466 | memcpy(cfg->speaker_pins, cfg->line_out_pins, |
| 467 | sizeof(cfg->speaker_pins)); | 467 | sizeof(cfg->speaker_pins)); |
| 468 | cfg->line_outs = 0; | 468 | cfg->line_outs = 0; |
| 469 | memset(cfg->line_out_pins, 0, sizeof(cfg->line_out_pins)); | ||
| 469 | } | 470 | } |
| 470 | 471 | ||
| 471 | return 0; | 472 | return 0; |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 68fd49294b26..ad68d223f8af 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -7065,6 +7065,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { | |||
| 7065 | { .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 }, | 7065 | { .id = 0x10ec0282, .name = "ALC282", .patch = patch_alc269 }, |
| 7066 | { .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 }, | 7066 | { .id = 0x10ec0283, .name = "ALC283", .patch = patch_alc269 }, |
| 7067 | { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, | 7067 | { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, |
| 7068 | { .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 }, | ||
| 7068 | { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", | 7069 | { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", |
| 7069 | .patch = patch_alc861 }, | 7070 | .patch = patch_alc861 }, |
| 7070 | { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, | 7071 | { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, |
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c index c03b65af3059..054967d8bac2 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c | |||
| @@ -268,7 +268,7 @@ EXPORT_SYMBOL_GPL(arizona_out_ev); | |||
| 268 | static unsigned int arizona_sysclk_48k_rates[] = { | 268 | static unsigned int arizona_sysclk_48k_rates[] = { |
| 269 | 6144000, | 269 | 6144000, |
| 270 | 12288000, | 270 | 12288000, |
| 271 | 22579200, | 271 | 24576000, |
| 272 | 49152000, | 272 | 49152000, |
| 273 | 73728000, | 273 | 73728000, |
| 274 | 98304000, | 274 | 98304000, |
| @@ -278,7 +278,7 @@ static unsigned int arizona_sysclk_48k_rates[] = { | |||
| 278 | static unsigned int arizona_sysclk_44k1_rates[] = { | 278 | static unsigned int arizona_sysclk_44k1_rates[] = { |
| 279 | 5644800, | 279 | 5644800, |
| 280 | 11289600, | 280 | 11289600, |
| 281 | 24576000, | 281 | 22579200, |
| 282 | 45158400, | 282 | 45158400, |
| 283 | 67737600, | 283 | 67737600, |
| 284 | 90316800, | 284 | 90316800, |
diff --git a/sound/soc/codecs/cs4271.c b/sound/soc/codecs/cs4271.c index f994af34f552..e3f0a7f3131e 100644 --- a/sound/soc/codecs/cs4271.c +++ b/sound/soc/codecs/cs4271.c | |||
| @@ -485,7 +485,7 @@ static int cs4271_probe(struct snd_soc_codec *codec) | |||
| 485 | gpio_nreset = cs4271plat->gpio_nreset; | 485 | gpio_nreset = cs4271plat->gpio_nreset; |
| 486 | 486 | ||
| 487 | if (gpio_nreset >= 0) | 487 | if (gpio_nreset >= 0) |
| 488 | if (gpio_request(gpio_nreset, "CS4271 Reset")) | 488 | if (devm_gpio_request(codec->dev, gpio_nreset, "CS4271 Reset")) |
| 489 | gpio_nreset = -EINVAL; | 489 | gpio_nreset = -EINVAL; |
| 490 | if (gpio_nreset >= 0) { | 490 | if (gpio_nreset >= 0) { |
| 491 | /* Reset codec */ | 491 | /* Reset codec */ |
| @@ -535,15 +535,10 @@ static int cs4271_probe(struct snd_soc_codec *codec) | |||
| 535 | static int cs4271_remove(struct snd_soc_codec *codec) | 535 | static int cs4271_remove(struct snd_soc_codec *codec) |
| 536 | { | 536 | { |
| 537 | struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); | 537 | struct cs4271_private *cs4271 = snd_soc_codec_get_drvdata(codec); |
| 538 | int gpio_nreset; | ||
| 539 | 538 | ||
| 540 | gpio_nreset = cs4271->gpio_nreset; | 539 | if (gpio_is_valid(cs4271->gpio_nreset)) |
| 541 | |||
| 542 | if (gpio_is_valid(gpio_nreset)) { | ||
| 543 | /* Set codec to the reset state */ | 540 | /* Set codec to the reset state */ |
| 544 | gpio_set_value(gpio_nreset, 0); | 541 | gpio_set_value(cs4271->gpio_nreset, 0); |
| 545 | gpio_free(gpio_nreset); | ||
| 546 | } | ||
| 547 | 542 | ||
| 548 | return 0; | 543 | return 0; |
| 549 | }; | 544 | }; |
diff --git a/sound/soc/kirkwood/kirkwood-dma.c b/sound/soc/kirkwood/kirkwood-dma.c index b9f16598324c..2ba08148655f 100644 --- a/sound/soc/kirkwood/kirkwood-dma.c +++ b/sound/soc/kirkwood/kirkwood-dma.c | |||
| @@ -71,7 +71,6 @@ static irqreturn_t kirkwood_dma_irq(int irq, void *dev_id) | |||
| 71 | printk(KERN_WARNING "%s: got err interrupt 0x%lx\n", | 71 | printk(KERN_WARNING "%s: got err interrupt 0x%lx\n", |
| 72 | __func__, cause); | 72 | __func__, cause); |
| 73 | writel(cause, priv->io + KIRKWOOD_ERR_CAUSE); | 73 | writel(cause, priv->io + KIRKWOOD_ERR_CAUSE); |
| 74 | return IRQ_HANDLED; | ||
| 75 | } | 74 | } |
| 76 | 75 | ||
| 77 | /* we've enabled only bytes interrupts ... */ | 76 | /* we've enabled only bytes interrupts ... */ |
| @@ -178,7 +177,7 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream) | |||
| 178 | } | 177 | } |
| 179 | 178 | ||
| 180 | dram = mv_mbus_dram_info(); | 179 | dram = mv_mbus_dram_info(); |
| 181 | addr = virt_to_phys(substream->dma_buffer.area); | 180 | addr = substream->dma_buffer.addr; |
| 182 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 181 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| 183 | prdata->play_stream = substream; | 182 | prdata->play_stream = substream; |
| 184 | kirkwood_dma_conf_mbus_windows(priv->io, | 183 | kirkwood_dma_conf_mbus_windows(priv->io, |
diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c index 542538d10ab7..1d5db484d2df 100644 --- a/sound/soc/kirkwood/kirkwood-i2s.c +++ b/sound/soc/kirkwood/kirkwood-i2s.c | |||
| @@ -95,7 +95,7 @@ static inline void kirkwood_set_dco(void __iomem *io, unsigned long rate) | |||
| 95 | do { | 95 | do { |
| 96 | cpu_relax(); | 96 | cpu_relax(); |
| 97 | value = readl(io + KIRKWOOD_DCO_SPCR_STATUS); | 97 | value = readl(io + KIRKWOOD_DCO_SPCR_STATUS); |
| 98 | value &= KIRKWOOD_DCO_SPCR_STATUS; | 98 | value &= KIRKWOOD_DCO_SPCR_STATUS_DCO_LOCK; |
| 99 | } while (value == 0); | 99 | } while (value == 0); |
| 100 | } | 100 | } |
| 101 | 101 | ||
| @@ -180,67 +180,72 @@ static int kirkwood_i2s_play_trigger(struct snd_pcm_substream *substream, | |||
| 180 | int cmd, struct snd_soc_dai *dai) | 180 | int cmd, struct snd_soc_dai *dai) |
| 181 | { | 181 | { |
| 182 | struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai); | 182 | struct kirkwood_dma_data *priv = snd_soc_dai_get_drvdata(dai); |
| 183 | unsigned long value; | 183 | uint32_t ctl, value; |
| 184 | 184 | ||
| 185 | /* | 185 | ctl = readl(priv->io + KIRKWOOD_PLAYCTL); |
| 186 | * specs says KIRKWOOD_PLAYCTL must be read 2 times before | 186 | if (ctl & KIRKWOOD_PLAYCTL_PAUSE) { |
| 187 | * changing it. So read 1 time here and 1 later. | 187 | unsigned timeout = 5000; |
| 188 | */ | 188 | /* |
| 189 | value = readl(priv->io + KIRKWOOD_PLAYCTL); | 189 | * The Armada510 spec says that if we enter pause mode, the |
| 190 | * busy bit must be read back as clear _twice_. Make sure | ||
| 191 | * we respect that otherwise we get DMA underruns. | ||
| 192 | */ | ||
| 193 | do { | ||
| 194 | value = ctl; | ||
| 195 | ctl = readl(priv->io + KIRKWOOD_PLAYCTL); | ||
| 196 | if (!((ctl | value) & KIRKWOOD_PLAYCTL_PLAY_BUSY)) | ||
| 197 | break; | ||
| 198 | udelay(1); | ||
| 199 | } while (timeout--); | ||
| 200 | |||
| 201 | if ((ctl | value) & KIRKWOOD_PLAYCTL_PLAY_BUSY) | ||
| 202 | dev_notice(dai->dev, "timed out waiting for busy to deassert: %08x\n", | ||
| 203 | ctl); | ||
| 204 | } | ||
| 190 | 205 | ||
| 191 | switch (cmd) { | 206 | switch (cmd) { |
| 192 | case SNDRV_PCM_TRIGGER_START: | 207 | case SNDRV_PCM_TRIGGER_START: |
| 193 | /* stop audio, enable interrupts */ | ||
| 194 | value = readl(priv->io + KIRKWOOD_PLAYCTL); | ||
| 195 | value |= KIRKWOOD_PLAYCTL_PAUSE; | ||
| 196 | writel(value, priv->io + KIRKWOOD_PLAYCTL); | ||
| 197 | |||
| 198 | value = readl(priv->io + KIRKWOOD_INT_MASK); | 208 | value = readl(priv->io + KIRKWOOD_INT_MASK); |
| 199 | value |= KIRKWOOD_INT_CAUSE_PLAY_BYTES; | 209 | value |= KIRKWOOD_INT_CAUSE_PLAY_BYTES; |
| 200 | writel(value, priv->io + KIRKWOOD_INT_MASK); | 210 | writel(value, priv->io + KIRKWOOD_INT_MASK); |
| 201 | 211 | ||
| 202 | /* configure audio & enable i2s playback */ | 212 | /* configure audio & enable i2s playback */ |
| 203 | value = readl(priv->io + KIRKWOOD_PLAYCTL); | 213 | ctl &= ~KIRKWOOD_PLAYCTL_BURST_MASK; |
| 204 | value &= ~KIRKWOOD_PLAYCTL_BURST_MASK; | 214 | ctl &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE |
| 205 | value &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE | ||
| 206 | | KIRKWOOD_PLAYCTL_SPDIF_EN); | 215 | | KIRKWOOD_PLAYCTL_SPDIF_EN); |
| 207 | 216 | ||
| 208 | if (priv->burst == 32) | 217 | if (priv->burst == 32) |
| 209 | value |= KIRKWOOD_PLAYCTL_BURST_32; | 218 | ctl |= KIRKWOOD_PLAYCTL_BURST_32; |
| 210 | else | 219 | else |
| 211 | value |= KIRKWOOD_PLAYCTL_BURST_128; | 220 | ctl |= KIRKWOOD_PLAYCTL_BURST_128; |
| 212 | value |= KIRKWOOD_PLAYCTL_I2S_EN; | 221 | ctl |= KIRKWOOD_PLAYCTL_I2S_EN; |
| 213 | writel(value, priv->io + KIRKWOOD_PLAYCTL); | 222 | writel(ctl, priv->io + KIRKWOOD_PLAYCTL); |
| 214 | break; | 223 | break; |
| 215 | 224 | ||
| 216 | case SNDRV_PCM_TRIGGER_STOP: | 225 | case SNDRV_PCM_TRIGGER_STOP: |
| 217 | /* stop audio, disable interrupts */ | 226 | /* stop audio, disable interrupts */ |
| 218 | value = readl(priv->io + KIRKWOOD_PLAYCTL); | 227 | ctl |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; |
| 219 | value |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; | 228 | writel(ctl, priv->io + KIRKWOOD_PLAYCTL); |
| 220 | writel(value, priv->io + KIRKWOOD_PLAYCTL); | ||
| 221 | 229 | ||
| 222 | value = readl(priv->io + KIRKWOOD_INT_MASK); | 230 | value = readl(priv->io + KIRKWOOD_INT_MASK); |
| 223 | value &= ~KIRKWOOD_INT_CAUSE_PLAY_BYTES; | 231 | value &= ~KIRKWOOD_INT_CAUSE_PLAY_BYTES; |
| 224 | writel(value, priv->io + KIRKWOOD_INT_MASK); | 232 | writel(value, priv->io + KIRKWOOD_INT_MASK); |
| 225 | 233 | ||
| 226 | /* disable all playbacks */ | 234 | /* disable all playbacks */ |
| 227 | value = readl(priv->io + KIRKWOOD_PLAYCTL); | 235 | ctl &= ~(KIRKWOOD_PLAYCTL_I2S_EN | KIRKWOOD_PLAYCTL_SPDIF_EN); |
| 228 | value &= ~(KIRKWOOD_PLAYCTL_I2S_EN | KIRKWOOD_PLAYCTL_SPDIF_EN); | 236 | writel(ctl, priv->io + KIRKWOOD_PLAYCTL); |
| 229 | writel(value, priv->io + KIRKWOOD_PLAYCTL); | ||
| 230 | break; | 237 | break; |
| 231 | 238 | ||
| 232 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | 239 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: |
| 233 | case SNDRV_PCM_TRIGGER_SUSPEND: | 240 | case SNDRV_PCM_TRIGGER_SUSPEND: |
| 234 | value = readl(priv->io + KIRKWOOD_PLAYCTL); | 241 | ctl |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; |
| 235 | value |= KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE; | 242 | writel(ctl, priv->io + KIRKWOOD_PLAYCTL); |
| 236 | writel(value, priv->io + KIRKWOOD_PLAYCTL); | ||
| 237 | break; | 243 | break; |
| 238 | 244 | ||
| 239 | case SNDRV_PCM_TRIGGER_RESUME: | 245 | case SNDRV_PCM_TRIGGER_RESUME: |
| 240 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | 246 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
| 241 | value = readl(priv->io + KIRKWOOD_PLAYCTL); | 247 | ctl &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE); |
| 242 | value &= ~(KIRKWOOD_PLAYCTL_PAUSE | KIRKWOOD_PLAYCTL_I2S_MUTE); | 248 | writel(ctl, priv->io + KIRKWOOD_PLAYCTL); |
| 243 | writel(value, priv->io + KIRKWOOD_PLAYCTL); | ||
| 244 | break; | 249 | break; |
| 245 | 250 | ||
| 246 | default: | 251 | default: |
| @@ -260,11 +265,6 @@ static int kirkwood_i2s_rec_trigger(struct snd_pcm_substream *substream, | |||
| 260 | 265 | ||
| 261 | switch (cmd) { | 266 | switch (cmd) { |
| 262 | case SNDRV_PCM_TRIGGER_START: | 267 | case SNDRV_PCM_TRIGGER_START: |
| 263 | /* stop audio, enable interrupts */ | ||
| 264 | value = readl(priv->io + KIRKWOOD_RECCTL); | ||
| 265 | value |= KIRKWOOD_RECCTL_PAUSE; | ||
| 266 | writel(value, priv->io + KIRKWOOD_RECCTL); | ||
| 267 | |||
| 268 | value = readl(priv->io + KIRKWOOD_INT_MASK); | 268 | value = readl(priv->io + KIRKWOOD_INT_MASK); |
| 269 | value |= KIRKWOOD_INT_CAUSE_REC_BYTES; | 269 | value |= KIRKWOOD_INT_CAUSE_REC_BYTES; |
| 270 | writel(value, priv->io + KIRKWOOD_INT_MASK); | 270 | writel(value, priv->io + KIRKWOOD_INT_MASK); |
diff --git a/sound/soc/samsung/bells.c b/sound/soc/samsung/bells.c index b56b9a3c6169..a2ca1567b9e4 100644 --- a/sound/soc/samsung/bells.c +++ b/sound/soc/samsung/bells.c | |||
| @@ -212,7 +212,7 @@ static struct snd_soc_dai_link bells_dai_wm5102[] = { | |||
| 212 | { | 212 | { |
| 213 | .name = "Sub", | 213 | .name = "Sub", |
| 214 | .stream_name = "Sub", | 214 | .stream_name = "Sub", |
| 215 | .cpu_dai_name = "wm5110-aif3", | 215 | .cpu_dai_name = "wm5102-aif3", |
| 216 | .codec_dai_name = "wm9081-hifi", | 216 | .codec_dai_name = "wm9081-hifi", |
| 217 | .codec_name = "wm9081.1-006c", | 217 | .codec_name = "wm9081.1-006c", |
| 218 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 218 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
| @@ -247,7 +247,7 @@ static struct snd_soc_dai_link bells_dai_wm5110[] = { | |||
| 247 | { | 247 | { |
| 248 | .name = "Sub", | 248 | .name = "Sub", |
| 249 | .stream_name = "Sub", | 249 | .stream_name = "Sub", |
| 250 | .cpu_dai_name = "wm5102-aif3", | 250 | .cpu_dai_name = "wm5110-aif3", |
| 251 | .codec_dai_name = "wm9081-hifi", | 251 | .codec_dai_name = "wm9081-hifi", |
| 252 | .codec_name = "wm9081.1-006c", | 252 | .codec_name = "wm9081.1-006c", |
| 253 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | 253 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
diff --git a/sound/usb/midi.c b/sound/usb/midi.c index c83f6143c0eb..eeefbce3873c 100644 --- a/sound/usb/midi.c +++ b/sound/usb/midi.c | |||
| @@ -148,6 +148,7 @@ struct snd_usb_midi_out_endpoint { | |||
| 148 | struct snd_usb_midi_out_endpoint* ep; | 148 | struct snd_usb_midi_out_endpoint* ep; |
| 149 | struct snd_rawmidi_substream *substream; | 149 | struct snd_rawmidi_substream *substream; |
| 150 | int active; | 150 | int active; |
| 151 | bool autopm_reference; | ||
| 151 | uint8_t cable; /* cable number << 4 */ | 152 | uint8_t cable; /* cable number << 4 */ |
| 152 | uint8_t state; | 153 | uint8_t state; |
| 153 | #define STATE_UNKNOWN 0 | 154 | #define STATE_UNKNOWN 0 |
| @@ -1076,7 +1077,8 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream) | |||
| 1076 | return -ENXIO; | 1077 | return -ENXIO; |
| 1077 | } | 1078 | } |
| 1078 | err = usb_autopm_get_interface(umidi->iface); | 1079 | err = usb_autopm_get_interface(umidi->iface); |
| 1079 | if (err < 0) | 1080 | port->autopm_reference = err >= 0; |
| 1081 | if (err < 0 && err != -EACCES) | ||
| 1080 | return -EIO; | 1082 | return -EIO; |
| 1081 | substream->runtime->private_data = port; | 1083 | substream->runtime->private_data = port; |
| 1082 | port->state = STATE_UNKNOWN; | 1084 | port->state = STATE_UNKNOWN; |
| @@ -1087,9 +1089,11 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream) | |||
| 1087 | static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream) | 1089 | static int snd_usbmidi_output_close(struct snd_rawmidi_substream *substream) |
| 1088 | { | 1090 | { |
| 1089 | struct snd_usb_midi* umidi = substream->rmidi->private_data; | 1091 | struct snd_usb_midi* umidi = substream->rmidi->private_data; |
| 1092 | struct usbmidi_out_port *port = substream->runtime->private_data; | ||
| 1090 | 1093 | ||
| 1091 | substream_open(substream, 0); | 1094 | substream_open(substream, 0); |
| 1092 | usb_autopm_put_interface(umidi->iface); | 1095 | if (port->autopm_reference) |
| 1096 | usb_autopm_put_interface(umidi->iface); | ||
| 1093 | return 0; | 1097 | return 0; |
| 1094 | } | 1098 | } |
| 1095 | 1099 | ||
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 5c12a3fe8c3e..ef6fa24fc473 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c | |||
| @@ -459,7 +459,7 @@ static int configure_endpoint(struct snd_usb_substream *subs) | |||
| 459 | return ret; | 459 | return ret; |
| 460 | 460 | ||
| 461 | if (subs->sync_endpoint) | 461 | if (subs->sync_endpoint) |
| 462 | ret = snd_usb_endpoint_set_params(subs->data_endpoint, | 462 | ret = snd_usb_endpoint_set_params(subs->sync_endpoint, |
| 463 | subs->pcm_format, | 463 | subs->pcm_format, |
| 464 | subs->channels, | 464 | subs->channels, |
| 465 | subs->period_bytes, | 465 | subs->period_bytes, |
diff --git a/tools/Makefile b/tools/Makefile index 3ae43947a171..1f9a529fe544 100644 --- a/tools/Makefile +++ b/tools/Makefile | |||
| @@ -31,44 +31,44 @@ help: | |||
| 31 | @echo ' clean: a summary clean target to clean _all_ folders' | 31 | @echo ' clean: a summary clean target to clean _all_ folders' |
| 32 | 32 | ||
| 33 | cpupower: FORCE | 33 | cpupower: FORCE |
| 34 | $(QUIET_SUBDIR0)power/$@/ $(QUIET_SUBDIR1) | 34 | $(call descend,power/$@) |
| 35 | 35 | ||
| 36 | firewire lguest perf usb virtio vm: FORCE | 36 | firewire lguest perf usb virtio vm: FORCE |
| 37 | $(QUIET_SUBDIR0)$@/ $(QUIET_SUBDIR1) | 37 | $(call descend,$@) |
| 38 | 38 | ||
| 39 | selftests: FORCE | 39 | selftests: FORCE |
| 40 | $(QUIET_SUBDIR0)testing/$@/ $(QUIET_SUBDIR1) | 40 | $(call descend,testing/$@) |
| 41 | 41 | ||
| 42 | turbostat x86_energy_perf_policy: FORCE | 42 | turbostat x86_energy_perf_policy: FORCE |
| 43 | $(QUIET_SUBDIR0)power/x86/$@/ $(QUIET_SUBDIR1) | 43 | $(call descend,power/x86/$@) |
| 44 | 44 | ||
| 45 | cpupower_install: | 45 | cpupower_install: |
| 46 | $(QUIET_SUBDIR0)power/$(@:_install=)/ $(QUIET_SUBDIR1) install | 46 | $(call descend,power/$(@:_install=),install) |
| 47 | 47 | ||
| 48 | firewire_install lguest_install perf_install usb_install virtio_install vm_install: | 48 | firewire_install lguest_install perf_install usb_install virtio_install vm_install: |
| 49 | $(QUIET_SUBDIR0)$(@:_install=)/ $(QUIET_SUBDIR1) install | 49 | $(call descend,$(@:_install=),install) |
| 50 | 50 | ||
| 51 | selftests_install: | 51 | selftests_install: |
| 52 | $(QUIET_SUBDIR0)testing/$(@:_clean=)/ $(QUIET_SUBDIR1) install | 52 | $(call descend,testing/$(@:_clean=),install) |
| 53 | 53 | ||
| 54 | turbostat_install x86_energy_perf_policy_install: | 54 | turbostat_install x86_energy_perf_policy_install: |
| 55 | $(QUIET_SUBDIR0)power/x86/$(@:_install=)/ $(QUIET_SUBDIR1) install | 55 | $(call descend,power/x86/$(@:_install=),install) |
| 56 | 56 | ||
| 57 | install: cpupower_install firewire_install lguest_install perf_install \ | 57 | install: cpupower_install firewire_install lguest_install perf_install \ |
| 58 | selftests_install turbostat_install usb_install virtio_install \ | 58 | selftests_install turbostat_install usb_install virtio_install \ |
| 59 | vm_install x86_energy_perf_policy_install | 59 | vm_install x86_energy_perf_policy_install |
| 60 | 60 | ||
| 61 | cpupower_clean: | 61 | cpupower_clean: |
| 62 | $(QUIET_SUBDIR0)power/cpupower/ $(QUIET_SUBDIR1) clean | 62 | $(call descend,power/cpupower,clean) |
| 63 | 63 | ||
| 64 | firewire_clean lguest_clean perf_clean usb_clean virtio_clean vm_clean: | 64 | firewire_clean lguest_clean perf_clean usb_clean virtio_clean vm_clean: |
| 65 | $(QUIET_SUBDIR0)$(@:_clean=)/ $(QUIET_SUBDIR1) clean | 65 | $(call descend,$(@:_clean=),clean) |
| 66 | 66 | ||
| 67 | selftests_clean: | 67 | selftests_clean: |
| 68 | $(QUIET_SUBDIR0)testing/$(@:_clean=)/ $(QUIET_SUBDIR1) clean | 68 | $(call descend,testing/$(@:_clean=),clean) |
| 69 | 69 | ||
| 70 | turbostat_clean x86_energy_perf_policy_clean: | 70 | turbostat_clean x86_energy_perf_policy_clean: |
| 71 | $(QUIET_SUBDIR0)power/x86/$(@:_clean=)/ $(QUIET_SUBDIR1) clean | 71 | $(call descend,power/x86/$(@:_clean=),clean) |
| 72 | 72 | ||
| 73 | clean: cpupower_clean firewire_clean lguest_clean perf_clean selftests_clean \ | 73 | clean: cpupower_clean firewire_clean lguest_clean perf_clean selftests_clean \ |
| 74 | turbostat_clean usb_clean virtio_clean vm_clean \ | 74 | turbostat_clean usb_clean virtio_clean vm_clean \ |
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 00deed4d6159..0a619af5be43 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
| @@ -169,7 +169,34 @@ endif | |||
| 169 | 169 | ||
| 170 | ### --- END CONFIGURATION SECTION --- | 170 | ### --- END CONFIGURATION SECTION --- |
| 171 | 171 | ||
| 172 | BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include -I$(OUTPUT)util -I$(TRACE_EVENT_DIR) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE | 172 | ifeq ($(srctree),) |
| 173 | srctree := $(patsubst %/,%,$(dir $(shell pwd))) | ||
| 174 | srctree := $(patsubst %/,%,$(dir $(srctree))) | ||
| 175 | #$(info Determined 'srctree' to be $(srctree)) | ||
| 176 | endif | ||
| 177 | |||
| 178 | ifneq ($(objtree),) | ||
| 179 | #$(info Determined 'objtree' to be $(objtree)) | ||
| 180 | endif | ||
| 181 | |||
| 182 | ifneq ($(OUTPUT),) | ||
| 183 | #$(info Determined 'OUTPUT' to be $(OUTPUT)) | ||
| 184 | endif | ||
| 185 | |||
| 186 | BASIC_CFLAGS = \ | ||
| 187 | -Iutil/include \ | ||
| 188 | -Iarch/$(ARCH)/include \ | ||
| 189 | $(if $(objtree),-I$(objtree)/arch/$(ARCH)/include/generated/uapi) \ | ||
| 190 | -I$(srctree)/arch/$(ARCH)/include/uapi \ | ||
| 191 | -I$(srctree)/arch/$(ARCH)/include \ | ||
| 192 | $(if $(objtree),-I$(objtree)/include/generated/uapi) \ | ||
| 193 | -I$(srctree)/include/uapi \ | ||
| 194 | -I$(srctree)/include \ | ||
| 195 | -I$(OUTPUT)util \ | ||
| 196 | -Iutil \ | ||
| 197 | -I. \ | ||
| 198 | -I$(TRACE_EVENT_DIR) \ | ||
| 199 | -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE | ||
| 173 | BASIC_LDFLAGS = | 200 | BASIC_LDFLAGS = |
| 174 | 201 | ||
| 175 | # Guard against environment variables | 202 | # Guard against environment variables |
diff --git a/tools/perf/arch/x86/include/perf_regs.h b/tools/perf/arch/x86/include/perf_regs.h index 46fc9f15c6b3..7fcdcdbee917 100644 --- a/tools/perf/arch/x86/include/perf_regs.h +++ b/tools/perf/arch/x86/include/perf_regs.h | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <stdlib.h> | 4 | #include <stdlib.h> |
| 5 | #include "../../util/types.h" | 5 | #include "../../util/types.h" |
| 6 | #include "../../../../../arch/x86/include/asm/perf_regs.h" | 6 | #include <asm/perf_regs.h> |
| 7 | 7 | ||
| 8 | #ifndef ARCH_X86_64 | 8 | #ifndef ARCH_X86_64 |
| 9 | #define PERF_REGS_MASK ((1ULL << PERF_REG_X86_32_MAX) - 1) | 9 | #define PERF_REGS_MASK ((1ULL << PERF_REG_X86_32_MAX) - 1) |
diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 260abc535b5b..283b4397e397 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c | |||
| @@ -22,9 +22,10 @@ | |||
| 22 | #include <pthread.h> | 22 | #include <pthread.h> |
| 23 | #include <math.h> | 23 | #include <math.h> |
| 24 | 24 | ||
| 25 | #include "../../arch/x86/include/asm/svm.h" | 25 | #if defined(__i386__) || defined(__x86_64__) |
| 26 | #include "../../arch/x86/include/asm/vmx.h" | 26 | #include <asm/svm.h> |
| 27 | #include "../../arch/x86/include/asm/kvm.h" | 27 | #include <asm/vmx.h> |
| 28 | #include <asm/kvm.h> | ||
| 28 | 29 | ||
| 29 | struct event_key { | 30 | struct event_key { |
| 30 | #define INVALID_KEY (~0ULL) | 31 | #define INVALID_KEY (~0ULL) |
| @@ -58,7 +59,7 @@ struct kvm_event_key { | |||
| 58 | }; | 59 | }; |
| 59 | 60 | ||
| 60 | 61 | ||
| 61 | struct perf_kvm; | 62 | struct perf_kvm_stat; |
| 62 | 63 | ||
| 63 | struct kvm_events_ops { | 64 | struct kvm_events_ops { |
| 64 | bool (*is_begin_event)(struct perf_evsel *evsel, | 65 | bool (*is_begin_event)(struct perf_evsel *evsel, |
| @@ -66,7 +67,7 @@ struct kvm_events_ops { | |||
| 66 | struct event_key *key); | 67 | struct event_key *key); |
| 67 | bool (*is_end_event)(struct perf_evsel *evsel, | 68 | bool (*is_end_event)(struct perf_evsel *evsel, |
| 68 | struct perf_sample *sample, struct event_key *key); | 69 | struct perf_sample *sample, struct event_key *key); |
| 69 | void (*decode_key)(struct perf_kvm *kvm, struct event_key *key, | 70 | void (*decode_key)(struct perf_kvm_stat *kvm, struct event_key *key, |
| 70 | char decode[20]); | 71 | char decode[20]); |
| 71 | const char *name; | 72 | const char *name; |
| 72 | }; | 73 | }; |
| @@ -79,7 +80,7 @@ struct exit_reasons_table { | |||
| 79 | #define EVENTS_BITS 12 | 80 | #define EVENTS_BITS 12 |
| 80 | #define EVENTS_CACHE_SIZE (1UL << EVENTS_BITS) | 81 | #define EVENTS_CACHE_SIZE (1UL << EVENTS_BITS) |
| 81 | 82 | ||
| 82 | struct perf_kvm { | 83 | struct perf_kvm_stat { |
| 83 | struct perf_tool tool; | 84 | struct perf_tool tool; |
| 84 | struct perf_session *session; | 85 | struct perf_session *session; |
| 85 | 86 | ||
| @@ -146,7 +147,7 @@ static struct exit_reasons_table svm_exit_reasons[] = { | |||
| 146 | SVM_EXIT_REASONS | 147 | SVM_EXIT_REASONS |
| 147 | }; | 148 | }; |
| 148 | 149 | ||
| 149 | static const char *get_exit_reason(struct perf_kvm *kvm, u64 exit_code) | 150 | static const char *get_exit_reason(struct perf_kvm_stat *kvm, u64 exit_code) |
| 150 | { | 151 | { |
| 151 | int i = kvm->exit_reasons_size; | 152 | int i = kvm->exit_reasons_size; |
| 152 | struct exit_reasons_table *tbl = kvm->exit_reasons; | 153 | struct exit_reasons_table *tbl = kvm->exit_reasons; |
| @@ -162,7 +163,7 @@ static const char *get_exit_reason(struct perf_kvm *kvm, u64 exit_code) | |||
| 162 | return "UNKNOWN"; | 163 | return "UNKNOWN"; |
| 163 | } | 164 | } |
| 164 | 165 | ||
| 165 | static void exit_event_decode_key(struct perf_kvm *kvm, | 166 | static void exit_event_decode_key(struct perf_kvm_stat *kvm, |
| 166 | struct event_key *key, | 167 | struct event_key *key, |
| 167 | char decode[20]) | 168 | char decode[20]) |
| 168 | { | 169 | { |
| @@ -228,7 +229,7 @@ static bool mmio_event_end(struct perf_evsel *evsel, struct perf_sample *sample, | |||
| 228 | return false; | 229 | return false; |
| 229 | } | 230 | } |
| 230 | 231 | ||
| 231 | static void mmio_event_decode_key(struct perf_kvm *kvm __maybe_unused, | 232 | static void mmio_event_decode_key(struct perf_kvm_stat *kvm __maybe_unused, |
| 232 | struct event_key *key, | 233 | struct event_key *key, |
| 233 | char decode[20]) | 234 | char decode[20]) |
| 234 | { | 235 | { |
| @@ -271,7 +272,7 @@ static bool ioport_event_end(struct perf_evsel *evsel, | |||
| 271 | return kvm_entry_event(evsel); | 272 | return kvm_entry_event(evsel); |
| 272 | } | 273 | } |
| 273 | 274 | ||
| 274 | static void ioport_event_decode_key(struct perf_kvm *kvm __maybe_unused, | 275 | static void ioport_event_decode_key(struct perf_kvm_stat *kvm __maybe_unused, |
| 275 | struct event_key *key, | 276 | struct event_key *key, |
| 276 | char decode[20]) | 277 | char decode[20]) |
| 277 | { | 278 | { |
| @@ -286,7 +287,7 @@ static struct kvm_events_ops ioport_events = { | |||
| 286 | .name = "IO Port Access" | 287 | .name = "IO Port Access" |
| 287 | }; | 288 | }; |
| 288 | 289 | ||
| 289 | static bool register_kvm_events_ops(struct perf_kvm *kvm) | 290 | static bool register_kvm_events_ops(struct perf_kvm_stat *kvm) |
| 290 | { | 291 | { |
| 291 | bool ret = true; | 292 | bool ret = true; |
| 292 | 293 | ||
| @@ -311,7 +312,7 @@ struct vcpu_event_record { | |||
| 311 | }; | 312 | }; |
| 312 | 313 | ||
| 313 | 314 | ||
| 314 | static void init_kvm_event_record(struct perf_kvm *kvm) | 315 | static void init_kvm_event_record(struct perf_kvm_stat *kvm) |
| 315 | { | 316 | { |
| 316 | int i; | 317 | int i; |
| 317 | 318 | ||
| @@ -360,7 +361,7 @@ static struct kvm_event *kvm_alloc_init_event(struct event_key *key) | |||
| 360 | return event; | 361 | return event; |
| 361 | } | 362 | } |
| 362 | 363 | ||
| 363 | static struct kvm_event *find_create_kvm_event(struct perf_kvm *kvm, | 364 | static struct kvm_event *find_create_kvm_event(struct perf_kvm_stat *kvm, |
| 364 | struct event_key *key) | 365 | struct event_key *key) |
| 365 | { | 366 | { |
| 366 | struct kvm_event *event; | 367 | struct kvm_event *event; |
| @@ -381,7 +382,7 @@ static struct kvm_event *find_create_kvm_event(struct perf_kvm *kvm, | |||
| 381 | return event; | 382 | return event; |
| 382 | } | 383 | } |
| 383 | 384 | ||
| 384 | static bool handle_begin_event(struct perf_kvm *kvm, | 385 | static bool handle_begin_event(struct perf_kvm_stat *kvm, |
| 385 | struct vcpu_event_record *vcpu_record, | 386 | struct vcpu_event_record *vcpu_record, |
| 386 | struct event_key *key, u64 timestamp) | 387 | struct event_key *key, u64 timestamp) |
| 387 | { | 388 | { |
| @@ -425,7 +426,7 @@ static bool update_kvm_event(struct kvm_event *event, int vcpu_id, | |||
| 425 | return true; | 426 | return true; |
| 426 | } | 427 | } |
| 427 | 428 | ||
| 428 | static bool handle_end_event(struct perf_kvm *kvm, | 429 | static bool handle_end_event(struct perf_kvm_stat *kvm, |
| 429 | struct vcpu_event_record *vcpu_record, | 430 | struct vcpu_event_record *vcpu_record, |
| 430 | struct event_key *key, | 431 | struct event_key *key, |
| 431 | u64 timestamp) | 432 | u64 timestamp) |
| @@ -486,7 +487,7 @@ struct vcpu_event_record *per_vcpu_record(struct thread *thread, | |||
| 486 | return thread->priv; | 487 | return thread->priv; |
| 487 | } | 488 | } |
| 488 | 489 | ||
| 489 | static bool handle_kvm_event(struct perf_kvm *kvm, | 490 | static bool handle_kvm_event(struct perf_kvm_stat *kvm, |
| 490 | struct thread *thread, | 491 | struct thread *thread, |
| 491 | struct perf_evsel *evsel, | 492 | struct perf_evsel *evsel, |
| 492 | struct perf_sample *sample) | 493 | struct perf_sample *sample) |
| @@ -541,7 +542,7 @@ static struct kvm_event_key keys[] = { | |||
| 541 | { NULL, NULL } | 542 | { NULL, NULL } |
| 542 | }; | 543 | }; |
| 543 | 544 | ||
| 544 | static bool select_key(struct perf_kvm *kvm) | 545 | static bool select_key(struct perf_kvm_stat *kvm) |
| 545 | { | 546 | { |
| 546 | int i; | 547 | int i; |
| 547 | 548 | ||
| @@ -577,7 +578,8 @@ static void insert_to_result(struct rb_root *result, struct kvm_event *event, | |||
| 577 | rb_insert_color(&event->rb, result); | 578 | rb_insert_color(&event->rb, result); |
| 578 | } | 579 | } |
| 579 | 580 | ||
| 580 | static void update_total_count(struct perf_kvm *kvm, struct kvm_event *event) | 581 | static void |
| 582 | update_total_count(struct perf_kvm_stat *kvm, struct kvm_event *event) | ||
| 581 | { | 583 | { |
| 582 | int vcpu = kvm->trace_vcpu; | 584 | int vcpu = kvm->trace_vcpu; |
| 583 | 585 | ||
| @@ -590,7 +592,7 @@ static bool event_is_valid(struct kvm_event *event, int vcpu) | |||
| 590 | return !!get_event_count(event, vcpu); | 592 | return !!get_event_count(event, vcpu); |
| 591 | } | 593 | } |
| 592 | 594 | ||
| 593 | static void sort_result(struct perf_kvm *kvm) | 595 | static void sort_result(struct perf_kvm_stat *kvm) |
| 594 | { | 596 | { |
| 595 | unsigned int i; | 597 | unsigned int i; |
| 596 | int vcpu = kvm->trace_vcpu; | 598 | int vcpu = kvm->trace_vcpu; |
| @@ -627,7 +629,7 @@ static void print_vcpu_info(int vcpu) | |||
| 627 | pr_info("VCPU %d:\n\n", vcpu); | 629 | pr_info("VCPU %d:\n\n", vcpu); |
| 628 | } | 630 | } |
| 629 | 631 | ||
| 630 | static void print_result(struct perf_kvm *kvm) | 632 | static void print_result(struct perf_kvm_stat *kvm) |
| 631 | { | 633 | { |
| 632 | char decode[20]; | 634 | char decode[20]; |
| 633 | struct kvm_event *event; | 635 | struct kvm_event *event; |
| @@ -670,7 +672,8 @@ static int process_sample_event(struct perf_tool *tool, | |||
| 670 | struct machine *machine) | 672 | struct machine *machine) |
| 671 | { | 673 | { |
| 672 | struct thread *thread = machine__findnew_thread(machine, sample->tid); | 674 | struct thread *thread = machine__findnew_thread(machine, sample->tid); |
| 673 | struct perf_kvm *kvm = container_of(tool, struct perf_kvm, tool); | 675 | struct perf_kvm_stat *kvm = container_of(tool, struct perf_kvm_stat, |
| 676 | tool); | ||
| 674 | 677 | ||
| 675 | if (thread == NULL) { | 678 | if (thread == NULL) { |
| 676 | pr_debug("problem processing %d event, skipping it.\n", | 679 | pr_debug("problem processing %d event, skipping it.\n", |
| @@ -701,7 +704,7 @@ static int get_cpu_isa(struct perf_session *session) | |||
| 701 | return isa; | 704 | return isa; |
| 702 | } | 705 | } |
| 703 | 706 | ||
| 704 | static int read_events(struct perf_kvm *kvm) | 707 | static int read_events(struct perf_kvm_stat *kvm) |
| 705 | { | 708 | { |
| 706 | int ret; | 709 | int ret; |
| 707 | 710 | ||
| @@ -750,7 +753,7 @@ static bool verify_vcpu(int vcpu) | |||
| 750 | return true; | 753 | return true; |
| 751 | } | 754 | } |
| 752 | 755 | ||
| 753 | static int kvm_events_report_vcpu(struct perf_kvm *kvm) | 756 | static int kvm_events_report_vcpu(struct perf_kvm_stat *kvm) |
| 754 | { | 757 | { |
| 755 | int ret = -EINVAL; | 758 | int ret = -EINVAL; |
| 756 | int vcpu = kvm->trace_vcpu; | 759 | int vcpu = kvm->trace_vcpu; |
| @@ -798,7 +801,8 @@ static const char * const record_args[] = { | |||
| 798 | _p; \ | 801 | _p; \ |
| 799 | }) | 802 | }) |
| 800 | 803 | ||
| 801 | static int kvm_events_record(struct perf_kvm *kvm, int argc, const char **argv) | 804 | static int |
| 805 | kvm_events_record(struct perf_kvm_stat *kvm, int argc, const char **argv) | ||
| 802 | { | 806 | { |
| 803 | unsigned int rec_argc, i, j; | 807 | unsigned int rec_argc, i, j; |
| 804 | const char **rec_argv; | 808 | const char **rec_argv; |
| @@ -821,7 +825,8 @@ static int kvm_events_record(struct perf_kvm *kvm, int argc, const char **argv) | |||
| 821 | return cmd_record(i, rec_argv, NULL); | 825 | return cmd_record(i, rec_argv, NULL); |
| 822 | } | 826 | } |
| 823 | 827 | ||
| 824 | static int kvm_events_report(struct perf_kvm *kvm, int argc, const char **argv) | 828 | static int |
| 829 | kvm_events_report(struct perf_kvm_stat *kvm, int argc, const char **argv) | ||
| 825 | { | 830 | { |
| 826 | const struct option kvm_events_report_options[] = { | 831 | const struct option kvm_events_report_options[] = { |
| 827 | OPT_STRING(0, "event", &kvm->report_event, "report event", | 832 | OPT_STRING(0, "event", &kvm->report_event, "report event", |
| @@ -864,24 +869,37 @@ static void print_kvm_stat_usage(void) | |||
| 864 | printf("\nOtherwise, it is the alias of 'perf stat':\n"); | 869 | printf("\nOtherwise, it is the alias of 'perf stat':\n"); |
| 865 | } | 870 | } |
| 866 | 871 | ||
| 867 | static int kvm_cmd_stat(struct perf_kvm *kvm, int argc, const char **argv) | 872 | static int kvm_cmd_stat(const char *file_name, int argc, const char **argv) |
| 868 | { | 873 | { |
| 874 | struct perf_kvm_stat kvm = { | ||
| 875 | .file_name = file_name, | ||
| 876 | |||
| 877 | .trace_vcpu = -1, | ||
| 878 | .report_event = "vmexit", | ||
| 879 | .sort_key = "sample", | ||
| 880 | |||
| 881 | .exit_reasons = svm_exit_reasons, | ||
| 882 | .exit_reasons_size = ARRAY_SIZE(svm_exit_reasons), | ||
| 883 | .exit_reasons_isa = "SVM", | ||
| 884 | }; | ||
| 885 | |||
| 869 | if (argc == 1) { | 886 | if (argc == 1) { |
| 870 | print_kvm_stat_usage(); | 887 | print_kvm_stat_usage(); |
| 871 | goto perf_stat; | 888 | goto perf_stat; |
| 872 | } | 889 | } |
| 873 | 890 | ||
| 874 | if (!strncmp(argv[1], "rec", 3)) | 891 | if (!strncmp(argv[1], "rec", 3)) |
| 875 | return kvm_events_record(kvm, argc - 1, argv + 1); | 892 | return kvm_events_record(&kvm, argc - 1, argv + 1); |
| 876 | 893 | ||
| 877 | if (!strncmp(argv[1], "rep", 3)) | 894 | if (!strncmp(argv[1], "rep", 3)) |
| 878 | return kvm_events_report(kvm, argc - 1 , argv + 1); | 895 | return kvm_events_report(&kvm, argc - 1 , argv + 1); |
| 879 | 896 | ||
| 880 | perf_stat: | 897 | perf_stat: |
| 881 | return cmd_stat(argc, argv, NULL); | 898 | return cmd_stat(argc, argv, NULL); |
| 882 | } | 899 | } |
| 900 | #endif | ||
| 883 | 901 | ||
| 884 | static int __cmd_record(struct perf_kvm *kvm, int argc, const char **argv) | 902 | static int __cmd_record(const char *file_name, int argc, const char **argv) |
| 885 | { | 903 | { |
| 886 | int rec_argc, i = 0, j; | 904 | int rec_argc, i = 0, j; |
| 887 | const char **rec_argv; | 905 | const char **rec_argv; |
| @@ -890,7 +908,7 @@ static int __cmd_record(struct perf_kvm *kvm, int argc, const char **argv) | |||
| 890 | rec_argv = calloc(rec_argc + 1, sizeof(char *)); | 908 | rec_argv = calloc(rec_argc + 1, sizeof(char *)); |
| 891 | rec_argv[i++] = strdup("record"); | 909 | rec_argv[i++] = strdup("record"); |
| 892 | rec_argv[i++] = strdup("-o"); | 910 | rec_argv[i++] = strdup("-o"); |
| 893 | rec_argv[i++] = strdup(kvm->file_name); | 911 | rec_argv[i++] = strdup(file_name); |
| 894 | for (j = 1; j < argc; j++, i++) | 912 | for (j = 1; j < argc; j++, i++) |
| 895 | rec_argv[i] = argv[j]; | 913 | rec_argv[i] = argv[j]; |
| 896 | 914 | ||
| @@ -899,7 +917,7 @@ static int __cmd_record(struct perf_kvm *kvm, int argc, const char **argv) | |||
| 899 | return cmd_record(i, rec_argv, NULL); | 917 | return cmd_record(i, rec_argv, NULL); |
| 900 | } | 918 | } |
| 901 | 919 | ||
| 902 | static int __cmd_report(struct perf_kvm *kvm, int argc, const char **argv) | 920 | static int __cmd_report(const char *file_name, int argc, const char **argv) |
| 903 | { | 921 | { |
| 904 | int rec_argc, i = 0, j; | 922 | int rec_argc, i = 0, j; |
| 905 | const char **rec_argv; | 923 | const char **rec_argv; |
| @@ -908,7 +926,7 @@ static int __cmd_report(struct perf_kvm *kvm, int argc, const char **argv) | |||
| 908 | rec_argv = calloc(rec_argc + 1, sizeof(char *)); | 926 | rec_argv = calloc(rec_argc + 1, sizeof(char *)); |
| 909 | rec_argv[i++] = strdup("report"); | 927 | rec_argv[i++] = strdup("report"); |
| 910 | rec_argv[i++] = strdup("-i"); | 928 | rec_argv[i++] = strdup("-i"); |
| 911 | rec_argv[i++] = strdup(kvm->file_name); | 929 | rec_argv[i++] = strdup(file_name); |
| 912 | for (j = 1; j < argc; j++, i++) | 930 | for (j = 1; j < argc; j++, i++) |
| 913 | rec_argv[i] = argv[j]; | 931 | rec_argv[i] = argv[j]; |
| 914 | 932 | ||
| @@ -917,7 +935,8 @@ static int __cmd_report(struct perf_kvm *kvm, int argc, const char **argv) | |||
| 917 | return cmd_report(i, rec_argv, NULL); | 935 | return cmd_report(i, rec_argv, NULL); |
| 918 | } | 936 | } |
| 919 | 937 | ||
| 920 | static int __cmd_buildid_list(struct perf_kvm *kvm, int argc, const char **argv) | 938 | static int |
| 939 | __cmd_buildid_list(const char *file_name, int argc, const char **argv) | ||
| 921 | { | 940 | { |
| 922 | int rec_argc, i = 0, j; | 941 | int rec_argc, i = 0, j; |
| 923 | const char **rec_argv; | 942 | const char **rec_argv; |
| @@ -926,7 +945,7 @@ static int __cmd_buildid_list(struct perf_kvm *kvm, int argc, const char **argv) | |||
| 926 | rec_argv = calloc(rec_argc + 1, sizeof(char *)); | 945 | rec_argv = calloc(rec_argc + 1, sizeof(char *)); |
| 927 | rec_argv[i++] = strdup("buildid-list"); | 946 | rec_argv[i++] = strdup("buildid-list"); |
| 928 | rec_argv[i++] = strdup("-i"); | 947 | rec_argv[i++] = strdup("-i"); |
| 929 | rec_argv[i++] = strdup(kvm->file_name); | 948 | rec_argv[i++] = strdup(file_name); |
| 930 | for (j = 1; j < argc; j++, i++) | 949 | for (j = 1; j < argc; j++, i++) |
| 931 | rec_argv[i] = argv[j]; | 950 | rec_argv[i] = argv[j]; |
| 932 | 951 | ||
| @@ -937,20 +956,12 @@ static int __cmd_buildid_list(struct perf_kvm *kvm, int argc, const char **argv) | |||
| 937 | 956 | ||
| 938 | int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused) | 957 | int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused) |
| 939 | { | 958 | { |
| 940 | struct perf_kvm kvm = { | 959 | const char *file_name; |
| 941 | .trace_vcpu = -1, | ||
| 942 | .report_event = "vmexit", | ||
| 943 | .sort_key = "sample", | ||
| 944 | |||
| 945 | .exit_reasons = svm_exit_reasons, | ||
| 946 | .exit_reasons_size = ARRAY_SIZE(svm_exit_reasons), | ||
| 947 | .exit_reasons_isa = "SVM", | ||
| 948 | }; | ||
| 949 | 960 | ||
| 950 | const struct option kvm_options[] = { | 961 | const struct option kvm_options[] = { |
| 951 | OPT_STRING('i', "input", &kvm.file_name, "file", | 962 | OPT_STRING('i', "input", &file_name, "file", |
| 952 | "Input file name"), | 963 | "Input file name"), |
| 953 | OPT_STRING('o', "output", &kvm.file_name, "file", | 964 | OPT_STRING('o', "output", &file_name, "file", |
| 954 | "Output file name"), | 965 | "Output file name"), |
| 955 | OPT_BOOLEAN(0, "guest", &perf_guest, | 966 | OPT_BOOLEAN(0, "guest", &perf_guest, |
| 956 | "Collect guest os data"), | 967 | "Collect guest os data"), |
| @@ -985,32 +996,34 @@ int cmd_kvm(int argc, const char **argv, const char *prefix __maybe_unused) | |||
| 985 | if (!perf_host) | 996 | if (!perf_host) |
| 986 | perf_guest = 1; | 997 | perf_guest = 1; |
| 987 | 998 | ||
| 988 | if (!kvm.file_name) { | 999 | if (!file_name) { |
| 989 | if (perf_host && !perf_guest) | 1000 | if (perf_host && !perf_guest) |
| 990 | kvm.file_name = strdup("perf.data.host"); | 1001 | file_name = strdup("perf.data.host"); |
| 991 | else if (!perf_host && perf_guest) | 1002 | else if (!perf_host && perf_guest) |
| 992 | kvm.file_name = strdup("perf.data.guest"); | 1003 | file_name = strdup("perf.data.guest"); |
| 993 | else | 1004 | else |
| 994 | kvm.file_name = strdup("perf.data.kvm"); | 1005 | file_name = strdup("perf.data.kvm"); |
| 995 | 1006 | ||
| 996 | if (!kvm.file_name) { | 1007 | if (!file_name) { |
| 997 | pr_err("Failed to allocate memory for filename\n"); | 1008 | pr_err("Failed to allocate memory for filename\n"); |
| 998 | return -ENOMEM; | 1009 | return -ENOMEM; |
| 999 | } | 1010 | } |
| 1000 | } | 1011 | } |
| 1001 | 1012 | ||
| 1002 | if (!strncmp(argv[0], "rec", 3)) | 1013 | if (!strncmp(argv[0], "rec", 3)) |
| 1003 | return __cmd_record(&kvm, argc, argv); | 1014 | return __cmd_record(file_name, argc, argv); |
| 1004 | else if (!strncmp(argv[0], "rep", 3)) | 1015 | else if (!strncmp(argv[0], "rep", 3)) |
| 1005 | return __cmd_report(&kvm, argc, argv); | 1016 | return __cmd_report(file_name, argc, argv); |
| 1006 | else if (!strncmp(argv[0], "diff", 4)) | 1017 | else if (!strncmp(argv[0], "diff", 4)) |
| 1007 | return cmd_diff(argc, argv, NULL); | 1018 | return cmd_diff(argc, argv, NULL); |
| 1008 | else if (!strncmp(argv[0], "top", 3)) | 1019 | else if (!strncmp(argv[0], "top", 3)) |
| 1009 | return cmd_top(argc, argv, NULL); | 1020 | return cmd_top(argc, argv, NULL); |
| 1010 | else if (!strncmp(argv[0], "buildid-list", 12)) | 1021 | else if (!strncmp(argv[0], "buildid-list", 12)) |
| 1011 | return __cmd_buildid_list(&kvm, argc, argv); | 1022 | return __cmd_buildid_list(file_name, argc, argv); |
| 1023 | #if defined(__i386__) || defined(__x86_64__) | ||
| 1012 | else if (!strncmp(argv[0], "stat", 4)) | 1024 | else if (!strncmp(argv[0], "stat", 4)) |
| 1013 | return kvm_cmd_stat(&kvm, argc, argv); | 1025 | return kvm_cmd_stat(file_name, argc, argv); |
| 1026 | #endif | ||
| 1014 | else | 1027 | else |
| 1015 | usage_with_options(kvm_usage, kvm_options); | 1028 | usage_with_options(kvm_usage, kvm_options); |
| 1016 | 1029 | ||
diff --git a/tools/perf/builtin-test.c b/tools/perf/builtin-test.c index 484f26cc0c00..5acd6e8e658b 100644 --- a/tools/perf/builtin-test.c +++ b/tools/perf/builtin-test.c | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | #include "util/thread_map.h" | 15 | #include "util/thread_map.h" |
| 16 | #include "util/pmu.h" | 16 | #include "util/pmu.h" |
| 17 | #include "event-parse.h" | 17 | #include "event-parse.h" |
| 18 | #include "../../include/linux/hw_breakpoint.h" | 18 | #include <linux/hw_breakpoint.h> |
| 19 | 19 | ||
| 20 | #include <sys/mman.h> | 20 | #include <sys/mman.h> |
| 21 | 21 | ||
diff --git a/tools/perf/perf.h b/tools/perf/perf.h index c50985eaec41..238f923f2218 100644 --- a/tools/perf/perf.h +++ b/tools/perf/perf.h | |||
| @@ -5,8 +5,9 @@ struct winsize; | |||
| 5 | 5 | ||
| 6 | void get_term_dimensions(struct winsize *ws); | 6 | void get_term_dimensions(struct winsize *ws); |
| 7 | 7 | ||
| 8 | #include <asm/unistd.h> | ||
| 9 | |||
| 8 | #if defined(__i386__) | 10 | #if defined(__i386__) |
| 9 | #include "../../arch/x86/include/asm/unistd.h" | ||
| 10 | #define rmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory") | 11 | #define rmb() asm volatile("lock; addl $0,0(%%esp)" ::: "memory") |
| 11 | #define cpu_relax() asm volatile("rep; nop" ::: "memory"); | 12 | #define cpu_relax() asm volatile("rep; nop" ::: "memory"); |
| 12 | #define CPUINFO_PROC "model name" | 13 | #define CPUINFO_PROC "model name" |
| @@ -16,7 +17,6 @@ void get_term_dimensions(struct winsize *ws); | |||
| 16 | #endif | 17 | #endif |
| 17 | 18 | ||
| 18 | #if defined(__x86_64__) | 19 | #if defined(__x86_64__) |
| 19 | #include "../../arch/x86/include/asm/unistd.h" | ||
| 20 | #define rmb() asm volatile("lfence" ::: "memory") | 20 | #define rmb() asm volatile("lfence" ::: "memory") |
| 21 | #define cpu_relax() asm volatile("rep; nop" ::: "memory"); | 21 | #define cpu_relax() asm volatile("rep; nop" ::: "memory"); |
| 22 | #define CPUINFO_PROC "model name" | 22 | #define CPUINFO_PROC "model name" |
| @@ -26,20 +26,17 @@ void get_term_dimensions(struct winsize *ws); | |||
| 26 | #endif | 26 | #endif |
| 27 | 27 | ||
| 28 | #ifdef __powerpc__ | 28 | #ifdef __powerpc__ |
| 29 | #include "../../arch/powerpc/include/asm/unistd.h" | ||
| 30 | #define rmb() asm volatile ("sync" ::: "memory") | 29 | #define rmb() asm volatile ("sync" ::: "memory") |
| 31 | #define cpu_relax() asm volatile ("" ::: "memory"); | 30 | #define cpu_relax() asm volatile ("" ::: "memory"); |
| 32 | #define CPUINFO_PROC "cpu" | 31 | #define CPUINFO_PROC "cpu" |
| 33 | #endif | 32 | #endif |
| 34 | 33 | ||
| 35 | #ifdef __s390__ | 34 | #ifdef __s390__ |
| 36 | #include "../../arch/s390/include/asm/unistd.h" | ||
| 37 | #define rmb() asm volatile("bcr 15,0" ::: "memory") | 35 | #define rmb() asm volatile("bcr 15,0" ::: "memory") |
| 38 | #define cpu_relax() asm volatile("" ::: "memory"); | 36 | #define cpu_relax() asm volatile("" ::: "memory"); |
| 39 | #endif | 37 | #endif |
| 40 | 38 | ||
| 41 | #ifdef __sh__ | 39 | #ifdef __sh__ |
| 42 | #include "../../arch/sh/include/asm/unistd.h" | ||
| 43 | #if defined(__SH4A__) || defined(__SH5__) | 40 | #if defined(__SH4A__) || defined(__SH5__) |
| 44 | # define rmb() asm volatile("synco" ::: "memory") | 41 | # define rmb() asm volatile("synco" ::: "memory") |
| 45 | #else | 42 | #else |
| @@ -50,35 +47,30 @@ void get_term_dimensions(struct winsize *ws); | |||
| 50 | #endif | 47 | #endif |
| 51 | 48 | ||
| 52 | #ifdef __hppa__ | 49 | #ifdef __hppa__ |
| 53 | #include "../../arch/parisc/include/asm/unistd.h" | ||
| 54 | #define rmb() asm volatile("" ::: "memory") | 50 | #define rmb() asm volatile("" ::: "memory") |
| 55 | #define cpu_relax() asm volatile("" ::: "memory"); | 51 | #define cpu_relax() asm volatile("" ::: "memory"); |
| 56 | #define CPUINFO_PROC "cpu" | 52 | #define CPUINFO_PROC "cpu" |
| 57 | #endif | 53 | #endif |
| 58 | 54 | ||
| 59 | #ifdef __sparc__ | 55 | #ifdef __sparc__ |
| 60 | #include "../../arch/sparc/include/uapi/asm/unistd.h" | ||
| 61 | #define rmb() asm volatile("":::"memory") | 56 | #define rmb() asm volatile("":::"memory") |
| 62 | #define cpu_relax() asm volatile("":::"memory") | 57 | #define cpu_relax() asm volatile("":::"memory") |
| 63 | #define CPUINFO_PROC "cpu" | 58 | #define CPUINFO_PROC "cpu" |
| 64 | #endif | 59 | #endif |
| 65 | 60 | ||
| 66 | #ifdef __alpha__ | 61 | #ifdef __alpha__ |
| 67 | #include "../../arch/alpha/include/asm/unistd.h" | ||
| 68 | #define rmb() asm volatile("mb" ::: "memory") | 62 | #define rmb() asm volatile("mb" ::: "memory") |
| 69 | #define cpu_relax() asm volatile("" ::: "memory") | 63 | #define cpu_relax() asm volatile("" ::: "memory") |
| 70 | #define CPUINFO_PROC "cpu model" | 64 | #define CPUINFO_PROC "cpu model" |
| 71 | #endif | 65 | #endif |
| 72 | 66 | ||
| 73 | #ifdef __ia64__ | 67 | #ifdef __ia64__ |
| 74 | #include "../../arch/ia64/include/asm/unistd.h" | ||
| 75 | #define rmb() asm volatile ("mf" ::: "memory") | 68 | #define rmb() asm volatile ("mf" ::: "memory") |
| 76 | #define cpu_relax() asm volatile ("hint @pause" ::: "memory") | 69 | #define cpu_relax() asm volatile ("hint @pause" ::: "memory") |
| 77 | #define CPUINFO_PROC "model name" | 70 | #define CPUINFO_PROC "model name" |
| 78 | #endif | 71 | #endif |
| 79 | 72 | ||
| 80 | #ifdef __arm__ | 73 | #ifdef __arm__ |
| 81 | #include "../../arch/arm/include/asm/unistd.h" | ||
| 82 | /* | 74 | /* |
| 83 | * Use the __kuser_memory_barrier helper in the CPU helper page. See | 75 | * Use the __kuser_memory_barrier helper in the CPU helper page. See |
| 84 | * arch/arm/kernel/entry-armv.S in the kernel source for details. | 76 | * arch/arm/kernel/entry-armv.S in the kernel source for details. |
| @@ -89,13 +81,11 @@ void get_term_dimensions(struct winsize *ws); | |||
| 89 | #endif | 81 | #endif |
| 90 | 82 | ||
| 91 | #ifdef __aarch64__ | 83 | #ifdef __aarch64__ |
| 92 | #include "../../arch/arm64/include/asm/unistd.h" | ||
| 93 | #define rmb() asm volatile("dmb ld" ::: "memory") | 84 | #define rmb() asm volatile("dmb ld" ::: "memory") |
| 94 | #define cpu_relax() asm volatile("yield" ::: "memory") | 85 | #define cpu_relax() asm volatile("yield" ::: "memory") |
| 95 | #endif | 86 | #endif |
| 96 | 87 | ||
| 97 | #ifdef __mips__ | 88 | #ifdef __mips__ |
| 98 | #include "../../arch/mips/include/asm/unistd.h" | ||
| 99 | #define rmb() asm volatile( \ | 89 | #define rmb() asm volatile( \ |
| 100 | ".set mips2\n\t" \ | 90 | ".set mips2\n\t" \ |
| 101 | "sync\n\t" \ | 91 | "sync\n\t" \ |
| @@ -112,7 +102,7 @@ void get_term_dimensions(struct winsize *ws); | |||
| 112 | #include <sys/types.h> | 102 | #include <sys/types.h> |
| 113 | #include <sys/syscall.h> | 103 | #include <sys/syscall.h> |
| 114 | 104 | ||
| 115 | #include "../../include/uapi/linux/perf_event.h" | 105 | #include <linux/perf_event.h> |
| 116 | #include "util/types.h" | 106 | #include "util/types.h" |
| 117 | #include <stdbool.h> | 107 | #include <stdbool.h> |
| 118 | 108 | ||
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 618d41140abd..d144d464ce39 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c | |||
| @@ -18,8 +18,8 @@ | |||
| 18 | #include "cpumap.h" | 18 | #include "cpumap.h" |
| 19 | #include "thread_map.h" | 19 | #include "thread_map.h" |
| 20 | #include "target.h" | 20 | #include "target.h" |
| 21 | #include "../../../include/linux/hw_breakpoint.h" | 21 | #include <linux/hw_breakpoint.h> |
| 22 | #include "../../../include/uapi/linux/perf_event.h" | 22 | #include <linux/perf_event.h> |
| 23 | #include "perf_regs.h" | 23 | #include "perf_regs.h" |
| 24 | 24 | ||
| 25 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) | 25 | #define FD(e, x, y) (*(int *)xyarray__entry(e->fd, x, y)) |
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 6f94d6dea00f..d99b476ef37c 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
| @@ -3,7 +3,8 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/list.h> | 4 | #include <linux/list.h> |
| 5 | #include <stdbool.h> | 5 | #include <stdbool.h> |
| 6 | #include "../../../include/uapi/linux/perf_event.h" | 6 | #include <stddef.h> |
| 7 | #include <linux/perf_event.h> | ||
| 7 | #include "types.h" | 8 | #include "types.h" |
| 8 | #include "xyarray.h" | 9 | #include "xyarray.h" |
| 9 | #include "cgroup.h" | 10 | #include "cgroup.h" |
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 7daad237dea5..566b84c695c8 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
| @@ -1378,6 +1378,8 @@ static void print_numa_topology(struct perf_header *ph, int fd __maybe_unused, | |||
| 1378 | 1378 | ||
| 1379 | str = tmp + 1; | 1379 | str = tmp + 1; |
| 1380 | fprintf(fp, "# node%u cpu list : %s\n", c, str); | 1380 | fprintf(fp, "# node%u cpu list : %s\n", c, str); |
| 1381 | |||
| 1382 | str += strlen(str) + 1; | ||
| 1381 | } | 1383 | } |
| 1382 | return; | 1384 | return; |
| 1383 | error: | 1385 | error: |
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index 879d215cdac9..9bc00783f24f 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | #ifndef __PERF_HEADER_H | 1 | #ifndef __PERF_HEADER_H |
| 2 | #define __PERF_HEADER_H | 2 | #define __PERF_HEADER_H |
| 3 | 3 | ||
| 4 | #include "../../../include/uapi/linux/perf_event.h" | 4 | #include <linux/perf_event.h> |
| 5 | #include <sys/types.h> | 5 | #include <sys/types.h> |
| 6 | #include <stdbool.h> | 6 | #include <stdbool.h> |
| 7 | #include "types.h" | 7 | #include "types.h" |
diff --git a/tools/perf/util/parse-events-test.c b/tools/perf/util/parse-events-test.c index 516ecd9ddd6e..6ef213b35ecd 100644 --- a/tools/perf/util/parse-events-test.c +++ b/tools/perf/util/parse-events-test.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | #include "evsel.h" | 3 | #include "evsel.h" |
| 4 | #include "evlist.h" | 4 | #include "evlist.h" |
| 5 | #include "sysfs.h" | 5 | #include "sysfs.h" |
| 6 | #include "../../../include/linux/hw_breakpoint.h" | 6 | #include <linux/hw_breakpoint.h> |
| 7 | 7 | ||
| 8 | #define TEST_ASSERT_VAL(text, cond) \ | 8 | #define TEST_ASSERT_VAL(text, cond) \ |
| 9 | do { \ | 9 | do { \ |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 75c7b0fca6d9..6b6d03e93c3d 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | #include "../../../include/linux/hw_breakpoint.h" | 1 | #include <linux/hw_breakpoint.h> |
| 2 | #include "util.h" | 2 | #include "util.h" |
| 3 | #include "../perf.h" | 3 | #include "../perf.h" |
| 4 | #include "evlist.h" | 4 | #include "evlist.h" |
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 839230ceb18b..2820c407adb2 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | #include <linux/list.h> | 7 | #include <linux/list.h> |
| 8 | #include <stdbool.h> | 8 | #include <stdbool.h> |
| 9 | #include "types.h" | 9 | #include "types.h" |
| 10 | #include "../../../include/uapi/linux/perf_event.h" | 10 | #include <linux/perf_event.h> |
| 11 | #include "types.h" | 11 | #include "types.h" |
| 12 | 12 | ||
| 13 | struct list_head; | 13 | struct list_head; |
diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index 39f3abac7744..fdeb8ac7c5d2 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | #define __PMU_H | 2 | #define __PMU_H |
| 3 | 3 | ||
| 4 | #include <linux/bitops.h> | 4 | #include <linux/bitops.h> |
| 5 | #include "../../../include/uapi/linux/perf_event.h" | 5 | #include <linux/perf_event.h> |
| 6 | 6 | ||
| 7 | enum { | 7 | enum { |
| 8 | PERF_PMU_FORMAT_VALUE_CONFIG, | 8 | PERF_PMU_FORMAT_VALUE_CONFIG, |
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index dd6426163ba6..0eae00ad5fe7 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h | |||
| @@ -7,7 +7,7 @@ | |||
| 7 | #include "symbol.h" | 7 | #include "symbol.h" |
| 8 | #include "thread.h" | 8 | #include "thread.h" |
| 9 | #include <linux/rbtree.h> | 9 | #include <linux/rbtree.h> |
| 10 | #include "../../../include/uapi/linux/perf_event.h" | 10 | #include <linux/perf_event.h> |
| 11 | 11 | ||
| 12 | struct sample_queue; | 12 | struct sample_queue; |
| 13 | struct ip_callchain; | 13 | struct ip_callchain; |
diff --git a/tools/perf/util/strbuf.c b/tools/perf/util/strbuf.c index 2eeb51baf077..cfa906882e2c 100644 --- a/tools/perf/util/strbuf.c +++ b/tools/perf/util/strbuf.c | |||
| @@ -90,17 +90,17 @@ void strbuf_addf(struct strbuf *sb, const char *fmt, ...) | |||
| 90 | if (!strbuf_avail(sb)) | 90 | if (!strbuf_avail(sb)) |
| 91 | strbuf_grow(sb, 64); | 91 | strbuf_grow(sb, 64); |
| 92 | va_start(ap, fmt); | 92 | va_start(ap, fmt); |
| 93 | len = vscnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); | 93 | len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); |
| 94 | va_end(ap); | 94 | va_end(ap); |
| 95 | if (len < 0) | 95 | if (len < 0) |
| 96 | die("your vscnprintf is broken"); | 96 | die("your vsnprintf is broken"); |
| 97 | if (len > strbuf_avail(sb)) { | 97 | if (len > strbuf_avail(sb)) { |
| 98 | strbuf_grow(sb, len); | 98 | strbuf_grow(sb, len); |
| 99 | va_start(ap, fmt); | 99 | va_start(ap, fmt); |
| 100 | len = vscnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); | 100 | len = vsnprintf(sb->buf + sb->len, sb->alloc - sb->len, fmt, ap); |
| 101 | va_end(ap); | 101 | va_end(ap); |
| 102 | if (len > strbuf_avail(sb)) { | 102 | if (len > strbuf_avail(sb)) { |
| 103 | die("this should not happen, your snprintf is broken"); | 103 | die("this should not happen, your vsnprintf is broken"); |
| 104 | } | 104 | } |
| 105 | } | 105 | } |
| 106 | strbuf_setlen(sb, sb->len + len); | 106 | strbuf_setlen(sb, sb->len + len); |
diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include index 96ce80a3743b..2964b96aa55f 100644 --- a/tools/scripts/Makefile.include +++ b/tools/scripts/Makefile.include | |||
| @@ -1,8 +1,11 @@ | |||
| 1 | ifeq ("$(origin O)", "command line") | 1 | ifeq ($(origin O), command line) |
| 2 | dummy := $(if $(shell test -d $(O) || echo $(O)),$(error O=$(O) does not exist),) | 2 | dummy := $(if $(shell test -d $(O) || echo $(O)),$(error O=$(O) does not exist),) |
| 3 | ABSOLUTE_O := $(shell cd $(O) ; pwd) | 3 | ABSOLUTE_O := $(shell cd $(O) ; pwd) |
| 4 | OUTPUT := $(ABSOLUTE_O)/ | 4 | OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/) |
| 5 | COMMAND_O := O=$(ABSOLUTE_O) | 5 | COMMAND_O := O=$(ABSOLUTE_O) |
| 6 | ifeq ($(objtree),) | ||
| 7 | objtree := $(O) | ||
| 8 | endif | ||
| 6 | endif | 9 | endif |
| 7 | 10 | ||
| 8 | ifneq ($(OUTPUT),) | 11 | ifneq ($(OUTPUT),) |
| @@ -41,7 +44,16 @@ else | |||
| 41 | NO_SUBDIR = : | 44 | NO_SUBDIR = : |
| 42 | endif | 45 | endif |
| 43 | 46 | ||
| 44 | QUIET_SUBDIR0 = +$(MAKE) -C # space to separate -C and subdir | 47 | # |
| 48 | # Define a callable command for descending to a new directory | ||
| 49 | # | ||
| 50 | # Call by doing: $(call descend,directory[,target]) | ||
| 51 | # | ||
| 52 | descend = \ | ||
| 53 | +mkdir -p $(OUTPUT)$(1) && \ | ||
| 54 | $(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) $(2) | ||
| 55 | |||
| 56 | QUIET_SUBDIR0 = +$(MAKE) $(COMMAND_O) -C # space to separate -C and subdir | ||
| 45 | QUIET_SUBDIR1 = | 57 | QUIET_SUBDIR1 = |
| 46 | 58 | ||
| 47 | ifneq ($(findstring $(MAKEFLAGS),s),s) | 59 | ifneq ($(findstring $(MAKEFLAGS),s),s) |
| @@ -56,5 +68,10 @@ ifndef V | |||
| 56 | $(MAKE) $(PRINT_DIR) -C $$subdir | 68 | $(MAKE) $(PRINT_DIR) -C $$subdir |
| 57 | QUIET_FLEX = @echo ' ' FLEX $@; | 69 | QUIET_FLEX = @echo ' ' FLEX $@; |
| 58 | QUIET_BISON = @echo ' ' BISON $@; | 70 | QUIET_BISON = @echo ' ' BISON $@; |
| 71 | |||
| 72 | descend = \ | ||
| 73 | @echo ' ' DESCEND $(1); \ | ||
| 74 | mkdir -p $(OUTPUT)$(1) && \ | ||
| 75 | $(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) $(2) | ||
| 59 | endif | 76 | endif |
| 60 | endif | 77 | endif |
