diff options
293 files changed, 2908 insertions, 1415 deletions
diff --git a/Documentation/dmatest.txt b/Documentation/dmatest.txt index 279ac0a8c5b1..132a094c7bc3 100644 --- a/Documentation/dmatest.txt +++ b/Documentation/dmatest.txt | |||
| @@ -34,7 +34,7 @@ command: | |||
| 34 | After a while you will start to get messages about current status or error like | 34 | After a while you will start to get messages about current status or error like |
| 35 | in the original code. | 35 | in the original code. |
| 36 | 36 | ||
| 37 | Note that running a new test will stop any in progress test. | 37 | Note that running a new test will not stop any in progress test. |
| 38 | 38 | ||
| 39 | The following command should return actual state of the test. | 39 | The following command should return actual state of the test. |
| 40 | % cat /sys/kernel/debug/dmatest/run | 40 | % cat /sys/kernel/debug/dmatest/run |
| @@ -52,8 +52,8 @@ To wait for test done the user may perform a busy loop that checks the state. | |||
| 52 | 52 | ||
| 53 | The module parameters that is supplied to the kernel command line will be used | 53 | The module parameters that is supplied to the kernel command line will be used |
| 54 | for the first performed test. After user gets a control, the test could be | 54 | for the first performed test. After user gets a control, the test could be |
| 55 | interrupted or re-run with same or different parameters. For the details see | 55 | re-run with the same or different parameters. For the details see the above |
| 56 | the above section "Part 2 - When dmatest is built as a module..." | 56 | section "Part 2 - When dmatest is built as a module..." |
| 57 | 57 | ||
| 58 | In both cases the module parameters are used as initial values for the test case. | 58 | In both cases the module parameters are used as initial values for the test case. |
| 59 | You always could check them at run-time by running | 59 | You always could check them at run-time by running |
diff --git a/Documentation/filesystems/xfs.txt b/Documentation/filesystems/xfs.txt index 3e4b3dd1e046..83577f0232a0 100644 --- a/Documentation/filesystems/xfs.txt +++ b/Documentation/filesystems/xfs.txt | |||
| @@ -33,6 +33,9 @@ When mounting an XFS filesystem, the following options are accepted. | |||
| 33 | removing extended attributes) the on-disk superblock feature | 33 | removing extended attributes) the on-disk superblock feature |
| 34 | bit field will be updated to reflect this format being in use. | 34 | bit field will be updated to reflect this format being in use. |
| 35 | 35 | ||
| 36 | CRC enabled filesystems always use the attr2 format, and so | ||
| 37 | will reject the noattr2 mount option if it is set. | ||
| 38 | |||
| 36 | barrier | 39 | barrier |
| 37 | Enables the use of block layer write barriers for writes into | 40 | Enables the use of block layer write barriers for writes into |
| 38 | the journal and unwritten extent conversion. This allows for | 41 | the journal and unwritten extent conversion. This allows for |
diff --git a/MAINTAINERS b/MAINTAINERS index f35a259a6564..250dc970c62d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -2890,8 +2890,8 @@ F: drivers/media/dvb-frontends/ec100* | |||
| 2890 | 2890 | ||
| 2891 | ECRYPT FILE SYSTEM | 2891 | ECRYPT FILE SYSTEM |
| 2892 | M: Tyler Hicks <tyhicks@canonical.com> | 2892 | M: Tyler Hicks <tyhicks@canonical.com> |
| 2893 | M: Dustin Kirkland <dustin.kirkland@gazzang.com> | ||
| 2894 | L: ecryptfs@vger.kernel.org | 2893 | L: ecryptfs@vger.kernel.org |
| 2894 | W: http://ecryptfs.org | ||
| 2895 | W: https://launchpad.net/ecryptfs | 2895 | W: https://launchpad.net/ecryptfs |
| 2896 | S: Supported | 2896 | S: Supported |
| 2897 | F: Documentation/filesystems/ecryptfs.txt | 2897 | F: Documentation/filesystems/ecryptfs.txt |
| @@ -4448,6 +4448,16 @@ S: Maintained | |||
| 4448 | F: drivers/scsi/*iscsi* | 4448 | F: drivers/scsi/*iscsi* |
| 4449 | F: include/scsi/*iscsi* | 4449 | F: include/scsi/*iscsi* |
| 4450 | 4450 | ||
| 4451 | ISCSI EXTENSIONS FOR RDMA (ISER) INITIATOR | ||
| 4452 | M: Or Gerlitz <ogerlitz@mellanox.com> | ||
| 4453 | M: Roi Dayan <roid@mellanox.com> | ||
| 4454 | L: linux-rdma@vger.kernel.org | ||
| 4455 | S: Supported | ||
| 4456 | W: http://www.openfabrics.org | ||
| 4457 | W: www.open-iscsi.org | ||
| 4458 | Q: http://patchwork.kernel.org/project/linux-rdma/list/ | ||
| 4459 | F: drivers/infiniband/ulp/iser | ||
| 4460 | |||
| 4451 | ISDN SUBSYSTEM | 4461 | ISDN SUBSYSTEM |
| 4452 | M: Karsten Keil <isdn@linux-pingi.de> | 4462 | M: Karsten Keil <isdn@linux-pingi.de> |
| 4453 | L: isdn4linux@listserv.isdn4linux.de (subscribers-only) | 4463 | L: isdn4linux@listserv.isdn4linux.de (subscribers-only) |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 10 | 2 | PATCHLEVEL = 10 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc4 | 4 | EXTRAVERSION = -rc5 |
| 5 | NAME = Unicycling Gorilla | 5 | NAME = Unicycling Gorilla |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi index f0052dccf9a8..1e12aeff403b 100644 --- a/arch/arm/boot/dts/bcm2835.dtsi +++ b/arch/arm/boot/dts/bcm2835.dtsi | |||
| @@ -44,6 +44,7 @@ | |||
| 44 | reg = <0x7e201000 0x1000>; | 44 | reg = <0x7e201000 0x1000>; |
| 45 | interrupts = <2 25>; | 45 | interrupts = <2 25>; |
| 46 | clock-frequency = <3000000>; | 46 | clock-frequency = <3000000>; |
| 47 | arm,primecell-periphid = <0x00241011>; | ||
| 47 | }; | 48 | }; |
| 48 | 49 | ||
| 49 | gpio: gpio { | 50 | gpio: gpio { |
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi index d2550e0bca24..701153992c69 100644 --- a/arch/arm/boot/dts/imx25.dtsi +++ b/arch/arm/boot/dts/imx25.dtsi | |||
| @@ -141,8 +141,8 @@ | |||
| 141 | #size-cells = <0>; | 141 | #size-cells = <0>; |
| 142 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | 142 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; |
| 143 | reg = <0x43fa4000 0x4000>; | 143 | reg = <0x43fa4000 0x4000>; |
| 144 | clocks = <&clks 62>; | 144 | clocks = <&clks 62>, <&clks 62>; |
| 145 | clock-names = "ipg"; | 145 | clock-names = "ipg", "per"; |
| 146 | interrupts = <14>; | 146 | interrupts = <14>; |
| 147 | status = "disabled"; | 147 | status = "disabled"; |
| 148 | }; | 148 | }; |
| @@ -182,8 +182,8 @@ | |||
| 182 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | 182 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; |
| 183 | reg = <0x50004000 0x4000>; | 183 | reg = <0x50004000 0x4000>; |
| 184 | interrupts = <0>; | 184 | interrupts = <0>; |
| 185 | clocks = <&clks 80>; | 185 | clocks = <&clks 80>, <&clks 80>; |
| 186 | clock-names = "ipg"; | 186 | clock-names = "ipg", "per"; |
| 187 | status = "disabled"; | 187 | status = "disabled"; |
| 188 | }; | 188 | }; |
| 189 | 189 | ||
| @@ -210,8 +210,8 @@ | |||
| 210 | #size-cells = <0>; | 210 | #size-cells = <0>; |
| 211 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | 211 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; |
| 212 | reg = <0x50010000 0x4000>; | 212 | reg = <0x50010000 0x4000>; |
| 213 | clocks = <&clks 79>; | 213 | clocks = <&clks 79>, <&clks 79>; |
| 214 | clock-names = "ipg"; | 214 | clock-names = "ipg", "per"; |
| 215 | interrupts = <13>; | 215 | interrupts = <13>; |
| 216 | status = "disabled"; | 216 | status = "disabled"; |
| 217 | }; | 217 | }; |
diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi index ff4bd4873edf..75bd11386516 100644 --- a/arch/arm/boot/dts/imx27.dtsi +++ b/arch/arm/boot/dts/imx27.dtsi | |||
| @@ -131,7 +131,7 @@ | |||
| 131 | compatible = "fsl,imx27-cspi"; | 131 | compatible = "fsl,imx27-cspi"; |
| 132 | reg = <0x1000e000 0x1000>; | 132 | reg = <0x1000e000 0x1000>; |
| 133 | interrupts = <16>; | 133 | interrupts = <16>; |
| 134 | clocks = <&clks 53>, <&clks 0>; | 134 | clocks = <&clks 53>, <&clks 53>; |
| 135 | clock-names = "ipg", "per"; | 135 | clock-names = "ipg", "per"; |
| 136 | status = "disabled"; | 136 | status = "disabled"; |
| 137 | }; | 137 | }; |
| @@ -142,7 +142,7 @@ | |||
| 142 | compatible = "fsl,imx27-cspi"; | 142 | compatible = "fsl,imx27-cspi"; |
| 143 | reg = <0x1000f000 0x1000>; | 143 | reg = <0x1000f000 0x1000>; |
| 144 | interrupts = <15>; | 144 | interrupts = <15>; |
| 145 | clocks = <&clks 52>, <&clks 0>; | 145 | clocks = <&clks 52>, <&clks 52>; |
| 146 | clock-names = "ipg", "per"; | 146 | clock-names = "ipg", "per"; |
| 147 | status = "disabled"; | 147 | status = "disabled"; |
| 148 | }; | 148 | }; |
| @@ -223,7 +223,7 @@ | |||
| 223 | compatible = "fsl,imx27-cspi"; | 223 | compatible = "fsl,imx27-cspi"; |
| 224 | reg = <0x10017000 0x1000>; | 224 | reg = <0x10017000 0x1000>; |
| 225 | interrupts = <6>; | 225 | interrupts = <6>; |
| 226 | clocks = <&clks 51>, <&clks 0>; | 226 | clocks = <&clks 51>, <&clks 51>; |
| 227 | clock-names = "ipg", "per"; | 227 | clock-names = "ipg", "per"; |
| 228 | status = "disabled"; | 228 | status = "disabled"; |
| 229 | }; | 229 | }; |
diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi index 21bb786c5b31..53fdde69bbf4 100644 --- a/arch/arm/boot/dts/imx51.dtsi +++ b/arch/arm/boot/dts/imx51.dtsi | |||
| @@ -631,7 +631,7 @@ | |||
| 631 | compatible = "fsl,imx51-cspi", "fsl,imx35-cspi"; | 631 | compatible = "fsl,imx51-cspi", "fsl,imx35-cspi"; |
| 632 | reg = <0x83fc0000 0x4000>; | 632 | reg = <0x83fc0000 0x4000>; |
| 633 | interrupts = <38>; | 633 | interrupts = <38>; |
| 634 | clocks = <&clks 55>, <&clks 0>; | 634 | clocks = <&clks 55>, <&clks 55>; |
| 635 | clock-names = "ipg", "per"; | 635 | clock-names = "ipg", "per"; |
| 636 | status = "disabled"; | 636 | status = "disabled"; |
| 637 | }; | 637 | }; |
diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi index 845982eaac22..eb83aa039b8b 100644 --- a/arch/arm/boot/dts/imx53.dtsi +++ b/arch/arm/boot/dts/imx53.dtsi | |||
| @@ -714,7 +714,7 @@ | |||
| 714 | compatible = "fsl,imx53-cspi", "fsl,imx35-cspi"; | 714 | compatible = "fsl,imx53-cspi", "fsl,imx35-cspi"; |
| 715 | reg = <0x63fc0000 0x4000>; | 715 | reg = <0x63fc0000 0x4000>; |
| 716 | interrupts = <38>; | 716 | interrupts = <38>; |
| 717 | clocks = <&clks 55>, <&clks 0>; | 717 | clocks = <&clks 55>, <&clks 55>; |
| 718 | clock-names = "ipg", "per"; | 718 | clock-names = "ipg", "per"; |
| 719 | status = "disabled"; | 719 | status = "disabled"; |
| 720 | }; | 720 | }; |
diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h index 99a19512ee26..bdf2b8458ec1 100644 --- a/arch/arm/include/asm/tlb.h +++ b/arch/arm/include/asm/tlb.h | |||
| @@ -33,18 +33,6 @@ | |||
| 33 | #include <asm/pgalloc.h> | 33 | #include <asm/pgalloc.h> |
| 34 | #include <asm/tlbflush.h> | 34 | #include <asm/tlbflush.h> |
| 35 | 35 | ||
| 36 | /* | ||
| 37 | * We need to delay page freeing for SMP as other CPUs can access pages | ||
| 38 | * which have been removed but not yet had their TLB entries invalidated. | ||
| 39 | * Also, as ARMv7 speculative prefetch can drag new entries into the TLB, | ||
| 40 | * we need to apply this same delaying tactic to ensure correct operation. | ||
| 41 | */ | ||
| 42 | #if defined(CONFIG_SMP) || defined(CONFIG_CPU_32v7) | ||
| 43 | #define tlb_fast_mode(tlb) 0 | ||
| 44 | #else | ||
| 45 | #define tlb_fast_mode(tlb) 1 | ||
| 46 | #endif | ||
| 47 | |||
| 48 | #define MMU_GATHER_BUNDLE 8 | 36 | #define MMU_GATHER_BUNDLE 8 |
| 49 | 37 | ||
| 50 | /* | 38 | /* |
| @@ -112,12 +100,10 @@ static inline void __tlb_alloc_page(struct mmu_gather *tlb) | |||
| 112 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) | 100 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) |
| 113 | { | 101 | { |
| 114 | tlb_flush(tlb); | 102 | tlb_flush(tlb); |
| 115 | if (!tlb_fast_mode(tlb)) { | 103 | free_pages_and_swap_cache(tlb->pages, tlb->nr); |
| 116 | free_pages_and_swap_cache(tlb->pages, tlb->nr); | 104 | tlb->nr = 0; |
| 117 | tlb->nr = 0; | 105 | if (tlb->pages == tlb->local) |
| 118 | if (tlb->pages == tlb->local) | 106 | __tlb_alloc_page(tlb); |
| 119 | __tlb_alloc_page(tlb); | ||
| 120 | } | ||
| 121 | } | 107 | } |
| 122 | 108 | ||
| 123 | static inline void | 109 | static inline void |
| @@ -178,11 +164,6 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | |||
| 178 | 164 | ||
| 179 | static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page) | 165 | static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page) |
| 180 | { | 166 | { |
| 181 | if (tlb_fast_mode(tlb)) { | ||
| 182 | free_page_and_swap_cache(page); | ||
| 183 | return 1; /* avoid calling tlb_flush_mmu */ | ||
| 184 | } | ||
| 185 | |||
| 186 | tlb->pages[tlb->nr++] = page; | 167 | tlb->pages[tlb->nr++] = page; |
| 187 | VM_BUG_ON(tlb->nr > tlb->max); | 168 | VM_BUG_ON(tlb->nr > tlb->max); |
| 188 | return tlb->max - tlb->nr; | 169 | return tlb->max - tlb->nr; |
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c index 37d216d814cd..ef1703b9587b 100644 --- a/arch/arm/kvm/arm.c +++ b/arch/arm/kvm/arm.c | |||
| @@ -492,6 +492,11 @@ static void vcpu_pause(struct kvm_vcpu *vcpu) | |||
| 492 | wait_event_interruptible(*wq, !vcpu->arch.pause); | 492 | wait_event_interruptible(*wq, !vcpu->arch.pause); |
| 493 | } | 493 | } |
| 494 | 494 | ||
| 495 | static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu) | ||
| 496 | { | ||
| 497 | return vcpu->arch.target >= 0; | ||
| 498 | } | ||
| 499 | |||
| 495 | /** | 500 | /** |
| 496 | * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code | 501 | * kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code |
| 497 | * @vcpu: The VCPU pointer | 502 | * @vcpu: The VCPU pointer |
| @@ -508,8 +513,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) | |||
| 508 | int ret; | 513 | int ret; |
| 509 | sigset_t sigsaved; | 514 | sigset_t sigsaved; |
| 510 | 515 | ||
| 511 | /* Make sure they initialize the vcpu with KVM_ARM_VCPU_INIT */ | 516 | if (unlikely(!kvm_vcpu_initialized(vcpu))) |
| 512 | if (unlikely(vcpu->arch.target < 0)) | ||
| 513 | return -ENOEXEC; | 517 | return -ENOEXEC; |
| 514 | 518 | ||
| 515 | ret = kvm_vcpu_first_run_init(vcpu); | 519 | ret = kvm_vcpu_first_run_init(vcpu); |
| @@ -710,6 +714,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | |||
| 710 | case KVM_SET_ONE_REG: | 714 | case KVM_SET_ONE_REG: |
| 711 | case KVM_GET_ONE_REG: { | 715 | case KVM_GET_ONE_REG: { |
| 712 | struct kvm_one_reg reg; | 716 | struct kvm_one_reg reg; |
| 717 | |||
| 718 | if (unlikely(!kvm_vcpu_initialized(vcpu))) | ||
| 719 | return -ENOEXEC; | ||
| 720 | |||
| 713 | if (copy_from_user(®, argp, sizeof(reg))) | 721 | if (copy_from_user(®, argp, sizeof(reg))) |
| 714 | return -EFAULT; | 722 | return -EFAULT; |
| 715 | if (ioctl == KVM_SET_ONE_REG) | 723 | if (ioctl == KVM_SET_ONE_REG) |
| @@ -722,6 +730,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp, | |||
| 722 | struct kvm_reg_list reg_list; | 730 | struct kvm_reg_list reg_list; |
| 723 | unsigned n; | 731 | unsigned n; |
| 724 | 732 | ||
| 733 | if (unlikely(!kvm_vcpu_initialized(vcpu))) | ||
| 734 | return -ENOEXEC; | ||
| 735 | |||
| 725 | if (copy_from_user(®_list, user_list, sizeof(reg_list))) | 736 | if (copy_from_user(®_list, user_list, sizeof(reg_list))) |
| 726 | return -EFAULT; | 737 | return -EFAULT; |
| 727 | n = reg_list.n; | 738 | n = reg_list.n; |
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c index 965706578f13..84ba67b982c0 100644 --- a/arch/arm/kvm/mmu.c +++ b/arch/arm/kvm/mmu.c | |||
| @@ -43,7 +43,14 @@ static phys_addr_t hyp_idmap_vector; | |||
| 43 | 43 | ||
| 44 | static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa) | 44 | static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa) |
| 45 | { | 45 | { |
| 46 | kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa); | 46 | /* |
| 47 | * This function also gets called when dealing with HYP page | ||
| 48 | * tables. As HYP doesn't have an associated struct kvm (and | ||
| 49 | * the HYP page tables are fairly static), we don't do | ||
| 50 | * anything there. | ||
| 51 | */ | ||
| 52 | if (kvm) | ||
| 53 | kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa); | ||
| 47 | } | 54 | } |
| 48 | 55 | ||
| 49 | static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache, | 56 | static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache, |
| @@ -78,18 +85,20 @@ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc) | |||
| 78 | return p; | 85 | return p; |
| 79 | } | 86 | } |
| 80 | 87 | ||
| 81 | static void clear_pud_entry(pud_t *pud) | 88 | static void clear_pud_entry(struct kvm *kvm, pud_t *pud, phys_addr_t addr) |
| 82 | { | 89 | { |
| 83 | pmd_t *pmd_table = pmd_offset(pud, 0); | 90 | pmd_t *pmd_table = pmd_offset(pud, 0); |
| 84 | pud_clear(pud); | 91 | pud_clear(pud); |
| 92 | kvm_tlb_flush_vmid_ipa(kvm, addr); | ||
| 85 | pmd_free(NULL, pmd_table); | 93 | pmd_free(NULL, pmd_table); |
| 86 | put_page(virt_to_page(pud)); | 94 | put_page(virt_to_page(pud)); |
| 87 | } | 95 | } |
| 88 | 96 | ||
| 89 | static void clear_pmd_entry(pmd_t *pmd) | 97 | static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr) |
| 90 | { | 98 | { |
| 91 | pte_t *pte_table = pte_offset_kernel(pmd, 0); | 99 | pte_t *pte_table = pte_offset_kernel(pmd, 0); |
| 92 | pmd_clear(pmd); | 100 | pmd_clear(pmd); |
| 101 | kvm_tlb_flush_vmid_ipa(kvm, addr); | ||
| 93 | pte_free_kernel(NULL, pte_table); | 102 | pte_free_kernel(NULL, pte_table); |
| 94 | put_page(virt_to_page(pmd)); | 103 | put_page(virt_to_page(pmd)); |
| 95 | } | 104 | } |
| @@ -100,11 +109,12 @@ static bool pmd_empty(pmd_t *pmd) | |||
| 100 | return page_count(pmd_page) == 1; | 109 | return page_count(pmd_page) == 1; |
| 101 | } | 110 | } |
| 102 | 111 | ||
| 103 | static void clear_pte_entry(pte_t *pte) | 112 | static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr) |
| 104 | { | 113 | { |
| 105 | if (pte_present(*pte)) { | 114 | if (pte_present(*pte)) { |
| 106 | kvm_set_pte(pte, __pte(0)); | 115 | kvm_set_pte(pte, __pte(0)); |
| 107 | put_page(virt_to_page(pte)); | 116 | put_page(virt_to_page(pte)); |
| 117 | kvm_tlb_flush_vmid_ipa(kvm, addr); | ||
| 108 | } | 118 | } |
| 109 | } | 119 | } |
| 110 | 120 | ||
| @@ -114,7 +124,8 @@ static bool pte_empty(pte_t *pte) | |||
| 114 | return page_count(pte_page) == 1; | 124 | return page_count(pte_page) == 1; |
| 115 | } | 125 | } |
| 116 | 126 | ||
| 117 | static void unmap_range(pgd_t *pgdp, unsigned long long start, u64 size) | 127 | static void unmap_range(struct kvm *kvm, pgd_t *pgdp, |
| 128 | unsigned long long start, u64 size) | ||
| 118 | { | 129 | { |
| 119 | pgd_t *pgd; | 130 | pgd_t *pgd; |
| 120 | pud_t *pud; | 131 | pud_t *pud; |
| @@ -138,15 +149,15 @@ static void unmap_range(pgd_t *pgdp, unsigned long long start, u64 size) | |||
| 138 | } | 149 | } |
| 139 | 150 | ||
| 140 | pte = pte_offset_kernel(pmd, addr); | 151 | pte = pte_offset_kernel(pmd, addr); |
| 141 | clear_pte_entry(pte); | 152 | clear_pte_entry(kvm, pte, addr); |
| 142 | range = PAGE_SIZE; | 153 | range = PAGE_SIZE; |
| 143 | 154 | ||
| 144 | /* If we emptied the pte, walk back up the ladder */ | 155 | /* If we emptied the pte, walk back up the ladder */ |
| 145 | if (pte_empty(pte)) { | 156 | if (pte_empty(pte)) { |
| 146 | clear_pmd_entry(pmd); | 157 | clear_pmd_entry(kvm, pmd, addr); |
| 147 | range = PMD_SIZE; | 158 | range = PMD_SIZE; |
| 148 | if (pmd_empty(pmd)) { | 159 | if (pmd_empty(pmd)) { |
| 149 | clear_pud_entry(pud); | 160 | clear_pud_entry(kvm, pud, addr); |
| 150 | range = PUD_SIZE; | 161 | range = PUD_SIZE; |
| 151 | } | 162 | } |
| 152 | } | 163 | } |
| @@ -165,14 +176,14 @@ void free_boot_hyp_pgd(void) | |||
| 165 | mutex_lock(&kvm_hyp_pgd_mutex); | 176 | mutex_lock(&kvm_hyp_pgd_mutex); |
| 166 | 177 | ||
| 167 | if (boot_hyp_pgd) { | 178 | if (boot_hyp_pgd) { |
| 168 | unmap_range(boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE); | 179 | unmap_range(NULL, boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE); |
| 169 | unmap_range(boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); | 180 | unmap_range(NULL, boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); |
| 170 | kfree(boot_hyp_pgd); | 181 | kfree(boot_hyp_pgd); |
| 171 | boot_hyp_pgd = NULL; | 182 | boot_hyp_pgd = NULL; |
| 172 | } | 183 | } |
| 173 | 184 | ||
| 174 | if (hyp_pgd) | 185 | if (hyp_pgd) |
| 175 | unmap_range(hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); | 186 | unmap_range(NULL, hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE); |
| 176 | 187 | ||
| 177 | kfree(init_bounce_page); | 188 | kfree(init_bounce_page); |
| 178 | init_bounce_page = NULL; | 189 | init_bounce_page = NULL; |
| @@ -200,9 +211,10 @@ void free_hyp_pgds(void) | |||
| 200 | 211 | ||
| 201 | if (hyp_pgd) { | 212 | if (hyp_pgd) { |
| 202 | for (addr = PAGE_OFFSET; virt_addr_valid(addr); addr += PGDIR_SIZE) | 213 | for (addr = PAGE_OFFSET; virt_addr_valid(addr); addr += PGDIR_SIZE) |
| 203 | unmap_range(hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); | 214 | unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); |
| 204 | for (addr = VMALLOC_START; is_vmalloc_addr((void*)addr); addr += PGDIR_SIZE) | 215 | for (addr = VMALLOC_START; is_vmalloc_addr((void*)addr); addr += PGDIR_SIZE) |
| 205 | unmap_range(hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); | 216 | unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE); |
| 217 | |||
| 206 | kfree(hyp_pgd); | 218 | kfree(hyp_pgd); |
| 207 | hyp_pgd = NULL; | 219 | hyp_pgd = NULL; |
| 208 | } | 220 | } |
| @@ -393,7 +405,7 @@ int kvm_alloc_stage2_pgd(struct kvm *kvm) | |||
| 393 | */ | 405 | */ |
| 394 | static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size) | 406 | static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size) |
| 395 | { | 407 | { |
| 396 | unmap_range(kvm->arch.pgd, start, size); | 408 | unmap_range(kvm, kvm->arch.pgd, start, size); |
| 397 | } | 409 | } |
| 398 | 410 | ||
| 399 | /** | 411 | /** |
| @@ -675,7 +687,6 @@ static void handle_hva_to_gpa(struct kvm *kvm, | |||
| 675 | static void kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, void *data) | 687 | static void kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, void *data) |
| 676 | { | 688 | { |
| 677 | unmap_stage2_range(kvm, gpa, PAGE_SIZE); | 689 | unmap_stage2_range(kvm, gpa, PAGE_SIZE); |
| 678 | kvm_tlb_flush_vmid_ipa(kvm, gpa); | ||
| 679 | } | 690 | } |
| 680 | 691 | ||
| 681 | int kvm_unmap_hva(struct kvm *kvm, unsigned long hva) | 692 | int kvm_unmap_hva(struct kvm *kvm, unsigned long hva) |
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 027c9e7f0d13..f7e504b7874d 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c | |||
| @@ -386,6 +386,8 @@ int __init exynos_fdt_map_chipid(unsigned long node, const char *uname, | |||
| 386 | 386 | ||
| 387 | void __init exynos_init_io(struct map_desc *mach_desc, int size) | 387 | void __init exynos_init_io(struct map_desc *mach_desc, int size) |
| 388 | { | 388 | { |
| 389 | debug_ll_io_init(); | ||
| 390 | |||
| 389 | #ifdef CONFIG_OF | 391 | #ifdef CONFIG_OF |
| 390 | if (initial_boot_params) | 392 | if (initial_boot_params) |
| 391 | of_scan_flat_dt(exynos_fdt_map_chipid, NULL); | 393 | of_scan_flat_dt(exynos_fdt_map_chipid, NULL); |
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index dda9a2bd3acb..4e3148ce852d 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
| @@ -181,14 +181,14 @@ static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", "osc", "dummy", | |||
| 181 | static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "pll2_bus", }; | 181 | static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "pll2_bus", }; |
| 182 | static const char *periph_sels[] = { "periph_pre", "periph_clk2", }; | 182 | static const char *periph_sels[] = { "periph_pre", "periph_clk2", }; |
| 183 | static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", }; | 183 | static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", }; |
| 184 | static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | 184 | static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "periph", "pll3_pfd1_540m", }; |
| 185 | static const char *audio_sels[] = { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd3_454m", "pll3_usb_otg", }; | 185 | static const char *audio_sels[] = { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd3_454m", "pll3_usb_otg", }; |
| 186 | static const char *gpu_axi_sels[] = { "axi", "ahb", }; | 186 | static const char *gpu_axi_sels[] = { "axi", "ahb", }; |
| 187 | static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", }; | 187 | static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", }; |
| 188 | static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", }; | 188 | static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", }; |
| 189 | static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll3_pfd0_720m", }; | 189 | static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll3_pfd0_720m", }; |
| 190 | static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; | 190 | static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", }; |
| 191 | static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", }; | 191 | static const char *ldb_di_sels[] = { "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", }; |
| 192 | static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; | 192 | static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", }; |
| 193 | static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | 193 | static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; |
| 194 | static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; | 194 | static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", }; |
diff --git a/arch/arm/mach-kirkwood/board-ts219.c b/arch/arm/mach-kirkwood/board-ts219.c index acb0187c7ee1..4695d5f35fc9 100644 --- a/arch/arm/mach-kirkwood/board-ts219.c +++ b/arch/arm/mach-kirkwood/board-ts219.c | |||
| @@ -41,13 +41,3 @@ void __init qnap_dt_ts219_init(void) | |||
| 41 | 41 | ||
| 42 | pm_power_off = qnap_tsx1x_power_off; | 42 | pm_power_off = qnap_tsx1x_power_off; |
| 43 | } | 43 | } |
| 44 | |||
| 45 | /* FIXME: Will not work with DT. Maybe use MPP40_GPIO? */ | ||
| 46 | static int __init ts219_pci_init(void) | ||
| 47 | { | ||
| 48 | if (machine_is_ts219()) | ||
| 49 | kirkwood_pcie_init(KW_PCIE0); | ||
| 50 | |||
| 51 | return 0; | ||
| 52 | } | ||
| 53 | subsys_initcall(ts219_pci_init); | ||
diff --git a/arch/arm/mach-mvebu/coherency_ll.S b/arch/arm/mach-mvebu/coherency_ll.S index 53e8391192cd..5476669ba905 100644 --- a/arch/arm/mach-mvebu/coherency_ll.S +++ b/arch/arm/mach-mvebu/coherency_ll.S | |||
| @@ -32,15 +32,21 @@ ENTRY(ll_set_cpu_coherent) | |||
| 32 | 32 | ||
| 33 | /* Add CPU to SMP group - Atomic */ | 33 | /* Add CPU to SMP group - Atomic */ |
| 34 | add r3, r0, #ARMADA_XP_CFB_CTL_REG_OFFSET | 34 | add r3, r0, #ARMADA_XP_CFB_CTL_REG_OFFSET |
| 35 | ldr r2, [r3] | 35 | 1: |
| 36 | ldrex r2, [r3] | ||
| 36 | orr r2, r2, r1 | 37 | orr r2, r2, r1 |
| 37 | str r2, [r3] | 38 | strex r0, r2, [r3] |
| 39 | cmp r0, #0 | ||
| 40 | bne 1b | ||
| 38 | 41 | ||
| 39 | /* Enable coherency on CPU - Atomic */ | 42 | /* Enable coherency on CPU - Atomic */ |
| 40 | add r3, r0, #ARMADA_XP_CFB_CFG_REG_OFFSET | 43 | add r3, r3, #ARMADA_XP_CFB_CFG_REG_OFFSET |
| 41 | ldr r2, [r3] | 44 | 1: |
| 45 | ldrex r2, [r3] | ||
| 42 | orr r2, r2, r1 | 46 | orr r2, r2, r1 |
| 43 | str r2, [r3] | 47 | strex r0, r2, [r3] |
| 48 | cmp r0, #0 | ||
| 49 | bne 1b | ||
| 44 | 50 | ||
| 45 | dsb | 51 | dsb |
| 46 | 52 | ||
diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index fdf3894b1cc3..9696f3646864 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c | |||
| @@ -252,7 +252,7 @@ static struct sh_timer_config cmt10_platform_data = { | |||
| 252 | .name = "CMT10", | 252 | .name = "CMT10", |
| 253 | .channel_offset = 0x10, | 253 | .channel_offset = 0x10, |
| 254 | .timer_bit = 0, | 254 | .timer_bit = 0, |
| 255 | .clockevent_rating = 125, | 255 | .clockevent_rating = 80, |
| 256 | .clocksource_rating = 125, | 256 | .clocksource_rating = 125, |
| 257 | }; | 257 | }; |
| 258 | 258 | ||
diff --git a/arch/arm/mach-ux500/board-mop500-regulators.c b/arch/arm/mach-ux500/board-mop500-regulators.c index 33c353bc1c4a..d6b7c8556fa1 100644 --- a/arch/arm/mach-ux500/board-mop500-regulators.c +++ b/arch/arm/mach-ux500/board-mop500-regulators.c | |||
| @@ -374,6 +374,7 @@ static struct ab8500_regulator_reg_init ab8500_reg_init[] = { | |||
| 374 | static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | 374 | static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { |
| 375 | /* supplies to the display/camera */ | 375 | /* supplies to the display/camera */ |
| 376 | [AB8500_LDO_AUX1] = { | 376 | [AB8500_LDO_AUX1] = { |
| 377 | .supply_regulator = "ab8500-ext-supply3", | ||
| 377 | .constraints = { | 378 | .constraints = { |
| 378 | .name = "V-DISPLAY", | 379 | .name = "V-DISPLAY", |
| 379 | .min_uV = 2800000, | 380 | .min_uV = 2800000, |
| @@ -387,6 +388,7 @@ static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
| 387 | }, | 388 | }, |
| 388 | /* supplies to the on-board eMMC */ | 389 | /* supplies to the on-board eMMC */ |
| 389 | [AB8500_LDO_AUX2] = { | 390 | [AB8500_LDO_AUX2] = { |
| 391 | .supply_regulator = "ab8500-ext-supply3", | ||
| 390 | .constraints = { | 392 | .constraints = { |
| 391 | .name = "V-eMMC1", | 393 | .name = "V-eMMC1", |
| 392 | .min_uV = 1100000, | 394 | .min_uV = 1100000, |
| @@ -402,6 +404,7 @@ static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
| 402 | }, | 404 | }, |
| 403 | /* supply for VAUX3, supplies to SDcard slots */ | 405 | /* supply for VAUX3, supplies to SDcard slots */ |
| 404 | [AB8500_LDO_AUX3] = { | 406 | [AB8500_LDO_AUX3] = { |
| 407 | .supply_regulator = "ab8500-ext-supply3", | ||
| 405 | .constraints = { | 408 | .constraints = { |
| 406 | .name = "V-MMC-SD", | 409 | .name = "V-MMC-SD", |
| 407 | .min_uV = 1100000, | 410 | .min_uV = 1100000, |
diff --git a/arch/arm/mach-ux500/cpuidle.c b/arch/arm/mach-ux500/cpuidle.c index 317a2be129fb..a45dd09daed9 100644 --- a/arch/arm/mach-ux500/cpuidle.c +++ b/arch/arm/mach-ux500/cpuidle.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <asm/proc-fns.h> | 21 | #include <asm/proc-fns.h> |
| 22 | 22 | ||
| 23 | #include "db8500-regs.h" | 23 | #include "db8500-regs.h" |
| 24 | #include "id.h" | ||
| 24 | 25 | ||
| 25 | static atomic_t master = ATOMIC_INIT(0); | 26 | static atomic_t master = ATOMIC_INIT(0); |
| 26 | static DEFINE_SPINLOCK(master_lock); | 27 | static DEFINE_SPINLOCK(master_lock); |
| @@ -114,6 +115,9 @@ static struct cpuidle_driver ux500_idle_driver = { | |||
| 114 | 115 | ||
| 115 | int __init ux500_idle_init(void) | 116 | int __init ux500_idle_init(void) |
| 116 | { | 117 | { |
| 118 | if (!(cpu_is_u8500_family() || cpu_is_ux540_family())) | ||
| 119 | return -ENODEV; | ||
| 120 | |||
| 117 | /* Configure wake up reasons */ | 121 | /* Configure wake up reasons */ |
| 118 | prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) | | 122 | prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) | |
| 119 | PRCMU_WAKEUP(ABB)); | 123 | PRCMU_WAKEUP(ABB)); |
diff --git a/arch/arm/plat-samsung/include/plat/uncompress.h b/arch/arm/plat-samsung/include/plat/uncompress.h index 438b24846e7f..02b66d723d1a 100644 --- a/arch/arm/plat-samsung/include/plat/uncompress.h +++ b/arch/arm/plat-samsung/include/plat/uncompress.h | |||
| @@ -66,6 +66,9 @@ uart_rd(unsigned int reg) | |||
| 66 | 66 | ||
| 67 | static void putc(int ch) | 67 | static void putc(int ch) |
| 68 | { | 68 | { |
| 69 | if (!config_enabled(CONFIG_DEBUG_LL)) | ||
| 70 | return; | ||
| 71 | |||
| 69 | if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) { | 72 | if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) { |
| 70 | int level; | 73 | int level; |
| 71 | 74 | ||
| @@ -118,7 +121,12 @@ static void arch_decomp_error(const char *x) | |||
| 118 | #ifdef CONFIG_S3C_BOOT_UART_FORCE_FIFO | 121 | #ifdef CONFIG_S3C_BOOT_UART_FORCE_FIFO |
| 119 | static inline void arch_enable_uart_fifo(void) | 122 | static inline void arch_enable_uart_fifo(void) |
| 120 | { | 123 | { |
| 121 | u32 fifocon = uart_rd(S3C2410_UFCON); | 124 | u32 fifocon; |
| 125 | |||
| 126 | if (!config_enabled(CONFIG_DEBUG_LL)) | ||
| 127 | return; | ||
| 128 | |||
| 129 | fifocon = uart_rd(S3C2410_UFCON); | ||
| 122 | 130 | ||
| 123 | if (!(fifocon & S3C2410_UFCON_FIFOMODE)) { | 131 | if (!(fifocon & S3C2410_UFCON_FIFOMODE)) { |
| 124 | fifocon |= S3C2410_UFCON_RESETBOTH; | 132 | fifocon |= S3C2410_UFCON_RESETBOTH; |
diff --git a/arch/ia64/include/asm/tlb.h b/arch/ia64/include/asm/tlb.h index c3ffe3e54edc..ef3a9de01954 100644 --- a/arch/ia64/include/asm/tlb.h +++ b/arch/ia64/include/asm/tlb.h | |||
| @@ -46,12 +46,6 @@ | |||
| 46 | #include <asm/tlbflush.h> | 46 | #include <asm/tlbflush.h> |
| 47 | #include <asm/machvec.h> | 47 | #include <asm/machvec.h> |
| 48 | 48 | ||
| 49 | #ifdef CONFIG_SMP | ||
| 50 | # define tlb_fast_mode(tlb) ((tlb)->nr == ~0U) | ||
| 51 | #else | ||
| 52 | # define tlb_fast_mode(tlb) (1) | ||
| 53 | #endif | ||
| 54 | |||
| 55 | /* | 49 | /* |
| 56 | * If we can't allocate a page to make a big batch of page pointers | 50 | * If we can't allocate a page to make a big batch of page pointers |
| 57 | * to work on, then just handle a few from the on-stack structure. | 51 | * to work on, then just handle a few from the on-stack structure. |
| @@ -60,7 +54,7 @@ | |||
| 60 | 54 | ||
| 61 | struct mmu_gather { | 55 | struct mmu_gather { |
| 62 | struct mm_struct *mm; | 56 | struct mm_struct *mm; |
| 63 | unsigned int nr; /* == ~0U => fast mode */ | 57 | unsigned int nr; |
| 64 | unsigned int max; | 58 | unsigned int max; |
| 65 | unsigned char fullmm; /* non-zero means full mm flush */ | 59 | unsigned char fullmm; /* non-zero means full mm flush */ |
| 66 | unsigned char need_flush; /* really unmapped some PTEs? */ | 60 | unsigned char need_flush; /* really unmapped some PTEs? */ |
| @@ -103,6 +97,7 @@ extern struct ia64_tr_entry *ia64_idtrs[NR_CPUS]; | |||
| 103 | static inline void | 97 | static inline void |
| 104 | ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end) | 98 | ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end) |
| 105 | { | 99 | { |
| 100 | unsigned long i; | ||
| 106 | unsigned int nr; | 101 | unsigned int nr; |
| 107 | 102 | ||
| 108 | if (!tlb->need_flush) | 103 | if (!tlb->need_flush) |
| @@ -141,13 +136,11 @@ ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long e | |||
| 141 | 136 | ||
| 142 | /* lastly, release the freed pages */ | 137 | /* lastly, release the freed pages */ |
| 143 | nr = tlb->nr; | 138 | nr = tlb->nr; |
| 144 | if (!tlb_fast_mode(tlb)) { | 139 | |
| 145 | unsigned long i; | 140 | tlb->nr = 0; |
| 146 | tlb->nr = 0; | 141 | tlb->start_addr = ~0UL; |
| 147 | tlb->start_addr = ~0UL; | 142 | for (i = 0; i < nr; ++i) |
| 148 | for (i = 0; i < nr; ++i) | 143 | free_page_and_swap_cache(tlb->pages[i]); |
| 149 | free_page_and_swap_cache(tlb->pages[i]); | ||
| 150 | } | ||
| 151 | } | 144 | } |
| 152 | 145 | ||
| 153 | static inline void __tlb_alloc_page(struct mmu_gather *tlb) | 146 | static inline void __tlb_alloc_page(struct mmu_gather *tlb) |
| @@ -167,20 +160,7 @@ tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int full_m | |||
| 167 | tlb->mm = mm; | 160 | tlb->mm = mm; |
| 168 | tlb->max = ARRAY_SIZE(tlb->local); | 161 | tlb->max = ARRAY_SIZE(tlb->local); |
| 169 | tlb->pages = tlb->local; | 162 | tlb->pages = tlb->local; |
| 170 | /* | 163 | tlb->nr = 0; |
| 171 | * Use fast mode if only 1 CPU is online. | ||
| 172 | * | ||
| 173 | * It would be tempting to turn on fast-mode for full_mm_flush as well. But this | ||
| 174 | * doesn't work because of speculative accesses and software prefetching: the page | ||
| 175 | * table of "mm" may (and usually is) the currently active page table and even | ||
| 176 | * though the kernel won't do any user-space accesses during the TLB shoot down, a | ||
| 177 | * compiler might use speculation or lfetch.fault on what happens to be a valid | ||
| 178 | * user-space address. This in turn could trigger a TLB miss fault (or a VHPT | ||
| 179 | * walk) and re-insert a TLB entry we just removed. Slow mode avoids such | ||
| 180 | * problems. (We could make fast-mode work by switching the current task to a | ||
| 181 | * different "mm" during the shootdown.) --davidm 08/02/2002 | ||
| 182 | */ | ||
| 183 | tlb->nr = (num_online_cpus() == 1) ? ~0U : 0; | ||
| 184 | tlb->fullmm = full_mm_flush; | 164 | tlb->fullmm = full_mm_flush; |
| 185 | tlb->start_addr = ~0UL; | 165 | tlb->start_addr = ~0UL; |
| 186 | } | 166 | } |
| @@ -214,11 +194,6 @@ static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page) | |||
| 214 | { | 194 | { |
| 215 | tlb->need_flush = 1; | 195 | tlb->need_flush = 1; |
| 216 | 196 | ||
| 217 | if (tlb_fast_mode(tlb)) { | ||
| 218 | free_page_and_swap_cache(page); | ||
| 219 | return 1; /* avoid calling tlb_flush_mmu */ | ||
| 220 | } | ||
| 221 | |||
| 222 | if (!tlb->nr && tlb->pages == tlb->local) | 197 | if (!tlb->nr && tlb->pages == tlb->local) |
| 223 | __tlb_alloc_page(tlb); | 198 | __tlb_alloc_page(tlb); |
| 224 | 199 | ||
diff --git a/arch/m68k/include/asm/gpio.h b/arch/m68k/include/asm/gpio.h index 8cc83431805b..2f6eec1e34b4 100644 --- a/arch/m68k/include/asm/gpio.h +++ b/arch/m68k/include/asm/gpio.h | |||
| @@ -86,6 +86,7 @@ static inline int gpio_cansleep(unsigned gpio) | |||
| 86 | return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio); | 86 | return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | #ifndef CONFIG_GPIOLIB | ||
| 89 | static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) | 90 | static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) |
| 90 | { | 91 | { |
| 91 | int err; | 92 | int err; |
| @@ -105,5 +106,5 @@ static inline int gpio_request_one(unsigned gpio, unsigned long flags, const cha | |||
| 105 | 106 | ||
| 106 | return err; | 107 | return err; |
| 107 | } | 108 | } |
| 108 | 109 | #endif /* !CONFIG_GPIOLIB */ | |
| 109 | #endif | 110 | #endif |
diff --git a/arch/m68k/kernel/head.S b/arch/m68k/kernel/head.S index d197e7ff62c5..ac85f16534af 100644 --- a/arch/m68k/kernel/head.S +++ b/arch/m68k/kernel/head.S | |||
| @@ -2752,11 +2752,9 @@ func_return get_new_page | |||
| 2752 | #ifdef CONFIG_MAC | 2752 | #ifdef CONFIG_MAC |
| 2753 | 2753 | ||
| 2754 | L(scc_initable_mac): | 2754 | L(scc_initable_mac): |
| 2755 | .byte 9,12 /* Reset */ | ||
| 2756 | .byte 4,0x44 /* x16, 1 stopbit, no parity */ | 2755 | .byte 4,0x44 /* x16, 1 stopbit, no parity */ |
| 2757 | .byte 3,0xc0 /* receiver: 8 bpc */ | 2756 | .byte 3,0xc0 /* receiver: 8 bpc */ |
| 2758 | .byte 5,0xe2 /* transmitter: 8 bpc, assert dtr/rts */ | 2757 | .byte 5,0xe2 /* transmitter: 8 bpc, assert dtr/rts */ |
| 2759 | .byte 9,0 /* no interrupts */ | ||
| 2760 | .byte 10,0 /* NRZ */ | 2758 | .byte 10,0 /* NRZ */ |
| 2761 | .byte 11,0x50 /* use baud rate generator */ | 2759 | .byte 11,0x50 /* use baud rate generator */ |
| 2762 | .byte 12,1,13,0 /* 38400 baud */ | 2760 | .byte 12,1,13,0 /* 38400 baud */ |
| @@ -2899,6 +2897,7 @@ func_start serial_init,%d0/%d1/%a0/%a1 | |||
| 2899 | is_not_mac(L(serial_init_not_mac)) | 2897 | is_not_mac(L(serial_init_not_mac)) |
| 2900 | 2898 | ||
| 2901 | #ifdef SERIAL_DEBUG | 2899 | #ifdef SERIAL_DEBUG |
| 2900 | |||
| 2902 | /* You may define either or both of these. */ | 2901 | /* You may define either or both of these. */ |
| 2903 | #define MAC_USE_SCC_A /* Modem port */ | 2902 | #define MAC_USE_SCC_A /* Modem port */ |
| 2904 | #define MAC_USE_SCC_B /* Printer port */ | 2903 | #define MAC_USE_SCC_B /* Printer port */ |
| @@ -2908,9 +2907,21 @@ func_start serial_init,%d0/%d1/%a0/%a1 | |||
| 2908 | #define mac_scc_cha_b_data_offset 0x4 | 2907 | #define mac_scc_cha_b_data_offset 0x4 |
| 2909 | #define mac_scc_cha_a_data_offset 0x6 | 2908 | #define mac_scc_cha_a_data_offset 0x6 |
| 2910 | 2909 | ||
| 2910 | #if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B) | ||
| 2911 | movel %pc@(L(mac_sccbase)),%a0 | ||
| 2912 | /* Reset SCC device */ | ||
| 2913 | moveb #9,%a0@(mac_scc_cha_a_ctrl_offset) | ||
| 2914 | moveb #0xc0,%a0@(mac_scc_cha_a_ctrl_offset) | ||
| 2915 | /* Wait for 5 PCLK cycles, which is about 68 CPU cycles */ | ||
| 2916 | /* 5 / 3.6864 MHz = approx. 1.36 us = 68 / 50 MHz */ | ||
| 2917 | movel #35,%d0 | ||
| 2918 | 5: | ||
| 2919 | subq #1,%d0 | ||
| 2920 | jne 5b | ||
| 2921 | #endif | ||
| 2922 | |||
| 2911 | #ifdef MAC_USE_SCC_A | 2923 | #ifdef MAC_USE_SCC_A |
| 2912 | /* Initialize channel A */ | 2924 | /* Initialize channel A */ |
| 2913 | movel %pc@(L(mac_sccbase)),%a0 | ||
| 2914 | lea %pc@(L(scc_initable_mac)),%a1 | 2925 | lea %pc@(L(scc_initable_mac)),%a1 |
| 2915 | 5: moveb %a1@+,%d0 | 2926 | 5: moveb %a1@+,%d0 |
| 2916 | jmi 6f | 2927 | jmi 6f |
| @@ -2922,9 +2933,6 @@ func_start serial_init,%d0/%d1/%a0/%a1 | |||
| 2922 | 2933 | ||
| 2923 | #ifdef MAC_USE_SCC_B | 2934 | #ifdef MAC_USE_SCC_B |
| 2924 | /* Initialize channel B */ | 2935 | /* Initialize channel B */ |
| 2925 | #ifndef MAC_USE_SCC_A /* Load mac_sccbase only if needed */ | ||
| 2926 | movel %pc@(L(mac_sccbase)),%a0 | ||
| 2927 | #endif /* MAC_USE_SCC_A */ | ||
| 2928 | lea %pc@(L(scc_initable_mac)),%a1 | 2936 | lea %pc@(L(scc_initable_mac)),%a1 |
| 2929 | 7: moveb %a1@+,%d0 | 2937 | 7: moveb %a1@+,%d0 |
| 2930 | jmi 8f | 2938 | jmi 8f |
| @@ -2933,6 +2941,7 @@ func_start serial_init,%d0/%d1/%a0/%a1 | |||
| 2933 | jra 7b | 2941 | jra 7b |
| 2934 | 8: | 2942 | 8: |
| 2935 | #endif /* MAC_USE_SCC_B */ | 2943 | #endif /* MAC_USE_SCC_B */ |
| 2944 | |||
| 2936 | #endif /* SERIAL_DEBUG */ | 2945 | #endif /* SERIAL_DEBUG */ |
| 2937 | 2946 | ||
| 2938 | jra L(serial_init_done) | 2947 | jra L(serial_init_done) |
| @@ -3006,17 +3015,17 @@ func_start serial_putc,%d0/%d1/%a0/%a1 | |||
| 3006 | 3015 | ||
| 3007 | #ifdef SERIAL_DEBUG | 3016 | #ifdef SERIAL_DEBUG |
| 3008 | 3017 | ||
| 3009 | #ifdef MAC_USE_SCC_A | 3018 | #if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B) |
| 3010 | movel %pc@(L(mac_sccbase)),%a1 | 3019 | movel %pc@(L(mac_sccbase)),%a1 |
| 3020 | #endif | ||
| 3021 | |||
| 3022 | #ifdef MAC_USE_SCC_A | ||
| 3011 | 3: btst #2,%a1@(mac_scc_cha_a_ctrl_offset) | 3023 | 3: btst #2,%a1@(mac_scc_cha_a_ctrl_offset) |
| 3012 | jeq 3b | 3024 | jeq 3b |
| 3013 | moveb %d0,%a1@(mac_scc_cha_a_data_offset) | 3025 | moveb %d0,%a1@(mac_scc_cha_a_data_offset) |
| 3014 | #endif /* MAC_USE_SCC_A */ | 3026 | #endif /* MAC_USE_SCC_A */ |
| 3015 | 3027 | ||
| 3016 | #ifdef MAC_USE_SCC_B | 3028 | #ifdef MAC_USE_SCC_B |
| 3017 | #ifndef MAC_USE_SCC_A /* Load mac_sccbase only if needed */ | ||
| 3018 | movel %pc@(L(mac_sccbase)),%a1 | ||
| 3019 | #endif /* MAC_USE_SCC_A */ | ||
| 3020 | 4: btst #2,%a1@(mac_scc_cha_b_ctrl_offset) | 3029 | 4: btst #2,%a1@(mac_scc_cha_b_ctrl_offset) |
| 3021 | jeq 4b | 3030 | jeq 4b |
| 3022 | moveb %d0,%a1@(mac_scc_cha_b_data_offset) | 3031 | moveb %d0,%a1@(mac_scc_cha_b_data_offset) |
diff --git a/arch/microblaze/include/asm/cacheflush.h b/arch/microblaze/include/asm/cacheflush.h index 0f553bc009a0..ffea82a16d2c 100644 --- a/arch/microblaze/include/asm/cacheflush.h +++ b/arch/microblaze/include/asm/cacheflush.h | |||
| @@ -102,21 +102,23 @@ do { \ | |||
| 102 | 102 | ||
| 103 | #define flush_cache_range(vma, start, len) do { } while (0) | 103 | #define flush_cache_range(vma, start, len) do { } while (0) |
| 104 | 104 | ||
| 105 | #define copy_to_user_page(vma, page, vaddr, dst, src, len) \ | 105 | static inline void copy_to_user_page(struct vm_area_struct *vma, |
| 106 | do { \ | 106 | struct page *page, unsigned long vaddr, |
| 107 | u32 addr = virt_to_phys(dst); \ | 107 | void *dst, void *src, int len) |
| 108 | memcpy((dst), (src), (len)); \ | 108 | { |
| 109 | if (vma->vm_flags & VM_EXEC) { \ | 109 | u32 addr = virt_to_phys(dst); |
| 110 | invalidate_icache_range((unsigned) (addr), \ | 110 | memcpy(dst, src, len); |
| 111 | (unsigned) (addr) + PAGE_SIZE); \ | 111 | if (vma->vm_flags & VM_EXEC) { |
| 112 | flush_dcache_range((unsigned) (addr), \ | 112 | invalidate_icache_range(addr, addr + PAGE_SIZE); |
| 113 | (unsigned) (addr) + PAGE_SIZE); \ | 113 | flush_dcache_range(addr, addr + PAGE_SIZE); |
| 114 | } \ | 114 | } |
| 115 | } while (0) | 115 | } |
| 116 | 116 | ||
| 117 | #define copy_from_user_page(vma, page, vaddr, dst, src, len) \ | 117 | static inline void copy_from_user_page(struct vm_area_struct *vma, |
| 118 | do { \ | 118 | struct page *page, unsigned long vaddr, |
| 119 | memcpy((dst), (src), (len)); \ | 119 | void *dst, void *src, int len) |
| 120 | } while (0) | 120 | { |
| 121 | memcpy(dst, src, len); | ||
| 122 | } | ||
| 121 | 123 | ||
| 122 | #endif /* _ASM_MICROBLAZE_CACHEFLUSH_H */ | 124 | #endif /* _ASM_MICROBLAZE_CACHEFLUSH_H */ |
diff --git a/arch/microblaze/include/asm/uaccess.h b/arch/microblaze/include/asm/uaccess.h index efe59d881789..04e49553bdf9 100644 --- a/arch/microblaze/include/asm/uaccess.h +++ b/arch/microblaze/include/asm/uaccess.h | |||
| @@ -99,13 +99,13 @@ static inline int access_ok(int type, const void __user *addr, | |||
| 99 | if ((get_fs().seg < ((unsigned long)addr)) || | 99 | if ((get_fs().seg < ((unsigned long)addr)) || |
| 100 | (get_fs().seg < ((unsigned long)addr + size - 1))) { | 100 | (get_fs().seg < ((unsigned long)addr + size - 1))) { |
| 101 | pr_debug("ACCESS fail: %s at 0x%08x (size 0x%x), seg 0x%08x\n", | 101 | pr_debug("ACCESS fail: %s at 0x%08x (size 0x%x), seg 0x%08x\n", |
| 102 | type ? "WRITE" : "READ ", (u32)addr, (u32)size, | 102 | type ? "WRITE" : "READ ", (__force u32)addr, (u32)size, |
| 103 | (u32)get_fs().seg); | 103 | (u32)get_fs().seg); |
| 104 | return 0; | 104 | return 0; |
| 105 | } | 105 | } |
| 106 | ok: | 106 | ok: |
| 107 | pr_debug("ACCESS OK: %s at 0x%08x (size 0x%x), seg 0x%08x\n", | 107 | pr_debug("ACCESS OK: %s at 0x%08x (size 0x%x), seg 0x%08x\n", |
| 108 | type ? "WRITE" : "READ ", (u32)addr, (u32)size, | 108 | type ? "WRITE" : "READ ", (__force u32)addr, (u32)size, |
| 109 | (u32)get_fs().seg); | 109 | (u32)get_fs().seg); |
| 110 | return 1; | 110 | return 1; |
| 111 | } | 111 | } |
diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c index b0baa299f899..01b1b3f94feb 100644 --- a/arch/mips/cavium-octeon/setup.c +++ b/arch/mips/cavium-octeon/setup.c | |||
| @@ -428,13 +428,16 @@ static void octeon_restart(char *command) | |||
| 428 | */ | 428 | */ |
| 429 | static void octeon_kill_core(void *arg) | 429 | static void octeon_kill_core(void *arg) |
| 430 | { | 430 | { |
| 431 | mb(); | 431 | if (octeon_is_simulation()) |
| 432 | if (octeon_is_simulation()) { | ||
| 433 | /* The simulator needs the watchdog to stop for dead cores */ | ||
| 434 | cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0); | ||
| 435 | /* A break instruction causes the simulator stop a core */ | 432 | /* A break instruction causes the simulator stop a core */ |
| 436 | asm volatile ("sync\nbreak"); | 433 | asm volatile ("break" ::: "memory"); |
| 437 | } | 434 | |
| 435 | local_irq_disable(); | ||
| 436 | /* Disable watchdog on this core. */ | ||
| 437 | cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0); | ||
| 438 | /* Spin in a low power mode. */ | ||
| 439 | while (true) | ||
| 440 | asm volatile ("wait" ::: "memory"); | ||
| 438 | } | 441 | } |
| 439 | 442 | ||
| 440 | 443 | ||
diff --git a/arch/mips/include/asm/kvm_host.h b/arch/mips/include/asm/kvm_host.h index 143875c6c95a..4d6fa0bf1305 100644 --- a/arch/mips/include/asm/kvm_host.h +++ b/arch/mips/include/asm/kvm_host.h | |||
| @@ -496,10 +496,6 @@ struct kvm_mips_callbacks { | |||
| 496 | uint32_t cause); | 496 | uint32_t cause); |
| 497 | int (*irq_clear) (struct kvm_vcpu *vcpu, unsigned int priority, | 497 | int (*irq_clear) (struct kvm_vcpu *vcpu, unsigned int priority, |
| 498 | uint32_t cause); | 498 | uint32_t cause); |
| 499 | int (*vcpu_ioctl_get_regs) (struct kvm_vcpu *vcpu, | ||
| 500 | struct kvm_regs *regs); | ||
| 501 | int (*vcpu_ioctl_set_regs) (struct kvm_vcpu *vcpu, | ||
| 502 | struct kvm_regs *regs); | ||
| 503 | }; | 499 | }; |
| 504 | extern struct kvm_mips_callbacks *kvm_mips_callbacks; | 500 | extern struct kvm_mips_callbacks *kvm_mips_callbacks; |
| 505 | int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks); | 501 | int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks); |
diff --git a/arch/mips/include/asm/ptrace.h b/arch/mips/include/asm/ptrace.h index a3186f2bb8a0..5e6cd0947393 100644 --- a/arch/mips/include/asm/ptrace.h +++ b/arch/mips/include/asm/ptrace.h | |||
| @@ -16,6 +16,38 @@ | |||
| 16 | #include <asm/isadep.h> | 16 | #include <asm/isadep.h> |
| 17 | #include <uapi/asm/ptrace.h> | 17 | #include <uapi/asm/ptrace.h> |
| 18 | 18 | ||
| 19 | /* | ||
| 20 | * This struct defines the way the registers are stored on the stack during a | ||
| 21 | * system call/exception. As usual the registers k0/k1 aren't being saved. | ||
| 22 | */ | ||
| 23 | struct pt_regs { | ||
| 24 | #ifdef CONFIG_32BIT | ||
| 25 | /* Pad bytes for argument save space on the stack. */ | ||
| 26 | unsigned long pad0[6]; | ||
| 27 | #endif | ||
| 28 | |||
| 29 | /* Saved main processor registers. */ | ||
| 30 | unsigned long regs[32]; | ||
| 31 | |||
| 32 | /* Saved special registers. */ | ||
| 33 | unsigned long cp0_status; | ||
| 34 | unsigned long hi; | ||
| 35 | unsigned long lo; | ||
| 36 | #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||
| 37 | unsigned long acx; | ||
| 38 | #endif | ||
| 39 | unsigned long cp0_badvaddr; | ||
| 40 | unsigned long cp0_cause; | ||
| 41 | unsigned long cp0_epc; | ||
| 42 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 43 | unsigned long cp0_tcstatus; | ||
| 44 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 45 | #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||
| 46 | unsigned long long mpl[3]; /* MTM{0,1,2} */ | ||
| 47 | unsigned long long mtp[3]; /* MTP{0,1,2} */ | ||
| 48 | #endif | ||
| 49 | } __aligned(8); | ||
| 50 | |||
| 19 | struct task_struct; | 51 | struct task_struct; |
| 20 | 52 | ||
| 21 | extern int ptrace_getregs(struct task_struct *child, __s64 __user *data); | 53 | extern int ptrace_getregs(struct task_struct *child, __s64 __user *data); |
diff --git a/arch/mips/include/uapi/asm/kvm.h b/arch/mips/include/uapi/asm/kvm.h index 85789eacbf18..3f424f5217da 100644 --- a/arch/mips/include/uapi/asm/kvm.h +++ b/arch/mips/include/uapi/asm/kvm.h | |||
| @@ -1,55 +1,138 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * This file is subject to the terms and conditions of the GNU General Public | 2 | * This file is subject to the terms and conditions of the GNU General Public |
| 3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
| 4 | * for more details. | 4 | * for more details. |
| 5 | * | 5 | * |
| 6 | * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved. | 6 | * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved. |
| 7 | * Authors: Sanjay Lal <sanjayl@kymasys.com> | 7 | * Copyright (C) 2013 Cavium, Inc. |
| 8 | */ | 8 | * Authors: Sanjay Lal <sanjayl@kymasys.com> |
| 9 | */ | ||
| 9 | 10 | ||
| 10 | #ifndef __LINUX_KVM_MIPS_H | 11 | #ifndef __LINUX_KVM_MIPS_H |
| 11 | #define __LINUX_KVM_MIPS_H | 12 | #define __LINUX_KVM_MIPS_H |
| 12 | 13 | ||
| 13 | #include <linux/types.h> | 14 | #include <linux/types.h> |
| 14 | 15 | ||
| 15 | #define __KVM_MIPS | 16 | /* |
| 16 | 17 | * KVM MIPS specific structures and definitions. | |
| 17 | #define N_MIPS_COPROC_REGS 32 | 18 | * |
| 18 | #define N_MIPS_COPROC_SEL 8 | 19 | * Some parts derived from the x86 version of this file. |
| 20 | */ | ||
| 19 | 21 | ||
| 20 | /* for KVM_GET_REGS and KVM_SET_REGS */ | 22 | /* |
| 23 | * for KVM_GET_REGS and KVM_SET_REGS | ||
| 24 | * | ||
| 25 | * If Config[AT] is zero (32-bit CPU), the register contents are | ||
| 26 | * stored in the lower 32-bits of the struct kvm_regs fields and sign | ||
| 27 | * extended to 64-bits. | ||
| 28 | */ | ||
| 21 | struct kvm_regs { | 29 | struct kvm_regs { |
| 22 | __u32 gprs[32]; | 30 | /* out (KVM_GET_REGS) / in (KVM_SET_REGS) */ |
| 23 | __u32 hi; | 31 | __u64 gpr[32]; |
| 24 | __u32 lo; | 32 | __u64 hi; |
| 25 | __u32 pc; | 33 | __u64 lo; |
| 26 | 34 | __u64 pc; | |
| 27 | __u32 cp0reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL]; | ||
| 28 | }; | ||
| 29 | |||
| 30 | /* for KVM_GET_SREGS and KVM_SET_SREGS */ | ||
| 31 | struct kvm_sregs { | ||
| 32 | }; | 35 | }; |
| 33 | 36 | ||
| 34 | /* for KVM_GET_FPU and KVM_SET_FPU */ | 37 | /* |
| 38 | * for KVM_GET_FPU and KVM_SET_FPU | ||
| 39 | * | ||
| 40 | * If Status[FR] is zero (32-bit FPU), the upper 32-bits of the FPRs | ||
| 41 | * are zero filled. | ||
| 42 | */ | ||
| 35 | struct kvm_fpu { | 43 | struct kvm_fpu { |
| 44 | __u64 fpr[32]; | ||
| 45 | __u32 fir; | ||
| 46 | __u32 fccr; | ||
| 47 | __u32 fexr; | ||
| 48 | __u32 fenr; | ||
| 49 | __u32 fcsr; | ||
| 50 | __u32 pad; | ||
| 36 | }; | 51 | }; |
| 37 | 52 | ||
| 53 | |||
| 54 | /* | ||
| 55 | * For MIPS, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access CP0 | ||
| 56 | * registers. The id field is broken down as follows: | ||
| 57 | * | ||
| 58 | * bits[2..0] - Register 'sel' index. | ||
| 59 | * bits[7..3] - Register 'rd' index. | ||
| 60 | * bits[15..8] - Must be zero. | ||
| 61 | * bits[63..16] - 1 -> CP0 registers. | ||
| 62 | * | ||
| 63 | * Other sets registers may be added in the future. Each set would | ||
| 64 | * have its own identifier in bits[63..16]. | ||
| 65 | * | ||
| 66 | * The addr field of struct kvm_one_reg must point to an aligned | ||
| 67 | * 64-bit wide location. For registers that are narrower than | ||
| 68 | * 64-bits, the value is stored in the low order bits of the location, | ||
| 69 | * and sign extended to 64-bits. | ||
| 70 | * | ||
| 71 | * The registers defined in struct kvm_regs are also accessible, the | ||
| 72 | * id values for these are below. | ||
| 73 | */ | ||
| 74 | |||
| 75 | #define KVM_REG_MIPS_R0 0 | ||
| 76 | #define KVM_REG_MIPS_R1 1 | ||
| 77 | #define KVM_REG_MIPS_R2 2 | ||
| 78 | #define KVM_REG_MIPS_R3 3 | ||
| 79 | #define KVM_REG_MIPS_R4 4 | ||
| 80 | #define KVM_REG_MIPS_R5 5 | ||
| 81 | #define KVM_REG_MIPS_R6 6 | ||
| 82 | #define KVM_REG_MIPS_R7 7 | ||
| 83 | #define KVM_REG_MIPS_R8 8 | ||
| 84 | #define KVM_REG_MIPS_R9 9 | ||
| 85 | #define KVM_REG_MIPS_R10 10 | ||
| 86 | #define KVM_REG_MIPS_R11 11 | ||
| 87 | #define KVM_REG_MIPS_R12 12 | ||
| 88 | #define KVM_REG_MIPS_R13 13 | ||
| 89 | #define KVM_REG_MIPS_R14 14 | ||
| 90 | #define KVM_REG_MIPS_R15 15 | ||
| 91 | #define KVM_REG_MIPS_R16 16 | ||
| 92 | #define KVM_REG_MIPS_R17 17 | ||
| 93 | #define KVM_REG_MIPS_R18 18 | ||
| 94 | #define KVM_REG_MIPS_R19 19 | ||
| 95 | #define KVM_REG_MIPS_R20 20 | ||
| 96 | #define KVM_REG_MIPS_R21 21 | ||
| 97 | #define KVM_REG_MIPS_R22 22 | ||
| 98 | #define KVM_REG_MIPS_R23 23 | ||
| 99 | #define KVM_REG_MIPS_R24 24 | ||
| 100 | #define KVM_REG_MIPS_R25 25 | ||
| 101 | #define KVM_REG_MIPS_R26 26 | ||
| 102 | #define KVM_REG_MIPS_R27 27 | ||
| 103 | #define KVM_REG_MIPS_R28 28 | ||
| 104 | #define KVM_REG_MIPS_R29 29 | ||
| 105 | #define KVM_REG_MIPS_R30 30 | ||
| 106 | #define KVM_REG_MIPS_R31 31 | ||
| 107 | |||
| 108 | #define KVM_REG_MIPS_HI 32 | ||
| 109 | #define KVM_REG_MIPS_LO 33 | ||
| 110 | #define KVM_REG_MIPS_PC 34 | ||
| 111 | |||
| 112 | /* | ||
| 113 | * KVM MIPS specific structures and definitions | ||
| 114 | * | ||
| 115 | */ | ||
| 38 | struct kvm_debug_exit_arch { | 116 | struct kvm_debug_exit_arch { |
| 117 | __u64 epc; | ||
| 39 | }; | 118 | }; |
| 40 | 119 | ||
| 41 | /* for KVM_SET_GUEST_DEBUG */ | 120 | /* for KVM_SET_GUEST_DEBUG */ |
| 42 | struct kvm_guest_debug_arch { | 121 | struct kvm_guest_debug_arch { |
| 43 | }; | 122 | }; |
| 44 | 123 | ||
| 124 | /* definition of registers in kvm_run */ | ||
| 125 | struct kvm_sync_regs { | ||
| 126 | }; | ||
| 127 | |||
| 128 | /* dummy definition */ | ||
| 129 | struct kvm_sregs { | ||
| 130 | }; | ||
| 131 | |||
| 45 | struct kvm_mips_interrupt { | 132 | struct kvm_mips_interrupt { |
| 46 | /* in */ | 133 | /* in */ |
| 47 | __u32 cpu; | 134 | __u32 cpu; |
| 48 | __u32 irq; | 135 | __u32 irq; |
| 49 | }; | 136 | }; |
| 50 | 137 | ||
| 51 | /* definition of registers in kvm_run */ | ||
| 52 | struct kvm_sync_regs { | ||
| 53 | }; | ||
| 54 | |||
| 55 | #endif /* __LINUX_KVM_MIPS_H */ | 138 | #endif /* __LINUX_KVM_MIPS_H */ |
diff --git a/arch/mips/include/uapi/asm/ptrace.h b/arch/mips/include/uapi/asm/ptrace.h index 4d58d8468705..b26f7e317279 100644 --- a/arch/mips/include/uapi/asm/ptrace.h +++ b/arch/mips/include/uapi/asm/ptrace.h | |||
| @@ -22,16 +22,12 @@ | |||
| 22 | #define DSP_CONTROL 77 | 22 | #define DSP_CONTROL 77 |
| 23 | #define ACX 78 | 23 | #define ACX 78 |
| 24 | 24 | ||
| 25 | #ifndef __KERNEL__ | ||
| 25 | /* | 26 | /* |
| 26 | * This struct defines the way the registers are stored on the stack during a | 27 | * This struct defines the way the registers are stored on the stack during a |
| 27 | * system call/exception. As usual the registers k0/k1 aren't being saved. | 28 | * system call/exception. As usual the registers k0/k1 aren't being saved. |
| 28 | */ | 29 | */ |
| 29 | struct pt_regs { | 30 | struct pt_regs { |
| 30 | #ifdef CONFIG_32BIT | ||
| 31 | /* Pad bytes for argument save space on the stack. */ | ||
| 32 | unsigned long pad0[6]; | ||
| 33 | #endif | ||
| 34 | |||
| 35 | /* Saved main processor registers. */ | 31 | /* Saved main processor registers. */ |
| 36 | unsigned long regs[32]; | 32 | unsigned long regs[32]; |
| 37 | 33 | ||
| @@ -39,20 +35,11 @@ struct pt_regs { | |||
| 39 | unsigned long cp0_status; | 35 | unsigned long cp0_status; |
| 40 | unsigned long hi; | 36 | unsigned long hi; |
| 41 | unsigned long lo; | 37 | unsigned long lo; |
| 42 | #ifdef CONFIG_CPU_HAS_SMARTMIPS | ||
| 43 | unsigned long acx; | ||
| 44 | #endif | ||
| 45 | unsigned long cp0_badvaddr; | 38 | unsigned long cp0_badvaddr; |
| 46 | unsigned long cp0_cause; | 39 | unsigned long cp0_cause; |
| 47 | unsigned long cp0_epc; | 40 | unsigned long cp0_epc; |
| 48 | #ifdef CONFIG_MIPS_MT_SMTC | ||
| 49 | unsigned long cp0_tcstatus; | ||
| 50 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
| 51 | #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||
| 52 | unsigned long long mpl[3]; /* MTM{0,1,2} */ | ||
| 53 | unsigned long long mtp[3]; /* MTP{0,1,2} */ | ||
| 54 | #endif | ||
| 55 | } __attribute__ ((aligned (8))); | 41 | } __attribute__ ((aligned (8))); |
| 42 | #endif /* __KERNEL__ */ | ||
| 56 | 43 | ||
| 57 | /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ | 44 | /* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */ |
| 58 | #define PTRACE_GETREGS 12 | 45 | #define PTRACE_GETREGS 12 |
diff --git a/arch/mips/kernel/binfmt_elfn32.c b/arch/mips/kernel/binfmt_elfn32.c index e06f777e9c49..1188e00bb120 100644 --- a/arch/mips/kernel/binfmt_elfn32.c +++ b/arch/mips/kernel/binfmt_elfn32.c | |||
| @@ -119,4 +119,15 @@ MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)"); | |||
| 119 | #undef TASK_SIZE | 119 | #undef TASK_SIZE |
| 120 | #define TASK_SIZE TASK_SIZE32 | 120 | #define TASK_SIZE TASK_SIZE32 |
| 121 | 121 | ||
| 122 | #undef cputime_to_timeval | ||
| 123 | #define cputime_to_timeval cputime_to_compat_timeval | ||
| 124 | static __inline__ void | ||
| 125 | cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value) | ||
| 126 | { | ||
| 127 | unsigned long jiffies = cputime_to_jiffies(cputime); | ||
| 128 | |||
| 129 | value->tv_usec = (jiffies % HZ) * (1000000L / HZ); | ||
| 130 | value->tv_sec = jiffies / HZ; | ||
| 131 | } | ||
| 132 | |||
| 122 | #include "../../../fs/binfmt_elf.c" | 133 | #include "../../../fs/binfmt_elf.c" |
diff --git a/arch/mips/kernel/binfmt_elfo32.c b/arch/mips/kernel/binfmt_elfo32.c index 97c5a1668e53..202e581e6096 100644 --- a/arch/mips/kernel/binfmt_elfo32.c +++ b/arch/mips/kernel/binfmt_elfo32.c | |||
| @@ -162,4 +162,15 @@ MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)"); | |||
| 162 | #undef TASK_SIZE | 162 | #undef TASK_SIZE |
| 163 | #define TASK_SIZE TASK_SIZE32 | 163 | #define TASK_SIZE TASK_SIZE32 |
| 164 | 164 | ||
| 165 | #undef cputime_to_timeval | ||
| 166 | #define cputime_to_timeval cputime_to_compat_timeval | ||
| 167 | static __inline__ void | ||
| 168 | cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value) | ||
| 169 | { | ||
| 170 | unsigned long jiffies = cputime_to_jiffies(cputime); | ||
| 171 | |||
| 172 | value->tv_usec = (jiffies % HZ) * (1000000L / HZ); | ||
| 173 | value->tv_sec = jiffies / HZ; | ||
| 174 | } | ||
| 175 | |||
| 165 | #include "../../../fs/binfmt_elf.c" | 176 | #include "../../../fs/binfmt_elf.c" |
diff --git a/arch/mips/kernel/rtlx.c b/arch/mips/kernel/rtlx.c index 93c070b41b0d..6fa198db8999 100644 --- a/arch/mips/kernel/rtlx.c +++ b/arch/mips/kernel/rtlx.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #include <asm/processor.h> | 40 | #include <asm/processor.h> |
| 41 | #include <asm/vpe.h> | 41 | #include <asm/vpe.h> |
| 42 | #include <asm/rtlx.h> | 42 | #include <asm/rtlx.h> |
| 43 | #include <asm/setup.h> | ||
| 43 | 44 | ||
| 44 | static struct rtlx_info *rtlx; | 45 | static struct rtlx_info *rtlx; |
| 45 | static int major; | 46 | static int major; |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index e3be67012d78..a75ae40184aa 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
| @@ -897,22 +897,24 @@ out_sigsegv: | |||
| 897 | 897 | ||
| 898 | asmlinkage void do_tr(struct pt_regs *regs) | 898 | asmlinkage void do_tr(struct pt_regs *regs) |
| 899 | { | 899 | { |
| 900 | unsigned int opcode, tcode = 0; | 900 | u32 opcode, tcode = 0; |
| 901 | u16 instr[2]; | 901 | u16 instr[2]; |
| 902 | unsigned long epc = exception_epc(regs); | 902 | unsigned long epc = msk_isa16_mode(exception_epc(regs)); |
| 903 | 903 | ||
| 904 | if ((__get_user(instr[0], (u16 __user *)msk_isa16_mode(epc))) || | 904 | if (get_isa16_mode(regs->cp0_epc)) { |
| 905 | (__get_user(instr[1], (u16 __user *)msk_isa16_mode(epc + 2)))) | 905 | if (__get_user(instr[0], (u16 __user *)(epc + 0)) || |
| 906 | __get_user(instr[1], (u16 __user *)(epc + 2))) | ||
| 906 | goto out_sigsegv; | 907 | goto out_sigsegv; |
| 907 | opcode = (instr[0] << 16) | instr[1]; | 908 | opcode = (instr[0] << 16) | instr[1]; |
| 908 | 909 | /* Immediate versions don't provide a code. */ | |
| 909 | /* Immediate versions don't provide a code. */ | 910 | if (!(opcode & OPCODE)) |
| 910 | if (!(opcode & OPCODE)) { | 911 | tcode = (opcode >> 12) & ((1 << 4) - 1); |
| 911 | if (get_isa16_mode(regs->cp0_epc)) | 912 | } else { |
| 912 | /* microMIPS */ | 913 | if (__get_user(opcode, (u32 __user *)epc)) |
| 913 | tcode = (opcode >> 12) & 0x1f; | 914 | goto out_sigsegv; |
| 914 | else | 915 | /* Immediate versions don't provide a code. */ |
| 915 | tcode = ((opcode >> 6) & ((1 << 10) - 1)); | 916 | if (!(opcode & OPCODE)) |
| 917 | tcode = (opcode >> 6) & ((1 << 10) - 1); | ||
| 916 | } | 918 | } |
| 917 | 919 | ||
| 918 | do_trap_or_bp(regs, tcode, "Trap"); | 920 | do_trap_or_bp(regs, tcode, "Trap"); |
diff --git a/arch/mips/kvm/kvm_mips.c b/arch/mips/kvm/kvm_mips.c index e0dad0289797..d934b017f479 100644 --- a/arch/mips/kvm/kvm_mips.c +++ b/arch/mips/kvm/kvm_mips.c | |||
| @@ -195,7 +195,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm) | |||
| 195 | long | 195 | long |
| 196 | kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) | 196 | kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) |
| 197 | { | 197 | { |
| 198 | return -EINVAL; | 198 | return -ENOIOCTLCMD; |
| 199 | } | 199 | } |
| 200 | 200 | ||
| 201 | void kvm_arch_free_memslot(struct kvm_memory_slot *free, | 201 | void kvm_arch_free_memslot(struct kvm_memory_slot *free, |
| @@ -401,7 +401,7 @@ int | |||
| 401 | kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, | 401 | kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, |
| 402 | struct kvm_guest_debug *dbg) | 402 | struct kvm_guest_debug *dbg) |
| 403 | { | 403 | { |
| 404 | return -EINVAL; | 404 | return -ENOIOCTLCMD; |
| 405 | } | 405 | } |
| 406 | 406 | ||
| 407 | int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) | 407 | int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run) |
| @@ -475,14 +475,223 @@ int | |||
| 475 | kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, | 475 | kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu, |
| 476 | struct kvm_mp_state *mp_state) | 476 | struct kvm_mp_state *mp_state) |
| 477 | { | 477 | { |
| 478 | return -EINVAL; | 478 | return -ENOIOCTLCMD; |
| 479 | } | 479 | } |
| 480 | 480 | ||
| 481 | int | 481 | int |
| 482 | kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, | 482 | kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, |
| 483 | struct kvm_mp_state *mp_state) | 483 | struct kvm_mp_state *mp_state) |
| 484 | { | 484 | { |
| 485 | return -EINVAL; | 485 | return -ENOIOCTLCMD; |
| 486 | } | ||
| 487 | |||
| 488 | #define KVM_REG_MIPS_CP0_INDEX (0x10000 + 8 * 0 + 0) | ||
| 489 | #define KVM_REG_MIPS_CP0_ENTRYLO0 (0x10000 + 8 * 2 + 0) | ||
| 490 | #define KVM_REG_MIPS_CP0_ENTRYLO1 (0x10000 + 8 * 3 + 0) | ||
| 491 | #define KVM_REG_MIPS_CP0_CONTEXT (0x10000 + 8 * 4 + 0) | ||
| 492 | #define KVM_REG_MIPS_CP0_USERLOCAL (0x10000 + 8 * 4 + 2) | ||
| 493 | #define KVM_REG_MIPS_CP0_PAGEMASK (0x10000 + 8 * 5 + 0) | ||
| 494 | #define KVM_REG_MIPS_CP0_PAGEGRAIN (0x10000 + 8 * 5 + 1) | ||
| 495 | #define KVM_REG_MIPS_CP0_WIRED (0x10000 + 8 * 6 + 0) | ||
| 496 | #define KVM_REG_MIPS_CP0_HWRENA (0x10000 + 8 * 7 + 0) | ||
| 497 | #define KVM_REG_MIPS_CP0_BADVADDR (0x10000 + 8 * 8 + 0) | ||
| 498 | #define KVM_REG_MIPS_CP0_COUNT (0x10000 + 8 * 9 + 0) | ||
| 499 | #define KVM_REG_MIPS_CP0_ENTRYHI (0x10000 + 8 * 10 + 0) | ||
| 500 | #define KVM_REG_MIPS_CP0_COMPARE (0x10000 + 8 * 11 + 0) | ||
| 501 | #define KVM_REG_MIPS_CP0_STATUS (0x10000 + 8 * 12 + 0) | ||
| 502 | #define KVM_REG_MIPS_CP0_CAUSE (0x10000 + 8 * 13 + 0) | ||
| 503 | #define KVM_REG_MIPS_CP0_EBASE (0x10000 + 8 * 15 + 1) | ||
| 504 | #define KVM_REG_MIPS_CP0_CONFIG (0x10000 + 8 * 16 + 0) | ||
| 505 | #define KVM_REG_MIPS_CP0_CONFIG1 (0x10000 + 8 * 16 + 1) | ||
| 506 | #define KVM_REG_MIPS_CP0_CONFIG2 (0x10000 + 8 * 16 + 2) | ||
| 507 | #define KVM_REG_MIPS_CP0_CONFIG3 (0x10000 + 8 * 16 + 3) | ||
| 508 | #define KVM_REG_MIPS_CP0_CONFIG7 (0x10000 + 8 * 16 + 7) | ||
| 509 | #define KVM_REG_MIPS_CP0_XCONTEXT (0x10000 + 8 * 20 + 0) | ||
| 510 | #define KVM_REG_MIPS_CP0_ERROREPC (0x10000 + 8 * 30 + 0) | ||
| 511 | |||
| 512 | static u64 kvm_mips_get_one_regs[] = { | ||
| 513 | KVM_REG_MIPS_R0, | ||
| 514 | KVM_REG_MIPS_R1, | ||
| 515 | KVM_REG_MIPS_R2, | ||
| 516 | KVM_REG_MIPS_R3, | ||
| 517 | KVM_REG_MIPS_R4, | ||
| 518 | KVM_REG_MIPS_R5, | ||
| 519 | KVM_REG_MIPS_R6, | ||
| 520 | KVM_REG_MIPS_R7, | ||
| 521 | KVM_REG_MIPS_R8, | ||
| 522 | KVM_REG_MIPS_R9, | ||
| 523 | KVM_REG_MIPS_R10, | ||
| 524 | KVM_REG_MIPS_R11, | ||
| 525 | KVM_REG_MIPS_R12, | ||
| 526 | KVM_REG_MIPS_R13, | ||
| 527 | KVM_REG_MIPS_R14, | ||
| 528 | KVM_REG_MIPS_R15, | ||
| 529 | KVM_REG_MIPS_R16, | ||
| 530 | KVM_REG_MIPS_R17, | ||
| 531 | KVM_REG_MIPS_R18, | ||
| 532 | KVM_REG_MIPS_R19, | ||
| 533 | KVM_REG_MIPS_R20, | ||
| 534 | KVM_REG_MIPS_R21, | ||
| 535 | KVM_REG_MIPS_R22, | ||
| 536 | KVM_REG_MIPS_R23, | ||
| 537 | KVM_REG_MIPS_R24, | ||
| 538 | KVM_REG_MIPS_R25, | ||
| 539 | KVM_REG_MIPS_R26, | ||
| 540 | KVM_REG_MIPS_R27, | ||
| 541 | KVM_REG_MIPS_R28, | ||
| 542 | KVM_REG_MIPS_R29, | ||
| 543 | KVM_REG_MIPS_R30, | ||
| 544 | KVM_REG_MIPS_R31, | ||
| 545 | |||
| 546 | KVM_REG_MIPS_HI, | ||
| 547 | KVM_REG_MIPS_LO, | ||
| 548 | KVM_REG_MIPS_PC, | ||
| 549 | |||
| 550 | KVM_REG_MIPS_CP0_INDEX, | ||
| 551 | KVM_REG_MIPS_CP0_CONTEXT, | ||
| 552 | KVM_REG_MIPS_CP0_PAGEMASK, | ||
| 553 | KVM_REG_MIPS_CP0_WIRED, | ||
| 554 | KVM_REG_MIPS_CP0_BADVADDR, | ||
| 555 | KVM_REG_MIPS_CP0_ENTRYHI, | ||
| 556 | KVM_REG_MIPS_CP0_STATUS, | ||
| 557 | KVM_REG_MIPS_CP0_CAUSE, | ||
| 558 | /* EPC set via kvm_regs, et al. */ | ||
| 559 | KVM_REG_MIPS_CP0_CONFIG, | ||
| 560 | KVM_REG_MIPS_CP0_CONFIG1, | ||
| 561 | KVM_REG_MIPS_CP0_CONFIG2, | ||
| 562 | KVM_REG_MIPS_CP0_CONFIG3, | ||
| 563 | KVM_REG_MIPS_CP0_CONFIG7, | ||
| 564 | KVM_REG_MIPS_CP0_ERROREPC | ||
| 565 | }; | ||
| 566 | |||
| 567 | static int kvm_mips_get_reg(struct kvm_vcpu *vcpu, | ||
| 568 | const struct kvm_one_reg *reg) | ||
| 569 | { | ||
| 570 | u64 __user *uaddr = (u64 __user *)(long)reg->addr; | ||
| 571 | |||
| 572 | struct mips_coproc *cop0 = vcpu->arch.cop0; | ||
| 573 | s64 v; | ||
| 574 | |||
| 575 | switch (reg->id) { | ||
| 576 | case KVM_REG_MIPS_R0 ... KVM_REG_MIPS_R31: | ||
| 577 | v = (long)vcpu->arch.gprs[reg->id - KVM_REG_MIPS_R0]; | ||
| 578 | break; | ||
| 579 | case KVM_REG_MIPS_HI: | ||
| 580 | v = (long)vcpu->arch.hi; | ||
| 581 | break; | ||
| 582 | case KVM_REG_MIPS_LO: | ||
| 583 | v = (long)vcpu->arch.lo; | ||
| 584 | break; | ||
| 585 | case KVM_REG_MIPS_PC: | ||
| 586 | v = (long)vcpu->arch.pc; | ||
| 587 | break; | ||
| 588 | |||
| 589 | case KVM_REG_MIPS_CP0_INDEX: | ||
| 590 | v = (long)kvm_read_c0_guest_index(cop0); | ||
| 591 | break; | ||
| 592 | case KVM_REG_MIPS_CP0_CONTEXT: | ||
| 593 | v = (long)kvm_read_c0_guest_context(cop0); | ||
| 594 | break; | ||
| 595 | case KVM_REG_MIPS_CP0_PAGEMASK: | ||
| 596 | v = (long)kvm_read_c0_guest_pagemask(cop0); | ||
| 597 | break; | ||
| 598 | case KVM_REG_MIPS_CP0_WIRED: | ||
| 599 | v = (long)kvm_read_c0_guest_wired(cop0); | ||
| 600 | break; | ||
| 601 | case KVM_REG_MIPS_CP0_BADVADDR: | ||
| 602 | v = (long)kvm_read_c0_guest_badvaddr(cop0); | ||
| 603 | break; | ||
| 604 | case KVM_REG_MIPS_CP0_ENTRYHI: | ||
| 605 | v = (long)kvm_read_c0_guest_entryhi(cop0); | ||
| 606 | break; | ||
| 607 | case KVM_REG_MIPS_CP0_STATUS: | ||
| 608 | v = (long)kvm_read_c0_guest_status(cop0); | ||
| 609 | break; | ||
| 610 | case KVM_REG_MIPS_CP0_CAUSE: | ||
| 611 | v = (long)kvm_read_c0_guest_cause(cop0); | ||
| 612 | break; | ||
| 613 | case KVM_REG_MIPS_CP0_ERROREPC: | ||
| 614 | v = (long)kvm_read_c0_guest_errorepc(cop0); | ||
| 615 | break; | ||
| 616 | case KVM_REG_MIPS_CP0_CONFIG: | ||
| 617 | v = (long)kvm_read_c0_guest_config(cop0); | ||
| 618 | break; | ||
| 619 | case KVM_REG_MIPS_CP0_CONFIG1: | ||
| 620 | v = (long)kvm_read_c0_guest_config1(cop0); | ||
| 621 | break; | ||
| 622 | case KVM_REG_MIPS_CP0_CONFIG2: | ||
| 623 | v = (long)kvm_read_c0_guest_config2(cop0); | ||
| 624 | break; | ||
| 625 | case KVM_REG_MIPS_CP0_CONFIG3: | ||
| 626 | v = (long)kvm_read_c0_guest_config3(cop0); | ||
| 627 | break; | ||
| 628 | case KVM_REG_MIPS_CP0_CONFIG7: | ||
| 629 | v = (long)kvm_read_c0_guest_config7(cop0); | ||
| 630 | break; | ||
| 631 | default: | ||
| 632 | return -EINVAL; | ||
| 633 | } | ||
| 634 | return put_user(v, uaddr); | ||
| 635 | } | ||
| 636 | |||
| 637 | static int kvm_mips_set_reg(struct kvm_vcpu *vcpu, | ||
| 638 | const struct kvm_one_reg *reg) | ||
| 639 | { | ||
| 640 | u64 __user *uaddr = (u64 __user *)(long)reg->addr; | ||
| 641 | struct mips_coproc *cop0 = vcpu->arch.cop0; | ||
| 642 | u64 v; | ||
| 643 | |||
| 644 | if (get_user(v, uaddr) != 0) | ||
| 645 | return -EFAULT; | ||
| 646 | |||
| 647 | switch (reg->id) { | ||
| 648 | case KVM_REG_MIPS_R0: | ||
| 649 | /* Silently ignore requests to set $0 */ | ||
| 650 | break; | ||
| 651 | case KVM_REG_MIPS_R1 ... KVM_REG_MIPS_R31: | ||
| 652 | vcpu->arch.gprs[reg->id - KVM_REG_MIPS_R0] = v; | ||
| 653 | break; | ||
| 654 | case KVM_REG_MIPS_HI: | ||
| 655 | vcpu->arch.hi = v; | ||
| 656 | break; | ||
| 657 | case KVM_REG_MIPS_LO: | ||
| 658 | vcpu->arch.lo = v; | ||
| 659 | break; | ||
| 660 | case KVM_REG_MIPS_PC: | ||
| 661 | vcpu->arch.pc = v; | ||
| 662 | break; | ||
| 663 | |||
| 664 | case KVM_REG_MIPS_CP0_INDEX: | ||
| 665 | kvm_write_c0_guest_index(cop0, v); | ||
| 666 | break; | ||
| 667 | case KVM_REG_MIPS_CP0_CONTEXT: | ||
| 668 | kvm_write_c0_guest_context(cop0, v); | ||
| 669 | break; | ||
| 670 | case KVM_REG_MIPS_CP0_PAGEMASK: | ||
| 671 | kvm_write_c0_guest_pagemask(cop0, v); | ||
| 672 | break; | ||
| 673 | case KVM_REG_MIPS_CP0_WIRED: | ||
| 674 | kvm_write_c0_guest_wired(cop0, v); | ||
| 675 | break; | ||
| 676 | case KVM_REG_MIPS_CP0_BADVADDR: | ||
| 677 | kvm_write_c0_guest_badvaddr(cop0, v); | ||
| 678 | break; | ||
| 679 | case KVM_REG_MIPS_CP0_ENTRYHI: | ||
| 680 | kvm_write_c0_guest_entryhi(cop0, v); | ||
| 681 | break; | ||
| 682 | case KVM_REG_MIPS_CP0_STATUS: | ||
| 683 | kvm_write_c0_guest_status(cop0, v); | ||
| 684 | break; | ||
| 685 | case KVM_REG_MIPS_CP0_CAUSE: | ||
| 686 | kvm_write_c0_guest_cause(cop0, v); | ||
| 687 | break; | ||
| 688 | case KVM_REG_MIPS_CP0_ERROREPC: | ||
| 689 | kvm_write_c0_guest_errorepc(cop0, v); | ||
| 690 | break; | ||
| 691 | default: | ||
| 692 | return -EINVAL; | ||
| 693 | } | ||
| 694 | return 0; | ||
| 486 | } | 695 | } |
| 487 | 696 | ||
| 488 | long | 697 | long |
| @@ -491,9 +700,38 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) | |||
| 491 | struct kvm_vcpu *vcpu = filp->private_data; | 700 | struct kvm_vcpu *vcpu = filp->private_data; |
| 492 | void __user *argp = (void __user *)arg; | 701 | void __user *argp = (void __user *)arg; |
| 493 | long r; | 702 | long r; |
| 494 | int intr; | ||
| 495 | 703 | ||
| 496 | switch (ioctl) { | 704 | switch (ioctl) { |
| 705 | case KVM_SET_ONE_REG: | ||
| 706 | case KVM_GET_ONE_REG: { | ||
| 707 | struct kvm_one_reg reg; | ||
| 708 | if (copy_from_user(®, argp, sizeof(reg))) | ||
| 709 | return -EFAULT; | ||
| 710 | if (ioctl == KVM_SET_ONE_REG) | ||
| 711 | return kvm_mips_set_reg(vcpu, ®); | ||
| 712 | else | ||
| 713 | return kvm_mips_get_reg(vcpu, ®); | ||
| 714 | } | ||
| 715 | case KVM_GET_REG_LIST: { | ||
| 716 | struct kvm_reg_list __user *user_list = argp; | ||
| 717 | u64 __user *reg_dest; | ||
| 718 | struct kvm_reg_list reg_list; | ||
| 719 | unsigned n; | ||
| 720 | |||
| 721 | if (copy_from_user(®_list, user_list, sizeof(reg_list))) | ||
| 722 | return -EFAULT; | ||
| 723 | n = reg_list.n; | ||
| 724 | reg_list.n = ARRAY_SIZE(kvm_mips_get_one_regs); | ||
| 725 | if (copy_to_user(user_list, ®_list, sizeof(reg_list))) | ||
| 726 | return -EFAULT; | ||
| 727 | if (n < reg_list.n) | ||
| 728 | return -E2BIG; | ||
| 729 | reg_dest = user_list->reg; | ||
| 730 | if (copy_to_user(reg_dest, kvm_mips_get_one_regs, | ||
| 731 | sizeof(kvm_mips_get_one_regs))) | ||
| 732 | return -EFAULT; | ||
| 733 | return 0; | ||
| 734 | } | ||
| 497 | case KVM_NMI: | 735 | case KVM_NMI: |
| 498 | /* Treat the NMI as a CPU reset */ | 736 | /* Treat the NMI as a CPU reset */ |
| 499 | r = kvm_mips_reset_vcpu(vcpu); | 737 | r = kvm_mips_reset_vcpu(vcpu); |
| @@ -505,8 +743,6 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) | |||
| 505 | if (copy_from_user(&irq, argp, sizeof(irq))) | 743 | if (copy_from_user(&irq, argp, sizeof(irq))) |
| 506 | goto out; | 744 | goto out; |
| 507 | 745 | ||
| 508 | intr = (int)irq.irq; | ||
| 509 | |||
| 510 | kvm_debug("[%d] %s: irq: %d\n", vcpu->vcpu_id, __func__, | 746 | kvm_debug("[%d] %s: irq: %d\n", vcpu->vcpu_id, __func__, |
| 511 | irq.irq); | 747 | irq.irq); |
| 512 | 748 | ||
| @@ -514,7 +750,7 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) | |||
| 514 | break; | 750 | break; |
| 515 | } | 751 | } |
| 516 | default: | 752 | default: |
| 517 | r = -EINVAL; | 753 | r = -ENOIOCTLCMD; |
| 518 | } | 754 | } |
| 519 | 755 | ||
| 520 | out: | 756 | out: |
| @@ -565,7 +801,7 @@ long kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg) | |||
| 565 | 801 | ||
| 566 | switch (ioctl) { | 802 | switch (ioctl) { |
| 567 | default: | 803 | default: |
| 568 | r = -EINVAL; | 804 | r = -ENOIOCTLCMD; |
| 569 | } | 805 | } |
| 570 | 806 | ||
| 571 | return r; | 807 | return r; |
| @@ -593,13 +829,13 @@ void kvm_arch_exit(void) | |||
| 593 | int | 829 | int |
| 594 | kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs) | 830 | kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs) |
| 595 | { | 831 | { |
| 596 | return -ENOTSUPP; | 832 | return -ENOIOCTLCMD; |
| 597 | } | 833 | } |
| 598 | 834 | ||
| 599 | int | 835 | int |
| 600 | kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs) | 836 | kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs) |
| 601 | { | 837 | { |
| 602 | return -ENOTSUPP; | 838 | return -ENOIOCTLCMD; |
| 603 | } | 839 | } |
| 604 | 840 | ||
| 605 | int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) | 841 | int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) |
| @@ -609,12 +845,12 @@ int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu) | |||
| 609 | 845 | ||
| 610 | int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) | 846 | int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) |
| 611 | { | 847 | { |
| 612 | return -ENOTSUPP; | 848 | return -ENOIOCTLCMD; |
| 613 | } | 849 | } |
| 614 | 850 | ||
| 615 | int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) | 851 | int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) |
| 616 | { | 852 | { |
| 617 | return -ENOTSUPP; | 853 | return -ENOIOCTLCMD; |
| 618 | } | 854 | } |
| 619 | 855 | ||
| 620 | int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) | 856 | int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf) |
| @@ -627,6 +863,9 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
| 627 | int r; | 863 | int r; |
| 628 | 864 | ||
| 629 | switch (ext) { | 865 | switch (ext) { |
| 866 | case KVM_CAP_ONE_REG: | ||
| 867 | r = 1; | ||
| 868 | break; | ||
| 630 | case KVM_CAP_COALESCED_MMIO: | 869 | case KVM_CAP_COALESCED_MMIO: |
| 631 | r = KVM_COALESCED_MMIO_PAGE_OFFSET; | 870 | r = KVM_COALESCED_MMIO_PAGE_OFFSET; |
| 632 | break; | 871 | break; |
| @@ -635,7 +874,6 @@ int kvm_dev_ioctl_check_extension(long ext) | |||
| 635 | break; | 874 | break; |
| 636 | } | 875 | } |
| 637 | return r; | 876 | return r; |
| 638 | |||
| 639 | } | 877 | } |
| 640 | 878 | ||
| 641 | int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) | 879 | int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) |
| @@ -677,28 +915,28 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
| 677 | { | 915 | { |
| 678 | int i; | 916 | int i; |
| 679 | 917 | ||
| 680 | for (i = 0; i < 32; i++) | 918 | for (i = 1; i < ARRAY_SIZE(vcpu->arch.gprs); i++) |
| 681 | vcpu->arch.gprs[i] = regs->gprs[i]; | 919 | vcpu->arch.gprs[i] = regs->gpr[i]; |
| 682 | 920 | vcpu->arch.gprs[0] = 0; /* zero is special, and cannot be set. */ | |
| 683 | vcpu->arch.hi = regs->hi; | 921 | vcpu->arch.hi = regs->hi; |
| 684 | vcpu->arch.lo = regs->lo; | 922 | vcpu->arch.lo = regs->lo; |
| 685 | vcpu->arch.pc = regs->pc; | 923 | vcpu->arch.pc = regs->pc; |
| 686 | 924 | ||
| 687 | return kvm_mips_callbacks->vcpu_ioctl_set_regs(vcpu, regs); | 925 | return 0; |
| 688 | } | 926 | } |
| 689 | 927 | ||
| 690 | int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | 928 | int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) |
| 691 | { | 929 | { |
| 692 | int i; | 930 | int i; |
| 693 | 931 | ||
| 694 | for (i = 0; i < 32; i++) | 932 | for (i = 0; i < ARRAY_SIZE(vcpu->arch.gprs); i++) |
| 695 | regs->gprs[i] = vcpu->arch.gprs[i]; | 933 | regs->gpr[i] = vcpu->arch.gprs[i]; |
| 696 | 934 | ||
| 697 | regs->hi = vcpu->arch.hi; | 935 | regs->hi = vcpu->arch.hi; |
| 698 | regs->lo = vcpu->arch.lo; | 936 | regs->lo = vcpu->arch.lo; |
| 699 | regs->pc = vcpu->arch.pc; | 937 | regs->pc = vcpu->arch.pc; |
| 700 | 938 | ||
| 701 | return kvm_mips_callbacks->vcpu_ioctl_get_regs(vcpu, regs); | 939 | return 0; |
| 702 | } | 940 | } |
| 703 | 941 | ||
| 704 | void kvm_mips_comparecount_func(unsigned long data) | 942 | void kvm_mips_comparecount_func(unsigned long data) |
diff --git a/arch/mips/kvm/kvm_trap_emul.c b/arch/mips/kvm/kvm_trap_emul.c index 466aeef044bd..30d725321db1 100644 --- a/arch/mips/kvm/kvm_trap_emul.c +++ b/arch/mips/kvm/kvm_trap_emul.c | |||
| @@ -345,54 +345,6 @@ static int kvm_trap_emul_handle_break(struct kvm_vcpu *vcpu) | |||
| 345 | return ret; | 345 | return ret; |
| 346 | } | 346 | } |
| 347 | 347 | ||
| 348 | static int | ||
| 349 | kvm_trap_emul_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | ||
| 350 | { | ||
| 351 | struct mips_coproc *cop0 = vcpu->arch.cop0; | ||
| 352 | |||
| 353 | kvm_write_c0_guest_index(cop0, regs->cp0reg[MIPS_CP0_TLB_INDEX][0]); | ||
| 354 | kvm_write_c0_guest_context(cop0, regs->cp0reg[MIPS_CP0_TLB_CONTEXT][0]); | ||
| 355 | kvm_write_c0_guest_badvaddr(cop0, regs->cp0reg[MIPS_CP0_BAD_VADDR][0]); | ||
| 356 | kvm_write_c0_guest_entryhi(cop0, regs->cp0reg[MIPS_CP0_TLB_HI][0]); | ||
| 357 | kvm_write_c0_guest_epc(cop0, regs->cp0reg[MIPS_CP0_EXC_PC][0]); | ||
| 358 | |||
| 359 | kvm_write_c0_guest_status(cop0, regs->cp0reg[MIPS_CP0_STATUS][0]); | ||
| 360 | kvm_write_c0_guest_cause(cop0, regs->cp0reg[MIPS_CP0_CAUSE][0]); | ||
| 361 | kvm_write_c0_guest_pagemask(cop0, | ||
| 362 | regs->cp0reg[MIPS_CP0_TLB_PG_MASK][0]); | ||
| 363 | kvm_write_c0_guest_wired(cop0, regs->cp0reg[MIPS_CP0_TLB_WIRED][0]); | ||
| 364 | kvm_write_c0_guest_errorepc(cop0, regs->cp0reg[MIPS_CP0_ERROR_PC][0]); | ||
| 365 | |||
| 366 | return 0; | ||
| 367 | } | ||
| 368 | |||
| 369 | static int | ||
| 370 | kvm_trap_emul_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | ||
| 371 | { | ||
| 372 | struct mips_coproc *cop0 = vcpu->arch.cop0; | ||
| 373 | |||
| 374 | regs->cp0reg[MIPS_CP0_TLB_INDEX][0] = kvm_read_c0_guest_index(cop0); | ||
| 375 | regs->cp0reg[MIPS_CP0_TLB_CONTEXT][0] = kvm_read_c0_guest_context(cop0); | ||
| 376 | regs->cp0reg[MIPS_CP0_BAD_VADDR][0] = kvm_read_c0_guest_badvaddr(cop0); | ||
| 377 | regs->cp0reg[MIPS_CP0_TLB_HI][0] = kvm_read_c0_guest_entryhi(cop0); | ||
| 378 | regs->cp0reg[MIPS_CP0_EXC_PC][0] = kvm_read_c0_guest_epc(cop0); | ||
| 379 | |||
| 380 | regs->cp0reg[MIPS_CP0_STATUS][0] = kvm_read_c0_guest_status(cop0); | ||
| 381 | regs->cp0reg[MIPS_CP0_CAUSE][0] = kvm_read_c0_guest_cause(cop0); | ||
| 382 | regs->cp0reg[MIPS_CP0_TLB_PG_MASK][0] = | ||
| 383 | kvm_read_c0_guest_pagemask(cop0); | ||
| 384 | regs->cp0reg[MIPS_CP0_TLB_WIRED][0] = kvm_read_c0_guest_wired(cop0); | ||
| 385 | regs->cp0reg[MIPS_CP0_ERROR_PC][0] = kvm_read_c0_guest_errorepc(cop0); | ||
| 386 | |||
| 387 | regs->cp0reg[MIPS_CP0_CONFIG][0] = kvm_read_c0_guest_config(cop0); | ||
| 388 | regs->cp0reg[MIPS_CP0_CONFIG][1] = kvm_read_c0_guest_config1(cop0); | ||
| 389 | regs->cp0reg[MIPS_CP0_CONFIG][2] = kvm_read_c0_guest_config2(cop0); | ||
| 390 | regs->cp0reg[MIPS_CP0_CONFIG][3] = kvm_read_c0_guest_config3(cop0); | ||
| 391 | regs->cp0reg[MIPS_CP0_CONFIG][7] = kvm_read_c0_guest_config7(cop0); | ||
| 392 | |||
| 393 | return 0; | ||
| 394 | } | ||
| 395 | |||
| 396 | static int kvm_trap_emul_vm_init(struct kvm *kvm) | 348 | static int kvm_trap_emul_vm_init(struct kvm *kvm) |
| 397 | { | 349 | { |
| 398 | return 0; | 350 | return 0; |
| @@ -471,8 +423,6 @@ static struct kvm_mips_callbacks kvm_trap_emul_callbacks = { | |||
| 471 | .dequeue_io_int = kvm_mips_dequeue_io_int_cb, | 423 | .dequeue_io_int = kvm_mips_dequeue_io_int_cb, |
| 472 | .irq_deliver = kvm_mips_irq_deliver_cb, | 424 | .irq_deliver = kvm_mips_irq_deliver_cb, |
| 473 | .irq_clear = kvm_mips_irq_clear_cb, | 425 | .irq_clear = kvm_mips_irq_clear_cb, |
| 474 | .vcpu_ioctl_get_regs = kvm_trap_emul_ioctl_get_regs, | ||
| 475 | .vcpu_ioctl_set_regs = kvm_trap_emul_ioctl_set_regs, | ||
| 476 | }; | 426 | }; |
| 477 | 427 | ||
| 478 | int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks) | 428 | int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks) |
diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c index ce9818eef7d3..afeef93f81a7 100644 --- a/arch/mips/mm/tlbex.c +++ b/arch/mips/mm/tlbex.c | |||
| @@ -301,10 +301,6 @@ static u32 tlb_handler[128] __cpuinitdata; | |||
| 301 | static struct uasm_label labels[128] __cpuinitdata; | 301 | static struct uasm_label labels[128] __cpuinitdata; |
| 302 | static struct uasm_reloc relocs[128] __cpuinitdata; | 302 | static struct uasm_reloc relocs[128] __cpuinitdata; |
| 303 | 303 | ||
| 304 | #ifdef CONFIG_64BIT | ||
| 305 | static int check_for_high_segbits __cpuinitdata; | ||
| 306 | #endif | ||
| 307 | |||
| 308 | static int check_for_high_segbits __cpuinitdata; | 304 | static int check_for_high_segbits __cpuinitdata; |
| 309 | 305 | ||
| 310 | static unsigned int kscratch_used_mask __cpuinitdata; | 306 | static unsigned int kscratch_used_mask __cpuinitdata; |
diff --git a/arch/mips/ralink/of.c b/arch/mips/ralink/of.c index fb1569580def..6b5f3406f414 100644 --- a/arch/mips/ralink/of.c +++ b/arch/mips/ralink/of.c | |||
| @@ -88,7 +88,7 @@ void __init plat_mem_setup(void) | |||
| 88 | __dt_setup_arch(&__dtb_start); | 88 | __dt_setup_arch(&__dtb_start); |
| 89 | 89 | ||
| 90 | if (soc_info.mem_size) | 90 | if (soc_info.mem_size) |
| 91 | add_memory_region(soc_info.mem_base, soc_info.mem_size, | 91 | add_memory_region(soc_info.mem_base, soc_info.mem_size * SZ_1M, |
| 92 | BOOT_MEM_RAM); | 92 | BOOT_MEM_RAM); |
| 93 | else | 93 | else |
| 94 | detect_memory_region(soc_info.mem_base, | 94 | detect_memory_region(soc_info.mem_base, |
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index bae0f402bf2a..87a22092b68f 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
| @@ -212,7 +212,9 @@ appldata_timer_handler(ctl_table *ctl, int write, | |||
| 212 | return 0; | 212 | return 0; |
| 213 | } | 213 | } |
| 214 | if (!write) { | 214 | if (!write) { |
| 215 | len = sprintf(buf, appldata_timer_active ? "1\n" : "0\n"); | 215 | strncpy(buf, appldata_timer_active ? "1\n" : "0\n", |
| 216 | ARRAY_SIZE(buf)); | ||
| 217 | len = strnlen(buf, ARRAY_SIZE(buf)); | ||
| 216 | if (len > *lenp) | 218 | if (len > *lenp) |
| 217 | len = *lenp; | 219 | len = *lenp; |
| 218 | if (copy_to_user(buffer, buf, len)) | 220 | if (copy_to_user(buffer, buf, len)) |
| @@ -317,7 +319,8 @@ appldata_generic_handler(ctl_table *ctl, int write, | |||
| 317 | return 0; | 319 | return 0; |
| 318 | } | 320 | } |
| 319 | if (!write) { | 321 | if (!write) { |
| 320 | len = sprintf(buf, ops->active ? "1\n" : "0\n"); | 322 | strncpy(buf, ops->active ? "1\n" : "0\n", ARRAY_SIZE(buf)); |
| 323 | len = strnlen(buf, ARRAY_SIZE(buf)); | ||
| 321 | if (len > *lenp) | 324 | if (len > *lenp) |
| 322 | len = *lenp; | 325 | len = *lenp; |
| 323 | if (copy_to_user(buffer, buf, len)) { | 326 | if (copy_to_user(buffer, buf, len)) { |
diff --git a/arch/s390/include/asm/dma-mapping.h b/arch/s390/include/asm/dma-mapping.h index 9411db653bac..886ac7d4937a 100644 --- a/arch/s390/include/asm/dma-mapping.h +++ b/arch/s390/include/asm/dma-mapping.h | |||
| @@ -71,8 +71,8 @@ static inline void dma_free_coherent(struct device *dev, size_t size, | |||
| 71 | { | 71 | { |
| 72 | struct dma_map_ops *dma_ops = get_dma_ops(dev); | 72 | struct dma_map_ops *dma_ops = get_dma_ops(dev); |
| 73 | 73 | ||
| 74 | dma_ops->free(dev, size, cpu_addr, dma_handle, NULL); | ||
| 75 | debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); | 74 | debug_dma_free_coherent(dev, size, cpu_addr, dma_handle); |
| 75 | dma_ops->free(dev, size, cpu_addr, dma_handle, NULL); | ||
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | #endif /* _ASM_S390_DMA_MAPPING_H */ | 78 | #endif /* _ASM_S390_DMA_MAPPING_H */ |
diff --git a/arch/s390/include/asm/io.h b/arch/s390/include/asm/io.h index 379d96e2105e..fd9be010f9b2 100644 --- a/arch/s390/include/asm/io.h +++ b/arch/s390/include/asm/io.h | |||
| @@ -36,6 +36,7 @@ static inline void * phys_to_virt(unsigned long address) | |||
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | void *xlate_dev_mem_ptr(unsigned long phys); | 38 | void *xlate_dev_mem_ptr(unsigned long phys); |
| 39 | #define xlate_dev_mem_ptr xlate_dev_mem_ptr | ||
| 39 | void unxlate_dev_mem_ptr(unsigned long phys, void *addr); | 40 | void unxlate_dev_mem_ptr(unsigned long phys, void *addr); |
| 40 | 41 | ||
| 41 | /* | 42 | /* |
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index 0f0de30e3e3f..ac01463038f1 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
| @@ -646,7 +646,7 @@ static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste) | |||
| 646 | unsigned long address, bits; | 646 | unsigned long address, bits; |
| 647 | unsigned char skey; | 647 | unsigned char skey; |
| 648 | 648 | ||
| 649 | if (!pte_present(*ptep)) | 649 | if (pte_val(*ptep) & _PAGE_INVALID) |
| 650 | return pgste; | 650 | return pgste; |
| 651 | address = pte_val(*ptep) & PAGE_MASK; | 651 | address = pte_val(*ptep) & PAGE_MASK; |
| 652 | skey = page_get_storage_key(address); | 652 | skey = page_get_storage_key(address); |
| @@ -680,7 +680,7 @@ static inline pgste_t pgste_update_young(pte_t *ptep, pgste_t pgste) | |||
| 680 | #ifdef CONFIG_PGSTE | 680 | #ifdef CONFIG_PGSTE |
| 681 | int young; | 681 | int young; |
| 682 | 682 | ||
| 683 | if (!pte_present(*ptep)) | 683 | if (pte_val(*ptep) & _PAGE_INVALID) |
| 684 | return pgste; | 684 | return pgste; |
| 685 | /* Get referenced bit from storage key */ | 685 | /* Get referenced bit from storage key */ |
| 686 | young = page_reset_referenced(pte_val(*ptep) & PAGE_MASK); | 686 | young = page_reset_referenced(pte_val(*ptep) & PAGE_MASK); |
| @@ -706,7 +706,7 @@ static inline void pgste_set_key(pte_t *ptep, pgste_t pgste, pte_t entry) | |||
| 706 | unsigned long address; | 706 | unsigned long address; |
| 707 | unsigned long okey, nkey; | 707 | unsigned long okey, nkey; |
| 708 | 708 | ||
| 709 | if (!pte_present(entry)) | 709 | if (pte_val(entry) & _PAGE_INVALID) |
| 710 | return; | 710 | return; |
| 711 | address = pte_val(entry) & PAGE_MASK; | 711 | address = pte_val(entry) & PAGE_MASK; |
| 712 | okey = nkey = page_get_storage_key(address); | 712 | okey = nkey = page_get_storage_key(address); |
| @@ -1098,6 +1098,9 @@ static inline pte_t ptep_modify_prot_start(struct mm_struct *mm, | |||
| 1098 | pte = *ptep; | 1098 | pte = *ptep; |
| 1099 | if (!mm_exclusive(mm)) | 1099 | if (!mm_exclusive(mm)) |
| 1100 | __ptep_ipte(address, ptep); | 1100 | __ptep_ipte(address, ptep); |
| 1101 | |||
| 1102 | if (mm_has_pgste(mm)) | ||
| 1103 | pgste = pgste_update_all(&pte, pgste); | ||
| 1101 | return pte; | 1104 | return pte; |
| 1102 | } | 1105 | } |
| 1103 | 1106 | ||
| @@ -1105,9 +1108,13 @@ static inline void ptep_modify_prot_commit(struct mm_struct *mm, | |||
| 1105 | unsigned long address, | 1108 | unsigned long address, |
| 1106 | pte_t *ptep, pte_t pte) | 1109 | pte_t *ptep, pte_t pte) |
| 1107 | { | 1110 | { |
| 1111 | pgste_t pgste; | ||
| 1112 | |||
| 1108 | if (mm_has_pgste(mm)) { | 1113 | if (mm_has_pgste(mm)) { |
| 1114 | pgste = *(pgste_t *)(ptep + PTRS_PER_PTE); | ||
| 1115 | pgste_set_key(ptep, pgste, pte); | ||
| 1109 | pgste_set_pte(ptep, pte); | 1116 | pgste_set_pte(ptep, pte); |
| 1110 | pgste_set_unlock(ptep, *(pgste_t *)(ptep + PTRS_PER_PTE)); | 1117 | pgste_set_unlock(ptep, pgste); |
| 1111 | } else | 1118 | } else |
| 1112 | *ptep = pte; | 1119 | *ptep = pte; |
| 1113 | } | 1120 | } |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 05674b669001..4f977d0d25c2 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
| @@ -428,34 +428,27 @@ void smp_stop_cpu(void) | |||
| 428 | * This is the main routine where commands issued by other | 428 | * This is the main routine where commands issued by other |
| 429 | * cpus are handled. | 429 | * cpus are handled. |
| 430 | */ | 430 | */ |
| 431 | static void do_ext_call_interrupt(struct ext_code ext_code, | 431 | static void smp_handle_ext_call(void) |
| 432 | unsigned int param32, unsigned long param64) | ||
| 433 | { | 432 | { |
| 434 | unsigned long bits; | 433 | unsigned long bits; |
| 435 | int cpu; | ||
| 436 | |||
| 437 | cpu = smp_processor_id(); | ||
| 438 | if (ext_code.code == 0x1202) | ||
| 439 | inc_irq_stat(IRQEXT_EXC); | ||
| 440 | else | ||
| 441 | inc_irq_stat(IRQEXT_EMS); | ||
| 442 | /* | ||
| 443 | * handle bit signal external calls | ||
| 444 | */ | ||
| 445 | bits = xchg(&pcpu_devices[cpu].ec_mask, 0); | ||
| 446 | 434 | ||
| 435 | /* handle bit signal external calls */ | ||
| 436 | bits = xchg(&pcpu_devices[smp_processor_id()].ec_mask, 0); | ||
| 447 | if (test_bit(ec_stop_cpu, &bits)) | 437 | if (test_bit(ec_stop_cpu, &bits)) |
| 448 | smp_stop_cpu(); | 438 | smp_stop_cpu(); |
| 449 | |||
| 450 | if (test_bit(ec_schedule, &bits)) | 439 | if (test_bit(ec_schedule, &bits)) |
| 451 | scheduler_ipi(); | 440 | scheduler_ipi(); |
| 452 | |||
| 453 | if (test_bit(ec_call_function, &bits)) | 441 | if (test_bit(ec_call_function, &bits)) |
| 454 | generic_smp_call_function_interrupt(); | 442 | generic_smp_call_function_interrupt(); |
| 455 | |||
| 456 | if (test_bit(ec_call_function_single, &bits)) | 443 | if (test_bit(ec_call_function_single, &bits)) |
| 457 | generic_smp_call_function_single_interrupt(); | 444 | generic_smp_call_function_single_interrupt(); |
| 445 | } | ||
| 458 | 446 | ||
| 447 | static void do_ext_call_interrupt(struct ext_code ext_code, | ||
| 448 | unsigned int param32, unsigned long param64) | ||
| 449 | { | ||
| 450 | inc_irq_stat(ext_code.code == 0x1202 ? IRQEXT_EXC : IRQEXT_EMS); | ||
| 451 | smp_handle_ext_call(); | ||
| 459 | } | 452 | } |
| 460 | 453 | ||
| 461 | void arch_send_call_function_ipi_mask(const struct cpumask *mask) | 454 | void arch_send_call_function_ipi_mask(const struct cpumask *mask) |
| @@ -760,6 +753,8 @@ int __cpu_disable(void) | |||
| 760 | { | 753 | { |
| 761 | unsigned long cregs[16]; | 754 | unsigned long cregs[16]; |
| 762 | 755 | ||
| 756 | /* Handle possible pending IPIs */ | ||
| 757 | smp_handle_ext_call(); | ||
| 763 | set_cpu_online(smp_processor_id(), false); | 758 | set_cpu_online(smp_processor_id(), false); |
| 764 | /* Disable pseudo page faults on this cpu. */ | 759 | /* Disable pseudo page faults on this cpu. */ |
| 765 | pfault_fini(); | 760 | pfault_fini(); |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 18dc417aaf79..a938b548f07e 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
| @@ -492,7 +492,7 @@ static int gmap_connect_pgtable(unsigned long address, unsigned long segment, | |||
| 492 | mp = (struct gmap_pgtable *) page->index; | 492 | mp = (struct gmap_pgtable *) page->index; |
| 493 | rmap->gmap = gmap; | 493 | rmap->gmap = gmap; |
| 494 | rmap->entry = segment_ptr; | 494 | rmap->entry = segment_ptr; |
| 495 | rmap->vmaddr = address; | 495 | rmap->vmaddr = address & PMD_MASK; |
| 496 | spin_lock(&mm->page_table_lock); | 496 | spin_lock(&mm->page_table_lock); |
| 497 | if (*segment_ptr == segment) { | 497 | if (*segment_ptr == segment) { |
| 498 | list_add(&rmap->list, &mp->mapper); | 498 | list_add(&rmap->list, &mp->mapper); |
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 8db0010ed150..5953dcea752d 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
| @@ -1240,9 +1240,12 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt, | |||
| 1240 | ctxt->modrm_seg = VCPU_SREG_DS; | 1240 | ctxt->modrm_seg = VCPU_SREG_DS; |
| 1241 | 1241 | ||
| 1242 | if (ctxt->modrm_mod == 3) { | 1242 | if (ctxt->modrm_mod == 3) { |
| 1243 | int highbyte_regs = ctxt->rex_prefix == 0; | ||
| 1244 | |||
| 1243 | op->type = OP_REG; | 1245 | op->type = OP_REG; |
| 1244 | op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; | 1246 | op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; |
| 1245 | op->addr.reg = decode_register(ctxt, ctxt->modrm_rm, ctxt->d & ByteOp); | 1247 | op->addr.reg = decode_register(ctxt, ctxt->modrm_rm, |
| 1248 | highbyte_regs && (ctxt->d & ByteOp)); | ||
| 1246 | if (ctxt->d & Sse) { | 1249 | if (ctxt->d & Sse) { |
| 1247 | op->type = OP_XMM; | 1250 | op->type = OP_XMM; |
| 1248 | op->bytes = 16; | 1251 | op->bytes = 16; |
| @@ -3997,7 +4000,8 @@ static const struct opcode twobyte_table[256] = { | |||
| 3997 | DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N, | 4000 | DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N, |
| 3998 | N, D(ImplicitOps | ModRM), N, N, | 4001 | N, D(ImplicitOps | ModRM), N, N, |
| 3999 | /* 0x10 - 0x1F */ | 4002 | /* 0x10 - 0x1F */ |
| 4000 | N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N, | 4003 | N, N, N, N, N, N, N, N, |
| 4004 | D(ImplicitOps | ModRM), N, N, N, N, N, N, D(ImplicitOps | ModRM), | ||
| 4001 | /* 0x20 - 0x2F */ | 4005 | /* 0x20 - 0x2F */ |
| 4002 | DIP(ModRM | DstMem | Priv | Op3264, cr_read, check_cr_read), | 4006 | DIP(ModRM | DstMem | Priv | Op3264, cr_read, check_cr_read), |
| 4003 | DIP(ModRM | DstMem | Priv | Op3264, dr_read, check_dr_read), | 4007 | DIP(ModRM | DstMem | Priv | Op3264, dr_read, check_dr_read), |
| @@ -4836,6 +4840,7 @@ twobyte_insn: | |||
| 4836 | case 0x08: /* invd */ | 4840 | case 0x08: /* invd */ |
| 4837 | case 0x0d: /* GrpP (prefetch) */ | 4841 | case 0x0d: /* GrpP (prefetch) */ |
| 4838 | case 0x18: /* Grp16 (prefetch/nop) */ | 4842 | case 0x18: /* Grp16 (prefetch/nop) */ |
| 4843 | case 0x1f: /* nop */ | ||
| 4839 | break; | 4844 | break; |
| 4840 | case 0x20: /* mov cr, reg */ | 4845 | case 0x20: /* mov cr, reg */ |
| 4841 | ctxt->dst.val = ops->get_cr(ctxt, ctxt->modrm_reg); | 4846 | ctxt->dst.val = ops->get_cr(ctxt, ctxt->modrm_reg); |
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index e1adbb4aca75..0eee2c8b64d1 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c | |||
| @@ -1861,11 +1861,14 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu) | |||
| 1861 | { | 1861 | { |
| 1862 | struct kvm_lapic *apic = vcpu->arch.apic; | 1862 | struct kvm_lapic *apic = vcpu->arch.apic; |
| 1863 | unsigned int sipi_vector; | 1863 | unsigned int sipi_vector; |
| 1864 | unsigned long pe; | ||
| 1864 | 1865 | ||
| 1865 | if (!kvm_vcpu_has_lapic(vcpu)) | 1866 | if (!kvm_vcpu_has_lapic(vcpu) || !apic->pending_events) |
| 1866 | return; | 1867 | return; |
| 1867 | 1868 | ||
| 1868 | if (test_and_clear_bit(KVM_APIC_INIT, &apic->pending_events)) { | 1869 | pe = xchg(&apic->pending_events, 0); |
| 1870 | |||
| 1871 | if (test_bit(KVM_APIC_INIT, &pe)) { | ||
| 1869 | kvm_lapic_reset(vcpu); | 1872 | kvm_lapic_reset(vcpu); |
| 1870 | kvm_vcpu_reset(vcpu); | 1873 | kvm_vcpu_reset(vcpu); |
| 1871 | if (kvm_vcpu_is_bsp(apic->vcpu)) | 1874 | if (kvm_vcpu_is_bsp(apic->vcpu)) |
| @@ -1873,7 +1876,7 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu) | |||
| 1873 | else | 1876 | else |
| 1874 | vcpu->arch.mp_state = KVM_MP_STATE_INIT_RECEIVED; | 1877 | vcpu->arch.mp_state = KVM_MP_STATE_INIT_RECEIVED; |
| 1875 | } | 1878 | } |
| 1876 | if (test_and_clear_bit(KVM_APIC_SIPI, &apic->pending_events) && | 1879 | if (test_bit(KVM_APIC_SIPI, &pe) && |
| 1877 | vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED) { | 1880 | vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED) { |
| 1878 | /* evaluate pending_events before reading the vector */ | 1881 | /* evaluate pending_events before reading the vector */ |
| 1879 | smp_rmb(); | 1882 | smp_rmb(); |
diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c index 305c68b8d538..981c2dbd72cc 100644 --- a/arch/x86/pci/common.c +++ b/arch/x86/pci/common.c | |||
| @@ -628,7 +628,9 @@ int pcibios_add_device(struct pci_dev *dev) | |||
| 628 | 628 | ||
| 629 | pa_data = boot_params.hdr.setup_data; | 629 | pa_data = boot_params.hdr.setup_data; |
| 630 | while (pa_data) { | 630 | while (pa_data) { |
| 631 | data = phys_to_virt(pa_data); | 631 | data = ioremap(pa_data, sizeof(*rom)); |
| 632 | if (!data) | ||
| 633 | return -ENOMEM; | ||
| 632 | 634 | ||
| 633 | if (data->type == SETUP_PCI) { | 635 | if (data->type == SETUP_PCI) { |
| 634 | rom = (struct pci_setup_rom *)data; | 636 | rom = (struct pci_setup_rom *)data; |
| @@ -645,6 +647,7 @@ int pcibios_add_device(struct pci_dev *dev) | |||
| 645 | } | 647 | } |
| 646 | } | 648 | } |
| 647 | pa_data = data->next; | 649 | pa_data = data->next; |
| 650 | iounmap(data); | ||
| 648 | } | 651 | } |
| 649 | return 0; | 652 | return 0; |
| 650 | } | 653 | } |
diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index 403baf4dffc1..fcd7d91cec34 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c | |||
| @@ -919,13 +919,14 @@ static int ghes_probe(struct platform_device *ghes_dev) | |||
| 919 | break; | 919 | break; |
| 920 | case ACPI_HEST_NOTIFY_EXTERNAL: | 920 | case ACPI_HEST_NOTIFY_EXTERNAL: |
| 921 | /* External interrupt vector is GSI */ | 921 | /* External interrupt vector is GSI */ |
| 922 | if (acpi_gsi_to_irq(generic->notify.vector, &ghes->irq)) { | 922 | rc = acpi_gsi_to_irq(generic->notify.vector, &ghes->irq); |
| 923 | if (rc) { | ||
| 923 | pr_err(GHES_PFX "Failed to map GSI to IRQ for generic hardware error source: %d\n", | 924 | pr_err(GHES_PFX "Failed to map GSI to IRQ for generic hardware error source: %d\n", |
| 924 | generic->header.source_id); | 925 | generic->header.source_id); |
| 925 | goto err_edac_unreg; | 926 | goto err_edac_unreg; |
| 926 | } | 927 | } |
| 927 | if (request_irq(ghes->irq, ghes_irq_func, | 928 | rc = request_irq(ghes->irq, ghes_irq_func, 0, "GHES IRQ", ghes); |
| 928 | 0, "GHES IRQ", ghes)) { | 929 | if (rc) { |
| 929 | pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n", | 930 | pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n", |
| 930 | generic->header.source_id); | 931 | generic->header.source_id); |
| 931 | goto err_edac_unreg; | 932 | goto err_edac_unreg; |
diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c index bc493aa3af19..318fa32a141e 100644 --- a/drivers/acpi/device_pm.c +++ b/drivers/acpi/device_pm.c | |||
| @@ -278,11 +278,13 @@ int acpi_bus_init_power(struct acpi_device *device) | |||
| 278 | if (result) | 278 | if (result) |
| 279 | return result; | 279 | return result; |
| 280 | } else if (state == ACPI_STATE_UNKNOWN) { | 280 | } else if (state == ACPI_STATE_UNKNOWN) { |
| 281 | /* No power resources and missing _PSC? Try to force D0. */ | 281 | /* |
| 282 | * No power resources and missing _PSC? Cross fingers and make | ||
| 283 | * it D0 in hope that this is what the BIOS put the device into. | ||
| 284 | * [We tried to force D0 here by executing _PS0, but that broke | ||
| 285 | * Toshiba P870-303 in a nasty way.] | ||
| 286 | */ | ||
| 282 | state = ACPI_STATE_D0; | 287 | state = ACPI_STATE_D0; |
| 283 | result = acpi_dev_pm_explicit_set(device, state); | ||
| 284 | if (result) | ||
| 285 | return result; | ||
| 286 | } | 288 | } |
| 287 | device->power.state = state; | 289 | device->power.state = state; |
| 288 | return 0; | 290 | return 0; |
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c index 5b32e15a65ce..5d7075d25700 100644 --- a/drivers/acpi/video.c +++ b/drivers/acpi/video.c | |||
| @@ -458,12 +458,28 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | |||
| 458 | }, | 458 | }, |
| 459 | { | 459 | { |
| 460 | .callback = video_ignore_initial_backlight, | 460 | .callback = video_ignore_initial_backlight, |
| 461 | .ident = "HP Pavilion g6 Notebook PC", | ||
| 462 | .matches = { | ||
| 463 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
| 464 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"), | ||
| 465 | }, | ||
| 466 | }, | ||
| 467 | { | ||
| 468 | .callback = video_ignore_initial_backlight, | ||
| 461 | .ident = "HP 1000 Notebook PC", | 469 | .ident = "HP 1000 Notebook PC", |
| 462 | .matches = { | 470 | .matches = { |
| 463 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | 471 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
| 464 | DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"), | 472 | DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"), |
| 465 | }, | 473 | }, |
| 466 | }, | 474 | }, |
| 475 | { | ||
| 476 | .callback = video_ignore_initial_backlight, | ||
| 477 | .ident = "HP Pavilion m4", | ||
| 478 | .matches = { | ||
| 479 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
| 480 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"), | ||
| 481 | }, | ||
| 482 | }, | ||
| 467 | {} | 483 | {} |
| 468 | }; | 484 | }; |
| 469 | 485 | ||
diff --git a/drivers/ata/acard-ahci.c b/drivers/ata/acard-ahci.c index 4e94ba29cb8d..9d0cf019ce59 100644 --- a/drivers/ata/acard-ahci.c +++ b/drivers/ata/acard-ahci.c | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | /* | 2 | /* |
| 3 | * acard-ahci.c - ACard AHCI SATA support | 3 | * acard-ahci.c - ACard AHCI SATA support |
| 4 | * | 4 | * |
| 5 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 5 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 6 | * Please ALWAYS copy linux-ide@vger.kernel.org | 6 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 7 | * on emails. | 7 | * on emails. |
| 8 | * | 8 | * |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 251e57d38942..2b50dfdf1cfc 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * ahci.c - AHCI SATA support | 2 | * ahci.c - AHCI SATA support |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
| @@ -423,6 +423,8 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 423 | .driver_data = board_ahci_yes_fbs }, /* 88se9125 */ | 423 | .driver_data = board_ahci_yes_fbs }, /* 88se9125 */ |
| 424 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a), | 424 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a), |
| 425 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ | 425 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ |
| 426 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172), | ||
| 427 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ | ||
| 426 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192), | 428 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192), |
| 427 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */ | 429 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */ |
| 428 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3), | 430 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3), |
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index b830e6c9fe49..10b14d45cfd2 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * ahci.h - Common AHCI SATA definitions and declarations | 2 | * ahci.h - Common AHCI SATA definitions and declarations |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 2f48123d74c4..9a8a674e8fac 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * ata_piix.c - Intel PATA/SATA controllers | 2 | * ata_piix.c - Intel PATA/SATA controllers |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
| @@ -151,6 +151,7 @@ enum piix_controller_ids { | |||
| 151 | piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */ | 151 | piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */ |
| 152 | ich8_sata_snb, | 152 | ich8_sata_snb, |
| 153 | ich8_2port_sata_snb, | 153 | ich8_2port_sata_snb, |
| 154 | ich8_2port_sata_byt, | ||
| 154 | }; | 155 | }; |
| 155 | 156 | ||
| 156 | struct piix_map_db { | 157 | struct piix_map_db { |
| @@ -334,6 +335,9 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
| 334 | { 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | 335 | { 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, |
| 335 | /* SATA Controller IDE (Wellsburg) */ | 336 | /* SATA Controller IDE (Wellsburg) */ |
| 336 | { 0x8086, 0x8d68, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 337 | { 0x8086, 0x8d68, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
| 338 | /* SATA Controller IDE (BayTrail) */ | ||
| 339 | { 0x8086, 0x0F20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt }, | ||
| 340 | { 0x8086, 0x0F21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt }, | ||
| 337 | 341 | ||
| 338 | { } /* terminate list */ | 342 | { } /* terminate list */ |
| 339 | }; | 343 | }; |
| @@ -441,6 +445,7 @@ static const struct piix_map_db *piix_map_db_table[] = { | |||
| 441 | [tolapai_sata] = &tolapai_map_db, | 445 | [tolapai_sata] = &tolapai_map_db, |
| 442 | [ich8_sata_snb] = &ich8_map_db, | 446 | [ich8_sata_snb] = &ich8_map_db, |
| 443 | [ich8_2port_sata_snb] = &ich8_2port_map_db, | 447 | [ich8_2port_sata_snb] = &ich8_2port_map_db, |
| 448 | [ich8_2port_sata_byt] = &ich8_2port_map_db, | ||
| 444 | }; | 449 | }; |
| 445 | 450 | ||
| 446 | static struct pci_bits piix_enable_bits[] = { | 451 | static struct pci_bits piix_enable_bits[] = { |
| @@ -1254,6 +1259,16 @@ static struct ata_port_info piix_port_info[] = { | |||
| 1254 | .udma_mask = ATA_UDMA6, | 1259 | .udma_mask = ATA_UDMA6, |
| 1255 | .port_ops = &piix_sata_ops, | 1260 | .port_ops = &piix_sata_ops, |
| 1256 | }, | 1261 | }, |
| 1262 | |||
| 1263 | [ich8_2port_sata_byt] = | ||
| 1264 | { | ||
| 1265 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16, | ||
| 1266 | .pio_mask = ATA_PIO4, | ||
| 1267 | .mwdma_mask = ATA_MWDMA2, | ||
| 1268 | .udma_mask = ATA_UDMA6, | ||
| 1269 | .port_ops = &piix_sata_ops, | ||
| 1270 | }, | ||
| 1271 | |||
| 1257 | }; | 1272 | }; |
| 1258 | 1273 | ||
| 1259 | #define AHCI_PCI_BAR 5 | 1274 | #define AHCI_PCI_BAR 5 |
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index 34c82167b962..a70ff154f586 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * libahci.c - Common AHCI SATA low-level routines | 2 | * libahci.c - Common AHCI SATA low-level routines |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 63c743baf920..f2184276539d 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * libata-core.c - helper library for ATA | 2 | * libata-core.c - helper library for ATA |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
| @@ -1602,6 +1602,12 @@ unsigned ata_exec_internal_sg(struct ata_device *dev, | |||
| 1602 | qc->tf = *tf; | 1602 | qc->tf = *tf; |
| 1603 | if (cdb) | 1603 | if (cdb) |
| 1604 | memcpy(qc->cdb, cdb, ATAPI_CDB_LEN); | 1604 | memcpy(qc->cdb, cdb, ATAPI_CDB_LEN); |
| 1605 | |||
| 1606 | /* some SATA bridges need us to indicate data xfer direction */ | ||
| 1607 | if (tf->protocol == ATAPI_PROT_DMA && (dev->flags & ATA_DFLAG_DMADIR) && | ||
| 1608 | dma_dir == DMA_FROM_DEVICE) | ||
| 1609 | qc->tf.feature |= ATAPI_DMADIR; | ||
| 1610 | |||
| 1605 | qc->flags |= ATA_QCFLAG_RESULT_TF; | 1611 | qc->flags |= ATA_QCFLAG_RESULT_TF; |
| 1606 | qc->dma_dir = dma_dir; | 1612 | qc->dma_dir = dma_dir; |
| 1607 | if (dma_dir != DMA_NONE) { | 1613 | if (dma_dir != DMA_NONE) { |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index f9476fb3ac43..c69fcce505c0 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * libata-eh.c - libata error handling | 2 | * libata-eh.c - libata error handling |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index dd310b27b24c..0101af541436 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * libata-scsi.c - helper library for ATA | 2 | * libata-scsi.c - helper library for ATA |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index d8af325a6bda..b603720b877d 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * libata-sff.c - helper library for PCI IDE BMDMA | 2 | * libata-sff.c - helper library for PCI IDE BMDMA |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c index 505333340ad5..8ea6e6afd041 100644 --- a/drivers/ata/pdc_adma.c +++ b/drivers/ata/pdc_adma.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * pdc_adma.c - Pacific Digital Corporation ADMA | 2 | * pdc_adma.c - Pacific Digital Corporation ADMA |
| 3 | * | 3 | * |
| 4 | * Maintained by: Mark Lord <mlord@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * | 5 | * |
| 6 | * Copyright 2005 Mark Lord | 6 | * Copyright 2005 Mark Lord |
| 7 | * | 7 | * |
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c index fb0dd87f8893..958ba2a420c3 100644 --- a/drivers/ata/sata_promise.c +++ b/drivers/ata/sata_promise.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * sata_promise.c - Promise SATA | 2 | * sata_promise.c - Promise SATA |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Mikael Pettersson <mikpe@it.uu.se> | 5 | * Mikael Pettersson <mikpe@it.uu.se> |
| 6 | * Please ALWAYS copy linux-ide@vger.kernel.org | 6 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 7 | * on emails. | 7 | * on emails. |
diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c index 4799868bd733..249c8a289bfd 100644 --- a/drivers/ata/sata_rcar.c +++ b/drivers/ata/sata_rcar.c | |||
| @@ -549,6 +549,7 @@ static void sata_rcar_bmdma_start(struct ata_queued_cmd *qc) | |||
| 549 | 549 | ||
| 550 | /* start host DMA transaction */ | 550 | /* start host DMA transaction */ |
| 551 | dmactl = ioread32(priv->base + ATAPI_CONTROL1_REG); | 551 | dmactl = ioread32(priv->base + ATAPI_CONTROL1_REG); |
| 552 | dmactl &= ~ATAPI_CONTROL1_STOP; | ||
| 552 | dmactl |= ATAPI_CONTROL1_START; | 553 | dmactl |= ATAPI_CONTROL1_START; |
| 553 | iowrite32(dmactl, priv->base + ATAPI_CONTROL1_REG); | 554 | iowrite32(dmactl, priv->base + ATAPI_CONTROL1_REG); |
| 554 | } | 555 | } |
| @@ -618,17 +619,16 @@ static struct ata_port_operations sata_rcar_port_ops = { | |||
| 618 | .bmdma_status = sata_rcar_bmdma_status, | 619 | .bmdma_status = sata_rcar_bmdma_status, |
| 619 | }; | 620 | }; |
| 620 | 621 | ||
| 621 | static int sata_rcar_serr_interrupt(struct ata_port *ap) | 622 | static void sata_rcar_serr_interrupt(struct ata_port *ap) |
| 622 | { | 623 | { |
| 623 | struct sata_rcar_priv *priv = ap->host->private_data; | 624 | struct sata_rcar_priv *priv = ap->host->private_data; |
| 624 | struct ata_eh_info *ehi = &ap->link.eh_info; | 625 | struct ata_eh_info *ehi = &ap->link.eh_info; |
| 625 | int freeze = 0; | 626 | int freeze = 0; |
| 626 | int handled = 0; | ||
| 627 | u32 serror; | 627 | u32 serror; |
| 628 | 628 | ||
| 629 | serror = ioread32(priv->base + SCRSERR_REG); | 629 | serror = ioread32(priv->base + SCRSERR_REG); |
| 630 | if (!serror) | 630 | if (!serror) |
| 631 | return 0; | 631 | return; |
| 632 | 632 | ||
| 633 | DPRINTK("SError @host_intr: 0x%x\n", serror); | 633 | DPRINTK("SError @host_intr: 0x%x\n", serror); |
| 634 | 634 | ||
| @@ -641,7 +641,6 @@ static int sata_rcar_serr_interrupt(struct ata_port *ap) | |||
| 641 | ata_ehi_push_desc(ehi, "%s", "hotplug"); | 641 | ata_ehi_push_desc(ehi, "%s", "hotplug"); |
| 642 | 642 | ||
| 643 | freeze = serror & SERR_COMM_WAKE ? 0 : 1; | 643 | freeze = serror & SERR_COMM_WAKE ? 0 : 1; |
| 644 | handled = 1; | ||
| 645 | } | 644 | } |
| 646 | 645 | ||
| 647 | /* freeze or abort */ | 646 | /* freeze or abort */ |
| @@ -649,11 +648,9 @@ static int sata_rcar_serr_interrupt(struct ata_port *ap) | |||
| 649 | ata_port_freeze(ap); | 648 | ata_port_freeze(ap); |
| 650 | else | 649 | else |
| 651 | ata_port_abort(ap); | 650 | ata_port_abort(ap); |
| 652 | |||
| 653 | return handled; | ||
| 654 | } | 651 | } |
| 655 | 652 | ||
| 656 | static int sata_rcar_ata_interrupt(struct ata_port *ap) | 653 | static void sata_rcar_ata_interrupt(struct ata_port *ap) |
| 657 | { | 654 | { |
| 658 | struct ata_queued_cmd *qc; | 655 | struct ata_queued_cmd *qc; |
| 659 | int handled = 0; | 656 | int handled = 0; |
| @@ -662,7 +659,9 @@ static int sata_rcar_ata_interrupt(struct ata_port *ap) | |||
| 662 | if (qc) | 659 | if (qc) |
| 663 | handled |= ata_bmdma_port_intr(ap, qc); | 660 | handled |= ata_bmdma_port_intr(ap, qc); |
| 664 | 661 | ||
| 665 | return handled; | 662 | /* be sure to clear ATA interrupt */ |
| 663 | if (!handled) | ||
| 664 | sata_rcar_check_status(ap); | ||
| 666 | } | 665 | } |
| 667 | 666 | ||
| 668 | static irqreturn_t sata_rcar_interrupt(int irq, void *dev_instance) | 667 | static irqreturn_t sata_rcar_interrupt(int irq, void *dev_instance) |
| @@ -677,20 +676,21 @@ static irqreturn_t sata_rcar_interrupt(int irq, void *dev_instance) | |||
| 677 | spin_lock_irqsave(&host->lock, flags); | 676 | spin_lock_irqsave(&host->lock, flags); |
| 678 | 677 | ||
| 679 | sataintstat = ioread32(priv->base + SATAINTSTAT_REG); | 678 | sataintstat = ioread32(priv->base + SATAINTSTAT_REG); |
| 679 | sataintstat &= SATA_RCAR_INT_MASK; | ||
| 680 | if (!sataintstat) | 680 | if (!sataintstat) |
| 681 | goto done; | 681 | goto done; |
| 682 | /* ack */ | 682 | /* ack */ |
| 683 | iowrite32(sataintstat & ~SATA_RCAR_INT_MASK, | 683 | iowrite32(~sataintstat & 0x7ff, priv->base + SATAINTSTAT_REG); |
| 684 | priv->base + SATAINTSTAT_REG); | ||
| 685 | 684 | ||
| 686 | ap = host->ports[0]; | 685 | ap = host->ports[0]; |
| 687 | 686 | ||
| 688 | if (sataintstat & SATAINTSTAT_ATA) | 687 | if (sataintstat & SATAINTSTAT_ATA) |
| 689 | handled |= sata_rcar_ata_interrupt(ap); | 688 | sata_rcar_ata_interrupt(ap); |
| 690 | 689 | ||
| 691 | if (sataintstat & SATAINTSTAT_SERR) | 690 | if (sataintstat & SATAINTSTAT_SERR) |
| 692 | handled |= sata_rcar_serr_interrupt(ap); | 691 | sata_rcar_serr_interrupt(ap); |
| 693 | 692 | ||
| 693 | handled = 1; | ||
| 694 | done: | 694 | done: |
| 695 | spin_unlock_irqrestore(&host->lock, flags); | 695 | spin_unlock_irqrestore(&host->lock, flags); |
| 696 | 696 | ||
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c index a7b31672c4b7..0ae3ca4bf5c0 100644 --- a/drivers/ata/sata_sil.c +++ b/drivers/ata/sata_sil.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * sata_sil.c - Silicon Image SATA | 2 | * sata_sil.c - Silicon Image SATA |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c index 7b7127a58f51..9947010afc0f 100644 --- a/drivers/ata/sata_sx4.c +++ b/drivers/ata/sata_sx4.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * sata_sx4.c - Promise SATA | 2 | * sata_sx4.c - Promise SATA |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 5913ea9d57b2..87f056e54a9d 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * sata_via.c - VIA Serial ATA controllers | 2 | * sata_via.c - VIA Serial ATA controllers |
| 3 | * | 3 | * |
| 4 | * Maintained by: Jeff Garzik <jgarzik@pobox.com> | 4 | * Maintained by: Tejun Heo <tj@kernel.org> |
| 5 | * Please ALWAYS copy linux-ide@vger.kernel.org | 5 | * Please ALWAYS copy linux-ide@vger.kernel.org |
| 6 | * on emails. | 6 | * on emails. |
| 7 | * | 7 | * |
diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c index 11b8b4b54ceb..edc089e9d0c4 100644 --- a/drivers/cpufreq/acpi-cpufreq.c +++ b/drivers/cpufreq/acpi-cpufreq.c | |||
| @@ -347,11 +347,11 @@ static u32 get_cur_val(const struct cpumask *mask) | |||
| 347 | switch (per_cpu(acfreq_data, cpumask_first(mask))->cpu_feature) { | 347 | switch (per_cpu(acfreq_data, cpumask_first(mask))->cpu_feature) { |
| 348 | case SYSTEM_INTEL_MSR_CAPABLE: | 348 | case SYSTEM_INTEL_MSR_CAPABLE: |
| 349 | cmd.type = SYSTEM_INTEL_MSR_CAPABLE; | 349 | cmd.type = SYSTEM_INTEL_MSR_CAPABLE; |
| 350 | cmd.addr.msr.reg = MSR_IA32_PERF_STATUS; | 350 | cmd.addr.msr.reg = MSR_IA32_PERF_CTL; |
| 351 | break; | 351 | break; |
| 352 | case SYSTEM_AMD_MSR_CAPABLE: | 352 | case SYSTEM_AMD_MSR_CAPABLE: |
| 353 | cmd.type = SYSTEM_AMD_MSR_CAPABLE; | 353 | cmd.type = SYSTEM_AMD_MSR_CAPABLE; |
| 354 | cmd.addr.msr.reg = MSR_AMD_PERF_STATUS; | 354 | cmd.addr.msr.reg = MSR_AMD_PERF_CTL; |
| 355 | break; | 355 | break; |
| 356 | case SYSTEM_IO_CAPABLE: | 356 | case SYSTEM_IO_CAPABLE: |
| 357 | cmd.type = SYSTEM_IO_CAPABLE; | 357 | cmd.type = SYSTEM_IO_CAPABLE; |
diff --git a/drivers/cpufreq/cpufreq-cpu0.c b/drivers/cpufreq/cpufreq-cpu0.c index a64eb8b70444..ad1fde277661 100644 --- a/drivers/cpufreq/cpufreq-cpu0.c +++ b/drivers/cpufreq/cpufreq-cpu0.c | |||
| @@ -45,7 +45,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, | |||
| 45 | struct cpufreq_freqs freqs; | 45 | struct cpufreq_freqs freqs; |
| 46 | struct opp *opp; | 46 | struct opp *opp; |
| 47 | unsigned long volt = 0, volt_old = 0, tol = 0; | 47 | unsigned long volt = 0, volt_old = 0, tol = 0; |
| 48 | long freq_Hz; | 48 | long freq_Hz, freq_exact; |
| 49 | unsigned int index; | 49 | unsigned int index; |
| 50 | int ret; | 50 | int ret; |
| 51 | 51 | ||
| @@ -60,6 +60,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, | |||
| 60 | freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000); | 60 | freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000); |
| 61 | if (freq_Hz < 0) | 61 | if (freq_Hz < 0) |
| 62 | freq_Hz = freq_table[index].frequency * 1000; | 62 | freq_Hz = freq_table[index].frequency * 1000; |
| 63 | freq_exact = freq_Hz; | ||
| 63 | freqs.new = freq_Hz / 1000; | 64 | freqs.new = freq_Hz / 1000; |
| 64 | freqs.old = clk_get_rate(cpu_clk) / 1000; | 65 | freqs.old = clk_get_rate(cpu_clk) / 1000; |
| 65 | 66 | ||
| @@ -98,7 +99,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy, | |||
| 98 | } | 99 | } |
| 99 | } | 100 | } |
| 100 | 101 | ||
| 101 | ret = clk_set_rate(cpu_clk, freqs.new * 1000); | 102 | ret = clk_set_rate(cpu_clk, freq_exact); |
| 102 | if (ret) { | 103 | if (ret) { |
| 103 | pr_err("failed to set clock rate: %d\n", ret); | 104 | pr_err("failed to set clock rate: %d\n", ret); |
| 104 | if (cpu_reg) | 105 | if (cpu_reg) |
diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c index 5af40ad82d23..dc9b72e25c1a 100644 --- a/drivers/cpufreq/cpufreq_governor.c +++ b/drivers/cpufreq/cpufreq_governor.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/tick.h> | 26 | #include <linux/tick.h> |
| 27 | #include <linux/types.h> | 27 | #include <linux/types.h> |
| 28 | #include <linux/workqueue.h> | 28 | #include <linux/workqueue.h> |
| 29 | #include <linux/cpu.h> | ||
| 29 | 30 | ||
| 30 | #include "cpufreq_governor.h" | 31 | #include "cpufreq_governor.h" |
| 31 | 32 | ||
| @@ -180,8 +181,10 @@ void gov_queue_work(struct dbs_data *dbs_data, struct cpufreq_policy *policy, | |||
| 180 | if (!all_cpus) { | 181 | if (!all_cpus) { |
| 181 | __gov_queue_work(smp_processor_id(), dbs_data, delay); | 182 | __gov_queue_work(smp_processor_id(), dbs_data, delay); |
| 182 | } else { | 183 | } else { |
| 184 | get_online_cpus(); | ||
| 183 | for_each_cpu(i, policy->cpus) | 185 | for_each_cpu(i, policy->cpus) |
| 184 | __gov_queue_work(i, dbs_data, delay); | 186 | __gov_queue_work(i, dbs_data, delay); |
| 187 | put_online_cpus(); | ||
| 185 | } | 188 | } |
| 186 | } | 189 | } |
| 187 | EXPORT_SYMBOL_GPL(gov_queue_work); | 190 | EXPORT_SYMBOL_GPL(gov_queue_work); |
diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index d8ce4ecfef18..e88ded2c8d2f 100644 --- a/drivers/dma/dmatest.c +++ b/drivers/dma/dmatest.c | |||
| @@ -716,8 +716,7 @@ static int dmatest_func(void *data) | |||
| 716 | } | 716 | } |
| 717 | dma_async_issue_pending(chan); | 717 | dma_async_issue_pending(chan); |
| 718 | 718 | ||
| 719 | wait_event_freezable_timeout(done_wait, | 719 | wait_event_freezable_timeout(done_wait, done.done, |
| 720 | done.done || kthread_should_stop(), | ||
| 721 | msecs_to_jiffies(params->timeout)); | 720 | msecs_to_jiffies(params->timeout)); |
| 722 | 721 | ||
| 723 | status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); | 722 | status = dma_async_is_tx_complete(chan, cookie, NULL, NULL); |
| @@ -997,7 +996,6 @@ static void stop_threaded_test(struct dmatest_info *info) | |||
| 997 | static int __restart_threaded_test(struct dmatest_info *info, bool run) | 996 | static int __restart_threaded_test(struct dmatest_info *info, bool run) |
| 998 | { | 997 | { |
| 999 | struct dmatest_params *params = &info->params; | 998 | struct dmatest_params *params = &info->params; |
| 1000 | int ret; | ||
| 1001 | 999 | ||
| 1002 | /* Stop any running test first */ | 1000 | /* Stop any running test first */ |
| 1003 | __stop_threaded_test(info); | 1001 | __stop_threaded_test(info); |
| @@ -1012,13 +1010,23 @@ static int __restart_threaded_test(struct dmatest_info *info, bool run) | |||
| 1012 | memcpy(params, &info->dbgfs_params, sizeof(*params)); | 1010 | memcpy(params, &info->dbgfs_params, sizeof(*params)); |
| 1013 | 1011 | ||
| 1014 | /* Run test with new parameters */ | 1012 | /* Run test with new parameters */ |
| 1015 | ret = __run_threaded_test(info); | 1013 | return __run_threaded_test(info); |
| 1016 | if (ret) { | 1014 | } |
| 1017 | __stop_threaded_test(info); | 1015 | |
| 1018 | pr_err("dmatest: Can't run test\n"); | 1016 | static bool __is_threaded_test_run(struct dmatest_info *info) |
| 1017 | { | ||
| 1018 | struct dmatest_chan *dtc; | ||
| 1019 | |||
| 1020 | list_for_each_entry(dtc, &info->channels, node) { | ||
| 1021 | struct dmatest_thread *thread; | ||
| 1022 | |||
| 1023 | list_for_each_entry(thread, &dtc->threads, node) { | ||
| 1024 | if (!thread->done) | ||
| 1025 | return true; | ||
| 1026 | } | ||
| 1019 | } | 1027 | } |
| 1020 | 1028 | ||
| 1021 | return ret; | 1029 | return false; |
| 1022 | } | 1030 | } |
| 1023 | 1031 | ||
| 1024 | static ssize_t dtf_write_string(void *to, size_t available, loff_t *ppos, | 1032 | static ssize_t dtf_write_string(void *to, size_t available, loff_t *ppos, |
| @@ -1091,22 +1099,10 @@ static ssize_t dtf_read_run(struct file *file, char __user *user_buf, | |||
| 1091 | { | 1099 | { |
| 1092 | struct dmatest_info *info = file->private_data; | 1100 | struct dmatest_info *info = file->private_data; |
| 1093 | char buf[3]; | 1101 | char buf[3]; |
| 1094 | struct dmatest_chan *dtc; | ||
| 1095 | bool alive = false; | ||
| 1096 | 1102 | ||
| 1097 | mutex_lock(&info->lock); | 1103 | mutex_lock(&info->lock); |
| 1098 | list_for_each_entry(dtc, &info->channels, node) { | ||
| 1099 | struct dmatest_thread *thread; | ||
| 1100 | |||
| 1101 | list_for_each_entry(thread, &dtc->threads, node) { | ||
| 1102 | if (!thread->done) { | ||
| 1103 | alive = true; | ||
| 1104 | break; | ||
| 1105 | } | ||
| 1106 | } | ||
| 1107 | } | ||
| 1108 | 1104 | ||
| 1109 | if (alive) { | 1105 | if (__is_threaded_test_run(info)) { |
| 1110 | buf[0] = 'Y'; | 1106 | buf[0] = 'Y'; |
| 1111 | } else { | 1107 | } else { |
| 1112 | __stop_threaded_test(info); | 1108 | __stop_threaded_test(info); |
| @@ -1132,7 +1128,12 @@ static ssize_t dtf_write_run(struct file *file, const char __user *user_buf, | |||
| 1132 | 1128 | ||
| 1133 | if (strtobool(buf, &bv) == 0) { | 1129 | if (strtobool(buf, &bv) == 0) { |
| 1134 | mutex_lock(&info->lock); | 1130 | mutex_lock(&info->lock); |
| 1135 | ret = __restart_threaded_test(info, bv); | 1131 | |
| 1132 | if (__is_threaded_test_run(info)) | ||
| 1133 | ret = -EBUSY; | ||
| 1134 | else | ||
| 1135 | ret = __restart_threaded_test(info, bv); | ||
| 1136 | |||
| 1136 | mutex_unlock(&info->lock); | 1137 | mutex_unlock(&info->lock); |
| 1137 | } | 1138 | } |
| 1138 | 1139 | ||
diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c index 1734feec47b1..71bf4ec300ea 100644 --- a/drivers/dma/ste_dma40.c +++ b/drivers/dma/ste_dma40.c | |||
| @@ -1566,10 +1566,12 @@ static void dma_tc_handle(struct d40_chan *d40c) | |||
| 1566 | return; | 1566 | return; |
| 1567 | } | 1567 | } |
| 1568 | 1568 | ||
| 1569 | if (d40_queue_start(d40c) == NULL) | 1569 | if (d40_queue_start(d40c) == NULL) { |
| 1570 | d40c->busy = false; | 1570 | d40c->busy = false; |
| 1571 | pm_runtime_mark_last_busy(d40c->base->dev); | 1571 | |
| 1572 | pm_runtime_put_autosuspend(d40c->base->dev); | 1572 | pm_runtime_mark_last_busy(d40c->base->dev); |
| 1573 | pm_runtime_put_autosuspend(d40c->base->dev); | ||
| 1574 | } | ||
| 1573 | 1575 | ||
| 1574 | d40_desc_remove(d40d); | 1576 | d40_desc_remove(d40d); |
| 1575 | d40_desc_done(d40c, d40d); | 1577 | d40_desc_done(d40c, d40d); |
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c index a6a8643a6a77..8bcce7866d36 100644 --- a/drivers/gpu/drm/drm_irq.c +++ b/drivers/gpu/drm/drm_irq.c | |||
| @@ -1054,7 +1054,7 @@ EXPORT_SYMBOL(drm_vblank_off); | |||
| 1054 | */ | 1054 | */ |
| 1055 | void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) | 1055 | void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) |
| 1056 | { | 1056 | { |
| 1057 | /* vblank is not initialized (IRQ not installed ?) */ | 1057 | /* vblank is not initialized (IRQ not installed ?), or has been freed */ |
| 1058 | if (!dev->num_crtcs) | 1058 | if (!dev->num_crtcs) |
| 1059 | return; | 1059 | return; |
| 1060 | /* | 1060 | /* |
| @@ -1076,6 +1076,10 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc) | |||
| 1076 | { | 1076 | { |
| 1077 | unsigned long irqflags; | 1077 | unsigned long irqflags; |
| 1078 | 1078 | ||
| 1079 | /* vblank is not initialized (IRQ not installed ?), or has been freed */ | ||
| 1080 | if (!dev->num_crtcs) | ||
| 1081 | return; | ||
| 1082 | |||
| 1079 | if (dev->vblank_inmodeset[crtc]) { | 1083 | if (dev->vblank_inmodeset[crtc]) { |
| 1080 | spin_lock_irqsave(&dev->vbl_lock, irqflags); | 1084 | spin_lock_irqsave(&dev->vbl_lock, irqflags); |
| 1081 | dev->vblank_disable_allowed = 1; | 1085 | dev->vblank_disable_allowed = 1; |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index a6cf8e843973..970ad17c99ab 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -91,14 +91,11 @@ i915_gem_wait_for_error(struct i915_gpu_error *error) | |||
| 91 | { | 91 | { |
| 92 | int ret; | 92 | int ret; |
| 93 | 93 | ||
| 94 | #define EXIT_COND (!i915_reset_in_progress(error)) | 94 | #define EXIT_COND (!i915_reset_in_progress(error) || \ |
| 95 | i915_terminally_wedged(error)) | ||
| 95 | if (EXIT_COND) | 96 | if (EXIT_COND) |
| 96 | return 0; | 97 | return 0; |
| 97 | 98 | ||
| 98 | /* GPU is already declared terminally dead, give up. */ | ||
| 99 | if (i915_terminally_wedged(error)) | ||
| 100 | return -EIO; | ||
| 101 | |||
| 102 | /* | 99 | /* |
| 103 | * Only wait 10 seconds for the gpu reset to complete to avoid hanging | 100 | * Only wait 10 seconds for the gpu reset to complete to avoid hanging |
| 104 | * userspace. If it takes that long something really bad is going on and | 101 | * userspace. If it takes that long something really bad is going on and |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index ad1117bebd7e..56746dcac40f 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -7937,6 +7937,11 @@ intel_modeset_check_state(struct drm_device *dev) | |||
| 7937 | memset(&pipe_config, 0, sizeof(pipe_config)); | 7937 | memset(&pipe_config, 0, sizeof(pipe_config)); |
| 7938 | active = dev_priv->display.get_pipe_config(crtc, | 7938 | active = dev_priv->display.get_pipe_config(crtc, |
| 7939 | &pipe_config); | 7939 | &pipe_config); |
| 7940 | |||
| 7941 | /* hw state is inconsistent with the pipe A quirk */ | ||
| 7942 | if (crtc->pipe == PIPE_A && dev_priv->quirks & QUIRK_PIPEA_FORCE) | ||
| 7943 | active = crtc->active; | ||
| 7944 | |||
| 7940 | WARN(crtc->active != active, | 7945 | WARN(crtc->active != active, |
| 7941 | "crtc active state doesn't match with hw state " | 7946 | "crtc active state doesn't match with hw state " |
| 7942 | "(expected %i, found %i)\n", crtc->active, active); | 7947 | "(expected %i, found %i)\n", crtc->active, active); |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index f36f1baabd5a..29412cc89c7a 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -815,10 +815,10 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
| 815 | }, | 815 | }, |
| 816 | { | 816 | { |
| 817 | .callback = intel_no_lvds_dmi_callback, | 817 | .callback = intel_no_lvds_dmi_callback, |
| 818 | .ident = "Hewlett-Packard HP t5740e Thin Client", | 818 | .ident = "Hewlett-Packard HP t5740", |
| 819 | .matches = { | 819 | .matches = { |
| 820 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | 820 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), |
| 821 | DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"), | 821 | DMI_MATCH(DMI_PRODUCT_NAME, " t5740"), |
| 822 | }, | 822 | }, |
| 823 | }, | 823 | }, |
| 824 | { | 824 | { |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index d15428404b9a..4c47b449b775 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -1776,7 +1776,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) | |||
| 1776 | * Assume that the preferred modes are | 1776 | * Assume that the preferred modes are |
| 1777 | * arranged in priority order. | 1777 | * arranged in priority order. |
| 1778 | */ | 1778 | */ |
| 1779 | intel_ddc_get_modes(connector, intel_sdvo->i2c); | 1779 | intel_ddc_get_modes(connector, &intel_sdvo->ddc); |
| 1780 | if (list_empty(&connector->probed_modes) == false) | 1780 | if (list_empty(&connector->probed_modes) == false) |
| 1781 | goto end; | 1781 | goto end; |
| 1782 | 1782 | ||
diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c index 77b8a45fb10a..ee66badc8bb6 100644 --- a/drivers/gpu/drm/mgag200/mgag200_mode.c +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c | |||
| @@ -1034,13 +1034,14 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc, | |||
| 1034 | else | 1034 | else |
| 1035 | hi_pri_lvl = 5; | 1035 | hi_pri_lvl = 5; |
| 1036 | 1036 | ||
| 1037 | WREG8(0x1fde, 0x06); | 1037 | WREG8(MGAREG_CRTCEXT_INDEX, 0x06); |
| 1038 | WREG8(0x1fdf, hi_pri_lvl); | 1038 | WREG8(MGAREG_CRTCEXT_DATA, hi_pri_lvl); |
| 1039 | } else { | 1039 | } else { |
| 1040 | WREG8(MGAREG_CRTCEXT_INDEX, 0x06); | ||
| 1040 | if (mdev->reg_1e24 >= 0x01) | 1041 | if (mdev->reg_1e24 >= 0x01) |
| 1041 | WREG8(0x1fdf, 0x03); | 1042 | WREG8(MGAREG_CRTCEXT_DATA, 0x03); |
| 1042 | else | 1043 | else |
| 1043 | WREG8(0x1fdf, 0x04); | 1044 | WREG8(MGAREG_CRTCEXT_DATA, 0x04); |
| 1044 | } | 1045 | } |
| 1045 | } | 1046 | } |
| 1046 | return 0; | 1047 | return 0; |
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c b/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c index d0817d94454c..f02fd9f443ff 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/dacnv50.c | |||
| @@ -50,11 +50,16 @@ nv50_dac_sense(struct nv50_disp_priv *priv, int or, u32 loadval) | |||
| 50 | { | 50 | { |
| 51 | const u32 doff = (or * 0x800); | 51 | const u32 doff = (or * 0x800); |
| 52 | int load = -EINVAL; | 52 | int load = -EINVAL; |
| 53 | nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80150000); | ||
| 54 | nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000); | ||
| 53 | nv_wr32(priv, 0x61a00c + doff, 0x00100000 | loadval); | 55 | nv_wr32(priv, 0x61a00c + doff, 0x00100000 | loadval); |
| 54 | udelay(9500); | 56 | mdelay(9); |
| 57 | udelay(500); | ||
| 55 | nv_wr32(priv, 0x61a00c + doff, 0x80000000); | 58 | nv_wr32(priv, 0x61a00c + doff, 0x80000000); |
| 56 | load = (nv_rd32(priv, 0x61a00c + doff) & 0x38000000) >> 27; | 59 | load = (nv_rd32(priv, 0x61a00c + doff) & 0x38000000) >> 27; |
| 57 | nv_wr32(priv, 0x61a00c + doff, 0x00000000); | 60 | nv_wr32(priv, 0x61a00c + doff, 0x00000000); |
| 61 | nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80550000); | ||
| 62 | nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000); | ||
| 58 | return load; | 63 | return load; |
| 59 | } | 64 | } |
| 60 | 65 | ||
diff --git a/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c b/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c index 0d36bdc51417..7fdade6e604d 100644 --- a/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c +++ b/drivers/gpu/drm/nouveau/core/engine/disp/hdminv84.c | |||
| @@ -55,6 +55,10 @@ nv84_hdmi_ctrl(struct nv50_disp_priv *priv, int head, int or, u32 data) | |||
| 55 | nv_wr32(priv, 0x616510 + hoff, 0x00000000); | 55 | nv_wr32(priv, 0x616510 + hoff, 0x00000000); |
| 56 | nv_mask(priv, 0x616500 + hoff, 0x00000001, 0x00000001); | 56 | nv_mask(priv, 0x616500 + hoff, 0x00000001, 0x00000001); |
| 57 | 57 | ||
| 58 | nv_mask(priv, 0x6165d0 + hoff, 0x00070001, 0x00010001); /* SPARE, HW_CTS */ | ||
| 59 | nv_mask(priv, 0x616568 + hoff, 0x00010101, 0x00000000); /* ACR_CTRL, ?? */ | ||
| 60 | nv_mask(priv, 0x616578 + hoff, 0x80000000, 0x80000000); /* ACR_0441_ENABLE */ | ||
| 61 | |||
| 58 | /* ??? */ | 62 | /* ??? */ |
| 59 | nv_mask(priv, 0x61733c, 0x00100000, 0x00100000); /* RESETF */ | 63 | nv_mask(priv, 0x61733c, 0x00100000, 0x00100000); /* RESETF */ |
| 60 | nv_mask(priv, 0x61733c, 0x10000000, 0x10000000); /* LOOKUP_EN */ | 64 | nv_mask(priv, 0x61733c, 0x10000000, 0x10000000); /* LOOKUP_EN */ |
diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c index 89bf459d584b..e9b8217d0075 100644 --- a/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c +++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nv50.c | |||
| @@ -40,14 +40,13 @@ | |||
| 40 | * FIFO channel objects | 40 | * FIFO channel objects |
| 41 | ******************************************************************************/ | 41 | ******************************************************************************/ |
| 42 | 42 | ||
| 43 | void | 43 | static void |
| 44 | nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) | 44 | nv50_fifo_playlist_update_locked(struct nv50_fifo_priv *priv) |
| 45 | { | 45 | { |
| 46 | struct nouveau_bar *bar = nouveau_bar(priv); | 46 | struct nouveau_bar *bar = nouveau_bar(priv); |
| 47 | struct nouveau_gpuobj *cur; | 47 | struct nouveau_gpuobj *cur; |
| 48 | int i, p; | 48 | int i, p; |
| 49 | 49 | ||
| 50 | mutex_lock(&nv_subdev(priv)->mutex); | ||
| 51 | cur = priv->playlist[priv->cur_playlist]; | 50 | cur = priv->playlist[priv->cur_playlist]; |
| 52 | priv->cur_playlist = !priv->cur_playlist; | 51 | priv->cur_playlist = !priv->cur_playlist; |
| 53 | 52 | ||
| @@ -61,6 +60,13 @@ nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) | |||
| 61 | nv_wr32(priv, 0x0032f4, cur->addr >> 12); | 60 | nv_wr32(priv, 0x0032f4, cur->addr >> 12); |
| 62 | nv_wr32(priv, 0x0032ec, p); | 61 | nv_wr32(priv, 0x0032ec, p); |
| 63 | nv_wr32(priv, 0x002500, 0x00000101); | 62 | nv_wr32(priv, 0x002500, 0x00000101); |
| 63 | } | ||
| 64 | |||
| 65 | void | ||
| 66 | nv50_fifo_playlist_update(struct nv50_fifo_priv *priv) | ||
| 67 | { | ||
| 68 | mutex_lock(&nv_subdev(priv)->mutex); | ||
| 69 | nv50_fifo_playlist_update_locked(priv); | ||
| 64 | mutex_unlock(&nv_subdev(priv)->mutex); | 70 | mutex_unlock(&nv_subdev(priv)->mutex); |
| 65 | } | 71 | } |
| 66 | 72 | ||
| @@ -489,7 +495,7 @@ nv50_fifo_init(struct nouveau_object *object) | |||
| 489 | 495 | ||
| 490 | for (i = 0; i < 128; i++) | 496 | for (i = 0; i < 128; i++) |
| 491 | nv_wr32(priv, 0x002600 + (i * 4), 0x00000000); | 497 | nv_wr32(priv, 0x002600 + (i * 4), 0x00000000); |
| 492 | nv50_fifo_playlist_update(priv); | 498 | nv50_fifo_playlist_update_locked(priv); |
| 493 | 499 | ||
| 494 | nv_wr32(priv, 0x003200, 0x00000001); | 500 | nv_wr32(priv, 0x003200, 0x00000001); |
| 495 | nv_wr32(priv, 0x003250, 0x00000001); | 501 | nv_wr32(priv, 0x003250, 0x00000001); |
diff --git a/drivers/gpu/drm/nouveau/core/include/core/class.h b/drivers/gpu/drm/nouveau/core/include/core/class.h index 0a393f7f055f..5a5961b6a6a3 100644 --- a/drivers/gpu/drm/nouveau/core/include/core/class.h +++ b/drivers/gpu/drm/nouveau/core/include/core/class.h | |||
| @@ -218,7 +218,7 @@ struct nv04_display_class { | |||
| 218 | #define NV50_DISP_DAC_PWR_STATE 0x00000040 | 218 | #define NV50_DISP_DAC_PWR_STATE 0x00000040 |
| 219 | #define NV50_DISP_DAC_PWR_STATE_ON 0x00000000 | 219 | #define NV50_DISP_DAC_PWR_STATE_ON 0x00000000 |
| 220 | #define NV50_DISP_DAC_PWR_STATE_OFF 0x00000040 | 220 | #define NV50_DISP_DAC_PWR_STATE_OFF 0x00000040 |
| 221 | #define NV50_DISP_DAC_LOAD 0x0002000c | 221 | #define NV50_DISP_DAC_LOAD 0x00020100 |
| 222 | #define NV50_DISP_DAC_LOAD_VALUE 0x00000007 | 222 | #define NV50_DISP_DAC_LOAD_VALUE 0x00000007 |
| 223 | 223 | ||
| 224 | #define NV50_DISP_PIOR_MTHD 0x00030000 | 224 | #define NV50_DISP_PIOR_MTHD 0x00030000 |
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index ebf0a683305e..dd5e01f89f28 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
| @@ -1554,7 +1554,9 @@ nv50_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector) | |||
| 1554 | { | 1554 | { |
| 1555 | struct nv50_disp *disp = nv50_disp(encoder->dev); | 1555 | struct nv50_disp *disp = nv50_disp(encoder->dev); |
| 1556 | int ret, or = nouveau_encoder(encoder)->or; | 1556 | int ret, or = nouveau_encoder(encoder)->or; |
| 1557 | u32 load = 0; | 1557 | u32 load = nouveau_drm(encoder->dev)->vbios.dactestval; |
| 1558 | if (load == 0) | ||
| 1559 | load = 340; | ||
| 1558 | 1560 | ||
| 1559 | ret = nv_exec(disp->core, NV50_DISP_DAC_LOAD + or, &load, sizeof(load)); | 1561 | ret = nv_exec(disp->core, NV50_DISP_DAC_LOAD + or, &load, sizeof(load)); |
| 1560 | if (ret || load != 7) | 1562 | if (ret || load != 7) |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index 44a7da66e081..8406c8251fbf 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
| @@ -667,6 +667,8 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | |||
| 667 | int | 667 | int |
| 668 | atombios_get_encoder_mode(struct drm_encoder *encoder) | 668 | atombios_get_encoder_mode(struct drm_encoder *encoder) |
| 669 | { | 669 | { |
| 670 | struct drm_device *dev = encoder->dev; | ||
| 671 | struct radeon_device *rdev = dev->dev_private; | ||
| 670 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 672 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 671 | struct drm_connector *connector; | 673 | struct drm_connector *connector; |
| 672 | struct radeon_connector *radeon_connector; | 674 | struct radeon_connector *radeon_connector; |
| @@ -693,7 +695,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 693 | case DRM_MODE_CONNECTOR_DVII: | 695 | case DRM_MODE_CONNECTOR_DVII: |
| 694 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ | 696 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ |
| 695 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && | 697 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
| 696 | radeon_audio) | 698 | radeon_audio && |
| 699 | !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||
| 697 | return ATOM_ENCODER_MODE_HDMI; | 700 | return ATOM_ENCODER_MODE_HDMI; |
| 698 | else if (radeon_connector->use_digital) | 701 | else if (radeon_connector->use_digital) |
| 699 | return ATOM_ENCODER_MODE_DVI; | 702 | return ATOM_ENCODER_MODE_DVI; |
| @@ -704,7 +707,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 704 | case DRM_MODE_CONNECTOR_HDMIA: | 707 | case DRM_MODE_CONNECTOR_HDMIA: |
| 705 | default: | 708 | default: |
| 706 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && | 709 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
| 707 | radeon_audio) | 710 | radeon_audio && |
| 711 | !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||
| 708 | return ATOM_ENCODER_MODE_HDMI; | 712 | return ATOM_ENCODER_MODE_HDMI; |
| 709 | else | 713 | else |
| 710 | return ATOM_ENCODER_MODE_DVI; | 714 | return ATOM_ENCODER_MODE_DVI; |
| @@ -718,7 +722,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 718 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | 722 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) |
| 719 | return ATOM_ENCODER_MODE_DP; | 723 | return ATOM_ENCODER_MODE_DP; |
| 720 | else if (drm_detect_hdmi_monitor(radeon_connector->edid) && | 724 | else if (drm_detect_hdmi_monitor(radeon_connector->edid) && |
| 721 | radeon_audio) | 725 | radeon_audio && |
| 726 | !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||
| 722 | return ATOM_ENCODER_MODE_HDMI; | 727 | return ATOM_ENCODER_MODE_HDMI; |
| 723 | else | 728 | else |
| 724 | return ATOM_ENCODER_MODE_DVI; | 729 | return ATOM_ENCODER_MODE_DVI; |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 8546e3b333b4..0f89ce3d02b9 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -4754,6 +4754,12 @@ static int evergreen_startup(struct radeon_device *rdev) | |||
| 4754 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; | 4754 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; |
| 4755 | 4755 | ||
| 4756 | /* Enable IRQ */ | 4756 | /* Enable IRQ */ |
| 4757 | if (!rdev->irq.installed) { | ||
| 4758 | r = radeon_irq_kms_init(rdev); | ||
| 4759 | if (r) | ||
| 4760 | return r; | ||
| 4761 | } | ||
| 4762 | |||
| 4757 | r = r600_irq_init(rdev); | 4763 | r = r600_irq_init(rdev); |
| 4758 | if (r) { | 4764 | if (r) { |
| 4759 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 4765 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
| @@ -4923,10 +4929,6 @@ int evergreen_init(struct radeon_device *rdev) | |||
| 4923 | if (r) | 4929 | if (r) |
| 4924 | return r; | 4930 | return r; |
| 4925 | 4931 | ||
| 4926 | r = radeon_irq_kms_init(rdev); | ||
| 4927 | if (r) | ||
| 4928 | return r; | ||
| 4929 | |||
| 4930 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | 4932 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
| 4931 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | 4933 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
| 4932 | 4934 | ||
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 7969c0c8ec20..84583302b081 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
| @@ -2025,6 +2025,12 @@ static int cayman_startup(struct radeon_device *rdev) | |||
| 2025 | } | 2025 | } |
| 2026 | 2026 | ||
| 2027 | /* Enable IRQ */ | 2027 | /* Enable IRQ */ |
| 2028 | if (!rdev->irq.installed) { | ||
| 2029 | r = radeon_irq_kms_init(rdev); | ||
| 2030 | if (r) | ||
| 2031 | return r; | ||
| 2032 | } | ||
| 2033 | |||
| 2028 | r = r600_irq_init(rdev); | 2034 | r = r600_irq_init(rdev); |
| 2029 | if (r) { | 2035 | if (r) { |
| 2030 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 2036 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
| @@ -2190,10 +2196,6 @@ int cayman_init(struct radeon_device *rdev) | |||
| 2190 | if (r) | 2196 | if (r) |
| 2191 | return r; | 2197 | return r; |
| 2192 | 2198 | ||
| 2193 | r = radeon_irq_kms_init(rdev); | ||
| 2194 | if (r) | ||
| 2195 | return r; | ||
| 2196 | |||
| 2197 | ring->ring_obj = NULL; | 2199 | ring->ring_obj = NULL; |
| 2198 | r600_ring_init(rdev, ring, 1024 * 1024); | 2200 | r600_ring_init(rdev, ring, 1024 * 1024); |
| 2199 | 2201 | ||
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 4973bff37fec..d0314ecbd7c1 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -3869,6 +3869,12 @@ static int r100_startup(struct radeon_device *rdev) | |||
| 3869 | } | 3869 | } |
| 3870 | 3870 | ||
| 3871 | /* Enable IRQ */ | 3871 | /* Enable IRQ */ |
| 3872 | if (!rdev->irq.installed) { | ||
| 3873 | r = radeon_irq_kms_init(rdev); | ||
| 3874 | if (r) | ||
| 3875 | return r; | ||
| 3876 | } | ||
| 3877 | |||
| 3872 | r100_irq_set(rdev); | 3878 | r100_irq_set(rdev); |
| 3873 | rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 3879 | rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
| 3874 | /* 1M ring buffer */ | 3880 | /* 1M ring buffer */ |
| @@ -4024,9 +4030,6 @@ int r100_init(struct radeon_device *rdev) | |||
| 4024 | r = radeon_fence_driver_init(rdev); | 4030 | r = radeon_fence_driver_init(rdev); |
| 4025 | if (r) | 4031 | if (r) |
| 4026 | return r; | 4032 | return r; |
| 4027 | r = radeon_irq_kms_init(rdev); | ||
| 4028 | if (r) | ||
| 4029 | return r; | ||
| 4030 | /* Memory manager */ | 4033 | /* Memory manager */ |
| 4031 | r = radeon_bo_init(rdev); | 4034 | r = radeon_bo_init(rdev); |
| 4032 | if (r) | 4035 | if (r) |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index c60350e6872d..b9b776f1e582 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -1382,6 +1382,12 @@ static int r300_startup(struct radeon_device *rdev) | |||
| 1382 | } | 1382 | } |
| 1383 | 1383 | ||
| 1384 | /* Enable IRQ */ | 1384 | /* Enable IRQ */ |
| 1385 | if (!rdev->irq.installed) { | ||
| 1386 | r = radeon_irq_kms_init(rdev); | ||
| 1387 | if (r) | ||
| 1388 | return r; | ||
| 1389 | } | ||
| 1390 | |||
| 1385 | r100_irq_set(rdev); | 1391 | r100_irq_set(rdev); |
| 1386 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 1392 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
| 1387 | /* 1M ring buffer */ | 1393 | /* 1M ring buffer */ |
| @@ -1516,9 +1522,6 @@ int r300_init(struct radeon_device *rdev) | |||
| 1516 | r = radeon_fence_driver_init(rdev); | 1522 | r = radeon_fence_driver_init(rdev); |
| 1517 | if (r) | 1523 | if (r) |
| 1518 | return r; | 1524 | return r; |
| 1519 | r = radeon_irq_kms_init(rdev); | ||
| 1520 | if (r) | ||
| 1521 | return r; | ||
| 1522 | /* Memory manager */ | 1525 | /* Memory manager */ |
| 1523 | r = radeon_bo_init(rdev); | 1526 | r = radeon_bo_init(rdev); |
| 1524 | if (r) | 1527 | if (r) |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index 6fce2eb4dd16..4e796ecf9ea4 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
| @@ -265,6 +265,12 @@ static int r420_startup(struct radeon_device *rdev) | |||
| 265 | } | 265 | } |
| 266 | 266 | ||
| 267 | /* Enable IRQ */ | 267 | /* Enable IRQ */ |
| 268 | if (!rdev->irq.installed) { | ||
| 269 | r = radeon_irq_kms_init(rdev); | ||
| 270 | if (r) | ||
| 271 | return r; | ||
| 272 | } | ||
| 273 | |||
| 268 | r100_irq_set(rdev); | 274 | r100_irq_set(rdev); |
| 269 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 275 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
| 270 | /* 1M ring buffer */ | 276 | /* 1M ring buffer */ |
| @@ -411,10 +417,6 @@ int r420_init(struct radeon_device *rdev) | |||
| 411 | if (r) { | 417 | if (r) { |
| 412 | return r; | 418 | return r; |
| 413 | } | 419 | } |
| 414 | r = radeon_irq_kms_init(rdev); | ||
| 415 | if (r) { | ||
| 416 | return r; | ||
| 417 | } | ||
| 418 | /* Memory manager */ | 420 | /* Memory manager */ |
| 419 | r = radeon_bo_init(rdev); | 421 | r = radeon_bo_init(rdev); |
| 420 | if (r) { | 422 | if (r) { |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index f795a4e092cb..e1aece73b370 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
| @@ -194,6 +194,12 @@ static int r520_startup(struct radeon_device *rdev) | |||
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | /* Enable IRQ */ | 196 | /* Enable IRQ */ |
| 197 | if (!rdev->irq.installed) { | ||
| 198 | r = radeon_irq_kms_init(rdev); | ||
| 199 | if (r) | ||
| 200 | return r; | ||
| 201 | } | ||
| 202 | |||
| 197 | rs600_irq_set(rdev); | 203 | rs600_irq_set(rdev); |
| 198 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 204 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
| 199 | /* 1M ring buffer */ | 205 | /* 1M ring buffer */ |
| @@ -297,9 +303,6 @@ int r520_init(struct radeon_device *rdev) | |||
| 297 | r = radeon_fence_driver_init(rdev); | 303 | r = radeon_fence_driver_init(rdev); |
| 298 | if (r) | 304 | if (r) |
| 299 | return r; | 305 | return r; |
| 300 | r = radeon_irq_kms_init(rdev); | ||
| 301 | if (r) | ||
| 302 | return r; | ||
| 303 | /* Memory manager */ | 306 | /* Memory manager */ |
| 304 | r = radeon_bo_init(rdev); | 307 | r = radeon_bo_init(rdev); |
| 305 | if (r) | 308 | if (r) |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index b45e64848677..0e5341695922 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -1046,6 +1046,24 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev) | |||
| 1046 | return -1; | 1046 | return -1; |
| 1047 | } | 1047 | } |
| 1048 | 1048 | ||
| 1049 | uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg) | ||
| 1050 | { | ||
| 1051 | uint32_t r; | ||
| 1052 | |||
| 1053 | WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg)); | ||
| 1054 | r = RREG32(R_0028FC_MC_DATA); | ||
| 1055 | WREG32(R_0028F8_MC_INDEX, ~C_0028F8_MC_IND_ADDR); | ||
| 1056 | return r; | ||
| 1057 | } | ||
| 1058 | |||
| 1059 | void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | ||
| 1060 | { | ||
| 1061 | WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg) | | ||
| 1062 | S_0028F8_MC_IND_WR_EN(1)); | ||
| 1063 | WREG32(R_0028FC_MC_DATA, v); | ||
| 1064 | WREG32(R_0028F8_MC_INDEX, 0x7F); | ||
| 1065 | } | ||
| 1066 | |||
| 1049 | static void r600_mc_program(struct radeon_device *rdev) | 1067 | static void r600_mc_program(struct radeon_device *rdev) |
| 1050 | { | 1068 | { |
| 1051 | struct rv515_mc_save save; | 1069 | struct rv515_mc_save save; |
| @@ -1181,6 +1199,8 @@ static int r600_mc_init(struct radeon_device *rdev) | |||
| 1181 | { | 1199 | { |
| 1182 | u32 tmp; | 1200 | u32 tmp; |
| 1183 | int chansize, numchan; | 1201 | int chansize, numchan; |
| 1202 | uint32_t h_addr, l_addr; | ||
| 1203 | unsigned long long k8_addr; | ||
| 1184 | 1204 | ||
| 1185 | /* Get VRAM informations */ | 1205 | /* Get VRAM informations */ |
| 1186 | rdev->mc.vram_is_ddr = true; | 1206 | rdev->mc.vram_is_ddr = true; |
| @@ -1221,7 +1241,30 @@ static int r600_mc_init(struct radeon_device *rdev) | |||
| 1221 | if (rdev->flags & RADEON_IS_IGP) { | 1241 | if (rdev->flags & RADEON_IS_IGP) { |
| 1222 | rs690_pm_info(rdev); | 1242 | rs690_pm_info(rdev); |
| 1223 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | 1243 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); |
| 1244 | |||
| 1245 | if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { | ||
| 1246 | /* Use K8 direct mapping for fast fb access. */ | ||
| 1247 | rdev->fastfb_working = false; | ||
| 1248 | h_addr = G_000012_K8_ADDR_EXT(RREG32_MC(R_000012_MC_MISC_UMA_CNTL)); | ||
| 1249 | l_addr = RREG32_MC(R_000011_K8_FB_LOCATION); | ||
| 1250 | k8_addr = ((unsigned long long)h_addr) << 32 | l_addr; | ||
| 1251 | #if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) | ||
| 1252 | if (k8_addr + rdev->mc.visible_vram_size < 0x100000000ULL) | ||
| 1253 | #endif | ||
| 1254 | { | ||
| 1255 | /* FastFB shall be used with UMA memory. Here it is simply disabled when sideport | ||
| 1256 | * memory is present. | ||
| 1257 | */ | ||
| 1258 | if (rdev->mc.igp_sideport_enabled == false && radeon_fastfb == 1) { | ||
| 1259 | DRM_INFO("Direct mapping: aper base at 0x%llx, replaced by direct mapping base 0x%llx.\n", | ||
| 1260 | (unsigned long long)rdev->mc.aper_base, k8_addr); | ||
| 1261 | rdev->mc.aper_base = (resource_size_t)k8_addr; | ||
| 1262 | rdev->fastfb_working = true; | ||
| 1263 | } | ||
| 1264 | } | ||
| 1265 | } | ||
| 1224 | } | 1266 | } |
| 1267 | |||
| 1225 | radeon_update_bandwidth_info(rdev); | 1268 | radeon_update_bandwidth_info(rdev); |
| 1226 | return 0; | 1269 | return 0; |
| 1227 | } | 1270 | } |
| @@ -3202,6 +3245,12 @@ static int r600_startup(struct radeon_device *rdev) | |||
| 3202 | } | 3245 | } |
| 3203 | 3246 | ||
| 3204 | /* Enable IRQ */ | 3247 | /* Enable IRQ */ |
| 3248 | if (!rdev->irq.installed) { | ||
| 3249 | r = radeon_irq_kms_init(rdev); | ||
| 3250 | if (r) | ||
| 3251 | return r; | ||
| 3252 | } | ||
| 3253 | |||
| 3205 | r = r600_irq_init(rdev); | 3254 | r = r600_irq_init(rdev); |
| 3206 | if (r) { | 3255 | if (r) { |
| 3207 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 3256 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
| @@ -3356,10 +3405,6 @@ int r600_init(struct radeon_device *rdev) | |||
| 3356 | if (r) | 3405 | if (r) |
| 3357 | return r; | 3406 | return r; |
| 3358 | 3407 | ||
| 3359 | r = radeon_irq_kms_init(rdev); | ||
| 3360 | if (r) | ||
| 3361 | return r; | ||
| 3362 | |||
| 3363 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | 3408 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
| 3364 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | 3409 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
| 3365 | 3410 | ||
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index acb146c06973..79df558f8c40 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
| @@ -1342,6 +1342,14 @@ | |||
| 1342 | #define PACKET3_STRMOUT_BASE_UPDATE 0x72 /* r7xx */ | 1342 | #define PACKET3_STRMOUT_BASE_UPDATE 0x72 /* r7xx */ |
| 1343 | #define PACKET3_SURFACE_BASE_UPDATE 0x73 | 1343 | #define PACKET3_SURFACE_BASE_UPDATE 0x73 |
| 1344 | 1344 | ||
| 1345 | #define R_000011_K8_FB_LOCATION 0x11 | ||
| 1346 | #define R_000012_MC_MISC_UMA_CNTL 0x12 | ||
| 1347 | #define G_000012_K8_ADDR_EXT(x) (((x) >> 0) & 0xFF) | ||
| 1348 | #define R_0028F8_MC_INDEX 0x28F8 | ||
| 1349 | #define S_0028F8_MC_IND_ADDR(x) (((x) & 0x1FF) << 0) | ||
| 1350 | #define C_0028F8_MC_IND_ADDR 0xFFFFFE00 | ||
| 1351 | #define S_0028F8_MC_IND_WR_EN(x) (((x) & 0x1) << 9) | ||
| 1352 | #define R_0028FC_MC_DATA 0x28FC | ||
| 1345 | 1353 | ||
| 1346 | #define R_008020_GRBM_SOFT_RESET 0x8020 | 1354 | #define R_008020_GRBM_SOFT_RESET 0x8020 |
| 1347 | #define S_008020_SOFT_RESET_CP(x) (((x) & 1) << 0) | 1355 | #define S_008020_SOFT_RESET_CP(x) (((x) & 1) << 0) |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 06b8c19ab19e..a2802b47ee95 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -122,6 +122,10 @@ static void radeon_register_accessor_init(struct radeon_device *rdev) | |||
| 122 | rdev->mc_rreg = &rs600_mc_rreg; | 122 | rdev->mc_rreg = &rs600_mc_rreg; |
| 123 | rdev->mc_wreg = &rs600_mc_wreg; | 123 | rdev->mc_wreg = &rs600_mc_wreg; |
| 124 | } | 124 | } |
| 125 | if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { | ||
| 126 | rdev->mc_rreg = &rs780_mc_rreg; | ||
| 127 | rdev->mc_wreg = &rs780_mc_wreg; | ||
| 128 | } | ||
| 125 | if (rdev->family >= CHIP_R600) { | 129 | if (rdev->family >= CHIP_R600) { |
| 126 | rdev->pciep_rreg = &r600_pciep_rreg; | 130 | rdev->pciep_rreg = &r600_pciep_rreg; |
| 127 | rdev->pciep_wreg = &r600_pciep_wreg; | 131 | rdev->pciep_wreg = &r600_pciep_wreg; |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 2c87365d345f..a72759ede753 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -347,6 +347,8 @@ extern bool r600_gui_idle(struct radeon_device *rdev); | |||
| 347 | extern void r600_pm_misc(struct radeon_device *rdev); | 347 | extern void r600_pm_misc(struct radeon_device *rdev); |
| 348 | extern void r600_pm_init_profile(struct radeon_device *rdev); | 348 | extern void r600_pm_init_profile(struct radeon_device *rdev); |
| 349 | extern void rs780_pm_init_profile(struct radeon_device *rdev); | 349 | extern void rs780_pm_init_profile(struct radeon_device *rdev); |
| 350 | extern uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg); | ||
| 351 | extern void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | ||
| 350 | extern void r600_pm_get_dynpm_state(struct radeon_device *rdev); | 352 | extern void r600_pm_get_dynpm_state(struct radeon_device *rdev); |
| 351 | extern void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes); | 353 | extern void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes); |
| 352 | extern int r600_get_pcie_lanes(struct radeon_device *rdev); | 354 | extern int r600_get_pcie_lanes(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 73051ce3121e..233a9b9fa1f7 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
| @@ -417,6 +417,12 @@ static int rs400_startup(struct radeon_device *rdev) | |||
| 417 | } | 417 | } |
| 418 | 418 | ||
| 419 | /* Enable IRQ */ | 419 | /* Enable IRQ */ |
| 420 | if (!rdev->irq.installed) { | ||
| 421 | r = radeon_irq_kms_init(rdev); | ||
| 422 | if (r) | ||
| 423 | return r; | ||
| 424 | } | ||
| 425 | |||
| 420 | r100_irq_set(rdev); | 426 | r100_irq_set(rdev); |
| 421 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 427 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
| 422 | /* 1M ring buffer */ | 428 | /* 1M ring buffer */ |
| @@ -535,9 +541,6 @@ int rs400_init(struct radeon_device *rdev) | |||
| 535 | r = radeon_fence_driver_init(rdev); | 541 | r = radeon_fence_driver_init(rdev); |
| 536 | if (r) | 542 | if (r) |
| 537 | return r; | 543 | return r; |
| 538 | r = radeon_irq_kms_init(rdev); | ||
| 539 | if (r) | ||
| 540 | return r; | ||
| 541 | /* Memory manager */ | 544 | /* Memory manager */ |
| 542 | r = radeon_bo_init(rdev); | 545 | r = radeon_bo_init(rdev); |
| 543 | if (r) | 546 | if (r) |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 46fa1b07c560..670b555d2ca2 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -923,6 +923,12 @@ static int rs600_startup(struct radeon_device *rdev) | |||
| 923 | } | 923 | } |
| 924 | 924 | ||
| 925 | /* Enable IRQ */ | 925 | /* Enable IRQ */ |
| 926 | if (!rdev->irq.installed) { | ||
| 927 | r = radeon_irq_kms_init(rdev); | ||
| 928 | if (r) | ||
| 929 | return r; | ||
| 930 | } | ||
| 931 | |||
| 926 | rs600_irq_set(rdev); | 932 | rs600_irq_set(rdev); |
| 927 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 933 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
| 928 | /* 1M ring buffer */ | 934 | /* 1M ring buffer */ |
| @@ -1047,9 +1053,6 @@ int rs600_init(struct radeon_device *rdev) | |||
| 1047 | r = radeon_fence_driver_init(rdev); | 1053 | r = radeon_fence_driver_init(rdev); |
| 1048 | if (r) | 1054 | if (r) |
| 1049 | return r; | 1055 | return r; |
| 1050 | r = radeon_irq_kms_init(rdev); | ||
| 1051 | if (r) | ||
| 1052 | return r; | ||
| 1053 | /* Memory manager */ | 1056 | /* Memory manager */ |
| 1054 | r = radeon_bo_init(rdev); | 1057 | r = radeon_bo_init(rdev); |
| 1055 | if (r) | 1058 | if (r) |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index ab4c86cfd552..55880d5962c3 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -651,6 +651,12 @@ static int rs690_startup(struct radeon_device *rdev) | |||
| 651 | } | 651 | } |
| 652 | 652 | ||
| 653 | /* Enable IRQ */ | 653 | /* Enable IRQ */ |
| 654 | if (!rdev->irq.installed) { | ||
| 655 | r = radeon_irq_kms_init(rdev); | ||
| 656 | if (r) | ||
| 657 | return r; | ||
| 658 | } | ||
| 659 | |||
| 654 | rs600_irq_set(rdev); | 660 | rs600_irq_set(rdev); |
| 655 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 661 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
| 656 | /* 1M ring buffer */ | 662 | /* 1M ring buffer */ |
| @@ -776,9 +782,6 @@ int rs690_init(struct radeon_device *rdev) | |||
| 776 | r = radeon_fence_driver_init(rdev); | 782 | r = radeon_fence_driver_init(rdev); |
| 777 | if (r) | 783 | if (r) |
| 778 | return r; | 784 | return r; |
| 779 | r = radeon_irq_kms_init(rdev); | ||
| 780 | if (r) | ||
| 781 | return r; | ||
| 782 | /* Memory manager */ | 785 | /* Memory manager */ |
| 783 | r = radeon_bo_init(rdev); | 786 | r = radeon_bo_init(rdev); |
| 784 | if (r) | 787 | if (r) |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index ffcba730c57c..21c7d7b26e55 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -532,6 +532,12 @@ static int rv515_startup(struct radeon_device *rdev) | |||
| 532 | } | 532 | } |
| 533 | 533 | ||
| 534 | /* Enable IRQ */ | 534 | /* Enable IRQ */ |
| 535 | if (!rdev->irq.installed) { | ||
| 536 | r = radeon_irq_kms_init(rdev); | ||
| 537 | if (r) | ||
| 538 | return r; | ||
| 539 | } | ||
| 540 | |||
| 535 | rs600_irq_set(rdev); | 541 | rs600_irq_set(rdev); |
| 536 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | 542 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); |
| 537 | /* 1M ring buffer */ | 543 | /* 1M ring buffer */ |
| @@ -662,9 +668,6 @@ int rv515_init(struct radeon_device *rdev) | |||
| 662 | r = radeon_fence_driver_init(rdev); | 668 | r = radeon_fence_driver_init(rdev); |
| 663 | if (r) | 669 | if (r) |
| 664 | return r; | 670 | return r; |
| 665 | r = radeon_irq_kms_init(rdev); | ||
| 666 | if (r) | ||
| 667 | return r; | ||
| 668 | /* Memory manager */ | 671 | /* Memory manager */ |
| 669 | r = radeon_bo_init(rdev); | 672 | r = radeon_bo_init(rdev); |
| 670 | if (r) | 673 | if (r) |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 08aef24afe40..4a62ad2e5399 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -1887,6 +1887,12 @@ static int rv770_startup(struct radeon_device *rdev) | |||
| 1887 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; | 1887 | rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0; |
| 1888 | 1888 | ||
| 1889 | /* Enable IRQ */ | 1889 | /* Enable IRQ */ |
| 1890 | if (!rdev->irq.installed) { | ||
| 1891 | r = radeon_irq_kms_init(rdev); | ||
| 1892 | if (r) | ||
| 1893 | return r; | ||
| 1894 | } | ||
| 1895 | |||
| 1890 | r = r600_irq_init(rdev); | 1896 | r = r600_irq_init(rdev); |
| 1891 | if (r) { | 1897 | if (r) { |
| 1892 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 1898 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
| @@ -2045,10 +2051,6 @@ int rv770_init(struct radeon_device *rdev) | |||
| 2045 | if (r) | 2051 | if (r) |
| 2046 | return r; | 2052 | return r; |
| 2047 | 2053 | ||
| 2048 | r = radeon_irq_kms_init(rdev); | ||
| 2049 | if (r) | ||
| 2050 | return r; | ||
| 2051 | |||
| 2052 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | 2054 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
| 2053 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | 2055 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
| 2054 | 2056 | ||
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index d1ba9d88f311..a1b0da6b5808 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
| @@ -5350,6 +5350,12 @@ static int si_startup(struct radeon_device *rdev) | |||
| 5350 | } | 5350 | } |
| 5351 | 5351 | ||
| 5352 | /* Enable IRQ */ | 5352 | /* Enable IRQ */ |
| 5353 | if (!rdev->irq.installed) { | ||
| 5354 | r = radeon_irq_kms_init(rdev); | ||
| 5355 | if (r) | ||
| 5356 | return r; | ||
| 5357 | } | ||
| 5358 | |||
| 5353 | r = si_irq_init(rdev); | 5359 | r = si_irq_init(rdev); |
| 5354 | if (r) { | 5360 | if (r) { |
| 5355 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 5361 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
| @@ -5533,10 +5539,6 @@ int si_init(struct radeon_device *rdev) | |||
| 5533 | if (r) | 5539 | if (r) |
| 5534 | return r; | 5540 | return r; |
| 5535 | 5541 | ||
| 5536 | r = radeon_irq_kms_init(rdev); | ||
| 5537 | if (r) | ||
| 5538 | return r; | ||
| 5539 | |||
| 5540 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; | 5542 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; |
| 5541 | ring->ring_obj = NULL; | 5543 | ring->ring_obj = NULL; |
| 5542 | r600_ring_init(rdev, ring, 1024 * 1024); | 5544 | r600_ring_init(rdev, ring, 1024 * 1024); |
diff --git a/drivers/gpu/drm/tilcdc/Kconfig b/drivers/gpu/drm/tilcdc/Kconfig index e461e9972455..7a4d10106906 100644 --- a/drivers/gpu/drm/tilcdc/Kconfig +++ b/drivers/gpu/drm/tilcdc/Kconfig | |||
| @@ -6,6 +6,7 @@ config DRM_TILCDC | |||
| 6 | select DRM_GEM_CMA_HELPER | 6 | select DRM_GEM_CMA_HELPER |
| 7 | select VIDEOMODE_HELPERS | 7 | select VIDEOMODE_HELPERS |
| 8 | select BACKLIGHT_CLASS_DEVICE | 8 | select BACKLIGHT_CLASS_DEVICE |
| 9 | select BACKLIGHT_LCD_SUPPORT | ||
| 9 | help | 10 | help |
| 10 | Choose this option if you have an TI SoC with LCDC display | 11 | Choose this option if you have an TI SoC with LCDC display |
| 11 | controller, for example AM33xx in beagle-bone, DA8xx, or | 12 | controller, for example AM33xx in beagle-bone, DA8xx, or |
diff --git a/drivers/iio/buffer_cb.c b/drivers/iio/buffer_cb.c index 9201022945e9..9d19ba74f22b 100644 --- a/drivers/iio/buffer_cb.c +++ b/drivers/iio/buffer_cb.c | |||
| @@ -64,7 +64,7 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev, | |||
| 64 | while (chan->indio_dev) { | 64 | while (chan->indio_dev) { |
| 65 | if (chan->indio_dev != indio_dev) { | 65 | if (chan->indio_dev != indio_dev) { |
| 66 | ret = -EINVAL; | 66 | ret = -EINVAL; |
| 67 | goto error_release_channels; | 67 | goto error_free_scan_mask; |
| 68 | } | 68 | } |
| 69 | set_bit(chan->channel->scan_index, | 69 | set_bit(chan->channel->scan_index, |
| 70 | cb_buff->buffer.scan_mask); | 70 | cb_buff->buffer.scan_mask); |
| @@ -73,6 +73,8 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev, | |||
| 73 | 73 | ||
| 74 | return cb_buff; | 74 | return cb_buff; |
| 75 | 75 | ||
| 76 | error_free_scan_mask: | ||
| 77 | kfree(cb_buff->buffer.scan_mask); | ||
| 76 | error_release_channels: | 78 | error_release_channels: |
| 77 | iio_channel_release_all(cb_buff->channels); | 79 | iio_channel_release_all(cb_buff->channels); |
| 78 | error_free_cb_buff: | 80 | error_free_cb_buff: |
| @@ -100,6 +102,7 @@ EXPORT_SYMBOL_GPL(iio_channel_stop_all_cb); | |||
| 100 | 102 | ||
| 101 | void iio_channel_release_all_cb(struct iio_cb_buffer *cb_buff) | 103 | void iio_channel_release_all_cb(struct iio_cb_buffer *cb_buff) |
| 102 | { | 104 | { |
| 105 | kfree(cb_buff->buffer.scan_mask); | ||
| 103 | iio_channel_release_all(cb_buff->channels); | 106 | iio_channel_release_all(cb_buff->channels); |
| 104 | kfree(cb_buff); | 107 | kfree(cb_buff); |
| 105 | } | 108 | } |
diff --git a/drivers/iio/frequency/adf4350.c b/drivers/iio/frequency/adf4350.c index a884252ac66b..e76d4ace53ff 100644 --- a/drivers/iio/frequency/adf4350.c +++ b/drivers/iio/frequency/adf4350.c | |||
| @@ -212,7 +212,7 @@ static int adf4350_set_freq(struct adf4350_state *st, unsigned long long freq) | |||
| 212 | (pdata->r2_user_settings & (ADF4350_REG2_PD_POLARITY_POS | | 212 | (pdata->r2_user_settings & (ADF4350_REG2_PD_POLARITY_POS | |
| 213 | ADF4350_REG2_LDP_6ns | ADF4350_REG2_LDF_INT_N | | 213 | ADF4350_REG2_LDP_6ns | ADF4350_REG2_LDF_INT_N | |
| 214 | ADF4350_REG2_CHARGE_PUMP_CURR_uA(5000) | | 214 | ADF4350_REG2_CHARGE_PUMP_CURR_uA(5000) | |
| 215 | ADF4350_REG2_MUXOUT(0x7) | ADF4350_REG2_NOISE_MODE(0x9))); | 215 | ADF4350_REG2_MUXOUT(0x7) | ADF4350_REG2_NOISE_MODE(0x3))); |
| 216 | 216 | ||
| 217 | st->regs[ADF4350_REG3] = pdata->r3_user_settings & | 217 | st->regs[ADF4350_REG3] = pdata->r3_user_settings & |
| 218 | (ADF4350_REG3_12BIT_CLKDIV(0xFFF) | | 218 | (ADF4350_REG3_12BIT_CLKDIV(0xFFF) | |
diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c index 795d100b4c36..98ddc323add0 100644 --- a/drivers/iio/inkern.c +++ b/drivers/iio/inkern.c | |||
| @@ -124,7 +124,7 @@ static int __of_iio_channel_get(struct iio_channel *channel, | |||
| 124 | channel->indio_dev = indio_dev; | 124 | channel->indio_dev = indio_dev; |
| 125 | index = iiospec.args_count ? iiospec.args[0] : 0; | 125 | index = iiospec.args_count ? iiospec.args[0] : 0; |
| 126 | if (index >= indio_dev->num_channels) { | 126 | if (index >= indio_dev->num_channels) { |
| 127 | return -EINVAL; | 127 | err = -EINVAL; |
| 128 | goto err_put; | 128 | goto err_put; |
| 129 | } | 129 | } |
| 130 | channel->channel = &indio_dev->channels[index]; | 130 | channel->channel = &indio_dev->channels[index]; |
| @@ -450,7 +450,7 @@ static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan, | |||
| 450 | s64 raw64 = raw; | 450 | s64 raw64 = raw; |
| 451 | int ret; | 451 | int ret; |
| 452 | 452 | ||
| 453 | ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_SCALE); | 453 | ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_OFFSET); |
| 454 | if (ret == 0) | 454 | if (ret == 0) |
| 455 | raw64 += offset; | 455 | raw64 += offset; |
| 456 | 456 | ||
diff --git a/drivers/infiniband/hw/qib/qib_keys.c b/drivers/infiniband/hw/qib/qib_keys.c index 81c7b73695d2..3b9afccaaade 100644 --- a/drivers/infiniband/hw/qib/qib_keys.c +++ b/drivers/infiniband/hw/qib/qib_keys.c | |||
| @@ -61,7 +61,7 @@ int qib_alloc_lkey(struct qib_mregion *mr, int dma_region) | |||
| 61 | if (dma_region) { | 61 | if (dma_region) { |
| 62 | struct qib_mregion *tmr; | 62 | struct qib_mregion *tmr; |
| 63 | 63 | ||
| 64 | tmr = rcu_dereference(dev->dma_mr); | 64 | tmr = rcu_access_pointer(dev->dma_mr); |
| 65 | if (!tmr) { | 65 | if (!tmr) { |
| 66 | qib_get_mr(mr); | 66 | qib_get_mr(mr); |
| 67 | rcu_assign_pointer(dev->dma_mr, mr); | 67 | rcu_assign_pointer(dev->dma_mr, mr); |
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c index f19b0998a53c..2e84ef859c5b 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.c +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | * Copyright (C) 2004 Alex Aizman | 5 | * Copyright (C) 2004 Alex Aizman |
| 6 | * Copyright (C) 2005 Mike Christie | 6 | * Copyright (C) 2005 Mike Christie |
| 7 | * Copyright (c) 2005, 2006 Voltaire, Inc. All rights reserved. | 7 | * Copyright (c) 2005, 2006 Voltaire, Inc. All rights reserved. |
| 8 | * Copyright (c) 2013 Mellanox Technologies. All rights reserved. | ||
| 8 | * maintained by openib-general@openib.org | 9 | * maintained by openib-general@openib.org |
| 9 | * | 10 | * |
| 10 | * This software is available to you under a choice of one of two | 11 | * This software is available to you under a choice of one of two |
diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.h b/drivers/infiniband/ulp/iser/iscsi_iser.h index 06f578cde75b..4f069c0d4c04 100644 --- a/drivers/infiniband/ulp/iser/iscsi_iser.h +++ b/drivers/infiniband/ulp/iser/iscsi_iser.h | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | * | 8 | * |
| 9 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. | 9 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. |
| 10 | * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. | 10 | * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. |
| 11 | * Copyright (c) 2013 Mellanox Technologies. All rights reserved. | ||
| 11 | * | 12 | * |
| 12 | * This software is available to you under a choice of one of two | 13 | * This software is available to you under a choice of one of two |
| 13 | * licenses. You may choose to be licensed under the terms of the GNU | 14 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c index a00ccd1ca333..b6d81a86c976 100644 --- a/drivers/infiniband/ulp/iser/iser_initiator.c +++ b/drivers/infiniband/ulp/iser/iser_initiator.c | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. | 2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. |
| 3 | * Copyright (c) 2013 Mellanox Technologies. All rights reserved. | ||
| 3 | * | 4 | * |
| 4 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
| 5 | * licenses. You may choose to be licensed under the terms of the GNU | 6 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/ulp/iser/iser_memory.c b/drivers/infiniband/ulp/iser/iser_memory.c index 68ebb7fe072a..7827baf455a1 100644 --- a/drivers/infiniband/ulp/iser/iser_memory.c +++ b/drivers/infiniband/ulp/iser/iser_memory.c | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. | 2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. |
| 3 | * Copyright (c) 2013 Mellanox Technologies. All rights reserved. | ||
| 3 | * | 4 | * |
| 4 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
| 5 | * licenses. You may choose to be licensed under the terms of the GNU | 6 | * licenses. You may choose to be licensed under the terms of the GNU |
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index 5278916c3103..2c4941d0656b 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. | 2 | * Copyright (c) 2004, 2005, 2006 Voltaire, Inc. All rights reserved. |
| 3 | * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. | 3 | * Copyright (c) 2005, 2006 Cisco Systems. All rights reserved. |
| 4 | * Copyright (c) 2013 Mellanox Technologies. All rights reserved. | ||
| 4 | * | 5 | * |
| 5 | * This software is available to you under a choice of one of two | 6 | * This software is available to you under a choice of one of two |
| 6 | * licenses. You may choose to be licensed under the terms of the GNU | 7 | * licenses. You may choose to be licensed under the terms of the GNU |
| @@ -292,10 +293,10 @@ out_err: | |||
| 292 | } | 293 | } |
| 293 | 294 | ||
| 294 | /** | 295 | /** |
| 295 | * releases the FMR pool, QP and CMA ID objects, returns 0 on success, | 296 | * releases the FMR pool and QP objects, returns 0 on success, |
| 296 | * -1 on failure | 297 | * -1 on failure |
| 297 | */ | 298 | */ |
| 298 | static int iser_free_ib_conn_res(struct iser_conn *ib_conn, int can_destroy_id) | 299 | static int iser_free_ib_conn_res(struct iser_conn *ib_conn) |
| 299 | { | 300 | { |
| 300 | int cq_index; | 301 | int cq_index; |
| 301 | BUG_ON(ib_conn == NULL); | 302 | BUG_ON(ib_conn == NULL); |
| @@ -314,13 +315,9 @@ static int iser_free_ib_conn_res(struct iser_conn *ib_conn, int can_destroy_id) | |||
| 314 | 315 | ||
| 315 | rdma_destroy_qp(ib_conn->cma_id); | 316 | rdma_destroy_qp(ib_conn->cma_id); |
| 316 | } | 317 | } |
| 317 | /* if cma handler context, the caller acts s.t the cma destroy the id */ | ||
| 318 | if (ib_conn->cma_id != NULL && can_destroy_id) | ||
| 319 | rdma_destroy_id(ib_conn->cma_id); | ||
| 320 | 318 | ||
| 321 | ib_conn->fmr_pool = NULL; | 319 | ib_conn->fmr_pool = NULL; |
| 322 | ib_conn->qp = NULL; | 320 | ib_conn->qp = NULL; |
| 323 | ib_conn->cma_id = NULL; | ||
| 324 | kfree(ib_conn->page_vec); | 321 | kfree(ib_conn->page_vec); |
| 325 | 322 | ||
| 326 | if (ib_conn->login_buf) { | 323 | if (ib_conn->login_buf) { |
| @@ -415,11 +412,16 @@ static void iser_conn_release(struct iser_conn *ib_conn, int can_destroy_id) | |||
| 415 | list_del(&ib_conn->conn_list); | 412 | list_del(&ib_conn->conn_list); |
| 416 | mutex_unlock(&ig.connlist_mutex); | 413 | mutex_unlock(&ig.connlist_mutex); |
| 417 | iser_free_rx_descriptors(ib_conn); | 414 | iser_free_rx_descriptors(ib_conn); |
| 418 | iser_free_ib_conn_res(ib_conn, can_destroy_id); | 415 | iser_free_ib_conn_res(ib_conn); |
| 419 | ib_conn->device = NULL; | 416 | ib_conn->device = NULL; |
| 420 | /* on EVENT_ADDR_ERROR there's no device yet for this conn */ | 417 | /* on EVENT_ADDR_ERROR there's no device yet for this conn */ |
| 421 | if (device != NULL) | 418 | if (device != NULL) |
| 422 | iser_device_try_release(device); | 419 | iser_device_try_release(device); |
| 420 | /* if cma handler context, the caller actually destroy the id */ | ||
| 421 | if (ib_conn->cma_id != NULL && can_destroy_id) { | ||
| 422 | rdma_destroy_id(ib_conn->cma_id); | ||
| 423 | ib_conn->cma_id = NULL; | ||
| 424 | } | ||
| 423 | iscsi_destroy_endpoint(ib_conn->ep); | 425 | iscsi_destroy_endpoint(ib_conn->ep); |
| 424 | } | 426 | } |
| 425 | 427 | ||
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 2f78538e09d0..b2420ae19e14 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
| @@ -1379,6 +1379,7 @@ static int synaptics_reconnect(struct psmouse *psmouse) | |||
| 1379 | { | 1379 | { |
| 1380 | struct synaptics_data *priv = psmouse->private; | 1380 | struct synaptics_data *priv = psmouse->private; |
| 1381 | struct synaptics_data old_priv = *priv; | 1381 | struct synaptics_data old_priv = *priv; |
| 1382 | unsigned char param[2]; | ||
| 1382 | int retry = 0; | 1383 | int retry = 0; |
| 1383 | int error; | 1384 | int error; |
| 1384 | 1385 | ||
| @@ -1394,6 +1395,7 @@ static int synaptics_reconnect(struct psmouse *psmouse) | |||
| 1394 | */ | 1395 | */ |
| 1395 | ssleep(1); | 1396 | ssleep(1); |
| 1396 | } | 1397 | } |
| 1398 | ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_GETID); | ||
| 1397 | error = synaptics_detect(psmouse, 0); | 1399 | error = synaptics_detect(psmouse, 0); |
| 1398 | } while (error && ++retry < 3); | 1400 | } while (error && ++retry < 3); |
| 1399 | 1401 | ||
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 5c68e4486845..518282da6d85 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -1966,7 +1966,8 @@ static const struct wacom_features wacom_features_0xF4 = | |||
| 1966 | 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; | 1966 | 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; |
| 1967 | static const struct wacom_features wacom_features_0xF8 = | 1967 | static const struct wacom_features wacom_features_0xF8 = |
| 1968 | { "Wacom Cintiq 24HD touch", WACOM_PKGLEN_INTUOS, 104480, 65600, 2047, /* Pen */ | 1968 | { "Wacom Cintiq 24HD touch", WACOM_PKGLEN_INTUOS, 104480, 65600, 2047, /* Pen */ |
| 1969 | 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 }; | 1969 | 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, |
| 1970 | .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf6 }; | ||
| 1970 | static const struct wacom_features wacom_features_0xF6 = | 1971 | static const struct wacom_features wacom_features_0xF6 = |
| 1971 | { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */ | 1972 | { "Wacom Cintiq 24HD touch", .type = WACOM_24HDT, /* Touch */ |
| 1972 | .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10 }; | 1973 | .oVid = USB_VENDOR_ID_WACOM, .oPid = 0xf8, .touch_max = 10 }; |
| @@ -2009,7 +2010,8 @@ static const struct wacom_features wacom_features_0xFA = | |||
| 2009 | 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; | 2010 | 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; |
| 2010 | static const struct wacom_features wacom_features_0x5B = | 2011 | static const struct wacom_features wacom_features_0x5B = |
| 2011 | { "Wacom Cintiq 22HDT", WACOM_PKGLEN_INTUOS, 95840, 54260, 2047, | 2012 | { "Wacom Cintiq 22HDT", WACOM_PKGLEN_INTUOS, 95840, 54260, 2047, |
| 2012 | 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e }; | 2013 | 63, WACOM_22HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, |
| 2014 | .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5e }; | ||
| 2013 | static const struct wacom_features wacom_features_0x5E = | 2015 | static const struct wacom_features wacom_features_0x5E = |
| 2014 | { "Wacom Cintiq 22HDT", .type = WACOM_24HDT, | 2016 | { "Wacom Cintiq 22HDT", .type = WACOM_24HDT, |
| 2015 | .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10 }; | 2017 | .oVid = USB_VENDOR_ID_WACOM, .oPid = 0x5b, .touch_max = 10 }; |
| @@ -2042,7 +2044,7 @@ static const struct wacom_features wacom_features_0xE5 = | |||
| 2042 | static const struct wacom_features wacom_features_0xE6 = | 2044 | static const struct wacom_features wacom_features_0xE6 = |
| 2043 | { "Wacom ISDv4 E6", WACOM_PKGLEN_TPC2FG, 27760, 15694, 255, | 2045 | { "Wacom ISDv4 E6", WACOM_PKGLEN_TPC2FG, 27760, 15694, 255, |
| 2044 | 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, | 2046 | 0, TABLETPC2FG, WACOM_INTUOS_RES, WACOM_INTUOS_RES, |
| 2045 | .touch_max = 2 }; | 2047 | .touch_max = 2 }; |
| 2046 | static const struct wacom_features wacom_features_0xEC = | 2048 | static const struct wacom_features wacom_features_0xEC = |
| 2047 | { "Wacom ISDv4 EC", WACOM_PKGLEN_GRAPHIRE, 25710, 14500, 255, | 2049 | { "Wacom ISDv4 EC", WACOM_PKGLEN_GRAPHIRE, 25710, 14500, 255, |
| 2048 | 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; | 2050 | 0, TABLETPC, WACOM_INTUOS_RES, WACOM_INTUOS_RES }; |
diff --git a/drivers/irqchip/irq-mxs.c b/drivers/irqchip/irq-mxs.c index 29889bbdcc6d..63b3d4eb0ef7 100644 --- a/drivers/irqchip/irq-mxs.c +++ b/drivers/irqchip/irq-mxs.c | |||
| @@ -76,16 +76,10 @@ asmlinkage void __exception_irq_entry icoll_handle_irq(struct pt_regs *regs) | |||
| 76 | { | 76 | { |
| 77 | u32 irqnr; | 77 | u32 irqnr; |
| 78 | 78 | ||
| 79 | do { | 79 | irqnr = __raw_readl(icoll_base + HW_ICOLL_STAT_OFFSET); |
| 80 | irqnr = __raw_readl(icoll_base + HW_ICOLL_STAT_OFFSET); | 80 | __raw_writel(irqnr, icoll_base + HW_ICOLL_VECTOR); |
| 81 | if (irqnr != 0x7f) { | 81 | irqnr = irq_find_mapping(icoll_domain, irqnr); |
| 82 | __raw_writel(irqnr, icoll_base + HW_ICOLL_VECTOR); | 82 | handle_IRQ(irqnr, regs); |
| 83 | irqnr = irq_find_mapping(icoll_domain, irqnr); | ||
| 84 | handle_IRQ(irqnr, regs); | ||
| 85 | continue; | ||
| 86 | } | ||
| 87 | break; | ||
| 88 | } while (1); | ||
| 89 | } | 83 | } |
| 90 | 84 | ||
| 91 | static int icoll_irq_domain_map(struct irq_domain *d, unsigned int virq, | 85 | static int icoll_irq_domain_map(struct irq_domain *d, unsigned int virq, |
diff --git a/drivers/irqchip/irq-versatile-fpga.c b/drivers/irqchip/irq-versatile-fpga.c index 065b7a31a478..47a52ab580d8 100644 --- a/drivers/irqchip/irq-versatile-fpga.c +++ b/drivers/irqchip/irq-versatile-fpga.c | |||
| @@ -119,7 +119,7 @@ static int fpga_irqdomain_map(struct irq_domain *d, unsigned int irq, | |||
| 119 | 119 | ||
| 120 | /* Skip invalid IRQs, only register handlers for the real ones */ | 120 | /* Skip invalid IRQs, only register handlers for the real ones */ |
| 121 | if (!(f->valid & BIT(hwirq))) | 121 | if (!(f->valid & BIT(hwirq))) |
| 122 | return -ENOTSUPP; | 122 | return -EPERM; |
| 123 | irq_set_chip_data(irq, f); | 123 | irq_set_chip_data(irq, f); |
| 124 | irq_set_chip_and_handler(irq, &f->chip, | 124 | irq_set_chip_and_handler(irq, &f->chip, |
| 125 | handle_level_irq); | 125 | handle_level_irq); |
diff --git a/drivers/irqchip/irq-vic.c b/drivers/irqchip/irq-vic.c index 884d11c7355f..2bbb00404cf5 100644 --- a/drivers/irqchip/irq-vic.c +++ b/drivers/irqchip/irq-vic.c | |||
| @@ -197,7 +197,7 @@ static int vic_irqdomain_map(struct irq_domain *d, unsigned int irq, | |||
| 197 | 197 | ||
| 198 | /* Skip invalid IRQs, only register handlers for the real ones */ | 198 | /* Skip invalid IRQs, only register handlers for the real ones */ |
| 199 | if (!(v->valid_sources & (1 << hwirq))) | 199 | if (!(v->valid_sources & (1 << hwirq))) |
| 200 | return -ENOTSUPP; | 200 | return -EPERM; |
| 201 | irq_set_chip_and_handler(irq, &vic_chip, handle_level_irq); | 201 | irq_set_chip_and_handler(irq, &vic_chip, handle_level_irq); |
| 202 | irq_set_chip_data(irq, v->base); | 202 | irq_set_chip_data(irq, v->base); |
| 203 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); | 203 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); |
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index e75774f72606..aca59d93d5a9 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
| @@ -2230,10 +2230,15 @@ static void __exit atmci_cleanup_slot(struct atmel_mci_slot *slot, | |||
| 2230 | mmc_free_host(slot->mmc); | 2230 | mmc_free_host(slot->mmc); |
| 2231 | } | 2231 | } |
| 2232 | 2232 | ||
| 2233 | static bool atmci_filter(struct dma_chan *chan, void *slave) | 2233 | static bool atmci_filter(struct dma_chan *chan, void *pdata) |
| 2234 | { | 2234 | { |
| 2235 | struct mci_dma_data *sl = slave; | 2235 | struct mci_platform_data *sl_pdata = pdata; |
| 2236 | struct mci_dma_data *sl; | ||
| 2236 | 2237 | ||
| 2238 | if (!sl_pdata) | ||
| 2239 | return false; | ||
| 2240 | |||
| 2241 | sl = sl_pdata->dma_slave; | ||
| 2237 | if (sl && find_slave_dev(sl) == chan->device->dev) { | 2242 | if (sl && find_slave_dev(sl) == chan->device->dev) { |
| 2238 | chan->private = slave_data_ptr(sl); | 2243 | chan->private = slave_data_ptr(sl); |
| 2239 | return true; | 2244 | return true; |
| @@ -2245,24 +2250,18 @@ static bool atmci_filter(struct dma_chan *chan, void *slave) | |||
| 2245 | static bool atmci_configure_dma(struct atmel_mci *host) | 2250 | static bool atmci_configure_dma(struct atmel_mci *host) |
| 2246 | { | 2251 | { |
| 2247 | struct mci_platform_data *pdata; | 2252 | struct mci_platform_data *pdata; |
| 2253 | dma_cap_mask_t mask; | ||
| 2248 | 2254 | ||
| 2249 | if (host == NULL) | 2255 | if (host == NULL) |
| 2250 | return false; | 2256 | return false; |
| 2251 | 2257 | ||
| 2252 | pdata = host->pdev->dev.platform_data; | 2258 | pdata = host->pdev->dev.platform_data; |
| 2253 | 2259 | ||
| 2254 | if (!pdata) | 2260 | dma_cap_zero(mask); |
| 2255 | return false; | 2261 | dma_cap_set(DMA_SLAVE, mask); |
| 2256 | 2262 | ||
| 2257 | if (pdata->dma_slave && find_slave_dev(pdata->dma_slave)) { | 2263 | host->dma.chan = dma_request_slave_channel_compat(mask, atmci_filter, pdata, |
| 2258 | dma_cap_mask_t mask; | 2264 | &host->pdev->dev, "rxtx"); |
| 2259 | |||
| 2260 | /* Try to grab a DMA channel */ | ||
| 2261 | dma_cap_zero(mask); | ||
| 2262 | dma_cap_set(DMA_SLAVE, mask); | ||
| 2263 | host->dma.chan = | ||
| 2264 | dma_request_channel(mask, atmci_filter, pdata->dma_slave); | ||
| 2265 | } | ||
| 2266 | if (!host->dma.chan) { | 2265 | if (!host->dma.chan) { |
| 2267 | dev_warn(&host->pdev->dev, "no DMA channel available\n"); | 2266 | dev_warn(&host->pdev->dev, "no DMA channel available\n"); |
| 2268 | return false; | 2267 | return false; |
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 6e44025acf01..eccedc7d06a4 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
| @@ -161,6 +161,7 @@ struct omap_hsmmc_host { | |||
| 161 | */ | 161 | */ |
| 162 | struct regulator *vcc; | 162 | struct regulator *vcc; |
| 163 | struct regulator *vcc_aux; | 163 | struct regulator *vcc_aux; |
| 164 | int pbias_disable; | ||
| 164 | void __iomem *base; | 165 | void __iomem *base; |
| 165 | resource_size_t mapbase; | 166 | resource_size_t mapbase; |
| 166 | spinlock_t irq_lock; /* Prevent races with irq handler */ | 167 | spinlock_t irq_lock; /* Prevent races with irq handler */ |
| @@ -255,11 +256,11 @@ static int omap_hsmmc_set_power(struct device *dev, int slot, int power_on, | |||
| 255 | if (!host->vcc) | 256 | if (!host->vcc) |
| 256 | return 0; | 257 | return 0; |
| 257 | /* | 258 | /* |
| 258 | * With DT, never turn OFF the regulator. This is because | 259 | * With DT, never turn OFF the regulator for MMC1. This is because |
| 259 | * the pbias cell programming support is still missing when | 260 | * the pbias cell programming support is still missing when |
| 260 | * booting with Device tree | 261 | * booting with Device tree |
| 261 | */ | 262 | */ |
| 262 | if (dev->of_node && !vdd) | 263 | if (host->pbias_disable && !vdd) |
| 263 | return 0; | 264 | return 0; |
| 264 | 265 | ||
| 265 | if (mmc_slot(host).before_set_reg) | 266 | if (mmc_slot(host).before_set_reg) |
| @@ -1520,10 +1521,10 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 1520 | (ios->vdd == DUAL_VOLT_OCR_BIT) && | 1521 | (ios->vdd == DUAL_VOLT_OCR_BIT) && |
| 1521 | /* | 1522 | /* |
| 1522 | * With pbias cell programming missing, this | 1523 | * With pbias cell programming missing, this |
| 1523 | * can't be allowed when booting with device | 1524 | * can't be allowed on MMC1 when booting with device |
| 1524 | * tree. | 1525 | * tree. |
| 1525 | */ | 1526 | */ |
| 1526 | !host->dev->of_node) { | 1527 | !host->pbias_disable) { |
| 1527 | /* | 1528 | /* |
| 1528 | * The mmc_select_voltage fn of the core does | 1529 | * The mmc_select_voltage fn of the core does |
| 1529 | * not seem to set the power_mode to | 1530 | * not seem to set the power_mode to |
| @@ -1871,6 +1872,10 @@ static int omap_hsmmc_probe(struct platform_device *pdev) | |||
| 1871 | 1872 | ||
| 1872 | omap_hsmmc_context_save(host); | 1873 | omap_hsmmc_context_save(host); |
| 1873 | 1874 | ||
| 1875 | /* This can be removed once we support PBIAS with DT */ | ||
| 1876 | if (host->dev->of_node && host->mapbase == 0x4809c000) | ||
| 1877 | host->pbias_disable = 1; | ||
| 1878 | |||
| 1874 | host->dbclk = clk_get(&pdev->dev, "mmchsdb_fck"); | 1879 | host->dbclk = clk_get(&pdev->dev, "mmchsdb_fck"); |
| 1875 | /* | 1880 | /* |
| 1876 | * MMC can still work without debounce clock. | 1881 | * MMC can still work without debounce clock. |
| @@ -1906,33 +1911,41 @@ static int omap_hsmmc_probe(struct platform_device *pdev) | |||
| 1906 | 1911 | ||
| 1907 | omap_hsmmc_conf_bus_power(host); | 1912 | omap_hsmmc_conf_bus_power(host); |
| 1908 | 1913 | ||
| 1909 | res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx"); | 1914 | if (!pdev->dev.of_node) { |
| 1910 | if (!res) { | 1915 | res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx"); |
| 1911 | dev_err(mmc_dev(host->mmc), "cannot get DMA TX channel\n"); | 1916 | if (!res) { |
| 1912 | ret = -ENXIO; | 1917 | dev_err(mmc_dev(host->mmc), "cannot get DMA TX channel\n"); |
| 1913 | goto err_irq; | 1918 | ret = -ENXIO; |
| 1914 | } | 1919 | goto err_irq; |
| 1915 | tx_req = res->start; | 1920 | } |
| 1921 | tx_req = res->start; | ||
| 1916 | 1922 | ||
| 1917 | res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx"); | 1923 | res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx"); |
| 1918 | if (!res) { | 1924 | if (!res) { |
| 1919 | dev_err(mmc_dev(host->mmc), "cannot get DMA RX channel\n"); | 1925 | dev_err(mmc_dev(host->mmc), "cannot get DMA RX channel\n"); |
| 1920 | ret = -ENXIO; | 1926 | ret = -ENXIO; |
| 1921 | goto err_irq; | 1927 | goto err_irq; |
| 1928 | } | ||
| 1929 | rx_req = res->start; | ||
| 1922 | } | 1930 | } |
| 1923 | rx_req = res->start; | ||
| 1924 | 1931 | ||
| 1925 | dma_cap_zero(mask); | 1932 | dma_cap_zero(mask); |
| 1926 | dma_cap_set(DMA_SLAVE, mask); | 1933 | dma_cap_set(DMA_SLAVE, mask); |
| 1927 | 1934 | ||
| 1928 | host->rx_chan = dma_request_channel(mask, omap_dma_filter_fn, &rx_req); | 1935 | host->rx_chan = |
| 1936 | dma_request_slave_channel_compat(mask, omap_dma_filter_fn, | ||
| 1937 | &rx_req, &pdev->dev, "rx"); | ||
| 1938 | |||
| 1929 | if (!host->rx_chan) { | 1939 | if (!host->rx_chan) { |
| 1930 | dev_err(mmc_dev(host->mmc), "unable to obtain RX DMA engine channel %u\n", rx_req); | 1940 | dev_err(mmc_dev(host->mmc), "unable to obtain RX DMA engine channel %u\n", rx_req); |
| 1931 | ret = -ENXIO; | 1941 | ret = -ENXIO; |
| 1932 | goto err_irq; | 1942 | goto err_irq; |
| 1933 | } | 1943 | } |
| 1934 | 1944 | ||
| 1935 | host->tx_chan = dma_request_channel(mask, omap_dma_filter_fn, &tx_req); | 1945 | host->tx_chan = |
| 1946 | dma_request_slave_channel_compat(mask, omap_dma_filter_fn, | ||
| 1947 | &tx_req, &pdev->dev, "tx"); | ||
| 1948 | |||
| 1936 | if (!host->tx_chan) { | 1949 | if (!host->tx_chan) { |
| 1937 | dev_err(mmc_dev(host->mmc), "unable to obtain TX DMA engine channel %u\n", tx_req); | 1950 | dev_err(mmc_dev(host->mmc), "unable to obtain TX DMA engine channel %u\n", tx_req); |
| 1938 | ret = -ENXIO; | 1951 | ret = -ENXIO; |
diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c index 7bcf74b1a5cd..706d9cb1a49e 100644 --- a/drivers/mmc/host/sdhci-acpi.c +++ b/drivers/mmc/host/sdhci-acpi.c | |||
| @@ -87,6 +87,12 @@ static const struct sdhci_ops sdhci_acpi_ops_dflt = { | |||
| 87 | .enable_dma = sdhci_acpi_enable_dma, | 87 | .enable_dma = sdhci_acpi_enable_dma, |
| 88 | }; | 88 | }; |
| 89 | 89 | ||
| 90 | static const struct sdhci_acpi_slot sdhci_acpi_slot_int_emmc = { | ||
| 91 | .caps = MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE, | ||
| 92 | .caps2 = MMC_CAP2_HC_ERASE_SZ, | ||
| 93 | .flags = SDHCI_ACPI_RUNTIME_PM, | ||
| 94 | }; | ||
| 95 | |||
| 90 | static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sdio = { | 96 | static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sdio = { |
| 91 | .quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON, | 97 | .quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON, |
| 92 | .caps = MMC_CAP_NONREMOVABLE | MMC_CAP_POWER_OFF_CARD, | 98 | .caps = MMC_CAP_NONREMOVABLE | MMC_CAP_POWER_OFF_CARD, |
| @@ -94,23 +100,67 @@ static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sdio = { | |||
| 94 | .pm_caps = MMC_PM_KEEP_POWER, | 100 | .pm_caps = MMC_PM_KEEP_POWER, |
| 95 | }; | 101 | }; |
| 96 | 102 | ||
| 103 | static const struct sdhci_acpi_slot sdhci_acpi_slot_int_sd = { | ||
| 104 | }; | ||
| 105 | |||
| 106 | struct sdhci_acpi_uid_slot { | ||
| 107 | const char *hid; | ||
| 108 | const char *uid; | ||
| 109 | const struct sdhci_acpi_slot *slot; | ||
| 110 | }; | ||
| 111 | |||
| 112 | static const struct sdhci_acpi_uid_slot sdhci_acpi_uids[] = { | ||
| 113 | { "80860F14" , "1" , &sdhci_acpi_slot_int_emmc }, | ||
| 114 | { "80860F14" , "3" , &sdhci_acpi_slot_int_sd }, | ||
| 115 | { "INT33BB" , "2" , &sdhci_acpi_slot_int_sdio }, | ||
| 116 | { "INT33C6" , NULL, &sdhci_acpi_slot_int_sdio }, | ||
| 117 | { "PNP0D40" }, | ||
| 118 | { }, | ||
| 119 | }; | ||
| 120 | |||
| 97 | static const struct acpi_device_id sdhci_acpi_ids[] = { | 121 | static const struct acpi_device_id sdhci_acpi_ids[] = { |
| 98 | { "INT33C6", (kernel_ulong_t)&sdhci_acpi_slot_int_sdio }, | 122 | { "80860F14" }, |
| 99 | { "PNP0D40" }, | 123 | { "INT33BB" }, |
| 124 | { "INT33C6" }, | ||
| 125 | { "PNP0D40" }, | ||
| 100 | { }, | 126 | { }, |
| 101 | }; | 127 | }; |
| 102 | MODULE_DEVICE_TABLE(acpi, sdhci_acpi_ids); | 128 | MODULE_DEVICE_TABLE(acpi, sdhci_acpi_ids); |
| 103 | 129 | ||
| 104 | static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(const char *hid) | 130 | static const struct sdhci_acpi_slot *sdhci_acpi_get_slot_by_ids(const char *hid, |
| 131 | const char *uid) | ||
| 105 | { | 132 | { |
| 106 | const struct acpi_device_id *id; | 133 | const struct sdhci_acpi_uid_slot *u; |
| 107 | 134 | ||
| 108 | for (id = sdhci_acpi_ids; id->id[0]; id++) | 135 | for (u = sdhci_acpi_uids; u->hid; u++) { |
| 109 | if (!strcmp(id->id, hid)) | 136 | if (strcmp(u->hid, hid)) |
| 110 | return (const struct sdhci_acpi_slot *)id->driver_data; | 137 | continue; |
| 138 | if (!u->uid) | ||
| 139 | return u->slot; | ||
| 140 | if (uid && !strcmp(u->uid, uid)) | ||
| 141 | return u->slot; | ||
| 142 | } | ||
| 111 | return NULL; | 143 | return NULL; |
| 112 | } | 144 | } |
| 113 | 145 | ||
| 146 | static const struct sdhci_acpi_slot *sdhci_acpi_get_slot(acpi_handle handle, | ||
| 147 | const char *hid) | ||
| 148 | { | ||
| 149 | const struct sdhci_acpi_slot *slot; | ||
| 150 | struct acpi_device_info *info; | ||
| 151 | const char *uid = NULL; | ||
| 152 | acpi_status status; | ||
| 153 | |||
| 154 | status = acpi_get_object_info(handle, &info); | ||
| 155 | if (!ACPI_FAILURE(status) && (info->valid & ACPI_VALID_UID)) | ||
| 156 | uid = info->unique_id.string; | ||
| 157 | |||
| 158 | slot = sdhci_acpi_get_slot_by_ids(hid, uid); | ||
| 159 | |||
| 160 | kfree(info); | ||
| 161 | return slot; | ||
| 162 | } | ||
| 163 | |||
| 114 | static int sdhci_acpi_probe(struct platform_device *pdev) | 164 | static int sdhci_acpi_probe(struct platform_device *pdev) |
| 115 | { | 165 | { |
| 116 | struct device *dev = &pdev->dev; | 166 | struct device *dev = &pdev->dev; |
| @@ -148,7 +198,7 @@ static int sdhci_acpi_probe(struct platform_device *pdev) | |||
| 148 | 198 | ||
| 149 | c = sdhci_priv(host); | 199 | c = sdhci_priv(host); |
| 150 | c->host = host; | 200 | c->host = host; |
| 151 | c->slot = sdhci_acpi_get_slot(hid); | 201 | c->slot = sdhci_acpi_get_slot(handle, hid); |
| 152 | c->pdev = pdev; | 202 | c->pdev = pdev; |
| 153 | c->use_runtime_pm = sdhci_acpi_flag(c, SDHCI_ACPI_RUNTIME_PM); | 203 | c->use_runtime_pm = sdhci_acpi_flag(c, SDHCI_ACPI_RUNTIME_PM); |
| 154 | 204 | ||
| @@ -202,6 +252,7 @@ static int sdhci_acpi_probe(struct platform_device *pdev) | |||
| 202 | goto err_free; | 252 | goto err_free; |
| 203 | 253 | ||
| 204 | if (c->use_runtime_pm) { | 254 | if (c->use_runtime_pm) { |
| 255 | pm_runtime_set_active(dev); | ||
| 205 | pm_suspend_ignore_children(dev, 1); | 256 | pm_suspend_ignore_children(dev, 1); |
| 206 | pm_runtime_set_autosuspend_delay(dev, 50); | 257 | pm_runtime_set_autosuspend_delay(dev, 50); |
| 207 | pm_runtime_use_autosuspend(dev); | 258 | pm_runtime_use_autosuspend(dev); |
diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c index 67d6dde2ff19..d5f0d59e1310 100644 --- a/drivers/mmc/host/sdhci-esdhc-imx.c +++ b/drivers/mmc/host/sdhci-esdhc-imx.c | |||
| @@ -85,6 +85,12 @@ struct pltfm_imx_data { | |||
| 85 | struct clk *clk_ipg; | 85 | struct clk *clk_ipg; |
| 86 | struct clk *clk_ahb; | 86 | struct clk *clk_ahb; |
| 87 | struct clk *clk_per; | 87 | struct clk *clk_per; |
| 88 | enum { | ||
| 89 | NO_CMD_PENDING, /* no multiblock command pending*/ | ||
| 90 | MULTIBLK_IN_PROCESS, /* exact multiblock cmd in process */ | ||
| 91 | WAIT_FOR_INT, /* sent CMD12, waiting for response INT */ | ||
| 92 | } multiblock_status; | ||
| 93 | |||
| 88 | }; | 94 | }; |
| 89 | 95 | ||
| 90 | static struct platform_device_id imx_esdhc_devtype[] = { | 96 | static struct platform_device_id imx_esdhc_devtype[] = { |
| @@ -154,6 +160,8 @@ static inline void esdhc_clrset_le(struct sdhci_host *host, u32 mask, u32 val, i | |||
| 154 | 160 | ||
| 155 | static u32 esdhc_readl_le(struct sdhci_host *host, int reg) | 161 | static u32 esdhc_readl_le(struct sdhci_host *host, int reg) |
| 156 | { | 162 | { |
| 163 | struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); | ||
| 164 | struct pltfm_imx_data *imx_data = pltfm_host->priv; | ||
| 157 | u32 val = readl(host->ioaddr + reg); | 165 | u32 val = readl(host->ioaddr + reg); |
| 158 | 166 | ||
| 159 | if (unlikely(reg == SDHCI_CAPABILITIES)) { | 167 | if (unlikely(reg == SDHCI_CAPABILITIES)) { |
| @@ -175,6 +183,18 @@ static u32 esdhc_readl_le(struct sdhci_host *host, int reg) | |||
| 175 | val &= ~ESDHC_INT_VENDOR_SPEC_DMA_ERR; | 183 | val &= ~ESDHC_INT_VENDOR_SPEC_DMA_ERR; |
| 176 | val |= SDHCI_INT_ADMA_ERROR; | 184 | val |= SDHCI_INT_ADMA_ERROR; |
| 177 | } | 185 | } |
| 186 | |||
| 187 | /* | ||
| 188 | * mask off the interrupt we get in response to the manually | ||
| 189 | * sent CMD12 | ||
| 190 | */ | ||
| 191 | if ((imx_data->multiblock_status == WAIT_FOR_INT) && | ||
| 192 | ((val & SDHCI_INT_RESPONSE) == SDHCI_INT_RESPONSE)) { | ||
| 193 | val &= ~SDHCI_INT_RESPONSE; | ||
| 194 | writel(SDHCI_INT_RESPONSE, host->ioaddr + | ||
| 195 | SDHCI_INT_STATUS); | ||
| 196 | imx_data->multiblock_status = NO_CMD_PENDING; | ||
| 197 | } | ||
| 178 | } | 198 | } |
| 179 | 199 | ||
| 180 | return val; | 200 | return val; |
| @@ -211,6 +231,15 @@ static void esdhc_writel_le(struct sdhci_host *host, u32 val, int reg) | |||
| 211 | v = readl(host->ioaddr + ESDHC_VENDOR_SPEC); | 231 | v = readl(host->ioaddr + ESDHC_VENDOR_SPEC); |
| 212 | v &= ~ESDHC_VENDOR_SPEC_SDIO_QUIRK; | 232 | v &= ~ESDHC_VENDOR_SPEC_SDIO_QUIRK; |
| 213 | writel(v, host->ioaddr + ESDHC_VENDOR_SPEC); | 233 | writel(v, host->ioaddr + ESDHC_VENDOR_SPEC); |
| 234 | |||
| 235 | if (imx_data->multiblock_status == MULTIBLK_IN_PROCESS) | ||
| 236 | { | ||
| 237 | /* send a manual CMD12 with RESPTYP=none */ | ||
| 238 | data = MMC_STOP_TRANSMISSION << 24 | | ||
| 239 | SDHCI_CMD_ABORTCMD << 16; | ||
| 240 | writel(data, host->ioaddr + SDHCI_TRANSFER_MODE); | ||
| 241 | imx_data->multiblock_status = WAIT_FOR_INT; | ||
| 242 | } | ||
| 214 | } | 243 | } |
| 215 | 244 | ||
| 216 | if (unlikely(reg == SDHCI_INT_ENABLE || reg == SDHCI_SIGNAL_ENABLE)) { | 245 | if (unlikely(reg == SDHCI_INT_ENABLE || reg == SDHCI_SIGNAL_ENABLE)) { |
| @@ -277,11 +306,13 @@ static void esdhc_writew_le(struct sdhci_host *host, u16 val, int reg) | |||
| 277 | } | 306 | } |
| 278 | return; | 307 | return; |
| 279 | case SDHCI_COMMAND: | 308 | case SDHCI_COMMAND: |
| 280 | if ((host->cmd->opcode == MMC_STOP_TRANSMISSION || | 309 | if (host->cmd->opcode == MMC_STOP_TRANSMISSION) |
| 281 | host->cmd->opcode == MMC_SET_BLOCK_COUNT) && | ||
| 282 | (imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT)) | ||
| 283 | val |= SDHCI_CMD_ABORTCMD; | 310 | val |= SDHCI_CMD_ABORTCMD; |
| 284 | 311 | ||
| 312 | if ((host->cmd->opcode == MMC_SET_BLOCK_COUNT) && | ||
| 313 | (imx_data->flags & ESDHC_FLAG_MULTIBLK_NO_INT)) | ||
| 314 | imx_data->multiblock_status = MULTIBLK_IN_PROCESS; | ||
| 315 | |||
| 285 | if (is_imx6q_usdhc(imx_data)) | 316 | if (is_imx6q_usdhc(imx_data)) |
| 286 | writel(val << 16, | 317 | writel(val << 16, |
| 287 | host->ioaddr + SDHCI_TRANSFER_MODE); | 318 | host->ioaddr + SDHCI_TRANSFER_MODE); |
| @@ -324,8 +355,10 @@ static void esdhc_writeb_le(struct sdhci_host *host, u8 val, int reg) | |||
| 324 | /* | 355 | /* |
| 325 | * Do not touch buswidth bits here. This is done in | 356 | * Do not touch buswidth bits here. This is done in |
| 326 | * esdhc_pltfm_bus_width. | 357 | * esdhc_pltfm_bus_width. |
| 358 | * Do not touch the D3CD bit either which is used for the | ||
| 359 | * SDIO interrupt errata workaround. | ||
| 327 | */ | 360 | */ |
| 328 | mask = 0xffff & ~ESDHC_CTRL_BUSWIDTH_MASK; | 361 | mask = 0xffff & ~(ESDHC_CTRL_BUSWIDTH_MASK | ESDHC_CTRL_D3CD); |
| 329 | 362 | ||
| 330 | esdhc_clrset_le(host, mask, new_val, reg); | 363 | esdhc_clrset_le(host, mask, new_val, reg); |
| 331 | return; | 364 | return; |
diff --git a/drivers/mmc/host/sdhci-pci.c b/drivers/mmc/host/sdhci-pci.c index 0012d3fdc999..701d06d0e1fb 100644 --- a/drivers/mmc/host/sdhci-pci.c +++ b/drivers/mmc/host/sdhci-pci.c | |||
| @@ -33,6 +33,9 @@ | |||
| 33 | */ | 33 | */ |
| 34 | #define PCI_DEVICE_ID_INTEL_PCH_SDIO0 0x8809 | 34 | #define PCI_DEVICE_ID_INTEL_PCH_SDIO0 0x8809 |
| 35 | #define PCI_DEVICE_ID_INTEL_PCH_SDIO1 0x880a | 35 | #define PCI_DEVICE_ID_INTEL_PCH_SDIO1 0x880a |
| 36 | #define PCI_DEVICE_ID_INTEL_BYT_EMMC 0x0f14 | ||
| 37 | #define PCI_DEVICE_ID_INTEL_BYT_SDIO 0x0f15 | ||
| 38 | #define PCI_DEVICE_ID_INTEL_BYT_SD 0x0f16 | ||
| 36 | 39 | ||
| 37 | /* | 40 | /* |
| 38 | * PCI registers | 41 | * PCI registers |
| @@ -304,6 +307,33 @@ static const struct sdhci_pci_fixes sdhci_intel_pch_sdio = { | |||
| 304 | .probe_slot = pch_hc_probe_slot, | 307 | .probe_slot = pch_hc_probe_slot, |
| 305 | }; | 308 | }; |
| 306 | 309 | ||
| 310 | static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) | ||
| 311 | { | ||
| 312 | slot->host->mmc->caps |= MMC_CAP_8_BIT_DATA | MMC_CAP_NONREMOVABLE; | ||
| 313 | slot->host->mmc->caps2 |= MMC_CAP2_HC_ERASE_SZ; | ||
| 314 | return 0; | ||
| 315 | } | ||
| 316 | |||
| 317 | static int byt_sdio_probe_slot(struct sdhci_pci_slot *slot) | ||
| 318 | { | ||
| 319 | slot->host->mmc->caps |= MMC_CAP_POWER_OFF_CARD | MMC_CAP_NONREMOVABLE; | ||
| 320 | return 0; | ||
| 321 | } | ||
| 322 | |||
| 323 | static const struct sdhci_pci_fixes sdhci_intel_byt_emmc = { | ||
| 324 | .allow_runtime_pm = true, | ||
| 325 | .probe_slot = byt_emmc_probe_slot, | ||
| 326 | }; | ||
| 327 | |||
| 328 | static const struct sdhci_pci_fixes sdhci_intel_byt_sdio = { | ||
| 329 | .quirks2 = SDHCI_QUIRK2_HOST_OFF_CARD_ON, | ||
| 330 | .allow_runtime_pm = true, | ||
| 331 | .probe_slot = byt_sdio_probe_slot, | ||
| 332 | }; | ||
| 333 | |||
| 334 | static const struct sdhci_pci_fixes sdhci_intel_byt_sd = { | ||
| 335 | }; | ||
| 336 | |||
| 307 | /* O2Micro extra registers */ | 337 | /* O2Micro extra registers */ |
| 308 | #define O2_SD_LOCK_WP 0xD3 | 338 | #define O2_SD_LOCK_WP 0xD3 |
| 309 | #define O2_SD_MULTI_VCC3V 0xEE | 339 | #define O2_SD_MULTI_VCC3V 0xEE |
| @@ -856,6 +886,30 @@ static const struct pci_device_id pci_ids[] = { | |||
| 856 | }, | 886 | }, |
| 857 | 887 | ||
| 858 | { | 888 | { |
| 889 | .vendor = PCI_VENDOR_ID_INTEL, | ||
| 890 | .device = PCI_DEVICE_ID_INTEL_BYT_EMMC, | ||
| 891 | .subvendor = PCI_ANY_ID, | ||
| 892 | .subdevice = PCI_ANY_ID, | ||
| 893 | .driver_data = (kernel_ulong_t)&sdhci_intel_byt_emmc, | ||
| 894 | }, | ||
| 895 | |||
| 896 | { | ||
| 897 | .vendor = PCI_VENDOR_ID_INTEL, | ||
| 898 | .device = PCI_DEVICE_ID_INTEL_BYT_SDIO, | ||
| 899 | .subvendor = PCI_ANY_ID, | ||
| 900 | .subdevice = PCI_ANY_ID, | ||
| 901 | .driver_data = (kernel_ulong_t)&sdhci_intel_byt_sdio, | ||
| 902 | }, | ||
| 903 | |||
| 904 | { | ||
| 905 | .vendor = PCI_VENDOR_ID_INTEL, | ||
| 906 | .device = PCI_DEVICE_ID_INTEL_BYT_SD, | ||
| 907 | .subvendor = PCI_ANY_ID, | ||
| 908 | .subdevice = PCI_ANY_ID, | ||
| 909 | .driver_data = (kernel_ulong_t)&sdhci_intel_byt_sd, | ||
| 910 | }, | ||
| 911 | |||
| 912 | { | ||
| 859 | .vendor = PCI_VENDOR_ID_O2, | 913 | .vendor = PCI_VENDOR_ID_O2, |
| 860 | .device = PCI_DEVICE_ID_O2_8120, | 914 | .device = PCI_DEVICE_ID_O2_8120, |
| 861 | .subvendor = PCI_ANY_ID, | 915 | .subvendor = PCI_ANY_ID, |
diff --git a/drivers/net/can/usb/esd_usb2.c b/drivers/net/can/usb/esd_usb2.c index 9b74d1e3ad44..6aa7b3266c80 100644 --- a/drivers/net/can/usb/esd_usb2.c +++ b/drivers/net/can/usb/esd_usb2.c | |||
| @@ -612,9 +612,15 @@ static int esd_usb2_start(struct esd_usb2_net_priv *priv) | |||
| 612 | { | 612 | { |
| 613 | struct esd_usb2 *dev = priv->usb2; | 613 | struct esd_usb2 *dev = priv->usb2; |
| 614 | struct net_device *netdev = priv->netdev; | 614 | struct net_device *netdev = priv->netdev; |
| 615 | struct esd_usb2_msg msg; | 615 | struct esd_usb2_msg *msg; |
| 616 | int err, i; | 616 | int err, i; |
| 617 | 617 | ||
| 618 | msg = kmalloc(sizeof(*msg), GFP_KERNEL); | ||
| 619 | if (!msg) { | ||
| 620 | err = -ENOMEM; | ||
| 621 | goto out; | ||
| 622 | } | ||
| 623 | |||
| 618 | /* | 624 | /* |
| 619 | * Enable all IDs | 625 | * Enable all IDs |
| 620 | * The IDADD message takes up to 64 32 bit bitmasks (2048 bits). | 626 | * The IDADD message takes up to 64 32 bit bitmasks (2048 bits). |
| @@ -628,33 +634,32 @@ static int esd_usb2_start(struct esd_usb2_net_priv *priv) | |||
| 628 | * the number of the starting bitmask (0..64) to the filter.option | 634 | * the number of the starting bitmask (0..64) to the filter.option |
| 629 | * field followed by only some bitmasks. | 635 | * field followed by only some bitmasks. |
| 630 | */ | 636 | */ |
| 631 | msg.msg.hdr.cmd = CMD_IDADD; | 637 | msg->msg.hdr.cmd = CMD_IDADD; |
| 632 | msg.msg.hdr.len = 2 + ESD_MAX_ID_SEGMENT; | 638 | msg->msg.hdr.len = 2 + ESD_MAX_ID_SEGMENT; |
| 633 | msg.msg.filter.net = priv->index; | 639 | msg->msg.filter.net = priv->index; |
| 634 | msg.msg.filter.option = ESD_ID_ENABLE; /* start with segment 0 */ | 640 | msg->msg.filter.option = ESD_ID_ENABLE; /* start with segment 0 */ |
| 635 | for (i = 0; i < ESD_MAX_ID_SEGMENT; i++) | 641 | for (i = 0; i < ESD_MAX_ID_SEGMENT; i++) |
| 636 | msg.msg.filter.mask[i] = cpu_to_le32(0xffffffff); | 642 | msg->msg.filter.mask[i] = cpu_to_le32(0xffffffff); |
| 637 | /* enable 29bit extended IDs */ | 643 | /* enable 29bit extended IDs */ |
| 638 | msg.msg.filter.mask[ESD_MAX_ID_SEGMENT] = cpu_to_le32(0x00000001); | 644 | msg->msg.filter.mask[ESD_MAX_ID_SEGMENT] = cpu_to_le32(0x00000001); |
| 639 | 645 | ||
| 640 | err = esd_usb2_send_msg(dev, &msg); | 646 | err = esd_usb2_send_msg(dev, msg); |
| 641 | if (err) | 647 | if (err) |
| 642 | goto failed; | 648 | goto out; |
| 643 | 649 | ||
| 644 | err = esd_usb2_setup_rx_urbs(dev); | 650 | err = esd_usb2_setup_rx_urbs(dev); |
| 645 | if (err) | 651 | if (err) |
| 646 | goto failed; | 652 | goto out; |
| 647 | 653 | ||
| 648 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | 654 | priv->can.state = CAN_STATE_ERROR_ACTIVE; |
| 649 | 655 | ||
| 650 | return 0; | 656 | out: |
| 651 | |||
| 652 | failed: | ||
| 653 | if (err == -ENODEV) | 657 | if (err == -ENODEV) |
| 654 | netif_device_detach(netdev); | 658 | netif_device_detach(netdev); |
| 659 | if (err) | ||
| 660 | netdev_err(netdev, "couldn't start device: %d\n", err); | ||
| 655 | 661 | ||
| 656 | netdev_err(netdev, "couldn't start device: %d\n", err); | 662 | kfree(msg); |
| 657 | |||
| 658 | return err; | 663 | return err; |
| 659 | } | 664 | } |
| 660 | 665 | ||
| @@ -833,26 +838,30 @@ nourbmem: | |||
| 833 | static int esd_usb2_close(struct net_device *netdev) | 838 | static int esd_usb2_close(struct net_device *netdev) |
| 834 | { | 839 | { |
| 835 | struct esd_usb2_net_priv *priv = netdev_priv(netdev); | 840 | struct esd_usb2_net_priv *priv = netdev_priv(netdev); |
| 836 | struct esd_usb2_msg msg; | 841 | struct esd_usb2_msg *msg; |
| 837 | int i; | 842 | int i; |
| 838 | 843 | ||
| 844 | msg = kmalloc(sizeof(*msg), GFP_KERNEL); | ||
| 845 | if (!msg) | ||
| 846 | return -ENOMEM; | ||
| 847 | |||
| 839 | /* Disable all IDs (see esd_usb2_start()) */ | 848 | /* Disable all IDs (see esd_usb2_start()) */ |
| 840 | msg.msg.hdr.cmd = CMD_IDADD; | 849 | msg->msg.hdr.cmd = CMD_IDADD; |
| 841 | msg.msg.hdr.len = 2 + ESD_MAX_ID_SEGMENT; | 850 | msg->msg.hdr.len = 2 + ESD_MAX_ID_SEGMENT; |
| 842 | msg.msg.filter.net = priv->index; | 851 | msg->msg.filter.net = priv->index; |
| 843 | msg.msg.filter.option = ESD_ID_ENABLE; /* start with segment 0 */ | 852 | msg->msg.filter.option = ESD_ID_ENABLE; /* start with segment 0 */ |
| 844 | for (i = 0; i <= ESD_MAX_ID_SEGMENT; i++) | 853 | for (i = 0; i <= ESD_MAX_ID_SEGMENT; i++) |
| 845 | msg.msg.filter.mask[i] = 0; | 854 | msg->msg.filter.mask[i] = 0; |
| 846 | if (esd_usb2_send_msg(priv->usb2, &msg) < 0) | 855 | if (esd_usb2_send_msg(priv->usb2, msg) < 0) |
| 847 | netdev_err(netdev, "sending idadd message failed\n"); | 856 | netdev_err(netdev, "sending idadd message failed\n"); |
| 848 | 857 | ||
| 849 | /* set CAN controller to reset mode */ | 858 | /* set CAN controller to reset mode */ |
| 850 | msg.msg.hdr.len = 2; | 859 | msg->msg.hdr.len = 2; |
| 851 | msg.msg.hdr.cmd = CMD_SETBAUD; | 860 | msg->msg.hdr.cmd = CMD_SETBAUD; |
| 852 | msg.msg.setbaud.net = priv->index; | 861 | msg->msg.setbaud.net = priv->index; |
| 853 | msg.msg.setbaud.rsvd = 0; | 862 | msg->msg.setbaud.rsvd = 0; |
| 854 | msg.msg.setbaud.baud = cpu_to_le32(ESD_USB2_NO_BAUDRATE); | 863 | msg->msg.setbaud.baud = cpu_to_le32(ESD_USB2_NO_BAUDRATE); |
| 855 | if (esd_usb2_send_msg(priv->usb2, &msg) < 0) | 864 | if (esd_usb2_send_msg(priv->usb2, msg) < 0) |
| 856 | netdev_err(netdev, "sending setbaud message failed\n"); | 865 | netdev_err(netdev, "sending setbaud message failed\n"); |
| 857 | 866 | ||
| 858 | priv->can.state = CAN_STATE_STOPPED; | 867 | priv->can.state = CAN_STATE_STOPPED; |
| @@ -861,6 +870,8 @@ static int esd_usb2_close(struct net_device *netdev) | |||
| 861 | 870 | ||
| 862 | close_candev(netdev); | 871 | close_candev(netdev); |
| 863 | 872 | ||
| 873 | kfree(msg); | ||
| 874 | |||
| 864 | return 0; | 875 | return 0; |
| 865 | } | 876 | } |
| 866 | 877 | ||
| @@ -886,7 +897,8 @@ static int esd_usb2_set_bittiming(struct net_device *netdev) | |||
| 886 | { | 897 | { |
| 887 | struct esd_usb2_net_priv *priv = netdev_priv(netdev); | 898 | struct esd_usb2_net_priv *priv = netdev_priv(netdev); |
| 888 | struct can_bittiming *bt = &priv->can.bittiming; | 899 | struct can_bittiming *bt = &priv->can.bittiming; |
| 889 | struct esd_usb2_msg msg; | 900 | struct esd_usb2_msg *msg; |
| 901 | int err; | ||
| 890 | u32 canbtr; | 902 | u32 canbtr; |
| 891 | int sjw_shift; | 903 | int sjw_shift; |
| 892 | 904 | ||
| @@ -912,15 +924,22 @@ static int esd_usb2_set_bittiming(struct net_device *netdev) | |||
| 912 | if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) | 924 | if (priv->can.ctrlmode & CAN_CTRLMODE_3_SAMPLES) |
| 913 | canbtr |= ESD_USB2_3_SAMPLES; | 925 | canbtr |= ESD_USB2_3_SAMPLES; |
| 914 | 926 | ||
| 915 | msg.msg.hdr.len = 2; | 927 | msg = kmalloc(sizeof(*msg), GFP_KERNEL); |
| 916 | msg.msg.hdr.cmd = CMD_SETBAUD; | 928 | if (!msg) |
| 917 | msg.msg.setbaud.net = priv->index; | 929 | return -ENOMEM; |
| 918 | msg.msg.setbaud.rsvd = 0; | 930 | |
| 919 | msg.msg.setbaud.baud = cpu_to_le32(canbtr); | 931 | msg->msg.hdr.len = 2; |
| 932 | msg->msg.hdr.cmd = CMD_SETBAUD; | ||
| 933 | msg->msg.setbaud.net = priv->index; | ||
| 934 | msg->msg.setbaud.rsvd = 0; | ||
| 935 | msg->msg.setbaud.baud = cpu_to_le32(canbtr); | ||
| 920 | 936 | ||
| 921 | netdev_info(netdev, "setting BTR=%#x\n", canbtr); | 937 | netdev_info(netdev, "setting BTR=%#x\n", canbtr); |
| 922 | 938 | ||
| 923 | return esd_usb2_send_msg(priv->usb2, &msg); | 939 | err = esd_usb2_send_msg(priv->usb2, msg); |
| 940 | |||
| 941 | kfree(msg); | ||
| 942 | return err; | ||
| 924 | } | 943 | } |
| 925 | 944 | ||
| 926 | static int esd_usb2_get_berr_counter(const struct net_device *netdev, | 945 | static int esd_usb2_get_berr_counter(const struct net_device *netdev, |
| @@ -1022,7 +1041,7 @@ static int esd_usb2_probe(struct usb_interface *intf, | |||
| 1022 | const struct usb_device_id *id) | 1041 | const struct usb_device_id *id) |
| 1023 | { | 1042 | { |
| 1024 | struct esd_usb2 *dev; | 1043 | struct esd_usb2 *dev; |
| 1025 | struct esd_usb2_msg msg; | 1044 | struct esd_usb2_msg *msg; |
| 1026 | int i, err; | 1045 | int i, err; |
| 1027 | 1046 | ||
| 1028 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | 1047 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
| @@ -1037,27 +1056,33 @@ static int esd_usb2_probe(struct usb_interface *intf, | |||
| 1037 | 1056 | ||
| 1038 | usb_set_intfdata(intf, dev); | 1057 | usb_set_intfdata(intf, dev); |
| 1039 | 1058 | ||
| 1059 | msg = kmalloc(sizeof(*msg), GFP_KERNEL); | ||
| 1060 | if (!msg) { | ||
| 1061 | err = -ENOMEM; | ||
| 1062 | goto free_msg; | ||
| 1063 | } | ||
| 1064 | |||
| 1040 | /* query number of CAN interfaces (nets) */ | 1065 | /* query number of CAN interfaces (nets) */ |
| 1041 | msg.msg.hdr.cmd = CMD_VERSION; | 1066 | msg->msg.hdr.cmd = CMD_VERSION; |
| 1042 | msg.msg.hdr.len = 2; | 1067 | msg->msg.hdr.len = 2; |
| 1043 | msg.msg.version.rsvd = 0; | 1068 | msg->msg.version.rsvd = 0; |
| 1044 | msg.msg.version.flags = 0; | 1069 | msg->msg.version.flags = 0; |
| 1045 | msg.msg.version.drv_version = 0; | 1070 | msg->msg.version.drv_version = 0; |
| 1046 | 1071 | ||
| 1047 | err = esd_usb2_send_msg(dev, &msg); | 1072 | err = esd_usb2_send_msg(dev, msg); |
| 1048 | if (err < 0) { | 1073 | if (err < 0) { |
| 1049 | dev_err(&intf->dev, "sending version message failed\n"); | 1074 | dev_err(&intf->dev, "sending version message failed\n"); |
| 1050 | goto free_dev; | 1075 | goto free_msg; |
| 1051 | } | 1076 | } |
| 1052 | 1077 | ||
| 1053 | err = esd_usb2_wait_msg(dev, &msg); | 1078 | err = esd_usb2_wait_msg(dev, msg); |
| 1054 | if (err < 0) { | 1079 | if (err < 0) { |
| 1055 | dev_err(&intf->dev, "no version message answer\n"); | 1080 | dev_err(&intf->dev, "no version message answer\n"); |
| 1056 | goto free_dev; | 1081 | goto free_msg; |
| 1057 | } | 1082 | } |
| 1058 | 1083 | ||
| 1059 | dev->net_count = (int)msg.msg.version_reply.nets; | 1084 | dev->net_count = (int)msg->msg.version_reply.nets; |
| 1060 | dev->version = le32_to_cpu(msg.msg.version_reply.version); | 1085 | dev->version = le32_to_cpu(msg->msg.version_reply.version); |
| 1061 | 1086 | ||
| 1062 | if (device_create_file(&intf->dev, &dev_attr_firmware)) | 1087 | if (device_create_file(&intf->dev, &dev_attr_firmware)) |
| 1063 | dev_err(&intf->dev, | 1088 | dev_err(&intf->dev, |
| @@ -1075,10 +1100,10 @@ static int esd_usb2_probe(struct usb_interface *intf, | |||
| 1075 | for (i = 0; i < dev->net_count; i++) | 1100 | for (i = 0; i < dev->net_count; i++) |
| 1076 | esd_usb2_probe_one_net(intf, i); | 1101 | esd_usb2_probe_one_net(intf, i); |
| 1077 | 1102 | ||
| 1078 | return 0; | 1103 | free_msg: |
| 1079 | 1104 | kfree(msg); | |
| 1080 | free_dev: | 1105 | if (err) |
| 1081 | kfree(dev); | 1106 | kfree(dev); |
| 1082 | done: | 1107 | done: |
| 1083 | return err; | 1108 | return err; |
| 1084 | } | 1109 | } |
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index 45cb9f3c1324..3b9546588240 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c | |||
| @@ -136,6 +136,9 @@ | |||
| 136 | #define KVASER_CTRL_MODE_SELFRECEPTION 3 | 136 | #define KVASER_CTRL_MODE_SELFRECEPTION 3 |
| 137 | #define KVASER_CTRL_MODE_OFF 4 | 137 | #define KVASER_CTRL_MODE_OFF 4 |
| 138 | 138 | ||
| 139 | /* log message */ | ||
| 140 | #define KVASER_EXTENDED_FRAME BIT(31) | ||
| 141 | |||
| 139 | struct kvaser_msg_simple { | 142 | struct kvaser_msg_simple { |
| 140 | u8 tid; | 143 | u8 tid; |
| 141 | u8 channel; | 144 | u8 channel; |
| @@ -817,8 +820,13 @@ static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev, | |||
| 817 | priv = dev->nets[channel]; | 820 | priv = dev->nets[channel]; |
| 818 | stats = &priv->netdev->stats; | 821 | stats = &priv->netdev->stats; |
| 819 | 822 | ||
| 820 | if (msg->u.rx_can.flag & (MSG_FLAG_ERROR_FRAME | MSG_FLAG_NERR | | 823 | if ((msg->u.rx_can.flag & MSG_FLAG_ERROR_FRAME) && |
| 821 | MSG_FLAG_OVERRUN)) { | 824 | (msg->id == CMD_LOG_MESSAGE)) { |
| 825 | kvaser_usb_rx_error(dev, msg); | ||
| 826 | return; | ||
| 827 | } else if (msg->u.rx_can.flag & (MSG_FLAG_ERROR_FRAME | | ||
| 828 | MSG_FLAG_NERR | | ||
| 829 | MSG_FLAG_OVERRUN)) { | ||
| 822 | kvaser_usb_rx_can_err(priv, msg); | 830 | kvaser_usb_rx_can_err(priv, msg); |
| 823 | return; | 831 | return; |
| 824 | } else if (msg->u.rx_can.flag & ~MSG_FLAG_REMOTE_FRAME) { | 832 | } else if (msg->u.rx_can.flag & ~MSG_FLAG_REMOTE_FRAME) { |
| @@ -834,22 +842,40 @@ static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev, | |||
| 834 | return; | 842 | return; |
| 835 | } | 843 | } |
| 836 | 844 | ||
| 837 | cf->can_id = ((msg->u.rx_can.msg[0] & 0x1f) << 6) | | 845 | if (msg->id == CMD_LOG_MESSAGE) { |
| 838 | (msg->u.rx_can.msg[1] & 0x3f); | 846 | cf->can_id = le32_to_cpu(msg->u.log_message.id); |
| 839 | cf->can_dlc = get_can_dlc(msg->u.rx_can.msg[5]); | 847 | if (cf->can_id & KVASER_EXTENDED_FRAME) |
| 848 | cf->can_id &= CAN_EFF_MASK | CAN_EFF_FLAG; | ||
| 849 | else | ||
| 850 | cf->can_id &= CAN_SFF_MASK; | ||
| 840 | 851 | ||
| 841 | if (msg->id == CMD_RX_EXT_MESSAGE) { | 852 | cf->can_dlc = get_can_dlc(msg->u.log_message.dlc); |
| 842 | cf->can_id <<= 18; | ||
| 843 | cf->can_id |= ((msg->u.rx_can.msg[2] & 0x0f) << 14) | | ||
| 844 | ((msg->u.rx_can.msg[3] & 0xff) << 6) | | ||
| 845 | (msg->u.rx_can.msg[4] & 0x3f); | ||
| 846 | cf->can_id |= CAN_EFF_FLAG; | ||
| 847 | } | ||
| 848 | 853 | ||
| 849 | if (msg->u.rx_can.flag & MSG_FLAG_REMOTE_FRAME) | 854 | if (msg->u.log_message.flags & MSG_FLAG_REMOTE_FRAME) |
| 850 | cf->can_id |= CAN_RTR_FLAG; | 855 | cf->can_id |= CAN_RTR_FLAG; |
| 851 | else | 856 | else |
| 852 | memcpy(cf->data, &msg->u.rx_can.msg[6], cf->can_dlc); | 857 | memcpy(cf->data, &msg->u.log_message.data, |
| 858 | cf->can_dlc); | ||
| 859 | } else { | ||
| 860 | cf->can_id = ((msg->u.rx_can.msg[0] & 0x1f) << 6) | | ||
| 861 | (msg->u.rx_can.msg[1] & 0x3f); | ||
| 862 | |||
| 863 | if (msg->id == CMD_RX_EXT_MESSAGE) { | ||
| 864 | cf->can_id <<= 18; | ||
| 865 | cf->can_id |= ((msg->u.rx_can.msg[2] & 0x0f) << 14) | | ||
| 866 | ((msg->u.rx_can.msg[3] & 0xff) << 6) | | ||
| 867 | (msg->u.rx_can.msg[4] & 0x3f); | ||
| 868 | cf->can_id |= CAN_EFF_FLAG; | ||
| 869 | } | ||
| 870 | |||
| 871 | cf->can_dlc = get_can_dlc(msg->u.rx_can.msg[5]); | ||
| 872 | |||
| 873 | if (msg->u.rx_can.flag & MSG_FLAG_REMOTE_FRAME) | ||
| 874 | cf->can_id |= CAN_RTR_FLAG; | ||
| 875 | else | ||
| 876 | memcpy(cf->data, &msg->u.rx_can.msg[6], | ||
| 877 | cf->can_dlc); | ||
| 878 | } | ||
| 853 | 879 | ||
| 854 | netif_rx(skb); | 880 | netif_rx(skb); |
| 855 | 881 | ||
| @@ -911,6 +937,7 @@ static void kvaser_usb_handle_message(const struct kvaser_usb *dev, | |||
| 911 | 937 | ||
| 912 | case CMD_RX_STD_MESSAGE: | 938 | case CMD_RX_STD_MESSAGE: |
| 913 | case CMD_RX_EXT_MESSAGE: | 939 | case CMD_RX_EXT_MESSAGE: |
| 940 | case CMD_LOG_MESSAGE: | ||
| 914 | kvaser_usb_rx_can_msg(dev, msg); | 941 | kvaser_usb_rx_can_msg(dev, msg); |
| 915 | break; | 942 | break; |
| 916 | 943 | ||
| @@ -919,11 +946,6 @@ static void kvaser_usb_handle_message(const struct kvaser_usb *dev, | |||
| 919 | kvaser_usb_rx_error(dev, msg); | 946 | kvaser_usb_rx_error(dev, msg); |
| 920 | break; | 947 | break; |
| 921 | 948 | ||
| 922 | case CMD_LOG_MESSAGE: | ||
| 923 | if (msg->u.log_message.flags & MSG_FLAG_ERROR_FRAME) | ||
| 924 | kvaser_usb_rx_error(dev, msg); | ||
| 925 | break; | ||
| 926 | |||
| 927 | case CMD_TX_ACKNOWLEDGE: | 949 | case CMD_TX_ACKNOWLEDGE: |
| 928 | kvaser_usb_tx_acknowledge(dev, msg); | 950 | kvaser_usb_tx_acknowledge(dev, msg); |
| 929 | break; | 951 | break; |
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 30d79bfa5b10..8ee9d1556e6e 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c | |||
| @@ -504,15 +504,24 @@ static int pcan_usb_pro_restart_async(struct peak_usb_device *dev, | |||
| 504 | return usb_submit_urb(urb, GFP_ATOMIC); | 504 | return usb_submit_urb(urb, GFP_ATOMIC); |
| 505 | } | 505 | } |
| 506 | 506 | ||
| 507 | static void pcan_usb_pro_drv_loaded(struct peak_usb_device *dev, int loaded) | 507 | static int pcan_usb_pro_drv_loaded(struct peak_usb_device *dev, int loaded) |
| 508 | { | 508 | { |
| 509 | u8 buffer[16]; | 509 | u8 *buffer; |
| 510 | int err; | ||
| 511 | |||
| 512 | buffer = kmalloc(PCAN_USBPRO_FCT_DRVLD_REQ_LEN, GFP_KERNEL); | ||
| 513 | if (!buffer) | ||
| 514 | return -ENOMEM; | ||
| 510 | 515 | ||
| 511 | buffer[0] = 0; | 516 | buffer[0] = 0; |
| 512 | buffer[1] = !!loaded; | 517 | buffer[1] = !!loaded; |
| 513 | 518 | ||
| 514 | pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_FCT, | 519 | err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_FCT, |
| 515 | PCAN_USBPRO_FCT_DRVLD, buffer, sizeof(buffer)); | 520 | PCAN_USBPRO_FCT_DRVLD, buffer, |
| 521 | PCAN_USBPRO_FCT_DRVLD_REQ_LEN); | ||
| 522 | kfree(buffer); | ||
| 523 | |||
| 524 | return err; | ||
| 516 | } | 525 | } |
| 517 | 526 | ||
| 518 | static inline | 527 | static inline |
| @@ -851,21 +860,24 @@ static int pcan_usb_pro_stop(struct peak_usb_device *dev) | |||
| 851 | */ | 860 | */ |
| 852 | static int pcan_usb_pro_init(struct peak_usb_device *dev) | 861 | static int pcan_usb_pro_init(struct peak_usb_device *dev) |
| 853 | { | 862 | { |
| 854 | struct pcan_usb_pro_interface *usb_if; | ||
| 855 | struct pcan_usb_pro_device *pdev = | 863 | struct pcan_usb_pro_device *pdev = |
| 856 | container_of(dev, struct pcan_usb_pro_device, dev); | 864 | container_of(dev, struct pcan_usb_pro_device, dev); |
| 865 | struct pcan_usb_pro_interface *usb_if = NULL; | ||
| 866 | struct pcan_usb_pro_fwinfo *fi = NULL; | ||
| 867 | struct pcan_usb_pro_blinfo *bi = NULL; | ||
| 868 | int err; | ||
| 857 | 869 | ||
| 858 | /* do this for 1st channel only */ | 870 | /* do this for 1st channel only */ |
| 859 | if (!dev->prev_siblings) { | 871 | if (!dev->prev_siblings) { |
| 860 | struct pcan_usb_pro_fwinfo fi; | ||
| 861 | struct pcan_usb_pro_blinfo bi; | ||
| 862 | int err; | ||
| 863 | |||
| 864 | /* allocate netdevices common structure attached to first one */ | 872 | /* allocate netdevices common structure attached to first one */ |
| 865 | usb_if = kzalloc(sizeof(struct pcan_usb_pro_interface), | 873 | usb_if = kzalloc(sizeof(struct pcan_usb_pro_interface), |
| 866 | GFP_KERNEL); | 874 | GFP_KERNEL); |
| 867 | if (!usb_if) | 875 | fi = kmalloc(sizeof(struct pcan_usb_pro_fwinfo), GFP_KERNEL); |
| 868 | return -ENOMEM; | 876 | bi = kmalloc(sizeof(struct pcan_usb_pro_blinfo), GFP_KERNEL); |
| 877 | if (!usb_if || !fi || !bi) { | ||
| 878 | err = -ENOMEM; | ||
| 879 | goto err_out; | ||
| 880 | } | ||
| 869 | 881 | ||
| 870 | /* number of ts msgs to ignore before taking one into account */ | 882 | /* number of ts msgs to ignore before taking one into account */ |
| 871 | usb_if->cm_ignore_count = 5; | 883 | usb_if->cm_ignore_count = 5; |
| @@ -877,34 +889,34 @@ static int pcan_usb_pro_init(struct peak_usb_device *dev) | |||
| 877 | */ | 889 | */ |
| 878 | err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO, | 890 | err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO, |
| 879 | PCAN_USBPRO_INFO_FW, | 891 | PCAN_USBPRO_INFO_FW, |
| 880 | &fi, sizeof(fi)); | 892 | fi, sizeof(*fi)); |
| 881 | if (err) { | 893 | if (err) { |
| 882 | kfree(usb_if); | ||
| 883 | dev_err(dev->netdev->dev.parent, | 894 | dev_err(dev->netdev->dev.parent, |
| 884 | "unable to read %s firmware info (err %d)\n", | 895 | "unable to read %s firmware info (err %d)\n", |
| 885 | pcan_usb_pro.name, err); | 896 | pcan_usb_pro.name, err); |
| 886 | return err; | 897 | goto err_out; |
| 887 | } | 898 | } |
| 888 | 899 | ||
| 889 | err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO, | 900 | err = pcan_usb_pro_send_req(dev, PCAN_USBPRO_REQ_INFO, |
| 890 | PCAN_USBPRO_INFO_BL, | 901 | PCAN_USBPRO_INFO_BL, |
| 891 | &bi, sizeof(bi)); | 902 | bi, sizeof(*bi)); |
| 892 | if (err) { | 903 | if (err) { |
| 893 | kfree(usb_if); | ||
| 894 | dev_err(dev->netdev->dev.parent, | 904 | dev_err(dev->netdev->dev.parent, |
| 895 | "unable to read %s bootloader info (err %d)\n", | 905 | "unable to read %s bootloader info (err %d)\n", |
| 896 | pcan_usb_pro.name, err); | 906 | pcan_usb_pro.name, err); |
| 897 | return err; | 907 | goto err_out; |
| 898 | } | 908 | } |
| 899 | 909 | ||
| 910 | /* tell the device the can driver is running */ | ||
| 911 | err = pcan_usb_pro_drv_loaded(dev, 1); | ||
| 912 | if (err) | ||
| 913 | goto err_out; | ||
| 914 | |||
| 900 | dev_info(dev->netdev->dev.parent, | 915 | dev_info(dev->netdev->dev.parent, |
| 901 | "PEAK-System %s hwrev %u serial %08X.%08X (%u channels)\n", | 916 | "PEAK-System %s hwrev %u serial %08X.%08X (%u channels)\n", |
| 902 | pcan_usb_pro.name, | 917 | pcan_usb_pro.name, |
| 903 | bi.hw_rev, bi.serial_num_hi, bi.serial_num_lo, | 918 | bi->hw_rev, bi->serial_num_hi, bi->serial_num_lo, |
| 904 | pcan_usb_pro.ctrl_count); | 919 | pcan_usb_pro.ctrl_count); |
| 905 | |||
| 906 | /* tell the device the can driver is running */ | ||
| 907 | pcan_usb_pro_drv_loaded(dev, 1); | ||
| 908 | } else { | 920 | } else { |
| 909 | usb_if = pcan_usb_pro_dev_if(dev->prev_siblings); | 921 | usb_if = pcan_usb_pro_dev_if(dev->prev_siblings); |
| 910 | } | 922 | } |
| @@ -916,6 +928,13 @@ static int pcan_usb_pro_init(struct peak_usb_device *dev) | |||
| 916 | pcan_usb_pro_set_led(dev, 0, 1); | 928 | pcan_usb_pro_set_led(dev, 0, 1); |
| 917 | 929 | ||
| 918 | return 0; | 930 | return 0; |
| 931 | |||
| 932 | err_out: | ||
| 933 | kfree(bi); | ||
| 934 | kfree(fi); | ||
| 935 | kfree(usb_if); | ||
| 936 | |||
| 937 | return err; | ||
| 919 | } | 938 | } |
| 920 | 939 | ||
| 921 | static void pcan_usb_pro_exit(struct peak_usb_device *dev) | 940 | static void pcan_usb_pro_exit(struct peak_usb_device *dev) |
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.h b/drivers/net/can/usb/peak_usb/pcan_usb_pro.h index a869918c5620..32275af547e0 100644 --- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.h +++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.h | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | 29 | ||
| 30 | /* Vendor Request value for XXX_FCT */ | 30 | /* Vendor Request value for XXX_FCT */ |
| 31 | #define PCAN_USBPRO_FCT_DRVLD 5 /* tell device driver is loaded */ | 31 | #define PCAN_USBPRO_FCT_DRVLD 5 /* tell device driver is loaded */ |
| 32 | #define PCAN_USBPRO_FCT_DRVLD_REQ_LEN 16 | ||
| 32 | 33 | ||
| 33 | /* PCAN_USBPRO_INFO_BL vendor request record type */ | 34 | /* PCAN_USBPRO_INFO_BL vendor request record type */ |
| 34 | struct __packed pcan_usb_pro_blinfo { | 35 | struct __packed pcan_usb_pro_blinfo { |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index be59ec4b2c30..638e55435b04 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
| @@ -3192,11 +3192,11 @@ static u32 bnx2x_xmit_type(struct bnx2x *bp, struct sk_buff *skb) | |||
| 3192 | rc |= XMIT_CSUM_TCP; | 3192 | rc |= XMIT_CSUM_TCP; |
| 3193 | 3193 | ||
| 3194 | if (skb_is_gso_v6(skb)) { | 3194 | if (skb_is_gso_v6(skb)) { |
| 3195 | rc |= (XMIT_GSO_V6 | XMIT_CSUM_TCP | XMIT_CSUM_V6); | 3195 | rc |= (XMIT_GSO_V6 | XMIT_CSUM_TCP); |
| 3196 | if (rc & XMIT_CSUM_ENC) | 3196 | if (rc & XMIT_CSUM_ENC) |
| 3197 | rc |= XMIT_GSO_ENC_V6; | 3197 | rc |= XMIT_GSO_ENC_V6; |
| 3198 | } else if (skb_is_gso(skb)) { | 3198 | } else if (skb_is_gso(skb)) { |
| 3199 | rc |= (XMIT_GSO_V4 | XMIT_CSUM_V4 | XMIT_CSUM_TCP); | 3199 | rc |= (XMIT_GSO_V4 | XMIT_CSUM_TCP); |
| 3200 | if (rc & XMIT_CSUM_ENC) | 3200 | if (rc & XMIT_CSUM_ENC) |
| 3201 | rc |= XMIT_GSO_ENC_V4; | 3201 | rc |= XMIT_GSO_ENC_V4; |
| 3202 | } | 3202 | } |
| @@ -3483,19 +3483,18 @@ static void bnx2x_update_pbds_gso_enc(struct sk_buff *skb, | |||
| 3483 | { | 3483 | { |
| 3484 | u16 hlen_w = 0; | 3484 | u16 hlen_w = 0; |
| 3485 | u8 outerip_off, outerip_len = 0; | 3485 | u8 outerip_off, outerip_len = 0; |
| 3486 | |||
| 3486 | /* from outer IP to transport */ | 3487 | /* from outer IP to transport */ |
| 3487 | hlen_w = (skb_inner_transport_header(skb) - | 3488 | hlen_w = (skb_inner_transport_header(skb) - |
| 3488 | skb_network_header(skb)) >> 1; | 3489 | skb_network_header(skb)) >> 1; |
| 3489 | 3490 | ||
| 3490 | /* transport len */ | 3491 | /* transport len */ |
| 3491 | if (xmit_type & XMIT_CSUM_TCP) | 3492 | hlen_w += inner_tcp_hdrlen(skb) >> 1; |
| 3492 | hlen_w += inner_tcp_hdrlen(skb) >> 1; | ||
| 3493 | else | ||
| 3494 | hlen_w += sizeof(struct udphdr) >> 1; | ||
| 3495 | 3493 | ||
| 3496 | pbd2->fw_ip_hdr_to_payload_w = hlen_w; | 3494 | pbd2->fw_ip_hdr_to_payload_w = hlen_w; |
| 3497 | 3495 | ||
| 3498 | if (xmit_type & XMIT_CSUM_ENC_V4) { | 3496 | /* outer IP header info */ |
| 3497 | if (xmit_type & XMIT_CSUM_V4) { | ||
| 3499 | struct iphdr *iph = ip_hdr(skb); | 3498 | struct iphdr *iph = ip_hdr(skb); |
| 3500 | pbd2->fw_ip_csum_wo_len_flags_frag = | 3499 | pbd2->fw_ip_csum_wo_len_flags_frag = |
| 3501 | bswab16(csum_fold((~iph->check) - | 3500 | bswab16(csum_fold((~iph->check) - |
| @@ -3818,8 +3817,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 3818 | bnx2x_set_pbd_gso_e2(skb, &pbd_e2_parsing_data, | 3817 | bnx2x_set_pbd_gso_e2(skb, &pbd_e2_parsing_data, |
| 3819 | xmit_type); | 3818 | xmit_type); |
| 3820 | else | 3819 | else |
| 3821 | bnx2x_set_pbd_gso(skb, pbd_e1x, tx_start_bd, | 3820 | bnx2x_set_pbd_gso(skb, pbd_e1x, first_bd, xmit_type); |
| 3822 | xmit_type); | ||
| 3823 | } | 3821 | } |
| 3824 | 3822 | ||
| 3825 | /* Set the PBD's parsing_data field if not zero | 3823 | /* Set the PBD's parsing_data field if not zero |
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 1f2dd928888a..0f493c8dc28b 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
| @@ -9468,6 +9468,14 @@ static void tg3_rss_write_indir_tbl(struct tg3 *tp) | |||
| 9468 | } | 9468 | } |
| 9469 | } | 9469 | } |
| 9470 | 9470 | ||
| 9471 | static inline u32 tg3_lso_rd_dma_workaround_bit(struct tg3 *tp) | ||
| 9472 | { | ||
| 9473 | if (tg3_asic_rev(tp) == ASIC_REV_5719) | ||
| 9474 | return TG3_LSO_RD_DMA_TX_LENGTH_WA_5719; | ||
| 9475 | else | ||
| 9476 | return TG3_LSO_RD_DMA_TX_LENGTH_WA_5720; | ||
| 9477 | } | ||
| 9478 | |||
| 9471 | /* tp->lock is held. */ | 9479 | /* tp->lock is held. */ |
| 9472 | static int tg3_reset_hw(struct tg3 *tp, bool reset_phy) | 9480 | static int tg3_reset_hw(struct tg3 *tp, bool reset_phy) |
| 9473 | { | 9481 | { |
| @@ -10153,16 +10161,17 @@ static int tg3_reset_hw(struct tg3 *tp, bool reset_phy) | |||
| 10153 | tw32_f(RDMAC_MODE, rdmac_mode); | 10161 | tw32_f(RDMAC_MODE, rdmac_mode); |
| 10154 | udelay(40); | 10162 | udelay(40); |
| 10155 | 10163 | ||
| 10156 | if (tg3_asic_rev(tp) == ASIC_REV_5719) { | 10164 | if (tg3_asic_rev(tp) == ASIC_REV_5719 || |
| 10165 | tg3_asic_rev(tp) == ASIC_REV_5720) { | ||
| 10157 | for (i = 0; i < TG3_NUM_RDMA_CHANNELS; i++) { | 10166 | for (i = 0; i < TG3_NUM_RDMA_CHANNELS; i++) { |
| 10158 | if (tr32(TG3_RDMA_LENGTH + (i << 2)) > TG3_MAX_MTU(tp)) | 10167 | if (tr32(TG3_RDMA_LENGTH + (i << 2)) > TG3_MAX_MTU(tp)) |
| 10159 | break; | 10168 | break; |
| 10160 | } | 10169 | } |
| 10161 | if (i < TG3_NUM_RDMA_CHANNELS) { | 10170 | if (i < TG3_NUM_RDMA_CHANNELS) { |
| 10162 | val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); | 10171 | val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); |
| 10163 | val |= TG3_LSO_RD_DMA_TX_LENGTH_WA; | 10172 | val |= tg3_lso_rd_dma_workaround_bit(tp); |
| 10164 | tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); | 10173 | tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); |
| 10165 | tg3_flag_set(tp, 5719_RDMA_BUG); | 10174 | tg3_flag_set(tp, 5719_5720_RDMA_BUG); |
| 10166 | } | 10175 | } |
| 10167 | } | 10176 | } |
| 10168 | 10177 | ||
| @@ -10526,15 +10535,15 @@ static void tg3_periodic_fetch_stats(struct tg3 *tp) | |||
| 10526 | TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST); | 10535 | TG3_STAT_ADD32(&sp->tx_ucast_packets, MAC_TX_STATS_UCAST); |
| 10527 | TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST); | 10536 | TG3_STAT_ADD32(&sp->tx_mcast_packets, MAC_TX_STATS_MCAST); |
| 10528 | TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST); | 10537 | TG3_STAT_ADD32(&sp->tx_bcast_packets, MAC_TX_STATS_BCAST); |
| 10529 | if (unlikely(tg3_flag(tp, 5719_RDMA_BUG) && | 10538 | if (unlikely(tg3_flag(tp, 5719_5720_RDMA_BUG) && |
| 10530 | (sp->tx_ucast_packets.low + sp->tx_mcast_packets.low + | 10539 | (sp->tx_ucast_packets.low + sp->tx_mcast_packets.low + |
| 10531 | sp->tx_bcast_packets.low) > TG3_NUM_RDMA_CHANNELS)) { | 10540 | sp->tx_bcast_packets.low) > TG3_NUM_RDMA_CHANNELS)) { |
| 10532 | u32 val; | 10541 | u32 val; |
| 10533 | 10542 | ||
| 10534 | val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); | 10543 | val = tr32(TG3_LSO_RD_DMA_CRPTEN_CTRL); |
| 10535 | val &= ~TG3_LSO_RD_DMA_TX_LENGTH_WA; | 10544 | val &= ~tg3_lso_rd_dma_workaround_bit(tp); |
| 10536 | tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); | 10545 | tw32(TG3_LSO_RD_DMA_CRPTEN_CTRL, val); |
| 10537 | tg3_flag_clear(tp, 5719_RDMA_BUG); | 10546 | tg3_flag_clear(tp, 5719_5720_RDMA_BUG); |
| 10538 | } | 10547 | } |
| 10539 | 10548 | ||
| 10540 | TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS); | 10549 | TG3_STAT_ADD32(&sp->rx_octets, MAC_RX_STATS_OCTETS); |
diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h index 9b2d3ac2474a..ff6e30eeae35 100644 --- a/drivers/net/ethernet/broadcom/tg3.h +++ b/drivers/net/ethernet/broadcom/tg3.h | |||
| @@ -1422,7 +1422,8 @@ | |||
| 1422 | #define TG3_LSO_RD_DMA_CRPTEN_CTRL 0x00004910 | 1422 | #define TG3_LSO_RD_DMA_CRPTEN_CTRL 0x00004910 |
| 1423 | #define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_BD_4K 0x00030000 | 1423 | #define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_BD_4K 0x00030000 |
| 1424 | #define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_LSO_4K 0x000c0000 | 1424 | #define TG3_LSO_RD_DMA_CRPTEN_CTRL_BLEN_LSO_4K 0x000c0000 |
| 1425 | #define TG3_LSO_RD_DMA_TX_LENGTH_WA 0x02000000 | 1425 | #define TG3_LSO_RD_DMA_TX_LENGTH_WA_5719 0x02000000 |
| 1426 | #define TG3_LSO_RD_DMA_TX_LENGTH_WA_5720 0x00200000 | ||
| 1426 | /* 0x4914 --> 0x4be0 unused */ | 1427 | /* 0x4914 --> 0x4be0 unused */ |
| 1427 | 1428 | ||
| 1428 | #define TG3_NUM_RDMA_CHANNELS 4 | 1429 | #define TG3_NUM_RDMA_CHANNELS 4 |
| @@ -3059,7 +3060,7 @@ enum TG3_FLAGS { | |||
| 3059 | TG3_FLAG_APE_HAS_NCSI, | 3060 | TG3_FLAG_APE_HAS_NCSI, |
| 3060 | TG3_FLAG_TX_TSTAMP_EN, | 3061 | TG3_FLAG_TX_TSTAMP_EN, |
| 3061 | TG3_FLAG_4K_FIFO_LIMIT, | 3062 | TG3_FLAG_4K_FIFO_LIMIT, |
| 3062 | TG3_FLAG_5719_RDMA_BUG, | 3063 | TG3_FLAG_5719_5720_RDMA_BUG, |
| 3063 | TG3_FLAG_RESET_TASK_PENDING, | 3064 | TG3_FLAG_RESET_TASK_PENDING, |
| 3064 | TG3_FLAG_PTP_CAPABLE, | 3065 | TG3_FLAG_PTP_CAPABLE, |
| 3065 | TG3_FLAG_5705_PLUS, | 3066 | TG3_FLAG_5705_PLUS, |
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index f544b297c9ab..0a510684e468 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
| @@ -262,6 +262,7 @@ struct be_rx_compl_info { | |||
| 262 | u8 ipv6; | 262 | u8 ipv6; |
| 263 | u8 vtm; | 263 | u8 vtm; |
| 264 | u8 pkt_type; | 264 | u8 pkt_type; |
| 265 | u8 ip_frag; | ||
| 265 | }; | 266 | }; |
| 266 | 267 | ||
| 267 | struct be_rx_obj { | 268 | struct be_rx_obj { |
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index a236ecd27cf3..1db2df61b8af 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
| @@ -562,7 +562,7 @@ int lancer_test_and_set_rdy_state(struct be_adapter *adapter) | |||
| 562 | 562 | ||
| 563 | resource_error = lancer_provisioning_error(adapter); | 563 | resource_error = lancer_provisioning_error(adapter); |
| 564 | if (resource_error) | 564 | if (resource_error) |
| 565 | return -1; | 565 | return -EAGAIN; |
| 566 | 566 | ||
| 567 | status = lancer_wait_ready(adapter); | 567 | status = lancer_wait_ready(adapter); |
| 568 | if (!status) { | 568 | if (!status) { |
| @@ -590,8 +590,8 @@ int lancer_test_and_set_rdy_state(struct be_adapter *adapter) | |||
| 590 | * when PF provisions resources. | 590 | * when PF provisions resources. |
| 591 | */ | 591 | */ |
| 592 | resource_error = lancer_provisioning_error(adapter); | 592 | resource_error = lancer_provisioning_error(adapter); |
| 593 | if (status == -1 && !resource_error) | 593 | if (resource_error) |
| 594 | adapter->eeh_error = true; | 594 | status = -EAGAIN; |
| 595 | 595 | ||
| 596 | return status; | 596 | return status; |
| 597 | } | 597 | } |
diff --git a/drivers/net/ethernet/emulex/benet/be_hw.h b/drivers/net/ethernet/emulex/benet/be_hw.h index 3c1099b47f2a..8780183c6d1c 100644 --- a/drivers/net/ethernet/emulex/benet/be_hw.h +++ b/drivers/net/ethernet/emulex/benet/be_hw.h | |||
| @@ -356,7 +356,7 @@ struct amap_eth_rx_compl_v0 { | |||
| 356 | u8 ip_version; /* dword 1 */ | 356 | u8 ip_version; /* dword 1 */ |
| 357 | u8 macdst[6]; /* dword 1 */ | 357 | u8 macdst[6]; /* dword 1 */ |
| 358 | u8 vtp; /* dword 1 */ | 358 | u8 vtp; /* dword 1 */ |
| 359 | u8 rsvd0; /* dword 1 */ | 359 | u8 ip_frag; /* dword 1 */ |
| 360 | u8 fragndx[10]; /* dword 1 */ | 360 | u8 fragndx[10]; /* dword 1 */ |
| 361 | u8 ct[2]; /* dword 1 */ | 361 | u8 ct[2]; /* dword 1 */ |
| 362 | u8 sw; /* dword 1 */ | 362 | u8 sw; /* dword 1 */ |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index ca2967b0f18b..8bc1b21b1c79 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
| @@ -1599,6 +1599,8 @@ static void be_parse_rx_compl_v0(struct be_eth_rx_compl *compl, | |||
| 1599 | compl); | 1599 | compl); |
| 1600 | } | 1600 | } |
| 1601 | rxcp->port = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, port, compl); | 1601 | rxcp->port = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, port, compl); |
| 1602 | rxcp->ip_frag = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, | ||
| 1603 | ip_frag, compl); | ||
| 1602 | } | 1604 | } |
| 1603 | 1605 | ||
| 1604 | static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo) | 1606 | static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo) |
| @@ -1620,6 +1622,9 @@ static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo) | |||
| 1620 | else | 1622 | else |
| 1621 | be_parse_rx_compl_v0(compl, rxcp); | 1623 | be_parse_rx_compl_v0(compl, rxcp); |
| 1622 | 1624 | ||
| 1625 | if (rxcp->ip_frag) | ||
| 1626 | rxcp->l4_csum = 0; | ||
| 1627 | |||
| 1623 | if (rxcp->vlanf) { | 1628 | if (rxcp->vlanf) { |
| 1624 | /* vlanf could be wrongly set in some cards. | 1629 | /* vlanf could be wrongly set in some cards. |
| 1625 | * ignore if vtm is not set */ | 1630 | * ignore if vtm is not set */ |
| @@ -2168,7 +2173,7 @@ static irqreturn_t be_msix(int irq, void *dev) | |||
| 2168 | 2173 | ||
| 2169 | static inline bool do_gro(struct be_rx_compl_info *rxcp) | 2174 | static inline bool do_gro(struct be_rx_compl_info *rxcp) |
| 2170 | { | 2175 | { |
| 2171 | return (rxcp->tcpf && !rxcp->err) ? true : false; | 2176 | return (rxcp->tcpf && !rxcp->err && rxcp->l4_csum) ? true : false; |
| 2172 | } | 2177 | } |
| 2173 | 2178 | ||
| 2174 | static int be_process_rx(struct be_rx_obj *rxo, struct napi_struct *napi, | 2179 | static int be_process_rx(struct be_rx_obj *rxo, struct napi_struct *napi, |
| @@ -4093,6 +4098,7 @@ static int be_get_initial_config(struct be_adapter *adapter) | |||
| 4093 | 4098 | ||
| 4094 | static int lancer_recover_func(struct be_adapter *adapter) | 4099 | static int lancer_recover_func(struct be_adapter *adapter) |
| 4095 | { | 4100 | { |
| 4101 | struct device *dev = &adapter->pdev->dev; | ||
| 4096 | int status; | 4102 | int status; |
| 4097 | 4103 | ||
| 4098 | status = lancer_test_and_set_rdy_state(adapter); | 4104 | status = lancer_test_and_set_rdy_state(adapter); |
| @@ -4104,8 +4110,7 @@ static int lancer_recover_func(struct be_adapter *adapter) | |||
| 4104 | 4110 | ||
| 4105 | be_clear(adapter); | 4111 | be_clear(adapter); |
| 4106 | 4112 | ||
| 4107 | adapter->hw_error = false; | 4113 | be_clear_all_error(adapter); |
| 4108 | adapter->fw_timeout = false; | ||
| 4109 | 4114 | ||
| 4110 | status = be_setup(adapter); | 4115 | status = be_setup(adapter); |
| 4111 | if (status) | 4116 | if (status) |
| @@ -4117,13 +4122,13 @@ static int lancer_recover_func(struct be_adapter *adapter) | |||
| 4117 | goto err; | 4122 | goto err; |
| 4118 | } | 4123 | } |
| 4119 | 4124 | ||
| 4120 | dev_err(&adapter->pdev->dev, | 4125 | dev_err(dev, "Error recovery successful\n"); |
| 4121 | "Adapter SLIPORT recovery succeeded\n"); | ||
| 4122 | return 0; | 4126 | return 0; |
| 4123 | err: | 4127 | err: |
| 4124 | if (adapter->eeh_error) | 4128 | if (status == -EAGAIN) |
| 4125 | dev_err(&adapter->pdev->dev, | 4129 | dev_err(dev, "Waiting for resource provisioning\n"); |
| 4126 | "Adapter SLIPORT recovery failed\n"); | 4130 | else |
| 4131 | dev_err(dev, "Error recovery failed\n"); | ||
| 4127 | 4132 | ||
| 4128 | return status; | 4133 | return status; |
| 4129 | } | 4134 | } |
| @@ -4132,28 +4137,27 @@ static void be_func_recovery_task(struct work_struct *work) | |||
| 4132 | { | 4137 | { |
| 4133 | struct be_adapter *adapter = | 4138 | struct be_adapter *adapter = |
| 4134 | container_of(work, struct be_adapter, func_recovery_work.work); | 4139 | container_of(work, struct be_adapter, func_recovery_work.work); |
| 4135 | int status; | 4140 | int status = 0; |
| 4136 | 4141 | ||
| 4137 | be_detect_error(adapter); | 4142 | be_detect_error(adapter); |
| 4138 | 4143 | ||
| 4139 | if (adapter->hw_error && lancer_chip(adapter)) { | 4144 | if (adapter->hw_error && lancer_chip(adapter)) { |
| 4140 | 4145 | ||
| 4141 | if (adapter->eeh_error) | ||
| 4142 | goto out; | ||
| 4143 | |||
| 4144 | rtnl_lock(); | 4146 | rtnl_lock(); |
| 4145 | netif_device_detach(adapter->netdev); | 4147 | netif_device_detach(adapter->netdev); |
| 4146 | rtnl_unlock(); | 4148 | rtnl_unlock(); |
| 4147 | 4149 | ||
| 4148 | status = lancer_recover_func(adapter); | 4150 | status = lancer_recover_func(adapter); |
| 4149 | |||
| 4150 | if (!status) | 4151 | if (!status) |
| 4151 | netif_device_attach(adapter->netdev); | 4152 | netif_device_attach(adapter->netdev); |
| 4152 | } | 4153 | } |
| 4153 | 4154 | ||
| 4154 | out: | 4155 | /* In Lancer, for all errors other than provisioning error (-EAGAIN), |
| 4155 | schedule_delayed_work(&adapter->func_recovery_work, | 4156 | * no need to attempt further recovery. |
| 4156 | msecs_to_jiffies(1000)); | 4157 | */ |
| 4158 | if (!status || status == -EAGAIN) | ||
| 4159 | schedule_delayed_work(&adapter->func_recovery_work, | ||
| 4160 | msecs_to_jiffies(1000)); | ||
| 4157 | } | 4161 | } |
| 4158 | 4162 | ||
| 4159 | static void be_worker(struct work_struct *work) | 4163 | static void be_worker(struct work_struct *work) |
| @@ -4436,20 +4440,19 @@ static pci_ers_result_t be_eeh_err_detected(struct pci_dev *pdev, | |||
| 4436 | 4440 | ||
| 4437 | dev_err(&adapter->pdev->dev, "EEH error detected\n"); | 4441 | dev_err(&adapter->pdev->dev, "EEH error detected\n"); |
| 4438 | 4442 | ||
| 4439 | adapter->eeh_error = true; | 4443 | if (!adapter->eeh_error) { |
| 4440 | 4444 | adapter->eeh_error = true; | |
| 4441 | cancel_delayed_work_sync(&adapter->func_recovery_work); | ||
| 4442 | 4445 | ||
| 4443 | rtnl_lock(); | 4446 | cancel_delayed_work_sync(&adapter->func_recovery_work); |
| 4444 | netif_device_detach(netdev); | ||
| 4445 | rtnl_unlock(); | ||
| 4446 | 4447 | ||
| 4447 | if (netif_running(netdev)) { | ||
| 4448 | rtnl_lock(); | 4448 | rtnl_lock(); |
| 4449 | be_close(netdev); | 4449 | netif_device_detach(netdev); |
| 4450 | if (netif_running(netdev)) | ||
| 4451 | be_close(netdev); | ||
| 4450 | rtnl_unlock(); | 4452 | rtnl_unlock(); |
| 4453 | |||
| 4454 | be_clear(adapter); | ||
| 4451 | } | 4455 | } |
| 4452 | be_clear(adapter); | ||
| 4453 | 4456 | ||
| 4454 | if (state == pci_channel_io_perm_failure) | 4457 | if (state == pci_channel_io_perm_failure) |
| 4455 | return PCI_ERS_RESULT_DISCONNECT; | 4458 | return PCI_ERS_RESULT_DISCONNECT; |
| @@ -4474,7 +4477,6 @@ static pci_ers_result_t be_eeh_reset(struct pci_dev *pdev) | |||
| 4474 | int status; | 4477 | int status; |
| 4475 | 4478 | ||
| 4476 | dev_info(&adapter->pdev->dev, "EEH reset\n"); | 4479 | dev_info(&adapter->pdev->dev, "EEH reset\n"); |
| 4477 | be_clear_all_error(adapter); | ||
| 4478 | 4480 | ||
| 4479 | status = pci_enable_device(pdev); | 4481 | status = pci_enable_device(pdev); |
| 4480 | if (status) | 4482 | if (status) |
| @@ -4492,6 +4494,7 @@ static pci_ers_result_t be_eeh_reset(struct pci_dev *pdev) | |||
| 4492 | return PCI_ERS_RESULT_DISCONNECT; | 4494 | return PCI_ERS_RESULT_DISCONNECT; |
| 4493 | 4495 | ||
| 4494 | pci_cleanup_aer_uncorrect_error_status(pdev); | 4496 | pci_cleanup_aer_uncorrect_error_status(pdev); |
| 4497 | be_clear_all_error(adapter); | ||
| 4495 | return PCI_ERS_RESULT_RECOVERED; | 4498 | return PCI_ERS_RESULT_RECOVERED; |
| 4496 | } | 4499 | } |
| 4497 | 4500 | ||
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 85a06037b242..a667015be22a 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
| @@ -1038,6 +1038,18 @@ static void fec_get_mac(struct net_device *ndev) | |||
| 1038 | iap = &tmpaddr[0]; | 1038 | iap = &tmpaddr[0]; |
| 1039 | } | 1039 | } |
| 1040 | 1040 | ||
| 1041 | /* | ||
| 1042 | * 5) random mac address | ||
| 1043 | */ | ||
| 1044 | if (!is_valid_ether_addr(iap)) { | ||
| 1045 | /* Report it and use a random ethernet address instead */ | ||
| 1046 | netdev_err(ndev, "Invalid MAC address: %pM\n", iap); | ||
| 1047 | eth_hw_addr_random(ndev); | ||
| 1048 | netdev_info(ndev, "Using random MAC address: %pM\n", | ||
| 1049 | ndev->dev_addr); | ||
| 1050 | return; | ||
| 1051 | } | ||
| 1052 | |||
| 1041 | memcpy(ndev->dev_addr, iap, ETH_ALEN); | 1053 | memcpy(ndev->dev_addr, iap, ETH_ALEN); |
| 1042 | 1054 | ||
| 1043 | /* Adjust MAC if using macaddr */ | 1055 | /* Adjust MAC if using macaddr */ |
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c index 1df56cc50ee9..0e572a527154 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | |||
| @@ -222,8 +222,6 @@ static int mlx4_comm_cmd_poll(struct mlx4_dev *dev, u8 cmd, u16 param, | |||
| 222 | * FLR process. The only non-zero result in the RESET command | 222 | * FLR process. The only non-zero result in the RESET command |
| 223 | * is MLX4_DELAY_RESET_SLAVE*/ | 223 | * is MLX4_DELAY_RESET_SLAVE*/ |
| 224 | if ((MLX4_COMM_CMD_RESET == cmd)) { | 224 | if ((MLX4_COMM_CMD_RESET == cmd)) { |
| 225 | mlx4_warn(dev, "Got slave FLRed from Communication" | ||
| 226 | " channel (ret:0x%x)\n", ret_from_pending); | ||
| 227 | err = MLX4_DELAY_RESET_SLAVE; | 225 | err = MLX4_DELAY_RESET_SLAVE; |
| 228 | } else { | 226 | } else { |
| 229 | mlx4_warn(dev, "Communication channel timed out\n"); | 227 | mlx4_warn(dev, "Communication channel timed out\n"); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index b35f94700093..89c47ea84b50 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
| @@ -1323,6 +1323,7 @@ static void mlx4_en_auto_moderation(struct mlx4_en_priv *priv) | |||
| 1323 | priv->last_moder_time[ring] = moder_time; | 1323 | priv->last_moder_time[ring] = moder_time; |
| 1324 | cq = &priv->rx_cq[ring]; | 1324 | cq = &priv->rx_cq[ring]; |
| 1325 | cq->moder_time = moder_time; | 1325 | cq->moder_time = moder_time; |
| 1326 | cq->moder_cnt = priv->rx_frames; | ||
| 1326 | err = mlx4_en_set_cq_moder(priv, cq); | 1327 | err = mlx4_en_set_cq_moder(priv, cq); |
| 1327 | if (err) | 1328 | if (err) |
| 1328 | en_err(priv, "Failed modifying moderation for cq:%d\n", | 1329 | en_err(priv, "Failed modifying moderation for cq:%d\n", |
| @@ -2118,6 +2119,7 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | |||
| 2118 | struct mlx4_en_priv *priv; | 2119 | struct mlx4_en_priv *priv; |
| 2119 | int i; | 2120 | int i; |
| 2120 | int err; | 2121 | int err; |
| 2122 | u64 mac_u64; | ||
| 2121 | 2123 | ||
| 2122 | dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv), | 2124 | dev = alloc_etherdev_mqs(sizeof(struct mlx4_en_priv), |
| 2123 | MAX_TX_RINGS, MAX_RX_RINGS); | 2125 | MAX_TX_RINGS, MAX_RX_RINGS); |
| @@ -2191,10 +2193,17 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | |||
| 2191 | dev->addr_len = ETH_ALEN; | 2193 | dev->addr_len = ETH_ALEN; |
| 2192 | mlx4_en_u64_to_mac(dev->dev_addr, mdev->dev->caps.def_mac[priv->port]); | 2194 | mlx4_en_u64_to_mac(dev->dev_addr, mdev->dev->caps.def_mac[priv->port]); |
| 2193 | if (!is_valid_ether_addr(dev->dev_addr)) { | 2195 | if (!is_valid_ether_addr(dev->dev_addr)) { |
| 2194 | en_err(priv, "Port: %d, invalid mac burned: %pM, quiting\n", | 2196 | if (mlx4_is_slave(priv->mdev->dev)) { |
| 2195 | priv->port, dev->dev_addr); | 2197 | eth_hw_addr_random(dev); |
| 2196 | err = -EINVAL; | 2198 | en_warn(priv, "Assigned random MAC address %pM\n", dev->dev_addr); |
| 2197 | goto out; | 2199 | mac_u64 = mlx4_en_mac_to_u64(dev->dev_addr); |
| 2200 | mdev->dev->caps.def_mac[priv->port] = mac_u64; | ||
| 2201 | } else { | ||
| 2202 | en_err(priv, "Port: %d, invalid mac burned: %pM, quiting\n", | ||
| 2203 | priv->port, dev->dev_addr); | ||
| 2204 | err = -EINVAL; | ||
| 2205 | goto out; | ||
| 2206 | } | ||
| 2198 | } | 2207 | } |
| 2199 | 2208 | ||
| 2200 | memcpy(priv->prev_mac, dev->dev_addr, sizeof(priv->prev_mac)); | 2209 | memcpy(priv->prev_mac, dev->dev_addr, sizeof(priv->prev_mac)); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index 58a8e535d698..2c97901c6a6d 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c | |||
| @@ -840,12 +840,16 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave, | |||
| 840 | MLX4_CMD_NATIVE); | 840 | MLX4_CMD_NATIVE); |
| 841 | 841 | ||
| 842 | if (!err && dev->caps.function != slave) { | 842 | if (!err && dev->caps.function != slave) { |
| 843 | /* set slave default_mac address */ | ||
| 844 | MLX4_GET(def_mac, outbox->buf, QUERY_PORT_MAC_OFFSET); | ||
| 845 | def_mac += slave << 8; | ||
| 846 | /* if config MAC in DB use it */ | 843 | /* if config MAC in DB use it */ |
| 847 | if (priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac) | 844 | if (priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac) |
| 848 | def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac; | 845 | def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac; |
| 846 | else { | ||
| 847 | /* set slave default_mac address */ | ||
| 848 | MLX4_GET(def_mac, outbox->buf, QUERY_PORT_MAC_OFFSET); | ||
| 849 | def_mac += slave << 8; | ||
| 850 | priv->mfunc.master.vf_admin[slave].vport[vhcr->in_modifier].mac = def_mac; | ||
| 851 | } | ||
| 852 | |||
| 849 | MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET); | 853 | MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET); |
| 850 | 854 | ||
| 851 | /* get port type - currently only eth is enabled */ | 855 | /* get port type - currently only eth is enabled */ |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 0d32a82458bf..2f4a26039e80 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -1290,7 +1290,6 @@ static int mlx4_init_slave(struct mlx4_dev *dev) | |||
| 1290 | { | 1290 | { |
| 1291 | struct mlx4_priv *priv = mlx4_priv(dev); | 1291 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 1292 | u64 dma = (u64) priv->mfunc.vhcr_dma; | 1292 | u64 dma = (u64) priv->mfunc.vhcr_dma; |
| 1293 | int num_of_reset_retries = NUM_OF_RESET_RETRIES; | ||
| 1294 | int ret_from_reset = 0; | 1293 | int ret_from_reset = 0; |
| 1295 | u32 slave_read; | 1294 | u32 slave_read; |
| 1296 | u32 cmd_channel_ver; | 1295 | u32 cmd_channel_ver; |
| @@ -1304,18 +1303,10 @@ static int mlx4_init_slave(struct mlx4_dev *dev) | |||
| 1304 | * NUM_OF_RESET_RETRIES times before leaving.*/ | 1303 | * NUM_OF_RESET_RETRIES times before leaving.*/ |
| 1305 | if (ret_from_reset) { | 1304 | if (ret_from_reset) { |
| 1306 | if (MLX4_DELAY_RESET_SLAVE == ret_from_reset) { | 1305 | if (MLX4_DELAY_RESET_SLAVE == ret_from_reset) { |
| 1307 | msleep(SLEEP_TIME_IN_RESET); | 1306 | mlx4_warn(dev, "slave is currently in the " |
| 1308 | while (ret_from_reset && num_of_reset_retries) { | 1307 | "middle of FLR. Deferring probe.\n"); |
| 1309 | mlx4_warn(dev, "slave is currently in the" | 1308 | mutex_unlock(&priv->cmd.slave_cmd_mutex); |
| 1310 | "middle of FLR. retrying..." | 1309 | return -EPROBE_DEFER; |
| 1311 | "(try num:%d)\n", | ||
| 1312 | (NUM_OF_RESET_RETRIES - | ||
| 1313 | num_of_reset_retries + 1)); | ||
| 1314 | ret_from_reset = | ||
| 1315 | mlx4_comm_cmd(dev, MLX4_COMM_CMD_RESET, | ||
| 1316 | 0, MLX4_COMM_TIME); | ||
| 1317 | num_of_reset_retries = num_of_reset_retries - 1; | ||
| 1318 | } | ||
| 1319 | } else | 1310 | } else |
| 1320 | goto err; | 1311 | goto err; |
| 1321 | } | 1312 | } |
| @@ -1526,7 +1517,8 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
| 1526 | } else { | 1517 | } else { |
| 1527 | err = mlx4_init_slave(dev); | 1518 | err = mlx4_init_slave(dev); |
| 1528 | if (err) { | 1519 | if (err) { |
| 1529 | mlx4_err(dev, "Failed to initialize slave\n"); | 1520 | if (err != -EPROBE_DEFER) |
| 1521 | mlx4_err(dev, "Failed to initialize slave\n"); | ||
| 1530 | return err; | 1522 | return err; |
| 1531 | } | 1523 | } |
| 1532 | 1524 | ||
diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c index 50235d201592..f87cc216045b 100644 --- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c +++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c | |||
| @@ -4717,6 +4717,7 @@ static int qlge_probe(struct pci_dev *pdev, | |||
| 4717 | dev_err(&pdev->dev, "net device registration failed.\n"); | 4717 | dev_err(&pdev->dev, "net device registration failed.\n"); |
| 4718 | ql_release_all(pdev); | 4718 | ql_release_all(pdev); |
| 4719 | pci_disable_device(pdev); | 4719 | pci_disable_device(pdev); |
| 4720 | free_netdev(ndev); | ||
| 4720 | return err; | 4721 | return err; |
| 4721 | } | 4722 | } |
| 4722 | /* Start up the timer to trigger EEH if | 4723 | /* Start up the timer to trigger EEH if |
diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c b/drivers/net/ethernet/xilinx/xilinx_emaclite.c index 919b983114e9..b7268b3dae77 100644 --- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c +++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c | |||
| @@ -946,7 +946,8 @@ static int xemaclite_open(struct net_device *dev) | |||
| 946 | phy_write(lp->phy_dev, MII_CTRL1000, 0); | 946 | phy_write(lp->phy_dev, MII_CTRL1000, 0); |
| 947 | 947 | ||
| 948 | /* Advertise only 10 and 100mbps full/half duplex speeds */ | 948 | /* Advertise only 10 and 100mbps full/half duplex speeds */ |
| 949 | phy_write(lp->phy_dev, MII_ADVERTISE, ADVERTISE_ALL); | 949 | phy_write(lp->phy_dev, MII_ADVERTISE, ADVERTISE_ALL | |
| 950 | ADVERTISE_CSMA); | ||
| 950 | 951 | ||
| 951 | /* Restart auto negotiation */ | 952 | /* Restart auto negotiation */ |
| 952 | bmcr = phy_read(lp->phy_dev, MII_BMCR); | 953 | bmcr = phy_read(lp->phy_dev, MII_BMCR); |
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index 088c55496191..ab2307b5d9a7 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
| @@ -31,6 +31,7 @@ | |||
| 31 | #include <linux/inetdevice.h> | 31 | #include <linux/inetdevice.h> |
| 32 | #include <linux/etherdevice.h> | 32 | #include <linux/etherdevice.h> |
| 33 | #include <linux/skbuff.h> | 33 | #include <linux/skbuff.h> |
| 34 | #include <linux/if_vlan.h> | ||
| 34 | #include <linux/in.h> | 35 | #include <linux/in.h> |
| 35 | #include <linux/slab.h> | 36 | #include <linux/slab.h> |
| 36 | #include <net/arp.h> | 37 | #include <net/arp.h> |
| @@ -284,7 +285,7 @@ int netvsc_recv_callback(struct hv_device *device_obj, | |||
| 284 | 285 | ||
| 285 | skb->protocol = eth_type_trans(skb, net); | 286 | skb->protocol = eth_type_trans(skb, net); |
| 286 | skb->ip_summed = CHECKSUM_NONE; | 287 | skb->ip_summed = CHECKSUM_NONE; |
| 287 | skb->vlan_tci = packet->vlan_tci; | 288 | __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), packet->vlan_tci); |
| 288 | 289 | ||
| 289 | net->stats.rx_packets++; | 290 | net->stats.rx_packets++; |
| 290 | net->stats.rx_bytes += packet->total_data_buflen; | 291 | net->stats.rx_bytes += packet->total_data_buflen; |
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index c14f14741b3f..38f0b312ff85 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
| @@ -1044,7 +1044,7 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) | |||
| 1044 | adv = mmd_eee_adv_to_ethtool_adv_t(eee_adv); | 1044 | adv = mmd_eee_adv_to_ethtool_adv_t(eee_adv); |
| 1045 | lp = mmd_eee_adv_to_ethtool_adv_t(eee_lp); | 1045 | lp = mmd_eee_adv_to_ethtool_adv_t(eee_lp); |
| 1046 | idx = phy_find_setting(phydev->speed, phydev->duplex); | 1046 | idx = phy_find_setting(phydev->speed, phydev->duplex); |
| 1047 | if ((lp & adv & settings[idx].setting)) | 1047 | if (!(lp & adv & settings[idx].setting)) |
| 1048 | goto eee_exit; | 1048 | goto eee_exit; |
| 1049 | 1049 | ||
| 1050 | if (clk_stop_enable) { | 1050 | if (clk_stop_enable) { |
diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c index 7c43261975bd..d016a76ad44b 100644 --- a/drivers/net/team/team.c +++ b/drivers/net/team/team.c | |||
| @@ -2374,7 +2374,8 @@ static int team_nl_send_port_list_get(struct team *team, u32 portid, u32 seq, | |||
| 2374 | bool incomplete; | 2374 | bool incomplete; |
| 2375 | int i; | 2375 | int i; |
| 2376 | 2376 | ||
| 2377 | port = list_first_entry(&team->port_list, struct team_port, list); | 2377 | port = list_first_entry_or_null(&team->port_list, |
| 2378 | struct team_port, list); | ||
| 2378 | 2379 | ||
| 2379 | start_again: | 2380 | start_again: |
| 2380 | err = __send_and_alloc_skb(&skb, team, portid, send_func); | 2381 | err = __send_and_alloc_skb(&skb, team, portid, send_func); |
| @@ -2402,8 +2403,8 @@ start_again: | |||
| 2402 | err = team_nl_fill_one_port_get(skb, one_port); | 2403 | err = team_nl_fill_one_port_get(skb, one_port); |
| 2403 | if (err) | 2404 | if (err) |
| 2404 | goto errout; | 2405 | goto errout; |
| 2405 | } else { | 2406 | } else if (port) { |
| 2406 | list_for_each_entry(port, &team->port_list, list) { | 2407 | list_for_each_entry_from(port, &team->port_list, list) { |
| 2407 | err = team_nl_fill_one_port_get(skb, port); | 2408 | err = team_nl_fill_one_port_get(skb, port); |
| 2408 | if (err) { | 2409 | if (err) { |
| 2409 | if (err == -EMSGSIZE) { | 2410 | if (err == -EMSGSIZE) { |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index f042b0373e5d..89776c592151 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -1585,6 +1585,10 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
| 1585 | else | 1585 | else |
| 1586 | return -EINVAL; | 1586 | return -EINVAL; |
| 1587 | 1587 | ||
| 1588 | if (!!(ifr->ifr_flags & IFF_MULTI_QUEUE) != | ||
| 1589 | !!(tun->flags & TUN_TAP_MQ)) | ||
| 1590 | return -EINVAL; | ||
| 1591 | |||
| 1588 | if (tun_not_capable(tun)) | 1592 | if (tun_not_capable(tun)) |
| 1589 | return -EPERM; | 1593 | return -EPERM; |
| 1590 | err = security_tun_dev_open(tun->security); | 1594 | err = security_tun_dev_open(tun->security); |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h index 54ba42f4108a..874f6570bd1c 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h | |||
| @@ -68,13 +68,16 @@ | |||
| 68 | #define AR9300_BASE_ADDR 0x3ff | 68 | #define AR9300_BASE_ADDR 0x3ff |
| 69 | #define AR9300_BASE_ADDR_512 0x1ff | 69 | #define AR9300_BASE_ADDR_512 0x1ff |
| 70 | 70 | ||
| 71 | #define AR9300_OTP_BASE (AR_SREV_9340(ah) ? 0x30000 : 0x14000) | 71 | #define AR9300_OTP_BASE \ |
| 72 | #define AR9300_OTP_STATUS (AR_SREV_9340(ah) ? 0x30018 : 0x15f18) | 72 | ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30000 : 0x14000) |
| 73 | #define AR9300_OTP_STATUS \ | ||
| 74 | ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30018 : 0x15f18) | ||
| 73 | #define AR9300_OTP_STATUS_TYPE 0x7 | 75 | #define AR9300_OTP_STATUS_TYPE 0x7 |
| 74 | #define AR9300_OTP_STATUS_VALID 0x4 | 76 | #define AR9300_OTP_STATUS_VALID 0x4 |
| 75 | #define AR9300_OTP_STATUS_ACCESS_BUSY 0x2 | 77 | #define AR9300_OTP_STATUS_ACCESS_BUSY 0x2 |
| 76 | #define AR9300_OTP_STATUS_SM_BUSY 0x1 | 78 | #define AR9300_OTP_STATUS_SM_BUSY 0x1 |
| 77 | #define AR9300_OTP_READ_DATA (AR_SREV_9340(ah) ? 0x3001c : 0x15f1c) | 79 | #define AR9300_OTP_READ_DATA \ |
| 80 | ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x3001c : 0x15f1c) | ||
| 78 | 81 | ||
| 79 | enum targetPowerHTRates { | 82 | enum targetPowerHTRates { |
| 80 | HT_TARGET_RATE_0_8_16, | 83 | HT_TARGET_RATE_0_8_16, |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c index 2bf6548dd143..e1714d7c9eeb 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c | |||
| @@ -334,7 +334,8 @@ static void ar9003_hw_spur_ofdm(struct ath_hw *ah, | |||
| 334 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | 334 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, |
| 335 | AR_PHY_SPUR_REG_EN_VIT_SPUR_RSSI, 1); | 335 | AR_PHY_SPUR_REG_EN_VIT_SPUR_RSSI, 1); |
| 336 | 336 | ||
| 337 | if (REG_READ_FIELD(ah, AR_PHY_MODE, | 337 | if (!AR_SREV_9340(ah) && |
| 338 | REG_READ_FIELD(ah, AR_PHY_MODE, | ||
| 338 | AR_PHY_MODE_DYNAMIC) == 0x1) | 339 | AR_PHY_MODE_DYNAMIC) == 0x1) |
| 339 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | 340 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, |
| 340 | AR_PHY_SPUR_REG_ENABLE_NF_RSSI_SPUR_MIT, 1); | 341 | AR_PHY_SPUR_REG_ENABLE_NF_RSSI_SPUR_MIT, 1); |
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 366002f266f8..42b03dc39d14 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
| @@ -251,10 +251,9 @@ struct ath_atx_tid { | |||
| 251 | int tidno; | 251 | int tidno; |
| 252 | int baw_head; /* first un-acked tx buffer */ | 252 | int baw_head; /* first un-acked tx buffer */ |
| 253 | int baw_tail; /* next unused tx buffer slot */ | 253 | int baw_tail; /* next unused tx buffer slot */ |
| 254 | int sched; | 254 | bool sched; |
| 255 | int paused; | 255 | bool paused; |
| 256 | u8 state; | 256 | bool active; |
| 257 | bool stop_cb; | ||
| 258 | }; | 257 | }; |
| 259 | 258 | ||
| 260 | struct ath_node { | 259 | struct ath_node { |
| @@ -275,10 +274,6 @@ struct ath_node { | |||
| 275 | #endif | 274 | #endif |
| 276 | }; | 275 | }; |
| 277 | 276 | ||
| 278 | #define AGGR_CLEANUP BIT(1) | ||
| 279 | #define AGGR_ADDBA_COMPLETE BIT(2) | ||
| 280 | #define AGGR_ADDBA_PROGRESS BIT(3) | ||
| 281 | |||
| 282 | struct ath_tx_control { | 277 | struct ath_tx_control { |
| 283 | struct ath_txq *txq; | 278 | struct ath_txq *txq; |
| 284 | struct ath_node *an; | 279 | struct ath_node *an; |
| @@ -352,8 +347,7 @@ void ath_tx_tasklet(struct ath_softc *sc); | |||
| 352 | void ath_tx_edma_tasklet(struct ath_softc *sc); | 347 | void ath_tx_edma_tasklet(struct ath_softc *sc); |
| 353 | int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, | 348 | int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, |
| 354 | u16 tid, u16 *ssn); | 349 | u16 tid, u16 *ssn); |
| 355 | bool ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid, | 350 | void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); |
| 356 | bool flush); | ||
| 357 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); | 351 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid); |
| 358 | 352 | ||
| 359 | void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an); | 353 | void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an); |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 7f25da8444fe..15dfefcf2d0f 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -1172,6 +1172,7 @@ u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan) | |||
| 1172 | static inline void ath9k_hw_set_dma(struct ath_hw *ah) | 1172 | static inline void ath9k_hw_set_dma(struct ath_hw *ah) |
| 1173 | { | 1173 | { |
| 1174 | struct ath_common *common = ath9k_hw_common(ah); | 1174 | struct ath_common *common = ath9k_hw_common(ah); |
| 1175 | int txbuf_size; | ||
| 1175 | 1176 | ||
| 1176 | ENABLE_REGWRITE_BUFFER(ah); | 1177 | ENABLE_REGWRITE_BUFFER(ah); |
| 1177 | 1178 | ||
| @@ -1225,13 +1226,17 @@ static inline void ath9k_hw_set_dma(struct ath_hw *ah) | |||
| 1225 | * So set the usable tx buf size also to half to | 1226 | * So set the usable tx buf size also to half to |
| 1226 | * avoid data/delimiter underruns | 1227 | * avoid data/delimiter underruns |
| 1227 | */ | 1228 | */ |
| 1228 | REG_WRITE(ah, AR_PCU_TXBUF_CTRL, | 1229 | txbuf_size = AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE; |
| 1229 | AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE); | 1230 | } else if (AR_SREV_9340_13_OR_LATER(ah)) { |
| 1230 | } else if (!AR_SREV_9271(ah)) { | 1231 | /* Uses fewer entries for AR934x v1.3+ to prevent rx overruns */ |
| 1231 | REG_WRITE(ah, AR_PCU_TXBUF_CTRL, | 1232 | txbuf_size = AR_9340_PCU_TXBUF_CTRL_USABLE_SIZE; |
| 1232 | AR_PCU_TXBUF_CTRL_USABLE_SIZE); | 1233 | } else { |
| 1234 | txbuf_size = AR_PCU_TXBUF_CTRL_USABLE_SIZE; | ||
| 1233 | } | 1235 | } |
| 1234 | 1236 | ||
| 1237 | if (!AR_SREV_9271(ah)) | ||
| 1238 | REG_WRITE(ah, AR_PCU_TXBUF_CTRL, txbuf_size); | ||
| 1239 | |||
| 1235 | REGWRITE_BUFFER_FLUSH(ah); | 1240 | REGWRITE_BUFFER_FLUSH(ah); |
| 1236 | 1241 | ||
| 1237 | if (AR_SREV_9300_20_OR_LATER(ah)) | 1242 | if (AR_SREV_9300_20_OR_LATER(ah)) |
| @@ -1306,9 +1311,13 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type) | |||
| 1306 | AR_RTC_RC_COLD_RESET | AR_RTC_RC_WARM_RESET; | 1311 | AR_RTC_RC_COLD_RESET | AR_RTC_RC_WARM_RESET; |
| 1307 | } else { | 1312 | } else { |
| 1308 | tmpReg = REG_READ(ah, AR_INTR_SYNC_CAUSE); | 1313 | tmpReg = REG_READ(ah, AR_INTR_SYNC_CAUSE); |
| 1309 | if (tmpReg & | 1314 | if (AR_SREV_9340(ah)) |
| 1310 | (AR_INTR_SYNC_LOCAL_TIMEOUT | | 1315 | tmpReg &= AR9340_INTR_SYNC_LOCAL_TIMEOUT; |
| 1311 | AR_INTR_SYNC_RADM_CPL_TIMEOUT)) { | 1316 | else |
| 1317 | tmpReg &= AR_INTR_SYNC_LOCAL_TIMEOUT | | ||
| 1318 | AR_INTR_SYNC_RADM_CPL_TIMEOUT; | ||
| 1319 | |||
| 1320 | if (tmpReg) { | ||
| 1312 | u32 val; | 1321 | u32 val; |
| 1313 | REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0); | 1322 | REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0); |
| 1314 | 1323 | ||
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index 498fee04afa0..566109a40fb3 100644 --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c | |||
| @@ -410,7 +410,7 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
| 410 | 410 | ||
| 411 | REG_WRITE(ah, AR_QMISC(q), AR_Q_MISC_DCU_EARLY_TERM_REQ); | 411 | REG_WRITE(ah, AR_QMISC(q), AR_Q_MISC_DCU_EARLY_TERM_REQ); |
| 412 | 412 | ||
| 413 | if (AR_SREV_9340(ah)) | 413 | if (AR_SREV_9340(ah) && !AR_SREV_9340_13_OR_LATER(ah)) |
| 414 | REG_WRITE(ah, AR_DMISC(q), | 414 | REG_WRITE(ah, AR_DMISC(q), |
| 415 | AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x1); | 415 | AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x1); |
| 416 | else | 416 | else |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 2382d1262e7f..5092ecae7706 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
| @@ -1709,7 +1709,8 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw, | |||
| 1709 | flush = true; | 1709 | flush = true; |
| 1710 | case IEEE80211_AMPDU_TX_STOP_CONT: | 1710 | case IEEE80211_AMPDU_TX_STOP_CONT: |
| 1711 | ath9k_ps_wakeup(sc); | 1711 | ath9k_ps_wakeup(sc); |
| 1712 | if (ath_tx_aggr_stop(sc, sta, tid, flush)) | 1712 | ath_tx_aggr_stop(sc, sta, tid); |
| 1713 | if (!flush) | ||
| 1713 | ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); | 1714 | ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); |
| 1714 | ath9k_ps_restore(sc); | 1715 | ath9k_ps_restore(sc); |
| 1715 | break; | 1716 | break; |
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index aa4d368d8d3d..7eb1f4b458e4 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c | |||
| @@ -1227,10 +1227,7 @@ static bool ath_tx_aggr_check(struct ath_softc *sc, struct ieee80211_sta *sta, | |||
| 1227 | return false; | 1227 | return false; |
| 1228 | 1228 | ||
| 1229 | txtid = ATH_AN_2_TID(an, tidno); | 1229 | txtid = ATH_AN_2_TID(an, tidno); |
| 1230 | 1230 | return !txtid->active; | |
| 1231 | if (!(txtid->state & (AGGR_ADDBA_COMPLETE | AGGR_ADDBA_PROGRESS))) | ||
| 1232 | return true; | ||
| 1233 | return false; | ||
| 1234 | } | 1231 | } |
| 1235 | 1232 | ||
| 1236 | 1233 | ||
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h index 5c4ab5026dca..f7c90cc58d56 100644 --- a/drivers/net/wireless/ath/ath9k/reg.h +++ b/drivers/net/wireless/ath/ath9k/reg.h | |||
| @@ -798,6 +798,10 @@ | |||
| 798 | #define AR_SREV_REVISION_9485_10 0 | 798 | #define AR_SREV_REVISION_9485_10 0 |
| 799 | #define AR_SREV_REVISION_9485_11 1 | 799 | #define AR_SREV_REVISION_9485_11 1 |
| 800 | #define AR_SREV_VERSION_9340 0x300 | 800 | #define AR_SREV_VERSION_9340 0x300 |
| 801 | #define AR_SREV_REVISION_9340_10 0 | ||
| 802 | #define AR_SREV_REVISION_9340_11 1 | ||
| 803 | #define AR_SREV_REVISION_9340_12 2 | ||
| 804 | #define AR_SREV_REVISION_9340_13 3 | ||
| 801 | #define AR_SREV_VERSION_9580 0x1C0 | 805 | #define AR_SREV_VERSION_9580 0x1C0 |
| 802 | #define AR_SREV_REVISION_9580_10 4 /* AR9580 1.0 */ | 806 | #define AR_SREV_REVISION_9580_10 4 /* AR9580 1.0 */ |
| 803 | #define AR_SREV_VERSION_9462 0x280 | 807 | #define AR_SREV_VERSION_9462 0x280 |
| @@ -897,6 +901,10 @@ | |||
| 897 | #define AR_SREV_9340(_ah) \ | 901 | #define AR_SREV_9340(_ah) \ |
| 898 | (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9340)) | 902 | (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9340)) |
| 899 | 903 | ||
| 904 | #define AR_SREV_9340_13_OR_LATER(_ah) \ | ||
| 905 | (AR_SREV_9340((_ah)) && \ | ||
| 906 | ((_ah)->hw_version.macRev >= AR_SREV_REVISION_9340_13)) | ||
| 907 | |||
| 900 | #define AR_SREV_9285E_20(_ah) \ | 908 | #define AR_SREV_9285E_20(_ah) \ |
| 901 | (AR_SREV_9285_12_OR_LATER(_ah) && \ | 909 | (AR_SREV_9285_12_OR_LATER(_ah) && \ |
| 902 | ((REG_READ(_ah, AR_AN_SYNTH9) & 0x7) == 0x1)) | 910 | ((REG_READ(_ah, AR_AN_SYNTH9) & 0x7) == 0x1)) |
| @@ -1007,6 +1015,8 @@ enum { | |||
| 1007 | AR_INTR_SYNC_LOCAL_TIMEOUT | | 1015 | AR_INTR_SYNC_LOCAL_TIMEOUT | |
| 1008 | AR_INTR_SYNC_MAC_SLEEP_ACCESS), | 1016 | AR_INTR_SYNC_MAC_SLEEP_ACCESS), |
| 1009 | 1017 | ||
| 1018 | AR9340_INTR_SYNC_LOCAL_TIMEOUT = 0x00000010, | ||
| 1019 | |||
| 1010 | AR_INTR_SYNC_SPURIOUS = 0xFFFFFFFF, | 1020 | AR_INTR_SYNC_SPURIOUS = 0xFFFFFFFF, |
| 1011 | 1021 | ||
| 1012 | }; | 1022 | }; |
| @@ -1881,6 +1891,7 @@ enum { | |||
| 1881 | #define AR_PCU_TXBUF_CTRL_SIZE_MASK 0x7FF | 1891 | #define AR_PCU_TXBUF_CTRL_SIZE_MASK 0x7FF |
| 1882 | #define AR_PCU_TXBUF_CTRL_USABLE_SIZE 0x700 | 1892 | #define AR_PCU_TXBUF_CTRL_USABLE_SIZE 0x700 |
| 1883 | #define AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE 0x380 | 1893 | #define AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE 0x380 |
| 1894 | #define AR_9340_PCU_TXBUF_CTRL_USABLE_SIZE 0x500 | ||
| 1884 | 1895 | ||
| 1885 | #define AR_PCU_MISC_MODE2 0x8344 | 1896 | #define AR_PCU_MISC_MODE2 0x8344 |
| 1886 | #define AR_PCU_MISC_MODE2_MGMT_CRYPTO_ENABLE 0x00000002 | 1897 | #define AR_PCU_MISC_MODE2_MGMT_CRYPTO_ENABLE 0x00000002 |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 14bb3354ea64..1c9b1bac8b0d 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
| @@ -125,24 +125,6 @@ static void ath_tx_queue_tid(struct ath_txq *txq, struct ath_atx_tid *tid) | |||
| 125 | list_add_tail(&ac->list, &txq->axq_acq); | 125 | list_add_tail(&ac->list, &txq->axq_acq); |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | static void ath_tx_resume_tid(struct ath_softc *sc, struct ath_atx_tid *tid) | ||
| 129 | { | ||
| 130 | struct ath_txq *txq = tid->ac->txq; | ||
| 131 | |||
| 132 | WARN_ON(!tid->paused); | ||
| 133 | |||
| 134 | ath_txq_lock(sc, txq); | ||
| 135 | tid->paused = false; | ||
| 136 | |||
| 137 | if (skb_queue_empty(&tid->buf_q)) | ||
| 138 | goto unlock; | ||
| 139 | |||
| 140 | ath_tx_queue_tid(txq, tid); | ||
| 141 | ath_txq_schedule(sc, txq); | ||
| 142 | unlock: | ||
| 143 | ath_txq_unlock_complete(sc, txq); | ||
| 144 | } | ||
| 145 | |||
| 146 | static struct ath_frame_info *get_frame_info(struct sk_buff *skb) | 128 | static struct ath_frame_info *get_frame_info(struct sk_buff *skb) |
| 147 | { | 129 | { |
| 148 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); | 130 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); |
| @@ -164,20 +146,7 @@ static void ath_set_rates(struct ieee80211_vif *vif, struct ieee80211_sta *sta, | |||
| 164 | ARRAY_SIZE(bf->rates)); | 146 | ARRAY_SIZE(bf->rates)); |
| 165 | } | 147 | } |
| 166 | 148 | ||
| 167 | static void ath_tx_clear_tid(struct ath_softc *sc, struct ath_atx_tid *tid) | 149 | static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) |
| 168 | { | ||
| 169 | tid->state &= ~AGGR_ADDBA_COMPLETE; | ||
| 170 | tid->state &= ~AGGR_CLEANUP; | ||
| 171 | if (!tid->stop_cb) | ||
| 172 | return; | ||
| 173 | |||
| 174 | ieee80211_start_tx_ba_cb_irqsafe(tid->an->vif, tid->an->sta->addr, | ||
| 175 | tid->tidno); | ||
| 176 | tid->stop_cb = false; | ||
| 177 | } | ||
| 178 | |||
| 179 | static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid, | ||
| 180 | bool flush_packets) | ||
| 181 | { | 150 | { |
| 182 | struct ath_txq *txq = tid->ac->txq; | 151 | struct ath_txq *txq = tid->ac->txq; |
| 183 | struct sk_buff *skb; | 152 | struct sk_buff *skb; |
| @@ -194,15 +163,16 @@ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
| 194 | while ((skb = __skb_dequeue(&tid->buf_q))) { | 163 | while ((skb = __skb_dequeue(&tid->buf_q))) { |
| 195 | fi = get_frame_info(skb); | 164 | fi = get_frame_info(skb); |
| 196 | bf = fi->bf; | 165 | bf = fi->bf; |
| 197 | if (!bf && !flush_packets) | ||
| 198 | bf = ath_tx_setup_buffer(sc, txq, tid, skb); | ||
| 199 | 166 | ||
| 200 | if (!bf) { | 167 | if (!bf) { |
| 201 | ieee80211_free_txskb(sc->hw, skb); | 168 | bf = ath_tx_setup_buffer(sc, txq, tid, skb); |
| 202 | continue; | 169 | if (!bf) { |
| 170 | ieee80211_free_txskb(sc->hw, skb); | ||
| 171 | continue; | ||
| 172 | } | ||
| 203 | } | 173 | } |
| 204 | 174 | ||
| 205 | if (fi->retries || flush_packets) { | 175 | if (fi->retries) { |
| 206 | list_add_tail(&bf->list, &bf_head); | 176 | list_add_tail(&bf->list, &bf_head); |
| 207 | ath_tx_update_baw(sc, tid, bf->bf_state.seqno); | 177 | ath_tx_update_baw(sc, tid, bf->bf_state.seqno); |
| 208 | ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); | 178 | ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); |
| @@ -213,10 +183,7 @@ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
| 213 | } | 183 | } |
| 214 | } | 184 | } |
| 215 | 185 | ||
| 216 | if (tid->baw_head == tid->baw_tail) | 186 | if (sendbar) { |
| 217 | ath_tx_clear_tid(sc, tid); | ||
| 218 | |||
| 219 | if (sendbar && !flush_packets) { | ||
| 220 | ath_txq_unlock(sc, txq); | 187 | ath_txq_unlock(sc, txq); |
| 221 | ath_send_bar(tid, tid->seq_start); | 188 | ath_send_bar(tid, tid->seq_start); |
| 222 | ath_txq_lock(sc, txq); | 189 | ath_txq_lock(sc, txq); |
| @@ -499,19 +466,19 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
| 499 | tx_info = IEEE80211_SKB_CB(skb); | 466 | tx_info = IEEE80211_SKB_CB(skb); |
| 500 | fi = get_frame_info(skb); | 467 | fi = get_frame_info(skb); |
| 501 | 468 | ||
| 502 | if (ATH_BA_ISSET(ba, ATH_BA_INDEX(seq_st, seqno))) { | 469 | if (!BAW_WITHIN(tid->seq_start, tid->baw_size, seqno)) { |
| 470 | /* | ||
| 471 | * Outside of the current BlockAck window, | ||
| 472 | * maybe part of a previous session | ||
| 473 | */ | ||
| 474 | txfail = 1; | ||
| 475 | } else if (ATH_BA_ISSET(ba, ATH_BA_INDEX(seq_st, seqno))) { | ||
| 503 | /* transmit completion, subframe is | 476 | /* transmit completion, subframe is |
| 504 | * acked by block ack */ | 477 | * acked by block ack */ |
| 505 | acked_cnt++; | 478 | acked_cnt++; |
| 506 | } else if (!isaggr && txok) { | 479 | } else if (!isaggr && txok) { |
| 507 | /* transmit completion */ | 480 | /* transmit completion */ |
| 508 | acked_cnt++; | 481 | acked_cnt++; |
| 509 | } else if (tid->state & AGGR_CLEANUP) { | ||
| 510 | /* | ||
| 511 | * cleanup in progress, just fail | ||
| 512 | * the un-acked sub-frames | ||
| 513 | */ | ||
| 514 | txfail = 1; | ||
| 515 | } else if (flush) { | 482 | } else if (flush) { |
| 516 | txpending = 1; | 483 | txpending = 1; |
| 517 | } else if (fi->retries < ATH_MAX_SW_RETRIES) { | 484 | } else if (fi->retries < ATH_MAX_SW_RETRIES) { |
| @@ -535,7 +502,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
| 535 | if (bf_next != NULL || !bf_last->bf_stale) | 502 | if (bf_next != NULL || !bf_last->bf_stale) |
| 536 | list_move_tail(&bf->list, &bf_head); | 503 | list_move_tail(&bf->list, &bf_head); |
| 537 | 504 | ||
| 538 | if (!txpending || (tid->state & AGGR_CLEANUP)) { | 505 | if (!txpending) { |
| 539 | /* | 506 | /* |
| 540 | * complete the acked-ones/xretried ones; update | 507 | * complete the acked-ones/xretried ones; update |
| 541 | * block-ack window | 508 | * block-ack window |
| @@ -609,9 +576,6 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
| 609 | ath_txq_lock(sc, txq); | 576 | ath_txq_lock(sc, txq); |
| 610 | } | 577 | } |
| 611 | 578 | ||
| 612 | if (tid->state & AGGR_CLEANUP) | ||
| 613 | ath_tx_flush_tid(sc, tid, false); | ||
| 614 | |||
| 615 | rcu_read_unlock(); | 579 | rcu_read_unlock(); |
| 616 | 580 | ||
| 617 | if (needreset) | 581 | if (needreset) |
| @@ -1244,9 +1208,6 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, | |||
| 1244 | an = (struct ath_node *)sta->drv_priv; | 1208 | an = (struct ath_node *)sta->drv_priv; |
| 1245 | txtid = ATH_AN_2_TID(an, tid); | 1209 | txtid = ATH_AN_2_TID(an, tid); |
| 1246 | 1210 | ||
| 1247 | if (txtid->state & (AGGR_CLEANUP | AGGR_ADDBA_COMPLETE)) | ||
| 1248 | return -EAGAIN; | ||
| 1249 | |||
| 1250 | /* update ampdu factor/density, they may have changed. This may happen | 1211 | /* update ampdu factor/density, they may have changed. This may happen |
| 1251 | * in HT IBSS when a beacon with HT-info is received after the station | 1212 | * in HT IBSS when a beacon with HT-info is received after the station |
| 1252 | * has already been added. | 1213 | * has already been added. |
| @@ -1258,7 +1219,7 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, | |||
| 1258 | an->mpdudensity = density; | 1219 | an->mpdudensity = density; |
| 1259 | } | 1220 | } |
| 1260 | 1221 | ||
| 1261 | txtid->state |= AGGR_ADDBA_PROGRESS; | 1222 | txtid->active = true; |
| 1262 | txtid->paused = true; | 1223 | txtid->paused = true; |
| 1263 | *ssn = txtid->seq_start = txtid->seq_next; | 1224 | *ssn = txtid->seq_start = txtid->seq_next; |
| 1264 | txtid->bar_index = -1; | 1225 | txtid->bar_index = -1; |
| @@ -1269,45 +1230,17 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, | |||
| 1269 | return 0; | 1230 | return 0; |
| 1270 | } | 1231 | } |
| 1271 | 1232 | ||
| 1272 | bool ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid, | 1233 | void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid) |
| 1273 | bool flush) | ||
| 1274 | { | 1234 | { |
| 1275 | struct ath_node *an = (struct ath_node *)sta->drv_priv; | 1235 | struct ath_node *an = (struct ath_node *)sta->drv_priv; |
| 1276 | struct ath_atx_tid *txtid = ATH_AN_2_TID(an, tid); | 1236 | struct ath_atx_tid *txtid = ATH_AN_2_TID(an, tid); |
| 1277 | struct ath_txq *txq = txtid->ac->txq; | 1237 | struct ath_txq *txq = txtid->ac->txq; |
| 1278 | bool ret = !flush; | ||
| 1279 | |||
| 1280 | if (flush) | ||
| 1281 | txtid->stop_cb = false; | ||
| 1282 | |||
| 1283 | if (txtid->state & AGGR_CLEANUP) | ||
| 1284 | return false; | ||
| 1285 | |||
| 1286 | if (!(txtid->state & AGGR_ADDBA_COMPLETE)) { | ||
| 1287 | txtid->state &= ~AGGR_ADDBA_PROGRESS; | ||
| 1288 | return ret; | ||
| 1289 | } | ||
| 1290 | 1238 | ||
| 1291 | ath_txq_lock(sc, txq); | 1239 | ath_txq_lock(sc, txq); |
| 1240 | txtid->active = false; | ||
| 1292 | txtid->paused = true; | 1241 | txtid->paused = true; |
| 1293 | 1242 | ath_tx_flush_tid(sc, txtid); | |
| 1294 | /* | ||
| 1295 | * If frames are still being transmitted for this TID, they will be | ||
| 1296 | * cleaned up during tx completion. To prevent race conditions, this | ||
| 1297 | * TID can only be reused after all in-progress subframes have been | ||
| 1298 | * completed. | ||
| 1299 | */ | ||
| 1300 | if (txtid->baw_head != txtid->baw_tail) { | ||
| 1301 | txtid->state |= AGGR_CLEANUP; | ||
| 1302 | ret = false; | ||
| 1303 | txtid->stop_cb = !flush; | ||
| 1304 | } else { | ||
| 1305 | txtid->state &= ~AGGR_ADDBA_COMPLETE; | ||
| 1306 | } | ||
| 1307 | |||
| 1308 | ath_tx_flush_tid(sc, txtid, flush); | ||
| 1309 | ath_txq_unlock_complete(sc, txq); | 1243 | ath_txq_unlock_complete(sc, txq); |
| 1310 | return ret; | ||
| 1311 | } | 1244 | } |
| 1312 | 1245 | ||
| 1313 | void ath_tx_aggr_sleep(struct ieee80211_sta *sta, struct ath_softc *sc, | 1246 | void ath_tx_aggr_sleep(struct ieee80211_sta *sta, struct ath_softc *sc, |
| @@ -1371,18 +1304,28 @@ void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an) | |||
| 1371 | } | 1304 | } |
| 1372 | } | 1305 | } |
| 1373 | 1306 | ||
| 1374 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid) | 1307 | void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta, |
| 1308 | u16 tidno) | ||
| 1375 | { | 1309 | { |
| 1376 | struct ath_atx_tid *txtid; | 1310 | struct ath_atx_tid *tid; |
| 1377 | struct ath_node *an; | 1311 | struct ath_node *an; |
| 1312 | struct ath_txq *txq; | ||
| 1378 | 1313 | ||
| 1379 | an = (struct ath_node *)sta->drv_priv; | 1314 | an = (struct ath_node *)sta->drv_priv; |
| 1315 | tid = ATH_AN_2_TID(an, tidno); | ||
| 1316 | txq = tid->ac->txq; | ||
| 1380 | 1317 | ||
| 1381 | txtid = ATH_AN_2_TID(an, tid); | 1318 | ath_txq_lock(sc, txq); |
| 1382 | txtid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; | 1319 | |
| 1383 | txtid->state |= AGGR_ADDBA_COMPLETE; | 1320 | tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor; |
| 1384 | txtid->state &= ~AGGR_ADDBA_PROGRESS; | 1321 | tid->paused = false; |
| 1385 | ath_tx_resume_tid(sc, txtid); | 1322 | |
| 1323 | if (!skb_queue_empty(&tid->buf_q)) { | ||
| 1324 | ath_tx_queue_tid(txq, tid); | ||
| 1325 | ath_txq_schedule(sc, txq); | ||
| 1326 | } | ||
| 1327 | |||
| 1328 | ath_txq_unlock_complete(sc, txq); | ||
| 1386 | } | 1329 | } |
| 1387 | 1330 | ||
| 1388 | /********************/ | 1331 | /********************/ |
| @@ -2431,13 +2374,10 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an) | |||
| 2431 | tid->baw_head = tid->baw_tail = 0; | 2374 | tid->baw_head = tid->baw_tail = 0; |
| 2432 | tid->sched = false; | 2375 | tid->sched = false; |
| 2433 | tid->paused = false; | 2376 | tid->paused = false; |
| 2434 | tid->state &= ~AGGR_CLEANUP; | 2377 | tid->active = false; |
| 2435 | __skb_queue_head_init(&tid->buf_q); | 2378 | __skb_queue_head_init(&tid->buf_q); |
| 2436 | acno = TID_TO_WME_AC(tidno); | 2379 | acno = TID_TO_WME_AC(tidno); |
| 2437 | tid->ac = &an->ac[acno]; | 2380 | tid->ac = &an->ac[acno]; |
| 2438 | tid->state &= ~AGGR_ADDBA_COMPLETE; | ||
| 2439 | tid->state &= ~AGGR_ADDBA_PROGRESS; | ||
| 2440 | tid->stop_cb = false; | ||
| 2441 | } | 2381 | } |
| 2442 | 2382 | ||
| 2443 | for (acno = 0, ac = &an->ac[acno]; | 2383 | for (acno = 0, ac = &an->ac[acno]; |
| @@ -2474,7 +2414,7 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an) | |||
| 2474 | } | 2414 | } |
| 2475 | 2415 | ||
| 2476 | ath_tid_drain(sc, txq, tid); | 2416 | ath_tid_drain(sc, txq, tid); |
| 2477 | ath_tx_clear_tid(sc, tid); | 2417 | tid->active = false; |
| 2478 | 2418 | ||
| 2479 | ath_txq_unlock(sc, txq); | 2419 | ath_txq_unlock(sc, txq); |
| 2480 | } | 2420 | } |
diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c index 830bb1d1f957..b827d51c30a3 100644 --- a/drivers/net/wireless/atmel.c +++ b/drivers/net/wireless/atmel.c | |||
| @@ -1624,7 +1624,7 @@ struct net_device *init_atmel_card(unsigned short irq, unsigned long port, | |||
| 1624 | 1624 | ||
| 1625 | netif_carrier_off(dev); | 1625 | netif_carrier_off(dev); |
| 1626 | 1626 | ||
| 1627 | if (!proc_create_data("driver/atmel", 0, NULL, &atmel_proc_fops, priv)); | 1627 | if (!proc_create_data("driver/atmel", 0, NULL, &atmel_proc_fops, priv)) |
| 1628 | printk(KERN_WARNING "atmel: unable to create /proc entry.\n"); | 1628 | printk(KERN_WARNING "atmel: unable to create /proc entry.\n"); |
| 1629 | 1629 | ||
| 1630 | printk(KERN_INFO "%s: Atmel at76c50x. Version %d.%d. MAC %pM\n", | 1630 | printk(KERN_INFO "%s: Atmel at76c50x. Version %d.%d. MAC %pM\n", |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c index be0787cab24f..9431af2465f3 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c | |||
| @@ -27,7 +27,6 @@ | |||
| 27 | #include "tracepoint.h" | 27 | #include "tracepoint.h" |
| 28 | 28 | ||
| 29 | #define PKTFILTER_BUF_SIZE 128 | 29 | #define PKTFILTER_BUF_SIZE 128 |
| 30 | #define BRCMF_ARPOL_MODE 0xb /* agent|snoop|peer_autoreply */ | ||
| 31 | #define BRCMF_DEFAULT_BCN_TIMEOUT 3 | 30 | #define BRCMF_DEFAULT_BCN_TIMEOUT 3 |
| 32 | #define BRCMF_DEFAULT_SCAN_CHANNEL_TIME 40 | 31 | #define BRCMF_DEFAULT_SCAN_CHANNEL_TIME 40 |
| 33 | #define BRCMF_DEFAULT_SCAN_UNASSOC_TIME 40 | 32 | #define BRCMF_DEFAULT_SCAN_UNASSOC_TIME 40 |
| @@ -338,23 +337,6 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) | |||
| 338 | goto done; | 337 | goto done; |
| 339 | } | 338 | } |
| 340 | 339 | ||
| 341 | /* Try to set and enable ARP offload feature, this may fail */ | ||
| 342 | err = brcmf_fil_iovar_int_set(ifp, "arp_ol", BRCMF_ARPOL_MODE); | ||
| 343 | if (err) { | ||
| 344 | brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n", | ||
| 345 | BRCMF_ARPOL_MODE, err); | ||
| 346 | err = 0; | ||
| 347 | } else { | ||
| 348 | err = brcmf_fil_iovar_int_set(ifp, "arpoe", 1); | ||
| 349 | if (err) { | ||
| 350 | brcmf_dbg(TRACE, "failed to enable ARP offload err = %d\n", | ||
| 351 | err); | ||
| 352 | err = 0; | ||
| 353 | } else | ||
| 354 | brcmf_dbg(TRACE, "successfully enabled ARP offload to 0x%x\n", | ||
| 355 | BRCMF_ARPOL_MODE); | ||
| 356 | } | ||
| 357 | |||
| 358 | /* Setup packet filter */ | 340 | /* Setup packet filter */ |
| 359 | brcmf_c_pktfilter_offload_set(ifp, BRCMF_DEFAULT_PACKET_FILTER); | 341 | brcmf_c_pktfilter_offload_set(ifp, BRCMF_DEFAULT_PACKET_FILTER); |
| 360 | brcmf_c_pktfilter_offload_enable(ifp, BRCMF_DEFAULT_PACKET_FILTER, | 342 | brcmf_c_pktfilter_offload_enable(ifp, BRCMF_DEFAULT_PACKET_FILTER, |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c index 59c25463e428..b98f2235978e 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c | |||
| @@ -653,10 +653,13 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked) | |||
| 653 | 653 | ||
| 654 | brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name); | 654 | brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name); |
| 655 | 655 | ||
| 656 | ndev->destructor = free_netdev; | ||
| 656 | return 0; | 657 | return 0; |
| 657 | 658 | ||
| 658 | fail: | 659 | fail: |
| 660 | drvr->iflist[ifp->bssidx] = NULL; | ||
| 659 | ndev->netdev_ops = NULL; | 661 | ndev->netdev_ops = NULL; |
| 662 | free_netdev(ndev); | ||
| 660 | return -EBADE; | 663 | return -EBADE; |
| 661 | } | 664 | } |
| 662 | 665 | ||
| @@ -720,6 +723,9 @@ static int brcmf_net_p2p_attach(struct brcmf_if *ifp) | |||
| 720 | return 0; | 723 | return 0; |
| 721 | 724 | ||
| 722 | fail: | 725 | fail: |
| 726 | ifp->drvr->iflist[ifp->bssidx] = NULL; | ||
| 727 | ndev->netdev_ops = NULL; | ||
| 728 | free_netdev(ndev); | ||
| 723 | return -EBADE; | 729 | return -EBADE; |
| 724 | } | 730 | } |
| 725 | 731 | ||
| @@ -788,6 +794,7 @@ void brcmf_del_if(struct brcmf_pub *drvr, s32 bssidx) | |||
| 788 | struct brcmf_if *ifp; | 794 | struct brcmf_if *ifp; |
| 789 | 795 | ||
| 790 | ifp = drvr->iflist[bssidx]; | 796 | ifp = drvr->iflist[bssidx]; |
| 797 | drvr->iflist[bssidx] = NULL; | ||
| 791 | if (!ifp) { | 798 | if (!ifp) { |
| 792 | brcmf_err("Null interface, idx=%d\n", bssidx); | 799 | brcmf_err("Null interface, idx=%d\n", bssidx); |
| 793 | return; | 800 | return; |
| @@ -808,15 +815,13 @@ void brcmf_del_if(struct brcmf_pub *drvr, s32 bssidx) | |||
| 808 | cancel_work_sync(&ifp->setmacaddr_work); | 815 | cancel_work_sync(&ifp->setmacaddr_work); |
| 809 | cancel_work_sync(&ifp->multicast_work); | 816 | cancel_work_sync(&ifp->multicast_work); |
| 810 | } | 817 | } |
| 811 | 818 | /* unregister will take care of freeing it */ | |
| 812 | unregister_netdev(ifp->ndev); | 819 | unregister_netdev(ifp->ndev); |
| 813 | if (bssidx == 0) | 820 | if (bssidx == 0) |
| 814 | brcmf_cfg80211_detach(drvr->config); | 821 | brcmf_cfg80211_detach(drvr->config); |
| 815 | free_netdev(ifp->ndev); | ||
| 816 | } else { | 822 | } else { |
| 817 | kfree(ifp); | 823 | kfree(ifp); |
| 818 | } | 824 | } |
| 819 | drvr->iflist[bssidx] = NULL; | ||
| 820 | } | 825 | } |
| 821 | 826 | ||
| 822 | int brcmf_attach(uint bus_hdrlen, struct device *dev) | 827 | int brcmf_attach(uint bus_hdrlen, struct device *dev) |
| @@ -925,8 +930,6 @@ fail: | |||
| 925 | brcmf_fws_del_interface(ifp); | 930 | brcmf_fws_del_interface(ifp); |
| 926 | brcmf_fws_deinit(drvr); | 931 | brcmf_fws_deinit(drvr); |
| 927 | } | 932 | } |
| 928 | free_netdev(ifp->ndev); | ||
| 929 | drvr->iflist[0] = NULL; | ||
| 930 | if (p2p_ifp) { | 933 | if (p2p_ifp) { |
| 931 | free_netdev(p2p_ifp->ndev); | 934 | free_netdev(p2p_ifp->ndev); |
| 932 | drvr->iflist[1] = NULL; | 935 | drvr->iflist[1] = NULL; |
| @@ -934,7 +937,8 @@ fail: | |||
| 934 | return ret; | 937 | return ret; |
| 935 | } | 938 | } |
| 936 | if ((brcmf_p2p_enable) && (p2p_ifp)) | 939 | if ((brcmf_p2p_enable) && (p2p_ifp)) |
| 937 | brcmf_net_p2p_attach(p2p_ifp); | 940 | if (brcmf_net_p2p_attach(p2p_ifp) < 0) |
| 941 | brcmf_p2p_enable = 0; | ||
| 938 | 942 | ||
| 939 | return 0; | 943 | return 0; |
| 940 | } | 944 | } |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c index 5a64280e6485..83ee53a7c76e 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/fweh.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/fweh.c | |||
| @@ -202,7 +202,8 @@ static void brcmf_fweh_handle_if_event(struct brcmf_pub *drvr, | |||
| 202 | return; | 202 | return; |
| 203 | brcmf_fws_add_interface(ifp); | 203 | brcmf_fws_add_interface(ifp); |
| 204 | if (!drvr->fweh.evt_handler[BRCMF_E_IF]) | 204 | if (!drvr->fweh.evt_handler[BRCMF_E_IF]) |
| 205 | err = brcmf_net_attach(ifp, false); | 205 | if (brcmf_net_attach(ifp, false) < 0) |
| 206 | return; | ||
| 206 | } | 207 | } |
| 207 | 208 | ||
| 208 | if (ifevent->action == BRCMF_E_IF_CHANGE) | 209 | if (ifevent->action == BRCMF_E_IF_CHANGE) |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h index 0f2c83bc95dc..665ef69e974b 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h | |||
| @@ -23,6 +23,12 @@ | |||
| 23 | 23 | ||
| 24 | #define BRCMF_FIL_ACTION_FRAME_SIZE 1800 | 24 | #define BRCMF_FIL_ACTION_FRAME_SIZE 1800 |
| 25 | 25 | ||
| 26 | /* ARP Offload feature flags for arp_ol iovar */ | ||
| 27 | #define BRCMF_ARP_OL_AGENT 0x00000001 | ||
| 28 | #define BRCMF_ARP_OL_SNOOP 0x00000002 | ||
| 29 | #define BRCMF_ARP_OL_HOST_AUTO_REPLY 0x00000004 | ||
| 30 | #define BRCMF_ARP_OL_PEER_AUTO_REPLY 0x00000008 | ||
| 31 | |||
| 26 | 32 | ||
| 27 | enum brcmf_fil_p2p_if_types { | 33 | enum brcmf_fil_p2p_if_types { |
| 28 | BRCMF_FIL_P2P_IF_CLIENT, | 34 | BRCMF_FIL_P2P_IF_CLIENT, |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c index e7a1a4770996..79555f006d53 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c | |||
| @@ -47,6 +47,7 @@ | |||
| 47 | #define IS_P2P_SOCIAL_CHANNEL(channel) ((channel == SOCIAL_CHAN_1) || \ | 47 | #define IS_P2P_SOCIAL_CHANNEL(channel) ((channel == SOCIAL_CHAN_1) || \ |
| 48 | (channel == SOCIAL_CHAN_2) || \ | 48 | (channel == SOCIAL_CHAN_2) || \ |
| 49 | (channel == SOCIAL_CHAN_3)) | 49 | (channel == SOCIAL_CHAN_3)) |
| 50 | #define BRCMF_P2P_TEMP_CHAN SOCIAL_CHAN_3 | ||
| 50 | #define SOCIAL_CHAN_CNT 3 | 51 | #define SOCIAL_CHAN_CNT 3 |
| 51 | #define AF_PEER_SEARCH_CNT 2 | 52 | #define AF_PEER_SEARCH_CNT 2 |
| 52 | 53 | ||
| @@ -1954,21 +1955,21 @@ s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg) | |||
| 1954 | err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1); | 1955 | err = brcmf_fil_iovar_int_set(pri_ifp, "p2p_disc", 1); |
| 1955 | if (err < 0) { | 1956 | if (err < 0) { |
| 1956 | brcmf_err("set p2p_disc error\n"); | 1957 | brcmf_err("set p2p_disc error\n"); |
| 1957 | brcmf_free_vif(p2p_vif); | 1958 | brcmf_free_vif(cfg, p2p_vif); |
| 1958 | goto exit; | 1959 | goto exit; |
| 1959 | } | 1960 | } |
| 1960 | /* obtain bsscfg index for P2P discovery */ | 1961 | /* obtain bsscfg index for P2P discovery */ |
| 1961 | err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx); | 1962 | err = brcmf_fil_iovar_int_get(pri_ifp, "p2p_dev", &bssidx); |
| 1962 | if (err < 0) { | 1963 | if (err < 0) { |
| 1963 | brcmf_err("retrieving discover bsscfg index failed\n"); | 1964 | brcmf_err("retrieving discover bsscfg index failed\n"); |
| 1964 | brcmf_free_vif(p2p_vif); | 1965 | brcmf_free_vif(cfg, p2p_vif); |
| 1965 | goto exit; | 1966 | goto exit; |
| 1966 | } | 1967 | } |
| 1967 | /* Verify that firmware uses same bssidx as driver !! */ | 1968 | /* Verify that firmware uses same bssidx as driver !! */ |
| 1968 | if (p2p_ifp->bssidx != bssidx) { | 1969 | if (p2p_ifp->bssidx != bssidx) { |
| 1969 | brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n", | 1970 | brcmf_err("Incorrect bssidx=%d, compared to p2p_ifp->bssidx=%d\n", |
| 1970 | bssidx, p2p_ifp->bssidx); | 1971 | bssidx, p2p_ifp->bssidx); |
| 1971 | brcmf_free_vif(p2p_vif); | 1972 | brcmf_free_vif(cfg, p2p_vif); |
| 1972 | goto exit; | 1973 | goto exit; |
| 1973 | } | 1974 | } |
| 1974 | 1975 | ||
| @@ -1996,7 +1997,7 @@ void brcmf_p2p_detach(struct brcmf_p2p_info *p2p) | |||
| 1996 | brcmf_p2p_cancel_remain_on_channel(vif->ifp); | 1997 | brcmf_p2p_cancel_remain_on_channel(vif->ifp); |
| 1997 | brcmf_p2p_deinit_discovery(p2p); | 1998 | brcmf_p2p_deinit_discovery(p2p); |
| 1998 | /* remove discovery interface */ | 1999 | /* remove discovery interface */ |
| 1999 | brcmf_free_vif(vif); | 2000 | brcmf_free_vif(p2p->cfg, vif); |
| 2000 | p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; | 2001 | p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; |
| 2001 | } | 2002 | } |
| 2002 | /* just set it all to zero */ | 2003 | /* just set it all to zero */ |
| @@ -2013,17 +2014,30 @@ static void brcmf_p2p_get_current_chanspec(struct brcmf_p2p_info *p2p, | |||
| 2013 | u16 *chanspec) | 2014 | u16 *chanspec) |
| 2014 | { | 2015 | { |
| 2015 | struct brcmf_if *ifp; | 2016 | struct brcmf_if *ifp; |
| 2016 | struct brcmf_fil_chan_info_le ci; | 2017 | u8 mac_addr[ETH_ALEN]; |
| 2017 | struct brcmu_chan ch; | 2018 | struct brcmu_chan ch; |
| 2018 | s32 err; | 2019 | struct brcmf_bss_info_le *bi; |
| 2020 | u8 *buf; | ||
| 2019 | 2021 | ||
| 2020 | ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; | 2022 | ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; |
| 2021 | 2023 | ||
| 2022 | ch.chnum = 11; | 2024 | if (brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSSID, mac_addr, |
| 2023 | 2025 | ETH_ALEN) == 0) { | |
| 2024 | err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_CHANNEL, &ci, sizeof(ci)); | 2026 | buf = kzalloc(WL_BSS_INFO_MAX, GFP_KERNEL); |
| 2025 | if (!err) | 2027 | if (buf != NULL) { |
| 2026 | ch.chnum = le32_to_cpu(ci.hw_channel); | 2028 | *(__le32 *)buf = cpu_to_le32(WL_BSS_INFO_MAX); |
| 2029 | if (brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_BSS_INFO, | ||
| 2030 | buf, WL_BSS_INFO_MAX) == 0) { | ||
| 2031 | bi = (struct brcmf_bss_info_le *)(buf + 4); | ||
| 2032 | *chanspec = le16_to_cpu(bi->chanspec); | ||
| 2033 | kfree(buf); | ||
| 2034 | return; | ||
| 2035 | } | ||
| 2036 | kfree(buf); | ||
| 2037 | } | ||
| 2038 | } | ||
| 2039 | /* Use default channel for P2P */ | ||
| 2040 | ch.chnum = BRCMF_P2P_TEMP_CHAN; | ||
| 2027 | ch.bw = BRCMU_CHAN_BW_20; | 2041 | ch.bw = BRCMU_CHAN_BW_20; |
| 2028 | p2p->cfg->d11inf.encchspec(&ch); | 2042 | p2p->cfg->d11inf.encchspec(&ch); |
| 2029 | *chanspec = ch.chspec; | 2043 | *chanspec = ch.chspec; |
| @@ -2208,7 +2222,7 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p, | |||
| 2208 | return &p2p_vif->wdev; | 2222 | return &p2p_vif->wdev; |
| 2209 | 2223 | ||
| 2210 | fail: | 2224 | fail: |
| 2211 | brcmf_free_vif(p2p_vif); | 2225 | brcmf_free_vif(p2p->cfg, p2p_vif); |
| 2212 | return ERR_PTR(err); | 2226 | return ERR_PTR(err); |
| 2213 | } | 2227 | } |
| 2214 | 2228 | ||
| @@ -2217,13 +2231,31 @@ fail: | |||
| 2217 | * | 2231 | * |
| 2218 | * @vif: virtual interface object to delete. | 2232 | * @vif: virtual interface object to delete. |
| 2219 | */ | 2233 | */ |
| 2220 | static void brcmf_p2p_delete_p2pdev(struct brcmf_cfg80211_vif *vif) | 2234 | static void brcmf_p2p_delete_p2pdev(struct brcmf_cfg80211_info *cfg, |
| 2235 | struct brcmf_cfg80211_vif *vif) | ||
| 2221 | { | 2236 | { |
| 2222 | struct brcmf_p2p_info *p2p = &vif->ifp->drvr->config->p2p; | ||
| 2223 | |||
| 2224 | cfg80211_unregister_wdev(&vif->wdev); | 2237 | cfg80211_unregister_wdev(&vif->wdev); |
| 2225 | p2p->bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; | 2238 | cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif = NULL; |
| 2226 | brcmf_free_vif(vif); | 2239 | brcmf_free_vif(cfg, vif); |
| 2240 | } | ||
| 2241 | |||
| 2242 | /** | ||
| 2243 | * brcmf_p2p_free_p2p_if() - free up net device related data. | ||
| 2244 | * | ||
| 2245 | * @ndev: net device that needs to be freed. | ||
| 2246 | */ | ||
| 2247 | static void brcmf_p2p_free_p2p_if(struct net_device *ndev) | ||
| 2248 | { | ||
| 2249 | struct brcmf_cfg80211_info *cfg; | ||
| 2250 | struct brcmf_cfg80211_vif *vif; | ||
| 2251 | struct brcmf_if *ifp; | ||
| 2252 | |||
| 2253 | ifp = netdev_priv(ndev); | ||
| 2254 | cfg = ifp->drvr->config; | ||
| 2255 | vif = ifp->vif; | ||
| 2256 | |||
| 2257 | brcmf_free_vif(cfg, vif); | ||
| 2258 | free_netdev(ifp->ndev); | ||
| 2227 | } | 2259 | } |
| 2228 | 2260 | ||
| 2229 | /** | 2261 | /** |
| @@ -2303,6 +2335,9 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name, | |||
| 2303 | brcmf_err("Registering netdevice failed\n"); | 2335 | brcmf_err("Registering netdevice failed\n"); |
| 2304 | goto fail; | 2336 | goto fail; |
| 2305 | } | 2337 | } |
| 2338 | /* override destructor */ | ||
| 2339 | ifp->ndev->destructor = brcmf_p2p_free_p2p_if; | ||
| 2340 | |||
| 2306 | cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif; | 2341 | cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif; |
| 2307 | /* Disable firmware roaming for P2P interface */ | 2342 | /* Disable firmware roaming for P2P interface */ |
| 2308 | brcmf_fil_iovar_int_set(ifp, "roam_off", 1); | 2343 | brcmf_fil_iovar_int_set(ifp, "roam_off", 1); |
| @@ -2314,7 +2349,7 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name, | |||
| 2314 | return &ifp->vif->wdev; | 2349 | return &ifp->vif->wdev; |
| 2315 | 2350 | ||
| 2316 | fail: | 2351 | fail: |
| 2317 | brcmf_free_vif(vif); | 2352 | brcmf_free_vif(cfg, vif); |
| 2318 | return ERR_PTR(err); | 2353 | return ERR_PTR(err); |
| 2319 | } | 2354 | } |
| 2320 | 2355 | ||
| @@ -2350,7 +2385,7 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev) | |||
| 2350 | break; | 2385 | break; |
| 2351 | 2386 | ||
| 2352 | case NL80211_IFTYPE_P2P_DEVICE: | 2387 | case NL80211_IFTYPE_P2P_DEVICE: |
| 2353 | brcmf_p2p_delete_p2pdev(vif); | 2388 | brcmf_p2p_delete_p2pdev(cfg, vif); |
| 2354 | return 0; | 2389 | return 0; |
| 2355 | default: | 2390 | default: |
| 2356 | return -ENOTSUPP; | 2391 | return -ENOTSUPP; |
| @@ -2378,7 +2413,6 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev) | |||
| 2378 | err = 0; | 2413 | err = 0; |
| 2379 | } | 2414 | } |
| 2380 | brcmf_cfg80211_arm_vif_event(cfg, NULL); | 2415 | brcmf_cfg80211_arm_vif_event(cfg, NULL); |
| 2381 | brcmf_free_vif(vif); | ||
| 2382 | p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL; | 2416 | p2p->bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL; |
| 2383 | 2417 | ||
| 2384 | return err; | 2418 | return err; |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index 761f501959a9..301e572e8923 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | |||
| @@ -459,6 +459,38 @@ send_key_to_dongle(struct net_device *ndev, struct brcmf_wsec_key *key) | |||
| 459 | return err; | 459 | return err; |
| 460 | } | 460 | } |
| 461 | 461 | ||
| 462 | static s32 | ||
| 463 | brcmf_configure_arp_offload(struct brcmf_if *ifp, bool enable) | ||
| 464 | { | ||
| 465 | s32 err; | ||
| 466 | u32 mode; | ||
| 467 | |||
| 468 | if (enable) | ||
| 469 | mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY; | ||
| 470 | else | ||
| 471 | mode = 0; | ||
| 472 | |||
| 473 | /* Try to set and enable ARP offload feature, this may fail, then it */ | ||
| 474 | /* is simply not supported and err 0 will be returned */ | ||
| 475 | err = brcmf_fil_iovar_int_set(ifp, "arp_ol", mode); | ||
| 476 | if (err) { | ||
| 477 | brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n", | ||
| 478 | mode, err); | ||
| 479 | err = 0; | ||
| 480 | } else { | ||
| 481 | err = brcmf_fil_iovar_int_set(ifp, "arpoe", enable); | ||
| 482 | if (err) { | ||
| 483 | brcmf_dbg(TRACE, "failed to configure (%d) ARP offload err = %d\n", | ||
| 484 | enable, err); | ||
| 485 | err = 0; | ||
| 486 | } else | ||
| 487 | brcmf_dbg(TRACE, "successfully configured (%d) ARP offload to 0x%x\n", | ||
| 488 | enable, mode); | ||
| 489 | } | ||
| 490 | |||
| 491 | return err; | ||
| 492 | } | ||
| 493 | |||
| 462 | static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy, | 494 | static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy, |
| 463 | const char *name, | 495 | const char *name, |
| 464 | enum nl80211_iftype type, | 496 | enum nl80211_iftype type, |
| @@ -2216,6 +2248,11 @@ brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev, | |||
| 2216 | } | 2248 | } |
| 2217 | 2249 | ||
| 2218 | pm = enabled ? PM_FAST : PM_OFF; | 2250 | pm = enabled ? PM_FAST : PM_OFF; |
| 2251 | /* Do not enable the power save after assoc if it is a p2p interface */ | ||
| 2252 | if (ifp->vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT) { | ||
| 2253 | brcmf_dbg(INFO, "Do not enable power save for P2P clients\n"); | ||
| 2254 | pm = PM_OFF; | ||
| 2255 | } | ||
| 2219 | brcmf_dbg(INFO, "power save %s\n", (pm ? "enabled" : "disabled")); | 2256 | brcmf_dbg(INFO, "power save %s\n", (pm ? "enabled" : "disabled")); |
| 2220 | 2257 | ||
| 2221 | err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, pm); | 2258 | err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, pm); |
| @@ -3640,10 +3677,28 @@ brcmf_config_ap_mgmt_ie(struct brcmf_cfg80211_vif *vif, | |||
| 3640 | } | 3677 | } |
| 3641 | 3678 | ||
| 3642 | static s32 | 3679 | static s32 |
| 3680 | brcmf_cfg80211_set_channel(struct brcmf_cfg80211_info *cfg, | ||
| 3681 | struct brcmf_if *ifp, | ||
| 3682 | struct ieee80211_channel *channel) | ||
| 3683 | { | ||
| 3684 | u16 chanspec; | ||
| 3685 | s32 err; | ||
| 3686 | |||
| 3687 | brcmf_dbg(TRACE, "band=%d, center_freq=%d\n", channel->band, | ||
| 3688 | channel->center_freq); | ||
| 3689 | |||
| 3690 | chanspec = channel_to_chanspec(&cfg->d11inf, channel); | ||
| 3691 | err = brcmf_fil_iovar_int_set(ifp, "chanspec", chanspec); | ||
| 3692 | |||
| 3693 | return err; | ||
| 3694 | } | ||
| 3695 | |||
| 3696 | static s32 | ||
| 3643 | brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, | 3697 | brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, |
| 3644 | struct cfg80211_ap_settings *settings) | 3698 | struct cfg80211_ap_settings *settings) |
| 3645 | { | 3699 | { |
| 3646 | s32 ie_offset; | 3700 | s32 ie_offset; |
| 3701 | struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); | ||
| 3647 | struct brcmf_if *ifp = netdev_priv(ndev); | 3702 | struct brcmf_if *ifp = netdev_priv(ndev); |
| 3648 | struct brcmf_tlv *ssid_ie; | 3703 | struct brcmf_tlv *ssid_ie; |
| 3649 | struct brcmf_ssid_le ssid_le; | 3704 | struct brcmf_ssid_le ssid_le; |
| @@ -3683,6 +3738,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, | |||
| 3683 | } | 3738 | } |
| 3684 | 3739 | ||
| 3685 | brcmf_set_mpc(ifp, 0); | 3740 | brcmf_set_mpc(ifp, 0); |
| 3741 | brcmf_configure_arp_offload(ifp, false); | ||
| 3686 | 3742 | ||
| 3687 | /* find the RSN_IE */ | 3743 | /* find the RSN_IE */ |
| 3688 | rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, | 3744 | rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, |
| @@ -3713,6 +3769,12 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, | |||
| 3713 | 3769 | ||
| 3714 | brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon); | 3770 | brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon); |
| 3715 | 3771 | ||
| 3772 | err = brcmf_cfg80211_set_channel(cfg, ifp, settings->chandef.chan); | ||
| 3773 | if (err < 0) { | ||
| 3774 | brcmf_err("Set Channel failed, %d\n", err); | ||
| 3775 | goto exit; | ||
| 3776 | } | ||
| 3777 | |||
| 3716 | if (settings->beacon_interval) { | 3778 | if (settings->beacon_interval) { |
| 3717 | err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_BCNPRD, | 3779 | err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_BCNPRD, |
| 3718 | settings->beacon_interval); | 3780 | settings->beacon_interval); |
| @@ -3789,8 +3851,10 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, | |||
| 3789 | set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); | 3851 | set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); |
| 3790 | 3852 | ||
| 3791 | exit: | 3853 | exit: |
| 3792 | if (err) | 3854 | if (err) { |
| 3793 | brcmf_set_mpc(ifp, 1); | 3855 | brcmf_set_mpc(ifp, 1); |
| 3856 | brcmf_configure_arp_offload(ifp, true); | ||
| 3857 | } | ||
| 3794 | return err; | 3858 | return err; |
| 3795 | } | 3859 | } |
| 3796 | 3860 | ||
| @@ -3831,6 +3895,7 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev) | |||
| 3831 | brcmf_err("bss_enable config failed %d\n", err); | 3895 | brcmf_err("bss_enable config failed %d\n", err); |
| 3832 | } | 3896 | } |
| 3833 | brcmf_set_mpc(ifp, 1); | 3897 | brcmf_set_mpc(ifp, 1); |
| 3898 | brcmf_configure_arp_offload(ifp, true); | ||
| 3834 | set_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state); | 3899 | set_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state); |
| 3835 | clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); | 3900 | clear_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); |
| 3836 | 3901 | ||
| @@ -4148,7 +4213,7 @@ static const struct ieee80211_iface_limit brcmf_iface_limits[] = { | |||
| 4148 | static const struct ieee80211_iface_combination brcmf_iface_combos[] = { | 4213 | static const struct ieee80211_iface_combination brcmf_iface_combos[] = { |
| 4149 | { | 4214 | { |
| 4150 | .max_interfaces = BRCMF_IFACE_MAX_CNT, | 4215 | .max_interfaces = BRCMF_IFACE_MAX_CNT, |
| 4151 | .num_different_channels = 1, /* no multi-channel for now */ | 4216 | .num_different_channels = 2, |
| 4152 | .n_limits = ARRAY_SIZE(brcmf_iface_limits), | 4217 | .n_limits = ARRAY_SIZE(brcmf_iface_limits), |
| 4153 | .limits = brcmf_iface_limits | 4218 | .limits = brcmf_iface_limits |
| 4154 | } | 4219 | } |
| @@ -4256,20 +4321,16 @@ struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, | |||
| 4256 | return vif; | 4321 | return vif; |
| 4257 | } | 4322 | } |
| 4258 | 4323 | ||
| 4259 | void brcmf_free_vif(struct brcmf_cfg80211_vif *vif) | 4324 | void brcmf_free_vif(struct brcmf_cfg80211_info *cfg, |
| 4325 | struct brcmf_cfg80211_vif *vif) | ||
| 4260 | { | 4326 | { |
| 4261 | struct brcmf_cfg80211_info *cfg; | ||
| 4262 | struct wiphy *wiphy; | ||
| 4263 | |||
| 4264 | wiphy = vif->wdev.wiphy; | ||
| 4265 | cfg = wiphy_priv(wiphy); | ||
| 4266 | list_del(&vif->list); | 4327 | list_del(&vif->list); |
| 4267 | cfg->vif_cnt--; | 4328 | cfg->vif_cnt--; |
| 4268 | 4329 | ||
| 4269 | kfree(vif); | 4330 | kfree(vif); |
| 4270 | if (!cfg->vif_cnt) { | 4331 | if (!cfg->vif_cnt) { |
| 4271 | wiphy_unregister(wiphy); | 4332 | wiphy_unregister(cfg->wiphy); |
| 4272 | wiphy_free(wiphy); | 4333 | wiphy_free(cfg->wiphy); |
| 4273 | } | 4334 | } |
| 4274 | } | 4335 | } |
| 4275 | 4336 | ||
| @@ -4646,7 +4707,6 @@ static s32 brcmf_notify_vif_event(struct brcmf_if *ifp, | |||
| 4646 | return 0; | 4707 | return 0; |
| 4647 | 4708 | ||
| 4648 | case BRCMF_E_IF_DEL: | 4709 | case BRCMF_E_IF_DEL: |
| 4649 | ifp->vif = NULL; | ||
| 4650 | mutex_unlock(&event->vif_event_lock); | 4710 | mutex_unlock(&event->vif_event_lock); |
| 4651 | /* event may not be upon user request */ | 4711 | /* event may not be upon user request */ |
| 4652 | if (brcmf_cfg80211_vif_event_armed(cfg)) | 4712 | if (brcmf_cfg80211_vif_event_armed(cfg)) |
| @@ -4852,8 +4912,7 @@ cfg80211_p2p_attach_out: | |||
| 4852 | wl_deinit_priv(cfg); | 4912 | wl_deinit_priv(cfg); |
| 4853 | 4913 | ||
| 4854 | cfg80211_attach_out: | 4914 | cfg80211_attach_out: |
| 4855 | brcmf_free_vif(vif); | 4915 | brcmf_free_vif(cfg, vif); |
| 4856 | wiphy_free(wiphy); | ||
| 4857 | return NULL; | 4916 | return NULL; |
| 4858 | } | 4917 | } |
| 4859 | 4918 | ||
| @@ -4865,7 +4924,7 @@ void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg) | |||
| 4865 | wl_deinit_priv(cfg); | 4924 | wl_deinit_priv(cfg); |
| 4866 | brcmf_btcoex_detach(cfg); | 4925 | brcmf_btcoex_detach(cfg); |
| 4867 | list_for_each_entry_safe(vif, tmp, &cfg->vif_list, list) { | 4926 | list_for_each_entry_safe(vif, tmp, &cfg->vif_list, list) { |
| 4868 | brcmf_free_vif(vif); | 4927 | brcmf_free_vif(cfg, vif); |
| 4869 | } | 4928 | } |
| 4870 | } | 4929 | } |
| 4871 | 4930 | ||
| @@ -5229,6 +5288,8 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg) | |||
| 5229 | if (err) | 5288 | if (err) |
| 5230 | goto default_conf_out; | 5289 | goto default_conf_out; |
| 5231 | 5290 | ||
| 5291 | brcmf_configure_arp_offload(ifp, true); | ||
| 5292 | |||
| 5232 | cfg->dongle_up = true; | 5293 | cfg->dongle_up = true; |
| 5233 | default_conf_out: | 5294 | default_conf_out: |
| 5234 | 5295 | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h index a71cff84cdcf..d9bdaf9a72d0 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h | |||
| @@ -487,7 +487,8 @@ enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp); | |||
| 487 | struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, | 487 | struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, |
| 488 | enum nl80211_iftype type, | 488 | enum nl80211_iftype type, |
| 489 | bool pm_block); | 489 | bool pm_block); |
| 490 | void brcmf_free_vif(struct brcmf_cfg80211_vif *vif); | 490 | void brcmf_free_vif(struct brcmf_cfg80211_info *cfg, |
| 491 | struct brcmf_cfg80211_vif *vif); | ||
| 491 | 492 | ||
| 492 | s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag, | 493 | s32 brcmf_vif_set_mgmt_ie(struct brcmf_cfg80211_vif *vif, s32 pktflag, |
| 493 | const u8 *vndr_ie_buf, u32 vndr_ie_len); | 494 | const u8 *vndr_ie_buf, u32 vndr_ie_len); |
diff --git a/drivers/net/wireless/iwlwifi/dvm/sta.c b/drivers/net/wireless/iwlwifi/dvm/sta.c index db183b44e038..c3c13ce96eb0 100644 --- a/drivers/net/wireless/iwlwifi/dvm/sta.c +++ b/drivers/net/wireless/iwlwifi/dvm/sta.c | |||
| @@ -735,7 +735,7 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx) | |||
| 735 | memcpy(&lq, priv->stations[i].lq, | 735 | memcpy(&lq, priv->stations[i].lq, |
| 736 | sizeof(struct iwl_link_quality_cmd)); | 736 | sizeof(struct iwl_link_quality_cmd)); |
| 737 | 737 | ||
| 738 | if (!memcmp(&lq, &zero_lq, sizeof(lq))) | 738 | if (memcmp(&lq, &zero_lq, sizeof(lq))) |
| 739 | send_lq = true; | 739 | send_lq = true; |
| 740 | } | 740 | } |
| 741 | spin_unlock_bh(&priv->sta_lock); | 741 | spin_unlock_bh(&priv->sta_lock); |
diff --git a/drivers/nfc/Kconfig b/drivers/nfc/Kconfig index 4775d4e61b88..74a852e4e41f 100644 --- a/drivers/nfc/Kconfig +++ b/drivers/nfc/Kconfig | |||
| @@ -28,7 +28,7 @@ config NFC_WILINK | |||
| 28 | 28 | ||
| 29 | config NFC_MEI_PHY | 29 | config NFC_MEI_PHY |
| 30 | tristate "MEI bus NFC device support" | 30 | tristate "MEI bus NFC device support" |
| 31 | depends on INTEL_MEI_BUS_NFC && NFC_HCI | 31 | depends on INTEL_MEI && NFC_HCI |
| 32 | help | 32 | help |
| 33 | This adds support to use an mei bus nfc device. Select this if you | 33 | This adds support to use an mei bus nfc device. Select this if you |
| 34 | will use an HCI NFC driver for an NFC chip connected behind an | 34 | will use an HCI NFC driver for an NFC chip connected behind an |
diff --git a/drivers/nfc/mei_phy.c b/drivers/nfc/mei_phy.c index b8f8abc422f0..1201bdbfb791 100644 --- a/drivers/nfc/mei_phy.c +++ b/drivers/nfc/mei_phy.c | |||
| @@ -64,6 +64,15 @@ int nfc_mei_phy_enable(void *phy_id) | |||
| 64 | return r; | 64 | return r; |
| 65 | } | 65 | } |
| 66 | 66 | ||
| 67 | r = mei_cl_register_event_cb(phy->device, nfc_mei_event_cb, phy); | ||
| 68 | if (r) { | ||
| 69 | pr_err("MEY_PHY: Event cb registration failed\n"); | ||
| 70 | mei_cl_disable_device(phy->device); | ||
| 71 | phy->powered = 0; | ||
| 72 | |||
| 73 | return r; | ||
| 74 | } | ||
| 75 | |||
| 67 | phy->powered = 1; | 76 | phy->powered = 1; |
| 68 | 77 | ||
| 69 | return 0; | 78 | return 0; |
diff --git a/drivers/nfc/microread/mei.c b/drivers/nfc/microread/mei.c index 1ad044dce7b6..cdf1bc53b257 100644 --- a/drivers/nfc/microread/mei.c +++ b/drivers/nfc/microread/mei.c | |||
| @@ -43,24 +43,16 @@ static int microread_mei_probe(struct mei_cl_device *device, | |||
| 43 | return -ENOMEM; | 43 | return -ENOMEM; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | r = mei_cl_register_event_cb(device, nfc_mei_event_cb, phy); | ||
| 47 | if (r) { | ||
| 48 | pr_err(MICROREAD_DRIVER_NAME ": event cb registration failed\n"); | ||
| 49 | goto err_out; | ||
| 50 | } | ||
| 51 | |||
| 52 | r = microread_probe(phy, &mei_phy_ops, LLC_NOP_NAME, | 46 | r = microread_probe(phy, &mei_phy_ops, LLC_NOP_NAME, |
| 53 | MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD, | 47 | MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD, |
| 54 | &phy->hdev); | 48 | &phy->hdev); |
| 55 | if (r < 0) | 49 | if (r < 0) { |
| 56 | goto err_out; | 50 | nfc_mei_phy_free(phy); |
| 57 | |||
| 58 | return 0; | ||
| 59 | 51 | ||
| 60 | err_out: | 52 | return r; |
| 61 | nfc_mei_phy_free(phy); | 53 | } |
| 62 | 54 | ||
| 63 | return r; | 55 | return 0; |
| 64 | } | 56 | } |
| 65 | 57 | ||
| 66 | static int microread_mei_remove(struct mei_cl_device *device) | 58 | static int microread_mei_remove(struct mei_cl_device *device) |
| @@ -71,8 +63,6 @@ static int microread_mei_remove(struct mei_cl_device *device) | |||
| 71 | 63 | ||
| 72 | microread_remove(phy->hdev); | 64 | microread_remove(phy->hdev); |
| 73 | 65 | ||
| 74 | nfc_mei_phy_disable(phy); | ||
| 75 | |||
| 76 | nfc_mei_phy_free(phy); | 66 | nfc_mei_phy_free(phy); |
| 77 | 67 | ||
| 78 | return 0; | 68 | return 0; |
diff --git a/drivers/nfc/pn544/mei.c b/drivers/nfc/pn544/mei.c index 1eb48848a35a..b5d3d18179eb 100644 --- a/drivers/nfc/pn544/mei.c +++ b/drivers/nfc/pn544/mei.c | |||
| @@ -43,24 +43,16 @@ static int pn544_mei_probe(struct mei_cl_device *device, | |||
| 43 | return -ENOMEM; | 43 | return -ENOMEM; |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | r = mei_cl_register_event_cb(device, nfc_mei_event_cb, phy); | ||
| 47 | if (r) { | ||
| 48 | pr_err(PN544_DRIVER_NAME ": event cb registration failed\n"); | ||
| 49 | goto err_out; | ||
| 50 | } | ||
| 51 | |||
| 52 | r = pn544_hci_probe(phy, &mei_phy_ops, LLC_NOP_NAME, | 46 | r = pn544_hci_probe(phy, &mei_phy_ops, LLC_NOP_NAME, |
| 53 | MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD, | 47 | MEI_NFC_HEADER_SIZE, 0, MEI_NFC_MAX_HCI_PAYLOAD, |
| 54 | &phy->hdev); | 48 | &phy->hdev); |
| 55 | if (r < 0) | 49 | if (r < 0) { |
| 56 | goto err_out; | 50 | nfc_mei_phy_free(phy); |
| 57 | |||
| 58 | return 0; | ||
| 59 | 51 | ||
| 60 | err_out: | 52 | return r; |
| 61 | nfc_mei_phy_free(phy); | 53 | } |
| 62 | 54 | ||
| 63 | return r; | 55 | return 0; |
| 64 | } | 56 | } |
| 65 | 57 | ||
| 66 | static int pn544_mei_remove(struct mei_cl_device *device) | 58 | static int pn544_mei_remove(struct mei_cl_device *device) |
| @@ -71,8 +63,6 @@ static int pn544_mei_remove(struct mei_cl_device *device) | |||
| 71 | 63 | ||
| 72 | pn544_hci_remove(phy->hdev); | 64 | pn544_hci_remove(phy->hdev); |
| 73 | 65 | ||
| 74 | nfc_mei_phy_disable(phy); | ||
| 75 | |||
| 76 | nfc_mei_phy_free(phy); | 66 | nfc_mei_phy_free(phy); |
| 77 | 67 | ||
| 78 | return 0; | 68 | return 0; |
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7779.c b/drivers/pinctrl/sh-pfc/pfc-r8a7779.c index 791a6719d8a9..8cd90e7e945a 100644 --- a/drivers/pinctrl/sh-pfc/pfc-r8a7779.c +++ b/drivers/pinctrl/sh-pfc/pfc-r8a7779.c | |||
| @@ -2357,27 +2357,48 @@ static const unsigned int sdhi3_wp_mux[] = { | |||
| 2357 | }; | 2357 | }; |
| 2358 | /* - USB0 ------------------------------------------------------------------- */ | 2358 | /* - USB0 ------------------------------------------------------------------- */ |
| 2359 | static const unsigned int usb0_pins[] = { | 2359 | static const unsigned int usb0_pins[] = { |
| 2360 | /* OVC */ | 2360 | /* PENC */ |
| 2361 | 150, 154, | 2361 | 154, |
| 2362 | }; | 2362 | }; |
| 2363 | static const unsigned int usb0_mux[] = { | 2363 | static const unsigned int usb0_mux[] = { |
| 2364 | USB_OVC0_MARK, USB_PENC0_MARK, | 2364 | USB_PENC0_MARK, |
| 2365 | }; | ||
| 2366 | static const unsigned int usb0_ovc_pins[] = { | ||
| 2367 | /* USB_OVC */ | ||
| 2368 | 150 | ||
| 2369 | }; | ||
| 2370 | static const unsigned int usb0_ovc_mux[] = { | ||
| 2371 | USB_OVC0_MARK, | ||
| 2365 | }; | 2372 | }; |
| 2366 | /* - USB1 ------------------------------------------------------------------- */ | 2373 | /* - USB1 ------------------------------------------------------------------- */ |
| 2367 | static const unsigned int usb1_pins[] = { | 2374 | static const unsigned int usb1_pins[] = { |
| 2368 | /* OVC */ | 2375 | /* PENC */ |
| 2369 | 152, 155, | 2376 | 155, |
| 2370 | }; | 2377 | }; |
| 2371 | static const unsigned int usb1_mux[] = { | 2378 | static const unsigned int usb1_mux[] = { |
| 2372 | USB_OVC1_MARK, USB_PENC1_MARK, | 2379 | USB_PENC1_MARK, |
| 2380 | }; | ||
| 2381 | static const unsigned int usb1_ovc_pins[] = { | ||
| 2382 | /* USB_OVC */ | ||
| 2383 | 152, | ||
| 2384 | }; | ||
| 2385 | static const unsigned int usb1_ovc_mux[] = { | ||
| 2386 | USB_OVC1_MARK, | ||
| 2373 | }; | 2387 | }; |
| 2374 | /* - USB2 ------------------------------------------------------------------- */ | 2388 | /* - USB2 ------------------------------------------------------------------- */ |
| 2375 | static const unsigned int usb2_pins[] = { | 2389 | static const unsigned int usb2_pins[] = { |
| 2376 | /* OVC, PENC */ | 2390 | /* PENC */ |
| 2377 | 125, 156, | 2391 | 156, |
| 2378 | }; | 2392 | }; |
| 2379 | static const unsigned int usb2_mux[] = { | 2393 | static const unsigned int usb2_mux[] = { |
| 2380 | USB_OVC2_MARK, USB_PENC2_MARK, | 2394 | USB_PENC2_MARK, |
| 2395 | }; | ||
| 2396 | static const unsigned int usb2_ovc_pins[] = { | ||
| 2397 | /* USB_OVC */ | ||
| 2398 | 125, | ||
| 2399 | }; | ||
| 2400 | static const unsigned int usb2_ovc_mux[] = { | ||
| 2401 | USB_OVC2_MARK, | ||
| 2381 | }; | 2402 | }; |
| 2382 | 2403 | ||
| 2383 | static const struct sh_pfc_pin_group pinmux_groups[] = { | 2404 | static const struct sh_pfc_pin_group pinmux_groups[] = { |
| @@ -2501,8 +2522,11 @@ static const struct sh_pfc_pin_group pinmux_groups[] = { | |||
| 2501 | SH_PFC_PIN_GROUP(sdhi3_cd), | 2522 | SH_PFC_PIN_GROUP(sdhi3_cd), |
| 2502 | SH_PFC_PIN_GROUP(sdhi3_wp), | 2523 | SH_PFC_PIN_GROUP(sdhi3_wp), |
| 2503 | SH_PFC_PIN_GROUP(usb0), | 2524 | SH_PFC_PIN_GROUP(usb0), |
| 2525 | SH_PFC_PIN_GROUP(usb0_ovc), | ||
| 2504 | SH_PFC_PIN_GROUP(usb1), | 2526 | SH_PFC_PIN_GROUP(usb1), |
| 2527 | SH_PFC_PIN_GROUP(usb1_ovc), | ||
| 2505 | SH_PFC_PIN_GROUP(usb2), | 2528 | SH_PFC_PIN_GROUP(usb2), |
| 2529 | SH_PFC_PIN_GROUP(usb2_ovc), | ||
| 2506 | }; | 2530 | }; |
| 2507 | 2531 | ||
| 2508 | static const char * const du0_groups[] = { | 2532 | static const char * const du0_groups[] = { |
| @@ -2683,14 +2707,17 @@ static const char * const sdhi3_groups[] = { | |||
| 2683 | 2707 | ||
| 2684 | static const char * const usb0_groups[] = { | 2708 | static const char * const usb0_groups[] = { |
| 2685 | "usb0", | 2709 | "usb0", |
| 2710 | "usb0_ovc", | ||
| 2686 | }; | 2711 | }; |
| 2687 | 2712 | ||
| 2688 | static const char * const usb1_groups[] = { | 2713 | static const char * const usb1_groups[] = { |
| 2689 | "usb1", | 2714 | "usb1", |
| 2715 | "usb1_ovc", | ||
| 2690 | }; | 2716 | }; |
| 2691 | 2717 | ||
| 2692 | static const char * const usb2_groups[] = { | 2718 | static const char * const usb2_groups[] = { |
| 2693 | "usb2", | 2719 | "usb2", |
| 2720 | "usb2_ovc", | ||
| 2694 | }; | 2721 | }; |
| 2695 | 2722 | ||
| 2696 | static const struct sh_pfc_function pinmux_functions[] = { | 2723 | static const struct sh_pfc_function pinmux_functions[] = { |
diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c index 8df0c5a21be2..d111c8687f9b 100644 --- a/drivers/platform/x86/hp-wmi.c +++ b/drivers/platform/x86/hp-wmi.c | |||
| @@ -703,7 +703,7 @@ static int hp_wmi_rfkill_setup(struct platform_device *device) | |||
| 703 | } | 703 | } |
| 704 | rfkill_init_sw_state(gps_rfkill, | 704 | rfkill_init_sw_state(gps_rfkill, |
| 705 | hp_wmi_get_sw_state(HPWMI_GPS)); | 705 | hp_wmi_get_sw_state(HPWMI_GPS)); |
| 706 | rfkill_set_hw_state(bluetooth_rfkill, | 706 | rfkill_set_hw_state(gps_rfkill, |
| 707 | hp_wmi_get_hw_state(HPWMI_GPS)); | 707 | hp_wmi_get_hw_state(HPWMI_GPS)); |
| 708 | err = rfkill_register(gps_rfkill); | 708 | err = rfkill_register(gps_rfkill); |
| 709 | if (err) | 709 | if (err) |
diff --git a/drivers/ptp/ptp_pch.c b/drivers/ptp/ptp_pch.c index bea94510ad2d..71a2559278d7 100644 --- a/drivers/ptp/ptp_pch.c +++ b/drivers/ptp/ptp_pch.c | |||
| @@ -628,9 +628,10 @@ pch_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 628 | 628 | ||
| 629 | chip->caps = ptp_pch_caps; | 629 | chip->caps = ptp_pch_caps; |
| 630 | chip->ptp_clock = ptp_clock_register(&chip->caps, &pdev->dev); | 630 | chip->ptp_clock = ptp_clock_register(&chip->caps, &pdev->dev); |
| 631 | 631 | if (IS_ERR(chip->ptp_clock)) { | |
| 632 | if (IS_ERR(chip->ptp_clock)) | 632 | ret = PTR_ERR(chip->ptp_clock); |
| 633 | return PTR_ERR(chip->ptp_clock); | 633 | goto err_ptp_clock_reg; |
| 634 | } | ||
| 634 | 635 | ||
| 635 | spin_lock_init(&chip->register_lock); | 636 | spin_lock_init(&chip->register_lock); |
| 636 | 637 | ||
| @@ -669,6 +670,7 @@ pch_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 669 | 670 | ||
| 670 | err_req_irq: | 671 | err_req_irq: |
| 671 | ptp_clock_unregister(chip->ptp_clock); | 672 | ptp_clock_unregister(chip->ptp_clock); |
| 673 | err_ptp_clock_reg: | ||
| 672 | iounmap(chip->regs); | 674 | iounmap(chip->regs); |
| 673 | chip->regs = NULL; | 675 | chip->regs = NULL; |
| 674 | 676 | ||
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 6e5017841582..815d6df8bd5f 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
| @@ -1539,7 +1539,10 @@ static void regulator_ena_gpio_free(struct regulator_dev *rdev) | |||
| 1539 | } | 1539 | } |
| 1540 | 1540 | ||
| 1541 | /** | 1541 | /** |
| 1542 | * Balance enable_count of each GPIO and actual GPIO pin control. | 1542 | * regulator_ena_gpio_ctrl - balance enable_count of each GPIO and actual GPIO pin control |
| 1543 | * @rdev: regulator_dev structure | ||
| 1544 | * @enable: enable GPIO at initial use? | ||
| 1545 | * | ||
| 1543 | * GPIO is enabled in case of initial use. (enable_count is 0) | 1546 | * GPIO is enabled in case of initial use. (enable_count is 0) |
| 1544 | * GPIO is disabled when it is not shared any more. (enable_count <= 1) | 1547 | * GPIO is disabled when it is not shared any more. (enable_count <= 1) |
| 1545 | */ | 1548 | */ |
| @@ -2702,7 +2705,7 @@ EXPORT_SYMBOL_GPL(regulator_get_voltage); | |||
| 2702 | /** | 2705 | /** |
| 2703 | * regulator_set_current_limit - set regulator output current limit | 2706 | * regulator_set_current_limit - set regulator output current limit |
| 2704 | * @regulator: regulator source | 2707 | * @regulator: regulator source |
| 2705 | * @min_uA: Minimuum supported current in uA | 2708 | * @min_uA: Minimum supported current in uA |
| 2706 | * @max_uA: Maximum supported current in uA | 2709 | * @max_uA: Maximum supported current in uA |
| 2707 | * | 2710 | * |
| 2708 | * Sets current sink to the desired output current. This can be set during | 2711 | * Sets current sink to the desired output current. This can be set during |
diff --git a/drivers/regulator/dbx500-prcmu.c b/drivers/regulator/dbx500-prcmu.c index 89bd2faaef8c..ce89f7848a57 100644 --- a/drivers/regulator/dbx500-prcmu.c +++ b/drivers/regulator/dbx500-prcmu.c | |||
| @@ -24,18 +24,6 @@ | |||
| 24 | static int power_state_active_cnt; /* will initialize to zero */ | 24 | static int power_state_active_cnt; /* will initialize to zero */ |
| 25 | static DEFINE_SPINLOCK(power_state_active_lock); | 25 | static DEFINE_SPINLOCK(power_state_active_lock); |
| 26 | 26 | ||
| 27 | int power_state_active_get(void) | ||
| 28 | { | ||
| 29 | unsigned long flags; | ||
| 30 | int cnt; | ||
| 31 | |||
| 32 | spin_lock_irqsave(&power_state_active_lock, flags); | ||
| 33 | cnt = power_state_active_cnt; | ||
| 34 | spin_unlock_irqrestore(&power_state_active_lock, flags); | ||
| 35 | |||
| 36 | return cnt; | ||
| 37 | } | ||
| 38 | |||
| 39 | void power_state_active_enable(void) | 27 | void power_state_active_enable(void) |
| 40 | { | 28 | { |
| 41 | unsigned long flags; | 29 | unsigned long flags; |
| @@ -65,6 +53,18 @@ out: | |||
| 65 | 53 | ||
| 66 | #ifdef CONFIG_REGULATOR_DEBUG | 54 | #ifdef CONFIG_REGULATOR_DEBUG |
| 67 | 55 | ||
| 56 | static int power_state_active_get(void) | ||
| 57 | { | ||
| 58 | unsigned long flags; | ||
| 59 | int cnt; | ||
| 60 | |||
| 61 | spin_lock_irqsave(&power_state_active_lock, flags); | ||
| 62 | cnt = power_state_active_cnt; | ||
| 63 | spin_unlock_irqrestore(&power_state_active_lock, flags); | ||
| 64 | |||
| 65 | return cnt; | ||
| 66 | } | ||
| 67 | |||
| 68 | static struct ux500_regulator_debug { | 68 | static struct ux500_regulator_debug { |
| 69 | struct dentry *dir; | 69 | struct dentry *dir; |
| 70 | struct dentry *status_file; | 70 | struct dentry *status_file; |
diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index 92ceed0fc65e..3ae44ac12a94 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c | |||
| @@ -840,7 +840,7 @@ static int palmas_regulators_probe(struct platform_device *pdev) | |||
| 840 | break; | 840 | break; |
| 841 | } | 841 | } |
| 842 | 842 | ||
| 843 | if ((id == PALMAS_REG_SMPS6) && (id == PALMAS_REG_SMPS8)) | 843 | if ((id == PALMAS_REG_SMPS6) || (id == PALMAS_REG_SMPS8)) |
| 844 | ramp_delay_support = true; | 844 | ramp_delay_support = true; |
| 845 | 845 | ||
| 846 | if (ramp_delay_support) { | 846 | if (ramp_delay_support) { |
| @@ -878,7 +878,7 @@ static int palmas_regulators_probe(struct platform_device *pdev) | |||
| 878 | pmic->desc[id].vsel_mask = SMPS10_VSEL; | 878 | pmic->desc[id].vsel_mask = SMPS10_VSEL; |
| 879 | pmic->desc[id].enable_reg = | 879 | pmic->desc[id].enable_reg = |
| 880 | PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, | 880 | PALMAS_BASE_TO_REG(PALMAS_SMPS_BASE, |
| 881 | PALMAS_SMPS10_STATUS); | 881 | PALMAS_SMPS10_CTRL); |
| 882 | pmic->desc[id].enable_mask = SMPS10_BOOST_EN; | 882 | pmic->desc[id].enable_mask = SMPS10_BOOST_EN; |
| 883 | pmic->desc[id].min_uV = 3750000; | 883 | pmic->desc[id].min_uV = 3750000; |
| 884 | pmic->desc[id].uV_step = 1250000; | 884 | pmic->desc[id].uV_step = 1250000; |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 4361d9772c42..d72a9216ee2e 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -3440,8 +3440,16 @@ void dasd_generic_path_event(struct ccw_device *cdev, int *path_event) | |||
| 3440 | device->path_data.opm &= ~eventlpm; | 3440 | device->path_data.opm &= ~eventlpm; |
| 3441 | device->path_data.ppm &= ~eventlpm; | 3441 | device->path_data.ppm &= ~eventlpm; |
| 3442 | device->path_data.npm &= ~eventlpm; | 3442 | device->path_data.npm &= ~eventlpm; |
| 3443 | if (oldopm && !device->path_data.opm) | 3443 | if (oldopm && !device->path_data.opm) { |
| 3444 | dasd_generic_last_path_gone(device); | 3444 | dev_warn(&device->cdev->dev, |
| 3445 | "No verified channel paths remain " | ||
| 3446 | "for the device\n"); | ||
| 3447 | DBF_DEV_EVENT(DBF_WARNING, device, | ||
| 3448 | "%s", "last verified path gone"); | ||
| 3449 | dasd_eer_write(device, NULL, DASD_EER_NOPATH); | ||
| 3450 | dasd_device_set_stop_bits(device, | ||
| 3451 | DASD_STOPPED_DC_WAIT); | ||
| 3452 | } | ||
| 3445 | } | 3453 | } |
| 3446 | if (path_event[chp] & PE_PATH_AVAILABLE) { | 3454 | if (path_event[chp] & PE_PATH_AVAILABLE) { |
| 3447 | device->path_data.opm &= ~eventlpm; | 3455 | device->path_data.opm &= ~eventlpm; |
diff --git a/drivers/staging/android/alarm-dev.c b/drivers/staging/android/alarm-dev.c index ceb1c643753d..6dc27dac679d 100644 --- a/drivers/staging/android/alarm-dev.c +++ b/drivers/staging/android/alarm-dev.c | |||
| @@ -264,6 +264,8 @@ static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | rv = alarm_do_ioctl(file, cmd, &ts); | 266 | rv = alarm_do_ioctl(file, cmd, &ts); |
| 267 | if (rv) | ||
| 268 | return rv; | ||
| 267 | 269 | ||
| 268 | switch (ANDROID_ALARM_BASE_CMD(cmd)) { | 270 | switch (ANDROID_ALARM_BASE_CMD(cmd)) { |
| 269 | case ANDROID_ALARM_GET_TIME(0): | 271 | case ANDROID_ALARM_GET_TIME(0): |
| @@ -272,7 +274,7 @@ static long alarm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 272 | break; | 274 | break; |
| 273 | } | 275 | } |
| 274 | 276 | ||
| 275 | return rv; | 277 | return 0; |
| 276 | } | 278 | } |
| 277 | #ifdef CONFIG_COMPAT | 279 | #ifdef CONFIG_COMPAT |
| 278 | static long alarm_compat_ioctl(struct file *file, unsigned int cmd, | 280 | static long alarm_compat_ioctl(struct file *file, unsigned int cmd, |
| @@ -295,6 +297,8 @@ static long alarm_compat_ioctl(struct file *file, unsigned int cmd, | |||
| 295 | } | 297 | } |
| 296 | 298 | ||
| 297 | rv = alarm_do_ioctl(file, cmd, &ts); | 299 | rv = alarm_do_ioctl(file, cmd, &ts); |
| 300 | if (rv) | ||
| 301 | return rv; | ||
| 298 | 302 | ||
| 299 | switch (ANDROID_ALARM_BASE_CMD(cmd)) { | 303 | switch (ANDROID_ALARM_BASE_CMD(cmd)) { |
| 300 | case ANDROID_ALARM_GET_TIME(0): /* NOTE: we modified cmd above */ | 304 | case ANDROID_ALARM_GET_TIME(0): /* NOTE: we modified cmd above */ |
| @@ -303,7 +307,7 @@ static long alarm_compat_ioctl(struct file *file, unsigned int cmd, | |||
| 303 | break; | 307 | break; |
| 304 | } | 308 | } |
| 305 | 309 | ||
| 306 | return rv; | 310 | return 0; |
| 307 | } | 311 | } |
| 308 | #endif | 312 | #endif |
| 309 | 313 | ||
diff --git a/drivers/staging/dwc2/hcd.c b/drivers/staging/dwc2/hcd.c index 827ab781ae9b..8551ccedf037 100644 --- a/drivers/staging/dwc2/hcd.c +++ b/drivers/staging/dwc2/hcd.c | |||
| @@ -2804,9 +2804,8 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, | |||
| 2804 | 2804 | ||
| 2805 | /* Set device flags indicating whether the HCD supports DMA */ | 2805 | /* Set device flags indicating whether the HCD supports DMA */ |
| 2806 | if (hsotg->core_params->dma_enable > 0) { | 2806 | if (hsotg->core_params->dma_enable > 0) { |
| 2807 | if (dma_set_mask(hsotg->dev, DMA_BIT_MASK(31)) < 0) | 2807 | if (dma_set_mask(hsotg->dev, DMA_BIT_MASK(32)) < 0) |
| 2808 | dev_warn(hsotg->dev, | 2808 | dev_warn(hsotg->dev, "can't set DMA mask\n"); |
| 2809 | "can't enable workaround for >2GB RAM\n"); | ||
| 2810 | if (dma_set_coherent_mask(hsotg->dev, DMA_BIT_MASK(31)) < 0) | 2809 | if (dma_set_coherent_mask(hsotg->dev, DMA_BIT_MASK(31)) < 0) |
| 2811 | dev_warn(hsotg->dev, | 2810 | dev_warn(hsotg->dev, |
| 2812 | "can't enable workaround for >2GB RAM\n"); | 2811 | "can't enable workaround for >2GB RAM\n"); |
diff --git a/drivers/staging/zcache/ramster.h b/drivers/staging/zcache/ramster.h index e1f91d5a0f6a..a858666eae68 100644 --- a/drivers/staging/zcache/ramster.h +++ b/drivers/staging/zcache/ramster.h | |||
| @@ -11,10 +11,6 @@ | |||
| 11 | #ifndef _ZCACHE_RAMSTER_H_ | 11 | #ifndef _ZCACHE_RAMSTER_H_ |
| 12 | #define _ZCACHE_RAMSTER_H_ | 12 | #define _ZCACHE_RAMSTER_H_ |
| 13 | 13 | ||
| 14 | #ifdef CONFIG_RAMSTER_MODULE | ||
| 15 | #define CONFIG_RAMSTER | ||
| 16 | #endif | ||
| 17 | |||
| 18 | #ifdef CONFIG_RAMSTER | 14 | #ifdef CONFIG_RAMSTER |
| 19 | #include "ramster/ramster.h" | 15 | #include "ramster/ramster.h" |
| 20 | #else | 16 | #else |
diff --git a/drivers/staging/zcache/ramster/debug.c b/drivers/staging/zcache/ramster/debug.c index 327e4f0d98e1..5b26ee977c2f 100644 --- a/drivers/staging/zcache/ramster/debug.c +++ b/drivers/staging/zcache/ramster/debug.c | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #include <linux/atomic.h> | 1 | #include <linux/atomic.h> |
| 2 | #include "debug.h" | 2 | #include "debug.h" |
| 3 | 3 | ||
| 4 | ssize_t ramster_foreign_eph_pages; | ||
| 5 | ssize_t ramster_foreign_pers_pages; | ||
| 4 | #ifdef CONFIG_DEBUG_FS | 6 | #ifdef CONFIG_DEBUG_FS |
| 5 | #include <linux/debugfs.h> | 7 | #include <linux/debugfs.h> |
| 6 | 8 | ||
diff --git a/drivers/staging/zcache/ramster/ramster.c b/drivers/staging/zcache/ramster/ramster.c index b18b887db79f..a937ce1fa27a 100644 --- a/drivers/staging/zcache/ramster/ramster.c +++ b/drivers/staging/zcache/ramster/ramster.c | |||
| @@ -66,8 +66,6 @@ static int ramster_remote_target_nodenum __read_mostly = -1; | |||
| 66 | 66 | ||
| 67 | /* Used by this code. */ | 67 | /* Used by this code. */ |
| 68 | long ramster_flnodes; | 68 | long ramster_flnodes; |
| 69 | ssize_t ramster_foreign_eph_pages; | ||
| 70 | ssize_t ramster_foreign_pers_pages; | ||
| 71 | /* FIXME frontswap selfshrinking knobs in debugfs? */ | 69 | /* FIXME frontswap selfshrinking knobs in debugfs? */ |
| 72 | 70 | ||
| 73 | static LIST_HEAD(ramster_rem_op_list); | 71 | static LIST_HEAD(ramster_rem_op_list); |
| @@ -399,14 +397,18 @@ void ramster_count_foreign_pages(bool eph, int count) | |||
| 399 | inc_ramster_foreign_eph_pages(); | 397 | inc_ramster_foreign_eph_pages(); |
| 400 | } else { | 398 | } else { |
| 401 | dec_ramster_foreign_eph_pages(); | 399 | dec_ramster_foreign_eph_pages(); |
| 400 | #ifdef CONFIG_RAMSTER_DEBUG | ||
| 402 | WARN_ON_ONCE(ramster_foreign_eph_pages < 0); | 401 | WARN_ON_ONCE(ramster_foreign_eph_pages < 0); |
| 402 | #endif | ||
| 403 | } | 403 | } |
| 404 | } else { | 404 | } else { |
| 405 | if (count > 0) { | 405 | if (count > 0) { |
| 406 | inc_ramster_foreign_pers_pages(); | 406 | inc_ramster_foreign_pers_pages(); |
| 407 | } else { | 407 | } else { |
| 408 | dec_ramster_foreign_pers_pages(); | 408 | dec_ramster_foreign_pers_pages(); |
| 409 | #ifdef CONFIG_RAMSTER_DEBUG | ||
| 409 | WARN_ON_ONCE(ramster_foreign_pers_pages < 0); | 410 | WARN_ON_ONCE(ramster_foreign_pers_pages < 0); |
| 411 | #endif | ||
| 410 | } | 412 | } |
| 411 | } | 413 | } |
| 412 | } | 414 | } |
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index 46528d57be72..86c00b1c5583 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c | |||
| @@ -2755,7 +2755,7 @@ static void __init serial8250_isa_init_ports(void) | |||
| 2755 | if (nr_uarts > UART_NR) | 2755 | if (nr_uarts > UART_NR) |
| 2756 | nr_uarts = UART_NR; | 2756 | nr_uarts = UART_NR; |
| 2757 | 2757 | ||
| 2758 | for (i = 0; i < UART_NR; i++) { | 2758 | for (i = 0; i < nr_uarts; i++) { |
| 2759 | struct uart_8250_port *up = &serial8250_ports[i]; | 2759 | struct uart_8250_port *up = &serial8250_ports[i]; |
| 2760 | struct uart_port *port = &up->port; | 2760 | struct uart_port *port = &up->port; |
| 2761 | 2761 | ||
| @@ -2916,7 +2916,7 @@ static int __init serial8250_console_setup(struct console *co, char *options) | |||
| 2916 | * if so, search for the first available port that does have | 2916 | * if so, search for the first available port that does have |
| 2917 | * console support. | 2917 | * console support. |
| 2918 | */ | 2918 | */ |
| 2919 | if (co->index >= UART_NR) | 2919 | if (co->index >= nr_uarts) |
| 2920 | co->index = 0; | 2920 | co->index = 0; |
| 2921 | port = &serial8250_ports[co->index].port; | 2921 | port = &serial8250_ports[co->index].port; |
| 2922 | if (!port->iobase && !port->membase) | 2922 | if (!port->iobase && !port->membase) |
| @@ -2957,7 +2957,7 @@ int serial8250_find_port(struct uart_port *p) | |||
| 2957 | int line; | 2957 | int line; |
| 2958 | struct uart_port *port; | 2958 | struct uart_port *port; |
| 2959 | 2959 | ||
| 2960 | for (line = 0; line < UART_NR; line++) { | 2960 | for (line = 0; line < nr_uarts; line++) { |
| 2961 | port = &serial8250_ports[line].port; | 2961 | port = &serial8250_ports[line].port; |
| 2962 | if (uart_match_port(p, port)) | 2962 | if (uart_match_port(p, port)) |
| 2963 | return line; | 2963 | return line; |
| @@ -3110,7 +3110,7 @@ static int serial8250_remove(struct platform_device *dev) | |||
| 3110 | { | 3110 | { |
| 3111 | int i; | 3111 | int i; |
| 3112 | 3112 | ||
| 3113 | for (i = 0; i < UART_NR; i++) { | 3113 | for (i = 0; i < nr_uarts; i++) { |
| 3114 | struct uart_8250_port *up = &serial8250_ports[i]; | 3114 | struct uart_8250_port *up = &serial8250_ports[i]; |
| 3115 | 3115 | ||
| 3116 | if (up->port.dev == &dev->dev) | 3116 | if (up->port.dev == &dev->dev) |
| @@ -3178,7 +3178,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port * | |||
| 3178 | /* | 3178 | /* |
| 3179 | * First, find a port entry which matches. | 3179 | * First, find a port entry which matches. |
| 3180 | */ | 3180 | */ |
| 3181 | for (i = 0; i < UART_NR; i++) | 3181 | for (i = 0; i < nr_uarts; i++) |
| 3182 | if (uart_match_port(&serial8250_ports[i].port, port)) | 3182 | if (uart_match_port(&serial8250_ports[i].port, port)) |
| 3183 | return &serial8250_ports[i]; | 3183 | return &serial8250_ports[i]; |
| 3184 | 3184 | ||
| @@ -3187,7 +3187,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port * | |||
| 3187 | * free entry. We look for one which hasn't been previously | 3187 | * free entry. We look for one which hasn't been previously |
| 3188 | * used (indicated by zero iobase). | 3188 | * used (indicated by zero iobase). |
| 3189 | */ | 3189 | */ |
| 3190 | for (i = 0; i < UART_NR; i++) | 3190 | for (i = 0; i < nr_uarts; i++) |
| 3191 | if (serial8250_ports[i].port.type == PORT_UNKNOWN && | 3191 | if (serial8250_ports[i].port.type == PORT_UNKNOWN && |
| 3192 | serial8250_ports[i].port.iobase == 0) | 3192 | serial8250_ports[i].port.iobase == 0) |
| 3193 | return &serial8250_ports[i]; | 3193 | return &serial8250_ports[i]; |
| @@ -3196,7 +3196,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port * | |||
| 3196 | * That also failed. Last resort is to find any entry which | 3196 | * That also failed. Last resort is to find any entry which |
| 3197 | * doesn't have a real port associated with it. | 3197 | * doesn't have a real port associated with it. |
| 3198 | */ | 3198 | */ |
| 3199 | for (i = 0; i < UART_NR; i++) | 3199 | for (i = 0; i < nr_uarts; i++) |
| 3200 | if (serial8250_ports[i].port.type == PORT_UNKNOWN) | 3200 | if (serial8250_ports[i].port.type == PORT_UNKNOWN) |
| 3201 | return &serial8250_ports[i]; | 3201 | return &serial8250_ports[i]; |
| 3202 | 3202 | ||
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index 147c9e193595..8cdfbd365892 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c | |||
| @@ -761,6 +761,8 @@ static int imx_startup(struct uart_port *port) | |||
| 761 | 761 | ||
| 762 | temp = readl(sport->port.membase + UCR2); | 762 | temp = readl(sport->port.membase + UCR2); |
| 763 | temp |= (UCR2_RXEN | UCR2_TXEN); | 763 | temp |= (UCR2_RXEN | UCR2_TXEN); |
| 764 | if (!sport->have_rtscts) | ||
| 765 | temp |= UCR2_IRTS; | ||
| 764 | writel(temp, sport->port.membase + UCR2); | 766 | writel(temp, sport->port.membase + UCR2); |
| 765 | 767 | ||
| 766 | if (USE_IRDA(sport)) { | 768 | if (USE_IRDA(sport)) { |
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c index 89429410a245..0c8a9fa2be6c 100644 --- a/drivers/tty/serial/samsung.c +++ b/drivers/tty/serial/samsung.c | |||
| @@ -1166,6 +1166,18 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, | |||
| 1166 | ourport->tx_irq = ret; | 1166 | ourport->tx_irq = ret; |
| 1167 | 1167 | ||
| 1168 | ourport->clk = clk_get(&platdev->dev, "uart"); | 1168 | ourport->clk = clk_get(&platdev->dev, "uart"); |
| 1169 | if (IS_ERR(ourport->clk)) { | ||
| 1170 | pr_err("%s: Controller clock not found\n", | ||
| 1171 | dev_name(&platdev->dev)); | ||
| 1172 | return PTR_ERR(ourport->clk); | ||
| 1173 | } | ||
| 1174 | |||
| 1175 | ret = clk_prepare_enable(ourport->clk); | ||
| 1176 | if (ret) { | ||
| 1177 | pr_err("uart: clock failed to prepare+enable: %d\n", ret); | ||
| 1178 | clk_put(ourport->clk); | ||
| 1179 | return ret; | ||
| 1180 | } | ||
| 1169 | 1181 | ||
| 1170 | /* Keep all interrupts masked and cleared */ | 1182 | /* Keep all interrupts masked and cleared */ |
| 1171 | if (s3c24xx_serial_has_interrupt_mask(port)) { | 1183 | if (s3c24xx_serial_has_interrupt_mask(port)) { |
| @@ -1180,6 +1192,7 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport, | |||
| 1180 | 1192 | ||
| 1181 | /* reset the fifos (and setup the uart) */ | 1193 | /* reset the fifos (and setup the uart) */ |
| 1182 | s3c24xx_serial_resetport(port, cfg); | 1194 | s3c24xx_serial_resetport(port, cfg); |
| 1195 | clk_disable_unprepare(ourport->clk); | ||
| 1183 | return 0; | 1196 | return 0; |
| 1184 | } | 1197 | } |
| 1185 | 1198 | ||
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index caefc800f298..c88c4fb9459d 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
| @@ -1287,9 +1287,13 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb, | |||
| 1287 | goto error; | 1287 | goto error; |
| 1288 | } | 1288 | } |
| 1289 | for (totlen = u = 0; u < uurb->number_of_packets; u++) { | 1289 | for (totlen = u = 0; u < uurb->number_of_packets; u++) { |
| 1290 | /* arbitrary limit, | 1290 | /* |
| 1291 | * sufficient for USB 2.0 high-bandwidth iso */ | 1291 | * arbitrary limit need for USB 3.0 |
| 1292 | if (isopkt[u].length > 8192) { | 1292 | * bMaxBurst (0~15 allowed, 1~16 packets) |
| 1293 | * bmAttributes (bit 1:0, mult 0~2, 1~3 packets) | ||
| 1294 | * sizemax: 1024 * 16 * 3 = 49152 | ||
| 1295 | */ | ||
| 1296 | if (isopkt[u].length > 49152) { | ||
| 1293 | ret = -EINVAL; | 1297 | ret = -EINVAL; |
| 1294 | goto error; | 1298 | goto error; |
| 1295 | } | 1299 | } |
diff --git a/drivers/usb/dwc3/dwc3-exynos.c b/drivers/usb/dwc3/dwc3-exynos.c index 929e7dd6e58b..8ce9d7fd6cfc 100644 --- a/drivers/usb/dwc3/dwc3-exynos.c +++ b/drivers/usb/dwc3/dwc3-exynos.c | |||
| @@ -164,9 +164,9 @@ static int dwc3_exynos_remove(struct platform_device *pdev) | |||
| 164 | { | 164 | { |
| 165 | struct dwc3_exynos *exynos = platform_get_drvdata(pdev); | 165 | struct dwc3_exynos *exynos = platform_get_drvdata(pdev); |
| 166 | 166 | ||
| 167 | device_for_each_child(&pdev->dev, NULL, dwc3_exynos_remove_child); | ||
| 167 | platform_device_unregister(exynos->usb2_phy); | 168 | platform_device_unregister(exynos->usb2_phy); |
| 168 | platform_device_unregister(exynos->usb3_phy); | 169 | platform_device_unregister(exynos->usb3_phy); |
| 169 | device_for_each_child(&pdev->dev, NULL, dwc3_exynos_remove_child); | ||
| 170 | 170 | ||
| 171 | clk_disable_unprepare(exynos->clk); | 171 | clk_disable_unprepare(exynos->clk); |
| 172 | 172 | ||
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 227d4a7acad7..eba9e2baf32b 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c | |||
| @@ -196,9 +196,9 @@ static void dwc3_pci_remove(struct pci_dev *pci) | |||
| 196 | { | 196 | { |
| 197 | struct dwc3_pci *glue = pci_get_drvdata(pci); | 197 | struct dwc3_pci *glue = pci_get_drvdata(pci); |
| 198 | 198 | ||
| 199 | platform_device_unregister(glue->dwc3); | ||
| 199 | platform_device_unregister(glue->usb2_phy); | 200 | platform_device_unregister(glue->usb2_phy); |
| 200 | platform_device_unregister(glue->usb3_phy); | 201 | platform_device_unregister(glue->usb3_phy); |
| 201 | platform_device_unregister(glue->dwc3); | ||
| 202 | pci_set_drvdata(pci, NULL); | 202 | pci_set_drvdata(pci, NULL); |
| 203 | pci_disable_device(pci); | 203 | pci_disable_device(pci); |
| 204 | } | 204 | } |
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 2b6e7e001207..b5e5b35df49c 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
| @@ -1706,11 +1706,19 @@ static void dwc3_gadget_free_endpoints(struct dwc3 *dwc) | |||
| 1706 | dep = dwc->eps[epnum]; | 1706 | dep = dwc->eps[epnum]; |
| 1707 | if (!dep) | 1707 | if (!dep) |
| 1708 | continue; | 1708 | continue; |
| 1709 | 1709 | /* | |
| 1710 | dwc3_free_trb_pool(dep); | 1710 | * Physical endpoints 0 and 1 are special; they form the |
| 1711 | 1711 | * bi-directional USB endpoint 0. | |
| 1712 | if (epnum != 0 && epnum != 1) | 1712 | * |
| 1713 | * For those two physical endpoints, we don't allocate a TRB | ||
| 1714 | * pool nor do we add them the endpoints list. Due to that, we | ||
| 1715 | * shouldn't do these two operations otherwise we would end up | ||
| 1716 | * with all sorts of bugs when removing dwc3.ko. | ||
| 1717 | */ | ||
| 1718 | if (epnum != 0 && epnum != 1) { | ||
| 1719 | dwc3_free_trb_pool(dep); | ||
| 1713 | list_del(&dep->endpoint.ep_list); | 1720 | list_del(&dep->endpoint.ep_list); |
| 1721 | } | ||
| 1714 | 1722 | ||
| 1715 | kfree(dep); | 1723 | kfree(dep); |
| 1716 | } | 1724 | } |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index acff5b8f6e89..f80d0330d548 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
| @@ -213,7 +213,7 @@ static inline unsigned char tt_start_uframe(struct ehci_hcd *ehci, __hc32 mask) | |||
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | static const unsigned char | 215 | static const unsigned char |
| 216 | max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 125, 25 }; | 216 | max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 30, 0 }; |
| 217 | 217 | ||
| 218 | /* carryover low/fullspeed bandwidth that crosses uframe boundries */ | 218 | /* carryover low/fullspeed bandwidth that crosses uframe boundries */ |
| 219 | static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8]) | 219 | static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8]) |
| @@ -646,6 +646,10 @@ static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 646 | /* reschedule QH iff another request is queued */ | 646 | /* reschedule QH iff another request is queued */ |
| 647 | if (!list_empty(&qh->qtd_list) && ehci->rh_state == EHCI_RH_RUNNING) { | 647 | if (!list_empty(&qh->qtd_list) && ehci->rh_state == EHCI_RH_RUNNING) { |
| 648 | rc = qh_schedule(ehci, qh); | 648 | rc = qh_schedule(ehci, qh); |
| 649 | if (rc == 0) { | ||
| 650 | qh_refresh(ehci, qh); | ||
| 651 | qh_link_periodic(ehci, qh); | ||
| 652 | } | ||
| 649 | 653 | ||
| 650 | /* An error here likely indicates handshake failure | 654 | /* An error here likely indicates handshake failure |
| 651 | * or no space left in the schedule. Neither fault | 655 | * or no space left in the schedule. Neither fault |
| @@ -653,9 +657,10 @@ static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 653 | * | 657 | * |
| 654 | * FIXME kill the now-dysfunctional queued urbs | 658 | * FIXME kill the now-dysfunctional queued urbs |
| 655 | */ | 659 | */ |
| 656 | if (rc != 0) | 660 | else { |
| 657 | ehci_err(ehci, "can't reschedule qh %p, err %d\n", | 661 | ehci_err(ehci, "can't reschedule qh %p, err %d\n", |
| 658 | qh, rc); | 662 | qh, rc); |
| 663 | } | ||
| 659 | } | 664 | } |
| 660 | 665 | ||
| 661 | /* maybe turn off periodic schedule */ | 666 | /* maybe turn off periodic schedule */ |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 2cfc465925bd..fbf75e57628b 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
| @@ -1827,6 +1827,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | |||
| 1827 | } | 1827 | } |
| 1828 | spin_unlock_irqrestore(&xhci->lock, flags); | 1828 | spin_unlock_irqrestore(&xhci->lock, flags); |
| 1829 | 1829 | ||
| 1830 | if (!xhci->rh_bw) | ||
| 1831 | goto no_bw; | ||
| 1832 | |||
| 1830 | num_ports = HCS_MAX_PORTS(xhci->hcs_params1); | 1833 | num_ports = HCS_MAX_PORTS(xhci->hcs_params1); |
| 1831 | for (i = 0; i < num_ports; i++) { | 1834 | for (i = 0; i < num_ports; i++) { |
| 1832 | struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; | 1835 | struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; |
| @@ -1845,6 +1848,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | |||
| 1845 | } | 1848 | } |
| 1846 | } | 1849 | } |
| 1847 | 1850 | ||
| 1851 | no_bw: | ||
| 1848 | xhci->num_usb2_ports = 0; | 1852 | xhci->num_usb2_ports = 0; |
| 1849 | xhci->num_usb3_ports = 0; | 1853 | xhci->num_usb3_ports = 0; |
| 1850 | xhci->num_active_eps = 0; | 1854 | xhci->num_active_eps = 0; |
| @@ -2256,6 +2260,9 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
| 2256 | u32 page_size, temp; | 2260 | u32 page_size, temp; |
| 2257 | int i; | 2261 | int i; |
| 2258 | 2262 | ||
| 2263 | INIT_LIST_HEAD(&xhci->lpm_failed_devs); | ||
| 2264 | INIT_LIST_HEAD(&xhci->cancel_cmd_list); | ||
| 2265 | |||
| 2259 | page_size = xhci_readl(xhci, &xhci->op_regs->page_size); | 2266 | page_size = xhci_readl(xhci, &xhci->op_regs->page_size); |
| 2260 | xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size); | 2267 | xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size); |
| 2261 | for (i = 0; i < 16; i++) { | 2268 | for (i = 0; i < 16; i++) { |
| @@ -2334,7 +2341,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
| 2334 | xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags); | 2341 | xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags); |
| 2335 | if (!xhci->cmd_ring) | 2342 | if (!xhci->cmd_ring) |
| 2336 | goto fail; | 2343 | goto fail; |
| 2337 | INIT_LIST_HEAD(&xhci->cancel_cmd_list); | ||
| 2338 | xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring); | 2344 | xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring); |
| 2339 | xhci_dbg(xhci, "First segment DMA is 0x%llx\n", | 2345 | xhci_dbg(xhci, "First segment DMA is 0x%llx\n", |
| 2340 | (unsigned long long)xhci->cmd_ring->first_seg->dma); | 2346 | (unsigned long long)xhci->cmd_ring->first_seg->dma); |
| @@ -2445,8 +2451,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
| 2445 | if (xhci_setup_port_arrays(xhci, flags)) | 2451 | if (xhci_setup_port_arrays(xhci, flags)) |
| 2446 | goto fail; | 2452 | goto fail; |
| 2447 | 2453 | ||
| 2448 | INIT_LIST_HEAD(&xhci->lpm_failed_devs); | ||
| 2449 | |||
| 2450 | /* Enable USB 3.0 device notifications for function remote wake, which | 2454 | /* Enable USB 3.0 device notifications for function remote wake, which |
| 2451 | * is necessary for allowing USB 3.0 devices to do remote wakeup from | 2455 | * is necessary for allowing USB 3.0 devices to do remote wakeup from |
| 2452 | * U3 (device suspend). | 2456 | * U3 (device suspend). |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 1a30c380043c..cc24e39b97d5 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -221,6 +221,14 @@ static void xhci_pci_remove(struct pci_dev *dev) | |||
| 221 | static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) | 221 | static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) |
| 222 | { | 222 | { |
| 223 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 223 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 224 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | ||
| 225 | |||
| 226 | /* | ||
| 227 | * Systems with the TI redriver that loses port status change events | ||
| 228 | * need to have the registers polled during D3, so avoid D3cold. | ||
| 229 | */ | ||
| 230 | if (xhci_compliance_mode_recovery_timer_quirk_check()) | ||
| 231 | pdev->no_d3cold = true; | ||
| 224 | 232 | ||
| 225 | return xhci_suspend(xhci); | 233 | return xhci_suspend(xhci); |
| 226 | } | 234 | } |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index b4aa79d154b2..d8f640b12dd9 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -466,7 +466,7 @@ static void compliance_mode_recovery_timer_init(struct xhci_hcd *xhci) | |||
| 466 | * Systems: | 466 | * Systems: |
| 467 | * Vendor: Hewlett-Packard -> System Models: Z420, Z620 and Z820 | 467 | * Vendor: Hewlett-Packard -> System Models: Z420, Z620 and Z820 |
| 468 | */ | 468 | */ |
| 469 | static bool compliance_mode_recovery_timer_quirk_check(void) | 469 | bool xhci_compliance_mode_recovery_timer_quirk_check(void) |
| 470 | { | 470 | { |
| 471 | const char *dmi_product_name, *dmi_sys_vendor; | 471 | const char *dmi_product_name, *dmi_sys_vendor; |
| 472 | 472 | ||
| @@ -517,7 +517,7 @@ int xhci_init(struct usb_hcd *hcd) | |||
| 517 | xhci_dbg(xhci, "Finished xhci_init\n"); | 517 | xhci_dbg(xhci, "Finished xhci_init\n"); |
| 518 | 518 | ||
| 519 | /* Initializing Compliance Mode Recovery Data If Needed */ | 519 | /* Initializing Compliance Mode Recovery Data If Needed */ |
| 520 | if (compliance_mode_recovery_timer_quirk_check()) { | 520 | if (xhci_compliance_mode_recovery_timer_quirk_check()) { |
| 521 | xhci->quirks |= XHCI_COMP_MODE_QUIRK; | 521 | xhci->quirks |= XHCI_COMP_MODE_QUIRK; |
| 522 | compliance_mode_recovery_timer_init(xhci); | 522 | compliance_mode_recovery_timer_init(xhci); |
| 523 | } | 523 | } |
| @@ -956,6 +956,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 956 | struct usb_hcd *hcd = xhci_to_hcd(xhci); | 956 | struct usb_hcd *hcd = xhci_to_hcd(xhci); |
| 957 | struct usb_hcd *secondary_hcd; | 957 | struct usb_hcd *secondary_hcd; |
| 958 | int retval = 0; | 958 | int retval = 0; |
| 959 | bool comp_timer_running = false; | ||
| 959 | 960 | ||
| 960 | /* Wait a bit if either of the roothubs need to settle from the | 961 | /* Wait a bit if either of the roothubs need to settle from the |
| 961 | * transition into bus suspend. | 962 | * transition into bus suspend. |
| @@ -993,6 +994,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 993 | 994 | ||
| 994 | /* If restore operation fails, re-initialize the HC during resume */ | 995 | /* If restore operation fails, re-initialize the HC during resume */ |
| 995 | if ((temp & STS_SRE) || hibernated) { | 996 | if ((temp & STS_SRE) || hibernated) { |
| 997 | |||
| 998 | if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && | ||
| 999 | !(xhci_all_ports_seen_u0(xhci))) { | ||
| 1000 | del_timer_sync(&xhci->comp_mode_recovery_timer); | ||
| 1001 | xhci_dbg(xhci, "Compliance Mode Recovery Timer deleted!\n"); | ||
| 1002 | } | ||
| 1003 | |||
| 996 | /* Let the USB core know _both_ roothubs lost power. */ | 1004 | /* Let the USB core know _both_ roothubs lost power. */ |
| 997 | usb_root_hub_lost_power(xhci->main_hcd->self.root_hub); | 1005 | usb_root_hub_lost_power(xhci->main_hcd->self.root_hub); |
| 998 | usb_root_hub_lost_power(xhci->shared_hcd->self.root_hub); | 1006 | usb_root_hub_lost_power(xhci->shared_hcd->self.root_hub); |
| @@ -1035,6 +1043,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 1035 | retval = xhci_init(hcd->primary_hcd); | 1043 | retval = xhci_init(hcd->primary_hcd); |
| 1036 | if (retval) | 1044 | if (retval) |
| 1037 | return retval; | 1045 | return retval; |
| 1046 | comp_timer_running = true; | ||
| 1047 | |||
| 1038 | xhci_dbg(xhci, "Start the primary HCD\n"); | 1048 | xhci_dbg(xhci, "Start the primary HCD\n"); |
| 1039 | retval = xhci_run(hcd->primary_hcd); | 1049 | retval = xhci_run(hcd->primary_hcd); |
| 1040 | if (!retval) { | 1050 | if (!retval) { |
| @@ -1076,7 +1086,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 1076 | * to suffer the Compliance Mode issue again. It doesn't matter if | 1086 | * to suffer the Compliance Mode issue again. It doesn't matter if |
| 1077 | * ports have entered previously to U0 before system's suspension. | 1087 | * ports have entered previously to U0 before system's suspension. |
| 1078 | */ | 1088 | */ |
| 1079 | if (xhci->quirks & XHCI_COMP_MODE_QUIRK) | 1089 | if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && !comp_timer_running) |
| 1080 | compliance_mode_recovery_timer_init(xhci); | 1090 | compliance_mode_recovery_timer_init(xhci); |
| 1081 | 1091 | ||
| 1082 | /* Re-enable port polling. */ | 1092 | /* Re-enable port polling. */ |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 29c978e37135..77600cefcaf1 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -1853,4 +1853,7 @@ struct xhci_input_control_ctx *xhci_get_input_control_ctx(struct xhci_hcd *xhci, | |||
| 1853 | struct xhci_slot_ctx *xhci_get_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx); | 1853 | struct xhci_slot_ctx *xhci_get_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx); |
| 1854 | struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx, unsigned int ep_index); | 1854 | struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx, unsigned int ep_index); |
| 1855 | 1855 | ||
| 1856 | /* xHCI quirks */ | ||
| 1857 | bool xhci_compliance_mode_recovery_timer_quirk_check(void); | ||
| 1858 | |||
| 1856 | #endif /* __LINUX_XHCI_HCD_H */ | 1859 | #endif /* __LINUX_XHCI_HCD_H */ |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 8914dec49f01..9d3044bdebe5 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -1232,7 +1232,6 @@ void musb_host_tx(struct musb *musb, u8 epnum) | |||
| 1232 | void __iomem *mbase = musb->mregs; | 1232 | void __iomem *mbase = musb->mregs; |
| 1233 | struct dma_channel *dma; | 1233 | struct dma_channel *dma; |
| 1234 | bool transfer_pending = false; | 1234 | bool transfer_pending = false; |
| 1235 | static bool use_sg; | ||
| 1236 | 1235 | ||
| 1237 | musb_ep_select(mbase, epnum); | 1236 | musb_ep_select(mbase, epnum); |
| 1238 | tx_csr = musb_readw(epio, MUSB_TXCSR); | 1237 | tx_csr = musb_readw(epio, MUSB_TXCSR); |
| @@ -1463,9 +1462,9 @@ done: | |||
| 1463 | * NULL. | 1462 | * NULL. |
| 1464 | */ | 1463 | */ |
| 1465 | if (!urb->transfer_buffer) | 1464 | if (!urb->transfer_buffer) |
| 1466 | use_sg = true; | 1465 | qh->use_sg = true; |
| 1467 | 1466 | ||
| 1468 | if (use_sg) { | 1467 | if (qh->use_sg) { |
| 1469 | /* sg_miter_start is already done in musb_ep_program */ | 1468 | /* sg_miter_start is already done in musb_ep_program */ |
| 1470 | if (!sg_miter_next(&qh->sg_miter)) { | 1469 | if (!sg_miter_next(&qh->sg_miter)) { |
| 1471 | dev_err(musb->controller, "error: sg list empty\n"); | 1470 | dev_err(musb->controller, "error: sg list empty\n"); |
| @@ -1484,9 +1483,9 @@ done: | |||
| 1484 | 1483 | ||
| 1485 | qh->segsize = length; | 1484 | qh->segsize = length; |
| 1486 | 1485 | ||
| 1487 | if (use_sg) { | 1486 | if (qh->use_sg) { |
| 1488 | if (offset + length >= urb->transfer_buffer_length) | 1487 | if (offset + length >= urb->transfer_buffer_length) |
| 1489 | use_sg = false; | 1488 | qh->use_sg = false; |
| 1490 | } | 1489 | } |
| 1491 | 1490 | ||
| 1492 | musb_ep_select(mbase, epnum); | 1491 | musb_ep_select(mbase, epnum); |
| @@ -1552,7 +1551,6 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1552 | bool done = false; | 1551 | bool done = false; |
| 1553 | u32 status; | 1552 | u32 status; |
| 1554 | struct dma_channel *dma; | 1553 | struct dma_channel *dma; |
| 1555 | static bool use_sg; | ||
| 1556 | unsigned int sg_flags = SG_MITER_ATOMIC | SG_MITER_TO_SG; | 1554 | unsigned int sg_flags = SG_MITER_ATOMIC | SG_MITER_TO_SG; |
| 1557 | 1555 | ||
| 1558 | musb_ep_select(mbase, epnum); | 1556 | musb_ep_select(mbase, epnum); |
| @@ -1878,12 +1876,12 @@ void musb_host_rx(struct musb *musb, u8 epnum) | |||
| 1878 | * NULL. | 1876 | * NULL. |
| 1879 | */ | 1877 | */ |
| 1880 | if (!urb->transfer_buffer) { | 1878 | if (!urb->transfer_buffer) { |
| 1881 | use_sg = true; | 1879 | qh->use_sg = true; |
| 1882 | sg_miter_start(&qh->sg_miter, urb->sg, 1, | 1880 | sg_miter_start(&qh->sg_miter, urb->sg, 1, |
| 1883 | sg_flags); | 1881 | sg_flags); |
| 1884 | } | 1882 | } |
| 1885 | 1883 | ||
| 1886 | if (use_sg) { | 1884 | if (qh->use_sg) { |
| 1887 | if (!sg_miter_next(&qh->sg_miter)) { | 1885 | if (!sg_miter_next(&qh->sg_miter)) { |
| 1888 | dev_err(musb->controller, "error: sg list empty\n"); | 1886 | dev_err(musb->controller, "error: sg list empty\n"); |
| 1889 | sg_miter_stop(&qh->sg_miter); | 1887 | sg_miter_stop(&qh->sg_miter); |
| @@ -1913,8 +1911,8 @@ finish: | |||
| 1913 | urb->actual_length += xfer_len; | 1911 | urb->actual_length += xfer_len; |
| 1914 | qh->offset += xfer_len; | 1912 | qh->offset += xfer_len; |
| 1915 | if (done) { | 1913 | if (done) { |
| 1916 | if (use_sg) | 1914 | if (qh->use_sg) |
| 1917 | use_sg = false; | 1915 | qh->use_sg = false; |
| 1918 | 1916 | ||
| 1919 | if (urb->status == -EINPROGRESS) | 1917 | if (urb->status == -EINPROGRESS) |
| 1920 | urb->status = status; | 1918 | urb->status = status; |
diff --git a/drivers/usb/musb/musb_host.h b/drivers/usb/musb/musb_host.h index 5a9c8feec10c..738f7eb60df9 100644 --- a/drivers/usb/musb/musb_host.h +++ b/drivers/usb/musb/musb_host.h | |||
| @@ -74,6 +74,7 @@ struct musb_qh { | |||
| 74 | u16 frame; /* for periodic schedule */ | 74 | u16 frame; /* for periodic schedule */ |
| 75 | unsigned iso_idx; /* in urb->iso_frame_desc[] */ | 75 | unsigned iso_idx; /* in urb->iso_frame_desc[] */ |
| 76 | struct sg_mapping_iter sg_miter; /* for highmem in PIO mode */ | 76 | struct sg_mapping_iter sg_miter; /* for highmem in PIO mode */ |
| 77 | bool use_sg; /* to track urb using sglist */ | ||
| 77 | }; | 78 | }; |
| 78 | 79 | ||
| 79 | /* map from control or bulk queue head to the first qh on that ring */ | 80 | /* map from control or bulk queue head to the first qh on that ring */ |
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index 3b16118cbf62..40e7fd94646f 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
| @@ -43,7 +43,7 @@ | |||
| 43 | #define DRIVER_NAME "ark3116" | 43 | #define DRIVER_NAME "ark3116" |
| 44 | 44 | ||
| 45 | /* usb timeout of 1 second */ | 45 | /* usb timeout of 1 second */ |
| 46 | #define ARK_TIMEOUT (1*HZ) | 46 | #define ARK_TIMEOUT 1000 |
| 47 | 47 | ||
| 48 | static const struct usb_device_id id_table[] = { | 48 | static const struct usb_device_id id_table[] = { |
| 49 | { USB_DEVICE(0x6547, 0x0232) }, | 49 | { USB_DEVICE(0x6547, 0x0232) }, |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index d341555d37d8..082120198f87 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
| @@ -65,6 +65,7 @@ static const struct usb_device_id id_table_earthmate[] = { | |||
| 65 | static const struct usb_device_id id_table_cyphidcomrs232[] = { | 65 | static const struct usb_device_id id_table_cyphidcomrs232[] = { |
| 66 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, | 66 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, |
| 67 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, | 67 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, |
| 68 | { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) }, | ||
| 68 | { } /* Terminating entry */ | 69 | { } /* Terminating entry */ |
| 69 | }; | 70 | }; |
| 70 | 71 | ||
| @@ -78,6 +79,7 @@ static const struct usb_device_id id_table_combined[] = { | |||
| 78 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, | 79 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, |
| 79 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, | 80 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, |
| 80 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, | 81 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, |
| 82 | { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) }, | ||
| 81 | { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, | 83 | { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, |
| 82 | { } /* Terminating entry */ | 84 | { } /* Terminating entry */ |
| 83 | }; | 85 | }; |
| @@ -229,6 +231,12 @@ static struct usb_serial_driver * const serial_drivers[] = { | |||
| 229 | * Cypress serial helper functions | 231 | * Cypress serial helper functions |
| 230 | *****************************************************************************/ | 232 | *****************************************************************************/ |
| 231 | 233 | ||
| 234 | /* FRWD Dongle hidcom needs to skip reset and speed checks */ | ||
| 235 | static inline bool is_frwd(struct usb_device *dev) | ||
| 236 | { | ||
| 237 | return ((le16_to_cpu(dev->descriptor.idVendor) == VENDOR_ID_FRWD) && | ||
| 238 | (le16_to_cpu(dev->descriptor.idProduct) == PRODUCT_ID_CYPHIDCOM_FRWD)); | ||
| 239 | } | ||
| 232 | 240 | ||
| 233 | static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate) | 241 | static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate) |
| 234 | { | 242 | { |
| @@ -238,6 +246,10 @@ static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate) | |||
| 238 | if (unstable_bauds) | 246 | if (unstable_bauds) |
| 239 | return new_rate; | 247 | return new_rate; |
| 240 | 248 | ||
| 249 | /* FRWD Dongle uses 115200 bps */ | ||
| 250 | if (is_frwd(port->serial->dev)) | ||
| 251 | return new_rate; | ||
| 252 | |||
| 241 | /* | 253 | /* |
| 242 | * The general purpose firmware for the Cypress M8 allows for | 254 | * The general purpose firmware for the Cypress M8 allows for |
| 243 | * a maximum speed of 57600bps (I have no idea whether DeLorme | 255 | * a maximum speed of 57600bps (I have no idea whether DeLorme |
| @@ -448,7 +460,11 @@ static int cypress_generic_port_probe(struct usb_serial_port *port) | |||
| 448 | return -ENOMEM; | 460 | return -ENOMEM; |
| 449 | } | 461 | } |
| 450 | 462 | ||
| 451 | usb_reset_configuration(serial->dev); | 463 | /* Skip reset for FRWD device. It is a workaound: |
| 464 | device hangs if it receives SET_CONFIGURE in Configured | ||
| 465 | state. */ | ||
| 466 | if (!is_frwd(serial->dev)) | ||
| 467 | usb_reset_configuration(serial->dev); | ||
| 452 | 468 | ||
| 453 | priv->cmd_ctrl = 0; | 469 | priv->cmd_ctrl = 0; |
| 454 | priv->line_control = 0; | 470 | priv->line_control = 0; |
diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h index 67cf60826884..b461311a2ae7 100644 --- a/drivers/usb/serial/cypress_m8.h +++ b/drivers/usb/serial/cypress_m8.h | |||
| @@ -24,6 +24,10 @@ | |||
| 24 | #define VENDOR_ID_CYPRESS 0x04b4 | 24 | #define VENDOR_ID_CYPRESS 0x04b4 |
| 25 | #define PRODUCT_ID_CYPHIDCOM 0x5500 | 25 | #define PRODUCT_ID_CYPHIDCOM 0x5500 |
| 26 | 26 | ||
| 27 | /* FRWD Dongle - a GPS sports watch */ | ||
| 28 | #define VENDOR_ID_FRWD 0x6737 | ||
| 29 | #define PRODUCT_ID_CYPHIDCOM_FRWD 0x0001 | ||
| 30 | |||
| 27 | /* Powercom UPS, chip CY7C63723 */ | 31 | /* Powercom UPS, chip CY7C63723 */ |
| 28 | #define VENDOR_ID_POWERCOM 0x0d9f | 32 | #define VENDOR_ID_POWERCOM 0x0d9f |
| 29 | #define PRODUCT_ID_UPS 0x0002 | 33 | #define PRODUCT_ID_UPS 0x0002 |
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index 9d74c278b7b5..790673e5faa7 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c | |||
| @@ -287,7 +287,7 @@ static int bulk_immediate(struct usb_serial_port *port, u8 *buf, u8 count) | |||
| 287 | usb_bulk_msg(serial->dev, | 287 | usb_bulk_msg(serial->dev, |
| 288 | usb_sndbulkpipe(serial->dev, | 288 | usb_sndbulkpipe(serial->dev, |
| 289 | port->bulk_out_endpointAddress), buf, | 289 | port->bulk_out_endpointAddress), buf, |
| 290 | count, &actual, HZ * 1); | 290 | count, &actual, 1000); |
| 291 | 291 | ||
| 292 | if (status != IUU_OPERATION_OK) | 292 | if (status != IUU_OPERATION_OK) |
| 293 | dev_dbg(&port->dev, "%s - error = %2x\n", __func__, status); | 293 | dev_dbg(&port->dev, "%s - error = %2x\n", __func__, status); |
| @@ -307,7 +307,7 @@ static int read_immediate(struct usb_serial_port *port, u8 *buf, u8 count) | |||
| 307 | usb_bulk_msg(serial->dev, | 307 | usb_bulk_msg(serial->dev, |
| 308 | usb_rcvbulkpipe(serial->dev, | 308 | usb_rcvbulkpipe(serial->dev, |
| 309 | port->bulk_in_endpointAddress), buf, | 309 | port->bulk_in_endpointAddress), buf, |
| 310 | count, &actual, HZ * 1); | 310 | count, &actual, 1000); |
| 311 | 311 | ||
| 312 | if (status != IUU_OPERATION_OK) | 312 | if (status != IUU_OPERATION_OK) |
| 313 | dev_dbg(&port->dev, "%s - error = %2x\n", __func__, status); | 313 | dev_dbg(&port->dev, "%s - error = %2x\n", __func__, status); |
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index eb30d7b01f36..3549d073df22 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
| @@ -1548,7 +1548,6 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial, | |||
| 1548 | struct keyspan_serial_private *s_priv; | 1548 | struct keyspan_serial_private *s_priv; |
| 1549 | struct keyspan_port_private *p_priv; | 1549 | struct keyspan_port_private *p_priv; |
| 1550 | const struct keyspan_device_details *d_details; | 1550 | const struct keyspan_device_details *d_details; |
| 1551 | int outcont_urb; | ||
| 1552 | struct urb *this_urb; | 1551 | struct urb *this_urb; |
| 1553 | int device_port, err; | 1552 | int device_port, err; |
| 1554 | 1553 | ||
| @@ -1559,7 +1558,6 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial, | |||
| 1559 | d_details = s_priv->device_details; | 1558 | d_details = s_priv->device_details; |
| 1560 | device_port = port->number - port->serial->minor; | 1559 | device_port = port->number - port->serial->minor; |
| 1561 | 1560 | ||
| 1562 | outcont_urb = d_details->outcont_endpoints[port->number]; | ||
| 1563 | this_urb = p_priv->outcont_urb; | 1561 | this_urb = p_priv->outcont_urb; |
| 1564 | 1562 | ||
| 1565 | dev_dbg(&port->dev, "%s - endpoint %d\n", __func__, usb_pipeendpoint(this_urb->pipe)); | 1563 | dev_dbg(&port->dev, "%s - endpoint %d\n", __func__, usb_pipeendpoint(this_urb->pipe)); |
| @@ -1685,14 +1683,6 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial, | |||
| 1685 | err = usb_submit_urb(this_urb, GFP_ATOMIC); | 1683 | err = usb_submit_urb(this_urb, GFP_ATOMIC); |
| 1686 | if (err != 0) | 1684 | if (err != 0) |
| 1687 | dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err); | 1685 | dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err); |
| 1688 | #if 0 | ||
| 1689 | else { | ||
| 1690 | dev_dbg(&port->dev, "%s - usb_submit_urb(%d) OK %d bytes (end %d)\n", __func__ | ||
| 1691 | outcont_urb, this_urb->transfer_buffer_length, | ||
| 1692 | usb_pipeendpoint(this_urb->pipe)); | ||
| 1693 | } | ||
| 1694 | #endif | ||
| 1695 | |||
| 1696 | return 0; | 1686 | return 0; |
| 1697 | } | 1687 | } |
| 1698 | 1688 | ||
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index cc0e54345df9..f27c621a9297 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #define DRIVER_DESC "Moschip USB Serial Driver" | 40 | #define DRIVER_DESC "Moschip USB Serial Driver" |
| 41 | 41 | ||
| 42 | /* default urb timeout */ | 42 | /* default urb timeout */ |
| 43 | #define MOS_WDR_TIMEOUT (HZ * 5) | 43 | #define MOS_WDR_TIMEOUT 5000 |
| 44 | 44 | ||
| 45 | #define MOS_MAX_PORT 0x02 | 45 | #define MOS_MAX_PORT 0x02 |
| 46 | #define MOS_WRITE 0x0E | 46 | #define MOS_WRITE 0x0E |
| @@ -227,11 +227,22 @@ static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum, | |||
| 227 | __u8 requesttype = (__u8)0xc0; | 227 | __u8 requesttype = (__u8)0xc0; |
| 228 | __u16 index = get_reg_index(reg); | 228 | __u16 index = get_reg_index(reg); |
| 229 | __u16 value = get_reg_value(reg, serial_portnum); | 229 | __u16 value = get_reg_value(reg, serial_portnum); |
| 230 | int status = usb_control_msg(usbdev, pipe, request, requesttype, value, | 230 | u8 *buf; |
| 231 | index, data, 1, MOS_WDR_TIMEOUT); | 231 | int status; |
| 232 | if (status < 0) | 232 | |
| 233 | buf = kmalloc(1, GFP_KERNEL); | ||
| 234 | if (!buf) | ||
| 235 | return -ENOMEM; | ||
| 236 | |||
| 237 | status = usb_control_msg(usbdev, pipe, request, requesttype, value, | ||
| 238 | index, buf, 1, MOS_WDR_TIMEOUT); | ||
| 239 | if (status == 1) | ||
| 240 | *data = *buf; | ||
| 241 | else if (status < 0) | ||
| 233 | dev_err(&usbdev->dev, | 242 | dev_err(&usbdev->dev, |
| 234 | "mos7720: usb_control_msg() failed: %d", status); | 243 | "mos7720: usb_control_msg() failed: %d", status); |
| 244 | kfree(buf); | ||
| 245 | |||
| 235 | return status; | 246 | return status; |
| 236 | } | 247 | } |
| 237 | 248 | ||
| @@ -1618,7 +1629,7 @@ static void change_port_settings(struct tty_struct *tty, | |||
| 1618 | mos7720_port->shadowMCR |= (UART_MCR_XONANY); | 1629 | mos7720_port->shadowMCR |= (UART_MCR_XONANY); |
| 1619 | /* To set hardware flow control to the specified * | 1630 | /* To set hardware flow control to the specified * |
| 1620 | * serial port, in SP1/2_CONTROL_REG */ | 1631 | * serial port, in SP1/2_CONTROL_REG */ |
| 1621 | if (port->number) | 1632 | if (port_number) |
| 1622 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x01); | 1633 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x01); |
| 1623 | else | 1634 | else |
| 1624 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x02); | 1635 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x02); |
| @@ -1927,7 +1938,7 @@ static int mos7720_startup(struct usb_serial *serial) | |||
| 1927 | 1938 | ||
| 1928 | /* setting configuration feature to one */ | 1939 | /* setting configuration feature to one */ |
| 1929 | usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), | 1940 | usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), |
| 1930 | (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5*HZ); | 1941 | (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000); |
| 1931 | 1942 | ||
| 1932 | /* start the interrupt urb */ | 1943 | /* start the interrupt urb */ |
| 1933 | ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL); | 1944 | ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL); |
| @@ -1970,7 +1981,7 @@ static void mos7720_release(struct usb_serial *serial) | |||
| 1970 | /* wait for synchronous usb calls to return */ | 1981 | /* wait for synchronous usb calls to return */ |
| 1971 | if (mos_parport->msg_pending) | 1982 | if (mos_parport->msg_pending) |
| 1972 | wait_for_completion_timeout(&mos_parport->syncmsg_compl, | 1983 | wait_for_completion_timeout(&mos_parport->syncmsg_compl, |
| 1973 | MOS_WDR_TIMEOUT); | 1984 | msecs_to_jiffies(MOS_WDR_TIMEOUT)); |
| 1974 | 1985 | ||
| 1975 | parport_remove_port(mos_parport->pp); | 1986 | parport_remove_port(mos_parport->pp); |
| 1976 | usb_set_serial_data(serial, NULL); | 1987 | usb_set_serial_data(serial, NULL); |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index a0d5ea545982..7e998081e1cd 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
| @@ -2142,13 +2142,21 @@ static int mos7840_ioctl(struct tty_struct *tty, | |||
| 2142 | static int mos7810_check(struct usb_serial *serial) | 2142 | static int mos7810_check(struct usb_serial *serial) |
| 2143 | { | 2143 | { |
| 2144 | int i, pass_count = 0; | 2144 | int i, pass_count = 0; |
| 2145 | u8 *buf; | ||
| 2145 | __u16 data = 0, mcr_data = 0; | 2146 | __u16 data = 0, mcr_data = 0; |
| 2146 | __u16 test_pattern = 0x55AA; | 2147 | __u16 test_pattern = 0x55AA; |
| 2148 | int res; | ||
| 2149 | |||
| 2150 | buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL); | ||
| 2151 | if (!buf) | ||
| 2152 | return 0; /* failed to identify 7810 */ | ||
| 2147 | 2153 | ||
| 2148 | /* Store MCR setting */ | 2154 | /* Store MCR setting */ |
| 2149 | usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | 2155 | res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), |
| 2150 | MCS_RDREQ, MCS_RD_RTYPE, 0x0300, MODEM_CONTROL_REGISTER, | 2156 | MCS_RDREQ, MCS_RD_RTYPE, 0x0300, MODEM_CONTROL_REGISTER, |
| 2151 | &mcr_data, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | 2157 | buf, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); |
| 2158 | if (res == VENDOR_READ_LENGTH) | ||
| 2159 | mcr_data = *buf; | ||
| 2152 | 2160 | ||
| 2153 | for (i = 0; i < 16; i++) { | 2161 | for (i = 0; i < 16; i++) { |
| 2154 | /* Send the 1-bit test pattern out to MCS7810 test pin */ | 2162 | /* Send the 1-bit test pattern out to MCS7810 test pin */ |
| @@ -2158,9 +2166,12 @@ static int mos7810_check(struct usb_serial *serial) | |||
| 2158 | MODEM_CONTROL_REGISTER, NULL, 0, MOS_WDR_TIMEOUT); | 2166 | MODEM_CONTROL_REGISTER, NULL, 0, MOS_WDR_TIMEOUT); |
| 2159 | 2167 | ||
| 2160 | /* Read the test pattern back */ | 2168 | /* Read the test pattern back */ |
| 2161 | usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | 2169 | res = usb_control_msg(serial->dev, |
| 2162 | MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, &data, | 2170 | usb_rcvctrlpipe(serial->dev, 0), MCS_RDREQ, |
| 2163 | VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | 2171 | MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, |
| 2172 | VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | ||
| 2173 | if (res == VENDOR_READ_LENGTH) | ||
| 2174 | data = *buf; | ||
| 2164 | 2175 | ||
| 2165 | /* If this is a MCS7810 device, both test patterns must match */ | 2176 | /* If this is a MCS7810 device, both test patterns must match */ |
| 2166 | if (((test_pattern >> i) ^ (~data >> 1)) & 0x0001) | 2177 | if (((test_pattern >> i) ^ (~data >> 1)) & 0x0001) |
| @@ -2174,6 +2185,8 @@ static int mos7810_check(struct usb_serial *serial) | |||
| 2174 | MCS_WR_RTYPE, 0x0300 | mcr_data, MODEM_CONTROL_REGISTER, NULL, | 2185 | MCS_WR_RTYPE, 0x0300 | mcr_data, MODEM_CONTROL_REGISTER, NULL, |
| 2175 | 0, MOS_WDR_TIMEOUT); | 2186 | 0, MOS_WDR_TIMEOUT); |
| 2176 | 2187 | ||
| 2188 | kfree(buf); | ||
| 2189 | |||
| 2177 | if (pass_count == 16) | 2190 | if (pass_count == 16) |
| 2178 | return 1; | 2191 | return 1; |
| 2179 | 2192 | ||
| @@ -2183,11 +2196,17 @@ static int mos7810_check(struct usb_serial *serial) | |||
| 2183 | static int mos7840_calc_num_ports(struct usb_serial *serial) | 2196 | static int mos7840_calc_num_ports(struct usb_serial *serial) |
| 2184 | { | 2197 | { |
| 2185 | __u16 data = 0x00; | 2198 | __u16 data = 0x00; |
| 2199 | u8 *buf; | ||
| 2186 | int mos7840_num_ports; | 2200 | int mos7840_num_ports; |
| 2187 | 2201 | ||
| 2188 | usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | 2202 | buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL); |
| 2189 | MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, &data, | 2203 | if (buf) { |
| 2190 | VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | 2204 | usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), |
| 2205 | MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, | ||
| 2206 | VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | ||
| 2207 | data = *buf; | ||
| 2208 | kfree(buf); | ||
| 2209 | } | ||
| 2191 | 2210 | ||
| 2192 | if (serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7810 || | 2211 | if (serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7810 || |
| 2193 | serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7820) { | 2212 | serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7820) { |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 93d02bc4eb52..bd4323ddae1a 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -250,13 +250,7 @@ static void option_instat_callback(struct urb *urb); | |||
| 250 | #define ZTE_PRODUCT_MF622 0x0001 | 250 | #define ZTE_PRODUCT_MF622 0x0001 |
| 251 | #define ZTE_PRODUCT_MF628 0x0015 | 251 | #define ZTE_PRODUCT_MF628 0x0015 |
| 252 | #define ZTE_PRODUCT_MF626 0x0031 | 252 | #define ZTE_PRODUCT_MF626 0x0031 |
| 253 | #define ZTE_PRODUCT_CDMA_TECH 0xfffe | ||
| 254 | #define ZTE_PRODUCT_AC8710 0xfff1 | ||
| 255 | #define ZTE_PRODUCT_AC2726 0xfff5 | ||
| 256 | #define ZTE_PRODUCT_AC8710T 0xffff | ||
| 257 | #define ZTE_PRODUCT_MC2718 0xffe8 | 253 | #define ZTE_PRODUCT_MC2718 0xffe8 |
| 258 | #define ZTE_PRODUCT_AD3812 0xffeb | ||
| 259 | #define ZTE_PRODUCT_MC2716 0xffed | ||
| 260 | 254 | ||
| 261 | #define BENQ_VENDOR_ID 0x04a5 | 255 | #define BENQ_VENDOR_ID 0x04a5 |
| 262 | #define BENQ_PRODUCT_H10 0x4068 | 256 | #define BENQ_PRODUCT_H10 0x4068 |
| @@ -495,18 +489,10 @@ static const struct option_blacklist_info zte_k3765_z_blacklist = { | |||
| 495 | .reserved = BIT(4), | 489 | .reserved = BIT(4), |
| 496 | }; | 490 | }; |
| 497 | 491 | ||
| 498 | static const struct option_blacklist_info zte_ad3812_z_blacklist = { | ||
| 499 | .sendsetup = BIT(0) | BIT(1) | BIT(2), | ||
| 500 | }; | ||
| 501 | |||
| 502 | static const struct option_blacklist_info zte_mc2718_z_blacklist = { | 492 | static const struct option_blacklist_info zte_mc2718_z_blacklist = { |
| 503 | .sendsetup = BIT(1) | BIT(2) | BIT(3) | BIT(4), | 493 | .sendsetup = BIT(1) | BIT(2) | BIT(3) | BIT(4), |
| 504 | }; | 494 | }; |
| 505 | 495 | ||
| 506 | static const struct option_blacklist_info zte_mc2716_z_blacklist = { | ||
| 507 | .sendsetup = BIT(1) | BIT(2) | BIT(3), | ||
| 508 | }; | ||
| 509 | |||
| 510 | static const struct option_blacklist_info huawei_cdc12_blacklist = { | 496 | static const struct option_blacklist_info huawei_cdc12_blacklist = { |
| 511 | .reserved = BIT(1) | BIT(2), | 497 | .reserved = BIT(1) | BIT(2), |
| 512 | }; | 498 | }; |
| @@ -593,6 +579,8 @@ static const struct usb_device_id option_ids[] = { | |||
| 593 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, | 579 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, |
| 594 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff), | 580 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff), |
| 595 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, | 581 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, |
| 582 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x14ac, 0xff, 0xff, 0xff), /* Huawei E1820 */ | ||
| 583 | .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, | ||
| 596 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff), | 584 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff), |
| 597 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, | 585 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, |
| 598 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0xff, 0xff) }, | 586 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0xff, 0xff) }, |
| @@ -797,7 +785,6 @@ static const struct usb_device_id option_ids[] = { | |||
| 797 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012, 0xff) }, | 785 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012, 0xff) }, |
| 798 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, | 786 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, |
| 799 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, | 787 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, |
| 800 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ | ||
| 801 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | 788 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
| 802 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | 789 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ |
| 803 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ | 790 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ |
| @@ -1199,16 +1186,9 @@ static const struct usb_device_id option_ids[] = { | |||
| 1199 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff), | 1186 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff), |
| 1200 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | 1187 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, |
| 1201 | 1188 | ||
| 1202 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, | 1189 | /* NOTE: most ZTE CDMA devices should be driven by zte_ev, not option */ |
| 1203 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, | ||
| 1204 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, | ||
| 1205 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) }, | ||
| 1206 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff), | 1190 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff), |
| 1207 | .driver_info = (kernel_ulong_t)&zte_mc2718_z_blacklist }, | 1191 | .driver_info = (kernel_ulong_t)&zte_mc2718_z_blacklist }, |
| 1208 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AD3812, 0xff, 0xff, 0xff), | ||
| 1209 | .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist }, | ||
| 1210 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff), | ||
| 1211 | .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist }, | ||
| 1212 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, | 1192 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, |
| 1213 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, | 1193 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, |
| 1214 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, | 1194 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index 59b32b782126..bd794b43898c 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
| @@ -118,6 +118,7 @@ static const struct usb_device_id id_table[] = { | |||
| 118 | {USB_DEVICE(0x1199, 0x901b)}, /* Sierra Wireless MC7770 */ | 118 | {USB_DEVICE(0x1199, 0x901b)}, /* Sierra Wireless MC7770 */ |
| 119 | {USB_DEVICE(0x12D1, 0x14F0)}, /* Sony Gobi 3000 QDL */ | 119 | {USB_DEVICE(0x12D1, 0x14F0)}, /* Sony Gobi 3000 QDL */ |
| 120 | {USB_DEVICE(0x12D1, 0x14F1)}, /* Sony Gobi 3000 Composite */ | 120 | {USB_DEVICE(0x12D1, 0x14F1)}, /* Sony Gobi 3000 Composite */ |
| 121 | {USB_DEVICE(0x0AF0, 0x8120)}, /* Option GTM681W */ | ||
| 121 | 122 | ||
| 122 | /* non Gobi Qualcomm serial devices */ | 123 | /* non Gobi Qualcomm serial devices */ |
| 123 | {USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 0)}, /* Sierra Wireless MC7700 Device Management */ | 124 | {USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 0)}, /* Sierra Wireless MC7700 Device Management */ |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 4753c005cfb6..5f6b1ff9d29e 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
| @@ -408,7 +408,7 @@ static int serial_ioctl(struct tty_struct *tty, | |||
| 408 | unsigned int cmd, unsigned long arg) | 408 | unsigned int cmd, unsigned long arg) |
| 409 | { | 409 | { |
| 410 | struct usb_serial_port *port = tty->driver_data; | 410 | struct usb_serial_port *port = tty->driver_data; |
| 411 | int retval = -ENODEV; | 411 | int retval = -ENOIOCTLCMD; |
| 412 | 412 | ||
| 413 | dev_dbg(tty->dev, "%s - cmd 0x%.4x\n", __func__, cmd); | 413 | dev_dbg(tty->dev, "%s - cmd 0x%.4x\n", __func__, cmd); |
| 414 | 414 | ||
| @@ -420,8 +420,6 @@ static int serial_ioctl(struct tty_struct *tty, | |||
| 420 | default: | 420 | default: |
| 421 | if (port->serial->type->ioctl) | 421 | if (port->serial->type->ioctl) |
| 422 | retval = port->serial->type->ioctl(tty, cmd, arg); | 422 | retval = port->serial->type->ioctl(tty, cmd, arg); |
| 423 | else | ||
| 424 | retval = -ENOIOCTLCMD; | ||
| 425 | } | 423 | } |
| 426 | 424 | ||
| 427 | return retval; | 425 | return retval; |
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index 7573ec8a084f..9910aa2edf4b 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c | |||
| @@ -560,10 +560,19 @@ static int treo_attach(struct usb_serial *serial) | |||
| 560 | */ | 560 | */ |
| 561 | #define COPY_PORT(dest, src) \ | 561 | #define COPY_PORT(dest, src) \ |
| 562 | do { \ | 562 | do { \ |
| 563 | int i; \ | ||
| 564 | \ | ||
| 565 | for (i = 0; i < ARRAY_SIZE(src->read_urbs); ++i) { \ | ||
| 566 | dest->read_urbs[i] = src->read_urbs[i]; \ | ||
| 567 | dest->read_urbs[i]->context = dest; \ | ||
| 568 | dest->bulk_in_buffers[i] = src->bulk_in_buffers[i]; \ | ||
| 569 | } \ | ||
| 563 | dest->read_urb = src->read_urb; \ | 570 | dest->read_urb = src->read_urb; \ |
| 564 | dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress;\ | 571 | dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress;\ |
| 565 | dest->bulk_in_buffer = src->bulk_in_buffer; \ | 572 | dest->bulk_in_buffer = src->bulk_in_buffer; \ |
| 573 | dest->bulk_in_size = src->bulk_in_size; \ | ||
| 566 | dest->interrupt_in_urb = src->interrupt_in_urb; \ | 574 | dest->interrupt_in_urb = src->interrupt_in_urb; \ |
| 575 | dest->interrupt_in_urb->context = dest; \ | ||
| 567 | dest->interrupt_in_endpointAddress = \ | 576 | dest->interrupt_in_endpointAddress = \ |
| 568 | src->interrupt_in_endpointAddress;\ | 577 | src->interrupt_in_endpointAddress;\ |
| 569 | dest->interrupt_in_buffer = src->interrupt_in_buffer; \ | 578 | dest->interrupt_in_buffer = src->interrupt_in_buffer; \ |
diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index b9fca3586d74..347caad47a12 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c | |||
| @@ -649,7 +649,7 @@ static void firm_setup_port(struct tty_struct *tty) | |||
| 649 | struct whiteheat_port_settings port_settings; | 649 | struct whiteheat_port_settings port_settings; |
| 650 | unsigned int cflag = tty->termios.c_cflag; | 650 | unsigned int cflag = tty->termios.c_cflag; |
| 651 | 651 | ||
| 652 | port_settings.port = port->number + 1; | 652 | port_settings.port = port->number - port->serial->minor + 1; |
| 653 | 653 | ||
| 654 | /* get the byte size */ | 654 | /* get the byte size */ |
| 655 | switch (cflag & CSIZE) { | 655 | switch (cflag & CSIZE) { |
diff --git a/drivers/usb/serial/zte_ev.c b/drivers/usb/serial/zte_ev.c index 39ee7373b4ee..fca4c752a4ed 100644 --- a/drivers/usb/serial/zte_ev.c +++ b/drivers/usb/serial/zte_ev.c | |||
| @@ -41,9 +41,6 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | |||
| 41 | int len; | 41 | int len; |
| 42 | unsigned char *buf; | 42 | unsigned char *buf; |
| 43 | 43 | ||
| 44 | if (port->number != 0) | ||
| 45 | return -ENODEV; | ||
| 46 | |||
| 47 | buf = kmalloc(MAX_SETUP_DATA_SIZE, GFP_KERNEL); | 44 | buf = kmalloc(MAX_SETUP_DATA_SIZE, GFP_KERNEL); |
| 48 | if (!buf) | 45 | if (!buf) |
| 49 | return -ENOMEM; | 46 | return -ENOMEM; |
| @@ -53,7 +50,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | |||
| 53 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 50 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 54 | 0x22, 0x21, | 51 | 0x22, 0x21, |
| 55 | 0x0001, 0x0000, NULL, len, | 52 | 0x0001, 0x0000, NULL, len, |
| 56 | HZ * USB_CTRL_GET_TIMEOUT); | 53 | USB_CTRL_GET_TIMEOUT); |
| 57 | dev_dbg(dev, "result = %d\n", result); | 54 | dev_dbg(dev, "result = %d\n", result); |
| 58 | 55 | ||
| 59 | /* send 2st cmd and recieve data */ | 56 | /* send 2st cmd and recieve data */ |
| @@ -65,7 +62,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | |||
| 65 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | 62 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
| 66 | 0x21, 0xa1, | 63 | 0x21, 0xa1, |
| 67 | 0x0000, 0x0000, buf, len, | 64 | 0x0000, 0x0000, buf, len, |
| 68 | HZ * USB_CTRL_GET_TIMEOUT); | 65 | USB_CTRL_GET_TIMEOUT); |
| 69 | debug_data(dev, __func__, len, buf, result); | 66 | debug_data(dev, __func__, len, buf, result); |
| 70 | 67 | ||
| 71 | /* send 3 cmd */ | 68 | /* send 3 cmd */ |
| @@ -84,7 +81,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | |||
| 84 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 81 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 85 | 0x20, 0x21, | 82 | 0x20, 0x21, |
| 86 | 0x0000, 0x0000, buf, len, | 83 | 0x0000, 0x0000, buf, len, |
| 87 | HZ * USB_CTRL_GET_TIMEOUT); | 84 | USB_CTRL_GET_TIMEOUT); |
| 88 | debug_data(dev, __func__, len, buf, result); | 85 | debug_data(dev, __func__, len, buf, result); |
| 89 | 86 | ||
| 90 | /* send 4 cmd */ | 87 | /* send 4 cmd */ |
| @@ -95,7 +92,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | |||
| 95 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 92 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 96 | 0x22, 0x21, | 93 | 0x22, 0x21, |
| 97 | 0x0003, 0x0000, NULL, len, | 94 | 0x0003, 0x0000, NULL, len, |
| 98 | HZ * USB_CTRL_GET_TIMEOUT); | 95 | USB_CTRL_GET_TIMEOUT); |
| 99 | dev_dbg(dev, "result = %d\n", result); | 96 | dev_dbg(dev, "result = %d\n", result); |
| 100 | 97 | ||
| 101 | /* send 5 cmd */ | 98 | /* send 5 cmd */ |
| @@ -107,7 +104,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | |||
| 107 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | 104 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
| 108 | 0x21, 0xa1, | 105 | 0x21, 0xa1, |
| 109 | 0x0000, 0x0000, buf, len, | 106 | 0x0000, 0x0000, buf, len, |
| 110 | HZ * USB_CTRL_GET_TIMEOUT); | 107 | USB_CTRL_GET_TIMEOUT); |
| 111 | debug_data(dev, __func__, len, buf, result); | 108 | debug_data(dev, __func__, len, buf, result); |
| 112 | 109 | ||
| 113 | /* send 6 cmd */ | 110 | /* send 6 cmd */ |
| @@ -126,7 +123,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | |||
| 126 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 123 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 127 | 0x20, 0x21, | 124 | 0x20, 0x21, |
| 128 | 0x0000, 0x0000, buf, len, | 125 | 0x0000, 0x0000, buf, len, |
| 129 | HZ * USB_CTRL_GET_TIMEOUT); | 126 | USB_CTRL_GET_TIMEOUT); |
| 130 | debug_data(dev, __func__, len, buf, result); | 127 | debug_data(dev, __func__, len, buf, result); |
| 131 | kfree(buf); | 128 | kfree(buf); |
| 132 | 129 | ||
| @@ -166,9 +163,6 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
| 166 | int len; | 163 | int len; |
| 167 | unsigned char *buf; | 164 | unsigned char *buf; |
| 168 | 165 | ||
| 169 | if (port->number != 0) | ||
| 170 | return; | ||
| 171 | |||
| 172 | buf = kmalloc(MAX_SETUP_DATA_SIZE, GFP_KERNEL); | 166 | buf = kmalloc(MAX_SETUP_DATA_SIZE, GFP_KERNEL); |
| 173 | if (!buf) | 167 | if (!buf) |
| 174 | return; | 168 | return; |
| @@ -178,7 +172,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
| 178 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 172 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 179 | 0x22, 0x21, | 173 | 0x22, 0x21, |
| 180 | 0x0002, 0x0000, NULL, len, | 174 | 0x0002, 0x0000, NULL, len, |
| 181 | HZ * USB_CTRL_GET_TIMEOUT); | 175 | USB_CTRL_GET_TIMEOUT); |
| 182 | dev_dbg(dev, "result = %d\n", result); | 176 | dev_dbg(dev, "result = %d\n", result); |
| 183 | 177 | ||
| 184 | /* send 2st ctl cmd(CTL 21 22 03 00 00 00 00 00 ) */ | 178 | /* send 2st ctl cmd(CTL 21 22 03 00 00 00 00 00 ) */ |
| @@ -186,7 +180,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
| 186 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 180 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 187 | 0x22, 0x21, | 181 | 0x22, 0x21, |
| 188 | 0x0003, 0x0000, NULL, len, | 182 | 0x0003, 0x0000, NULL, len, |
| 189 | HZ * USB_CTRL_GET_TIMEOUT); | 183 | USB_CTRL_GET_TIMEOUT); |
| 190 | dev_dbg(dev, "result = %d\n", result); | 184 | dev_dbg(dev, "result = %d\n", result); |
| 191 | 185 | ||
| 192 | /* send 3st cmd and recieve data */ | 186 | /* send 3st cmd and recieve data */ |
| @@ -198,7 +192,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
| 198 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | 192 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
| 199 | 0x21, 0xa1, | 193 | 0x21, 0xa1, |
| 200 | 0x0000, 0x0000, buf, len, | 194 | 0x0000, 0x0000, buf, len, |
| 201 | HZ * USB_CTRL_GET_TIMEOUT); | 195 | USB_CTRL_GET_TIMEOUT); |
| 202 | debug_data(dev, __func__, len, buf, result); | 196 | debug_data(dev, __func__, len, buf, result); |
| 203 | 197 | ||
| 204 | /* send 4 cmd */ | 198 | /* send 4 cmd */ |
| @@ -217,7 +211,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
| 217 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 211 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 218 | 0x20, 0x21, | 212 | 0x20, 0x21, |
| 219 | 0x0000, 0x0000, buf, len, | 213 | 0x0000, 0x0000, buf, len, |
| 220 | HZ * USB_CTRL_GET_TIMEOUT); | 214 | USB_CTRL_GET_TIMEOUT); |
| 221 | debug_data(dev, __func__, len, buf, result); | 215 | debug_data(dev, __func__, len, buf, result); |
| 222 | 216 | ||
| 223 | /* send 5 cmd */ | 217 | /* send 5 cmd */ |
| @@ -228,7 +222,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
| 228 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 222 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 229 | 0x22, 0x21, | 223 | 0x22, 0x21, |
| 230 | 0x0003, 0x0000, NULL, len, | 224 | 0x0003, 0x0000, NULL, len, |
| 231 | HZ * USB_CTRL_GET_TIMEOUT); | 225 | USB_CTRL_GET_TIMEOUT); |
| 232 | dev_dbg(dev, "result = %d\n", result); | 226 | dev_dbg(dev, "result = %d\n", result); |
| 233 | 227 | ||
| 234 | /* send 6 cmd */ | 228 | /* send 6 cmd */ |
| @@ -240,7 +234,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
| 240 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | 234 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
| 241 | 0x21, 0xa1, | 235 | 0x21, 0xa1, |
| 242 | 0x0000, 0x0000, buf, len, | 236 | 0x0000, 0x0000, buf, len, |
| 243 | HZ * USB_CTRL_GET_TIMEOUT); | 237 | USB_CTRL_GET_TIMEOUT); |
| 244 | debug_data(dev, __func__, len, buf, result); | 238 | debug_data(dev, __func__, len, buf, result); |
| 245 | 239 | ||
| 246 | /* send 7 cmd */ | 240 | /* send 7 cmd */ |
| @@ -259,7 +253,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
| 259 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 253 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 260 | 0x20, 0x21, | 254 | 0x20, 0x21, |
| 261 | 0x0000, 0x0000, buf, len, | 255 | 0x0000, 0x0000, buf, len, |
| 262 | HZ * USB_CTRL_GET_TIMEOUT); | 256 | USB_CTRL_GET_TIMEOUT); |
| 263 | debug_data(dev, __func__, len, buf, result); | 257 | debug_data(dev, __func__, len, buf, result); |
| 264 | 258 | ||
| 265 | /* send 8 cmd */ | 259 | /* send 8 cmd */ |
| @@ -270,7 +264,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
| 270 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 264 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), |
| 271 | 0x22, 0x21, | 265 | 0x22, 0x21, |
| 272 | 0x0003, 0x0000, NULL, len, | 266 | 0x0003, 0x0000, NULL, len, |
| 273 | HZ * USB_CTRL_GET_TIMEOUT); | 267 | USB_CTRL_GET_TIMEOUT); |
| 274 | dev_dbg(dev, "result = %d\n", result); | 268 | dev_dbg(dev, "result = %d\n", result); |
| 275 | 269 | ||
| 276 | kfree(buf); | 270 | kfree(buf); |
| @@ -279,11 +273,29 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | |||
| 279 | } | 273 | } |
| 280 | 274 | ||
| 281 | static const struct usb_device_id id_table[] = { | 275 | static const struct usb_device_id id_table[] = { |
| 282 | { USB_DEVICE(0x19d2, 0xffff) }, /* AC8700 */ | 276 | /* AC8710, AC8710T */ |
| 283 | { USB_DEVICE(0x19d2, 0xfffe) }, | 277 | { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffff, 0xff, 0xff, 0xff) }, |
| 284 | { USB_DEVICE(0x19d2, 0xfffd) }, /* MG880 */ | 278 | /* AC8700 */ |
| 279 | { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfffe, 0xff, 0xff, 0xff) }, | ||
| 280 | /* MG880 */ | ||
| 281 | { USB_DEVICE(0x19d2, 0xfffd) }, | ||
| 282 | { USB_DEVICE(0x19d2, 0xfffc) }, | ||
| 283 | { USB_DEVICE(0x19d2, 0xfffb) }, | ||
| 284 | /* AC2726, AC8710_V3 */ | ||
| 285 | { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff1, 0xff, 0xff, 0xff) }, | ||
| 286 | { USB_DEVICE(0x19d2, 0xfff6) }, | ||
| 287 | { USB_DEVICE(0x19d2, 0xfff7) }, | ||
| 288 | { USB_DEVICE(0x19d2, 0xfff8) }, | ||
| 289 | { USB_DEVICE(0x19d2, 0xfff9) }, | ||
| 290 | { USB_DEVICE(0x19d2, 0xffee) }, | ||
| 291 | /* AC2716, MC2716 */ | ||
| 292 | { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffed, 0xff, 0xff, 0xff) }, | ||
| 293 | /* AD3812 */ | ||
| 294 | { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffeb, 0xff, 0xff, 0xff) }, | ||
| 295 | { USB_DEVICE(0x19d2, 0xffec) }, | ||
| 285 | { USB_DEVICE(0x05C6, 0x3197) }, | 296 | { USB_DEVICE(0x05C6, 0x3197) }, |
| 286 | { USB_DEVICE(0x05C6, 0x6000) }, | 297 | { USB_DEVICE(0x05C6, 0x6000) }, |
| 298 | { USB_DEVICE(0x05C6, 0x9008) }, | ||
| 287 | { }, | 299 | { }, |
| 288 | }; | 300 | }; |
| 289 | MODULE_DEVICE_TABLE(usb, id_table); | 301 | MODULE_DEVICE_TABLE(usb, id_table); |
diff --git a/drivers/vfio/vfio.c b/drivers/vfio/vfio.c index acb7121a9316..6d78736563de 100644 --- a/drivers/vfio/vfio.c +++ b/drivers/vfio/vfio.c | |||
| @@ -1360,7 +1360,7 @@ static const struct file_operations vfio_device_fops = { | |||
| 1360 | */ | 1360 | */ |
| 1361 | static char *vfio_devnode(struct device *dev, umode_t *mode) | 1361 | static char *vfio_devnode(struct device *dev, umode_t *mode) |
| 1362 | { | 1362 | { |
| 1363 | if (MINOR(dev->devt) == 0) | 1363 | if (mode && (MINOR(dev->devt) == 0)) |
| 1364 | *mode = S_IRUGO | S_IWUGO; | 1364 | *mode = S_IRUGO | S_IWUGO; |
| 1365 | 1365 | ||
| 1366 | return kasprintf(GFP_KERNEL, "vfio/%s", dev_name(dev)); | 1366 | return kasprintf(GFP_KERNEL, "vfio/%s", dev_name(dev)); |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 5b97e56ddbca..e3bc39bb9d12 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
| @@ -3279,8 +3279,8 @@ build_unc_path_to_root(const struct smb_vol *vol, | |||
| 3279 | pos = full_path + unc_len; | 3279 | pos = full_path + unc_len; |
| 3280 | 3280 | ||
| 3281 | if (pplen) { | 3281 | if (pplen) { |
| 3282 | *pos++ = CIFS_DIR_SEP(cifs_sb); | 3282 | *pos = CIFS_DIR_SEP(cifs_sb); |
| 3283 | strncpy(pos, vol->prepath, pplen); | 3283 | strncpy(pos + 1, vol->prepath, pplen); |
| 3284 | pos += pplen; | 3284 | pos += pplen; |
| 3285 | } | 3285 | } |
| 3286 | 3286 | ||
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index 201f0a0d6b0a..a7abbea2c096 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c | |||
| @@ -295,6 +295,12 @@ static int ecryptfs_release(struct inode *inode, struct file *file) | |||
| 295 | static int | 295 | static int |
| 296 | ecryptfs_fsync(struct file *file, loff_t start, loff_t end, int datasync) | 296 | ecryptfs_fsync(struct file *file, loff_t start, loff_t end, int datasync) |
| 297 | { | 297 | { |
| 298 | int rc; | ||
| 299 | |||
| 300 | rc = filemap_write_and_wait(file->f_mapping); | ||
| 301 | if (rc) | ||
| 302 | return rc; | ||
| 303 | |||
| 298 | return vfs_fsync(ecryptfs_file_to_lower(file), datasync); | 304 | return vfs_fsync(ecryptfs_file_to_lower(file), datasync); |
| 299 | } | 305 | } |
| 300 | 306 | ||
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 254df56b847b..f3f783dc4f75 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c | |||
| @@ -180,6 +180,8 @@ u64 fuse_get_attr_version(struct fuse_conn *fc) | |||
| 180 | static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) | 180 | static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) |
| 181 | { | 181 | { |
| 182 | struct inode *inode; | 182 | struct inode *inode; |
| 183 | struct dentry *parent; | ||
| 184 | struct fuse_conn *fc; | ||
| 183 | 185 | ||
| 184 | inode = ACCESS_ONCE(entry->d_inode); | 186 | inode = ACCESS_ONCE(entry->d_inode); |
| 185 | if (inode && is_bad_inode(inode)) | 187 | if (inode && is_bad_inode(inode)) |
| @@ -187,10 +189,8 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) | |||
| 187 | else if (fuse_dentry_time(entry) < get_jiffies_64()) { | 189 | else if (fuse_dentry_time(entry) < get_jiffies_64()) { |
| 188 | int err; | 190 | int err; |
| 189 | struct fuse_entry_out outarg; | 191 | struct fuse_entry_out outarg; |
| 190 | struct fuse_conn *fc; | ||
| 191 | struct fuse_req *req; | 192 | struct fuse_req *req; |
| 192 | struct fuse_forget_link *forget; | 193 | struct fuse_forget_link *forget; |
| 193 | struct dentry *parent; | ||
| 194 | u64 attr_version; | 194 | u64 attr_version; |
| 195 | 195 | ||
| 196 | /* For negative dentries, always do a fresh lookup */ | 196 | /* For negative dentries, always do a fresh lookup */ |
| @@ -241,8 +241,14 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags) | |||
| 241 | entry_attr_timeout(&outarg), | 241 | entry_attr_timeout(&outarg), |
| 242 | attr_version); | 242 | attr_version); |
| 243 | fuse_change_entry_timeout(entry, &outarg); | 243 | fuse_change_entry_timeout(entry, &outarg); |
| 244 | } else if (inode) { | ||
| 245 | fc = get_fuse_conn(inode); | ||
| 246 | if (fc->readdirplus_auto) { | ||
| 247 | parent = dget_parent(entry); | ||
| 248 | fuse_advise_use_readdirplus(parent->d_inode); | ||
| 249 | dput(parent); | ||
| 250 | } | ||
| 244 | } | 251 | } |
| 245 | fuse_advise_use_readdirplus(inode); | ||
| 246 | return 1; | 252 | return 1; |
| 247 | } | 253 | } |
| 248 | 254 | ||
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index d1c9b85b3f58..e570081f9f76 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/compat.h> | 16 | #include <linux/compat.h> |
| 17 | #include <linux/swap.h> | 17 | #include <linux/swap.h> |
| 18 | #include <linux/aio.h> | 18 | #include <linux/aio.h> |
| 19 | #include <linux/falloc.h> | ||
| 19 | 20 | ||
| 20 | static const struct file_operations fuse_direct_io_file_operations; | 21 | static const struct file_operations fuse_direct_io_file_operations; |
| 21 | 22 | ||
| @@ -1278,7 +1279,10 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, const struct iovec *iov, | |||
| 1278 | 1279 | ||
| 1279 | iov_iter_init(&ii, iov, nr_segs, count, 0); | 1280 | iov_iter_init(&ii, iov, nr_segs, count, 0); |
| 1280 | 1281 | ||
| 1281 | req = fuse_get_req(fc, fuse_iter_npages(&ii)); | 1282 | if (io->async) |
| 1283 | req = fuse_get_req_for_background(fc, fuse_iter_npages(&ii)); | ||
| 1284 | else | ||
| 1285 | req = fuse_get_req(fc, fuse_iter_npages(&ii)); | ||
| 1282 | if (IS_ERR(req)) | 1286 | if (IS_ERR(req)) |
| 1283 | return PTR_ERR(req); | 1287 | return PTR_ERR(req); |
| 1284 | 1288 | ||
| @@ -1314,7 +1318,11 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, const struct iovec *iov, | |||
| 1314 | break; | 1318 | break; |
| 1315 | if (count) { | 1319 | if (count) { |
| 1316 | fuse_put_request(fc, req); | 1320 | fuse_put_request(fc, req); |
| 1317 | req = fuse_get_req(fc, fuse_iter_npages(&ii)); | 1321 | if (io->async) |
| 1322 | req = fuse_get_req_for_background(fc, | ||
| 1323 | fuse_iter_npages(&ii)); | ||
| 1324 | else | ||
| 1325 | req = fuse_get_req(fc, fuse_iter_npages(&ii)); | ||
| 1318 | if (IS_ERR(req)) | 1326 | if (IS_ERR(req)) |
| 1319 | break; | 1327 | break; |
| 1320 | } | 1328 | } |
| @@ -2365,6 +2373,11 @@ static void fuse_do_truncate(struct file *file) | |||
| 2365 | fuse_do_setattr(inode, &attr, file); | 2373 | fuse_do_setattr(inode, &attr, file); |
| 2366 | } | 2374 | } |
| 2367 | 2375 | ||
| 2376 | static inline loff_t fuse_round_up(loff_t off) | ||
| 2377 | { | ||
| 2378 | return round_up(off, FUSE_MAX_PAGES_PER_REQ << PAGE_SHIFT); | ||
| 2379 | } | ||
| 2380 | |||
| 2368 | static ssize_t | 2381 | static ssize_t |
| 2369 | fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | 2382 | fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, |
| 2370 | loff_t offset, unsigned long nr_segs) | 2383 | loff_t offset, unsigned long nr_segs) |
| @@ -2372,6 +2385,7 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | |||
| 2372 | ssize_t ret = 0; | 2385 | ssize_t ret = 0; |
| 2373 | struct file *file = iocb->ki_filp; | 2386 | struct file *file = iocb->ki_filp; |
| 2374 | struct fuse_file *ff = file->private_data; | 2387 | struct fuse_file *ff = file->private_data; |
| 2388 | bool async_dio = ff->fc->async_dio; | ||
| 2375 | loff_t pos = 0; | 2389 | loff_t pos = 0; |
| 2376 | struct inode *inode; | 2390 | struct inode *inode; |
| 2377 | loff_t i_size; | 2391 | loff_t i_size; |
| @@ -2383,10 +2397,10 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | |||
| 2383 | i_size = i_size_read(inode); | 2397 | i_size = i_size_read(inode); |
| 2384 | 2398 | ||
| 2385 | /* optimization for short read */ | 2399 | /* optimization for short read */ |
| 2386 | if (rw != WRITE && offset + count > i_size) { | 2400 | if (async_dio && rw != WRITE && offset + count > i_size) { |
| 2387 | if (offset >= i_size) | 2401 | if (offset >= i_size) |
| 2388 | return 0; | 2402 | return 0; |
| 2389 | count = i_size - offset; | 2403 | count = min_t(loff_t, count, fuse_round_up(i_size - offset)); |
| 2390 | } | 2404 | } |
| 2391 | 2405 | ||
| 2392 | io = kmalloc(sizeof(struct fuse_io_priv), GFP_KERNEL); | 2406 | io = kmalloc(sizeof(struct fuse_io_priv), GFP_KERNEL); |
| @@ -2404,7 +2418,7 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | |||
| 2404 | * By default, we want to optimize all I/Os with async request | 2418 | * By default, we want to optimize all I/Os with async request |
| 2405 | * submission to the client filesystem if supported. | 2419 | * submission to the client filesystem if supported. |
| 2406 | */ | 2420 | */ |
| 2407 | io->async = ff->fc->async_dio; | 2421 | io->async = async_dio; |
| 2408 | io->iocb = iocb; | 2422 | io->iocb = iocb; |
| 2409 | 2423 | ||
| 2410 | /* | 2424 | /* |
| @@ -2412,7 +2426,7 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | |||
| 2412 | * to wait on real async I/O requests, so we must submit this request | 2426 | * to wait on real async I/O requests, so we must submit this request |
| 2413 | * synchronously. | 2427 | * synchronously. |
| 2414 | */ | 2428 | */ |
| 2415 | if (!is_sync_kiocb(iocb) && (offset + count > i_size)) | 2429 | if (!is_sync_kiocb(iocb) && (offset + count > i_size) && rw == WRITE) |
| 2416 | io->async = false; | 2430 | io->async = false; |
| 2417 | 2431 | ||
| 2418 | if (rw == WRITE) | 2432 | if (rw == WRITE) |
| @@ -2424,7 +2438,7 @@ fuse_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, | |||
| 2424 | fuse_aio_complete(io, ret < 0 ? ret : 0, -1); | 2438 | fuse_aio_complete(io, ret < 0 ? ret : 0, -1); |
| 2425 | 2439 | ||
| 2426 | /* we have a non-extending, async request, so return */ | 2440 | /* we have a non-extending, async request, so return */ |
| 2427 | if (ret > 0 && !is_sync_kiocb(iocb)) | 2441 | if (!is_sync_kiocb(iocb)) |
| 2428 | return -EIOCBQUEUED; | 2442 | return -EIOCBQUEUED; |
| 2429 | 2443 | ||
| 2430 | ret = wait_on_sync_kiocb(iocb); | 2444 | ret = wait_on_sync_kiocb(iocb); |
| @@ -2446,6 +2460,7 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset, | |||
| 2446 | loff_t length) | 2460 | loff_t length) |
| 2447 | { | 2461 | { |
| 2448 | struct fuse_file *ff = file->private_data; | 2462 | struct fuse_file *ff = file->private_data; |
| 2463 | struct inode *inode = file->f_inode; | ||
| 2449 | struct fuse_conn *fc = ff->fc; | 2464 | struct fuse_conn *fc = ff->fc; |
| 2450 | struct fuse_req *req; | 2465 | struct fuse_req *req; |
| 2451 | struct fuse_fallocate_in inarg = { | 2466 | struct fuse_fallocate_in inarg = { |
| @@ -2459,9 +2474,16 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset, | |||
| 2459 | if (fc->no_fallocate) | 2474 | if (fc->no_fallocate) |
| 2460 | return -EOPNOTSUPP; | 2475 | return -EOPNOTSUPP; |
| 2461 | 2476 | ||
| 2477 | if (mode & FALLOC_FL_PUNCH_HOLE) { | ||
| 2478 | mutex_lock(&inode->i_mutex); | ||
| 2479 | fuse_set_nowrite(inode); | ||
| 2480 | } | ||
| 2481 | |||
| 2462 | req = fuse_get_req_nopages(fc); | 2482 | req = fuse_get_req_nopages(fc); |
| 2463 | if (IS_ERR(req)) | 2483 | if (IS_ERR(req)) { |
| 2464 | return PTR_ERR(req); | 2484 | err = PTR_ERR(req); |
| 2485 | goto out; | ||
| 2486 | } | ||
| 2465 | 2487 | ||
| 2466 | req->in.h.opcode = FUSE_FALLOCATE; | 2488 | req->in.h.opcode = FUSE_FALLOCATE; |
| 2467 | req->in.h.nodeid = ff->nodeid; | 2489 | req->in.h.nodeid = ff->nodeid; |
| @@ -2476,6 +2498,24 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset, | |||
| 2476 | } | 2498 | } |
| 2477 | fuse_put_request(fc, req); | 2499 | fuse_put_request(fc, req); |
| 2478 | 2500 | ||
| 2501 | if (err) | ||
| 2502 | goto out; | ||
| 2503 | |||
| 2504 | /* we could have extended the file */ | ||
| 2505 | if (!(mode & FALLOC_FL_KEEP_SIZE)) | ||
| 2506 | fuse_write_update_size(inode, offset + length); | ||
| 2507 | |||
| 2508 | if (mode & FALLOC_FL_PUNCH_HOLE) | ||
| 2509 | truncate_pagecache_range(inode, offset, offset + length - 1); | ||
| 2510 | |||
| 2511 | fuse_invalidate_attr(inode); | ||
| 2512 | |||
| 2513 | out: | ||
| 2514 | if (mode & FALLOC_FL_PUNCH_HOLE) { | ||
| 2515 | fuse_release_nowrite(inode); | ||
| 2516 | mutex_unlock(&inode->i_mutex); | ||
| 2517 | } | ||
| 2518 | |||
| 2479 | return err; | 2519 | return err; |
| 2480 | } | 2520 | } |
| 2481 | 2521 | ||
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 6201f81e4d3a..9a0cdde14a08 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
| @@ -867,10 +867,11 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req) | |||
| 867 | fc->dont_mask = 1; | 867 | fc->dont_mask = 1; |
| 868 | if (arg->flags & FUSE_AUTO_INVAL_DATA) | 868 | if (arg->flags & FUSE_AUTO_INVAL_DATA) |
| 869 | fc->auto_inval_data = 1; | 869 | fc->auto_inval_data = 1; |
| 870 | if (arg->flags & FUSE_DO_READDIRPLUS) | 870 | if (arg->flags & FUSE_DO_READDIRPLUS) { |
| 871 | fc->do_readdirplus = 1; | 871 | fc->do_readdirplus = 1; |
| 872 | if (arg->flags & FUSE_READDIRPLUS_AUTO) | 872 | if (arg->flags & FUSE_READDIRPLUS_AUTO) |
| 873 | fc->readdirplus_auto = 1; | 873 | fc->readdirplus_auto = 1; |
| 874 | } | ||
| 874 | if (arg->flags & FUSE_ASYNC_DIO) | 875 | if (arg->flags & FUSE_ASYNC_DIO) |
| 875 | fc->async_dio = 1; | 876 | fc->async_dio = 1; |
| 876 | } else { | 877 | } else { |
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 1dc9a13ce6bb..93b5809c20bb 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c | |||
| @@ -1286,17 +1286,26 @@ int gfs2_setattr_size(struct inode *inode, u64 newsize) | |||
| 1286 | if (ret) | 1286 | if (ret) |
| 1287 | return ret; | 1287 | return ret; |
| 1288 | 1288 | ||
| 1289 | ret = get_write_access(inode); | ||
| 1290 | if (ret) | ||
| 1291 | return ret; | ||
| 1292 | |||
| 1289 | inode_dio_wait(inode); | 1293 | inode_dio_wait(inode); |
| 1290 | 1294 | ||
| 1291 | ret = gfs2_rs_alloc(GFS2_I(inode)); | 1295 | ret = gfs2_rs_alloc(GFS2_I(inode)); |
| 1292 | if (ret) | 1296 | if (ret) |
| 1293 | return ret; | 1297 | goto out; |
| 1294 | 1298 | ||
| 1295 | oldsize = inode->i_size; | 1299 | oldsize = inode->i_size; |
| 1296 | if (newsize >= oldsize) | 1300 | if (newsize >= oldsize) { |
| 1297 | return do_grow(inode, newsize); | 1301 | ret = do_grow(inode, newsize); |
| 1302 | goto out; | ||
| 1303 | } | ||
| 1298 | 1304 | ||
| 1299 | return do_shrink(inode, oldsize, newsize); | 1305 | ret = do_shrink(inode, oldsize, newsize); |
| 1306 | out: | ||
| 1307 | put_write_access(inode); | ||
| 1308 | return ret; | ||
| 1300 | } | 1309 | } |
| 1301 | 1310 | ||
| 1302 | int gfs2_truncatei_resume(struct gfs2_inode *ip) | 1311 | int gfs2_truncatei_resume(struct gfs2_inode *ip) |
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c index c3e82bd23179..b631c9043460 100644 --- a/fs/gfs2/dir.c +++ b/fs/gfs2/dir.c | |||
| @@ -354,22 +354,31 @@ static __be64 *gfs2_dir_get_hash_table(struct gfs2_inode *ip) | |||
| 354 | return ERR_PTR(-EIO); | 354 | return ERR_PTR(-EIO); |
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | hc = kmalloc(hsize, GFP_NOFS); | 357 | hc = kmalloc(hsize, GFP_NOFS | __GFP_NOWARN); |
| 358 | ret = -ENOMEM; | 358 | if (hc == NULL) |
| 359 | hc = __vmalloc(hsize, GFP_NOFS, PAGE_KERNEL); | ||
| 360 | |||
| 359 | if (hc == NULL) | 361 | if (hc == NULL) |
| 360 | return ERR_PTR(-ENOMEM); | 362 | return ERR_PTR(-ENOMEM); |
| 361 | 363 | ||
| 362 | ret = gfs2_dir_read_data(ip, hc, hsize); | 364 | ret = gfs2_dir_read_data(ip, hc, hsize); |
| 363 | if (ret < 0) { | 365 | if (ret < 0) { |
| 364 | kfree(hc); | 366 | if (is_vmalloc_addr(hc)) |
| 367 | vfree(hc); | ||
| 368 | else | ||
| 369 | kfree(hc); | ||
| 365 | return ERR_PTR(ret); | 370 | return ERR_PTR(ret); |
| 366 | } | 371 | } |
| 367 | 372 | ||
| 368 | spin_lock(&inode->i_lock); | 373 | spin_lock(&inode->i_lock); |
| 369 | if (ip->i_hash_cache) | 374 | if (ip->i_hash_cache) { |
| 370 | kfree(hc); | 375 | if (is_vmalloc_addr(hc)) |
| 371 | else | 376 | vfree(hc); |
| 377 | else | ||
| 378 | kfree(hc); | ||
| 379 | } else { | ||
| 372 | ip->i_hash_cache = hc; | 380 | ip->i_hash_cache = hc; |
| 381 | } | ||
| 373 | spin_unlock(&inode->i_lock); | 382 | spin_unlock(&inode->i_lock); |
| 374 | 383 | ||
| 375 | return ip->i_hash_cache; | 384 | return ip->i_hash_cache; |
| @@ -385,7 +394,10 @@ void gfs2_dir_hash_inval(struct gfs2_inode *ip) | |||
| 385 | { | 394 | { |
| 386 | __be64 *hc = ip->i_hash_cache; | 395 | __be64 *hc = ip->i_hash_cache; |
| 387 | ip->i_hash_cache = NULL; | 396 | ip->i_hash_cache = NULL; |
| 388 | kfree(hc); | 397 | if (is_vmalloc_addr(hc)) |
| 398 | vfree(hc); | ||
| 399 | else | ||
| 400 | kfree(hc); | ||
| 389 | } | 401 | } |
| 390 | 402 | ||
| 391 | static inline int gfs2_dirent_sentinel(const struct gfs2_dirent *dent) | 403 | static inline int gfs2_dirent_sentinel(const struct gfs2_dirent *dent) |
| @@ -1113,7 +1125,10 @@ static int dir_double_exhash(struct gfs2_inode *dip) | |||
| 1113 | if (IS_ERR(hc)) | 1125 | if (IS_ERR(hc)) |
| 1114 | return PTR_ERR(hc); | 1126 | return PTR_ERR(hc); |
| 1115 | 1127 | ||
| 1116 | h = hc2 = kmalloc(hsize_bytes * 2, GFP_NOFS); | 1128 | h = hc2 = kmalloc(hsize_bytes * 2, GFP_NOFS | __GFP_NOWARN); |
| 1129 | if (hc2 == NULL) | ||
| 1130 | hc2 = __vmalloc(hsize_bytes * 2, GFP_NOFS, PAGE_KERNEL); | ||
| 1131 | |||
| 1117 | if (!hc2) | 1132 | if (!hc2) |
| 1118 | return -ENOMEM; | 1133 | return -ENOMEM; |
| 1119 | 1134 | ||
| @@ -1145,7 +1160,10 @@ fail: | |||
| 1145 | gfs2_dinode_out(dip, dibh->b_data); | 1160 | gfs2_dinode_out(dip, dibh->b_data); |
| 1146 | brelse(dibh); | 1161 | brelse(dibh); |
| 1147 | out_kfree: | 1162 | out_kfree: |
| 1148 | kfree(hc2); | 1163 | if (is_vmalloc_addr(hc2)) |
| 1164 | vfree(hc2); | ||
| 1165 | else | ||
| 1166 | kfree(hc2); | ||
| 1149 | return error; | 1167 | return error; |
| 1150 | } | 1168 | } |
| 1151 | 1169 | ||
| @@ -1846,6 +1864,8 @@ static int leaf_dealloc(struct gfs2_inode *dip, u32 index, u32 len, | |||
| 1846 | memset(&rlist, 0, sizeof(struct gfs2_rgrp_list)); | 1864 | memset(&rlist, 0, sizeof(struct gfs2_rgrp_list)); |
| 1847 | 1865 | ||
| 1848 | ht = kzalloc(size, GFP_NOFS); | 1866 | ht = kzalloc(size, GFP_NOFS); |
| 1867 | if (ht == NULL) | ||
| 1868 | ht = vzalloc(size); | ||
| 1849 | if (!ht) | 1869 | if (!ht) |
| 1850 | return -ENOMEM; | 1870 | return -ENOMEM; |
| 1851 | 1871 | ||
| @@ -1933,7 +1953,10 @@ out_rlist: | |||
| 1933 | gfs2_rlist_free(&rlist); | 1953 | gfs2_rlist_free(&rlist); |
| 1934 | gfs2_quota_unhold(dip); | 1954 | gfs2_quota_unhold(dip); |
| 1935 | out: | 1955 | out: |
| 1936 | kfree(ht); | 1956 | if (is_vmalloc_addr(ht)) |
| 1957 | vfree(ht); | ||
| 1958 | else | ||
| 1959 | kfree(ht); | ||
| 1937 | return error; | 1960 | return error; |
| 1938 | } | 1961 | } |
| 1939 | 1962 | ||
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index acd16764b133..ad0dc38d87ab 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c | |||
| @@ -402,16 +402,20 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 402 | /* Update file times before taking page lock */ | 402 | /* Update file times before taking page lock */ |
| 403 | file_update_time(vma->vm_file); | 403 | file_update_time(vma->vm_file); |
| 404 | 404 | ||
| 405 | ret = get_write_access(inode); | ||
| 406 | if (ret) | ||
| 407 | goto out; | ||
| 408 | |||
| 405 | ret = gfs2_rs_alloc(ip); | 409 | ret = gfs2_rs_alloc(ip); |
| 406 | if (ret) | 410 | if (ret) |
| 407 | return ret; | 411 | goto out_write_access; |
| 408 | 412 | ||
| 409 | gfs2_size_hint(vma->vm_file, pos, PAGE_CACHE_SIZE); | 413 | gfs2_size_hint(vma->vm_file, pos, PAGE_CACHE_SIZE); |
| 410 | 414 | ||
| 411 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); | 415 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); |
| 412 | ret = gfs2_glock_nq(&gh); | 416 | ret = gfs2_glock_nq(&gh); |
| 413 | if (ret) | 417 | if (ret) |
| 414 | goto out; | 418 | goto out_uninit; |
| 415 | 419 | ||
| 416 | set_bit(GLF_DIRTY, &ip->i_gl->gl_flags); | 420 | set_bit(GLF_DIRTY, &ip->i_gl->gl_flags); |
| 417 | set_bit(GIF_SW_PAGED, &ip->i_flags); | 421 | set_bit(GIF_SW_PAGED, &ip->i_flags); |
| @@ -480,12 +484,15 @@ out_quota_unlock: | |||
| 480 | gfs2_quota_unlock(ip); | 484 | gfs2_quota_unlock(ip); |
| 481 | out_unlock: | 485 | out_unlock: |
| 482 | gfs2_glock_dq(&gh); | 486 | gfs2_glock_dq(&gh); |
| 483 | out: | 487 | out_uninit: |
| 484 | gfs2_holder_uninit(&gh); | 488 | gfs2_holder_uninit(&gh); |
| 485 | if (ret == 0) { | 489 | if (ret == 0) { |
| 486 | set_page_dirty(page); | 490 | set_page_dirty(page); |
| 487 | wait_for_stable_page(page); | 491 | wait_for_stable_page(page); |
| 488 | } | 492 | } |
| 493 | out_write_access: | ||
| 494 | put_write_access(inode); | ||
| 495 | out: | ||
| 489 | sb_end_pagefault(inode->i_sb); | 496 | sb_end_pagefault(inode->i_sb); |
| 490 | return block_page_mkwrite_return(ret); | 497 | return block_page_mkwrite_return(ret); |
| 491 | } | 498 | } |
| @@ -594,10 +601,10 @@ static int gfs2_release(struct inode *inode, struct file *file) | |||
| 594 | kfree(file->private_data); | 601 | kfree(file->private_data); |
| 595 | file->private_data = NULL; | 602 | file->private_data = NULL; |
| 596 | 603 | ||
| 597 | if ((file->f_mode & FMODE_WRITE) && | 604 | if (!(file->f_mode & FMODE_WRITE)) |
| 598 | (atomic_read(&inode->i_writecount) == 1)) | 605 | return 0; |
| 599 | gfs2_rs_delete(ip); | ||
| 600 | 606 | ||
| 607 | gfs2_rs_delete(ip); | ||
| 601 | return 0; | 608 | return 0; |
| 602 | } | 609 | } |
| 603 | 610 | ||
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 8833a4f264e3..62b484e4a9e4 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
| @@ -189,6 +189,7 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned int type, | |||
| 189 | return inode; | 189 | return inode; |
| 190 | 190 | ||
| 191 | fail_refresh: | 191 | fail_refresh: |
| 192 | ip->i_iopen_gh.gh_flags |= GL_NOCACHE; | ||
| 192 | ip->i_iopen_gh.gh_gl->gl_object = NULL; | 193 | ip->i_iopen_gh.gh_gl->gl_object = NULL; |
| 193 | gfs2_glock_dq_uninit(&ip->i_iopen_gh); | 194 | gfs2_glock_dq_uninit(&ip->i_iopen_gh); |
| 194 | fail_iopen: | 195 | fail_iopen: |
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c index 68b4c8f1fce8..6c33d7b6e0c4 100644 --- a/fs/gfs2/lops.c +++ b/fs/gfs2/lops.c | |||
| @@ -419,7 +419,9 @@ static void gfs2_before_commit(struct gfs2_sbd *sdp, unsigned int limit, | |||
| 419 | if (total > limit) | 419 | if (total > limit) |
| 420 | num = limit; | 420 | num = limit; |
| 421 | gfs2_log_unlock(sdp); | 421 | gfs2_log_unlock(sdp); |
| 422 | page = gfs2_get_log_desc(sdp, GFS2_LOG_DESC_METADATA, num + 1, num); | 422 | page = gfs2_get_log_desc(sdp, |
| 423 | is_databuf ? GFS2_LOG_DESC_JDATA : | ||
| 424 | GFS2_LOG_DESC_METADATA, num + 1, num); | ||
| 423 | ld = page_address(page); | 425 | ld = page_address(page); |
| 424 | gfs2_log_lock(sdp); | 426 | gfs2_log_lock(sdp); |
| 425 | ptr = (__be64 *)(ld + 1); | 427 | ptr = (__be64 *)(ld + 1); |
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 5232525934ae..9809156e3d04 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c | |||
| @@ -638,8 +638,10 @@ void gfs2_rs_deltree(struct gfs2_blkreserv *rs) | |||
| 638 | */ | 638 | */ |
| 639 | void gfs2_rs_delete(struct gfs2_inode *ip) | 639 | void gfs2_rs_delete(struct gfs2_inode *ip) |
| 640 | { | 640 | { |
| 641 | struct inode *inode = &ip->i_inode; | ||
| 642 | |||
| 641 | down_write(&ip->i_rw_mutex); | 643 | down_write(&ip->i_rw_mutex); |
| 642 | if (ip->i_res) { | 644 | if (ip->i_res && atomic_read(&inode->i_writecount) <= 1) { |
| 643 | gfs2_rs_deltree(ip->i_res); | 645 | gfs2_rs_deltree(ip->i_res); |
| 644 | BUG_ON(ip->i_res->rs_free); | 646 | BUG_ON(ip->i_res->rs_free); |
| 645 | kmem_cache_free(gfs2_rsrv_cachep, ip->i_res); | 647 | kmem_cache_free(gfs2_rsrv_cachep, ip->i_res); |
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 917c8e1eb4ae..e5639dec66c4 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c | |||
| @@ -1444,6 +1444,7 @@ static void gfs2_evict_inode(struct inode *inode) | |||
| 1444 | /* Must not read inode block until block type has been verified */ | 1444 | /* Must not read inode block until block type has been verified */ |
| 1445 | error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, &gh); | 1445 | error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, &gh); |
| 1446 | if (unlikely(error)) { | 1446 | if (unlikely(error)) { |
| 1447 | ip->i_iopen_gh.gh_flags |= GL_NOCACHE; | ||
| 1447 | gfs2_glock_dq_uninit(&ip->i_iopen_gh); | 1448 | gfs2_glock_dq_uninit(&ip->i_iopen_gh); |
| 1448 | goto out; | 1449 | goto out; |
| 1449 | } | 1450 | } |
| @@ -1514,8 +1515,10 @@ out_unlock: | |||
| 1514 | if (gfs2_rs_active(ip->i_res)) | 1515 | if (gfs2_rs_active(ip->i_res)) |
| 1515 | gfs2_rs_deltree(ip->i_res); | 1516 | gfs2_rs_deltree(ip->i_res); |
| 1516 | 1517 | ||
| 1517 | if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) | 1518 | if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) { |
| 1519 | ip->i_iopen_gh.gh_flags |= GL_NOCACHE; | ||
| 1518 | gfs2_glock_dq(&ip->i_iopen_gh); | 1520 | gfs2_glock_dq(&ip->i_iopen_gh); |
| 1521 | } | ||
| 1519 | gfs2_holder_uninit(&ip->i_iopen_gh); | 1522 | gfs2_holder_uninit(&ip->i_iopen_gh); |
| 1520 | gfs2_glock_dq_uninit(&gh); | 1523 | gfs2_glock_dq_uninit(&gh); |
| 1521 | if (error && error != GLR_TRYFAILED && error != -EROFS) | 1524 | if (error && error != GLR_TRYFAILED && error != -EROFS) |
| @@ -1534,6 +1537,7 @@ out: | |||
| 1534 | ip->i_gl = NULL; | 1537 | ip->i_gl = NULL; |
| 1535 | if (ip->i_iopen_gh.gh_gl) { | 1538 | if (ip->i_iopen_gh.gh_gl) { |
| 1536 | ip->i_iopen_gh.gh_gl->gl_object = NULL; | 1539 | ip->i_iopen_gh.gh_gl->gl_object = NULL; |
| 1540 | ip->i_iopen_gh.gh_flags |= GL_NOCACHE; | ||
| 1537 | gfs2_glock_dq_uninit(&ip->i_iopen_gh); | 1541 | gfs2_glock_dq_uninit(&ip->i_iopen_gh); |
| 1538 | } | 1542 | } |
| 1539 | } | 1543 | } |
diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index 3027f4dbbab5..e4ba5fe4c3b5 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c | |||
| @@ -109,10 +109,14 @@ static void hpfs_write_failed(struct address_space *mapping, loff_t to) | |||
| 109 | { | 109 | { |
| 110 | struct inode *inode = mapping->host; | 110 | struct inode *inode = mapping->host; |
| 111 | 111 | ||
| 112 | hpfs_lock(inode->i_sb); | ||
| 113 | |||
| 112 | if (to > inode->i_size) { | 114 | if (to > inode->i_size) { |
| 113 | truncate_pagecache(inode, to, inode->i_size); | 115 | truncate_pagecache(inode, to, inode->i_size); |
| 114 | hpfs_truncate(inode); | 116 | hpfs_truncate(inode); |
| 115 | } | 117 | } |
| 118 | |||
| 119 | hpfs_unlock(inode->i_sb); | ||
| 116 | } | 120 | } |
| 117 | 121 | ||
| 118 | static int hpfs_write_begin(struct file *file, struct address_space *mapping, | 122 | static int hpfs_write_begin(struct file *file, struct address_space *mapping, |
diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index c57499dca89c..360d27c48887 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c | |||
| @@ -2009,7 +2009,13 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp) | |||
| 2009 | 2009 | ||
| 2010 | bio->bi_end_io = lbmIODone; | 2010 | bio->bi_end_io = lbmIODone; |
| 2011 | bio->bi_private = bp; | 2011 | bio->bi_private = bp; |
| 2012 | submit_bio(READ_SYNC, bio); | 2012 | /*check if journaling to disk has been disabled*/ |
| 2013 | if (log->no_integrity) { | ||
| 2014 | bio->bi_size = 0; | ||
| 2015 | lbmIODone(bio, 0); | ||
| 2016 | } else { | ||
| 2017 | submit_bio(READ_SYNC, bio); | ||
| 2018 | } | ||
| 2013 | 2019 | ||
| 2014 | wait_event(bp->l_ioevent, (bp->l_flag != lbmREAD)); | 2020 | wait_event(bp->l_ioevent, (bp->l_flag != lbmREAD)); |
| 2015 | 2021 | ||
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 2003e830ed1c..788e0a9c1fb0 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
| @@ -611,11 +611,28 @@ static int jfs_freeze(struct super_block *sb) | |||
| 611 | { | 611 | { |
| 612 | struct jfs_sb_info *sbi = JFS_SBI(sb); | 612 | struct jfs_sb_info *sbi = JFS_SBI(sb); |
| 613 | struct jfs_log *log = sbi->log; | 613 | struct jfs_log *log = sbi->log; |
| 614 | int rc = 0; | ||
| 614 | 615 | ||
| 615 | if (!(sb->s_flags & MS_RDONLY)) { | 616 | if (!(sb->s_flags & MS_RDONLY)) { |
| 616 | txQuiesce(sb); | 617 | txQuiesce(sb); |
| 617 | lmLogShutdown(log); | 618 | rc = lmLogShutdown(log); |
| 618 | updateSuper(sb, FM_CLEAN); | 619 | if (rc) { |
| 620 | jfs_error(sb, "jfs_freeze: lmLogShutdown failed"); | ||
| 621 | |||
| 622 | /* let operations fail rather than hang */ | ||
| 623 | txResume(sb); | ||
| 624 | |||
| 625 | return rc; | ||
| 626 | } | ||
| 627 | rc = updateSuper(sb, FM_CLEAN); | ||
| 628 | if (rc) { | ||
| 629 | jfs_err("jfs_freeze: updateSuper failed\n"); | ||
| 630 | /* | ||
| 631 | * Don't fail here. Everything succeeded except | ||
| 632 | * marking the superblock clean, so there's really | ||
| 633 | * no harm in leaving it frozen for now. | ||
| 634 | */ | ||
| 635 | } | ||
| 619 | } | 636 | } |
| 620 | return 0; | 637 | return 0; |
| 621 | } | 638 | } |
| @@ -627,13 +644,18 @@ static int jfs_unfreeze(struct super_block *sb) | |||
| 627 | int rc = 0; | 644 | int rc = 0; |
| 628 | 645 | ||
| 629 | if (!(sb->s_flags & MS_RDONLY)) { | 646 | if (!(sb->s_flags & MS_RDONLY)) { |
| 630 | updateSuper(sb, FM_MOUNT); | 647 | rc = updateSuper(sb, FM_MOUNT); |
| 631 | if ((rc = lmLogInit(log))) | 648 | if (rc) { |
| 632 | jfs_err("jfs_unlock failed with return code %d", rc); | 649 | jfs_error(sb, "jfs_unfreeze: updateSuper failed"); |
| 633 | else | 650 | goto out; |
| 634 | txResume(sb); | 651 | } |
| 652 | rc = lmLogInit(log); | ||
| 653 | if (rc) | ||
| 654 | jfs_error(sb, "jfs_unfreeze: lmLogInit failed"); | ||
| 655 | out: | ||
| 656 | txResume(sb); | ||
| 635 | } | 657 | } |
| 636 | return 0; | 658 | return rc; |
| 637 | } | 659 | } |
| 638 | 660 | ||
| 639 | static struct dentry *jfs_do_mount(struct file_system_type *fs_type, | 661 | static struct dentry *jfs_do_mount(struct file_system_type *fs_type, |
diff --git a/fs/proc/base.c b/fs/proc/base.c index dd51e50001fe..c3834dad09b3 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -2118,6 +2118,7 @@ static int show_timer(struct seq_file *m, void *v) | |||
| 2118 | nstr[notify & ~SIGEV_THREAD_ID], | 2118 | nstr[notify & ~SIGEV_THREAD_ID], |
| 2119 | (notify & SIGEV_THREAD_ID) ? "tid" : "pid", | 2119 | (notify & SIGEV_THREAD_ID) ? "tid" : "pid", |
| 2120 | pid_nr_ns(timer->it_pid, tp->ns)); | 2120 | pid_nr_ns(timer->it_pid, tp->ns)); |
| 2121 | seq_printf(m, "ClockID: %d\n", timer->it_clock); | ||
| 2121 | 2122 | ||
| 2122 | return 0; | 2123 | return 0; |
| 2123 | } | 2124 | } |
diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 1d32f1d52763..306d883d89bc 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c | |||
| @@ -21,6 +21,8 @@ | |||
| 21 | #include "xfs_bmap_btree.h" | 21 | #include "xfs_bmap_btree.h" |
| 22 | #include "xfs_inode.h" | 22 | #include "xfs_inode.h" |
| 23 | #include "xfs_vnodeops.h" | 23 | #include "xfs_vnodeops.h" |
| 24 | #include "xfs_sb.h" | ||
| 25 | #include "xfs_mount.h" | ||
| 24 | #include "xfs_trace.h" | 26 | #include "xfs_trace.h" |
| 25 | #include <linux/slab.h> | 27 | #include <linux/slab.h> |
| 26 | #include <linux/xattr.h> | 28 | #include <linux/xattr.h> |
| @@ -34,7 +36,9 @@ | |||
| 34 | */ | 36 | */ |
| 35 | 37 | ||
| 36 | STATIC struct posix_acl * | 38 | STATIC struct posix_acl * |
| 37 | xfs_acl_from_disk(struct xfs_acl *aclp) | 39 | xfs_acl_from_disk( |
| 40 | struct xfs_acl *aclp, | ||
| 41 | int max_entries) | ||
| 38 | { | 42 | { |
| 39 | struct posix_acl_entry *acl_e; | 43 | struct posix_acl_entry *acl_e; |
| 40 | struct posix_acl *acl; | 44 | struct posix_acl *acl; |
| @@ -42,7 +46,7 @@ xfs_acl_from_disk(struct xfs_acl *aclp) | |||
| 42 | unsigned int count, i; | 46 | unsigned int count, i; |
| 43 | 47 | ||
| 44 | count = be32_to_cpu(aclp->acl_cnt); | 48 | count = be32_to_cpu(aclp->acl_cnt); |
| 45 | if (count > XFS_ACL_MAX_ENTRIES) | 49 | if (count > max_entries) |
| 46 | return ERR_PTR(-EFSCORRUPTED); | 50 | return ERR_PTR(-EFSCORRUPTED); |
| 47 | 51 | ||
| 48 | acl = posix_acl_alloc(count, GFP_KERNEL); | 52 | acl = posix_acl_alloc(count, GFP_KERNEL); |
| @@ -108,9 +112,9 @@ xfs_get_acl(struct inode *inode, int type) | |||
| 108 | struct xfs_inode *ip = XFS_I(inode); | 112 | struct xfs_inode *ip = XFS_I(inode); |
| 109 | struct posix_acl *acl; | 113 | struct posix_acl *acl; |
| 110 | struct xfs_acl *xfs_acl; | 114 | struct xfs_acl *xfs_acl; |
| 111 | int len = sizeof(struct xfs_acl); | ||
| 112 | unsigned char *ea_name; | 115 | unsigned char *ea_name; |
| 113 | int error; | 116 | int error; |
| 117 | int len; | ||
| 114 | 118 | ||
| 115 | acl = get_cached_acl(inode, type); | 119 | acl = get_cached_acl(inode, type); |
| 116 | if (acl != ACL_NOT_CACHED) | 120 | if (acl != ACL_NOT_CACHED) |
| @@ -133,8 +137,8 @@ xfs_get_acl(struct inode *inode, int type) | |||
| 133 | * If we have a cached ACLs value just return it, not need to | 137 | * If we have a cached ACLs value just return it, not need to |
| 134 | * go out to the disk. | 138 | * go out to the disk. |
| 135 | */ | 139 | */ |
| 136 | 140 | len = XFS_ACL_MAX_SIZE(ip->i_mount); | |
| 137 | xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); | 141 | xfs_acl = kzalloc(len, GFP_KERNEL); |
| 138 | if (!xfs_acl) | 142 | if (!xfs_acl) |
| 139 | return ERR_PTR(-ENOMEM); | 143 | return ERR_PTR(-ENOMEM); |
| 140 | 144 | ||
| @@ -153,7 +157,7 @@ xfs_get_acl(struct inode *inode, int type) | |||
| 153 | goto out; | 157 | goto out; |
| 154 | } | 158 | } |
| 155 | 159 | ||
| 156 | acl = xfs_acl_from_disk(xfs_acl); | 160 | acl = xfs_acl_from_disk(xfs_acl, XFS_ACL_MAX_ENTRIES(ip->i_mount)); |
| 157 | if (IS_ERR(acl)) | 161 | if (IS_ERR(acl)) |
| 158 | goto out; | 162 | goto out; |
| 159 | 163 | ||
| @@ -189,16 +193,17 @@ xfs_set_acl(struct inode *inode, int type, struct posix_acl *acl) | |||
| 189 | 193 | ||
| 190 | if (acl) { | 194 | if (acl) { |
| 191 | struct xfs_acl *xfs_acl; | 195 | struct xfs_acl *xfs_acl; |
| 192 | int len; | 196 | int len = XFS_ACL_MAX_SIZE(ip->i_mount); |
| 193 | 197 | ||
| 194 | xfs_acl = kzalloc(sizeof(struct xfs_acl), GFP_KERNEL); | 198 | xfs_acl = kzalloc(len, GFP_KERNEL); |
| 195 | if (!xfs_acl) | 199 | if (!xfs_acl) |
| 196 | return -ENOMEM; | 200 | return -ENOMEM; |
| 197 | 201 | ||
| 198 | xfs_acl_to_disk(xfs_acl, acl); | 202 | xfs_acl_to_disk(xfs_acl, acl); |
| 199 | len = sizeof(struct xfs_acl) - | 203 | |
| 200 | (sizeof(struct xfs_acl_entry) * | 204 | /* subtract away the unused acl entries */ |
| 201 | (XFS_ACL_MAX_ENTRIES - acl->a_count)); | 205 | len -= sizeof(struct xfs_acl_entry) * |
| 206 | (XFS_ACL_MAX_ENTRIES(ip->i_mount) - acl->a_count); | ||
| 202 | 207 | ||
| 203 | error = -xfs_attr_set(ip, ea_name, (unsigned char *)xfs_acl, | 208 | error = -xfs_attr_set(ip, ea_name, (unsigned char *)xfs_acl, |
| 204 | len, ATTR_ROOT); | 209 | len, ATTR_ROOT); |
| @@ -243,7 +248,7 @@ xfs_set_mode(struct inode *inode, umode_t mode) | |||
| 243 | static int | 248 | static int |
| 244 | xfs_acl_exists(struct inode *inode, unsigned char *name) | 249 | xfs_acl_exists(struct inode *inode, unsigned char *name) |
| 245 | { | 250 | { |
| 246 | int len = sizeof(struct xfs_acl); | 251 | int len = XFS_ACL_MAX_SIZE(XFS_M(inode->i_sb)); |
| 247 | 252 | ||
| 248 | return (xfs_attr_get(XFS_I(inode), name, NULL, &len, | 253 | return (xfs_attr_get(XFS_I(inode), name, NULL, &len, |
| 249 | ATTR_ROOT|ATTR_KERNOVAL) == 0); | 254 | ATTR_ROOT|ATTR_KERNOVAL) == 0); |
| @@ -379,7 +384,7 @@ xfs_xattr_acl_set(struct dentry *dentry, const char *name, | |||
| 379 | goto out_release; | 384 | goto out_release; |
| 380 | 385 | ||
| 381 | error = -EINVAL; | 386 | error = -EINVAL; |
| 382 | if (acl->a_count > XFS_ACL_MAX_ENTRIES) | 387 | if (acl->a_count > XFS_ACL_MAX_ENTRIES(XFS_M(inode->i_sb))) |
| 383 | goto out_release; | 388 | goto out_release; |
| 384 | 389 | ||
| 385 | if (type == ACL_TYPE_ACCESS) { | 390 | if (type == ACL_TYPE_ACCESS) { |
diff --git a/fs/xfs/xfs_acl.h b/fs/xfs/xfs_acl.h index 39632d941354..4016a567b83c 100644 --- a/fs/xfs/xfs_acl.h +++ b/fs/xfs/xfs_acl.h | |||
| @@ -22,19 +22,36 @@ struct inode; | |||
| 22 | struct posix_acl; | 22 | struct posix_acl; |
| 23 | struct xfs_inode; | 23 | struct xfs_inode; |
| 24 | 24 | ||
| 25 | #define XFS_ACL_MAX_ENTRIES 25 | ||
| 26 | #define XFS_ACL_NOT_PRESENT (-1) | 25 | #define XFS_ACL_NOT_PRESENT (-1) |
| 27 | 26 | ||
| 28 | /* On-disk XFS access control list structure */ | 27 | /* On-disk XFS access control list structure */ |
| 28 | struct xfs_acl_entry { | ||
| 29 | __be32 ae_tag; | ||
| 30 | __be32 ae_id; | ||
| 31 | __be16 ae_perm; | ||
| 32 | __be16 ae_pad; /* fill the implicit hole in the structure */ | ||
| 33 | }; | ||
| 34 | |||
| 29 | struct xfs_acl { | 35 | struct xfs_acl { |
| 30 | __be32 acl_cnt; | 36 | __be32 acl_cnt; |
| 31 | struct xfs_acl_entry { | 37 | struct xfs_acl_entry acl_entry[0]; |
| 32 | __be32 ae_tag; | ||
| 33 | __be32 ae_id; | ||
| 34 | __be16 ae_perm; | ||
| 35 | } acl_entry[XFS_ACL_MAX_ENTRIES]; | ||
| 36 | }; | 38 | }; |
| 37 | 39 | ||
| 40 | /* | ||
| 41 | * The number of ACL entries allowed is defined by the on-disk format. | ||
| 42 | * For v4 superblocks, that is limited to 25 entries. For v5 superblocks, it is | ||
| 43 | * limited only by the maximum size of the xattr that stores the information. | ||
| 44 | */ | ||
| 45 | #define XFS_ACL_MAX_ENTRIES(mp) \ | ||
| 46 | (xfs_sb_version_hascrc(&mp->m_sb) \ | ||
| 47 | ? (XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \ | ||
| 48 | sizeof(struct xfs_acl_entry) \ | ||
| 49 | : 25) | ||
| 50 | |||
| 51 | #define XFS_ACL_MAX_SIZE(mp) \ | ||
| 52 | (sizeof(struct xfs_acl) + \ | ||
| 53 | sizeof(struct xfs_acl_entry) * XFS_ACL_MAX_ENTRIES((mp))) | ||
| 54 | |||
| 38 | /* On-disk XFS extended attribute names */ | 55 | /* On-disk XFS extended attribute names */ |
| 39 | #define SGI_ACL_FILE (unsigned char *)"SGI_ACL_FILE" | 56 | #define SGI_ACL_FILE (unsigned char *)"SGI_ACL_FILE" |
| 40 | #define SGI_ACL_DEFAULT (unsigned char *)"SGI_ACL_DEFAULT" | 57 | #define SGI_ACL_DEFAULT (unsigned char *)"SGI_ACL_DEFAULT" |
diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index d788302e506a..31d3cd129269 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c | |||
| @@ -3258,7 +3258,7 @@ xfs_attr3_leaf_inactive( | |||
| 3258 | name_rmt = xfs_attr3_leaf_name_remote(leaf, i); | 3258 | name_rmt = xfs_attr3_leaf_name_remote(leaf, i); |
| 3259 | if (name_rmt->valueblk) { | 3259 | if (name_rmt->valueblk) { |
| 3260 | lp->valueblk = be32_to_cpu(name_rmt->valueblk); | 3260 | lp->valueblk = be32_to_cpu(name_rmt->valueblk); |
| 3261 | lp->valuelen = XFS_B_TO_FSB(dp->i_mount, | 3261 | lp->valuelen = xfs_attr3_rmt_blocks(dp->i_mount, |
| 3262 | be32_to_cpu(name_rmt->valuelen)); | 3262 | be32_to_cpu(name_rmt->valuelen)); |
| 3263 | lp++; | 3263 | lp++; |
| 3264 | } | 3264 | } |
diff --git a/fs/xfs/xfs_dquot.c b/fs/xfs/xfs_dquot.c index a41f8bf1da37..044e97a33c8d 100644 --- a/fs/xfs/xfs_dquot.c +++ b/fs/xfs/xfs_dquot.c | |||
| @@ -249,8 +249,11 @@ xfs_qm_init_dquot_blk( | |||
| 249 | d->dd_diskdq.d_version = XFS_DQUOT_VERSION; | 249 | d->dd_diskdq.d_version = XFS_DQUOT_VERSION; |
| 250 | d->dd_diskdq.d_id = cpu_to_be32(curid); | 250 | d->dd_diskdq.d_id = cpu_to_be32(curid); |
| 251 | d->dd_diskdq.d_flags = type; | 251 | d->dd_diskdq.d_flags = type; |
| 252 | if (xfs_sb_version_hascrc(&mp->m_sb)) | 252 | if (xfs_sb_version_hascrc(&mp->m_sb)) { |
| 253 | uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); | 253 | uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); |
| 254 | xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), | ||
| 255 | XFS_DQUOT_CRC_OFF); | ||
| 256 | } | ||
| 254 | } | 257 | } |
| 255 | 258 | ||
| 256 | xfs_trans_dquot_buf(tp, bp, | 259 | xfs_trans_dquot_buf(tp, bp, |
| @@ -286,23 +289,6 @@ xfs_dquot_set_prealloc_limits(struct xfs_dquot *dqp) | |||
| 286 | dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5; | 289 | dqp->q_low_space[XFS_QLOWSP_5_PCNT] = space * 5; |
| 287 | } | 290 | } |
| 288 | 291 | ||
| 289 | STATIC void | ||
| 290 | xfs_dquot_buf_calc_crc( | ||
| 291 | struct xfs_mount *mp, | ||
| 292 | struct xfs_buf *bp) | ||
| 293 | { | ||
| 294 | struct xfs_dqblk *d = (struct xfs_dqblk *)bp->b_addr; | ||
| 295 | int i; | ||
| 296 | |||
| 297 | if (!xfs_sb_version_hascrc(&mp->m_sb)) | ||
| 298 | return; | ||
| 299 | |||
| 300 | for (i = 0; i < mp->m_quotainfo->qi_dqperchunk; i++, d++) { | ||
| 301 | xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), | ||
| 302 | offsetof(struct xfs_dqblk, dd_crc)); | ||
| 303 | } | ||
| 304 | } | ||
| 305 | |||
| 306 | STATIC bool | 292 | STATIC bool |
| 307 | xfs_dquot_buf_verify_crc( | 293 | xfs_dquot_buf_verify_crc( |
| 308 | struct xfs_mount *mp, | 294 | struct xfs_mount *mp, |
| @@ -328,12 +314,11 @@ xfs_dquot_buf_verify_crc( | |||
| 328 | 314 | ||
| 329 | for (i = 0; i < ndquots; i++, d++) { | 315 | for (i = 0; i < ndquots; i++, d++) { |
| 330 | if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), | 316 | if (!xfs_verify_cksum((char *)d, sizeof(struct xfs_dqblk), |
| 331 | offsetof(struct xfs_dqblk, dd_crc))) | 317 | XFS_DQUOT_CRC_OFF)) |
| 332 | return false; | 318 | return false; |
| 333 | if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) | 319 | if (!uuid_equal(&d->dd_uuid, &mp->m_sb.sb_uuid)) |
| 334 | return false; | 320 | return false; |
| 335 | } | 321 | } |
| 336 | |||
| 337 | return true; | 322 | return true; |
| 338 | } | 323 | } |
| 339 | 324 | ||
| @@ -393,6 +378,11 @@ xfs_dquot_buf_read_verify( | |||
| 393 | } | 378 | } |
| 394 | } | 379 | } |
| 395 | 380 | ||
| 381 | /* | ||
| 382 | * we don't calculate the CRC here as that is done when the dquot is flushed to | ||
| 383 | * the buffer after the update is done. This ensures that the dquot in the | ||
| 384 | * buffer always has an up-to-date CRC value. | ||
| 385 | */ | ||
| 396 | void | 386 | void |
| 397 | xfs_dquot_buf_write_verify( | 387 | xfs_dquot_buf_write_verify( |
| 398 | struct xfs_buf *bp) | 388 | struct xfs_buf *bp) |
| @@ -404,7 +394,6 @@ xfs_dquot_buf_write_verify( | |||
| 404 | xfs_buf_ioerror(bp, EFSCORRUPTED); | 394 | xfs_buf_ioerror(bp, EFSCORRUPTED); |
| 405 | return; | 395 | return; |
| 406 | } | 396 | } |
| 407 | xfs_dquot_buf_calc_crc(mp, bp); | ||
| 408 | } | 397 | } |
| 409 | 398 | ||
| 410 | const struct xfs_buf_ops xfs_dquot_buf_ops = { | 399 | const struct xfs_buf_ops xfs_dquot_buf_ops = { |
| @@ -1151,11 +1140,17 @@ xfs_qm_dqflush( | |||
| 1151 | * copy the lsn into the on-disk dquot now while we have the in memory | 1140 | * copy the lsn into the on-disk dquot now while we have the in memory |
| 1152 | * dquot here. This can't be done later in the write verifier as we | 1141 | * dquot here. This can't be done later in the write verifier as we |
| 1153 | * can't get access to the log item at that point in time. | 1142 | * can't get access to the log item at that point in time. |
| 1143 | * | ||
| 1144 | * We also calculate the CRC here so that the on-disk dquot in the | ||
| 1145 | * buffer always has a valid CRC. This ensures there is no possibility | ||
| 1146 | * of a dquot without an up-to-date CRC getting to disk. | ||
| 1154 | */ | 1147 | */ |
| 1155 | if (xfs_sb_version_hascrc(&mp->m_sb)) { | 1148 | if (xfs_sb_version_hascrc(&mp->m_sb)) { |
| 1156 | struct xfs_dqblk *dqb = (struct xfs_dqblk *)ddqp; | 1149 | struct xfs_dqblk *dqb = (struct xfs_dqblk *)ddqp; |
| 1157 | 1150 | ||
| 1158 | dqb->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn); | 1151 | dqb->dd_lsn = cpu_to_be64(dqp->q_logitem.qli_item.li_lsn); |
| 1152 | xfs_update_cksum((char *)dqb, sizeof(struct xfs_dqblk), | ||
| 1153 | XFS_DQUOT_CRC_OFF); | ||
| 1159 | } | 1154 | } |
| 1160 | 1155 | ||
| 1161 | /* | 1156 | /* |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index efbe1accb6ca..7f7be5f98f52 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -1638,6 +1638,10 @@ xfs_iunlink( | |||
| 1638 | dip->di_next_unlinked = agi->agi_unlinked[bucket_index]; | 1638 | dip->di_next_unlinked = agi->agi_unlinked[bucket_index]; |
| 1639 | offset = ip->i_imap.im_boffset + | 1639 | offset = ip->i_imap.im_boffset + |
| 1640 | offsetof(xfs_dinode_t, di_next_unlinked); | 1640 | offsetof(xfs_dinode_t, di_next_unlinked); |
| 1641 | |||
| 1642 | /* need to recalc the inode CRC if appropriate */ | ||
| 1643 | xfs_dinode_calc_crc(mp, dip); | ||
| 1644 | |||
| 1641 | xfs_trans_inode_buf(tp, ibp); | 1645 | xfs_trans_inode_buf(tp, ibp); |
| 1642 | xfs_trans_log_buf(tp, ibp, offset, | 1646 | xfs_trans_log_buf(tp, ibp, offset, |
| 1643 | (offset + sizeof(xfs_agino_t) - 1)); | 1647 | (offset + sizeof(xfs_agino_t) - 1)); |
| @@ -1723,6 +1727,10 @@ xfs_iunlink_remove( | |||
| 1723 | dip->di_next_unlinked = cpu_to_be32(NULLAGINO); | 1727 | dip->di_next_unlinked = cpu_to_be32(NULLAGINO); |
| 1724 | offset = ip->i_imap.im_boffset + | 1728 | offset = ip->i_imap.im_boffset + |
| 1725 | offsetof(xfs_dinode_t, di_next_unlinked); | 1729 | offsetof(xfs_dinode_t, di_next_unlinked); |
| 1730 | |||
| 1731 | /* need to recalc the inode CRC if appropriate */ | ||
| 1732 | xfs_dinode_calc_crc(mp, dip); | ||
| 1733 | |||
| 1726 | xfs_trans_inode_buf(tp, ibp); | 1734 | xfs_trans_inode_buf(tp, ibp); |
| 1727 | xfs_trans_log_buf(tp, ibp, offset, | 1735 | xfs_trans_log_buf(tp, ibp, offset, |
| 1728 | (offset + sizeof(xfs_agino_t) - 1)); | 1736 | (offset + sizeof(xfs_agino_t) - 1)); |
| @@ -1796,6 +1804,10 @@ xfs_iunlink_remove( | |||
| 1796 | dip->di_next_unlinked = cpu_to_be32(NULLAGINO); | 1804 | dip->di_next_unlinked = cpu_to_be32(NULLAGINO); |
| 1797 | offset = ip->i_imap.im_boffset + | 1805 | offset = ip->i_imap.im_boffset + |
| 1798 | offsetof(xfs_dinode_t, di_next_unlinked); | 1806 | offsetof(xfs_dinode_t, di_next_unlinked); |
| 1807 | |||
| 1808 | /* need to recalc the inode CRC if appropriate */ | ||
| 1809 | xfs_dinode_calc_crc(mp, dip); | ||
| 1810 | |||
| 1799 | xfs_trans_inode_buf(tp, ibp); | 1811 | xfs_trans_inode_buf(tp, ibp); |
| 1800 | xfs_trans_log_buf(tp, ibp, offset, | 1812 | xfs_trans_log_buf(tp, ibp, offset, |
| 1801 | (offset + sizeof(xfs_agino_t) - 1)); | 1813 | (offset + sizeof(xfs_agino_t) - 1)); |
| @@ -1809,6 +1821,10 @@ xfs_iunlink_remove( | |||
| 1809 | last_dip->di_next_unlinked = cpu_to_be32(next_agino); | 1821 | last_dip->di_next_unlinked = cpu_to_be32(next_agino); |
| 1810 | ASSERT(next_agino != 0); | 1822 | ASSERT(next_agino != 0); |
| 1811 | offset = last_offset + offsetof(xfs_dinode_t, di_next_unlinked); | 1823 | offset = last_offset + offsetof(xfs_dinode_t, di_next_unlinked); |
| 1824 | |||
| 1825 | /* need to recalc the inode CRC if appropriate */ | ||
| 1826 | xfs_dinode_calc_crc(mp, last_dip); | ||
| 1827 | |||
| 1812 | xfs_trans_inode_buf(tp, last_ibp); | 1828 | xfs_trans_inode_buf(tp, last_ibp); |
| 1813 | xfs_trans_log_buf(tp, last_ibp, offset, | 1829 | xfs_trans_log_buf(tp, last_ibp, offset, |
| 1814 | (offset + sizeof(xfs_agino_t) - 1)); | 1830 | (offset + sizeof(xfs_agino_t) - 1)); |
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index d9e4d3c3991a..45a85ff84da1 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
| @@ -1599,10 +1599,43 @@ xlog_recover_add_to_trans( | |||
| 1599 | } | 1599 | } |
| 1600 | 1600 | ||
| 1601 | /* | 1601 | /* |
| 1602 | * Sort the log items in the transaction. Cancelled buffers need | 1602 | * Sort the log items in the transaction. |
| 1603 | * to be put first so they are processed before any items that might | 1603 | * |
| 1604 | * modify the buffers. If they are cancelled, then the modifications | 1604 | * The ordering constraints are defined by the inode allocation and unlink |
| 1605 | * don't need to be replayed. | 1605 | * behaviour. The rules are: |
| 1606 | * | ||
| 1607 | * 1. Every item is only logged once in a given transaction. Hence it | ||
| 1608 | * represents the last logged state of the item. Hence ordering is | ||
| 1609 | * dependent on the order in which operations need to be performed so | ||
| 1610 | * required initial conditions are always met. | ||
| 1611 | * | ||
| 1612 | * 2. Cancelled buffers are recorded in pass 1 in a separate table and | ||
| 1613 | * there's nothing to replay from them so we can simply cull them | ||
| 1614 | * from the transaction. However, we can't do that until after we've | ||
| 1615 | * replayed all the other items because they may be dependent on the | ||
| 1616 | * cancelled buffer and replaying the cancelled buffer can remove it | ||
| 1617 | * form the cancelled buffer table. Hence they have tobe done last. | ||
| 1618 | * | ||
| 1619 | * 3. Inode allocation buffers must be replayed before inode items that | ||
| 1620 | * read the buffer and replay changes into it. | ||
| 1621 | * | ||
| 1622 | * 4. Inode unlink buffers must be replayed after inode items are replayed. | ||
| 1623 | * This ensures that inodes are completely flushed to the inode buffer | ||
| 1624 | * in a "free" state before we remove the unlinked inode list pointer. | ||
| 1625 | * | ||
| 1626 | * Hence the ordering needs to be inode allocation buffers first, inode items | ||
| 1627 | * second, inode unlink buffers third and cancelled buffers last. | ||
| 1628 | * | ||
| 1629 | * But there's a problem with that - we can't tell an inode allocation buffer | ||
| 1630 | * apart from a regular buffer, so we can't separate them. We can, however, | ||
| 1631 | * tell an inode unlink buffer from the others, and so we can separate them out | ||
| 1632 | * from all the other buffers and move them to last. | ||
| 1633 | * | ||
| 1634 | * Hence, 4 lists, in order from head to tail: | ||
| 1635 | * - buffer_list for all buffers except cancelled/inode unlink buffers | ||
| 1636 | * - item_list for all non-buffer items | ||
| 1637 | * - inode_buffer_list for inode unlink buffers | ||
| 1638 | * - cancel_list for the cancelled buffers | ||
| 1606 | */ | 1639 | */ |
| 1607 | STATIC int | 1640 | STATIC int |
| 1608 | xlog_recover_reorder_trans( | 1641 | xlog_recover_reorder_trans( |
| @@ -1612,6 +1645,10 @@ xlog_recover_reorder_trans( | |||
| 1612 | { | 1645 | { |
| 1613 | xlog_recover_item_t *item, *n; | 1646 | xlog_recover_item_t *item, *n; |
| 1614 | LIST_HEAD(sort_list); | 1647 | LIST_HEAD(sort_list); |
| 1648 | LIST_HEAD(cancel_list); | ||
| 1649 | LIST_HEAD(buffer_list); | ||
| 1650 | LIST_HEAD(inode_buffer_list); | ||
| 1651 | LIST_HEAD(inode_list); | ||
| 1615 | 1652 | ||
| 1616 | list_splice_init(&trans->r_itemq, &sort_list); | 1653 | list_splice_init(&trans->r_itemq, &sort_list); |
| 1617 | list_for_each_entry_safe(item, n, &sort_list, ri_list) { | 1654 | list_for_each_entry_safe(item, n, &sort_list, ri_list) { |
| @@ -1619,12 +1656,18 @@ xlog_recover_reorder_trans( | |||
| 1619 | 1656 | ||
| 1620 | switch (ITEM_TYPE(item)) { | 1657 | switch (ITEM_TYPE(item)) { |
| 1621 | case XFS_LI_BUF: | 1658 | case XFS_LI_BUF: |
| 1622 | if (!(buf_f->blf_flags & XFS_BLF_CANCEL)) { | 1659 | if (buf_f->blf_flags & XFS_BLF_CANCEL) { |
| 1623 | trace_xfs_log_recover_item_reorder_head(log, | 1660 | trace_xfs_log_recover_item_reorder_head(log, |
| 1624 | trans, item, pass); | 1661 | trans, item, pass); |
| 1625 | list_move(&item->ri_list, &trans->r_itemq); | 1662 | list_move(&item->ri_list, &cancel_list); |
| 1663 | break; | ||
| 1664 | } | ||
| 1665 | if (buf_f->blf_flags & XFS_BLF_INODE_BUF) { | ||
| 1666 | list_move(&item->ri_list, &inode_buffer_list); | ||
| 1626 | break; | 1667 | break; |
| 1627 | } | 1668 | } |
| 1669 | list_move_tail(&item->ri_list, &buffer_list); | ||
| 1670 | break; | ||
| 1628 | case XFS_LI_INODE: | 1671 | case XFS_LI_INODE: |
| 1629 | case XFS_LI_DQUOT: | 1672 | case XFS_LI_DQUOT: |
| 1630 | case XFS_LI_QUOTAOFF: | 1673 | case XFS_LI_QUOTAOFF: |
| @@ -1632,7 +1675,7 @@ xlog_recover_reorder_trans( | |||
| 1632 | case XFS_LI_EFI: | 1675 | case XFS_LI_EFI: |
| 1633 | trace_xfs_log_recover_item_reorder_tail(log, | 1676 | trace_xfs_log_recover_item_reorder_tail(log, |
| 1634 | trans, item, pass); | 1677 | trans, item, pass); |
| 1635 | list_move_tail(&item->ri_list, &trans->r_itemq); | 1678 | list_move_tail(&item->ri_list, &inode_list); |
| 1636 | break; | 1679 | break; |
| 1637 | default: | 1680 | default: |
| 1638 | xfs_warn(log->l_mp, | 1681 | xfs_warn(log->l_mp, |
| @@ -1643,6 +1686,14 @@ xlog_recover_reorder_trans( | |||
| 1643 | } | 1686 | } |
| 1644 | } | 1687 | } |
| 1645 | ASSERT(list_empty(&sort_list)); | 1688 | ASSERT(list_empty(&sort_list)); |
| 1689 | if (!list_empty(&buffer_list)) | ||
| 1690 | list_splice(&buffer_list, &trans->r_itemq); | ||
| 1691 | if (!list_empty(&inode_list)) | ||
| 1692 | list_splice_tail(&inode_list, &trans->r_itemq); | ||
| 1693 | if (!list_empty(&inode_buffer_list)) | ||
| 1694 | list_splice_tail(&inode_buffer_list, &trans->r_itemq); | ||
| 1695 | if (!list_empty(&cancel_list)) | ||
| 1696 | list_splice_tail(&cancel_list, &trans->r_itemq); | ||
| 1646 | return 0; | 1697 | return 0; |
| 1647 | } | 1698 | } |
| 1648 | 1699 | ||
| @@ -1861,6 +1912,15 @@ xlog_recover_do_inode_buffer( | |||
| 1861 | buffer_nextp = (xfs_agino_t *)xfs_buf_offset(bp, | 1912 | buffer_nextp = (xfs_agino_t *)xfs_buf_offset(bp, |
| 1862 | next_unlinked_offset); | 1913 | next_unlinked_offset); |
| 1863 | *buffer_nextp = *logged_nextp; | 1914 | *buffer_nextp = *logged_nextp; |
| 1915 | |||
| 1916 | /* | ||
| 1917 | * If necessary, recalculate the CRC in the on-disk inode. We | ||
| 1918 | * have to leave the inode in a consistent state for whoever | ||
| 1919 | * reads it next.... | ||
| 1920 | */ | ||
| 1921 | xfs_dinode_calc_crc(mp, (struct xfs_dinode *) | ||
| 1922 | xfs_buf_offset(bp, i * mp->m_sb.sb_inodesize)); | ||
| 1923 | |||
| 1864 | } | 1924 | } |
| 1865 | 1925 | ||
| 1866 | return 0; | 1926 | return 0; |
| @@ -2266,6 +2326,12 @@ xfs_qm_dqcheck( | |||
| 2266 | d->dd_diskdq.d_flags = type; | 2326 | d->dd_diskdq.d_flags = type; |
| 2267 | d->dd_diskdq.d_id = cpu_to_be32(id); | 2327 | d->dd_diskdq.d_id = cpu_to_be32(id); |
| 2268 | 2328 | ||
| 2329 | if (xfs_sb_version_hascrc(&mp->m_sb)) { | ||
| 2330 | uuid_copy(&d->dd_uuid, &mp->m_sb.sb_uuid); | ||
| 2331 | xfs_update_cksum((char *)d, sizeof(struct xfs_dqblk), | ||
| 2332 | XFS_DQUOT_CRC_OFF); | ||
| 2333 | } | ||
| 2334 | |||
| 2269 | return errs; | 2335 | return errs; |
| 2270 | } | 2336 | } |
| 2271 | 2337 | ||
| @@ -2793,6 +2859,10 @@ xlog_recover_dquot_pass2( | |||
| 2793 | } | 2859 | } |
| 2794 | 2860 | ||
| 2795 | memcpy(ddq, recddq, item->ri_buf[1].i_len); | 2861 | memcpy(ddq, recddq, item->ri_buf[1].i_len); |
| 2862 | if (xfs_sb_version_hascrc(&mp->m_sb)) { | ||
| 2863 | xfs_update_cksum((char *)ddq, sizeof(struct xfs_dqblk), | ||
| 2864 | XFS_DQUOT_CRC_OFF); | ||
| 2865 | } | ||
| 2796 | 2866 | ||
| 2797 | ASSERT(dq_f->qlf_size == 2); | 2867 | ASSERT(dq_f->qlf_size == 2); |
| 2798 | ASSERT(bp->b_target->bt_mount == mp); | 2868 | ASSERT(bp->b_target->bt_mount == mp); |
diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index f41702b43003..b75c9bb6e71e 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | #include "xfs_qm.h" | 41 | #include "xfs_qm.h" |
| 42 | #include "xfs_trace.h" | 42 | #include "xfs_trace.h" |
| 43 | #include "xfs_icache.h" | 43 | #include "xfs_icache.h" |
| 44 | #include "xfs_cksum.h" | ||
| 44 | 45 | ||
| 45 | /* | 46 | /* |
| 46 | * The global quota manager. There is only one of these for the entire | 47 | * The global quota manager. There is only one of these for the entire |
| @@ -839,7 +840,7 @@ xfs_qm_reset_dqcounts( | |||
| 839 | xfs_dqid_t id, | 840 | xfs_dqid_t id, |
| 840 | uint type) | 841 | uint type) |
| 841 | { | 842 | { |
| 842 | xfs_disk_dquot_t *ddq; | 843 | struct xfs_dqblk *dqb; |
| 843 | int j; | 844 | int j; |
| 844 | 845 | ||
| 845 | trace_xfs_reset_dqcounts(bp, _RET_IP_); | 846 | trace_xfs_reset_dqcounts(bp, _RET_IP_); |
| @@ -853,8 +854,12 @@ xfs_qm_reset_dqcounts( | |||
| 853 | do_div(j, sizeof(xfs_dqblk_t)); | 854 | do_div(j, sizeof(xfs_dqblk_t)); |
| 854 | ASSERT(mp->m_quotainfo->qi_dqperchunk == j); | 855 | ASSERT(mp->m_quotainfo->qi_dqperchunk == j); |
| 855 | #endif | 856 | #endif |
| 856 | ddq = bp->b_addr; | 857 | dqb = bp->b_addr; |
| 857 | for (j = 0; j < mp->m_quotainfo->qi_dqperchunk; j++) { | 858 | for (j = 0; j < mp->m_quotainfo->qi_dqperchunk; j++) { |
| 859 | struct xfs_disk_dquot *ddq; | ||
| 860 | |||
| 861 | ddq = (struct xfs_disk_dquot *)&dqb[j]; | ||
| 862 | |||
| 858 | /* | 863 | /* |
| 859 | * Do a sanity check, and if needed, repair the dqblk. Don't | 864 | * Do a sanity check, and if needed, repair the dqblk. Don't |
| 860 | * output any warnings because it's perfectly possible to | 865 | * output any warnings because it's perfectly possible to |
| @@ -871,7 +876,12 @@ xfs_qm_reset_dqcounts( | |||
| 871 | ddq->d_bwarns = 0; | 876 | ddq->d_bwarns = 0; |
| 872 | ddq->d_iwarns = 0; | 877 | ddq->d_iwarns = 0; |
| 873 | ddq->d_rtbwarns = 0; | 878 | ddq->d_rtbwarns = 0; |
| 874 | ddq = (xfs_disk_dquot_t *) ((xfs_dqblk_t *)ddq + 1); | 879 | |
| 880 | if (xfs_sb_version_hascrc(&mp->m_sb)) { | ||
| 881 | xfs_update_cksum((char *)&dqb[j], | ||
| 882 | sizeof(struct xfs_dqblk), | ||
| 883 | XFS_DQUOT_CRC_OFF); | ||
| 884 | } | ||
| 875 | } | 885 | } |
| 876 | } | 886 | } |
| 877 | 887 | ||
| @@ -907,19 +917,29 @@ xfs_qm_dqiter_bufs( | |||
| 907 | XFS_FSB_TO_DADDR(mp, bno), | 917 | XFS_FSB_TO_DADDR(mp, bno), |
| 908 | mp->m_quotainfo->qi_dqchunklen, 0, &bp, | 918 | mp->m_quotainfo->qi_dqchunklen, 0, &bp, |
| 909 | &xfs_dquot_buf_ops); | 919 | &xfs_dquot_buf_ops); |
| 910 | if (error) | ||
| 911 | break; | ||
| 912 | 920 | ||
| 913 | /* | 921 | /* |
| 914 | * XXX(hch): need to figure out if it makes sense to validate | 922 | * CRC and validation errors will return a EFSCORRUPTED here. If |
| 915 | * the CRC here. | 923 | * this occurs, re-read without CRC validation so that we can |
| 924 | * repair the damage via xfs_qm_reset_dqcounts(). This process | ||
| 925 | * will leave a trace in the log indicating corruption has | ||
| 926 | * been detected. | ||
| 916 | */ | 927 | */ |
| 928 | if (error == EFSCORRUPTED) { | ||
| 929 | error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, | ||
| 930 | XFS_FSB_TO_DADDR(mp, bno), | ||
| 931 | mp->m_quotainfo->qi_dqchunklen, 0, &bp, | ||
| 932 | NULL); | ||
| 933 | } | ||
| 934 | |||
| 935 | if (error) | ||
| 936 | break; | ||
| 937 | |||
| 917 | xfs_qm_reset_dqcounts(mp, bp, firstid, type); | 938 | xfs_qm_reset_dqcounts(mp, bp, firstid, type); |
| 918 | xfs_buf_delwri_queue(bp, buffer_list); | 939 | xfs_buf_delwri_queue(bp, buffer_list); |
| 919 | xfs_buf_relse(bp); | 940 | xfs_buf_relse(bp); |
| 920 | /* | 941 | |
| 921 | * goto the next block. | 942 | /* goto the next block. */ |
| 922 | */ | ||
| 923 | bno++; | 943 | bno++; |
| 924 | firstid += mp->m_quotainfo->qi_dqperchunk; | 944 | firstid += mp->m_quotainfo->qi_dqperchunk; |
| 925 | } | 945 | } |
diff --git a/fs/xfs/xfs_quota.h b/fs/xfs/xfs_quota.h index c61e31c7d997..c38068f26c55 100644 --- a/fs/xfs/xfs_quota.h +++ b/fs/xfs/xfs_quota.h | |||
| @@ -87,6 +87,8 @@ typedef struct xfs_dqblk { | |||
| 87 | uuid_t dd_uuid; /* location information */ | 87 | uuid_t dd_uuid; /* location information */ |
| 88 | } xfs_dqblk_t; | 88 | } xfs_dqblk_t; |
| 89 | 89 | ||
| 90 | #define XFS_DQUOT_CRC_OFF offsetof(struct xfs_dqblk, dd_crc) | ||
| 91 | |||
| 90 | /* | 92 | /* |
| 91 | * flags for q_flags field in the dquot. | 93 | * flags for q_flags field in the dquot. |
| 92 | */ | 94 | */ |
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index ea341cea68cb..3033ba5e9762 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c | |||
| @@ -1373,6 +1373,17 @@ xfs_finish_flags( | |||
| 1373 | } | 1373 | } |
| 1374 | 1374 | ||
| 1375 | /* | 1375 | /* |
| 1376 | * V5 filesystems always use attr2 format for attributes. | ||
| 1377 | */ | ||
| 1378 | if (xfs_sb_version_hascrc(&mp->m_sb) && | ||
| 1379 | (mp->m_flags & XFS_MOUNT_NOATTR2)) { | ||
| 1380 | xfs_warn(mp, | ||
| 1381 | "Cannot mount a V5 filesystem as %s. %s is always enabled for V5 filesystems.", | ||
| 1382 | MNTOPT_NOATTR2, MNTOPT_ATTR2); | ||
| 1383 | return XFS_ERROR(EINVAL); | ||
| 1384 | } | ||
| 1385 | |||
| 1386 | /* | ||
| 1376 | * mkfs'ed attr2 will turn on attr2 mount unless explicitly | 1387 | * mkfs'ed attr2 will turn on attr2 mount unless explicitly |
| 1377 | * told by noattr2 to turn it off | 1388 | * told by noattr2 to turn it off |
| 1378 | */ | 1389 | */ |
diff --git a/include/asm-generic/io.h b/include/asm-generic/io.h index ac9da00e9f2c..d5afe96adba6 100644 --- a/include/asm-generic/io.h +++ b/include/asm-generic/io.h | |||
| @@ -343,8 +343,12 @@ extern void ioport_unmap(void __iomem *p); | |||
| 343 | #endif /* CONFIG_GENERIC_IOMAP */ | 343 | #endif /* CONFIG_GENERIC_IOMAP */ |
| 344 | #endif /* CONFIG_HAS_IOPORT */ | 344 | #endif /* CONFIG_HAS_IOPORT */ |
| 345 | 345 | ||
| 346 | #ifndef xlate_dev_kmem_ptr | ||
| 346 | #define xlate_dev_kmem_ptr(p) p | 347 | #define xlate_dev_kmem_ptr(p) p |
| 348 | #endif | ||
| 349 | #ifndef xlate_dev_mem_ptr | ||
| 347 | #define xlate_dev_mem_ptr(p) __va(p) | 350 | #define xlate_dev_mem_ptr(p) __va(p) |
| 351 | #endif | ||
| 348 | 352 | ||
| 349 | #ifdef CONFIG_VIRT_TO_BUS | 353 | #ifdef CONFIG_VIRT_TO_BUS |
| 350 | #ifndef virt_to_bus | 354 | #ifndef virt_to_bus |
diff --git a/include/asm-generic/tlb.h b/include/asm-generic/tlb.h index b1b1fa6ffffe..13821c339a41 100644 --- a/include/asm-generic/tlb.h +++ b/include/asm-generic/tlb.h | |||
| @@ -97,11 +97,9 @@ struct mmu_gather { | |||
| 97 | unsigned long start; | 97 | unsigned long start; |
| 98 | unsigned long end; | 98 | unsigned long end; |
| 99 | unsigned int need_flush : 1, /* Did free PTEs */ | 99 | unsigned int need_flush : 1, /* Did free PTEs */ |
| 100 | fast_mode : 1; /* No batching */ | ||
| 101 | |||
| 102 | /* we are in the middle of an operation to clear | 100 | /* we are in the middle of an operation to clear |
| 103 | * a full mm and can make some optimizations */ | 101 | * a full mm and can make some optimizations */ |
| 104 | unsigned int fullmm : 1, | 102 | fullmm : 1, |
| 105 | /* we have performed an operation which | 103 | /* we have performed an operation which |
| 106 | * requires a complete flush of the tlb */ | 104 | * requires a complete flush of the tlb */ |
| 107 | need_flush_all : 1; | 105 | need_flush_all : 1; |
| @@ -114,19 +112,6 @@ struct mmu_gather { | |||
| 114 | 112 | ||
| 115 | #define HAVE_GENERIC_MMU_GATHER | 113 | #define HAVE_GENERIC_MMU_GATHER |
| 116 | 114 | ||
| 117 | static inline int tlb_fast_mode(struct mmu_gather *tlb) | ||
| 118 | { | ||
| 119 | #ifdef CONFIG_SMP | ||
| 120 | return tlb->fast_mode; | ||
| 121 | #else | ||
| 122 | /* | ||
| 123 | * For UP we don't need to worry about TLB flush | ||
| 124 | * and page free order so much.. | ||
| 125 | */ | ||
| 126 | return 1; | ||
| 127 | #endif | ||
| 128 | } | ||
| 129 | |||
| 130 | void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm); | 115 | void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm); |
| 131 | void tlb_flush_mmu(struct mmu_gather *tlb); | 116 | void tlb_flush_mmu(struct mmu_gather *tlb); |
| 132 | void tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, | 117 | void tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, |
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 5047355b9a0f..8bda1294c035 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
| @@ -707,7 +707,7 @@ struct cgroup *cgroup_rightmost_descendant(struct cgroup *pos); | |||
| 707 | * | 707 | * |
| 708 | * If a subsystem synchronizes against the parent in its ->css_online() and | 708 | * If a subsystem synchronizes against the parent in its ->css_online() and |
| 709 | * before starting iterating, and synchronizes against @pos on each | 709 | * before starting iterating, and synchronizes against @pos on each |
| 710 | * iteration, any descendant cgroup which finished ->css_offline() is | 710 | * iteration, any descendant cgroup which finished ->css_online() is |
| 711 | * guaranteed to be visible in the future iterations. | 711 | * guaranteed to be visible in the future iterations. |
| 712 | * | 712 | * |
| 713 | * In other words, the following guarantees that a descendant can't escape | 713 | * In other words, the following guarantees that a descendant can't escape |
diff --git a/include/linux/list.h b/include/linux/list.h index 6a1f8df9144b..b83e5657365a 100644 --- a/include/linux/list.h +++ b/include/linux/list.h | |||
| @@ -362,6 +362,17 @@ static inline void list_splice_tail_init(struct list_head *list, | |||
| 362 | list_entry((ptr)->next, type, member) | 362 | list_entry((ptr)->next, type, member) |
| 363 | 363 | ||
| 364 | /** | 364 | /** |
| 365 | * list_first_entry_or_null - get the first element from a list | ||
| 366 | * @ptr: the list head to take the element from. | ||
| 367 | * @type: the type of the struct this is embedded in. | ||
| 368 | * @member: the name of the list_struct within the struct. | ||
| 369 | * | ||
| 370 | * Note that if the list is empty, it returns NULL. | ||
| 371 | */ | ||
| 372 | #define list_first_entry_or_null(ptr, type, member) \ | ||
| 373 | (!list_empty(ptr) ? list_first_entry(ptr, type, member) : NULL) | ||
| 374 | |||
| 375 | /** | ||
| 365 | * list_for_each - iterate over a list | 376 | * list_for_each - iterate over a list |
| 366 | * @pos: the &struct list_head to use as a loop cursor. | 377 | * @pos: the &struct list_head to use as a loop cursor. |
| 367 | * @head: the head for your list. | 378 | * @head: the head for your list. |
diff --git a/include/linux/netfilter_ipv6.h b/include/linux/netfilter_ipv6.h index 98ffb54988b6..2d4df6ce043e 100644 --- a/include/linux/netfilter_ipv6.h +++ b/include/linux/netfilter_ipv6.h | |||
| @@ -17,6 +17,22 @@ extern __sum16 nf_ip6_checksum(struct sk_buff *skb, unsigned int hook, | |||
| 17 | 17 | ||
| 18 | extern int ipv6_netfilter_init(void); | 18 | extern int ipv6_netfilter_init(void); |
| 19 | extern void ipv6_netfilter_fini(void); | 19 | extern void ipv6_netfilter_fini(void); |
| 20 | |||
| 21 | /* | ||
| 22 | * Hook functions for ipv6 to allow xt_* modules to be built-in even | ||
| 23 | * if IPv6 is a module. | ||
| 24 | */ | ||
| 25 | struct nf_ipv6_ops { | ||
| 26 | int (*chk_addr)(struct net *net, const struct in6_addr *addr, | ||
| 27 | const struct net_device *dev, int strict); | ||
| 28 | }; | ||
| 29 | |||
| 30 | extern const struct nf_ipv6_ops __rcu *nf_ipv6_ops; | ||
| 31 | static inline const struct nf_ipv6_ops *nf_get_ipv6_ops(void) | ||
| 32 | { | ||
| 33 | return rcu_dereference(nf_ipv6_ops); | ||
| 34 | } | ||
| 35 | |||
| 20 | #else /* CONFIG_NETFILTER */ | 36 | #else /* CONFIG_NETFILTER */ |
| 21 | static inline int ipv6_netfilter_init(void) { return 0; } | 37 | static inline int ipv6_netfilter_init(void) { return 0; } |
| 22 | static inline void ipv6_netfilter_fini(void) { return; } | 38 | static inline void ipv6_netfilter_fini(void) { return; } |
diff --git a/include/linux/rculist.h b/include/linux/rculist.h index 8089e35d47ac..f4b1001a4676 100644 --- a/include/linux/rculist.h +++ b/include/linux/rculist.h | |||
| @@ -461,6 +461,26 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, | |||
| 461 | &(pos)->member)), typeof(*(pos)), member)) | 461 | &(pos)->member)), typeof(*(pos)), member)) |
| 462 | 462 | ||
| 463 | /** | 463 | /** |
| 464 | * hlist_for_each_entry_rcu_notrace - iterate over rcu list of given type (for tracing) | ||
| 465 | * @pos: the type * to use as a loop cursor. | ||
| 466 | * @head: the head for your list. | ||
| 467 | * @member: the name of the hlist_node within the struct. | ||
| 468 | * | ||
| 469 | * This list-traversal primitive may safely run concurrently with | ||
| 470 | * the _rcu list-mutation primitives such as hlist_add_head_rcu() | ||
| 471 | * as long as the traversal is guarded by rcu_read_lock(). | ||
| 472 | * | ||
| 473 | * This is the same as hlist_for_each_entry_rcu() except that it does | ||
| 474 | * not do any RCU debugging or tracing. | ||
| 475 | */ | ||
| 476 | #define hlist_for_each_entry_rcu_notrace(pos, head, member) \ | ||
| 477 | for (pos = hlist_entry_safe (rcu_dereference_raw_notrace(hlist_first_rcu(head)),\ | ||
| 478 | typeof(*(pos)), member); \ | ||
| 479 | pos; \ | ||
| 480 | pos = hlist_entry_safe(rcu_dereference_raw_notrace(hlist_next_rcu(\ | ||
| 481 | &(pos)->member)), typeof(*(pos)), member)) | ||
| 482 | |||
| 483 | /** | ||
| 464 | * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type | 484 | * hlist_for_each_entry_rcu_bh - iterate over rcu list of given type |
| 465 | * @pos: the type * to use as a loop cursor. | 485 | * @pos: the type * to use as a loop cursor. |
| 466 | * @head: the head for your list. | 486 | * @head: the head for your list. |
diff --git a/include/linux/rculist_nulls.h b/include/linux/rculist_nulls.h index 2ae13714828b..1c33dd7da4a7 100644 --- a/include/linux/rculist_nulls.h +++ b/include/linux/rculist_nulls.h | |||
| @@ -105,9 +105,14 @@ static inline void hlist_nulls_add_head_rcu(struct hlist_nulls_node *n, | |||
| 105 | * @head: the head for your list. | 105 | * @head: the head for your list. |
| 106 | * @member: the name of the hlist_nulls_node within the struct. | 106 | * @member: the name of the hlist_nulls_node within the struct. |
| 107 | * | 107 | * |
| 108 | * The barrier() is needed to make sure compiler doesn't cache first element [1], | ||
| 109 | * as this loop can be restarted [2] | ||
| 110 | * [1] Documentation/atomic_ops.txt around line 114 | ||
| 111 | * [2] Documentation/RCU/rculist_nulls.txt around line 146 | ||
| 108 | */ | 112 | */ |
| 109 | #define hlist_nulls_for_each_entry_rcu(tpos, pos, head, member) \ | 113 | #define hlist_nulls_for_each_entry_rcu(tpos, pos, head, member) \ |
| 110 | for (pos = rcu_dereference_raw(hlist_nulls_first_rcu(head)); \ | 114 | for (({barrier();}), \ |
| 115 | pos = rcu_dereference_raw(hlist_nulls_first_rcu(head)); \ | ||
| 111 | (!is_a_nulls(pos)) && \ | 116 | (!is_a_nulls(pos)) && \ |
| 112 | ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \ | 117 | ({ tpos = hlist_nulls_entry(pos, typeof(*tpos), member); 1; }); \ |
| 113 | pos = rcu_dereference_raw(hlist_nulls_next_rcu(pos))) | 118 | pos = rcu_dereference_raw(hlist_nulls_next_rcu(pos))) |
diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h index 4ccd68e49b00..ddcc7826d907 100644 --- a/include/linux/rcupdate.h +++ b/include/linux/rcupdate.h | |||
| @@ -640,6 +640,15 @@ static inline void rcu_preempt_sleep_check(void) | |||
| 640 | 640 | ||
| 641 | #define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/ | 641 | #define rcu_dereference_raw(p) rcu_dereference_check(p, 1) /*@@@ needed? @@@*/ |
| 642 | 642 | ||
| 643 | /* | ||
| 644 | * The tracing infrastructure traces RCU (we want that), but unfortunately | ||
| 645 | * some of the RCU checks causes tracing to lock up the system. | ||
| 646 | * | ||
| 647 | * The tracing version of rcu_dereference_raw() must not call | ||
| 648 | * rcu_read_lock_held(). | ||
| 649 | */ | ||
| 650 | #define rcu_dereference_raw_notrace(p) __rcu_dereference_check((p), 1, __rcu) | ||
| 651 | |||
| 643 | /** | 652 | /** |
| 644 | * rcu_access_index() - fetch RCU index with no dereferencing | 653 | * rcu_access_index() - fetch RCU index with no dereferencing |
| 645 | * @p: The index to read | 654 | * @p: The index to read |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 2e0ced1af3b1..9c676eae3968 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -2852,6 +2852,21 @@ static inline int skb_tnl_header_len(const struct sk_buff *inner_skb) | |||
| 2852 | SKB_GSO_CB(inner_skb)->mac_offset; | 2852 | SKB_GSO_CB(inner_skb)->mac_offset; |
| 2853 | } | 2853 | } |
| 2854 | 2854 | ||
| 2855 | static inline int gso_pskb_expand_head(struct sk_buff *skb, int extra) | ||
| 2856 | { | ||
| 2857 | int new_headroom, headroom; | ||
| 2858 | int ret; | ||
| 2859 | |||
| 2860 | headroom = skb_headroom(skb); | ||
| 2861 | ret = pskb_expand_head(skb, extra, 0, GFP_ATOMIC); | ||
| 2862 | if (ret) | ||
| 2863 | return ret; | ||
| 2864 | |||
| 2865 | new_headroom = skb_headroom(skb); | ||
| 2866 | SKB_GSO_CB(skb)->mac_offset += (new_headroom - headroom); | ||
| 2867 | return 0; | ||
| 2868 | } | ||
| 2869 | |||
| 2855 | static inline bool skb_is_gso(const struct sk_buff *skb) | 2870 | static inline bool skb_is_gso(const struct sk_buff *skb) |
| 2856 | { | 2871 | { |
| 2857 | return skb_shinfo(skb)->gso_size; | 2872 | return skb_shinfo(skb)->gso_size; |
diff --git a/include/linux/socket.h b/include/linux/socket.h index 33bf2dfab19d..b10ce4b341ea 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h | |||
| @@ -320,6 +320,9 @@ extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); | |||
| 320 | 320 | ||
| 321 | struct timespec; | 321 | struct timespec; |
| 322 | 322 | ||
| 323 | /* The __sys_...msg variants allow MSG_CMSG_COMPAT */ | ||
| 324 | extern long __sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags); | ||
| 325 | extern long __sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags); | ||
| 323 | extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | 326 | extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, |
| 324 | unsigned int flags, struct timespec *timeout); | 327 | unsigned int flags, struct timespec *timeout); |
| 325 | extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, | 328 | extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, |
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 84a6440f1f19..21f702704f24 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
| @@ -65,7 +65,7 @@ extern int addrconf_set_dstaddr(struct net *net, | |||
| 65 | 65 | ||
| 66 | extern int ipv6_chk_addr(struct net *net, | 66 | extern int ipv6_chk_addr(struct net *net, |
| 67 | const struct in6_addr *addr, | 67 | const struct in6_addr *addr, |
| 68 | struct net_device *dev, | 68 | const struct net_device *dev, |
| 69 | int strict); | 69 | int strict); |
| 70 | 70 | ||
| 71 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) | 71 | #if defined(CONFIG_IPV6_MIP6) || defined(CONFIG_IPV6_MIP6_MODULE) |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index f10818fc8804..e7f4e21cc3e1 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
| @@ -679,22 +679,26 @@ static inline struct sk_buff *skb_act_clone(struct sk_buff *skb, gfp_t gfp_mask, | |||
| 679 | #endif | 679 | #endif |
| 680 | 680 | ||
| 681 | struct psched_ratecfg { | 681 | struct psched_ratecfg { |
| 682 | u64 rate_bps; | 682 | u64 rate_bps; |
| 683 | u32 mult; | 683 | u32 mult; |
| 684 | u32 shift; | 684 | u16 overhead; |
| 685 | u8 shift; | ||
| 685 | }; | 686 | }; |
| 686 | 687 | ||
| 687 | static inline u64 psched_l2t_ns(const struct psched_ratecfg *r, | 688 | static inline u64 psched_l2t_ns(const struct psched_ratecfg *r, |
| 688 | unsigned int len) | 689 | unsigned int len) |
| 689 | { | 690 | { |
| 690 | return ((u64)len * r->mult) >> r->shift; | 691 | return ((u64)(len + r->overhead) * r->mult) >> r->shift; |
| 691 | } | 692 | } |
| 692 | 693 | ||
| 693 | extern void psched_ratecfg_precompute(struct psched_ratecfg *r, u32 rate); | 694 | extern void psched_ratecfg_precompute(struct psched_ratecfg *r, const struct tc_ratespec *conf); |
| 694 | 695 | ||
| 695 | static inline u32 psched_ratecfg_getrate(const struct psched_ratecfg *r) | 696 | static inline void psched_ratecfg_getrate(struct tc_ratespec *res, |
| 697 | const struct psched_ratecfg *r) | ||
| 696 | { | 698 | { |
| 697 | return r->rate_bps >> 3; | 699 | memset(res, 0, sizeof(*res)); |
| 700 | res->rate = r->rate_bps >> 3; | ||
| 701 | res->overhead = r->overhead; | ||
| 698 | } | 702 | } |
| 699 | 703 | ||
| 700 | #endif | 704 | #endif |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index ae16531d0d35..94ce082b29dc 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
| @@ -1160,6 +1160,8 @@ static inline void xfrm_sk_free_policy(struct sock *sk) | |||
| 1160 | } | 1160 | } |
| 1161 | } | 1161 | } |
| 1162 | 1162 | ||
| 1163 | extern void xfrm_garbage_collect(struct net *net); | ||
| 1164 | |||
| 1163 | #else | 1165 | #else |
| 1164 | 1166 | ||
| 1165 | static inline void xfrm_sk_free_policy(struct sock *sk) {} | 1167 | static inline void xfrm_sk_free_policy(struct sock *sk) {} |
| @@ -1194,6 +1196,9 @@ static inline int xfrm6_policy_check_reverse(struct sock *sk, int dir, | |||
| 1194 | { | 1196 | { |
| 1195 | return 1; | 1197 | return 1; |
| 1196 | } | 1198 | } |
| 1199 | static inline void xfrm_garbage_collect(struct net *net) | ||
| 1200 | { | ||
| 1201 | } | ||
| 1197 | #endif | 1202 | #endif |
| 1198 | 1203 | ||
| 1199 | static __inline__ | 1204 | static __inline__ |
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 2a9926275f80..a7c9e6ddb979 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
| @@ -1686,11 +1686,14 @@ static struct dentry *cgroup_mount(struct file_system_type *fs_type, | |||
| 1686 | */ | 1686 | */ |
| 1687 | cgroup_drop_root(opts.new_root); | 1687 | cgroup_drop_root(opts.new_root); |
| 1688 | 1688 | ||
| 1689 | if (((root->flags | opts.flags) & CGRP_ROOT_SANE_BEHAVIOR) && | 1689 | if (root->flags != opts.flags) { |
| 1690 | root->flags != opts.flags) { | 1690 | if ((root->flags | opts.flags) & CGRP_ROOT_SANE_BEHAVIOR) { |
| 1691 | pr_err("cgroup: sane_behavior: new mount options should match the existing superblock\n"); | 1691 | pr_err("cgroup: sane_behavior: new mount options should match the existing superblock\n"); |
| 1692 | ret = -EINVAL; | 1692 | ret = -EINVAL; |
| 1693 | goto drop_new_super; | 1693 | goto drop_new_super; |
| 1694 | } else { | ||
| 1695 | pr_warning("cgroup: new mount options do not match the existing superblock, will be ignored\n"); | ||
| 1696 | } | ||
| 1694 | } | 1697 | } |
| 1695 | 1698 | ||
| 1696 | /* no subsys rebinding, so refcounts don't change */ | 1699 | /* no subsys rebinding, so refcounts don't change */ |
| @@ -2699,13 +2702,14 @@ static int cgroup_add_file(struct cgroup *cgrp, struct cgroup_subsys *subsys, | |||
| 2699 | goto out; | 2702 | goto out; |
| 2700 | } | 2703 | } |
| 2701 | 2704 | ||
| 2705 | cfe->type = (void *)cft; | ||
| 2706 | cfe->dentry = dentry; | ||
| 2707 | dentry->d_fsdata = cfe; | ||
| 2708 | simple_xattrs_init(&cfe->xattrs); | ||
| 2709 | |||
| 2702 | mode = cgroup_file_mode(cft); | 2710 | mode = cgroup_file_mode(cft); |
| 2703 | error = cgroup_create_file(dentry, mode | S_IFREG, cgrp->root->sb); | 2711 | error = cgroup_create_file(dentry, mode | S_IFREG, cgrp->root->sb); |
| 2704 | if (!error) { | 2712 | if (!error) { |
| 2705 | cfe->type = (void *)cft; | ||
| 2706 | cfe->dentry = dentry; | ||
| 2707 | dentry->d_fsdata = cfe; | ||
| 2708 | simple_xattrs_init(&cfe->xattrs); | ||
| 2709 | list_add_tail(&cfe->node, &parent->files); | 2713 | list_add_tail(&cfe->node, &parent->files); |
| 2710 | cfe = NULL; | 2714 | cfe = NULL; |
| 2711 | } | 2715 | } |
| @@ -2953,11 +2957,8 @@ struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos, | |||
| 2953 | WARN_ON_ONCE(!rcu_read_lock_held()); | 2957 | WARN_ON_ONCE(!rcu_read_lock_held()); |
| 2954 | 2958 | ||
| 2955 | /* if first iteration, pretend we just visited @cgroup */ | 2959 | /* if first iteration, pretend we just visited @cgroup */ |
| 2956 | if (!pos) { | 2960 | if (!pos) |
| 2957 | if (list_empty(&cgroup->children)) | ||
| 2958 | return NULL; | ||
| 2959 | pos = cgroup; | 2961 | pos = cgroup; |
| 2960 | } | ||
| 2961 | 2962 | ||
| 2962 | /* visit the first child if exists */ | 2963 | /* visit the first child if exists */ |
| 2963 | next = list_first_or_null_rcu(&pos->children, struct cgroup, sibling); | 2964 | next = list_first_or_null_rcu(&pos->children, struct cgroup, sibling); |
| @@ -2965,14 +2966,14 @@ struct cgroup *cgroup_next_descendant_pre(struct cgroup *pos, | |||
| 2965 | return next; | 2966 | return next; |
| 2966 | 2967 | ||
| 2967 | /* no child, visit my or the closest ancestor's next sibling */ | 2968 | /* no child, visit my or the closest ancestor's next sibling */ |
| 2968 | do { | 2969 | while (pos != cgroup) { |
| 2969 | next = list_entry_rcu(pos->sibling.next, struct cgroup, | 2970 | next = list_entry_rcu(pos->sibling.next, struct cgroup, |
| 2970 | sibling); | 2971 | sibling); |
| 2971 | if (&next->sibling != &pos->parent->children) | 2972 | if (&next->sibling != &pos->parent->children) |
| 2972 | return next; | 2973 | return next; |
| 2973 | 2974 | ||
| 2974 | pos = pos->parent; | 2975 | pos = pos->parent; |
| 2975 | } while (pos != cgroup); | 2976 | } |
| 2976 | 2977 | ||
| 2977 | return NULL; | 2978 | return NULL; |
| 2978 | } | 2979 | } |
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index 5a83dde8ca0c..54a4d5223238 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c | |||
| @@ -143,7 +143,10 @@ static unsigned int irq_domain_legacy_revmap(struct irq_domain *domain, | |||
| 143 | * irq_domain_add_simple() - Allocate and register a simple irq_domain. | 143 | * irq_domain_add_simple() - Allocate and register a simple irq_domain. |
| 144 | * @of_node: pointer to interrupt controller's device tree node. | 144 | * @of_node: pointer to interrupt controller's device tree node. |
| 145 | * @size: total number of irqs in mapping | 145 | * @size: total number of irqs in mapping |
| 146 | * @first_irq: first number of irq block assigned to the domain | 146 | * @first_irq: first number of irq block assigned to the domain, |
| 147 | * pass zero to assign irqs on-the-fly. This will result in a | ||
| 148 | * linear IRQ domain so it is important to use irq_create_mapping() | ||
| 149 | * for each used IRQ, especially when SPARSE_IRQ is enabled. | ||
| 147 | * @ops: map/unmap domain callbacks | 150 | * @ops: map/unmap domain callbacks |
| 148 | * @host_data: Controller private data pointer | 151 | * @host_data: Controller private data pointer |
| 149 | * | 152 | * |
| @@ -191,6 +194,7 @@ struct irq_domain *irq_domain_add_simple(struct device_node *of_node, | |||
| 191 | /* A linear domain is the default */ | 194 | /* A linear domain is the default */ |
| 192 | return irq_domain_add_linear(of_node, size, ops, host_data); | 195 | return irq_domain_add_linear(of_node, size, ops, host_data); |
| 193 | } | 196 | } |
| 197 | EXPORT_SYMBOL_GPL(irq_domain_add_simple); | ||
| 194 | 198 | ||
| 195 | /** | 199 | /** |
| 196 | * irq_domain_add_legacy() - Allocate and register a legacy revmap irq_domain. | 200 | * irq_domain_add_legacy() - Allocate and register a legacy revmap irq_domain. |
| @@ -397,11 +401,12 @@ static void irq_domain_disassociate_many(struct irq_domain *domain, | |||
| 397 | while (count--) { | 401 | while (count--) { |
| 398 | int irq = irq_base + count; | 402 | int irq = irq_base + count; |
| 399 | struct irq_data *irq_data = irq_get_irq_data(irq); | 403 | struct irq_data *irq_data = irq_get_irq_data(irq); |
| 400 | irq_hw_number_t hwirq = irq_data->hwirq; | 404 | irq_hw_number_t hwirq; |
| 401 | 405 | ||
| 402 | if (WARN_ON(!irq_data || irq_data->domain != domain)) | 406 | if (WARN_ON(!irq_data || irq_data->domain != domain)) |
| 403 | continue; | 407 | continue; |
| 404 | 408 | ||
| 409 | hwirq = irq_data->hwirq; | ||
| 405 | irq_set_status_flags(irq, IRQ_NOREQUEST); | 410 | irq_set_status_flags(irq, IRQ_NOREQUEST); |
| 406 | 411 | ||
| 407 | /* remove chip and handler */ | 412 | /* remove chip and handler */ |
diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c index 12ff13a838c6..8f5b3b98577b 100644 --- a/kernel/time/ntp.c +++ b/kernel/time/ntp.c | |||
| @@ -874,7 +874,6 @@ static void hardpps_update_phase(long error) | |||
| 874 | void __hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts) | 874 | void __hardpps(const struct timespec *phase_ts, const struct timespec *raw_ts) |
| 875 | { | 875 | { |
| 876 | struct pps_normtime pts_norm, freq_norm; | 876 | struct pps_normtime pts_norm, freq_norm; |
| 877 | unsigned long flags; | ||
| 878 | 877 | ||
| 879 | pts_norm = pps_normalize_ts(*phase_ts); | 878 | pts_norm = pps_normalize_ts(*phase_ts); |
| 880 | 879 | ||
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 24938d577669..0c739423b0f9 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c | |||
| @@ -511,6 +511,12 @@ again: | |||
| 511 | } | 511 | } |
| 512 | } | 512 | } |
| 513 | 513 | ||
| 514 | /* | ||
| 515 | * Remove the current cpu from the pending mask. The event is | ||
| 516 | * delivered immediately in tick_do_broadcast() ! | ||
| 517 | */ | ||
| 518 | cpumask_clear_cpu(smp_processor_id(), tick_broadcast_pending_mask); | ||
| 519 | |||
| 514 | /* Take care of enforced broadcast requests */ | 520 | /* Take care of enforced broadcast requests */ |
| 515 | cpumask_or(tmpmask, tmpmask, tick_broadcast_force_mask); | 521 | cpumask_or(tmpmask, tmpmask, tick_broadcast_force_mask); |
| 516 | cpumask_clear(tick_broadcast_force_mask); | 522 | cpumask_clear(tick_broadcast_force_mask); |
| @@ -575,8 +581,8 @@ void tick_broadcast_oneshot_control(unsigned long reason) | |||
| 575 | 581 | ||
| 576 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); | 582 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); |
| 577 | if (reason == CLOCK_EVT_NOTIFY_BROADCAST_ENTER) { | 583 | if (reason == CLOCK_EVT_NOTIFY_BROADCAST_ENTER) { |
| 578 | WARN_ON_ONCE(cpumask_test_cpu(cpu, tick_broadcast_pending_mask)); | ||
| 579 | if (!cpumask_test_and_set_cpu(cpu, tick_broadcast_oneshot_mask)) { | 584 | if (!cpumask_test_and_set_cpu(cpu, tick_broadcast_oneshot_mask)) { |
| 585 | WARN_ON_ONCE(cpumask_test_cpu(cpu, tick_broadcast_pending_mask)); | ||
| 580 | clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); | 586 | clockevents_set_mode(dev, CLOCK_EVT_MODE_SHUTDOWN); |
| 581 | /* | 587 | /* |
| 582 | * We only reprogram the broadcast timer if we | 588 | * We only reprogram the broadcast timer if we |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index 98cd470bbe49..baeeb5c87cf1 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -975,6 +975,14 @@ static int timekeeping_suspend(void) | |||
| 975 | 975 | ||
| 976 | read_persistent_clock(&timekeeping_suspend_time); | 976 | read_persistent_clock(&timekeeping_suspend_time); |
| 977 | 977 | ||
| 978 | /* | ||
| 979 | * On some systems the persistent_clock can not be detected at | ||
| 980 | * timekeeping_init by its return value, so if we see a valid | ||
| 981 | * value returned, update the persistent_clock_exists flag. | ||
| 982 | */ | ||
| 983 | if (timekeeping_suspend_time.tv_sec || timekeeping_suspend_time.tv_nsec) | ||
| 984 | persistent_clock_exist = true; | ||
| 985 | |||
| 978 | raw_spin_lock_irqsave(&timekeeper_lock, flags); | 986 | raw_spin_lock_irqsave(&timekeeper_lock, flags); |
| 979 | write_seqcount_begin(&timekeeper_seq); | 987 | write_seqcount_begin(&timekeeper_seq); |
| 980 | timekeeping_forward_now(tk); | 988 | timekeeping_forward_now(tk); |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index b549b0f5b977..6c508ff33c62 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -120,22 +120,22 @@ static void ftrace_ops_no_ops(unsigned long ip, unsigned long parent_ip); | |||
| 120 | 120 | ||
| 121 | /* | 121 | /* |
| 122 | * Traverse the ftrace_global_list, invoking all entries. The reason that we | 122 | * Traverse the ftrace_global_list, invoking all entries. The reason that we |
| 123 | * can use rcu_dereference_raw() is that elements removed from this list | 123 | * can use rcu_dereference_raw_notrace() is that elements removed from this list |
| 124 | * are simply leaked, so there is no need to interact with a grace-period | 124 | * are simply leaked, so there is no need to interact with a grace-period |
| 125 | * mechanism. The rcu_dereference_raw() calls are needed to handle | 125 | * mechanism. The rcu_dereference_raw_notrace() calls are needed to handle |
| 126 | * concurrent insertions into the ftrace_global_list. | 126 | * concurrent insertions into the ftrace_global_list. |
| 127 | * | 127 | * |
| 128 | * Silly Alpha and silly pointer-speculation compiler optimizations! | 128 | * Silly Alpha and silly pointer-speculation compiler optimizations! |
| 129 | */ | 129 | */ |
| 130 | #define do_for_each_ftrace_op(op, list) \ | 130 | #define do_for_each_ftrace_op(op, list) \ |
| 131 | op = rcu_dereference_raw(list); \ | 131 | op = rcu_dereference_raw_notrace(list); \ |
| 132 | do | 132 | do |
| 133 | 133 | ||
| 134 | /* | 134 | /* |
| 135 | * Optimized for just a single item in the list (as that is the normal case). | 135 | * Optimized for just a single item in the list (as that is the normal case). |
| 136 | */ | 136 | */ |
| 137 | #define while_for_each_ftrace_op(op) \ | 137 | #define while_for_each_ftrace_op(op) \ |
| 138 | while (likely(op = rcu_dereference_raw((op)->next)) && \ | 138 | while (likely(op = rcu_dereference_raw_notrace((op)->next)) && \ |
| 139 | unlikely((op) != &ftrace_list_end)) | 139 | unlikely((op) != &ftrace_list_end)) |
| 140 | 140 | ||
| 141 | static inline void ftrace_ops_init(struct ftrace_ops *ops) | 141 | static inline void ftrace_ops_init(struct ftrace_ops *ops) |
| @@ -779,7 +779,7 @@ ftrace_find_profiled_func(struct ftrace_profile_stat *stat, unsigned long ip) | |||
| 779 | if (hlist_empty(hhd)) | 779 | if (hlist_empty(hhd)) |
| 780 | return NULL; | 780 | return NULL; |
| 781 | 781 | ||
| 782 | hlist_for_each_entry_rcu(rec, hhd, node) { | 782 | hlist_for_each_entry_rcu_notrace(rec, hhd, node) { |
| 783 | if (rec->ip == ip) | 783 | if (rec->ip == ip) |
| 784 | return rec; | 784 | return rec; |
| 785 | } | 785 | } |
| @@ -1165,7 +1165,7 @@ ftrace_lookup_ip(struct ftrace_hash *hash, unsigned long ip) | |||
| 1165 | 1165 | ||
| 1166 | hhd = &hash->buckets[key]; | 1166 | hhd = &hash->buckets[key]; |
| 1167 | 1167 | ||
| 1168 | hlist_for_each_entry_rcu(entry, hhd, hlist) { | 1168 | hlist_for_each_entry_rcu_notrace(entry, hhd, hlist) { |
| 1169 | if (entry->ip == ip) | 1169 | if (entry->ip == ip) |
| 1170 | return entry; | 1170 | return entry; |
| 1171 | } | 1171 | } |
| @@ -1422,8 +1422,8 @@ ftrace_ops_test(struct ftrace_ops *ops, unsigned long ip) | |||
| 1422 | struct ftrace_hash *notrace_hash; | 1422 | struct ftrace_hash *notrace_hash; |
| 1423 | int ret; | 1423 | int ret; |
| 1424 | 1424 | ||
| 1425 | filter_hash = rcu_dereference_raw(ops->filter_hash); | 1425 | filter_hash = rcu_dereference_raw_notrace(ops->filter_hash); |
| 1426 | notrace_hash = rcu_dereference_raw(ops->notrace_hash); | 1426 | notrace_hash = rcu_dereference_raw_notrace(ops->notrace_hash); |
| 1427 | 1427 | ||
| 1428 | if ((ftrace_hash_empty(filter_hash) || | 1428 | if ((ftrace_hash_empty(filter_hash) || |
| 1429 | ftrace_lookup_ip(filter_hash, ip)) && | 1429 | ftrace_lookup_ip(filter_hash, ip)) && |
| @@ -2920,7 +2920,7 @@ static void function_trace_probe_call(unsigned long ip, unsigned long parent_ip, | |||
| 2920 | * on the hash. rcu_read_lock is too dangerous here. | 2920 | * on the hash. rcu_read_lock is too dangerous here. |
| 2921 | */ | 2921 | */ |
| 2922 | preempt_disable_notrace(); | 2922 | preempt_disable_notrace(); |
| 2923 | hlist_for_each_entry_rcu(entry, hhd, node) { | 2923 | hlist_for_each_entry_rcu_notrace(entry, hhd, node) { |
| 2924 | if (entry->ip == ip) | 2924 | if (entry->ip == ip) |
| 2925 | entry->ops->func(ip, parent_ip, &entry->data); | 2925 | entry->ops->func(ip, parent_ip, &entry->data); |
| 2926 | } | 2926 | } |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 4d79485b3237..1a41023a1f88 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -843,7 +843,15 @@ __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) | |||
| 843 | 843 | ||
| 844 | memcpy(max_data->comm, tsk->comm, TASK_COMM_LEN); | 844 | memcpy(max_data->comm, tsk->comm, TASK_COMM_LEN); |
| 845 | max_data->pid = tsk->pid; | 845 | max_data->pid = tsk->pid; |
| 846 | max_data->uid = task_uid(tsk); | 846 | /* |
| 847 | * If tsk == current, then use current_uid(), as that does not use | ||
| 848 | * RCU. The irq tracer can be called out of RCU scope. | ||
| 849 | */ | ||
| 850 | if (tsk == current) | ||
| 851 | max_data->uid = current_uid(); | ||
| 852 | else | ||
| 853 | max_data->uid = task_uid(tsk); | ||
| 854 | |||
| 847 | max_data->nice = tsk->static_prio - 20 - MAX_RT_PRIO; | 855 | max_data->nice = tsk->static_prio - 20 - MAX_RT_PRIO; |
| 848 | max_data->policy = tsk->policy; | 856 | max_data->policy = tsk->policy; |
| 849 | max_data->rt_priority = tsk->rt_priority; | 857 | max_data->rt_priority = tsk->rt_priority; |
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index 55e2cf66967b..2901e3b88590 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c | |||
| @@ -1159,7 +1159,7 @@ trace_selftest_startup_branch(struct tracer *trace, struct trace_array *tr) | |||
| 1159 | /* stop the tracing. */ | 1159 | /* stop the tracing. */ |
| 1160 | tracing_stop(); | 1160 | tracing_stop(); |
| 1161 | /* check the trace buffer */ | 1161 | /* check the trace buffer */ |
| 1162 | ret = trace_test_buffer(tr, &count); | 1162 | ret = trace_test_buffer(&tr->trace_buffer, &count); |
| 1163 | trace->reset(tr); | 1163 | trace->reset(tr); |
| 1164 | tracing_start(); | 1164 | tracing_start(); |
| 1165 | 1165 | ||
diff --git a/mm/memory.c b/mm/memory.c index 6dc1882fbd72..61a262b08e53 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
| @@ -220,7 +220,6 @@ void tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, bool fullmm) | |||
| 220 | tlb->start = -1UL; | 220 | tlb->start = -1UL; |
| 221 | tlb->end = 0; | 221 | tlb->end = 0; |
| 222 | tlb->need_flush = 0; | 222 | tlb->need_flush = 0; |
| 223 | tlb->fast_mode = (num_possible_cpus() == 1); | ||
| 224 | tlb->local.next = NULL; | 223 | tlb->local.next = NULL; |
| 225 | tlb->local.nr = 0; | 224 | tlb->local.nr = 0; |
| 226 | tlb->local.max = ARRAY_SIZE(tlb->__pages); | 225 | tlb->local.max = ARRAY_SIZE(tlb->__pages); |
| @@ -244,9 +243,6 @@ void tlb_flush_mmu(struct mmu_gather *tlb) | |||
| 244 | tlb_table_flush(tlb); | 243 | tlb_table_flush(tlb); |
| 245 | #endif | 244 | #endif |
| 246 | 245 | ||
| 247 | if (tlb_fast_mode(tlb)) | ||
| 248 | return; | ||
| 249 | |||
| 250 | for (batch = &tlb->local; batch; batch = batch->next) { | 246 | for (batch = &tlb->local; batch; batch = batch->next) { |
| 251 | free_pages_and_swap_cache(batch->pages, batch->nr); | 247 | free_pages_and_swap_cache(batch->pages, batch->nr); |
| 252 | batch->nr = 0; | 248 | batch->nr = 0; |
| @@ -288,11 +284,6 @@ int __tlb_remove_page(struct mmu_gather *tlb, struct page *page) | |||
| 288 | 284 | ||
| 289 | VM_BUG_ON(!tlb->need_flush); | 285 | VM_BUG_ON(!tlb->need_flush); |
| 290 | 286 | ||
| 291 | if (tlb_fast_mode(tlb)) { | ||
| 292 | free_page_and_swap_cache(page); | ||
| 293 | return 1; /* avoid calling tlb_flush_mmu() */ | ||
| 294 | } | ||
| 295 | |||
| 296 | batch = tlb->active; | 287 | batch = tlb->active; |
| 297 | batch->pages[batch->nr++] = page; | 288 | batch->pages[batch->nr++] = page; |
| 298 | if (batch->nr == batch->max) { | 289 | if (batch->nr == batch->max) { |
diff --git a/net/compat.c b/net/compat.c index 79ae88485001..f0a1ba6c8086 100644 --- a/net/compat.c +++ b/net/compat.c | |||
| @@ -734,19 +734,25 @@ static unsigned char nas[21] = { | |||
| 734 | 734 | ||
| 735 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags) | 735 | asmlinkage long compat_sys_sendmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags) |
| 736 | { | 736 | { |
| 737 | return sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | 737 | if (flags & MSG_CMSG_COMPAT) |
| 738 | return -EINVAL; | ||
| 739 | return __sys_sendmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | ||
| 738 | } | 740 | } |
| 739 | 741 | ||
| 740 | asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg, | 742 | asmlinkage long compat_sys_sendmmsg(int fd, struct compat_mmsghdr __user *mmsg, |
| 741 | unsigned int vlen, unsigned int flags) | 743 | unsigned int vlen, unsigned int flags) |
| 742 | { | 744 | { |
| 745 | if (flags & MSG_CMSG_COMPAT) | ||
| 746 | return -EINVAL; | ||
| 743 | return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, | 747 | return __sys_sendmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, |
| 744 | flags | MSG_CMSG_COMPAT); | 748 | flags | MSG_CMSG_COMPAT); |
| 745 | } | 749 | } |
| 746 | 750 | ||
| 747 | asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags) | 751 | asmlinkage long compat_sys_recvmsg(int fd, struct compat_msghdr __user *msg, unsigned int flags) |
| 748 | { | 752 | { |
| 749 | return sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | 753 | if (flags & MSG_CMSG_COMPAT) |
| 754 | return -EINVAL; | ||
| 755 | return __sys_recvmsg(fd, (struct msghdr __user *)msg, flags | MSG_CMSG_COMPAT); | ||
| 750 | } | 756 | } |
| 751 | 757 | ||
| 752 | asmlinkage long compat_sys_recv(int fd, void __user *buf, size_t len, unsigned int flags) | 758 | asmlinkage long compat_sys_recv(int fd, void __user *buf, size_t len, unsigned int flags) |
| @@ -768,6 +774,9 @@ asmlinkage long compat_sys_recvmmsg(int fd, struct compat_mmsghdr __user *mmsg, | |||
| 768 | int datagrams; | 774 | int datagrams; |
| 769 | struct timespec ktspec; | 775 | struct timespec ktspec; |
| 770 | 776 | ||
| 777 | if (flags & MSG_CMSG_COMPAT) | ||
| 778 | return -EINVAL; | ||
| 779 | |||
| 771 | if (COMPAT_USE_64BIT_TIME) | 780 | if (COMPAT_USE_64BIT_TIME) |
| 772 | return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, | 781 | return __sys_recvmmsg(fd, (struct mmsghdr __user *)mmsg, vlen, |
| 773 | flags | MSG_CMSG_COMPAT, | 782 | flags | MSG_CMSG_COMPAT, |
diff --git a/net/core/dev_addr_lists.c b/net/core/dev_addr_lists.c index c013f38482a1..6cda4e2c2132 100644 --- a/net/core/dev_addr_lists.c +++ b/net/core/dev_addr_lists.c | |||
| @@ -39,6 +39,7 @@ static int __hw_addr_create_ex(struct netdev_hw_addr_list *list, | |||
| 39 | ha->refcount = 1; | 39 | ha->refcount = 1; |
| 40 | ha->global_use = global; | 40 | ha->global_use = global; |
| 41 | ha->synced = sync; | 41 | ha->synced = sync; |
| 42 | ha->sync_cnt = 0; | ||
| 42 | list_add_tail_rcu(&ha->list, &list->list); | 43 | list_add_tail_rcu(&ha->list, &list->list); |
| 43 | list->count++; | 44 | list->count++; |
| 44 | 45 | ||
| @@ -66,7 +67,7 @@ static int __hw_addr_add_ex(struct netdev_hw_addr_list *list, | |||
| 66 | } | 67 | } |
| 67 | if (sync) { | 68 | if (sync) { |
| 68 | if (ha->synced) | 69 | if (ha->synced) |
| 69 | return 0; | 70 | return -EEXIST; |
| 70 | else | 71 | else |
| 71 | ha->synced = true; | 72 | ha->synced = true; |
| 72 | } | 73 | } |
| @@ -139,10 +140,13 @@ static int __hw_addr_sync_one(struct netdev_hw_addr_list *to_list, | |||
| 139 | 140 | ||
| 140 | err = __hw_addr_add_ex(to_list, ha->addr, addr_len, ha->type, | 141 | err = __hw_addr_add_ex(to_list, ha->addr, addr_len, ha->type, |
| 141 | false, true); | 142 | false, true); |
| 142 | if (err) | 143 | if (err && err != -EEXIST) |
| 143 | return err; | 144 | return err; |
| 144 | ha->sync_cnt++; | 145 | |
| 145 | ha->refcount++; | 146 | if (!err) { |
| 147 | ha->sync_cnt++; | ||
| 148 | ha->refcount++; | ||
| 149 | } | ||
| 146 | 150 | ||
| 147 | return 0; | 151 | return 0; |
| 148 | } | 152 | } |
| @@ -159,7 +163,8 @@ static void __hw_addr_unsync_one(struct netdev_hw_addr_list *to_list, | |||
| 159 | if (err) | 163 | if (err) |
| 160 | return; | 164 | return; |
| 161 | ha->sync_cnt--; | 165 | ha->sync_cnt--; |
| 162 | __hw_addr_del_entry(from_list, ha, false, true); | 166 | /* address on from list is not marked synced */ |
| 167 | __hw_addr_del_entry(from_list, ha, false, false); | ||
| 163 | } | 168 | } |
| 164 | 169 | ||
| 165 | static int __hw_addr_sync_multiple(struct netdev_hw_addr_list *to_list, | 170 | static int __hw_addr_sync_multiple(struct netdev_hw_addr_list *to_list, |
| @@ -796,7 +801,7 @@ int dev_mc_sync_multiple(struct net_device *to, struct net_device *from) | |||
| 796 | return -EINVAL; | 801 | return -EINVAL; |
| 797 | 802 | ||
| 798 | netif_addr_lock_nested(to); | 803 | netif_addr_lock_nested(to); |
| 799 | err = __hw_addr_sync(&to->mc, &from->mc, to->addr_len); | 804 | err = __hw_addr_sync_multiple(&to->mc, &from->mc, to->addr_len); |
| 800 | if (!err) | 805 | if (!err) |
| 801 | __dev_set_rx_mode(to); | 806 | __dev_set_rx_mode(to); |
| 802 | netif_addr_unlock(to); | 807 | netif_addr_unlock(to); |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index af9185d0be6a..cfd777bd6bd0 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -195,7 +195,7 @@ struct sk_buff *__alloc_skb_head(gfp_t gfp_mask, int node) | |||
| 195 | * the tail pointer in struct sk_buff! | 195 | * the tail pointer in struct sk_buff! |
| 196 | */ | 196 | */ |
| 197 | memset(skb, 0, offsetof(struct sk_buff, tail)); | 197 | memset(skb, 0, offsetof(struct sk_buff, tail)); |
| 198 | skb->data = NULL; | 198 | skb->head = NULL; |
| 199 | skb->truesize = sizeof(struct sk_buff); | 199 | skb->truesize = sizeof(struct sk_buff); |
| 200 | atomic_set(&skb->users, 1); | 200 | atomic_set(&skb->users, 1); |
| 201 | 201 | ||
| @@ -611,7 +611,7 @@ static void skb_release_head_state(struct sk_buff *skb) | |||
| 611 | static void skb_release_all(struct sk_buff *skb) | 611 | static void skb_release_all(struct sk_buff *skb) |
| 612 | { | 612 | { |
| 613 | skb_release_head_state(skb); | 613 | skb_release_head_state(skb); |
| 614 | if (likely(skb->data)) | 614 | if (likely(skb->head)) |
| 615 | skb_release_data(skb); | 615 | skb_release_data(skb); |
| 616 | } | 616 | } |
| 617 | 617 | ||
diff --git a/net/core/sock.c b/net/core/sock.c index 6ba327da79e1..88868a9d21da 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -210,7 +210,7 @@ static const char *const af_family_key_strings[AF_MAX+1] = { | |||
| 210 | "sk_lock-AF_TIPC" , "sk_lock-AF_BLUETOOTH", "sk_lock-IUCV" , | 210 | "sk_lock-AF_TIPC" , "sk_lock-AF_BLUETOOTH", "sk_lock-IUCV" , |
| 211 | "sk_lock-AF_RXRPC" , "sk_lock-AF_ISDN" , "sk_lock-AF_PHONET" , | 211 | "sk_lock-AF_RXRPC" , "sk_lock-AF_ISDN" , "sk_lock-AF_PHONET" , |
| 212 | "sk_lock-AF_IEEE802154", "sk_lock-AF_CAIF" , "sk_lock-AF_ALG" , | 212 | "sk_lock-AF_IEEE802154", "sk_lock-AF_CAIF" , "sk_lock-AF_ALG" , |
| 213 | "sk_lock-AF_NFC" , "sk_lock-AF_MAX" | 213 | "sk_lock-AF_NFC" , "sk_lock-AF_VSOCK" , "sk_lock-AF_MAX" |
| 214 | }; | 214 | }; |
| 215 | static const char *const af_family_slock_key_strings[AF_MAX+1] = { | 215 | static const char *const af_family_slock_key_strings[AF_MAX+1] = { |
| 216 | "slock-AF_UNSPEC", "slock-AF_UNIX" , "slock-AF_INET" , | 216 | "slock-AF_UNSPEC", "slock-AF_UNIX" , "slock-AF_INET" , |
| @@ -226,7 +226,7 @@ static const char *const af_family_slock_key_strings[AF_MAX+1] = { | |||
| 226 | "slock-AF_TIPC" , "slock-AF_BLUETOOTH", "slock-AF_IUCV" , | 226 | "slock-AF_TIPC" , "slock-AF_BLUETOOTH", "slock-AF_IUCV" , |
| 227 | "slock-AF_RXRPC" , "slock-AF_ISDN" , "slock-AF_PHONET" , | 227 | "slock-AF_RXRPC" , "slock-AF_ISDN" , "slock-AF_PHONET" , |
| 228 | "slock-AF_IEEE802154", "slock-AF_CAIF" , "slock-AF_ALG" , | 228 | "slock-AF_IEEE802154", "slock-AF_CAIF" , "slock-AF_ALG" , |
| 229 | "slock-AF_NFC" , "slock-AF_MAX" | 229 | "slock-AF_NFC" , "slock-AF_VSOCK" ,"slock-AF_MAX" |
| 230 | }; | 230 | }; |
| 231 | static const char *const af_family_clock_key_strings[AF_MAX+1] = { | 231 | static const char *const af_family_clock_key_strings[AF_MAX+1] = { |
| 232 | "clock-AF_UNSPEC", "clock-AF_UNIX" , "clock-AF_INET" , | 232 | "clock-AF_UNSPEC", "clock-AF_UNIX" , "clock-AF_INET" , |
| @@ -242,7 +242,7 @@ static const char *const af_family_clock_key_strings[AF_MAX+1] = { | |||
| 242 | "clock-AF_TIPC" , "clock-AF_BLUETOOTH", "clock-AF_IUCV" , | 242 | "clock-AF_TIPC" , "clock-AF_BLUETOOTH", "clock-AF_IUCV" , |
| 243 | "clock-AF_RXRPC" , "clock-AF_ISDN" , "clock-AF_PHONET" , | 243 | "clock-AF_RXRPC" , "clock-AF_ISDN" , "clock-AF_PHONET" , |
| 244 | "clock-AF_IEEE802154", "clock-AF_CAIF" , "clock-AF_ALG" , | 244 | "clock-AF_IEEE802154", "clock-AF_CAIF" , "clock-AF_ALG" , |
| 245 | "clock-AF_NFC" , "clock-AF_MAX" | 245 | "clock-AF_NFC" , "clock-AF_VSOCK" , "clock-AF_MAX" |
| 246 | }; | 246 | }; |
| 247 | 247 | ||
| 248 | /* | 248 | /* |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index e4147ec1665a..be2f8da0ae8e 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
| @@ -503,6 +503,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | |||
| 503 | 503 | ||
| 504 | inner_iph = (const struct iphdr *)skb_inner_network_header(skb); | 504 | inner_iph = (const struct iphdr *)skb_inner_network_header(skb); |
| 505 | 505 | ||
| 506 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); | ||
| 506 | dst = tnl_params->daddr; | 507 | dst = tnl_params->daddr; |
| 507 | if (dst == 0) { | 508 | if (dst == 0) { |
| 508 | /* NBMA tunnel */ | 509 | /* NBMA tunnel */ |
| @@ -658,7 +659,6 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | |||
| 658 | 659 | ||
| 659 | skb_dst_drop(skb); | 660 | skb_dst_drop(skb); |
| 660 | skb_dst_set(skb, &rt->dst); | 661 | skb_dst_set(skb, &rt->dst); |
| 661 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); | ||
| 662 | 662 | ||
| 663 | /* Push down and install the IP header. */ | 663 | /* Push down and install the IP header. */ |
| 664 | skb_push(skb, sizeof(struct iphdr)); | 664 | skb_push(skb, sizeof(struct iphdr)); |
diff --git a/net/ipv4/netfilter/ipt_ULOG.c b/net/ipv4/netfilter/ipt_ULOG.c index cf08218ddbcf..ff4b781b1056 100644 --- a/net/ipv4/netfilter/ipt_ULOG.c +++ b/net/ipv4/netfilter/ipt_ULOG.c | |||
| @@ -231,8 +231,10 @@ static void ipt_ulog_packet(struct net *net, | |||
| 231 | put_unaligned(tv.tv_usec, &pm->timestamp_usec); | 231 | put_unaligned(tv.tv_usec, &pm->timestamp_usec); |
| 232 | put_unaligned(skb->mark, &pm->mark); | 232 | put_unaligned(skb->mark, &pm->mark); |
| 233 | pm->hook = hooknum; | 233 | pm->hook = hooknum; |
| 234 | if (prefix != NULL) | 234 | if (prefix != NULL) { |
| 235 | strncpy(pm->prefix, prefix, sizeof(pm->prefix)); | 235 | strncpy(pm->prefix, prefix, sizeof(pm->prefix) - 1); |
| 236 | pm->prefix[sizeof(pm->prefix) - 1] = '\0'; | ||
| 237 | } | ||
| 236 | else if (loginfo->prefix[0] != '\0') | 238 | else if (loginfo->prefix[0] != '\0') |
| 237 | strncpy(pm->prefix, loginfo->prefix, sizeof(pm->prefix)); | 239 | strncpy(pm->prefix, loginfo->prefix, sizeof(pm->prefix)); |
| 238 | else | 240 | else |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 550781a17b34..d35bbf0cf404 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -737,10 +737,15 @@ static void ip_do_redirect(struct dst_entry *dst, struct sock *sk, struct sk_buf | |||
| 737 | { | 737 | { |
| 738 | struct rtable *rt; | 738 | struct rtable *rt; |
| 739 | struct flowi4 fl4; | 739 | struct flowi4 fl4; |
| 740 | const struct iphdr *iph = (const struct iphdr *) skb->data; | ||
| 741 | int oif = skb->dev->ifindex; | ||
| 742 | u8 tos = RT_TOS(iph->tos); | ||
| 743 | u8 prot = iph->protocol; | ||
| 744 | u32 mark = skb->mark; | ||
| 740 | 745 | ||
| 741 | rt = (struct rtable *) dst; | 746 | rt = (struct rtable *) dst; |
| 742 | 747 | ||
| 743 | ip_rt_build_flow_key(&fl4, sk, skb); | 748 | __build_flow_key(&fl4, sk, iph, oif, tos, prot, mark, 0); |
| 744 | __ip_do_redirect(rt, skb, &fl4, true); | 749 | __ip_do_redirect(rt, skb, &fl4, true); |
| 745 | } | 750 | } |
| 746 | 751 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index d1ab6ab29a55..1bbf744c2cc3 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -1487,7 +1487,7 @@ static int ipv6_count_addresses(struct inet6_dev *idev) | |||
| 1487 | } | 1487 | } |
| 1488 | 1488 | ||
| 1489 | int ipv6_chk_addr(struct net *net, const struct in6_addr *addr, | 1489 | int ipv6_chk_addr(struct net *net, const struct in6_addr *addr, |
| 1490 | struct net_device *dev, int strict) | 1490 | const struct net_device *dev, int strict) |
| 1491 | { | 1491 | { |
| 1492 | struct inet6_ifaddr *ifp; | 1492 | struct inet6_ifaddr *ifp; |
| 1493 | unsigned int hash = inet6_addr_hash(addr); | 1493 | unsigned int hash = inet6_addr_hash(addr); |
| @@ -2658,8 +2658,10 @@ static void init_loopback(struct net_device *dev) | |||
| 2658 | sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, 0); | 2658 | sp_rt = addrconf_dst_alloc(idev, &sp_ifa->addr, 0); |
| 2659 | 2659 | ||
| 2660 | /* Failure cases are ignored */ | 2660 | /* Failure cases are ignored */ |
| 2661 | if (!IS_ERR(sp_rt)) | 2661 | if (!IS_ERR(sp_rt)) { |
| 2662 | sp_ifa->rt = sp_rt; | ||
| 2662 | ip6_ins_rt(sp_rt); | 2663 | ip6_ins_rt(sp_rt); |
| 2664 | } | ||
| 2663 | } | 2665 | } |
| 2664 | read_unlock_bh(&idev->lock); | 2666 | read_unlock_bh(&idev->lock); |
| 2665 | } | 2667 | } |
diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 72836f40b730..95f3f1da0d7f 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/netfilter.h> | 10 | #include <linux/netfilter.h> |
| 11 | #include <linux/netfilter_ipv6.h> | 11 | #include <linux/netfilter_ipv6.h> |
| 12 | #include <linux/export.h> | 12 | #include <linux/export.h> |
| 13 | #include <net/addrconf.h> | ||
| 13 | #include <net/dst.h> | 14 | #include <net/dst.h> |
| 14 | #include <net/ipv6.h> | 15 | #include <net/ipv6.h> |
| 15 | #include <net/ip6_route.h> | 16 | #include <net/ip6_route.h> |
| @@ -186,6 +187,10 @@ static __sum16 nf_ip6_checksum_partial(struct sk_buff *skb, unsigned int hook, | |||
| 186 | return csum; | 187 | return csum; |
| 187 | }; | 188 | }; |
| 188 | 189 | ||
| 190 | static const struct nf_ipv6_ops ipv6ops = { | ||
| 191 | .chk_addr = ipv6_chk_addr, | ||
| 192 | }; | ||
| 193 | |||
| 189 | static const struct nf_afinfo nf_ip6_afinfo = { | 194 | static const struct nf_afinfo nf_ip6_afinfo = { |
| 190 | .family = AF_INET6, | 195 | .family = AF_INET6, |
| 191 | .checksum = nf_ip6_checksum, | 196 | .checksum = nf_ip6_checksum, |
| @@ -198,6 +203,7 @@ static const struct nf_afinfo nf_ip6_afinfo = { | |||
| 198 | 203 | ||
| 199 | int __init ipv6_netfilter_init(void) | 204 | int __init ipv6_netfilter_init(void) |
| 200 | { | 205 | { |
| 206 | RCU_INIT_POINTER(nf_ipv6_ops, &ipv6ops); | ||
| 201 | return nf_register_afinfo(&nf_ip6_afinfo); | 207 | return nf_register_afinfo(&nf_ip6_afinfo); |
| 202 | } | 208 | } |
| 203 | 209 | ||
| @@ -206,5 +212,6 @@ int __init ipv6_netfilter_init(void) | |||
| 206 | */ | 212 | */ |
| 207 | void ipv6_netfilter_fini(void) | 213 | void ipv6_netfilter_fini(void) |
| 208 | { | 214 | { |
| 215 | RCU_INIT_POINTER(nf_ipv6_ops, NULL); | ||
| 209 | nf_unregister_afinfo(&nf_ip6_afinfo); | 216 | nf_unregister_afinfo(&nf_ip6_afinfo); |
| 210 | } | 217 | } |
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index f3c1ff4357ff..51c3285b5d9b 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c | |||
| @@ -90,7 +90,7 @@ static const struct snmp_mib snmp6_ipstats_list[] = { | |||
| 90 | SNMP_MIB_ITEM("Ip6OutMcastOctets", IPSTATS_MIB_OUTMCASTOCTETS), | 90 | SNMP_MIB_ITEM("Ip6OutMcastOctets", IPSTATS_MIB_OUTMCASTOCTETS), |
| 91 | SNMP_MIB_ITEM("Ip6InBcastOctets", IPSTATS_MIB_INBCASTOCTETS), | 91 | SNMP_MIB_ITEM("Ip6InBcastOctets", IPSTATS_MIB_INBCASTOCTETS), |
| 92 | SNMP_MIB_ITEM("Ip6OutBcastOctets", IPSTATS_MIB_OUTBCASTOCTETS), | 92 | SNMP_MIB_ITEM("Ip6OutBcastOctets", IPSTATS_MIB_OUTBCASTOCTETS), |
| 93 | SNMP_MIB_ITEM("InCsumErrors", IPSTATS_MIB_CSUMERRORS), | 93 | /* IPSTATS_MIB_CSUMERRORS is not relevant in IPv6 (no checksum) */ |
| 94 | SNMP_MIB_SENTINEL | 94 | SNMP_MIB_SENTINEL |
| 95 | }; | 95 | }; |
| 96 | 96 | ||
diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c index 3bb3a891a424..d3cfaf9c7a08 100644 --- a/net/ipv6/udp_offload.c +++ b/net/ipv6/udp_offload.c | |||
| @@ -46,11 +46,12 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
| 46 | unsigned int mss; | 46 | unsigned int mss; |
| 47 | unsigned int unfrag_ip6hlen, unfrag_len; | 47 | unsigned int unfrag_ip6hlen, unfrag_len; |
| 48 | struct frag_hdr *fptr; | 48 | struct frag_hdr *fptr; |
| 49 | u8 *mac_start, *prevhdr; | 49 | u8 *packet_start, *prevhdr; |
| 50 | u8 nexthdr; | 50 | u8 nexthdr; |
| 51 | u8 frag_hdr_sz = sizeof(struct frag_hdr); | 51 | u8 frag_hdr_sz = sizeof(struct frag_hdr); |
| 52 | int offset; | 52 | int offset; |
| 53 | __wsum csum; | 53 | __wsum csum; |
| 54 | int tnl_hlen; | ||
| 54 | 55 | ||
| 55 | mss = skb_shinfo(skb)->gso_size; | 56 | mss = skb_shinfo(skb)->gso_size; |
| 56 | if (unlikely(skb->len <= mss)) | 57 | if (unlikely(skb->len <= mss)) |
| @@ -83,9 +84,11 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
| 83 | skb->ip_summed = CHECKSUM_NONE; | 84 | skb->ip_summed = CHECKSUM_NONE; |
| 84 | 85 | ||
| 85 | /* Check if there is enough headroom to insert fragment header. */ | 86 | /* Check if there is enough headroom to insert fragment header. */ |
| 86 | if ((skb_mac_header(skb) < skb->head + frag_hdr_sz) && | 87 | tnl_hlen = skb_tnl_header_len(skb); |
| 87 | pskb_expand_head(skb, frag_hdr_sz, 0, GFP_ATOMIC)) | 88 | if (skb_headroom(skb) < (tnl_hlen + frag_hdr_sz)) { |
| 88 | goto out; | 89 | if (gso_pskb_expand_head(skb, tnl_hlen + frag_hdr_sz)) |
| 90 | goto out; | ||
| 91 | } | ||
| 89 | 92 | ||
| 90 | /* Find the unfragmentable header and shift it left by frag_hdr_sz | 93 | /* Find the unfragmentable header and shift it left by frag_hdr_sz |
| 91 | * bytes to insert fragment header. | 94 | * bytes to insert fragment header. |
| @@ -93,11 +96,12 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, | |||
| 93 | unfrag_ip6hlen = ip6_find_1stfragopt(skb, &prevhdr); | 96 | unfrag_ip6hlen = ip6_find_1stfragopt(skb, &prevhdr); |
| 94 | nexthdr = *prevhdr; | 97 | nexthdr = *prevhdr; |
| 95 | *prevhdr = NEXTHDR_FRAGMENT; | 98 | *prevhdr = NEXTHDR_FRAGMENT; |
| 96 | unfrag_len = skb_network_header(skb) - skb_mac_header(skb) + | 99 | unfrag_len = (skb_network_header(skb) - skb_mac_header(skb)) + |
| 97 | unfrag_ip6hlen; | 100 | unfrag_ip6hlen + tnl_hlen; |
| 98 | mac_start = skb_mac_header(skb); | 101 | packet_start = (u8 *) skb->head + SKB_GSO_CB(skb)->mac_offset; |
| 99 | memmove(mac_start-frag_hdr_sz, mac_start, unfrag_len); | 102 | memmove(packet_start-frag_hdr_sz, packet_start, unfrag_len); |
| 100 | 103 | ||
| 104 | SKB_GSO_CB(skb)->mac_offset -= frag_hdr_sz; | ||
| 101 | skb->mac_header -= frag_hdr_sz; | 105 | skb->mac_header -= frag_hdr_sz; |
| 102 | skb->network_header -= frag_hdr_sz; | 106 | skb->network_header -= frag_hdr_sz; |
| 103 | 107 | ||
diff --git a/net/key/af_key.c b/net/key/af_key.c index 5b1e5af25713..c5fbd7589681 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
| @@ -2366,6 +2366,8 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, const struct sa | |||
| 2366 | 2366 | ||
| 2367 | out: | 2367 | out: |
| 2368 | xfrm_pol_put(xp); | 2368 | xfrm_pol_put(xp); |
| 2369 | if (err == 0) | ||
| 2370 | xfrm_garbage_collect(net); | ||
| 2369 | return err; | 2371 | return err; |
| 2370 | } | 2372 | } |
| 2371 | 2373 | ||
| @@ -2615,6 +2617,8 @@ static int pfkey_spdget(struct sock *sk, struct sk_buff *skb, const struct sadb_ | |||
| 2615 | 2617 | ||
| 2616 | out: | 2618 | out: |
| 2617 | xfrm_pol_put(xp); | 2619 | xfrm_pol_put(xp); |
| 2620 | if (delete && err == 0) | ||
| 2621 | xfrm_garbage_collect(net); | ||
| 2618 | return err; | 2622 | return err; |
| 2619 | } | 2623 | } |
| 2620 | 2624 | ||
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 60f1ce5e5e52..98d20c0f6fed 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
| @@ -159,9 +159,10 @@ static int ieee80211_change_mtu(struct net_device *dev, int new_mtu) | |||
| 159 | return 0; | 159 | return 0; |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | static int ieee80211_verify_mac(struct ieee80211_local *local, u8 *addr) | 162 | static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr) |
| 163 | { | 163 | { |
| 164 | struct ieee80211_sub_if_data *sdata; | 164 | struct ieee80211_local *local = sdata->local; |
| 165 | struct ieee80211_sub_if_data *iter; | ||
| 165 | u64 new, mask, tmp; | 166 | u64 new, mask, tmp; |
| 166 | u8 *m; | 167 | u8 *m; |
| 167 | int ret = 0; | 168 | int ret = 0; |
| @@ -181,11 +182,14 @@ static int ieee80211_verify_mac(struct ieee80211_local *local, u8 *addr) | |||
| 181 | 182 | ||
| 182 | 183 | ||
| 183 | mutex_lock(&local->iflist_mtx); | 184 | mutex_lock(&local->iflist_mtx); |
| 184 | list_for_each_entry(sdata, &local->interfaces, list) { | 185 | list_for_each_entry(iter, &local->interfaces, list) { |
| 185 | if (sdata->vif.type == NL80211_IFTYPE_MONITOR) | 186 | if (iter == sdata) |
| 187 | continue; | ||
| 188 | |||
| 189 | if (iter->vif.type == NL80211_IFTYPE_MONITOR) | ||
| 186 | continue; | 190 | continue; |
| 187 | 191 | ||
| 188 | m = sdata->vif.addr; | 192 | m = iter->vif.addr; |
| 189 | tmp = ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) | | 193 | tmp = ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) | |
| 190 | ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) | | 194 | ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) | |
| 191 | ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8); | 195 | ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8); |
| @@ -209,7 +213,7 @@ static int ieee80211_change_mac(struct net_device *dev, void *addr) | |||
| 209 | if (ieee80211_sdata_running(sdata)) | 213 | if (ieee80211_sdata_running(sdata)) |
| 210 | return -EBUSY; | 214 | return -EBUSY; |
| 211 | 215 | ||
| 212 | ret = ieee80211_verify_mac(sdata->local, sa->sa_data); | 216 | ret = ieee80211_verify_mac(sdata, sa->sa_data); |
| 213 | if (ret) | 217 | if (ret) |
| 214 | return ret; | 218 | return ret; |
| 215 | 219 | ||
| @@ -474,6 +478,9 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up) | |||
| 474 | master->control_port_protocol; | 478 | master->control_port_protocol; |
| 475 | sdata->control_port_no_encrypt = | 479 | sdata->control_port_no_encrypt = |
| 476 | master->control_port_no_encrypt; | 480 | master->control_port_no_encrypt; |
| 481 | sdata->vif.cab_queue = master->vif.cab_queue; | ||
| 482 | memcpy(sdata->vif.hw_queue, master->vif.hw_queue, | ||
| 483 | sizeof(sdata->vif.hw_queue)); | ||
| 477 | break; | 484 | break; |
| 478 | } | 485 | } |
| 479 | case NL80211_IFTYPE_AP: | 486 | case NL80211_IFTYPE_AP: |
| @@ -653,7 +660,11 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up) | |||
| 653 | 660 | ||
| 654 | ieee80211_recalc_ps(local, -1); | 661 | ieee80211_recalc_ps(local, -1); |
| 655 | 662 | ||
| 656 | if (dev) { | 663 | if (sdata->vif.type == NL80211_IFTYPE_MONITOR || |
| 664 | sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { | ||
| 665 | /* XXX: for AP_VLAN, actually track AP queues */ | ||
| 666 | netif_tx_start_all_queues(dev); | ||
| 667 | } else if (dev) { | ||
| 657 | unsigned long flags; | 668 | unsigned long flags; |
| 658 | int n_acs = IEEE80211_NUM_ACS; | 669 | int n_acs = IEEE80211_NUM_ACS; |
| 659 | int ac; | 670 | int ac; |
| @@ -1479,7 +1490,17 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local, | |||
| 1479 | break; | 1490 | break; |
| 1480 | } | 1491 | } |
| 1481 | 1492 | ||
| 1493 | /* | ||
| 1494 | * Pick address of existing interface in case user changed | ||
| 1495 | * MAC address manually, default to perm_addr. | ||
| 1496 | */ | ||
| 1482 | m = local->hw.wiphy->perm_addr; | 1497 | m = local->hw.wiphy->perm_addr; |
| 1498 | list_for_each_entry(sdata, &local->interfaces, list) { | ||
| 1499 | if (sdata->vif.type == NL80211_IFTYPE_MONITOR) | ||
| 1500 | continue; | ||
| 1501 | m = sdata->vif.addr; | ||
| 1502 | break; | ||
| 1503 | } | ||
| 1483 | start = ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) | | 1504 | start = ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) | |
| 1484 | ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) | | 1505 | ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) | |
| 1485 | ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8); | 1506 | ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8); |
| @@ -1696,6 +1717,15 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local) | |||
| 1696 | 1717 | ||
| 1697 | ASSERT_RTNL(); | 1718 | ASSERT_RTNL(); |
| 1698 | 1719 | ||
| 1720 | /* | ||
| 1721 | * Close all AP_VLAN interfaces first, as otherwise they | ||
| 1722 | * might be closed while the AP interface they belong to | ||
| 1723 | * is closed, causing unregister_netdevice_many() to crash. | ||
| 1724 | */ | ||
| 1725 | list_for_each_entry(sdata, &local->interfaces, list) | ||
| 1726 | if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | ||
| 1727 | dev_close(sdata->dev); | ||
| 1728 | |||
| 1699 | mutex_lock(&local->iflist_mtx); | 1729 | mutex_lock(&local->iflist_mtx); |
| 1700 | list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { | 1730 | list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { |
| 1701 | list_del(&sdata->list); | 1731 | list_del(&sdata->list); |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index a46e490f20dd..a8c2130c8ba4 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -3321,10 +3321,6 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata) | |||
| 3321 | if (WARN_ON_ONCE(!auth_data)) | 3321 | if (WARN_ON_ONCE(!auth_data)) |
| 3322 | return -EINVAL; | 3322 | return -EINVAL; |
| 3323 | 3323 | ||
| 3324 | if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) | ||
| 3325 | tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | | ||
| 3326 | IEEE80211_TX_INTFL_MLME_CONN_TX; | ||
| 3327 | |||
| 3328 | auth_data->tries++; | 3324 | auth_data->tries++; |
| 3329 | 3325 | ||
| 3330 | if (auth_data->tries > IEEE80211_AUTH_MAX_TRIES) { | 3326 | if (auth_data->tries > IEEE80211_AUTH_MAX_TRIES) { |
| @@ -3358,6 +3354,10 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata) | |||
| 3358 | auth_data->expected_transaction = trans; | 3354 | auth_data->expected_transaction = trans; |
| 3359 | } | 3355 | } |
| 3360 | 3356 | ||
| 3357 | if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) | ||
| 3358 | tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS | | ||
| 3359 | IEEE80211_TX_INTFL_MLME_CONN_TX; | ||
| 3360 | |||
| 3361 | ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, | 3361 | ieee80211_send_auth(sdata, trans, auth_data->algorithm, status, |
| 3362 | auth_data->data, auth_data->data_len, | 3362 | auth_data->data, auth_data->data_len, |
| 3363 | auth_data->bss->bssid, | 3363 | auth_data->bss->bssid, |
| @@ -3381,12 +3381,12 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata) | |||
| 3381 | * will not answer to direct packet in unassociated state. | 3381 | * will not answer to direct packet in unassociated state. |
| 3382 | */ | 3382 | */ |
| 3383 | ieee80211_send_probe_req(sdata, NULL, ssidie + 2, ssidie[1], | 3383 | ieee80211_send_probe_req(sdata, NULL, ssidie + 2, ssidie[1], |
| 3384 | NULL, 0, (u32) -1, true, tx_flags, | 3384 | NULL, 0, (u32) -1, true, 0, |
| 3385 | auth_data->bss->channel, false); | 3385 | auth_data->bss->channel, false); |
| 3386 | rcu_read_unlock(); | 3386 | rcu_read_unlock(); |
| 3387 | } | 3387 | } |
| 3388 | 3388 | ||
| 3389 | if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) { | 3389 | if (tx_flags == 0) { |
| 3390 | auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT; | 3390 | auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT; |
| 3391 | ifmgd->auth_data->timeout_started = true; | 3391 | ifmgd->auth_data->timeout_started = true; |
| 3392 | run_again(ifmgd, auth_data->timeout); | 3392 | run_again(ifmgd, auth_data->timeout); |
diff --git a/net/netfilter/core.c b/net/netfilter/core.c index 07c865a31a3d..857ca9f35177 100644 --- a/net/netfilter/core.c +++ b/net/netfilter/core.c | |||
| @@ -30,6 +30,8 @@ static DEFINE_MUTEX(afinfo_mutex); | |||
| 30 | 30 | ||
| 31 | const struct nf_afinfo __rcu *nf_afinfo[NFPROTO_NUMPROTO] __read_mostly; | 31 | const struct nf_afinfo __rcu *nf_afinfo[NFPROTO_NUMPROTO] __read_mostly; |
| 32 | EXPORT_SYMBOL(nf_afinfo); | 32 | EXPORT_SYMBOL(nf_afinfo); |
| 33 | const struct nf_ipv6_ops __rcu *nf_ipv6_ops __read_mostly; | ||
| 34 | EXPORT_SYMBOL_GPL(nf_ipv6_ops); | ||
| 33 | 35 | ||
| 34 | int nf_register_afinfo(const struct nf_afinfo *afinfo) | 36 | int nf_register_afinfo(const struct nf_afinfo *afinfo) |
| 35 | { | 37 | { |
diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c index 085b5880ab0d..05565d2b3a61 100644 --- a/net/netfilter/ipvs/ip_vs_core.c +++ b/net/netfilter/ipvs/ip_vs_core.c | |||
| @@ -1001,6 +1001,32 @@ static inline int is_tcp_reset(const struct sk_buff *skb, int nh_len) | |||
| 1001 | return th->rst; | 1001 | return th->rst; |
| 1002 | } | 1002 | } |
| 1003 | 1003 | ||
| 1004 | static inline bool is_new_conn(const struct sk_buff *skb, | ||
| 1005 | struct ip_vs_iphdr *iph) | ||
| 1006 | { | ||
| 1007 | switch (iph->protocol) { | ||
| 1008 | case IPPROTO_TCP: { | ||
| 1009 | struct tcphdr _tcph, *th; | ||
| 1010 | |||
| 1011 | th = skb_header_pointer(skb, iph->len, sizeof(_tcph), &_tcph); | ||
| 1012 | if (th == NULL) | ||
| 1013 | return false; | ||
| 1014 | return th->syn; | ||
| 1015 | } | ||
| 1016 | case IPPROTO_SCTP: { | ||
| 1017 | sctp_chunkhdr_t *sch, schunk; | ||
| 1018 | |||
| 1019 | sch = skb_header_pointer(skb, iph->len + sizeof(sctp_sctphdr_t), | ||
| 1020 | sizeof(schunk), &schunk); | ||
| 1021 | if (sch == NULL) | ||
| 1022 | return false; | ||
| 1023 | return sch->type == SCTP_CID_INIT; | ||
| 1024 | } | ||
| 1025 | default: | ||
| 1026 | return false; | ||
| 1027 | } | ||
| 1028 | } | ||
| 1029 | |||
| 1004 | /* Handle response packets: rewrite addresses and send away... | 1030 | /* Handle response packets: rewrite addresses and send away... |
| 1005 | */ | 1031 | */ |
| 1006 | static unsigned int | 1032 | static unsigned int |
| @@ -1612,6 +1638,15 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb, int af) | |||
| 1612 | * Check if the packet belongs to an existing connection entry | 1638 | * Check if the packet belongs to an existing connection entry |
| 1613 | */ | 1639 | */ |
| 1614 | cp = pp->conn_in_get(af, skb, &iph, 0); | 1640 | cp = pp->conn_in_get(af, skb, &iph, 0); |
| 1641 | |||
| 1642 | if (unlikely(sysctl_expire_nodest_conn(ipvs)) && cp && cp->dest && | ||
| 1643 | unlikely(!atomic_read(&cp->dest->weight)) && !iph.fragoffs && | ||
| 1644 | is_new_conn(skb, &iph)) { | ||
| 1645 | ip_vs_conn_expire_now(cp); | ||
| 1646 | __ip_vs_conn_put(cp); | ||
| 1647 | cp = NULL; | ||
| 1648 | } | ||
| 1649 | |||
| 1615 | if (unlikely(!cp) && !iph.fragoffs) { | 1650 | if (unlikely(!cp) && !iph.fragoffs) { |
| 1616 | /* No (second) fragments need to enter here, as nf_defrag_ipv6 | 1651 | /* No (second) fragments need to enter here, as nf_defrag_ipv6 |
| 1617 | * replayed fragment zero will already have created the cp | 1652 | * replayed fragment zero will already have created the cp |
diff --git a/net/netfilter/ipvs/ip_vs_sh.c b/net/netfilter/ipvs/ip_vs_sh.c index 0df269d7c99f..a65edfe4b16c 100644 --- a/net/netfilter/ipvs/ip_vs_sh.c +++ b/net/netfilter/ipvs/ip_vs_sh.c | |||
| @@ -67,8 +67,8 @@ struct ip_vs_sh_bucket { | |||
| 67 | #define IP_VS_SH_TAB_MASK (IP_VS_SH_TAB_SIZE - 1) | 67 | #define IP_VS_SH_TAB_MASK (IP_VS_SH_TAB_SIZE - 1) |
| 68 | 68 | ||
| 69 | struct ip_vs_sh_state { | 69 | struct ip_vs_sh_state { |
| 70 | struct ip_vs_sh_bucket buckets[IP_VS_SH_TAB_SIZE]; | ||
| 71 | struct rcu_head rcu_head; | 70 | struct rcu_head rcu_head; |
| 71 | struct ip_vs_sh_bucket buckets[IP_VS_SH_TAB_SIZE]; | ||
| 72 | }; | 72 | }; |
| 73 | 73 | ||
| 74 | /* | 74 | /* |
diff --git a/net/netfilter/xt_LOG.c b/net/netfilter/xt_LOG.c index 491c7d821a0b..5ab24843370a 100644 --- a/net/netfilter/xt_LOG.c +++ b/net/netfilter/xt_LOG.c | |||
| @@ -737,7 +737,7 @@ static void dump_ipv6_packet(struct sbuff *m, | |||
| 737 | dump_sk_uid_gid(m, skb->sk); | 737 | dump_sk_uid_gid(m, skb->sk); |
| 738 | 738 | ||
| 739 | /* Max length: 16 "MARK=0xFFFFFFFF " */ | 739 | /* Max length: 16 "MARK=0xFFFFFFFF " */ |
| 740 | if (!recurse && skb->mark) | 740 | if (recurse && skb->mark) |
| 741 | sb_add(m, "MARK=0x%x ", skb->mark); | 741 | sb_add(m, "MARK=0x%x ", skb->mark); |
| 742 | } | 742 | } |
| 743 | 743 | ||
diff --git a/net/netfilter/xt_addrtype.c b/net/netfilter/xt_addrtype.c index 49c5ff7f6dd6..68ff29f60867 100644 --- a/net/netfilter/xt_addrtype.c +++ b/net/netfilter/xt_addrtype.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <net/ip6_fib.h> | 22 | #include <net/ip6_fib.h> |
| 23 | #endif | 23 | #endif |
| 24 | 24 | ||
| 25 | #include <linux/netfilter_ipv6.h> | ||
| 25 | #include <linux/netfilter/xt_addrtype.h> | 26 | #include <linux/netfilter/xt_addrtype.h> |
| 26 | #include <linux/netfilter/x_tables.h> | 27 | #include <linux/netfilter/x_tables.h> |
| 27 | 28 | ||
| @@ -33,12 +34,12 @@ MODULE_ALIAS("ip6t_addrtype"); | |||
| 33 | 34 | ||
| 34 | #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES) | 35 | #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES) |
| 35 | static u32 match_lookup_rt6(struct net *net, const struct net_device *dev, | 36 | static u32 match_lookup_rt6(struct net *net, const struct net_device *dev, |
| 36 | const struct in6_addr *addr) | 37 | const struct in6_addr *addr, u16 mask) |
| 37 | { | 38 | { |
| 38 | const struct nf_afinfo *afinfo; | 39 | const struct nf_afinfo *afinfo; |
| 39 | struct flowi6 flow; | 40 | struct flowi6 flow; |
| 40 | struct rt6_info *rt; | 41 | struct rt6_info *rt; |
| 41 | u32 ret; | 42 | u32 ret = 0; |
| 42 | int route_err; | 43 | int route_err; |
| 43 | 44 | ||
| 44 | memset(&flow, 0, sizeof(flow)); | 45 | memset(&flow, 0, sizeof(flow)); |
| @@ -49,12 +50,19 @@ static u32 match_lookup_rt6(struct net *net, const struct net_device *dev, | |||
| 49 | rcu_read_lock(); | 50 | rcu_read_lock(); |
| 50 | 51 | ||
| 51 | afinfo = nf_get_afinfo(NFPROTO_IPV6); | 52 | afinfo = nf_get_afinfo(NFPROTO_IPV6); |
| 52 | if (afinfo != NULL) | 53 | if (afinfo != NULL) { |
| 54 | const struct nf_ipv6_ops *v6ops; | ||
| 55 | |||
| 56 | if (dev && (mask & XT_ADDRTYPE_LOCAL)) { | ||
| 57 | v6ops = nf_get_ipv6_ops(); | ||
| 58 | if (v6ops && v6ops->chk_addr(net, addr, dev, true)) | ||
| 59 | ret = XT_ADDRTYPE_LOCAL; | ||
| 60 | } | ||
| 53 | route_err = afinfo->route(net, (struct dst_entry **)&rt, | 61 | route_err = afinfo->route(net, (struct dst_entry **)&rt, |
| 54 | flowi6_to_flowi(&flow), !!dev); | 62 | flowi6_to_flowi(&flow), false); |
| 55 | else | 63 | } else { |
| 56 | route_err = 1; | 64 | route_err = 1; |
| 57 | 65 | } | |
| 58 | rcu_read_unlock(); | 66 | rcu_read_unlock(); |
| 59 | 67 | ||
| 60 | if (route_err) | 68 | if (route_err) |
| @@ -62,15 +70,12 @@ static u32 match_lookup_rt6(struct net *net, const struct net_device *dev, | |||
| 62 | 70 | ||
| 63 | if (rt->rt6i_flags & RTF_REJECT) | 71 | if (rt->rt6i_flags & RTF_REJECT) |
| 64 | ret = XT_ADDRTYPE_UNREACHABLE; | 72 | ret = XT_ADDRTYPE_UNREACHABLE; |
| 65 | else | ||
| 66 | ret = 0; | ||
| 67 | 73 | ||
| 68 | if (rt->rt6i_flags & RTF_LOCAL) | 74 | if (dev == NULL && rt->rt6i_flags & RTF_LOCAL) |
| 69 | ret |= XT_ADDRTYPE_LOCAL; | 75 | ret |= XT_ADDRTYPE_LOCAL; |
| 70 | if (rt->rt6i_flags & RTF_ANYCAST) | 76 | if (rt->rt6i_flags & RTF_ANYCAST) |
| 71 | ret |= XT_ADDRTYPE_ANYCAST; | 77 | ret |= XT_ADDRTYPE_ANYCAST; |
| 72 | 78 | ||
| 73 | |||
| 74 | dst_release(&rt->dst); | 79 | dst_release(&rt->dst); |
| 75 | return ret; | 80 | return ret; |
| 76 | } | 81 | } |
| @@ -90,7 +95,7 @@ static bool match_type6(struct net *net, const struct net_device *dev, | |||
| 90 | 95 | ||
| 91 | if ((XT_ADDRTYPE_LOCAL | XT_ADDRTYPE_ANYCAST | | 96 | if ((XT_ADDRTYPE_LOCAL | XT_ADDRTYPE_ANYCAST | |
| 92 | XT_ADDRTYPE_UNREACHABLE) & mask) | 97 | XT_ADDRTYPE_UNREACHABLE) & mask) |
| 93 | return !!(mask & match_lookup_rt6(net, dev, addr)); | 98 | return !!(mask & match_lookup_rt6(net, dev, addr, mask)); |
| 94 | return true; | 99 | return true; |
| 95 | } | 100 | } |
| 96 | 101 | ||
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 12ac6b47a35c..d0b3dd60d386 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -747,7 +747,7 @@ static void netlink_skb_destructor(struct sk_buff *skb) | |||
| 747 | atomic_dec(&ring->pending); | 747 | atomic_dec(&ring->pending); |
| 748 | sock_put(sk); | 748 | sock_put(sk); |
| 749 | 749 | ||
| 750 | skb->data = NULL; | 750 | skb->head = NULL; |
| 751 | } | 751 | } |
| 752 | #endif | 752 | #endif |
| 753 | if (skb->sk != NULL) | 753 | if (skb->sk != NULL) |
diff --git a/net/nfc/Makefile b/net/nfc/Makefile index fb799deaed4f..a76f4533cb6c 100644 --- a/net/nfc/Makefile +++ b/net/nfc/Makefile | |||
| @@ -5,7 +5,6 @@ | |||
| 5 | obj-$(CONFIG_NFC) += nfc.o | 5 | obj-$(CONFIG_NFC) += nfc.o |
| 6 | obj-$(CONFIG_NFC_NCI) += nci/ | 6 | obj-$(CONFIG_NFC_NCI) += nci/ |
| 7 | obj-$(CONFIG_NFC_HCI) += hci/ | 7 | obj-$(CONFIG_NFC_HCI) += hci/ |
| 8 | #obj-$(CONFIG_NFC_LLCP) += llcp/ | ||
| 9 | 8 | ||
| 10 | nfc-objs := core.o netlink.o af_nfc.o rawsock.o llcp_core.o llcp_commands.o \ | 9 | nfc-objs := core.o netlink.o af_nfc.o rawsock.o llcp_core.o llcp_commands.o \ |
| 11 | llcp_sock.o | 10 | llcp_sock.o |
diff --git a/net/sched/act_police.c b/net/sched/act_police.c index 823463adbd21..189e3c5b3d09 100644 --- a/net/sched/act_police.c +++ b/net/sched/act_police.c | |||
| @@ -231,14 +231,14 @@ override: | |||
| 231 | } | 231 | } |
| 232 | if (R_tab) { | 232 | if (R_tab) { |
| 233 | police->rate_present = true; | 233 | police->rate_present = true; |
| 234 | psched_ratecfg_precompute(&police->rate, R_tab->rate.rate); | 234 | psched_ratecfg_precompute(&police->rate, &R_tab->rate); |
| 235 | qdisc_put_rtab(R_tab); | 235 | qdisc_put_rtab(R_tab); |
| 236 | } else { | 236 | } else { |
| 237 | police->rate_present = false; | 237 | police->rate_present = false; |
| 238 | } | 238 | } |
| 239 | if (P_tab) { | 239 | if (P_tab) { |
| 240 | police->peak_present = true; | 240 | police->peak_present = true; |
| 241 | psched_ratecfg_precompute(&police->peak, P_tab->rate.rate); | 241 | psched_ratecfg_precompute(&police->peak, &P_tab->rate); |
| 242 | qdisc_put_rtab(P_tab); | 242 | qdisc_put_rtab(P_tab); |
| 243 | } else { | 243 | } else { |
| 244 | police->peak_present = false; | 244 | police->peak_present = false; |
| @@ -376,9 +376,9 @@ tcf_act_police_dump(struct sk_buff *skb, struct tc_action *a, int bind, int ref) | |||
| 376 | }; | 376 | }; |
| 377 | 377 | ||
| 378 | if (police->rate_present) | 378 | if (police->rate_present) |
| 379 | opt.rate.rate = psched_ratecfg_getrate(&police->rate); | 379 | psched_ratecfg_getrate(&opt.rate, &police->rate); |
| 380 | if (police->peak_present) | 380 | if (police->peak_present) |
| 381 | opt.peakrate.rate = psched_ratecfg_getrate(&police->peak); | 381 | psched_ratecfg_getrate(&opt.peakrate, &police->peak); |
| 382 | if (nla_put(skb, TCA_POLICE_TBF, sizeof(opt), &opt)) | 382 | if (nla_put(skb, TCA_POLICE_TBF, sizeof(opt), &opt)) |
| 383 | goto nla_put_failure; | 383 | goto nla_put_failure; |
| 384 | if (police->tcfp_result && | 384 | if (police->tcfp_result && |
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index eac7e0ee23c1..20224086cc28 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
| @@ -898,14 +898,16 @@ void dev_shutdown(struct net_device *dev) | |||
| 898 | WARN_ON(timer_pending(&dev->watchdog_timer)); | 898 | WARN_ON(timer_pending(&dev->watchdog_timer)); |
| 899 | } | 899 | } |
| 900 | 900 | ||
| 901 | void psched_ratecfg_precompute(struct psched_ratecfg *r, u32 rate) | 901 | void psched_ratecfg_precompute(struct psched_ratecfg *r, |
| 902 | const struct tc_ratespec *conf) | ||
| 902 | { | 903 | { |
| 903 | u64 factor; | 904 | u64 factor; |
| 904 | u64 mult; | 905 | u64 mult; |
| 905 | int shift; | 906 | int shift; |
| 906 | 907 | ||
| 907 | r->rate_bps = (u64)rate << 3; | 908 | memset(r, 0, sizeof(*r)); |
| 908 | r->shift = 0; | 909 | r->overhead = conf->overhead; |
| 910 | r->rate_bps = (u64)conf->rate << 3; | ||
| 909 | r->mult = 1; | 911 | r->mult = 1; |
| 910 | /* | 912 | /* |
| 911 | * Calibrate mult, shift so that token counting is accurate | 913 | * Calibrate mult, shift so that token counting is accurate |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 79b1876b6cd2..adaedd79389c 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
| @@ -109,7 +109,7 @@ struct htb_class { | |||
| 109 | } un; | 109 | } un; |
| 110 | struct rb_node node[TC_HTB_NUMPRIO]; /* node for self or feed tree */ | 110 | struct rb_node node[TC_HTB_NUMPRIO]; /* node for self or feed tree */ |
| 111 | struct rb_node pq_node; /* node for event queue */ | 111 | struct rb_node pq_node; /* node for event queue */ |
| 112 | psched_time_t pq_key; | 112 | s64 pq_key; |
| 113 | 113 | ||
| 114 | int prio_activity; /* for which prios are we active */ | 114 | int prio_activity; /* for which prios are we active */ |
| 115 | enum htb_cmode cmode; /* current mode of the class */ | 115 | enum htb_cmode cmode; /* current mode of the class */ |
| @@ -121,10 +121,10 @@ struct htb_class { | |||
| 121 | /* token bucket parameters */ | 121 | /* token bucket parameters */ |
| 122 | struct psched_ratecfg rate; | 122 | struct psched_ratecfg rate; |
| 123 | struct psched_ratecfg ceil; | 123 | struct psched_ratecfg ceil; |
| 124 | s64 buffer, cbuffer; /* token bucket depth/rate */ | 124 | s64 buffer, cbuffer; /* token bucket depth/rate */ |
| 125 | psched_tdiff_t mbuffer; /* max wait time */ | 125 | s64 mbuffer; /* max wait time */ |
| 126 | s64 tokens, ctokens; /* current number of tokens */ | 126 | s64 tokens, ctokens; /* current number of tokens */ |
| 127 | psched_time_t t_c; /* checkpoint time */ | 127 | s64 t_c; /* checkpoint time */ |
| 128 | }; | 128 | }; |
| 129 | 129 | ||
| 130 | struct htb_sched { | 130 | struct htb_sched { |
| @@ -141,15 +141,15 @@ struct htb_sched { | |||
| 141 | struct rb_root wait_pq[TC_HTB_MAXDEPTH]; | 141 | struct rb_root wait_pq[TC_HTB_MAXDEPTH]; |
| 142 | 142 | ||
| 143 | /* time of nearest event per level (row) */ | 143 | /* time of nearest event per level (row) */ |
| 144 | psched_time_t near_ev_cache[TC_HTB_MAXDEPTH]; | 144 | s64 near_ev_cache[TC_HTB_MAXDEPTH]; |
| 145 | 145 | ||
| 146 | int defcls; /* class where unclassified flows go to */ | 146 | int defcls; /* class where unclassified flows go to */ |
| 147 | 147 | ||
| 148 | /* filters for qdisc itself */ | 148 | /* filters for qdisc itself */ |
| 149 | struct tcf_proto *filter_list; | 149 | struct tcf_proto *filter_list; |
| 150 | 150 | ||
| 151 | int rate2quantum; /* quant = rate / rate2quantum */ | 151 | int rate2quantum; /* quant = rate / rate2quantum */ |
| 152 | psched_time_t now; /* cached dequeue time */ | 152 | s64 now; /* cached dequeue time */ |
| 153 | struct qdisc_watchdog watchdog; | 153 | struct qdisc_watchdog watchdog; |
| 154 | 154 | ||
| 155 | /* non shaped skbs; let them go directly thru */ | 155 | /* non shaped skbs; let them go directly thru */ |
| @@ -664,8 +664,8 @@ static void htb_charge_class(struct htb_sched *q, struct htb_class *cl, | |||
| 664 | * next pending event (0 for no event in pq, q->now for too many events). | 664 | * next pending event (0 for no event in pq, q->now for too many events). |
| 665 | * Note: Applied are events whose have cl->pq_key <= q->now. | 665 | * Note: Applied are events whose have cl->pq_key <= q->now. |
| 666 | */ | 666 | */ |
| 667 | static psched_time_t htb_do_events(struct htb_sched *q, int level, | 667 | static s64 htb_do_events(struct htb_sched *q, int level, |
| 668 | unsigned long start) | 668 | unsigned long start) |
| 669 | { | 669 | { |
| 670 | /* don't run for longer than 2 jiffies; 2 is used instead of | 670 | /* don't run for longer than 2 jiffies; 2 is used instead of |
| 671 | * 1 to simplify things when jiffy is going to be incremented | 671 | * 1 to simplify things when jiffy is going to be incremented |
| @@ -857,7 +857,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch) | |||
| 857 | struct sk_buff *skb; | 857 | struct sk_buff *skb; |
| 858 | struct htb_sched *q = qdisc_priv(sch); | 858 | struct htb_sched *q = qdisc_priv(sch); |
| 859 | int level; | 859 | int level; |
| 860 | psched_time_t next_event; | 860 | s64 next_event; |
| 861 | unsigned long start_at; | 861 | unsigned long start_at; |
| 862 | 862 | ||
| 863 | /* try to dequeue direct packets as high prio (!) to minimize cpu work */ | 863 | /* try to dequeue direct packets as high prio (!) to minimize cpu work */ |
| @@ -880,7 +880,7 @@ ok: | |||
| 880 | for (level = 0; level < TC_HTB_MAXDEPTH; level++) { | 880 | for (level = 0; level < TC_HTB_MAXDEPTH; level++) { |
| 881 | /* common case optimization - skip event handler quickly */ | 881 | /* common case optimization - skip event handler quickly */ |
| 882 | int m; | 882 | int m; |
| 883 | psched_time_t event; | 883 | s64 event; |
| 884 | 884 | ||
| 885 | if (q->now >= q->near_ev_cache[level]) { | 885 | if (q->now >= q->near_ev_cache[level]) { |
| 886 | event = htb_do_events(q, level, start_at); | 886 | event = htb_do_events(q, level, start_at); |
| @@ -1090,9 +1090,9 @@ static int htb_dump_class(struct Qdisc *sch, unsigned long arg, | |||
| 1090 | 1090 | ||
| 1091 | memset(&opt, 0, sizeof(opt)); | 1091 | memset(&opt, 0, sizeof(opt)); |
| 1092 | 1092 | ||
| 1093 | opt.rate.rate = psched_ratecfg_getrate(&cl->rate); | 1093 | psched_ratecfg_getrate(&opt.rate, &cl->rate); |
| 1094 | opt.buffer = PSCHED_NS2TICKS(cl->buffer); | 1094 | opt.buffer = PSCHED_NS2TICKS(cl->buffer); |
| 1095 | opt.ceil.rate = psched_ratecfg_getrate(&cl->ceil); | 1095 | psched_ratecfg_getrate(&opt.ceil, &cl->ceil); |
| 1096 | opt.cbuffer = PSCHED_NS2TICKS(cl->cbuffer); | 1096 | opt.cbuffer = PSCHED_NS2TICKS(cl->cbuffer); |
| 1097 | opt.quantum = cl->quantum; | 1097 | opt.quantum = cl->quantum; |
| 1098 | opt.prio = cl->prio; | 1098 | opt.prio = cl->prio; |
| @@ -1117,8 +1117,8 @@ htb_dump_class_stats(struct Qdisc *sch, unsigned long arg, struct gnet_dump *d) | |||
| 1117 | 1117 | ||
| 1118 | if (!cl->level && cl->un.leaf.q) | 1118 | if (!cl->level && cl->un.leaf.q) |
| 1119 | cl->qstats.qlen = cl->un.leaf.q->q.qlen; | 1119 | cl->qstats.qlen = cl->un.leaf.q->q.qlen; |
| 1120 | cl->xstats.tokens = cl->tokens; | 1120 | cl->xstats.tokens = PSCHED_NS2TICKS(cl->tokens); |
| 1121 | cl->xstats.ctokens = cl->ctokens; | 1121 | cl->xstats.ctokens = PSCHED_NS2TICKS(cl->ctokens); |
| 1122 | 1122 | ||
| 1123 | if (gnet_stats_copy_basic(d, &cl->bstats) < 0 || | 1123 | if (gnet_stats_copy_basic(d, &cl->bstats) < 0 || |
| 1124 | gnet_stats_copy_rate_est(d, NULL, &cl->rate_est) < 0 || | 1124 | gnet_stats_copy_rate_est(d, NULL, &cl->rate_est) < 0 || |
| @@ -1200,7 +1200,7 @@ static void htb_parent_to_leaf(struct htb_sched *q, struct htb_class *cl, | |||
| 1200 | parent->un.leaf.q = new_q ? new_q : &noop_qdisc; | 1200 | parent->un.leaf.q = new_q ? new_q : &noop_qdisc; |
| 1201 | parent->tokens = parent->buffer; | 1201 | parent->tokens = parent->buffer; |
| 1202 | parent->ctokens = parent->cbuffer; | 1202 | parent->ctokens = parent->cbuffer; |
| 1203 | parent->t_c = psched_get_time(); | 1203 | parent->t_c = ktime_to_ns(ktime_get()); |
| 1204 | parent->cmode = HTB_CAN_SEND; | 1204 | parent->cmode = HTB_CAN_SEND; |
| 1205 | } | 1205 | } |
| 1206 | 1206 | ||
| @@ -1417,8 +1417,8 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, | |||
| 1417 | /* set class to be in HTB_CAN_SEND state */ | 1417 | /* set class to be in HTB_CAN_SEND state */ |
| 1418 | cl->tokens = PSCHED_TICKS2NS(hopt->buffer); | 1418 | cl->tokens = PSCHED_TICKS2NS(hopt->buffer); |
| 1419 | cl->ctokens = PSCHED_TICKS2NS(hopt->cbuffer); | 1419 | cl->ctokens = PSCHED_TICKS2NS(hopt->cbuffer); |
| 1420 | cl->mbuffer = 60 * PSCHED_TICKS_PER_SEC; /* 1min */ | 1420 | cl->mbuffer = 60ULL * NSEC_PER_SEC; /* 1min */ |
| 1421 | cl->t_c = psched_get_time(); | 1421 | cl->t_c = ktime_to_ns(ktime_get()); |
| 1422 | cl->cmode = HTB_CAN_SEND; | 1422 | cl->cmode = HTB_CAN_SEND; |
| 1423 | 1423 | ||
| 1424 | /* attach to the hash list and parent's family */ | 1424 | /* attach to the hash list and parent's family */ |
| @@ -1459,8 +1459,8 @@ static int htb_change_class(struct Qdisc *sch, u32 classid, | |||
| 1459 | cl->prio = TC_HTB_NUMPRIO - 1; | 1459 | cl->prio = TC_HTB_NUMPRIO - 1; |
| 1460 | } | 1460 | } |
| 1461 | 1461 | ||
| 1462 | psched_ratecfg_precompute(&cl->rate, hopt->rate.rate); | 1462 | psched_ratecfg_precompute(&cl->rate, &hopt->rate); |
| 1463 | psched_ratecfg_precompute(&cl->ceil, hopt->ceil.rate); | 1463 | psched_ratecfg_precompute(&cl->ceil, &hopt->ceil); |
| 1464 | 1464 | ||
| 1465 | cl->buffer = PSCHED_TICKS2NS(hopt->buffer); | 1465 | cl->buffer = PSCHED_TICKS2NS(hopt->buffer); |
| 1466 | cl->cbuffer = PSCHED_TICKS2NS(hopt->buffer); | 1466 | cl->cbuffer = PSCHED_TICKS2NS(hopt->buffer); |
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index c8388f3c3426..e478d316602b 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c | |||
| @@ -298,9 +298,9 @@ static int tbf_change(struct Qdisc *sch, struct nlattr *opt) | |||
| 298 | q->tokens = q->buffer; | 298 | q->tokens = q->buffer; |
| 299 | q->ptokens = q->mtu; | 299 | q->ptokens = q->mtu; |
| 300 | 300 | ||
| 301 | psched_ratecfg_precompute(&q->rate, rtab->rate.rate); | 301 | psched_ratecfg_precompute(&q->rate, &rtab->rate); |
| 302 | if (ptab) { | 302 | if (ptab) { |
| 303 | psched_ratecfg_precompute(&q->peak, ptab->rate.rate); | 303 | psched_ratecfg_precompute(&q->peak, &ptab->rate); |
| 304 | q->peak_present = true; | 304 | q->peak_present = true; |
| 305 | } else { | 305 | } else { |
| 306 | q->peak_present = false; | 306 | q->peak_present = false; |
| @@ -350,9 +350,9 @@ static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb) | |||
| 350 | goto nla_put_failure; | 350 | goto nla_put_failure; |
| 351 | 351 | ||
| 352 | opt.limit = q->limit; | 352 | opt.limit = q->limit; |
| 353 | opt.rate.rate = psched_ratecfg_getrate(&q->rate); | 353 | psched_ratecfg_getrate(&opt.rate, &q->rate); |
| 354 | if (q->peak_present) | 354 | if (q->peak_present) |
| 355 | opt.peakrate.rate = psched_ratecfg_getrate(&q->peak); | 355 | psched_ratecfg_getrate(&opt.peakrate, &q->peak); |
| 356 | else | 356 | else |
| 357 | memset(&opt.peakrate, 0, sizeof(opt.peakrate)); | 357 | memset(&opt.peakrate, 0, sizeof(opt.peakrate)); |
| 358 | opt.mtu = PSCHED_NS2TICKS(q->mtu); | 358 | opt.mtu = PSCHED_NS2TICKS(q->mtu); |
diff --git a/net/socket.c b/net/socket.c index 6b94633ca61d..4ca1526db756 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -1956,7 +1956,7 @@ struct used_address { | |||
| 1956 | unsigned int name_len; | 1956 | unsigned int name_len; |
| 1957 | }; | 1957 | }; |
| 1958 | 1958 | ||
| 1959 | static int __sys_sendmsg(struct socket *sock, struct msghdr __user *msg, | 1959 | static int ___sys_sendmsg(struct socket *sock, struct msghdr __user *msg, |
| 1960 | struct msghdr *msg_sys, unsigned int flags, | 1960 | struct msghdr *msg_sys, unsigned int flags, |
| 1961 | struct used_address *used_address) | 1961 | struct used_address *used_address) |
| 1962 | { | 1962 | { |
| @@ -2071,22 +2071,30 @@ out: | |||
| 2071 | * BSD sendmsg interface | 2071 | * BSD sendmsg interface |
| 2072 | */ | 2072 | */ |
| 2073 | 2073 | ||
| 2074 | SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned int, flags) | 2074 | long __sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags) |
| 2075 | { | 2075 | { |
| 2076 | int fput_needed, err; | 2076 | int fput_needed, err; |
| 2077 | struct msghdr msg_sys; | 2077 | struct msghdr msg_sys; |
| 2078 | struct socket *sock = sockfd_lookup_light(fd, &err, &fput_needed); | 2078 | struct socket *sock; |
| 2079 | 2079 | ||
| 2080 | sock = sockfd_lookup_light(fd, &err, &fput_needed); | ||
| 2080 | if (!sock) | 2081 | if (!sock) |
| 2081 | goto out; | 2082 | goto out; |
| 2082 | 2083 | ||
| 2083 | err = __sys_sendmsg(sock, msg, &msg_sys, flags, NULL); | 2084 | err = ___sys_sendmsg(sock, msg, &msg_sys, flags, NULL); |
| 2084 | 2085 | ||
| 2085 | fput_light(sock->file, fput_needed); | 2086 | fput_light(sock->file, fput_needed); |
| 2086 | out: | 2087 | out: |
| 2087 | return err; | 2088 | return err; |
| 2088 | } | 2089 | } |
| 2089 | 2090 | ||
| 2091 | SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned int, flags) | ||
| 2092 | { | ||
| 2093 | if (flags & MSG_CMSG_COMPAT) | ||
| 2094 | return -EINVAL; | ||
| 2095 | return __sys_sendmsg(fd, msg, flags); | ||
| 2096 | } | ||
| 2097 | |||
| 2090 | /* | 2098 | /* |
| 2091 | * Linux sendmmsg interface | 2099 | * Linux sendmmsg interface |
| 2092 | */ | 2100 | */ |
| @@ -2117,15 +2125,16 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
| 2117 | 2125 | ||
| 2118 | while (datagrams < vlen) { | 2126 | while (datagrams < vlen) { |
| 2119 | if (MSG_CMSG_COMPAT & flags) { | 2127 | if (MSG_CMSG_COMPAT & flags) { |
| 2120 | err = __sys_sendmsg(sock, (struct msghdr __user *)compat_entry, | 2128 | err = ___sys_sendmsg(sock, (struct msghdr __user *)compat_entry, |
| 2121 | &msg_sys, flags, &used_address); | 2129 | &msg_sys, flags, &used_address); |
| 2122 | if (err < 0) | 2130 | if (err < 0) |
| 2123 | break; | 2131 | break; |
| 2124 | err = __put_user(err, &compat_entry->msg_len); | 2132 | err = __put_user(err, &compat_entry->msg_len); |
| 2125 | ++compat_entry; | 2133 | ++compat_entry; |
| 2126 | } else { | 2134 | } else { |
| 2127 | err = __sys_sendmsg(sock, (struct msghdr __user *)entry, | 2135 | err = ___sys_sendmsg(sock, |
| 2128 | &msg_sys, flags, &used_address); | 2136 | (struct msghdr __user *)entry, |
| 2137 | &msg_sys, flags, &used_address); | ||
| 2129 | if (err < 0) | 2138 | if (err < 0) |
| 2130 | break; | 2139 | break; |
| 2131 | err = put_user(err, &entry->msg_len); | 2140 | err = put_user(err, &entry->msg_len); |
| @@ -2149,10 +2158,12 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
| 2149 | SYSCALL_DEFINE4(sendmmsg, int, fd, struct mmsghdr __user *, mmsg, | 2158 | SYSCALL_DEFINE4(sendmmsg, int, fd, struct mmsghdr __user *, mmsg, |
| 2150 | unsigned int, vlen, unsigned int, flags) | 2159 | unsigned int, vlen, unsigned int, flags) |
| 2151 | { | 2160 | { |
| 2161 | if (flags & MSG_CMSG_COMPAT) | ||
| 2162 | return -EINVAL; | ||
| 2152 | return __sys_sendmmsg(fd, mmsg, vlen, flags); | 2163 | return __sys_sendmmsg(fd, mmsg, vlen, flags); |
| 2153 | } | 2164 | } |
| 2154 | 2165 | ||
| 2155 | static int __sys_recvmsg(struct socket *sock, struct msghdr __user *msg, | 2166 | static int ___sys_recvmsg(struct socket *sock, struct msghdr __user *msg, |
| 2156 | struct msghdr *msg_sys, unsigned int flags, int nosec) | 2167 | struct msghdr *msg_sys, unsigned int flags, int nosec) |
| 2157 | { | 2168 | { |
| 2158 | struct compat_msghdr __user *msg_compat = | 2169 | struct compat_msghdr __user *msg_compat = |
| @@ -2244,23 +2255,31 @@ out: | |||
| 2244 | * BSD recvmsg interface | 2255 | * BSD recvmsg interface |
| 2245 | */ | 2256 | */ |
| 2246 | 2257 | ||
| 2247 | SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg, | 2258 | long __sys_recvmsg(int fd, struct msghdr __user *msg, unsigned flags) |
| 2248 | unsigned int, flags) | ||
| 2249 | { | 2259 | { |
| 2250 | int fput_needed, err; | 2260 | int fput_needed, err; |
| 2251 | struct msghdr msg_sys; | 2261 | struct msghdr msg_sys; |
| 2252 | struct socket *sock = sockfd_lookup_light(fd, &err, &fput_needed); | 2262 | struct socket *sock; |
| 2253 | 2263 | ||
| 2264 | sock = sockfd_lookup_light(fd, &err, &fput_needed); | ||
| 2254 | if (!sock) | 2265 | if (!sock) |
| 2255 | goto out; | 2266 | goto out; |
| 2256 | 2267 | ||
| 2257 | err = __sys_recvmsg(sock, msg, &msg_sys, flags, 0); | 2268 | err = ___sys_recvmsg(sock, msg, &msg_sys, flags, 0); |
| 2258 | 2269 | ||
| 2259 | fput_light(sock->file, fput_needed); | 2270 | fput_light(sock->file, fput_needed); |
| 2260 | out: | 2271 | out: |
| 2261 | return err; | 2272 | return err; |
| 2262 | } | 2273 | } |
| 2263 | 2274 | ||
| 2275 | SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg, | ||
| 2276 | unsigned int, flags) | ||
| 2277 | { | ||
| 2278 | if (flags & MSG_CMSG_COMPAT) | ||
| 2279 | return -EINVAL; | ||
| 2280 | return __sys_recvmsg(fd, msg, flags); | ||
| 2281 | } | ||
| 2282 | |||
| 2264 | /* | 2283 | /* |
| 2265 | * Linux recvmmsg interface | 2284 | * Linux recvmmsg interface |
| 2266 | */ | 2285 | */ |
| @@ -2298,17 +2317,18 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | |||
| 2298 | * No need to ask LSM for more than the first datagram. | 2317 | * No need to ask LSM for more than the first datagram. |
| 2299 | */ | 2318 | */ |
| 2300 | if (MSG_CMSG_COMPAT & flags) { | 2319 | if (MSG_CMSG_COMPAT & flags) { |
| 2301 | err = __sys_recvmsg(sock, (struct msghdr __user *)compat_entry, | 2320 | err = ___sys_recvmsg(sock, (struct msghdr __user *)compat_entry, |
| 2302 | &msg_sys, flags & ~MSG_WAITFORONE, | 2321 | &msg_sys, flags & ~MSG_WAITFORONE, |
| 2303 | datagrams); | 2322 | datagrams); |
| 2304 | if (err < 0) | 2323 | if (err < 0) |
| 2305 | break; | 2324 | break; |
| 2306 | err = __put_user(err, &compat_entry->msg_len); | 2325 | err = __put_user(err, &compat_entry->msg_len); |
| 2307 | ++compat_entry; | 2326 | ++compat_entry; |
| 2308 | } else { | 2327 | } else { |
| 2309 | err = __sys_recvmsg(sock, (struct msghdr __user *)entry, | 2328 | err = ___sys_recvmsg(sock, |
| 2310 | &msg_sys, flags & ~MSG_WAITFORONE, | 2329 | (struct msghdr __user *)entry, |
| 2311 | datagrams); | 2330 | &msg_sys, flags & ~MSG_WAITFORONE, |
| 2331 | datagrams); | ||
| 2312 | if (err < 0) | 2332 | if (err < 0) |
| 2313 | break; | 2333 | break; |
| 2314 | err = put_user(err, &entry->msg_len); | 2334 | err = put_user(err, &entry->msg_len); |
| @@ -2375,6 +2395,9 @@ SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg, | |||
| 2375 | int datagrams; | 2395 | int datagrams; |
| 2376 | struct timespec timeout_sys; | 2396 | struct timespec timeout_sys; |
| 2377 | 2397 | ||
| 2398 | if (flags & MSG_CMSG_COMPAT) | ||
| 2399 | return -EINVAL; | ||
| 2400 | |||
| 2378 | if (!timeout) | 2401 | if (!timeout) |
| 2379 | return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL); | 2402 | return __sys_recvmmsg(fd, mmsg, vlen, flags, NULL); |
| 2380 | 2403 | ||
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index dfdb5e643211..d5aed3bb3945 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -3411,7 +3411,7 @@ static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq, | |||
| 3411 | (u32)sinfo->rx_bytes)) | 3411 | (u32)sinfo->rx_bytes)) |
| 3412 | goto nla_put_failure; | 3412 | goto nla_put_failure; |
| 3413 | if ((sinfo->filled & (STATION_INFO_TX_BYTES | | 3413 | if ((sinfo->filled & (STATION_INFO_TX_BYTES | |
| 3414 | NL80211_STA_INFO_TX_BYTES64)) && | 3414 | STATION_INFO_TX_BYTES64)) && |
| 3415 | nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, | 3415 | nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES, |
| 3416 | (u32)sinfo->tx_bytes)) | 3416 | (u32)sinfo->tx_bytes)) |
| 3417 | goto nla_put_failure; | 3417 | goto nla_put_failure; |
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 8b5eddfba1e5..3ed35c345cae 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
| @@ -231,6 +231,9 @@ void cfg80211_conn_work(struct work_struct *work) | |||
| 231 | mutex_lock(&rdev->sched_scan_mtx); | 231 | mutex_lock(&rdev->sched_scan_mtx); |
| 232 | 232 | ||
| 233 | list_for_each_entry(wdev, &rdev->wdev_list, list) { | 233 | list_for_each_entry(wdev, &rdev->wdev_list, list) { |
| 234 | if (!wdev->netdev) | ||
| 235 | continue; | ||
| 236 | |||
| 234 | wdev_lock(wdev); | 237 | wdev_lock(wdev); |
| 235 | if (!netif_running(wdev->netdev)) { | 238 | if (!netif_running(wdev->netdev)) { |
| 236 | wdev_unlock(wdev); | 239 | wdev_unlock(wdev); |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 23cea0f74336..ea970b8002a2 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -2557,11 +2557,12 @@ static void __xfrm_garbage_collect(struct net *net) | |||
| 2557 | } | 2557 | } |
| 2558 | } | 2558 | } |
| 2559 | 2559 | ||
| 2560 | static void xfrm_garbage_collect(struct net *net) | 2560 | void xfrm_garbage_collect(struct net *net) |
| 2561 | { | 2561 | { |
| 2562 | flow_cache_flush(); | 2562 | flow_cache_flush(); |
| 2563 | __xfrm_garbage_collect(net); | 2563 | __xfrm_garbage_collect(net); |
| 2564 | } | 2564 | } |
| 2565 | EXPORT_SYMBOL(xfrm_garbage_collect); | ||
| 2565 | 2566 | ||
| 2566 | static void xfrm_garbage_collect_deferred(struct net *net) | 2567 | static void xfrm_garbage_collect_deferred(struct net *net) |
| 2567 | { | 2568 | { |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index aa778748c565..3f565e495ac6 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -1681,6 +1681,8 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 1681 | 1681 | ||
| 1682 | out: | 1682 | out: |
| 1683 | xfrm_pol_put(xp); | 1683 | xfrm_pol_put(xp); |
| 1684 | if (delete && err == 0) | ||
| 1685 | xfrm_garbage_collect(net); | ||
| 1684 | return err; | 1686 | return err; |
| 1685 | } | 1687 | } |
| 1686 | 1688 | ||
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 51bb3de680b6..8337663aa298 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib | |||
| @@ -264,7 +264,7 @@ $(obj)/%.dtb.S: $(obj)/%.dtb | |||
| 264 | quiet_cmd_dtc = DTC $@ | 264 | quiet_cmd_dtc = DTC $@ |
| 265 | cmd_dtc = $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \ | 265 | cmd_dtc = $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \ |
| 266 | $(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 \ | 266 | $(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 \ |
| 267 | -i $(srctree)/arch/$(SRCARCH)/boot/dts $(DTC_FLAGS) \ | 267 | -i $(dir $<) $(DTC_FLAGS) \ |
| 268 | -d $(depfile).dtc $(dtc-tmp) ; \ | 268 | -d $(depfile).dtc $(dtc-tmp) ; \ |
| 269 | cat $(depfile).pre $(depfile).dtc > $(depfile) | 269 | cat $(depfile).pre $(depfile).dtc > $(depfile) |
| 270 | 270 | ||
diff --git a/scripts/config b/scripts/config index bb4d3deb6d1c..a65ecbbdd32a 100755 --- a/scripts/config +++ b/scripts/config | |||
| @@ -105,7 +105,7 @@ while [ "$1" != "" ] ; do | |||
| 105 | ;; | 105 | ;; |
| 106 | --refresh) | 106 | --refresh) |
| 107 | ;; | 107 | ;; |
| 108 | --*-after) | 108 | --*-after|-E|-D|-M) |
| 109 | checkarg "$1" | 109 | checkarg "$1" |
| 110 | A=$ARG | 110 | A=$ARG |
| 111 | checkarg "$2" | 111 | checkarg "$2" |
diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c index 48d382e7e374..38cd69c5660e 100644 --- a/scripts/kconfig/lxdialog/menubox.c +++ b/scripts/kconfig/lxdialog/menubox.c | |||
| @@ -303,10 +303,11 @@ do_resize: | |||
| 303 | } | 303 | } |
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | if (i < max_choice || | 306 | if (item_count() != 0 && |
| 307 | key == KEY_UP || key == KEY_DOWN || | 307 | (i < max_choice || |
| 308 | key == '-' || key == '+' || | 308 | key == KEY_UP || key == KEY_DOWN || |
| 309 | key == KEY_PPAGE || key == KEY_NPAGE) { | 309 | key == '-' || key == '+' || |
| 310 | key == KEY_PPAGE || key == KEY_NPAGE)) { | ||
| 310 | /* Remove highligt of current item */ | 311 | /* Remove highligt of current item */ |
| 311 | print_item(scroll + choice, choice, FALSE); | 312 | print_item(scroll + choice, choice, FALSE); |
| 312 | 313 | ||
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 387dc8daf7b2..a69cbd78fb38 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c | |||
| @@ -670,11 +670,12 @@ static void conf(struct menu *menu, struct menu *active_menu) | |||
| 670 | active_menu, &s_scroll); | 670 | active_menu, &s_scroll); |
| 671 | if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL) | 671 | if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL) |
| 672 | break; | 672 | break; |
| 673 | if (!item_activate_selected()) | 673 | if (item_count() != 0) { |
| 674 | continue; | 674 | if (!item_activate_selected()) |
| 675 | if (!item_tag()) | 675 | continue; |
| 676 | continue; | 676 | if (!item_tag()) |
| 677 | 677 | continue; | |
| 678 | } | ||
| 678 | submenu = item_data(); | 679 | submenu = item_data(); |
| 679 | active_menu = item_data(); | 680 | active_menu = item_data(); |
| 680 | if (submenu) | 681 | if (submenu) |
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index b5c7d90df9df..fd3f0180e08f 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c | |||
| @@ -146,11 +146,24 @@ struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *e | |||
| 146 | struct menu *menu = current_entry; | 146 | struct menu *menu = current_entry; |
| 147 | 147 | ||
| 148 | while ((menu = menu->parent) != NULL) { | 148 | while ((menu = menu->parent) != NULL) { |
| 149 | struct expr *dup_expr; | ||
| 150 | |||
| 149 | if (!menu->visibility) | 151 | if (!menu->visibility) |
| 150 | continue; | 152 | continue; |
| 153 | /* | ||
| 154 | * Do not add a reference to the | ||
| 155 | * menu's visibility expression but | ||
| 156 | * use a copy of it. Otherwise the | ||
| 157 | * expression reduction functions | ||
| 158 | * will modify expressions that have | ||
| 159 | * multiple references which can | ||
| 160 | * cause unwanted side effects. | ||
| 161 | */ | ||
| 162 | dup_expr = expr_copy(menu->visibility); | ||
| 163 | |||
| 151 | prop->visible.expr | 164 | prop->visible.expr |
| 152 | = expr_alloc_and(prop->visible.expr, | 165 | = expr_alloc_and(prop->visible.expr, |
| 153 | menu->visibility); | 166 | dup_expr); |
| 154 | } | 167 | } |
| 155 | } | 168 | } |
| 156 | 169 | ||
diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c index 8ab295154517..d03081886214 100644 --- a/security/selinux/xfrm.c +++ b/security/selinux/xfrm.c | |||
| @@ -316,6 +316,7 @@ int selinux_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx, | |||
| 316 | 316 | ||
| 317 | memcpy(new_ctx, old_ctx, sizeof(*new_ctx)); | 317 | memcpy(new_ctx, old_ctx, sizeof(*new_ctx)); |
| 318 | memcpy(new_ctx->ctx_str, old_ctx->ctx_str, new_ctx->ctx_len); | 318 | memcpy(new_ctx->ctx_str, old_ctx->ctx_str, new_ctx->ctx_len); |
| 319 | atomic_inc(&selinux_xfrm_refcount); | ||
| 319 | *new_ctxp = new_ctx; | 320 | *new_ctxp = new_ctx; |
| 320 | } | 321 | } |
| 321 | return 0; | 322 | return 0; |
| @@ -326,6 +327,7 @@ int selinux_xfrm_policy_clone(struct xfrm_sec_ctx *old_ctx, | |||
| 326 | */ | 327 | */ |
| 327 | void selinux_xfrm_policy_free(struct xfrm_sec_ctx *ctx) | 328 | void selinux_xfrm_policy_free(struct xfrm_sec_ctx *ctx) |
| 328 | { | 329 | { |
| 330 | atomic_dec(&selinux_xfrm_refcount); | ||
| 329 | kfree(ctx); | 331 | kfree(ctx); |
| 330 | } | 332 | } |
| 331 | 333 | ||
| @@ -335,17 +337,13 @@ void selinux_xfrm_policy_free(struct xfrm_sec_ctx *ctx) | |||
| 335 | int selinux_xfrm_policy_delete(struct xfrm_sec_ctx *ctx) | 337 | int selinux_xfrm_policy_delete(struct xfrm_sec_ctx *ctx) |
| 336 | { | 338 | { |
| 337 | const struct task_security_struct *tsec = current_security(); | 339 | const struct task_security_struct *tsec = current_security(); |
| 338 | int rc = 0; | ||
| 339 | 340 | ||
| 340 | if (ctx) { | 341 | if (!ctx) |
| 341 | rc = avc_has_perm(tsec->sid, ctx->ctx_sid, | 342 | return 0; |
| 342 | SECCLASS_ASSOCIATION, | ||
| 343 | ASSOCIATION__SETCONTEXT, NULL); | ||
| 344 | if (rc == 0) | ||
| 345 | atomic_dec(&selinux_xfrm_refcount); | ||
| 346 | } | ||
| 347 | 343 | ||
| 348 | return rc; | 344 | return avc_has_perm(tsec->sid, ctx->ctx_sid, |
| 345 | SECCLASS_ASSOCIATION, ASSOCIATION__SETCONTEXT, | ||
| 346 | NULL); | ||
| 349 | } | 347 | } |
| 350 | 348 | ||
| 351 | /* | 349 | /* |
| @@ -370,8 +368,8 @@ int selinux_xfrm_state_alloc(struct xfrm_state *x, struct xfrm_user_sec_ctx *uct | |||
| 370 | */ | 368 | */ |
| 371 | void selinux_xfrm_state_free(struct xfrm_state *x) | 369 | void selinux_xfrm_state_free(struct xfrm_state *x) |
| 372 | { | 370 | { |
| 373 | struct xfrm_sec_ctx *ctx = x->security; | 371 | atomic_dec(&selinux_xfrm_refcount); |
| 374 | kfree(ctx); | 372 | kfree(x->security); |
| 375 | } | 373 | } |
| 376 | 374 | ||
| 377 | /* | 375 | /* |
| @@ -381,17 +379,13 @@ int selinux_xfrm_state_delete(struct xfrm_state *x) | |||
| 381 | { | 379 | { |
| 382 | const struct task_security_struct *tsec = current_security(); | 380 | const struct task_security_struct *tsec = current_security(); |
| 383 | struct xfrm_sec_ctx *ctx = x->security; | 381 | struct xfrm_sec_ctx *ctx = x->security; |
| 384 | int rc = 0; | ||
| 385 | 382 | ||
| 386 | if (ctx) { | 383 | if (!ctx) |
| 387 | rc = avc_has_perm(tsec->sid, ctx->ctx_sid, | 384 | return 0; |
| 388 | SECCLASS_ASSOCIATION, | ||
| 389 | ASSOCIATION__SETCONTEXT, NULL); | ||
| 390 | if (rc == 0) | ||
| 391 | atomic_dec(&selinux_xfrm_refcount); | ||
| 392 | } | ||
| 393 | 385 | ||
| 394 | return rc; | 386 | return avc_has_perm(tsec->sid, ctx->ctx_sid, |
| 387 | SECCLASS_ASSOCIATION, ASSOCIATION__SETCONTEXT, | ||
| 388 | NULL); | ||
| 395 | } | 389 | } |
| 396 | 390 | ||
| 397 | /* | 391 | /* |
diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c index ae85bbd2e6f8..4b1524a861f3 100644 --- a/sound/pci/hda/hda_generic.c +++ b/sound/pci/hda/hda_generic.c | |||
| @@ -788,6 +788,8 @@ static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable) | |||
| 788 | return; | 788 | return; |
| 789 | if (codec->inv_eapd) | 789 | if (codec->inv_eapd) |
| 790 | enable = !enable; | 790 | enable = !enable; |
| 791 | if (spec->keep_eapd_on && !enable) | ||
| 792 | return; | ||
| 791 | snd_hda_codec_update_cache(codec, pin, 0, | 793 | snd_hda_codec_update_cache(codec, pin, 0, |
| 792 | AC_VERB_SET_EAPD_BTLENABLE, | 794 | AC_VERB_SET_EAPD_BTLENABLE, |
| 793 | enable ? 0x02 : 0x00); | 795 | enable ? 0x02 : 0x00); |
| @@ -1938,17 +1940,7 @@ static int create_speaker_out_ctls(struct hda_codec *codec) | |||
| 1938 | * independent HP controls | 1940 | * independent HP controls |
| 1939 | */ | 1941 | */ |
| 1940 | 1942 | ||
| 1941 | /* update HP auto-mute state too */ | 1943 | static void call_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack); |
| 1942 | static void update_hp_automute_hook(struct hda_codec *codec) | ||
| 1943 | { | ||
| 1944 | struct hda_gen_spec *spec = codec->spec; | ||
| 1945 | |||
| 1946 | if (spec->hp_automute_hook) | ||
| 1947 | spec->hp_automute_hook(codec, NULL); | ||
| 1948 | else | ||
| 1949 | snd_hda_gen_hp_automute(codec, NULL); | ||
| 1950 | } | ||
| 1951 | |||
| 1952 | static int indep_hp_info(struct snd_kcontrol *kcontrol, | 1944 | static int indep_hp_info(struct snd_kcontrol *kcontrol, |
| 1953 | struct snd_ctl_elem_info *uinfo) | 1945 | struct snd_ctl_elem_info *uinfo) |
| 1954 | { | 1946 | { |
| @@ -2009,7 +2001,7 @@ static int indep_hp_put(struct snd_kcontrol *kcontrol, | |||
| 2009 | else | 2001 | else |
| 2010 | *dacp = spec->alt_dac_nid; | 2002 | *dacp = spec->alt_dac_nid; |
| 2011 | 2003 | ||
| 2012 | update_hp_automute_hook(codec); | 2004 | call_hp_automute(codec, NULL); |
| 2013 | ret = 1; | 2005 | ret = 1; |
| 2014 | } | 2006 | } |
| 2015 | unlock: | 2007 | unlock: |
| @@ -2305,7 +2297,7 @@ static void update_hp_mic(struct hda_codec *codec, int adc_mux, bool force) | |||
| 2305 | else | 2297 | else |
| 2306 | val = PIN_HP; | 2298 | val = PIN_HP; |
| 2307 | set_pin_target(codec, pin, val, true); | 2299 | set_pin_target(codec, pin, val, true); |
| 2308 | update_hp_automute_hook(codec); | 2300 | call_hp_automute(codec, NULL); |
| 2309 | } | 2301 | } |
| 2310 | } | 2302 | } |
| 2311 | 2303 | ||
| @@ -2714,7 +2706,7 @@ static int hp_mic_jack_mode_put(struct snd_kcontrol *kcontrol, | |||
| 2714 | val = snd_hda_get_default_vref(codec, nid); | 2706 | val = snd_hda_get_default_vref(codec, nid); |
| 2715 | } | 2707 | } |
| 2716 | snd_hda_set_pin_ctl_cache(codec, nid, val); | 2708 | snd_hda_set_pin_ctl_cache(codec, nid, val); |
| 2717 | update_hp_automute_hook(codec); | 2709 | call_hp_automute(codec, NULL); |
| 2718 | 2710 | ||
| 2719 | return 1; | 2711 | return 1; |
| 2720 | } | 2712 | } |
| @@ -3859,20 +3851,42 @@ void snd_hda_gen_mic_autoswitch(struct hda_codec *codec, struct hda_jack_tbl *ja | |||
| 3859 | } | 3851 | } |
| 3860 | EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch); | 3852 | EXPORT_SYMBOL_HDA(snd_hda_gen_mic_autoswitch); |
| 3861 | 3853 | ||
| 3862 | /* update jack retasking */ | 3854 | /* call appropriate hooks */ |
| 3863 | static void update_automute_all(struct hda_codec *codec) | 3855 | static void call_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack) |
| 3864 | { | 3856 | { |
| 3865 | struct hda_gen_spec *spec = codec->spec; | 3857 | struct hda_gen_spec *spec = codec->spec; |
| 3858 | if (spec->hp_automute_hook) | ||
| 3859 | spec->hp_automute_hook(codec, jack); | ||
| 3860 | else | ||
| 3861 | snd_hda_gen_hp_automute(codec, jack); | ||
| 3862 | } | ||
| 3866 | 3863 | ||
| 3867 | update_hp_automute_hook(codec); | 3864 | static void call_line_automute(struct hda_codec *codec, |
| 3865 | struct hda_jack_tbl *jack) | ||
| 3866 | { | ||
| 3867 | struct hda_gen_spec *spec = codec->spec; | ||
| 3868 | if (spec->line_automute_hook) | 3868 | if (spec->line_automute_hook) |
| 3869 | spec->line_automute_hook(codec, NULL); | 3869 | spec->line_automute_hook(codec, jack); |
| 3870 | else | 3870 | else |
| 3871 | snd_hda_gen_line_automute(codec, NULL); | 3871 | snd_hda_gen_line_automute(codec, jack); |
| 3872 | } | ||
| 3873 | |||
| 3874 | static void call_mic_autoswitch(struct hda_codec *codec, | ||
| 3875 | struct hda_jack_tbl *jack) | ||
| 3876 | { | ||
| 3877 | struct hda_gen_spec *spec = codec->spec; | ||
| 3872 | if (spec->mic_autoswitch_hook) | 3878 | if (spec->mic_autoswitch_hook) |
| 3873 | spec->mic_autoswitch_hook(codec, NULL); | 3879 | spec->mic_autoswitch_hook(codec, jack); |
| 3874 | else | 3880 | else |
| 3875 | snd_hda_gen_mic_autoswitch(codec, NULL); | 3881 | snd_hda_gen_mic_autoswitch(codec, jack); |
| 3882 | } | ||
| 3883 | |||
| 3884 | /* update jack retasking */ | ||
| 3885 | static void update_automute_all(struct hda_codec *codec) | ||
| 3886 | { | ||
| 3887 | call_hp_automute(codec, NULL); | ||
| 3888 | call_line_automute(codec, NULL); | ||
| 3889 | call_mic_autoswitch(codec, NULL); | ||
| 3876 | } | 3890 | } |
| 3877 | 3891 | ||
| 3878 | /* | 3892 | /* |
| @@ -4009,9 +4023,7 @@ static int check_auto_mute_availability(struct hda_codec *codec) | |||
| 4009 | snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n", | 4023 | snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n", |
| 4010 | nid); | 4024 | nid); |
| 4011 | snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT, | 4025 | snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT, |
| 4012 | spec->hp_automute_hook ? | 4026 | call_hp_automute); |
| 4013 | spec->hp_automute_hook : | ||
| 4014 | snd_hda_gen_hp_automute); | ||
| 4015 | spec->detect_hp = 1; | 4027 | spec->detect_hp = 1; |
| 4016 | } | 4028 | } |
| 4017 | 4029 | ||
| @@ -4024,9 +4036,7 @@ static int check_auto_mute_availability(struct hda_codec *codec) | |||
| 4024 | snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid); | 4036 | snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid); |
| 4025 | snd_hda_jack_detect_enable_callback(codec, nid, | 4037 | snd_hda_jack_detect_enable_callback(codec, nid, |
| 4026 | HDA_GEN_FRONT_EVENT, | 4038 | HDA_GEN_FRONT_EVENT, |
| 4027 | spec->line_automute_hook ? | 4039 | call_line_automute); |
| 4028 | spec->line_automute_hook : | ||
| 4029 | snd_hda_gen_line_automute); | ||
| 4030 | spec->detect_lo = 1; | 4040 | spec->detect_lo = 1; |
| 4031 | } | 4041 | } |
| 4032 | spec->automute_lo_possible = spec->detect_hp; | 4042 | spec->automute_lo_possible = spec->detect_hp; |
| @@ -4068,9 +4078,7 @@ static bool auto_mic_check_imux(struct hda_codec *codec) | |||
| 4068 | snd_hda_jack_detect_enable_callback(codec, | 4078 | snd_hda_jack_detect_enable_callback(codec, |
| 4069 | spec->am_entry[i].pin, | 4079 | spec->am_entry[i].pin, |
| 4070 | HDA_GEN_MIC_EVENT, | 4080 | HDA_GEN_MIC_EVENT, |
| 4071 | spec->mic_autoswitch_hook ? | 4081 | call_mic_autoswitch); |
| 4072 | spec->mic_autoswitch_hook : | ||
| 4073 | snd_hda_gen_mic_autoswitch); | ||
| 4074 | return true; | 4082 | return true; |
| 4075 | } | 4083 | } |
| 4076 | 4084 | ||
diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h index 54e665160379..76200314ee95 100644 --- a/sound/pci/hda/hda_generic.h +++ b/sound/pci/hda/hda_generic.h | |||
| @@ -222,6 +222,7 @@ struct hda_gen_spec { | |||
| 222 | unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */ | 222 | unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */ |
| 223 | unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */ | 223 | unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */ |
| 224 | unsigned int own_eapd_ctl:1; /* set EAPD by own function */ | 224 | unsigned int own_eapd_ctl:1; /* set EAPD by own function */ |
| 225 | unsigned int keep_eapd_on:1; /* don't turn off EAPD automatically */ | ||
| 225 | unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */ | 226 | unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */ |
| 226 | unsigned int indep_hp:1; /* independent HP supported */ | 227 | unsigned int indep_hp:1; /* independent HP supported */ |
| 227 | unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */ | 228 | unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */ |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 59d2e91a9ab6..02e22b4458d2 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -3493,6 +3493,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 3493 | SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3493 | SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3494 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3494 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3495 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 3495 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
| 3496 | SND_PCI_QUIRK(0x1028, 0x05f8, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
| 3497 | SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
| 3496 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | 3498 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
| 3497 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), | 3499 | SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED), |
| 3498 | SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 3500 | SND_PCI_QUIRK(0x103c, 0x1973, "HP Pavilion", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
| @@ -3530,6 +3532,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
| 3530 | SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK), | 3532 | SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK), |
| 3531 | SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK), | 3533 | SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK), |
| 3532 | SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK), | 3534 | SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK), |
| 3535 | SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK), | ||
| 3533 | SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK), | 3536 | SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK), |
| 3534 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), | 3537 | SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K), |
| 3535 | SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), | 3538 | SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD), |
diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index e0dadcf2030d..e5245544eb52 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c | |||
| @@ -136,6 +136,7 @@ static struct via_spec *via_new_spec(struct hda_codec *codec) | |||
| 136 | spec->codec_type = VT1708S; | 136 | spec->codec_type = VT1708S; |
| 137 | spec->no_pin_power_ctl = 1; | 137 | spec->no_pin_power_ctl = 1; |
| 138 | spec->gen.indep_hp = 1; | 138 | spec->gen.indep_hp = 1; |
| 139 | spec->gen.keep_eapd_on = 1; | ||
| 139 | spec->gen.pcm_playback_hook = via_playback_pcm_hook; | 140 | spec->gen.pcm_playback_hook = via_playback_pcm_hook; |
| 140 | return spec; | 141 | return spec; |
| 141 | } | 142 | } |
| @@ -231,9 +232,14 @@ static void vt1708_update_hp_work(struct hda_codec *codec) | |||
| 231 | 232 | ||
| 232 | static void set_widgets_power_state(struct hda_codec *codec) | 233 | static void set_widgets_power_state(struct hda_codec *codec) |
| 233 | { | 234 | { |
| 235 | #if 0 /* FIXME: the assumed connections don't match always with the | ||
| 236 | * actual routes by the generic parser, so better to disable | ||
| 237 | * the control for safety. | ||
| 238 | */ | ||
| 234 | struct via_spec *spec = codec->spec; | 239 | struct via_spec *spec = codec->spec; |
| 235 | if (spec->set_widgets_power_state) | 240 | if (spec->set_widgets_power_state) |
| 236 | spec->set_widgets_power_state(codec); | 241 | spec->set_widgets_power_state(codec); |
| 242 | #endif | ||
| 237 | } | 243 | } |
| 238 | 244 | ||
| 239 | static void update_power_state(struct hda_codec *codec, hda_nid_t nid, | 245 | static void update_power_state(struct hda_codec *codec, hda_nid_t nid, |
| @@ -478,7 +484,9 @@ static int via_suspend(struct hda_codec *codec) | |||
| 478 | /* Fix pop noise on headphones */ | 484 | /* Fix pop noise on headphones */ |
| 479 | int i; | 485 | int i; |
| 480 | for (i = 0; i < spec->gen.autocfg.hp_outs; i++) | 486 | for (i = 0; i < spec->gen.autocfg.hp_outs; i++) |
| 481 | snd_hda_set_pin_ctl(codec, spec->gen.autocfg.hp_pins[i], 0); | 487 | snd_hda_codec_write(codec, spec->gen.autocfg.hp_pins[i], |
| 488 | 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
| 489 | 0x00); | ||
| 482 | } | 490 | } |
| 483 | 491 | ||
| 484 | return 0; | 492 | return 0; |
diff --git a/sound/pci/sis7019.c b/sound/pci/sis7019.c index d59abe1682c5..748e82d4d257 100644 --- a/sound/pci/sis7019.c +++ b/sound/pci/sis7019.c | |||
| @@ -1341,7 +1341,8 @@ static int sis_chip_create(struct snd_card *card, | |||
| 1341 | if (rc) | 1341 | if (rc) |
| 1342 | goto error_out; | 1342 | goto error_out; |
| 1343 | 1343 | ||
| 1344 | if (pci_set_dma_mask(pci, DMA_BIT_MASK(30)) < 0) { | 1344 | rc = pci_set_dma_mask(pci, DMA_BIT_MASK(30)); |
| 1345 | if (rc < 0) { | ||
| 1345 | dev_err(&pci->dev, "architecture does not support 30-bit PCI busmaster DMA"); | 1346 | dev_err(&pci->dev, "architecture does not support 30-bit PCI busmaster DMA"); |
| 1346 | goto error_out_enabled; | 1347 | goto error_out_enabled; |
| 1347 | } | 1348 | } |
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c index 7a7a0567e547..dfaf592d2fc9 100644 --- a/sound/soc/codecs/wm8962.c +++ b/sound/soc/codecs/wm8962.c | |||
| @@ -1601,7 +1601,6 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, | |||
| 1601 | struct snd_ctl_elem_value *ucontrol) | 1601 | struct snd_ctl_elem_value *ucontrol) |
| 1602 | { | 1602 | { |
| 1603 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); | 1603 | struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); |
| 1604 | u16 *reg_cache = codec->reg_cache; | ||
| 1605 | int ret; | 1604 | int ret; |
| 1606 | 1605 | ||
| 1607 | /* Apply the update (if any) */ | 1606 | /* Apply the update (if any) */ |
| @@ -1610,16 +1609,19 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol, | |||
| 1610 | return 0; | 1609 | return 0; |
| 1611 | 1610 | ||
| 1612 | /* If the left PGA is enabled hit that VU bit... */ | 1611 | /* If the left PGA is enabled hit that VU bit... */ |
| 1613 | if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTL_PGA_ENA) | 1612 | ret = snd_soc_read(codec, WM8962_PWR_MGMT_2); |
| 1614 | return snd_soc_write(codec, WM8962_HPOUTL_VOLUME, | 1613 | if (ret & WM8962_HPOUTL_PGA_ENA) { |
| 1615 | reg_cache[WM8962_HPOUTL_VOLUME]); | 1614 | snd_soc_write(codec, WM8962_HPOUTL_VOLUME, |
| 1615 | snd_soc_read(codec, WM8962_HPOUTL_VOLUME)); | ||
| 1616 | return 1; | ||
| 1617 | } | ||
| 1616 | 1618 | ||
| 1617 | /* ...otherwise the right. The VU is stereo. */ | 1619 | /* ...otherwise the right. The VU is stereo. */ |
| 1618 | if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTR_PGA_ENA) | 1620 | if (ret & WM8962_HPOUTR_PGA_ENA) |
| 1619 | return snd_soc_write(codec, WM8962_HPOUTR_VOLUME, | 1621 | snd_soc_write(codec, WM8962_HPOUTR_VOLUME, |
| 1620 | reg_cache[WM8962_HPOUTR_VOLUME]); | 1622 | snd_soc_read(codec, WM8962_HPOUTR_VOLUME)); |
| 1621 | 1623 | ||
| 1622 | return 0; | 1624 | return 1; |
| 1623 | } | 1625 | } |
| 1624 | 1626 | ||
| 1625 | /* The VU bits for the speakers are in a different register to the mute | 1627 | /* The VU bits for the speakers are in a different register to the mute |
| @@ -3375,8 +3377,7 @@ static int wm8962_probe(struct snd_soc_codec *codec) | |||
| 3375 | { | 3377 | { |
| 3376 | int ret; | 3378 | int ret; |
| 3377 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); | 3379 | struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec); |
| 3378 | struct wm8962_pdata *pdata = &wm8962->pdata; | 3380 | struct wm8962_pdata *pdata = dev_get_platdata(codec->dev); |
| 3379 | u16 *reg_cache = codec->reg_cache; | ||
| 3380 | int i, trigger, irq_pol; | 3381 | int i, trigger, irq_pol; |
| 3381 | bool dmicclk, dmicdat; | 3382 | bool dmicclk, dmicdat; |
| 3382 | 3383 | ||
| @@ -3431,10 +3432,11 @@ static int wm8962_probe(struct snd_soc_codec *codec) | |||
| 3431 | pdata->gpio_init[i] & 0xffff); | 3432 | pdata->gpio_init[i] & 0xffff); |
| 3432 | } | 3433 | } |
| 3433 | 3434 | ||
| 3435 | |||
| 3434 | /* Put the speakers into mono mode? */ | 3436 | /* Put the speakers into mono mode? */ |
| 3435 | if (pdata->spk_mono) | 3437 | if (pdata->spk_mono) |
| 3436 | reg_cache[WM8962_CLASS_D_CONTROL_2] | 3438 | snd_soc_update_bits(codec, WM8962_CLASS_D_CONTROL_2, |
| 3437 | |= WM8962_SPK_MONO; | 3439 | WM8962_SPK_MONO_MASK, WM8962_SPK_MONO); |
| 3438 | 3440 | ||
| 3439 | /* Micbias setup, detection enable and detection | 3441 | /* Micbias setup, detection enable and detection |
| 3440 | * threasholds. */ | 3442 | * threasholds. */ |
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index ca4739c3f650..e5c7f9f20fdd 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c | |||
| @@ -886,6 +886,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, | |||
| 886 | case USB_ID(0x046d, 0x0808): | 886 | case USB_ID(0x046d, 0x0808): |
| 887 | case USB_ID(0x046d, 0x0809): | 887 | case USB_ID(0x046d, 0x0809): |
| 888 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ | 888 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ |
| 889 | case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ | ||
| 889 | case USB_ID(0x046d, 0x0991): | 890 | case USB_ID(0x046d, 0x0991): |
| 890 | /* Most audio usb devices lie about volume resolution. | 891 | /* Most audio usb devices lie about volume resolution. |
| 891 | * Most Logitech webcams have res = 384. | 892 | * Most Logitech webcams have res = 384. |
diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h index 7f1722f82c89..8b75bcf136f6 100644 --- a/sound/usb/quirks-table.h +++ b/sound/usb/quirks-table.h | |||
| @@ -215,7 +215,13 @@ | |||
| 215 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL | 215 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL |
| 216 | }, | 216 | }, |
| 217 | { | 217 | { |
| 218 | USB_DEVICE(0x046d, 0x0990), | 218 | .match_flags = USB_DEVICE_ID_MATCH_DEVICE | |
| 219 | USB_DEVICE_ID_MATCH_INT_CLASS | | ||
| 220 | USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
| 221 | .idVendor = 0x046d, | ||
| 222 | .idProduct = 0x0990, | ||
| 223 | .bInterfaceClass = USB_CLASS_AUDIO, | ||
| 224 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
| 219 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | 225 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |
| 220 | .vendor_name = "Logitech, Inc.", | 226 | .vendor_name = "Logitech, Inc.", |
| 221 | .product_name = "QuickCam Pro 9000", | 227 | .product_name = "QuickCam Pro 9000", |
| @@ -1792,7 +1798,11 @@ YAMAHA_DEVICE(0x7010, "UB99"), | |||
| 1792 | USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108), | 1798 | USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108), |
| 1793 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | 1799 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { |
| 1794 | .ifnum = 0, | 1800 | .ifnum = 0, |
| 1795 | .type = QUIRK_MIDI_STANDARD_INTERFACE | 1801 | .type = QUIRK_MIDI_FIXED_ENDPOINT, |
| 1802 | .data = & (const struct snd_usb_midi_endpoint_info) { | ||
| 1803 | .out_cables = 0x0007, | ||
| 1804 | .in_cables = 0x0007 | ||
| 1805 | } | ||
| 1796 | } | 1806 | } |
| 1797 | }, | 1807 | }, |
| 1798 | { | 1808 | { |
