diff options
97 files changed, 821 insertions, 596 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 363e348bff9b..6c723811c0a0 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -2438,7 +2438,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
| 2438 | real-time workloads. It can also improve energy | 2438 | real-time workloads. It can also improve energy |
| 2439 | efficiency for asymmetric multiprocessors. | 2439 | efficiency for asymmetric multiprocessors. |
| 2440 | 2440 | ||
| 2441 | rcu_nocbs_poll [KNL,BOOT] | 2441 | rcu_nocb_poll [KNL,BOOT] |
| 2442 | Rather than requiring that offloaded CPUs | 2442 | Rather than requiring that offloaded CPUs |
| 2443 | (specified by rcu_nocbs= above) explicitly | 2443 | (specified by rcu_nocbs= above) explicitly |
| 2444 | awaken the corresponding "rcuoN" kthreads, | 2444 | awaken the corresponding "rcuoN" kthreads, |
diff --git a/Documentation/x86/boot.txt b/Documentation/x86/boot.txt index 3edb4c2887a1..e540fd67f767 100644 --- a/Documentation/x86/boot.txt +++ b/Documentation/x86/boot.txt | |||
| @@ -57,7 +57,7 @@ Protocol 2.10: (Kernel 2.6.31) Added a protocol for relaxed alignment | |||
| 57 | Protocol 2.11: (Kernel 3.6) Added a field for offset of EFI handover | 57 | Protocol 2.11: (Kernel 3.6) Added a field for offset of EFI handover |
| 58 | protocol entry point. | 58 | protocol entry point. |
| 59 | 59 | ||
| 60 | Protocol 2.12: (Kernel 3.9) Added the xloadflags field and extension fields | 60 | Protocol 2.12: (Kernel 3.8) Added the xloadflags field and extension fields |
| 61 | to struct boot_params for for loading bzImage and ramdisk | 61 | to struct boot_params for for loading bzImage and ramdisk |
| 62 | above 4G in 64bit. | 62 | above 4G in 64bit. |
| 63 | 63 | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 212c255b9347..35a56bcd5e75 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1489,7 +1489,7 @@ AVR32 ARCHITECTURE | |||
| 1489 | M: Haavard Skinnemoen <hskinnemoen@gmail.com> | 1489 | M: Haavard Skinnemoen <hskinnemoen@gmail.com> |
| 1490 | M: Hans-Christian Egtvedt <egtvedt@samfundet.no> | 1490 | M: Hans-Christian Egtvedt <egtvedt@samfundet.no> |
| 1491 | W: http://www.atmel.com/products/AVR32/ | 1491 | W: http://www.atmel.com/products/AVR32/ |
| 1492 | W: http://avr32linux.org/ | 1492 | W: http://mirror.egtvedt.no/avr32linux.org/ |
| 1493 | W: http://avrfreaks.net/ | 1493 | W: http://avrfreaks.net/ |
| 1494 | S: Maintained | 1494 | S: Maintained |
| 1495 | F: arch/avr32/ | 1495 | F: arch/avr32/ |
diff --git a/arch/avr32/include/asm/dma-mapping.h b/arch/avr32/include/asm/dma-mapping.h index aaf5199d8fcb..b3d18f9f3e8d 100644 --- a/arch/avr32/include/asm/dma-mapping.h +++ b/arch/avr32/include/asm/dma-mapping.h | |||
| @@ -336,4 +336,14 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, | |||
| 336 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | 336 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) |
| 337 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | 337 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) |
| 338 | 338 | ||
| 339 | /* drivers/base/dma-mapping.c */ | ||
| 340 | extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, | ||
| 341 | void *cpu_addr, dma_addr_t dma_addr, size_t size); | ||
| 342 | extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, | ||
| 343 | void *cpu_addr, dma_addr_t dma_addr, | ||
| 344 | size_t size); | ||
| 345 | |||
| 346 | #define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s) | ||
| 347 | #define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s) | ||
| 348 | |||
| 339 | #endif /* __ASM_AVR32_DMA_MAPPING_H */ | 349 | #endif /* __ASM_AVR32_DMA_MAPPING_H */ |
diff --git a/arch/blackfin/include/asm/dma-mapping.h b/arch/blackfin/include/asm/dma-mapping.h index bbf461076a0a..054d9ec57d9d 100644 --- a/arch/blackfin/include/asm/dma-mapping.h +++ b/arch/blackfin/include/asm/dma-mapping.h | |||
| @@ -154,4 +154,14 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t size, | |||
| 154 | _dma_sync((dma_addr_t)vaddr, size, dir); | 154 | _dma_sync((dma_addr_t)vaddr, size, dir); |
| 155 | } | 155 | } |
| 156 | 156 | ||
| 157 | /* drivers/base/dma-mapping.c */ | ||
| 158 | extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, | ||
| 159 | void *cpu_addr, dma_addr_t dma_addr, size_t size); | ||
| 160 | extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, | ||
| 161 | void *cpu_addr, dma_addr_t dma_addr, | ||
| 162 | size_t size); | ||
| 163 | |||
| 164 | #define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s) | ||
| 165 | #define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s) | ||
| 166 | |||
| 157 | #endif /* _BLACKFIN_DMA_MAPPING_H */ | 167 | #endif /* _BLACKFIN_DMA_MAPPING_H */ |
diff --git a/arch/c6x/include/asm/dma-mapping.h b/arch/c6x/include/asm/dma-mapping.h index 3c694065030f..88bd0d899bdb 100644 --- a/arch/c6x/include/asm/dma-mapping.h +++ b/arch/c6x/include/asm/dma-mapping.h | |||
| @@ -89,4 +89,19 @@ extern void dma_free_coherent(struct device *, size_t, void *, dma_addr_t); | |||
| 89 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent((d), (s), (h), (f)) | 89 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent((d), (s), (h), (f)) |
| 90 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent((d), (s), (v), (h)) | 90 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent((d), (s), (v), (h)) |
| 91 | 91 | ||
| 92 | /* Not supported for now */ | ||
| 93 | static inline int dma_mmap_coherent(struct device *dev, | ||
| 94 | struct vm_area_struct *vma, void *cpu_addr, | ||
| 95 | dma_addr_t dma_addr, size_t size) | ||
| 96 | { | ||
| 97 | return -EINVAL; | ||
| 98 | } | ||
| 99 | |||
| 100 | static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, | ||
| 101 | void *cpu_addr, dma_addr_t dma_addr, | ||
| 102 | size_t size) | ||
| 103 | { | ||
| 104 | return -EINVAL; | ||
| 105 | } | ||
| 106 | |||
| 92 | #endif /* _ASM_C6X_DMA_MAPPING_H */ | 107 | #endif /* _ASM_C6X_DMA_MAPPING_H */ |
diff --git a/arch/cris/include/asm/dma-mapping.h b/arch/cris/include/asm/dma-mapping.h index 8588b2ccf854..2f0f654f1b44 100644 --- a/arch/cris/include/asm/dma-mapping.h +++ b/arch/cris/include/asm/dma-mapping.h | |||
| @@ -158,5 +158,15 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t size, | |||
| 158 | { | 158 | { |
| 159 | } | 159 | } |
| 160 | 160 | ||
| 161 | /* drivers/base/dma-mapping.c */ | ||
| 162 | extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, | ||
| 163 | void *cpu_addr, dma_addr_t dma_addr, size_t size); | ||
| 164 | extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, | ||
| 165 | void *cpu_addr, dma_addr_t dma_addr, | ||
| 166 | size_t size); | ||
| 167 | |||
| 168 | #define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s) | ||
| 169 | #define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s) | ||
| 170 | |||
| 161 | 171 | ||
| 162 | #endif | 172 | #endif |
diff --git a/arch/frv/include/asm/dma-mapping.h b/arch/frv/include/asm/dma-mapping.h index dfb811002c64..1746a2b8e6e7 100644 --- a/arch/frv/include/asm/dma-mapping.h +++ b/arch/frv/include/asm/dma-mapping.h | |||
| @@ -132,4 +132,19 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size, | |||
| 132 | flush_write_buffers(); | 132 | flush_write_buffers(); |
| 133 | } | 133 | } |
| 134 | 134 | ||
| 135 | /* Not supported for now */ | ||
| 136 | static inline int dma_mmap_coherent(struct device *dev, | ||
| 137 | struct vm_area_struct *vma, void *cpu_addr, | ||
| 138 | dma_addr_t dma_addr, size_t size) | ||
| 139 | { | ||
| 140 | return -EINVAL; | ||
| 141 | } | ||
| 142 | |||
| 143 | static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, | ||
| 144 | void *cpu_addr, dma_addr_t dma_addr, | ||
| 145 | size_t size) | ||
| 146 | { | ||
| 147 | return -EINVAL; | ||
| 148 | } | ||
| 149 | |||
| 135 | #endif /* _ASM_DMA_MAPPING_H */ | 150 | #endif /* _ASM_DMA_MAPPING_H */ |
diff --git a/arch/m68k/include/asm/dma-mapping.h b/arch/m68k/include/asm/dma-mapping.h index 3e6b8445af6a..292805f0762e 100644 --- a/arch/m68k/include/asm/dma-mapping.h +++ b/arch/m68k/include/asm/dma-mapping.h | |||
| @@ -115,4 +115,14 @@ static inline int dma_mapping_error(struct device *dev, dma_addr_t handle) | |||
| 115 | #include <asm-generic/dma-mapping-broken.h> | 115 | #include <asm-generic/dma-mapping-broken.h> |
| 116 | #endif | 116 | #endif |
| 117 | 117 | ||
| 118 | /* drivers/base/dma-mapping.c */ | ||
| 119 | extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, | ||
| 120 | void *cpu_addr, dma_addr_t dma_addr, size_t size); | ||
| 121 | extern int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, | ||
| 122 | void *cpu_addr, dma_addr_t dma_addr, | ||
| 123 | size_t size); | ||
| 124 | |||
| 125 | #define dma_mmap_coherent(d, v, c, h, s) dma_common_mmap(d, v, c, h, s) | ||
| 126 | #define dma_get_sgtable(d, t, v, h, s) dma_common_get_sgtable(d, t, v, h, s) | ||
| 127 | |||
| 118 | #endif /* _M68K_DMA_MAPPING_H */ | 128 | #endif /* _M68K_DMA_MAPPING_H */ |
diff --git a/arch/mn10300/include/asm/dma-mapping.h b/arch/mn10300/include/asm/dma-mapping.h index c1be4397b1ed..a18abfc558eb 100644 --- a/arch/mn10300/include/asm/dma-mapping.h +++ b/arch/mn10300/include/asm/dma-mapping.h | |||
| @@ -168,4 +168,19 @@ void dma_cache_sync(void *vaddr, size_t size, | |||
| 168 | mn10300_dcache_flush_inv(); | 168 | mn10300_dcache_flush_inv(); |
| 169 | } | 169 | } |
| 170 | 170 | ||
| 171 | /* Not supported for now */ | ||
| 172 | static inline int dma_mmap_coherent(struct device *dev, | ||
| 173 | struct vm_area_struct *vma, void *cpu_addr, | ||
| 174 | dma_addr_t dma_addr, size_t size) | ||
| 175 | { | ||
| 176 | return -EINVAL; | ||
| 177 | } | ||
| 178 | |||
| 179 | static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, | ||
| 180 | void *cpu_addr, dma_addr_t dma_addr, | ||
| 181 | size_t size) | ||
| 182 | { | ||
| 183 | return -EINVAL; | ||
| 184 | } | ||
| 185 | |||
| 171 | #endif | 186 | #endif |
diff --git a/arch/parisc/include/asm/dma-mapping.h b/arch/parisc/include/asm/dma-mapping.h index 467bbd510eac..106b395688e1 100644 --- a/arch/parisc/include/asm/dma-mapping.h +++ b/arch/parisc/include/asm/dma-mapping.h | |||
| @@ -238,4 +238,19 @@ void * sba_get_iommu(struct parisc_device *dev); | |||
| 238 | /* At the moment, we panic on error for IOMMU resource exaustion */ | 238 | /* At the moment, we panic on error for IOMMU resource exaustion */ |
| 239 | #define dma_mapping_error(dev, x) 0 | 239 | #define dma_mapping_error(dev, x) 0 |
| 240 | 240 | ||
| 241 | /* This API cannot be supported on PA-RISC */ | ||
| 242 | static inline int dma_mmap_coherent(struct device *dev, | ||
| 243 | struct vm_area_struct *vma, void *cpu_addr, | ||
| 244 | dma_addr_t dma_addr, size_t size) | ||
| 245 | { | ||
| 246 | return -EINVAL; | ||
| 247 | } | ||
| 248 | |||
| 249 | static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, | ||
| 250 | void *cpu_addr, dma_addr_t dma_addr, | ||
| 251 | size_t size) | ||
| 252 | { | ||
| 253 | return -EINVAL; | ||
| 254 | } | ||
| 255 | |||
| 241 | #endif | 256 | #endif |
diff --git a/arch/powerpc/mm/hash_low_64.S b/arch/powerpc/mm/hash_low_64.S index 56585086413a..7443481a315c 100644 --- a/arch/powerpc/mm/hash_low_64.S +++ b/arch/powerpc/mm/hash_low_64.S | |||
| @@ -115,11 +115,13 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
| 115 | sldi r29,r5,SID_SHIFT - VPN_SHIFT | 115 | sldi r29,r5,SID_SHIFT - VPN_SHIFT |
| 116 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) | 116 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) |
| 117 | or r29,r28,r29 | 117 | or r29,r28,r29 |
| 118 | 118 | /* | |
| 119 | /* Calculate hash value for primary slot and store it in r28 */ | 119 | * Calculate hash value for primary slot and store it in r28 |
| 120 | rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ | 120 | * r3 = va, r5 = vsid |
| 121 | rldicl r0,r3,64-12,48 /* (ea >> 12) & 0xffff */ | 121 | * r0 = (va >> 12) & ((1ul << (28 - 12)) -1) |
| 122 | xor r28,r5,r0 | 122 | */ |
| 123 | rldicl r0,r3,64-12,48 | ||
| 124 | xor r28,r5,r0 /* hash */ | ||
| 123 | b 4f | 125 | b 4f |
| 124 | 126 | ||
| 125 | 3: /* Calc vpn and put it in r29 */ | 127 | 3: /* Calc vpn and put it in r29 */ |
| @@ -130,11 +132,12 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
| 130 | /* | 132 | /* |
| 131 | * calculate hash value for primary slot and | 133 | * calculate hash value for primary slot and |
| 132 | * store it in r28 for 1T segment | 134 | * store it in r28 for 1T segment |
| 135 | * r3 = va, r5 = vsid | ||
| 133 | */ | 136 | */ |
| 134 | rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ | 137 | sldi r28,r5,25 /* vsid << 25 */ |
| 135 | clrldi r5,r5,40 /* vsid & 0xffffff */ | 138 | /* r0 = (va >> 12) & ((1ul << (40 - 12)) -1) */ |
| 136 | rldicl r0,r3,64-12,36 /* (ea >> 12) & 0xfffffff */ | 139 | rldicl r0,r3,64-12,36 |
| 137 | xor r28,r28,r5 | 140 | xor r28,r28,r5 /* vsid ^ ( vsid << 25) */ |
| 138 | xor r28,r28,r0 /* hash */ | 141 | xor r28,r28,r0 /* hash */ |
| 139 | 142 | ||
| 140 | /* Convert linux PTE bits into HW equivalents */ | 143 | /* Convert linux PTE bits into HW equivalents */ |
| @@ -407,11 +410,13 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
| 407 | */ | 410 | */ |
| 408 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) | 411 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) |
| 409 | or r29,r28,r29 | 412 | or r29,r28,r29 |
| 410 | 413 | /* | |
| 411 | /* Calculate hash value for primary slot and store it in r28 */ | 414 | * Calculate hash value for primary slot and store it in r28 |
| 412 | rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ | 415 | * r3 = va, r5 = vsid |
| 413 | rldicl r0,r3,64-12,48 /* (ea >> 12) & 0xffff */ | 416 | * r0 = (va >> 12) & ((1ul << (28 - 12)) -1) |
| 414 | xor r28,r5,r0 | 417 | */ |
| 418 | rldicl r0,r3,64-12,48 | ||
| 419 | xor r28,r5,r0 /* hash */ | ||
| 415 | b 4f | 420 | b 4f |
| 416 | 421 | ||
| 417 | 3: /* Calc vpn and put it in r29 */ | 422 | 3: /* Calc vpn and put it in r29 */ |
| @@ -426,11 +431,12 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
| 426 | /* | 431 | /* |
| 427 | * Calculate hash value for primary slot and | 432 | * Calculate hash value for primary slot and |
| 428 | * store it in r28 for 1T segment | 433 | * store it in r28 for 1T segment |
| 434 | * r3 = va, r5 = vsid | ||
| 429 | */ | 435 | */ |
| 430 | rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ | 436 | sldi r28,r5,25 /* vsid << 25 */ |
| 431 | clrldi r5,r5,40 /* vsid & 0xffffff */ | 437 | /* r0 = (va >> 12) & ((1ul << (40 - 12)) -1) */ |
| 432 | rldicl r0,r3,64-12,36 /* (ea >> 12) & 0xfffffff */ | 438 | rldicl r0,r3,64-12,36 |
| 433 | xor r28,r28,r5 | 439 | xor r28,r28,r5 /* vsid ^ ( vsid << 25) */ |
| 434 | xor r28,r28,r0 /* hash */ | 440 | xor r28,r28,r0 /* hash */ |
| 435 | 441 | ||
| 436 | /* Convert linux PTE bits into HW equivalents */ | 442 | /* Convert linux PTE bits into HW equivalents */ |
| @@ -752,25 +758,27 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
| 752 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) | 758 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT - VPN_SHIFT) |
| 753 | or r29,r28,r29 | 759 | or r29,r28,r29 |
| 754 | 760 | ||
| 755 | /* Calculate hash value for primary slot and store it in r28 */ | 761 | /* Calculate hash value for primary slot and store it in r28 |
| 756 | rldicl r5,r5,0,25 /* vsid & 0x0000007fffffffff */ | 762 | * r3 = va, r5 = vsid |
| 757 | rldicl r0,r3,64-16,52 /* (ea >> 16) & 0xfff */ | 763 | * r0 = (va >> 16) & ((1ul << (28 - 16)) -1) |
| 758 | xor r28,r5,r0 | 764 | */ |
| 765 | rldicl r0,r3,64-16,52 | ||
| 766 | xor r28,r5,r0 /* hash */ | ||
| 759 | b 4f | 767 | b 4f |
| 760 | 768 | ||
| 761 | 3: /* Calc vpn and put it in r29 */ | 769 | 3: /* Calc vpn and put it in r29 */ |
| 762 | sldi r29,r5,SID_SHIFT_1T - VPN_SHIFT | 770 | sldi r29,r5,SID_SHIFT_1T - VPN_SHIFT |
| 763 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT_1T - VPN_SHIFT) | 771 | rldicl r28,r3,64 - VPN_SHIFT,64 - (SID_SHIFT_1T - VPN_SHIFT) |
| 764 | or r29,r28,r29 | 772 | or r29,r28,r29 |
| 765 | |||
| 766 | /* | 773 | /* |
| 767 | * calculate hash value for primary slot and | 774 | * calculate hash value for primary slot and |
| 768 | * store it in r28 for 1T segment | 775 | * store it in r28 for 1T segment |
| 776 | * r3 = va, r5 = vsid | ||
| 769 | */ | 777 | */ |
| 770 | rldic r28,r5,25,25 /* (vsid << 25) & 0x7fffffffff */ | 778 | sldi r28,r5,25 /* vsid << 25 */ |
| 771 | clrldi r5,r5,40 /* vsid & 0xffffff */ | 779 | /* r0 = (va >> 16) & ((1ul << (40 - 16)) -1) */ |
| 772 | rldicl r0,r3,64-16,40 /* (ea >> 16) & 0xffffff */ | 780 | rldicl r0,r3,64-16,40 |
| 773 | xor r28,r28,r5 | 781 | xor r28,r28,r5 /* vsid ^ ( vsid << 25) */ |
| 774 | xor r28,r28,r0 /* hash */ | 782 | xor r28,r28,r0 /* hash */ |
| 775 | 783 | ||
| 776 | /* Convert linux PTE bits into HW equivalents */ | 784 | /* Convert linux PTE bits into HW equivalents */ |
diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S index 102ff7cb3e41..142c4ceff112 100644 --- a/arch/x86/ia32/ia32entry.S +++ b/arch/x86/ia32/ia32entry.S | |||
| @@ -207,7 +207,7 @@ sysexit_from_sys_call: | |||
| 207 | testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) | 207 | testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
| 208 | jnz ia32_ret_from_sys_call | 208 | jnz ia32_ret_from_sys_call |
| 209 | TRACE_IRQS_ON | 209 | TRACE_IRQS_ON |
| 210 | sti | 210 | ENABLE_INTERRUPTS(CLBR_NONE) |
| 211 | movl %eax,%esi /* second arg, syscall return value */ | 211 | movl %eax,%esi /* second arg, syscall return value */ |
| 212 | cmpl $-MAX_ERRNO,%eax /* is it an error ? */ | 212 | cmpl $-MAX_ERRNO,%eax /* is it an error ? */ |
| 213 | jbe 1f | 213 | jbe 1f |
| @@ -217,7 +217,7 @@ sysexit_from_sys_call: | |||
| 217 | call __audit_syscall_exit | 217 | call __audit_syscall_exit |
| 218 | movq RAX-ARGOFFSET(%rsp),%rax /* reload syscall return value */ | 218 | movq RAX-ARGOFFSET(%rsp),%rax /* reload syscall return value */ |
| 219 | movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi | 219 | movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi |
| 220 | cli | 220 | DISABLE_INTERRUPTS(CLBR_NONE) |
| 221 | TRACE_IRQS_OFF | 221 | TRACE_IRQS_OFF |
| 222 | testl %edi,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) | 222 | testl %edi,TI_flags+THREAD_INFO(%rsp,RIP-ARGOFFSET) |
| 223 | jz \exit | 223 | jz \exit |
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index fe9edec6698a..84c1309c4c0c 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
| @@ -298,8 +298,7 @@ struct _cache_attr { | |||
| 298 | unsigned int); | 298 | unsigned int); |
| 299 | }; | 299 | }; |
| 300 | 300 | ||
| 301 | #ifdef CONFIG_AMD_NB | 301 | #if defined(CONFIG_AMD_NB) && defined(CONFIG_SYSFS) |
| 302 | |||
| 303 | /* | 302 | /* |
| 304 | * L3 cache descriptors | 303 | * L3 cache descriptors |
| 305 | */ | 304 | */ |
| @@ -524,9 +523,9 @@ store_subcaches(struct _cpuid4_info *this_leaf, const char *buf, size_t count, | |||
| 524 | static struct _cache_attr subcaches = | 523 | static struct _cache_attr subcaches = |
| 525 | __ATTR(subcaches, 0644, show_subcaches, store_subcaches); | 524 | __ATTR(subcaches, 0644, show_subcaches, store_subcaches); |
| 526 | 525 | ||
| 527 | #else /* CONFIG_AMD_NB */ | 526 | #else |
| 528 | #define amd_init_l3_cache(x, y) | 527 | #define amd_init_l3_cache(x, y) |
| 529 | #endif /* CONFIG_AMD_NB */ | 528 | #endif /* CONFIG_AMD_NB && CONFIG_SYSFS */ |
| 530 | 529 | ||
| 531 | static int | 530 | static int |
| 532 | __cpuinit cpuid4_cache_lookup_regs(int index, | 531 | __cpuinit cpuid4_cache_lookup_regs(int index, |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 93b9e1181f83..4914e94ad6e8 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -2019,7 +2019,10 @@ __init int intel_pmu_init(void) | |||
| 2019 | break; | 2019 | break; |
| 2020 | 2020 | ||
| 2021 | case 28: /* Atom */ | 2021 | case 28: /* Atom */ |
| 2022 | case 54: /* Cedariew */ | 2022 | case 38: /* Lincroft */ |
| 2023 | case 39: /* Penwell */ | ||
| 2024 | case 53: /* Cloverview */ | ||
| 2025 | case 54: /* Cedarview */ | ||
| 2023 | memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, | 2026 | memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, |
| 2024 | sizeof(hw_cache_event_ids)); | 2027 | sizeof(hw_cache_event_ids)); |
| 2025 | 2028 | ||
| @@ -2084,6 +2087,7 @@ __init int intel_pmu_init(void) | |||
| 2084 | pr_cont("SandyBridge events, "); | 2087 | pr_cont("SandyBridge events, "); |
| 2085 | break; | 2088 | break; |
| 2086 | case 58: /* IvyBridge */ | 2089 | case 58: /* IvyBridge */ |
| 2090 | case 62: /* IvyBridge EP */ | ||
| 2087 | memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, | 2091 | memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, |
| 2088 | sizeof(hw_cache_event_ids)); | 2092 | sizeof(hw_cache_event_ids)); |
| 2089 | memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, | 2093 | memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, |
diff --git a/arch/x86/kernel/cpu/perf_event_p6.c b/arch/x86/kernel/cpu/perf_event_p6.c index f2af39f5dc3d..4820c232a0b9 100644 --- a/arch/x86/kernel/cpu/perf_event_p6.c +++ b/arch/x86/kernel/cpu/perf_event_p6.c | |||
| @@ -19,7 +19,7 @@ static const u64 p6_perfmon_event_map[] = | |||
| 19 | 19 | ||
| 20 | }; | 20 | }; |
| 21 | 21 | ||
| 22 | static __initconst u64 p6_hw_cache_event_ids | 22 | static u64 p6_hw_cache_event_ids |
| 23 | [PERF_COUNT_HW_CACHE_MAX] | 23 | [PERF_COUNT_HW_CACHE_MAX] |
| 24 | [PERF_COUNT_HW_CACHE_OP_MAX] | 24 | [PERF_COUNT_HW_CACHE_OP_MAX] |
| 25 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = | 25 | [PERF_COUNT_HW_CACHE_RESULT_MAX] = |
diff --git a/arch/x86/tools/insn_sanity.c b/arch/x86/tools/insn_sanity.c index cc2f8c131286..872eb60e7806 100644 --- a/arch/x86/tools/insn_sanity.c +++ b/arch/x86/tools/insn_sanity.c | |||
| @@ -55,7 +55,7 @@ static FILE *input_file; /* Input file name */ | |||
| 55 | static void usage(const char *err) | 55 | static void usage(const char *err) |
| 56 | { | 56 | { |
| 57 | if (err) | 57 | if (err) |
| 58 | fprintf(stderr, "Error: %s\n\n", err); | 58 | fprintf(stderr, "%s: Error: %s\n\n", prog, err); |
| 59 | fprintf(stderr, "Usage: %s [-y|-n|-v] [-s seed[,no]] [-m max] [-i input]\n", prog); | 59 | fprintf(stderr, "Usage: %s [-y|-n|-v] [-s seed[,no]] [-m max] [-i input]\n", prog); |
| 60 | fprintf(stderr, "\t-y 64bit mode\n"); | 60 | fprintf(stderr, "\t-y 64bit mode\n"); |
| 61 | fprintf(stderr, "\t-n 32bit mode\n"); | 61 | fprintf(stderr, "\t-n 32bit mode\n"); |
| @@ -269,7 +269,13 @@ int main(int argc, char **argv) | |||
| 269 | insns++; | 269 | insns++; |
| 270 | } | 270 | } |
| 271 | 271 | ||
| 272 | fprintf(stdout, "%s: decoded and checked %d %s instructions with %d errors (seed:0x%x)\n", (errors) ? "Failure" : "Success", insns, (input_file) ? "given" : "random", errors, seed); | 272 | fprintf(stdout, "%s: %s: decoded and checked %d %s instructions with %d errors (seed:0x%x)\n", |
| 273 | prog, | ||
| 274 | (errors) ? "Failure" : "Success", | ||
| 275 | insns, | ||
| 276 | (input_file) ? "given" : "random", | ||
| 277 | errors, | ||
| 278 | seed); | ||
| 273 | 279 | ||
| 274 | return errors ? 1 : 0; | 280 | return errors ? 1 : 0; |
| 275 | } | 281 | } |
diff --git a/arch/xtensa/include/asm/dma-mapping.h b/arch/xtensa/include/asm/dma-mapping.h index 4acb5feba1fb..172a02a6ad14 100644 --- a/arch/xtensa/include/asm/dma-mapping.h +++ b/arch/xtensa/include/asm/dma-mapping.h | |||
| @@ -170,4 +170,19 @@ dma_cache_sync(struct device *dev, void *vaddr, size_t size, | |||
| 170 | consistent_sync(vaddr, size, direction); | 170 | consistent_sync(vaddr, size, direction); |
| 171 | } | 171 | } |
| 172 | 172 | ||
| 173 | /* Not supported for now */ | ||
| 174 | static inline int dma_mmap_coherent(struct device *dev, | ||
| 175 | struct vm_area_struct *vma, void *cpu_addr, | ||
| 176 | dma_addr_t dma_addr, size_t size) | ||
| 177 | { | ||
| 178 | return -EINVAL; | ||
| 179 | } | ||
| 180 | |||
| 181 | static inline int dma_get_sgtable(struct device *dev, struct sg_table *sgt, | ||
| 182 | void *cpu_addr, dma_addr_t dma_addr, | ||
| 183 | size_t size) | ||
| 184 | { | ||
| 185 | return -EINVAL; | ||
| 186 | } | ||
| 187 | |||
| 173 | #endif /* _XTENSA_DMA_MAPPING_H */ | 188 | #endif /* _XTENSA_DMA_MAPPING_H */ |
diff --git a/block/genhd.c b/block/genhd.c index 9a289d7c84bb..3993ebf4135f 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
| @@ -35,6 +35,8 @@ static DEFINE_IDR(ext_devt_idr); | |||
| 35 | 35 | ||
| 36 | static struct device_type disk_type; | 36 | static struct device_type disk_type; |
| 37 | 37 | ||
| 38 | static void disk_check_events(struct disk_events *ev, | ||
| 39 | unsigned int *clearing_ptr); | ||
| 38 | static void disk_alloc_events(struct gendisk *disk); | 40 | static void disk_alloc_events(struct gendisk *disk); |
| 39 | static void disk_add_events(struct gendisk *disk); | 41 | static void disk_add_events(struct gendisk *disk); |
| 40 | static void disk_del_events(struct gendisk *disk); | 42 | static void disk_del_events(struct gendisk *disk); |
| @@ -1549,6 +1551,7 @@ unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask) | |||
| 1549 | const struct block_device_operations *bdops = disk->fops; | 1551 | const struct block_device_operations *bdops = disk->fops; |
| 1550 | struct disk_events *ev = disk->ev; | 1552 | struct disk_events *ev = disk->ev; |
| 1551 | unsigned int pending; | 1553 | unsigned int pending; |
| 1554 | unsigned int clearing = mask; | ||
| 1552 | 1555 | ||
| 1553 | if (!ev) { | 1556 | if (!ev) { |
| 1554 | /* for drivers still using the old ->media_changed method */ | 1557 | /* for drivers still using the old ->media_changed method */ |
| @@ -1558,34 +1561,53 @@ unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask) | |||
| 1558 | return 0; | 1561 | return 0; |
| 1559 | } | 1562 | } |
| 1560 | 1563 | ||
| 1561 | /* tell the workfn about the events being cleared */ | 1564 | disk_block_events(disk); |
| 1565 | |||
| 1566 | /* | ||
| 1567 | * store the union of mask and ev->clearing on the stack so that the | ||
| 1568 | * race with disk_flush_events does not cause ambiguity (ev->clearing | ||
| 1569 | * can still be modified even if events are blocked). | ||
| 1570 | */ | ||
| 1562 | spin_lock_irq(&ev->lock); | 1571 | spin_lock_irq(&ev->lock); |
| 1563 | ev->clearing |= mask; | 1572 | clearing |= ev->clearing; |
| 1573 | ev->clearing = 0; | ||
| 1564 | spin_unlock_irq(&ev->lock); | 1574 | spin_unlock_irq(&ev->lock); |
| 1565 | 1575 | ||
| 1566 | /* uncondtionally schedule event check and wait for it to finish */ | 1576 | disk_check_events(ev, &clearing); |
| 1567 | disk_block_events(disk); | 1577 | /* |
| 1568 | queue_delayed_work(system_freezable_wq, &ev->dwork, 0); | 1578 | * if ev->clearing is not 0, the disk_flush_events got called in the |
| 1569 | flush_delayed_work(&ev->dwork); | 1579 | * middle of this function, so we want to run the workfn without delay. |
| 1570 | __disk_unblock_events(disk, false); | 1580 | */ |
| 1581 | __disk_unblock_events(disk, ev->clearing ? true : false); | ||
| 1571 | 1582 | ||
| 1572 | /* then, fetch and clear pending events */ | 1583 | /* then, fetch and clear pending events */ |
| 1573 | spin_lock_irq(&ev->lock); | 1584 | spin_lock_irq(&ev->lock); |
| 1574 | WARN_ON_ONCE(ev->clearing & mask); /* cleared by workfn */ | ||
| 1575 | pending = ev->pending & mask; | 1585 | pending = ev->pending & mask; |
| 1576 | ev->pending &= ~mask; | 1586 | ev->pending &= ~mask; |
| 1577 | spin_unlock_irq(&ev->lock); | 1587 | spin_unlock_irq(&ev->lock); |
| 1588 | WARN_ON_ONCE(clearing & mask); | ||
| 1578 | 1589 | ||
| 1579 | return pending; | 1590 | return pending; |
| 1580 | } | 1591 | } |
| 1581 | 1592 | ||
| 1593 | /* | ||
| 1594 | * Separate this part out so that a different pointer for clearing_ptr can be | ||
| 1595 | * passed in for disk_clear_events. | ||
| 1596 | */ | ||
| 1582 | static void disk_events_workfn(struct work_struct *work) | 1597 | static void disk_events_workfn(struct work_struct *work) |
| 1583 | { | 1598 | { |
| 1584 | struct delayed_work *dwork = to_delayed_work(work); | 1599 | struct delayed_work *dwork = to_delayed_work(work); |
| 1585 | struct disk_events *ev = container_of(dwork, struct disk_events, dwork); | 1600 | struct disk_events *ev = container_of(dwork, struct disk_events, dwork); |
| 1601 | |||
| 1602 | disk_check_events(ev, &ev->clearing); | ||
| 1603 | } | ||
| 1604 | |||
| 1605 | static void disk_check_events(struct disk_events *ev, | ||
| 1606 | unsigned int *clearing_ptr) | ||
| 1607 | { | ||
| 1586 | struct gendisk *disk = ev->disk; | 1608 | struct gendisk *disk = ev->disk; |
| 1587 | char *envp[ARRAY_SIZE(disk_uevents) + 1] = { }; | 1609 | char *envp[ARRAY_SIZE(disk_uevents) + 1] = { }; |
| 1588 | unsigned int clearing = ev->clearing; | 1610 | unsigned int clearing = *clearing_ptr; |
| 1589 | unsigned int events; | 1611 | unsigned int events; |
| 1590 | unsigned long intv; | 1612 | unsigned long intv; |
| 1591 | int nr_events = 0, i; | 1613 | int nr_events = 0, i; |
| @@ -1598,7 +1620,7 @@ static void disk_events_workfn(struct work_struct *work) | |||
| 1598 | 1620 | ||
| 1599 | events &= ~ev->pending; | 1621 | events &= ~ev->pending; |
| 1600 | ev->pending |= events; | 1622 | ev->pending |= events; |
| 1601 | ev->clearing &= ~clearing; | 1623 | *clearing_ptr &= ~clearing; |
| 1602 | 1624 | ||
| 1603 | intv = disk_events_poll_jiffies(disk); | 1625 | intv = disk_events_poll_jiffies(disk); |
| 1604 | if (!ev->block && intv) | 1626 | if (!ev->block && intv) |
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index f58a4a4b4dfb..2b8303ad63c9 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c | |||
| @@ -168,7 +168,7 @@ static void wake_all_senders(struct drbd_tconn *tconn) { | |||
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | /* must hold resource->req_lock */ | 170 | /* must hold resource->req_lock */ |
| 171 | static void start_new_tl_epoch(struct drbd_tconn *tconn) | 171 | void start_new_tl_epoch(struct drbd_tconn *tconn) |
| 172 | { | 172 | { |
| 173 | /* no point closing an epoch, if it is empty, anyways. */ | 173 | /* no point closing an epoch, if it is empty, anyways. */ |
| 174 | if (tconn->current_tle_writes == 0) | 174 | if (tconn->current_tle_writes == 0) |
diff --git a/drivers/block/drbd/drbd_req.h b/drivers/block/drbd/drbd_req.h index 016de6b8bb57..c08d22964d06 100644 --- a/drivers/block/drbd/drbd_req.h +++ b/drivers/block/drbd/drbd_req.h | |||
| @@ -267,6 +267,7 @@ struct bio_and_error { | |||
| 267 | int error; | 267 | int error; |
| 268 | }; | 268 | }; |
| 269 | 269 | ||
| 270 | extern void start_new_tl_epoch(struct drbd_tconn *tconn); | ||
| 270 | extern void drbd_req_destroy(struct kref *kref); | 271 | extern void drbd_req_destroy(struct kref *kref); |
| 271 | extern void _req_may_be_done(struct drbd_request *req, | 272 | extern void _req_may_be_done(struct drbd_request *req, |
| 272 | struct bio_and_error *m); | 273 | struct bio_and_error *m); |
diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c index 53bf6182bac4..0fe220cfb9e9 100644 --- a/drivers/block/drbd/drbd_state.c +++ b/drivers/block/drbd/drbd_state.c | |||
| @@ -931,6 +931,7 @@ __drbd_set_state(struct drbd_conf *mdev, union drbd_state ns, | |||
| 931 | enum drbd_state_rv rv = SS_SUCCESS; | 931 | enum drbd_state_rv rv = SS_SUCCESS; |
| 932 | enum sanitize_state_warnings ssw; | 932 | enum sanitize_state_warnings ssw; |
| 933 | struct after_state_chg_work *ascw; | 933 | struct after_state_chg_work *ascw; |
| 934 | bool did_remote, should_do_remote; | ||
| 934 | 935 | ||
| 935 | os = drbd_read_state(mdev); | 936 | os = drbd_read_state(mdev); |
| 936 | 937 | ||
| @@ -981,11 +982,17 @@ __drbd_set_state(struct drbd_conf *mdev, union drbd_state ns, | |||
| 981 | (os.disk != D_DISKLESS && ns.disk == D_DISKLESS)) | 982 | (os.disk != D_DISKLESS && ns.disk == D_DISKLESS)) |
| 982 | atomic_inc(&mdev->local_cnt); | 983 | atomic_inc(&mdev->local_cnt); |
| 983 | 984 | ||
| 985 | did_remote = drbd_should_do_remote(mdev->state); | ||
| 984 | mdev->state.i = ns.i; | 986 | mdev->state.i = ns.i; |
| 987 | should_do_remote = drbd_should_do_remote(mdev->state); | ||
| 985 | mdev->tconn->susp = ns.susp; | 988 | mdev->tconn->susp = ns.susp; |
| 986 | mdev->tconn->susp_nod = ns.susp_nod; | 989 | mdev->tconn->susp_nod = ns.susp_nod; |
| 987 | mdev->tconn->susp_fen = ns.susp_fen; | 990 | mdev->tconn->susp_fen = ns.susp_fen; |
| 988 | 991 | ||
| 992 | /* put replicated vs not-replicated requests in seperate epochs */ | ||
| 993 | if (did_remote != should_do_remote) | ||
| 994 | start_new_tl_epoch(mdev->tconn); | ||
| 995 | |||
| 989 | if (os.disk == D_ATTACHING && ns.disk >= D_NEGOTIATING) | 996 | if (os.disk == D_ATTACHING && ns.disk >= D_NEGOTIATING) |
| 990 | drbd_print_uuids(mdev, "attached to UUIDs"); | 997 | drbd_print_uuids(mdev, "attached to UUIDs"); |
| 991 | 998 | ||
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index 9694dd99bbbc..3fd100990453 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c | |||
| @@ -626,12 +626,13 @@ static void mtip_timeout_function(unsigned long int data) | |||
| 626 | } | 626 | } |
| 627 | } | 627 | } |
| 628 | 628 | ||
| 629 | if (cmdto_cnt && !test_bit(MTIP_PF_IC_ACTIVE_BIT, &port->flags)) { | 629 | if (cmdto_cnt) { |
| 630 | print_tags(port->dd, "timed out", tagaccum, cmdto_cnt); | 630 | print_tags(port->dd, "timed out", tagaccum, cmdto_cnt); |
| 631 | 631 | if (!test_bit(MTIP_PF_IC_ACTIVE_BIT, &port->flags)) { | |
| 632 | mtip_restart_port(port); | 632 | mtip_restart_port(port); |
| 633 | wake_up_interruptible(&port->svc_wait); | ||
| 634 | } | ||
| 633 | clear_bit(MTIP_PF_EH_ACTIVE_BIT, &port->flags); | 635 | clear_bit(MTIP_PF_EH_ACTIVE_BIT, &port->flags); |
| 634 | wake_up_interruptible(&port->svc_wait); | ||
| 635 | } | 636 | } |
| 636 | 637 | ||
| 637 | if (port->ic_pause_timer) { | 638 | if (port->ic_pause_timer) { |
| @@ -3887,7 +3888,12 @@ static int mtip_block_remove(struct driver_data *dd) | |||
| 3887 | * Delete our gendisk structure. This also removes the device | 3888 | * Delete our gendisk structure. This also removes the device |
| 3888 | * from /dev | 3889 | * from /dev |
| 3889 | */ | 3890 | */ |
| 3890 | del_gendisk(dd->disk); | 3891 | if (dd->disk) { |
| 3892 | if (dd->disk->queue) | ||
| 3893 | del_gendisk(dd->disk); | ||
| 3894 | else | ||
| 3895 | put_disk(dd->disk); | ||
| 3896 | } | ||
| 3891 | 3897 | ||
| 3892 | spin_lock(&rssd_index_lock); | 3898 | spin_lock(&rssd_index_lock); |
| 3893 | ida_remove(&rssd_index_ida, dd->index); | 3899 | ida_remove(&rssd_index_ida, dd->index); |
| @@ -3921,7 +3927,13 @@ static int mtip_block_shutdown(struct driver_data *dd) | |||
| 3921 | "Shutting down %s ...\n", dd->disk->disk_name); | 3927 | "Shutting down %s ...\n", dd->disk->disk_name); |
| 3922 | 3928 | ||
| 3923 | /* Delete our gendisk structure, and cleanup the blk queue. */ | 3929 | /* Delete our gendisk structure, and cleanup the blk queue. */ |
| 3924 | del_gendisk(dd->disk); | 3930 | if (dd->disk) { |
| 3931 | if (dd->disk->queue) | ||
| 3932 | del_gendisk(dd->disk); | ||
| 3933 | else | ||
| 3934 | put_disk(dd->disk); | ||
| 3935 | } | ||
| 3936 | |||
| 3925 | 3937 | ||
| 3926 | spin_lock(&rssd_index_lock); | 3938 | spin_lock(&rssd_index_lock); |
| 3927 | ida_remove(&rssd_index_ida, dd->index); | 3939 | ida_remove(&rssd_index_ida, dd->index); |
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 74374fb762aa..5ac841ff6cc7 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c | |||
| @@ -161,10 +161,12 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif, | |||
| 161 | static void make_response(struct xen_blkif *blkif, u64 id, | 161 | static void make_response(struct xen_blkif *blkif, u64 id, |
| 162 | unsigned short op, int st); | 162 | unsigned short op, int st); |
| 163 | 163 | ||
| 164 | #define foreach_grant(pos, rbtree, node) \ | 164 | #define foreach_grant_safe(pos, n, rbtree, node) \ |
| 165 | for ((pos) = container_of(rb_first((rbtree)), typeof(*(pos)), node); \ | 165 | for ((pos) = container_of(rb_first((rbtree)), typeof(*(pos)), node), \ |
| 166 | (n) = rb_next(&(pos)->node); \ | ||
| 166 | &(pos)->node != NULL; \ | 167 | &(pos)->node != NULL; \ |
| 167 | (pos) = container_of(rb_next(&(pos)->node), typeof(*(pos)), node)) | 168 | (pos) = container_of(n, typeof(*(pos)), node), \ |
| 169 | (n) = (&(pos)->node != NULL) ? rb_next(&(pos)->node) : NULL) | ||
| 168 | 170 | ||
| 169 | 171 | ||
| 170 | static void add_persistent_gnt(struct rb_root *root, | 172 | static void add_persistent_gnt(struct rb_root *root, |
| @@ -217,10 +219,11 @@ static void free_persistent_gnts(struct rb_root *root, unsigned int num) | |||
| 217 | struct gnttab_unmap_grant_ref unmap[BLKIF_MAX_SEGMENTS_PER_REQUEST]; | 219 | struct gnttab_unmap_grant_ref unmap[BLKIF_MAX_SEGMENTS_PER_REQUEST]; |
| 218 | struct page *pages[BLKIF_MAX_SEGMENTS_PER_REQUEST]; | 220 | struct page *pages[BLKIF_MAX_SEGMENTS_PER_REQUEST]; |
| 219 | struct persistent_gnt *persistent_gnt; | 221 | struct persistent_gnt *persistent_gnt; |
| 222 | struct rb_node *n; | ||
| 220 | int ret = 0; | 223 | int ret = 0; |
| 221 | int segs_to_unmap = 0; | 224 | int segs_to_unmap = 0; |
| 222 | 225 | ||
| 223 | foreach_grant(persistent_gnt, root, node) { | 226 | foreach_grant_safe(persistent_gnt, n, root, node) { |
| 224 | BUG_ON(persistent_gnt->handle == | 227 | BUG_ON(persistent_gnt->handle == |
| 225 | BLKBACK_INVALID_HANDLE); | 228 | BLKBACK_INVALID_HANDLE); |
| 226 | gnttab_set_unmap_op(&unmap[segs_to_unmap], | 229 | gnttab_set_unmap_op(&unmap[segs_to_unmap], |
| @@ -230,9 +233,6 @@ static void free_persistent_gnts(struct rb_root *root, unsigned int num) | |||
| 230 | persistent_gnt->handle); | 233 | persistent_gnt->handle); |
| 231 | 234 | ||
| 232 | pages[segs_to_unmap] = persistent_gnt->page; | 235 | pages[segs_to_unmap] = persistent_gnt->page; |
| 233 | rb_erase(&persistent_gnt->node, root); | ||
| 234 | kfree(persistent_gnt); | ||
| 235 | num--; | ||
| 236 | 236 | ||
| 237 | if (++segs_to_unmap == BLKIF_MAX_SEGMENTS_PER_REQUEST || | 237 | if (++segs_to_unmap == BLKIF_MAX_SEGMENTS_PER_REQUEST || |
| 238 | !rb_next(&persistent_gnt->node)) { | 238 | !rb_next(&persistent_gnt->node)) { |
| @@ -241,6 +241,10 @@ static void free_persistent_gnts(struct rb_root *root, unsigned int num) | |||
| 241 | BUG_ON(ret); | 241 | BUG_ON(ret); |
| 242 | segs_to_unmap = 0; | 242 | segs_to_unmap = 0; |
| 243 | } | 243 | } |
| 244 | |||
| 245 | rb_erase(&persistent_gnt->node, root); | ||
| 246 | kfree(persistent_gnt); | ||
| 247 | num--; | ||
| 244 | } | 248 | } |
| 245 | BUG_ON(num != 0); | 249 | BUG_ON(num != 0); |
| 246 | } | 250 | } |
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 96e9b00db081..11043c18ac5a 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
| @@ -792,6 +792,7 @@ static void blkif_free(struct blkfront_info *info, int suspend) | |||
| 792 | { | 792 | { |
| 793 | struct llist_node *all_gnts; | 793 | struct llist_node *all_gnts; |
| 794 | struct grant *persistent_gnt; | 794 | struct grant *persistent_gnt; |
| 795 | struct llist_node *n; | ||
| 795 | 796 | ||
| 796 | /* Prevent new requests being issued until we fix things up. */ | 797 | /* Prevent new requests being issued until we fix things up. */ |
| 797 | spin_lock_irq(&info->io_lock); | 798 | spin_lock_irq(&info->io_lock); |
| @@ -804,7 +805,7 @@ static void blkif_free(struct blkfront_info *info, int suspend) | |||
| 804 | /* Remove all persistent grants */ | 805 | /* Remove all persistent grants */ |
| 805 | if (info->persistent_gnts_c) { | 806 | if (info->persistent_gnts_c) { |
| 806 | all_gnts = llist_del_all(&info->persistent_gnts); | 807 | all_gnts = llist_del_all(&info->persistent_gnts); |
| 807 | llist_for_each_entry(persistent_gnt, all_gnts, node) { | 808 | llist_for_each_entry_safe(persistent_gnt, n, all_gnts, node) { |
| 808 | gnttab_end_foreign_access(persistent_gnt->gref, 0, 0UL); | 809 | gnttab_end_foreign_access(persistent_gnt->gref, 0, 0UL); |
| 809 | __free_page(pfn_to_page(persistent_gnt->pfn)); | 810 | __free_page(pfn_to_page(persistent_gnt->pfn)); |
| 810 | kfree(persistent_gnt); | 811 | kfree(persistent_gnt); |
| @@ -835,7 +836,7 @@ static void blkif_free(struct blkfront_info *info, int suspend) | |||
| 835 | static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info, | 836 | static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info, |
| 836 | struct blkif_response *bret) | 837 | struct blkif_response *bret) |
| 837 | { | 838 | { |
| 838 | int i; | 839 | int i = 0; |
| 839 | struct bio_vec *bvec; | 840 | struct bio_vec *bvec; |
| 840 | struct req_iterator iter; | 841 | struct req_iterator iter; |
| 841 | unsigned long flags; | 842 | unsigned long flags; |
| @@ -852,7 +853,8 @@ static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info, | |||
| 852 | */ | 853 | */ |
| 853 | rq_for_each_segment(bvec, s->request, iter) { | 854 | rq_for_each_segment(bvec, s->request, iter) { |
| 854 | BUG_ON((bvec->bv_offset + bvec->bv_len) > PAGE_SIZE); | 855 | BUG_ON((bvec->bv_offset + bvec->bv_len) > PAGE_SIZE); |
| 855 | i = offset >> PAGE_SHIFT; | 856 | if (bvec->bv_offset < offset) |
| 857 | i++; | ||
| 856 | BUG_ON(i >= s->req.u.rw.nr_segments); | 858 | BUG_ON(i >= s->req.u.rw.nr_segments); |
| 857 | shared_data = kmap_atomic( | 859 | shared_data = kmap_atomic( |
| 858 | pfn_to_page(s->grants_used[i]->pfn)); | 860 | pfn_to_page(s->grants_used[i]->pfn)); |
| @@ -861,7 +863,7 @@ static void blkif_completion(struct blk_shadow *s, struct blkfront_info *info, | |||
| 861 | bvec->bv_len); | 863 | bvec->bv_len); |
| 862 | bvec_kunmap_irq(bvec_data, &flags); | 864 | bvec_kunmap_irq(bvec_data, &flags); |
| 863 | kunmap_atomic(shared_data); | 865 | kunmap_atomic(shared_data); |
| 864 | offset += bvec->bv_len; | 866 | offset = bvec->bv_offset + bvec->bv_len; |
| 865 | } | 867 | } |
| 866 | } | 868 | } |
| 867 | /* Add the persistent grant into the list of free grants */ | 869 | /* Add the persistent grant into the list of free grants */ |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 4d0e60adbc6d..a2d478e8692a 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -1313,14 +1313,18 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav | |||
| 1313 | if (!(tmp & EVERGREEN_CRTC_BLANK_DATA_EN)) { | 1313 | if (!(tmp & EVERGREEN_CRTC_BLANK_DATA_EN)) { |
| 1314 | radeon_wait_for_vblank(rdev, i); | 1314 | radeon_wait_for_vblank(rdev, i); |
| 1315 | tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; | 1315 | tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; |
| 1316 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); | ||
| 1316 | WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); | 1317 | WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); |
| 1318 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); | ||
| 1317 | } | 1319 | } |
| 1318 | } else { | 1320 | } else { |
| 1319 | tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); | 1321 | tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); |
| 1320 | if (!(tmp & EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE)) { | 1322 | if (!(tmp & EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE)) { |
| 1321 | radeon_wait_for_vblank(rdev, i); | 1323 | radeon_wait_for_vblank(rdev, i); |
| 1322 | tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE; | 1324 | tmp |= EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE; |
| 1325 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); | ||
| 1323 | WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp); | 1326 | WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp); |
| 1327 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); | ||
| 1324 | } | 1328 | } |
| 1325 | } | 1329 | } |
| 1326 | /* wait for the next frame */ | 1330 | /* wait for the next frame */ |
| @@ -1345,6 +1349,8 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav | |||
| 1345 | blackout &= ~BLACKOUT_MODE_MASK; | 1349 | blackout &= ~BLACKOUT_MODE_MASK; |
| 1346 | WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1); | 1350 | WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1); |
| 1347 | } | 1351 | } |
| 1352 | /* wait for the MC to settle */ | ||
| 1353 | udelay(100); | ||
| 1348 | } | 1354 | } |
| 1349 | 1355 | ||
| 1350 | void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save) | 1356 | void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save) |
| @@ -1378,11 +1384,15 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s | |||
| 1378 | if (ASIC_IS_DCE6(rdev)) { | 1384 | if (ASIC_IS_DCE6(rdev)) { |
| 1379 | tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]); | 1385 | tmp = RREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i]); |
| 1380 | tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; | 1386 | tmp |= EVERGREEN_CRTC_BLANK_DATA_EN; |
| 1387 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); | ||
| 1381 | WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); | 1388 | WREG32(EVERGREEN_CRTC_BLANK_CONTROL + crtc_offsets[i], tmp); |
| 1389 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); | ||
| 1382 | } else { | 1390 | } else { |
| 1383 | tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); | 1391 | tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); |
| 1384 | tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE; | 1392 | tmp &= ~EVERGREEN_CRTC_DISP_READ_REQUEST_DISABLE; |
| 1393 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); | ||
| 1385 | WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp); | 1394 | WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp); |
| 1395 | WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); | ||
| 1386 | } | 1396 | } |
| 1387 | /* wait for the next frame */ | 1397 | /* wait for the next frame */ |
| 1388 | frame_count = radeon_get_vblank_counter(rdev, i); | 1398 | frame_count = radeon_get_vblank_counter(rdev, i); |
| @@ -2036,9 +2046,20 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 2036 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); | 2046 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); |
| 2037 | WREG32(DMA_TILING_CONFIG, gb_addr_config); | 2047 | WREG32(DMA_TILING_CONFIG, gb_addr_config); |
| 2038 | 2048 | ||
| 2039 | tmp = gb_addr_config & NUM_PIPES_MASK; | 2049 | if ((rdev->config.evergreen.max_backends == 1) && |
| 2040 | tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.evergreen.max_backends, | 2050 | (rdev->flags & RADEON_IS_IGP)) { |
| 2041 | EVERGREEN_MAX_BACKENDS, disabled_rb_mask); | 2051 | if ((disabled_rb_mask & 3) == 1) { |
| 2052 | /* RB0 disabled, RB1 enabled */ | ||
| 2053 | tmp = 0x11111111; | ||
| 2054 | } else { | ||
| 2055 | /* RB1 disabled, RB0 enabled */ | ||
| 2056 | tmp = 0x00000000; | ||
| 2057 | } | ||
| 2058 | } else { | ||
| 2059 | tmp = gb_addr_config & NUM_PIPES_MASK; | ||
| 2060 | tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.evergreen.max_backends, | ||
| 2061 | EVERGREEN_MAX_BACKENDS, disabled_rb_mask); | ||
| 2062 | } | ||
| 2042 | WREG32(GB_BACKEND_MAP, tmp); | 2063 | WREG32(GB_BACKEND_MAP, tmp); |
| 2043 | 2064 | ||
| 2044 | WREG32(CGTS_SYS_TCC_DISABLE, 0); | 2065 | WREG32(CGTS_SYS_TCC_DISABLE, 0); |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index bc2540b17c5e..becb03e8b32f 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -1462,12 +1462,15 @@ u32 r6xx_remap_render_backend(struct radeon_device *rdev, | |||
| 1462 | u32 disabled_rb_mask) | 1462 | u32 disabled_rb_mask) |
| 1463 | { | 1463 | { |
| 1464 | u32 rendering_pipe_num, rb_num_width, req_rb_num; | 1464 | u32 rendering_pipe_num, rb_num_width, req_rb_num; |
| 1465 | u32 pipe_rb_ratio, pipe_rb_remain; | 1465 | u32 pipe_rb_ratio, pipe_rb_remain, tmp; |
| 1466 | u32 data = 0, mask = 1 << (max_rb_num - 1); | 1466 | u32 data = 0, mask = 1 << (max_rb_num - 1); |
| 1467 | unsigned i, j; | 1467 | unsigned i, j; |
| 1468 | 1468 | ||
| 1469 | /* mask out the RBs that don't exist on that asic */ | 1469 | /* mask out the RBs that don't exist on that asic */ |
| 1470 | disabled_rb_mask |= (0xff << max_rb_num) & 0xff; | 1470 | tmp = disabled_rb_mask | ((0xff << max_rb_num) & 0xff); |
| 1471 | /* make sure at least one RB is available */ | ||
| 1472 | if ((tmp & 0xff) != 0xff) | ||
| 1473 | disabled_rb_mask = tmp; | ||
| 1471 | 1474 | ||
| 1472 | rendering_pipe_num = 1 << tiling_pipe_num; | 1475 | rendering_pipe_num = 1 << tiling_pipe_num; |
| 1473 | req_rb_num = total_max_rb_num - r600_count_pipe_bits(disabled_rb_mask); | 1476 | req_rb_num = total_max_rb_num - r600_count_pipe_bits(disabled_rb_mask); |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 9056fafb00ea..0b202c07fe50 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -1445,7 +1445,7 @@ static struct radeon_asic cayman_asic = { | |||
| 1445 | .vm = { | 1445 | .vm = { |
| 1446 | .init = &cayman_vm_init, | 1446 | .init = &cayman_vm_init, |
| 1447 | .fini = &cayman_vm_fini, | 1447 | .fini = &cayman_vm_fini, |
| 1448 | .pt_ring_index = R600_RING_TYPE_DMA_INDEX, | 1448 | .pt_ring_index = RADEON_RING_TYPE_GFX_INDEX, |
| 1449 | .set_page = &cayman_vm_set_page, | 1449 | .set_page = &cayman_vm_set_page, |
| 1450 | }, | 1450 | }, |
| 1451 | .ring = { | 1451 | .ring = { |
| @@ -1572,7 +1572,7 @@ static struct radeon_asic trinity_asic = { | |||
| 1572 | .vm = { | 1572 | .vm = { |
| 1573 | .init = &cayman_vm_init, | 1573 | .init = &cayman_vm_init, |
| 1574 | .fini = &cayman_vm_fini, | 1574 | .fini = &cayman_vm_fini, |
| 1575 | .pt_ring_index = R600_RING_TYPE_DMA_INDEX, | 1575 | .pt_ring_index = RADEON_RING_TYPE_GFX_INDEX, |
| 1576 | .set_page = &cayman_vm_set_page, | 1576 | .set_page = &cayman_vm_set_page, |
| 1577 | }, | 1577 | }, |
| 1578 | .ring = { | 1578 | .ring = { |
| @@ -1699,7 +1699,7 @@ static struct radeon_asic si_asic = { | |||
| 1699 | .vm = { | 1699 | .vm = { |
| 1700 | .init = &si_vm_init, | 1700 | .init = &si_vm_init, |
| 1701 | .fini = &si_vm_fini, | 1701 | .fini = &si_vm_fini, |
| 1702 | .pt_ring_index = R600_RING_TYPE_DMA_INDEX, | 1702 | .pt_ring_index = RADEON_RING_TYPE_GFX_INDEX, |
| 1703 | .set_page = &si_vm_set_page, | 1703 | .set_page = &si_vm_set_page, |
| 1704 | }, | 1704 | }, |
| 1705 | .ring = { | 1705 | .ring = { |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 33a56a09ff10..3e403bdda58f 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -2470,6 +2470,14 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) | |||
| 2470 | 1), | 2470 | 1), |
| 2471 | ATOM_DEVICE_CRT1_SUPPORT); | 2471 | ATOM_DEVICE_CRT1_SUPPORT); |
| 2472 | } | 2472 | } |
| 2473 | /* RV100 board with external TDMS bit mis-set. | ||
| 2474 | * Actually uses internal TMDS, clear the bit. | ||
| 2475 | */ | ||
| 2476 | if (dev->pdev->device == 0x5159 && | ||
| 2477 | dev->pdev->subsystem_vendor == 0x1014 && | ||
| 2478 | dev->pdev->subsystem_device == 0x029A) { | ||
| 2479 | tmp &= ~(1 << 4); | ||
| 2480 | } | ||
| 2473 | if ((tmp >> 4) & 0x1) { | 2481 | if ((tmp >> 4) & 0x1) { |
| 2474 | devices |= ATOM_DEVICE_DFP2_SUPPORT; | 2482 | devices |= ATOM_DEVICE_DFP2_SUPPORT; |
| 2475 | radeon_add_legacy_encoder(dev, | 2483 | radeon_add_legacy_encoder(dev, |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index ff3def784619..05c96fa0b051 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -1115,8 +1115,10 @@ radeon_user_framebuffer_create(struct drm_device *dev, | |||
| 1115 | } | 1115 | } |
| 1116 | 1116 | ||
| 1117 | radeon_fb = kzalloc(sizeof(*radeon_fb), GFP_KERNEL); | 1117 | radeon_fb = kzalloc(sizeof(*radeon_fb), GFP_KERNEL); |
| 1118 | if (radeon_fb == NULL) | 1118 | if (radeon_fb == NULL) { |
| 1119 | drm_gem_object_unreference_unlocked(obj); | ||
| 1119 | return ERR_PTR(-ENOMEM); | 1120 | return ERR_PTR(-ENOMEM); |
| 1121 | } | ||
| 1120 | 1122 | ||
| 1121 | ret = radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); | 1123 | ret = radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); |
| 1122 | if (ret) { | 1124 | if (ret) { |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 2430d80b1871..cd72062d5a91 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
| @@ -377,6 +377,9 @@ int radeon_ring_alloc(struct radeon_device *rdev, struct radeon_ring *ring, unsi | |||
| 377 | { | 377 | { |
| 378 | int r; | 378 | int r; |
| 379 | 379 | ||
| 380 | /* make sure we aren't trying to allocate more space than there is on the ring */ | ||
| 381 | if (ndw > (ring->ring_size / 4)) | ||
| 382 | return -ENOMEM; | ||
| 380 | /* Align requested size with padding so unlock_commit can | 383 | /* Align requested size with padding so unlock_commit can |
| 381 | * pad safely */ | 384 | * pad safely */ |
| 382 | ndw = (ndw + ring->align_mask) & ~ring->align_mask; | 385 | ndw = (ndw + ring->align_mask) & ~ring->align_mask; |
diff --git a/drivers/gpu/drm/radeon/reg_srcs/cayman b/drivers/gpu/drm/radeon/reg_srcs/cayman index 0f656b111c15..a072fa8c46b0 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/cayman +++ b/drivers/gpu/drm/radeon/reg_srcs/cayman | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | cayman 0x9400 | 1 | cayman 0x9400 |
| 2 | 0x0000802C GRBM_GFX_INDEX | 2 | 0x0000802C GRBM_GFX_INDEX |
| 3 | 0x00008040 WAIT_UNTIL | ||
| 3 | 0x000084FC CP_STRMOUT_CNTL | 4 | 0x000084FC CP_STRMOUT_CNTL |
| 4 | 0x000085F0 CP_COHER_CNTL | 5 | 0x000085F0 CP_COHER_CNTL |
| 5 | 0x000085F4 CP_COHER_SIZE | 6 | 0x000085F4 CP_COHER_SIZE |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 2bb6d0e84b3d..435ed3551364 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
| @@ -336,6 +336,8 @@ void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save) | |||
| 336 | WREG32(R600_CITF_CNTL, blackout); | 336 | WREG32(R600_CITF_CNTL, blackout); |
| 337 | } | 337 | } |
| 338 | } | 338 | } |
| 339 | /* wait for the MC to settle */ | ||
| 340 | udelay(100); | ||
| 339 | } | 341 | } |
| 340 | 342 | ||
| 341 | void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save) | 343 | void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save) |
diff --git a/drivers/media/radio/radio-keene.c b/drivers/media/radio/radio-keene.c index e10e525f33e5..296941a9ae25 100644 --- a/drivers/media/radio/radio-keene.c +++ b/drivers/media/radio/radio-keene.c | |||
| @@ -374,6 +374,7 @@ static int usb_keene_probe(struct usb_interface *intf, | |||
| 374 | radio->vdev.ioctl_ops = &usb_keene_ioctl_ops; | 374 | radio->vdev.ioctl_ops = &usb_keene_ioctl_ops; |
| 375 | radio->vdev.lock = &radio->lock; | 375 | radio->vdev.lock = &radio->lock; |
| 376 | radio->vdev.release = video_device_release_empty; | 376 | radio->vdev.release = video_device_release_empty; |
| 377 | radio->vdev.vfl_dir = VFL_DIR_TX; | ||
| 377 | 378 | ||
| 378 | radio->usbdev = interface_to_usbdev(intf); | 379 | radio->usbdev = interface_to_usbdev(intf); |
| 379 | radio->intf = intf; | 380 | radio->intf = intf; |
diff --git a/drivers/media/radio/radio-si4713.c b/drivers/media/radio/radio-si4713.c index a082e400ed0f..1507c9d508d7 100644 --- a/drivers/media/radio/radio-si4713.c +++ b/drivers/media/radio/radio-si4713.c | |||
| @@ -250,6 +250,7 @@ static struct video_device radio_si4713_vdev_template = { | |||
| 250 | .name = "radio-si4713", | 250 | .name = "radio-si4713", |
| 251 | .release = video_device_release, | 251 | .release = video_device_release, |
| 252 | .ioctl_ops = &radio_si4713_ioctl_ops, | 252 | .ioctl_ops = &radio_si4713_ioctl_ops, |
| 253 | .vfl_dir = VFL_DIR_TX, | ||
| 253 | }; | 254 | }; |
| 254 | 255 | ||
| 255 | /* Platform driver interface */ | 256 | /* Platform driver interface */ |
diff --git a/drivers/media/radio/radio-wl1273.c b/drivers/media/radio/radio-wl1273.c index c48be195bbad..cabbe3adf435 100644 --- a/drivers/media/radio/radio-wl1273.c +++ b/drivers/media/radio/radio-wl1273.c | |||
| @@ -1971,6 +1971,7 @@ static struct video_device wl1273_viddev_template = { | |||
| 1971 | .ioctl_ops = &wl1273_ioctl_ops, | 1971 | .ioctl_ops = &wl1273_ioctl_ops, |
| 1972 | .name = WL1273_FM_DRIVER_NAME, | 1972 | .name = WL1273_FM_DRIVER_NAME, |
| 1973 | .release = wl1273_vdev_release, | 1973 | .release = wl1273_vdev_release, |
| 1974 | .vfl_dir = VFL_DIR_TX, | ||
| 1974 | }; | 1975 | }; |
| 1975 | 1976 | ||
| 1976 | static int wl1273_fm_radio_remove(struct platform_device *pdev) | 1977 | static int wl1273_fm_radio_remove(struct platform_device *pdev) |
diff --git a/drivers/media/radio/wl128x/fmdrv_v4l2.c b/drivers/media/radio/wl128x/fmdrv_v4l2.c index 048de4536036..0a8ee8fab924 100644 --- a/drivers/media/radio/wl128x/fmdrv_v4l2.c +++ b/drivers/media/radio/wl128x/fmdrv_v4l2.c | |||
| @@ -518,6 +518,16 @@ static struct video_device fm_viddev_template = { | |||
| 518 | .ioctl_ops = &fm_drv_ioctl_ops, | 518 | .ioctl_ops = &fm_drv_ioctl_ops, |
| 519 | .name = FM_DRV_NAME, | 519 | .name = FM_DRV_NAME, |
| 520 | .release = video_device_release, | 520 | .release = video_device_release, |
| 521 | /* | ||
| 522 | * To ensure both the tuner and modulator ioctls are accessible we | ||
| 523 | * set the vfl_dir to M2M to indicate this. | ||
| 524 | * | ||
| 525 | * It is not really a mem2mem device of course, but it can both receive | ||
| 526 | * and transmit using the same radio device. It's the only radio driver | ||
| 527 | * that does this and it should really be split in two radio devices, | ||
| 528 | * but that would affect applications using this driver. | ||
| 529 | */ | ||
| 530 | .vfl_dir = VFL_DIR_M2M, | ||
| 521 | }; | 531 | }; |
| 522 | 532 | ||
| 523 | int fm_v4l2_init_video_device(struct fmdev *fmdev, int radio_nr) | 533 | int fm_v4l2_init_video_device(struct fmdev *fmdev, int radio_nr) |
diff --git a/drivers/mtd/devices/Kconfig b/drivers/mtd/devices/Kconfig index 27f80cd8aef3..46dcb54c32ec 100644 --- a/drivers/mtd/devices/Kconfig +++ b/drivers/mtd/devices/Kconfig | |||
| @@ -272,6 +272,7 @@ config MTD_DOCG3 | |||
| 272 | tristate "M-Systems Disk-On-Chip G3" | 272 | tristate "M-Systems Disk-On-Chip G3" |
| 273 | select BCH | 273 | select BCH |
| 274 | select BCH_CONST_PARAMS | 274 | select BCH_CONST_PARAMS |
| 275 | select BITREVERSE | ||
| 275 | ---help--- | 276 | ---help--- |
| 276 | This provides an MTD device driver for the M-Systems DiskOnChip | 277 | This provides an MTD device driver for the M-Systems DiskOnChip |
| 277 | G3 devices. | 278 | G3 devices. |
diff --git a/drivers/mtd/maps/physmap_of.c b/drivers/mtd/maps/physmap_of.c index 67cc73c18ddd..7901d72c9242 100644 --- a/drivers/mtd/maps/physmap_of.c +++ b/drivers/mtd/maps/physmap_of.c | |||
| @@ -170,7 +170,7 @@ static int of_flash_probe(struct platform_device *dev) | |||
| 170 | resource_size_t res_size; | 170 | resource_size_t res_size; |
| 171 | struct mtd_part_parser_data ppdata; | 171 | struct mtd_part_parser_data ppdata; |
| 172 | bool map_indirect; | 172 | bool map_indirect; |
| 173 | const char *mtd_name; | 173 | const char *mtd_name = NULL; |
| 174 | 174 | ||
| 175 | match = of_match_device(of_flash_match, &dev->dev); | 175 | match = of_match_device(of_flash_match, &dev->dev); |
| 176 | if (!match) | 176 | if (!match) |
diff --git a/drivers/mtd/nand/bcm47xxnflash/ops_bcm4706.c b/drivers/mtd/nand/bcm47xxnflash/ops_bcm4706.c index 86c9a79b89b3..595de4012e71 100644 --- a/drivers/mtd/nand/bcm47xxnflash/ops_bcm4706.c +++ b/drivers/mtd/nand/bcm47xxnflash/ops_bcm4706.c | |||
| @@ -17,8 +17,8 @@ | |||
| 17 | #include "bcm47xxnflash.h" | 17 | #include "bcm47xxnflash.h" |
| 18 | 18 | ||
| 19 | /* Broadcom uses 1'000'000 but it seems to be too many. Tests on WNDR4500 has | 19 | /* Broadcom uses 1'000'000 but it seems to be too many. Tests on WNDR4500 has |
| 20 | * shown 164 retries as maxiumum. */ | 20 | * shown ~1000 retries as maxiumum. */ |
| 21 | #define NFLASH_READY_RETRIES 1000 | 21 | #define NFLASH_READY_RETRIES 10000 |
| 22 | 22 | ||
| 23 | #define NFLASH_SECTOR_SIZE 512 | 23 | #define NFLASH_SECTOR_SIZE 512 |
| 24 | 24 | ||
diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c index 3502606f6480..feae55c7b880 100644 --- a/drivers/mtd/nand/davinci_nand.c +++ b/drivers/mtd/nand/davinci_nand.c | |||
| @@ -523,7 +523,7 @@ static struct nand_ecclayout hwecc4_2048 __initconst = { | |||
| 523 | static const struct of_device_id davinci_nand_of_match[] = { | 523 | static const struct of_device_id davinci_nand_of_match[] = { |
| 524 | {.compatible = "ti,davinci-nand", }, | 524 | {.compatible = "ti,davinci-nand", }, |
| 525 | {}, | 525 | {}, |
| 526 | } | 526 | }; |
| 527 | MODULE_DEVICE_TABLE(of, davinci_nand_of_match); | 527 | MODULE_DEVICE_TABLE(of, davinci_nand_of_match); |
| 528 | 528 | ||
| 529 | static struct davinci_nand_pdata | 529 | static struct davinci_nand_pdata |
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 8323ac991ad1..3766682a0289 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c | |||
| @@ -2857,8 +2857,11 @@ static int nand_flash_detect_onfi(struct mtd_info *mtd, struct nand_chip *chip, | |||
| 2857 | int i; | 2857 | int i; |
| 2858 | int val; | 2858 | int val; |
| 2859 | 2859 | ||
| 2860 | /* ONFI need to be probed in 8 bits mode */ | 2860 | /* ONFI need to be probed in 8 bits mode, and 16 bits should be selected with NAND_BUSWIDTH_AUTO */ |
| 2861 | WARN_ON(chip->options & NAND_BUSWIDTH_16); | 2861 | if (chip->options & NAND_BUSWIDTH_16) { |
| 2862 | pr_err("Trying ONFI probe in 16 bits mode, aborting !\n"); | ||
| 2863 | return 0; | ||
| 2864 | } | ||
| 2862 | /* Try ONFI for unknown chip or LP */ | 2865 | /* Try ONFI for unknown chip or LP */ |
| 2863 | chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1); | 2866 | chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1); |
| 2864 | if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' || | 2867 | if (chip->read_byte(mtd) != 'O' || chip->read_byte(mtd) != 'N' || |
diff --git a/drivers/rtc/rtc-isl1208.c b/drivers/rtc/rtc-isl1208.c index afb7cfa85ccc..c016ad81767a 100644 --- a/drivers/rtc/rtc-isl1208.c +++ b/drivers/rtc/rtc-isl1208.c | |||
| @@ -506,6 +506,7 @@ isl1208_rtc_interrupt(int irq, void *data) | |||
| 506 | { | 506 | { |
| 507 | unsigned long timeout = jiffies + msecs_to_jiffies(1000); | 507 | unsigned long timeout = jiffies + msecs_to_jiffies(1000); |
| 508 | struct i2c_client *client = data; | 508 | struct i2c_client *client = data; |
| 509 | struct rtc_device *rtc = i2c_get_clientdata(client); | ||
| 509 | int handled = 0, sr, err; | 510 | int handled = 0, sr, err; |
| 510 | 511 | ||
| 511 | /* | 512 | /* |
| @@ -528,6 +529,8 @@ isl1208_rtc_interrupt(int irq, void *data) | |||
| 528 | if (sr & ISL1208_REG_SR_ALM) { | 529 | if (sr & ISL1208_REG_SR_ALM) { |
| 529 | dev_dbg(&client->dev, "alarm!\n"); | 530 | dev_dbg(&client->dev, "alarm!\n"); |
| 530 | 531 | ||
| 532 | rtc_update_irq(rtc, 1, RTC_IRQF | RTC_AF); | ||
| 533 | |||
| 531 | /* Clear the alarm */ | 534 | /* Clear the alarm */ |
| 532 | sr &= ~ISL1208_REG_SR_ALM; | 535 | sr &= ~ISL1208_REG_SR_ALM; |
| 533 | sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR, sr); | 536 | sr = i2c_smbus_write_byte_data(client, ISL1208_REG_SR, sr); |
diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c index 08378e3cc21c..10c1a3454e48 100644 --- a/drivers/rtc/rtc-pl031.c +++ b/drivers/rtc/rtc-pl031.c | |||
| @@ -44,6 +44,7 @@ | |||
| 44 | #define RTC_YMR 0x34 /* Year match register */ | 44 | #define RTC_YMR 0x34 /* Year match register */ |
| 45 | #define RTC_YLR 0x38 /* Year data load register */ | 45 | #define RTC_YLR 0x38 /* Year data load register */ |
| 46 | 46 | ||
| 47 | #define RTC_CR_EN (1 << 0) /* counter enable bit */ | ||
| 47 | #define RTC_CR_CWEN (1 << 26) /* Clockwatch enable bit */ | 48 | #define RTC_CR_CWEN (1 << 26) /* Clockwatch enable bit */ |
| 48 | 49 | ||
| 49 | #define RTC_TCR_EN (1 << 1) /* Periodic timer enable bit */ | 50 | #define RTC_TCR_EN (1 << 1) /* Periodic timer enable bit */ |
| @@ -320,7 +321,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 320 | struct pl031_local *ldata; | 321 | struct pl031_local *ldata; |
| 321 | struct pl031_vendor_data *vendor = id->data; | 322 | struct pl031_vendor_data *vendor = id->data; |
| 322 | struct rtc_class_ops *ops = &vendor->ops; | 323 | struct rtc_class_ops *ops = &vendor->ops; |
| 323 | unsigned long time; | 324 | unsigned long time, data; |
| 324 | 325 | ||
| 325 | ret = amba_request_regions(adev, NULL); | 326 | ret = amba_request_regions(adev, NULL); |
| 326 | if (ret) | 327 | if (ret) |
| @@ -345,10 +346,11 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 345 | dev_dbg(&adev->dev, "designer ID = 0x%02x\n", amba_manf(adev)); | 346 | dev_dbg(&adev->dev, "designer ID = 0x%02x\n", amba_manf(adev)); |
| 346 | dev_dbg(&adev->dev, "revision = 0x%01x\n", amba_rev(adev)); | 347 | dev_dbg(&adev->dev, "revision = 0x%01x\n", amba_rev(adev)); |
| 347 | 348 | ||
| 349 | data = readl(ldata->base + RTC_CR); | ||
| 348 | /* Enable the clockwatch on ST Variants */ | 350 | /* Enable the clockwatch on ST Variants */ |
| 349 | if (vendor->clockwatch) | 351 | if (vendor->clockwatch) |
| 350 | writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN, | 352 | data |= RTC_CR_CWEN; |
| 351 | ldata->base + RTC_CR); | 353 | writel(data | RTC_CR_EN, ldata->base + RTC_CR); |
| 352 | 354 | ||
| 353 | /* | 355 | /* |
| 354 | * On ST PL031 variants, the RTC reset value does not provide correct | 356 | * On ST PL031 variants, the RTC reset value does not provide correct |
diff --git a/drivers/rtc/rtc-vt8500.c b/drivers/rtc/rtc-vt8500.c index 00c930f4b6f3..2730533e2d2d 100644 --- a/drivers/rtc/rtc-vt8500.c +++ b/drivers/rtc/rtc-vt8500.c | |||
| @@ -137,7 +137,7 @@ static int vt8500_rtc_set_time(struct device *dev, struct rtc_time *tm) | |||
| 137 | return -EINVAL; | 137 | return -EINVAL; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | writel((bin2bcd(tm->tm_year - 100) << DATE_YEAR_S) | 140 | writel((bin2bcd(tm->tm_year % 100) << DATE_YEAR_S) |
| 141 | | (bin2bcd(tm->tm_mon + 1) << DATE_MONTH_S) | 141 | | (bin2bcd(tm->tm_mon + 1) << DATE_MONTH_S) |
| 142 | | (bin2bcd(tm->tm_mday)) | 142 | | (bin2bcd(tm->tm_mday)) |
| 143 | | ((tm->tm_year >= 200) << DATE_CENTURY_S), | 143 | | ((tm->tm_year >= 200) << DATE_CENTURY_S), |
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index e2695101bb99..f2aa7543d20a 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
| @@ -941,6 +941,8 @@ int se_dev_set_queue_depth(struct se_device *dev, u32 queue_depth) | |||
| 941 | 941 | ||
| 942 | int se_dev_set_fabric_max_sectors(struct se_device *dev, u32 fabric_max_sectors) | 942 | int se_dev_set_fabric_max_sectors(struct se_device *dev, u32 fabric_max_sectors) |
| 943 | { | 943 | { |
| 944 | int block_size = dev->dev_attrib.block_size; | ||
| 945 | |||
| 944 | if (dev->export_count) { | 946 | if (dev->export_count) { |
| 945 | pr_err("dev[%p]: Unable to change SE Device" | 947 | pr_err("dev[%p]: Unable to change SE Device" |
| 946 | " fabric_max_sectors while export_count is %d\n", | 948 | " fabric_max_sectors while export_count is %d\n", |
| @@ -978,8 +980,12 @@ int se_dev_set_fabric_max_sectors(struct se_device *dev, u32 fabric_max_sectors) | |||
| 978 | /* | 980 | /* |
| 979 | * Align max_sectors down to PAGE_SIZE to follow transport_allocate_data_tasks() | 981 | * Align max_sectors down to PAGE_SIZE to follow transport_allocate_data_tasks() |
| 980 | */ | 982 | */ |
| 983 | if (!block_size) { | ||
| 984 | block_size = 512; | ||
| 985 | pr_warn("Defaulting to 512 for zero block_size\n"); | ||
| 986 | } | ||
| 981 | fabric_max_sectors = se_dev_align_max_sectors(fabric_max_sectors, | 987 | fabric_max_sectors = se_dev_align_max_sectors(fabric_max_sectors, |
| 982 | dev->dev_attrib.block_size); | 988 | block_size); |
| 983 | 989 | ||
| 984 | dev->dev_attrib.fabric_max_sectors = fabric_max_sectors; | 990 | dev->dev_attrib.fabric_max_sectors = fabric_max_sectors; |
| 985 | pr_debug("dev[%p]: SE Device max_sectors changed to %u\n", | 991 | pr_debug("dev[%p]: SE Device max_sectors changed to %u\n", |
diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c index 810263dfa4a1..c57bbbc7a7d1 100644 --- a/drivers/target/target_core_fabric_configfs.c +++ b/drivers/target/target_core_fabric_configfs.c | |||
| @@ -754,6 +754,11 @@ static int target_fabric_port_link( | |||
| 754 | return -EFAULT; | 754 | return -EFAULT; |
| 755 | } | 755 | } |
| 756 | 756 | ||
| 757 | if (!(dev->dev_flags & DF_CONFIGURED)) { | ||
| 758 | pr_err("se_device not configured yet, cannot port link\n"); | ||
| 759 | return -ENODEV; | ||
| 760 | } | ||
| 761 | |||
| 757 | tpg_ci = &lun_ci->ci_parent->ci_group->cg_item; | 762 | tpg_ci = &lun_ci->ci_parent->ci_group->cg_item; |
| 758 | se_tpg = container_of(to_config_group(tpg_ci), | 763 | se_tpg = container_of(to_config_group(tpg_ci), |
| 759 | struct se_portal_group, tpg_group); | 764 | struct se_portal_group, tpg_group); |
diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index 26a6d183ccb1..a664c664a31a 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c | |||
| @@ -58,11 +58,10 @@ sbc_emulate_readcapacity(struct se_cmd *cmd) | |||
| 58 | buf[7] = dev->dev_attrib.block_size & 0xff; | 58 | buf[7] = dev->dev_attrib.block_size & 0xff; |
| 59 | 59 | ||
| 60 | rbuf = transport_kmap_data_sg(cmd); | 60 | rbuf = transport_kmap_data_sg(cmd); |
| 61 | if (!rbuf) | 61 | if (rbuf) { |
| 62 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | 62 | memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length)); |
| 63 | 63 | transport_kunmap_data_sg(cmd); | |
| 64 | memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length)); | 64 | } |
| 65 | transport_kunmap_data_sg(cmd); | ||
| 66 | 65 | ||
| 67 | target_complete_cmd(cmd, GOOD); | 66 | target_complete_cmd(cmd, GOOD); |
| 68 | return 0; | 67 | return 0; |
| @@ -97,11 +96,10 @@ sbc_emulate_readcapacity_16(struct se_cmd *cmd) | |||
| 97 | buf[14] = 0x80; | 96 | buf[14] = 0x80; |
| 98 | 97 | ||
| 99 | rbuf = transport_kmap_data_sg(cmd); | 98 | rbuf = transport_kmap_data_sg(cmd); |
| 100 | if (!rbuf) | 99 | if (rbuf) { |
| 101 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | 100 | memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length)); |
| 102 | 101 | transport_kunmap_data_sg(cmd); | |
| 103 | memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length)); | 102 | } |
| 104 | transport_kunmap_data_sg(cmd); | ||
| 105 | 103 | ||
| 106 | target_complete_cmd(cmd, GOOD); | 104 | target_complete_cmd(cmd, GOOD); |
| 107 | return 0; | 105 | return 0; |
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c index 84f9e96e8ace..2d88f087d961 100644 --- a/drivers/target/target_core_spc.c +++ b/drivers/target/target_core_spc.c | |||
| @@ -641,11 +641,10 @@ spc_emulate_inquiry(struct se_cmd *cmd) | |||
| 641 | 641 | ||
| 642 | out: | 642 | out: |
| 643 | rbuf = transport_kmap_data_sg(cmd); | 643 | rbuf = transport_kmap_data_sg(cmd); |
| 644 | if (!rbuf) | 644 | if (rbuf) { |
| 645 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | 645 | memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length)); |
| 646 | 646 | transport_kunmap_data_sg(cmd); | |
| 647 | memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length)); | 647 | } |
| 648 | transport_kunmap_data_sg(cmd); | ||
| 649 | 648 | ||
| 650 | if (!ret) | 649 | if (!ret) |
| 651 | target_complete_cmd(cmd, GOOD); | 650 | target_complete_cmd(cmd, GOOD); |
| @@ -851,7 +850,7 @@ static sense_reason_t spc_emulate_modesense(struct se_cmd *cmd) | |||
| 851 | { | 850 | { |
| 852 | struct se_device *dev = cmd->se_dev; | 851 | struct se_device *dev = cmd->se_dev; |
| 853 | char *cdb = cmd->t_task_cdb; | 852 | char *cdb = cmd->t_task_cdb; |
| 854 | unsigned char *buf, *map_buf; | 853 | unsigned char buf[SE_MODE_PAGE_BUF], *rbuf; |
| 855 | int type = dev->transport->get_device_type(dev); | 854 | int type = dev->transport->get_device_type(dev); |
| 856 | int ten = (cmd->t_task_cdb[0] == MODE_SENSE_10); | 855 | int ten = (cmd->t_task_cdb[0] == MODE_SENSE_10); |
| 857 | bool dbd = !!(cdb[1] & 0x08); | 856 | bool dbd = !!(cdb[1] & 0x08); |
| @@ -863,26 +862,8 @@ static sense_reason_t spc_emulate_modesense(struct se_cmd *cmd) | |||
| 863 | int ret; | 862 | int ret; |
| 864 | int i; | 863 | int i; |
| 865 | 864 | ||
| 866 | map_buf = transport_kmap_data_sg(cmd); | 865 | memset(buf, 0, SE_MODE_PAGE_BUF); |
| 867 | if (!map_buf) | 866 | |
| 868 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
| 869 | /* | ||
| 870 | * If SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC is not set, then we | ||
| 871 | * know we actually allocated a full page. Otherwise, if the | ||
| 872 | * data buffer is too small, allocate a temporary buffer so we | ||
| 873 | * don't have to worry about overruns in all our INQUIRY | ||
| 874 | * emulation handling. | ||
| 875 | */ | ||
| 876 | if (cmd->data_length < SE_MODE_PAGE_BUF && | ||
| 877 | (cmd->se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC)) { | ||
| 878 | buf = kzalloc(SE_MODE_PAGE_BUF, GFP_KERNEL); | ||
| 879 | if (!buf) { | ||
| 880 | transport_kunmap_data_sg(cmd); | ||
| 881 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
| 882 | } | ||
| 883 | } else { | ||
| 884 | buf = map_buf; | ||
| 885 | } | ||
| 886 | /* | 867 | /* |
| 887 | * Skip over MODE DATA LENGTH + MEDIUM TYPE fields to byte 3 for | 868 | * Skip over MODE DATA LENGTH + MEDIUM TYPE fields to byte 3 for |
| 888 | * MODE_SENSE_10 and byte 2 for MODE_SENSE (6). | 869 | * MODE_SENSE_10 and byte 2 for MODE_SENSE (6). |
| @@ -934,8 +915,6 @@ static sense_reason_t spc_emulate_modesense(struct se_cmd *cmd) | |||
| 934 | if (page == 0x3f) { | 915 | if (page == 0x3f) { |
| 935 | if (subpage != 0x00 && subpage != 0xff) { | 916 | if (subpage != 0x00 && subpage != 0xff) { |
| 936 | pr_warn("MODE_SENSE: Invalid subpage code: 0x%02x\n", subpage); | 917 | pr_warn("MODE_SENSE: Invalid subpage code: 0x%02x\n", subpage); |
| 937 | kfree(buf); | ||
| 938 | transport_kunmap_data_sg(cmd); | ||
| 939 | return TCM_INVALID_CDB_FIELD; | 918 | return TCM_INVALID_CDB_FIELD; |
| 940 | } | 919 | } |
| 941 | 920 | ||
| @@ -972,7 +951,6 @@ static sense_reason_t spc_emulate_modesense(struct se_cmd *cmd) | |||
| 972 | pr_err("MODE SENSE: unimplemented page/subpage: 0x%02x/0x%02x\n", | 951 | pr_err("MODE SENSE: unimplemented page/subpage: 0x%02x/0x%02x\n", |
| 973 | page, subpage); | 952 | page, subpage); |
| 974 | 953 | ||
| 975 | transport_kunmap_data_sg(cmd); | ||
| 976 | return TCM_UNKNOWN_MODE_PAGE; | 954 | return TCM_UNKNOWN_MODE_PAGE; |
| 977 | 955 | ||
| 978 | set_length: | 956 | set_length: |
| @@ -981,12 +959,12 @@ set_length: | |||
| 981 | else | 959 | else |
| 982 | buf[0] = length - 1; | 960 | buf[0] = length - 1; |
| 983 | 961 | ||
| 984 | if (buf != map_buf) { | 962 | rbuf = transport_kmap_data_sg(cmd); |
| 985 | memcpy(map_buf, buf, cmd->data_length); | 963 | if (rbuf) { |
| 986 | kfree(buf); | 964 | memcpy(rbuf, buf, min_t(u32, SE_MODE_PAGE_BUF, cmd->data_length)); |
| 965 | transport_kunmap_data_sg(cmd); | ||
| 987 | } | 966 | } |
| 988 | 967 | ||
| 989 | transport_kunmap_data_sg(cmd); | ||
| 990 | target_complete_cmd(cmd, GOOD); | 968 | target_complete_cmd(cmd, GOOD); |
| 991 | return 0; | 969 | return 0; |
| 992 | } | 970 | } |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 4225d5e72131..8e64adf8e4d5 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | #include <asm/unaligned.h> | 39 | #include <asm/unaligned.h> |
| 40 | #include <linux/platform_device.h> | 40 | #include <linux/platform_device.h> |
| 41 | #include <linux/workqueue.h> | 41 | #include <linux/workqueue.h> |
| 42 | #include <linux/pm_runtime.h> | ||
| 42 | 43 | ||
| 43 | #include <linux/usb.h> | 44 | #include <linux/usb.h> |
| 44 | #include <linux/usb/hcd.h> | 45 | #include <linux/usb/hcd.h> |
| @@ -1025,6 +1026,49 @@ static int register_root_hub(struct usb_hcd *hcd) | |||
| 1025 | return retval; | 1026 | return retval; |
| 1026 | } | 1027 | } |
| 1027 | 1028 | ||
| 1029 | /* | ||
| 1030 | * usb_hcd_start_port_resume - a root-hub port is sending a resume signal | ||
| 1031 | * @bus: the bus which the root hub belongs to | ||
| 1032 | * @portnum: the port which is being resumed | ||
| 1033 | * | ||
| 1034 | * HCDs should call this function when they know that a resume signal is | ||
| 1035 | * being sent to a root-hub port. The root hub will be prevented from | ||
| 1036 | * going into autosuspend until usb_hcd_end_port_resume() is called. | ||
| 1037 | * | ||
| 1038 | * The bus's private lock must be held by the caller. | ||
| 1039 | */ | ||
| 1040 | void usb_hcd_start_port_resume(struct usb_bus *bus, int portnum) | ||
| 1041 | { | ||
| 1042 | unsigned bit = 1 << portnum; | ||
| 1043 | |||
| 1044 | if (!(bus->resuming_ports & bit)) { | ||
| 1045 | bus->resuming_ports |= bit; | ||
| 1046 | pm_runtime_get_noresume(&bus->root_hub->dev); | ||
| 1047 | } | ||
| 1048 | } | ||
| 1049 | EXPORT_SYMBOL_GPL(usb_hcd_start_port_resume); | ||
| 1050 | |||
| 1051 | /* | ||
| 1052 | * usb_hcd_end_port_resume - a root-hub port has stopped sending a resume signal | ||
| 1053 | * @bus: the bus which the root hub belongs to | ||
| 1054 | * @portnum: the port which is being resumed | ||
| 1055 | * | ||
| 1056 | * HCDs should call this function when they know that a resume signal has | ||
| 1057 | * stopped being sent to a root-hub port. The root hub will be allowed to | ||
| 1058 | * autosuspend again. | ||
| 1059 | * | ||
| 1060 | * The bus's private lock must be held by the caller. | ||
| 1061 | */ | ||
| 1062 | void usb_hcd_end_port_resume(struct usb_bus *bus, int portnum) | ||
| 1063 | { | ||
| 1064 | unsigned bit = 1 << portnum; | ||
| 1065 | |||
| 1066 | if (bus->resuming_ports & bit) { | ||
| 1067 | bus->resuming_ports &= ~bit; | ||
| 1068 | pm_runtime_put_noidle(&bus->root_hub->dev); | ||
| 1069 | } | ||
| 1070 | } | ||
| 1071 | EXPORT_SYMBOL_GPL(usb_hcd_end_port_resume); | ||
| 1028 | 1072 | ||
| 1029 | /*-------------------------------------------------------------------------*/ | 1073 | /*-------------------------------------------------------------------------*/ |
| 1030 | 1074 | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 957ed2c41482..cbf7168e3ce7 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -2838,6 +2838,23 @@ void usb_enable_ltm(struct usb_device *udev) | |||
| 2838 | EXPORT_SYMBOL_GPL(usb_enable_ltm); | 2838 | EXPORT_SYMBOL_GPL(usb_enable_ltm); |
| 2839 | 2839 | ||
| 2840 | #ifdef CONFIG_USB_SUSPEND | 2840 | #ifdef CONFIG_USB_SUSPEND |
| 2841 | /* | ||
| 2842 | * usb_disable_function_remotewakeup - disable usb3.0 | ||
| 2843 | * device's function remote wakeup | ||
| 2844 | * @udev: target device | ||
| 2845 | * | ||
| 2846 | * Assume there's only one function on the USB 3.0 | ||
| 2847 | * device and disable remote wake for the first | ||
| 2848 | * interface. FIXME if the interface association | ||
| 2849 | * descriptor shows there's more than one function. | ||
| 2850 | */ | ||
| 2851 | static int usb_disable_function_remotewakeup(struct usb_device *udev) | ||
| 2852 | { | ||
| 2853 | return usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
| 2854 | USB_REQ_CLEAR_FEATURE, USB_RECIP_INTERFACE, | ||
| 2855 | USB_INTRF_FUNC_SUSPEND, 0, NULL, 0, | ||
| 2856 | USB_CTRL_SET_TIMEOUT); | ||
| 2857 | } | ||
| 2841 | 2858 | ||
| 2842 | /* | 2859 | /* |
| 2843 | * usb_port_suspend - suspend a usb device's upstream port | 2860 | * usb_port_suspend - suspend a usb device's upstream port |
| @@ -2955,12 +2972,19 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) | |||
| 2955 | dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", | 2972 | dev_dbg(hub->intfdev, "can't suspend port %d, status %d\n", |
| 2956 | port1, status); | 2973 | port1, status); |
| 2957 | /* paranoia: "should not happen" */ | 2974 | /* paranoia: "should not happen" */ |
| 2958 | if (udev->do_remote_wakeup) | 2975 | if (udev->do_remote_wakeup) { |
| 2959 | (void) usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | 2976 | if (!hub_is_superspeed(hub->hdev)) { |
| 2960 | USB_REQ_CLEAR_FEATURE, USB_RECIP_DEVICE, | 2977 | (void) usb_control_msg(udev, |
| 2961 | USB_DEVICE_REMOTE_WAKEUP, 0, | 2978 | usb_sndctrlpipe(udev, 0), |
| 2962 | NULL, 0, | 2979 | USB_REQ_CLEAR_FEATURE, |
| 2963 | USB_CTRL_SET_TIMEOUT); | 2980 | USB_RECIP_DEVICE, |
| 2981 | USB_DEVICE_REMOTE_WAKEUP, 0, | ||
| 2982 | NULL, 0, | ||
| 2983 | USB_CTRL_SET_TIMEOUT); | ||
| 2984 | } else | ||
| 2985 | (void) usb_disable_function_remotewakeup(udev); | ||
| 2986 | |||
| 2987 | } | ||
| 2964 | 2988 | ||
| 2965 | /* Try to enable USB2 hardware LPM again */ | 2989 | /* Try to enable USB2 hardware LPM again */ |
| 2966 | if (udev->usb2_hw_lpm_capable == 1) | 2990 | if (udev->usb2_hw_lpm_capable == 1) |
| @@ -3052,20 +3076,30 @@ static int finish_port_resume(struct usb_device *udev) | |||
| 3052 | * udev->reset_resume | 3076 | * udev->reset_resume |
| 3053 | */ | 3077 | */ |
| 3054 | } else if (udev->actconfig && !udev->reset_resume) { | 3078 | } else if (udev->actconfig && !udev->reset_resume) { |
| 3055 | le16_to_cpus(&devstatus); | 3079 | if (!hub_is_superspeed(udev->parent)) { |
| 3056 | if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) { | 3080 | le16_to_cpus(&devstatus); |
| 3057 | status = usb_control_msg(udev, | 3081 | if (devstatus & (1 << USB_DEVICE_REMOTE_WAKEUP)) |
| 3058 | usb_sndctrlpipe(udev, 0), | 3082 | status = usb_control_msg(udev, |
| 3059 | USB_REQ_CLEAR_FEATURE, | 3083 | usb_sndctrlpipe(udev, 0), |
| 3084 | USB_REQ_CLEAR_FEATURE, | ||
| 3060 | USB_RECIP_DEVICE, | 3085 | USB_RECIP_DEVICE, |
| 3061 | USB_DEVICE_REMOTE_WAKEUP, 0, | 3086 | USB_DEVICE_REMOTE_WAKEUP, 0, |
| 3062 | NULL, 0, | 3087 | NULL, 0, |
| 3063 | USB_CTRL_SET_TIMEOUT); | 3088 | USB_CTRL_SET_TIMEOUT); |
| 3064 | if (status) | 3089 | } else { |
| 3065 | dev_dbg(&udev->dev, | 3090 | status = usb_get_status(udev, USB_RECIP_INTERFACE, 0, |
| 3066 | "disable remote wakeup, status %d\n", | 3091 | &devstatus); |
| 3067 | status); | 3092 | le16_to_cpus(&devstatus); |
| 3093 | if (!status && devstatus & (USB_INTRF_STAT_FUNC_RW_CAP | ||
| 3094 | | USB_INTRF_STAT_FUNC_RW)) | ||
| 3095 | status = | ||
| 3096 | usb_disable_function_remotewakeup(udev); | ||
| 3068 | } | 3097 | } |
| 3098 | |||
| 3099 | if (status) | ||
| 3100 | dev_dbg(&udev->dev, | ||
| 3101 | "disable remote wakeup, status %d\n", | ||
| 3102 | status); | ||
| 3069 | status = 0; | 3103 | status = 0; |
| 3070 | } | 3104 | } |
| 3071 | return status; | 3105 | return status; |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 09537b2f1002..b416a3fc9959 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -797,6 +797,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
| 797 | ehci->reset_done[i] = jiffies + msecs_to_jiffies(25); | 797 | ehci->reset_done[i] = jiffies + msecs_to_jiffies(25); |
| 798 | set_bit(i, &ehci->resuming_ports); | 798 | set_bit(i, &ehci->resuming_ports); |
| 799 | ehci_dbg (ehci, "port %d remote wakeup\n", i + 1); | 799 | ehci_dbg (ehci, "port %d remote wakeup\n", i + 1); |
| 800 | usb_hcd_start_port_resume(&hcd->self, i); | ||
| 800 | mod_timer(&hcd->rh_timer, ehci->reset_done[i]); | 801 | mod_timer(&hcd->rh_timer, ehci->reset_done[i]); |
| 801 | } | 802 | } |
| 802 | } | 803 | } |
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 4ccb97c0678f..4d3b294f203e 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
| @@ -649,7 +649,11 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
| 649 | status = STS_PCD; | 649 | status = STS_PCD; |
| 650 | } | 650 | } |
| 651 | } | 651 | } |
| 652 | /* FIXME autosuspend idle root hubs */ | 652 | |
| 653 | /* If a resume is in progress, make sure it can finish */ | ||
| 654 | if (ehci->resuming_ports) | ||
| 655 | mod_timer(&hcd->rh_timer, jiffies + msecs_to_jiffies(25)); | ||
| 656 | |||
| 653 | spin_unlock_irqrestore (&ehci->lock, flags); | 657 | spin_unlock_irqrestore (&ehci->lock, flags); |
| 654 | return status ? retval : 0; | 658 | return status ? retval : 0; |
| 655 | } | 659 | } |
| @@ -851,6 +855,7 @@ static int ehci_hub_control ( | |||
| 851 | /* resume signaling for 20 msec */ | 855 | /* resume signaling for 20 msec */ |
| 852 | ehci->reset_done[wIndex] = jiffies | 856 | ehci->reset_done[wIndex] = jiffies |
| 853 | + msecs_to_jiffies(20); | 857 | + msecs_to_jiffies(20); |
| 858 | usb_hcd_start_port_resume(&hcd->self, wIndex); | ||
| 854 | /* check the port again */ | 859 | /* check the port again */ |
| 855 | mod_timer(&ehci_to_hcd(ehci)->rh_timer, | 860 | mod_timer(&ehci_to_hcd(ehci)->rh_timer, |
| 856 | ehci->reset_done[wIndex]); | 861 | ehci->reset_done[wIndex]); |
| @@ -862,6 +867,7 @@ static int ehci_hub_control ( | |||
| 862 | clear_bit(wIndex, &ehci->suspended_ports); | 867 | clear_bit(wIndex, &ehci->suspended_ports); |
| 863 | set_bit(wIndex, &ehci->port_c_suspend); | 868 | set_bit(wIndex, &ehci->port_c_suspend); |
| 864 | ehci->reset_done[wIndex] = 0; | 869 | ehci->reset_done[wIndex] = 0; |
| 870 | usb_hcd_end_port_resume(&hcd->self, wIndex); | ||
| 865 | 871 | ||
| 866 | /* stop resume signaling */ | 872 | /* stop resume signaling */ |
| 867 | temp = ehci_readl(ehci, status_reg); | 873 | temp = ehci_readl(ehci, status_reg); |
| @@ -950,6 +956,7 @@ static int ehci_hub_control ( | |||
| 950 | ehci->reset_done[wIndex] = 0; | 956 | ehci->reset_done[wIndex] = 0; |
| 951 | if (temp & PORT_PE) | 957 | if (temp & PORT_PE) |
| 952 | set_bit(wIndex, &ehci->port_c_suspend); | 958 | set_bit(wIndex, &ehci->port_c_suspend); |
| 959 | usb_hcd_end_port_resume(&hcd->self, wIndex); | ||
| 953 | } | 960 | } |
| 954 | 961 | ||
| 955 | if (temp & PORT_OC) | 962 | if (temp & PORT_OC) |
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 3d989028c836..fd252f0cfb3a 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
| @@ -1197,17 +1197,26 @@ static void start_iaa_cycle(struct ehci_hcd *ehci, bool nested) | |||
| 1197 | if (ehci->async_iaa || ehci->async_unlinking) | 1197 | if (ehci->async_iaa || ehci->async_unlinking) |
| 1198 | return; | 1198 | return; |
| 1199 | 1199 | ||
| 1200 | /* Do all the waiting QHs at once */ | ||
| 1201 | ehci->async_iaa = ehci->async_unlink; | ||
| 1202 | ehci->async_unlink = NULL; | ||
| 1203 | |||
| 1204 | /* If the controller isn't running, we don't have to wait for it */ | 1200 | /* If the controller isn't running, we don't have to wait for it */ |
| 1205 | if (unlikely(ehci->rh_state < EHCI_RH_RUNNING)) { | 1201 | if (unlikely(ehci->rh_state < EHCI_RH_RUNNING)) { |
| 1202 | |||
| 1203 | /* Do all the waiting QHs */ | ||
| 1204 | ehci->async_iaa = ehci->async_unlink; | ||
| 1205 | ehci->async_unlink = NULL; | ||
| 1206 | |||
| 1206 | if (!nested) /* Avoid recursion */ | 1207 | if (!nested) /* Avoid recursion */ |
| 1207 | end_unlink_async(ehci); | 1208 | end_unlink_async(ehci); |
| 1208 | 1209 | ||
| 1209 | /* Otherwise start a new IAA cycle */ | 1210 | /* Otherwise start a new IAA cycle */ |
| 1210 | } else if (likely(ehci->rh_state == EHCI_RH_RUNNING)) { | 1211 | } else if (likely(ehci->rh_state == EHCI_RH_RUNNING)) { |
| 1212 | struct ehci_qh *qh; | ||
| 1213 | |||
| 1214 | /* Do only the first waiting QH (nVidia bug?) */ | ||
| 1215 | qh = ehci->async_unlink; | ||
| 1216 | ehci->async_iaa = qh; | ||
| 1217 | ehci->async_unlink = qh->unlink_next; | ||
| 1218 | qh->unlink_next = NULL; | ||
| 1219 | |||
| 1211 | /* Make sure the unlinks are all visible to the hardware */ | 1220 | /* Make sure the unlinks are all visible to the hardware */ |
| 1212 | wmb(); | 1221 | wmb(); |
| 1213 | 1222 | ||
| @@ -1255,34 +1264,35 @@ static void end_unlink_async(struct ehci_hcd *ehci) | |||
| 1255 | } | 1264 | } |
| 1256 | } | 1265 | } |
| 1257 | 1266 | ||
| 1267 | static void start_unlink_async(struct ehci_hcd *ehci, struct ehci_qh *qh); | ||
| 1268 | |||
| 1258 | static void unlink_empty_async(struct ehci_hcd *ehci) | 1269 | static void unlink_empty_async(struct ehci_hcd *ehci) |
| 1259 | { | 1270 | { |
| 1260 | struct ehci_qh *qh, *next; | 1271 | struct ehci_qh *qh; |
| 1261 | bool stopped = (ehci->rh_state < EHCI_RH_RUNNING); | 1272 | struct ehci_qh *qh_to_unlink = NULL; |
| 1262 | bool check_unlinks_later = false; | 1273 | bool check_unlinks_later = false; |
| 1274 | int count = 0; | ||
| 1263 | 1275 | ||
| 1264 | /* Unlink all the async QHs that have been empty for a timer cycle */ | 1276 | /* Find the last async QH which has been empty for a timer cycle */ |
| 1265 | next = ehci->async->qh_next.qh; | 1277 | for (qh = ehci->async->qh_next.qh; qh; qh = qh->qh_next.qh) { |
| 1266 | while (next) { | ||
| 1267 | qh = next; | ||
| 1268 | next = qh->qh_next.qh; | ||
| 1269 | |||
| 1270 | if (list_empty(&qh->qtd_list) && | 1278 | if (list_empty(&qh->qtd_list) && |
| 1271 | qh->qh_state == QH_STATE_LINKED) { | 1279 | qh->qh_state == QH_STATE_LINKED) { |
| 1272 | if (!stopped && qh->unlink_cycle == | 1280 | ++count; |
| 1273 | ehci->async_unlink_cycle) | 1281 | if (qh->unlink_cycle == ehci->async_unlink_cycle) |
| 1274 | check_unlinks_later = true; | 1282 | check_unlinks_later = true; |
| 1275 | else | 1283 | else |
| 1276 | single_unlink_async(ehci, qh); | 1284 | qh_to_unlink = qh; |
| 1277 | } | 1285 | } |
| 1278 | } | 1286 | } |
| 1279 | 1287 | ||
| 1280 | /* Start a new IAA cycle if any QHs are waiting for it */ | 1288 | /* If nothing else is being unlinked, unlink the last empty QH */ |
| 1281 | if (ehci->async_unlink) | 1289 | if (!ehci->async_iaa && !ehci->async_unlink && qh_to_unlink) { |
| 1282 | start_iaa_cycle(ehci, false); | 1290 | start_unlink_async(ehci, qh_to_unlink); |
| 1291 | --count; | ||
| 1292 | } | ||
| 1283 | 1293 | ||
| 1284 | /* QHs that haven't been empty for long enough will be handled later */ | 1294 | /* Other QHs will be handled later */ |
| 1285 | if (check_unlinks_later) { | 1295 | if (count > 0) { |
| 1286 | ehci_enable_event(ehci, EHCI_HRTIMER_ASYNC_UNLINKS, true); | 1296 | ehci_enable_event(ehci, EHCI_HRTIMER_ASYNC_UNLINKS, true); |
| 1287 | ++ehci->async_unlink_cycle; | 1297 | ++ehci->async_unlink_cycle; |
| 1288 | } | 1298 | } |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 69ebee73c0c1..b476daf49f6f 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, 30, 0 }; | 216 | max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 125, 25 }; |
| 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]) |
| @@ -2212,11 +2212,11 @@ static void scan_isoc(struct ehci_hcd *ehci) | |||
| 2212 | } | 2212 | } |
| 2213 | ehci->now_frame = now_frame; | 2213 | ehci->now_frame = now_frame; |
| 2214 | 2214 | ||
| 2215 | frame = ehci->last_iso_frame; | ||
| 2215 | for (;;) { | 2216 | for (;;) { |
| 2216 | union ehci_shadow q, *q_p; | 2217 | union ehci_shadow q, *q_p; |
| 2217 | __hc32 type, *hw_p; | 2218 | __hc32 type, *hw_p; |
| 2218 | 2219 | ||
| 2219 | frame = ehci->last_iso_frame; | ||
| 2220 | restart: | 2220 | restart: |
| 2221 | /* scan each element in frame's queue for completions */ | 2221 | /* scan each element in frame's queue for completions */ |
| 2222 | q_p = &ehci->pshadow [frame]; | 2222 | q_p = &ehci->pshadow [frame]; |
| @@ -2321,6 +2321,9 @@ restart: | |||
| 2321 | /* Stop when we have reached the current frame */ | 2321 | /* Stop when we have reached the current frame */ |
| 2322 | if (frame == now_frame) | 2322 | if (frame == now_frame) |
| 2323 | break; | 2323 | break; |
| 2324 | ehci->last_iso_frame = (frame + 1) & fmask; | 2324 | |
| 2325 | /* The last frame may still have active siTDs */ | ||
| 2326 | ehci->last_iso_frame = frame; | ||
| 2327 | frame = (frame + 1) & fmask; | ||
| 2325 | } | 2328 | } |
| 2326 | } | 2329 | } |
diff --git a/drivers/usb/host/ehci-timer.c b/drivers/usb/host/ehci-timer.c index 20dbdcbe9b0f..f904071d70df 100644 --- a/drivers/usb/host/ehci-timer.c +++ b/drivers/usb/host/ehci-timer.c | |||
| @@ -113,14 +113,15 @@ static void ehci_poll_ASS(struct ehci_hcd *ehci) | |||
| 113 | 113 | ||
| 114 | if (want != actual) { | 114 | if (want != actual) { |
| 115 | 115 | ||
| 116 | /* Poll again later, but give up after about 20 ms */ | 116 | /* Poll again later */ |
| 117 | if (ehci->ASS_poll_count++ < 20) { | 117 | ehci_enable_event(ehci, EHCI_HRTIMER_POLL_ASS, true); |
| 118 | ehci_enable_event(ehci, EHCI_HRTIMER_POLL_ASS, true); | 118 | ++ehci->ASS_poll_count; |
| 119 | return; | 119 | return; |
| 120 | } | ||
| 121 | ehci_dbg(ehci, "Waited too long for the async schedule status (%x/%x), giving up\n", | ||
| 122 | want, actual); | ||
| 123 | } | 120 | } |
| 121 | |||
| 122 | if (ehci->ASS_poll_count > 20) | ||
| 123 | ehci_dbg(ehci, "ASS poll count reached %d\n", | ||
| 124 | ehci->ASS_poll_count); | ||
| 124 | ehci->ASS_poll_count = 0; | 125 | ehci->ASS_poll_count = 0; |
| 125 | 126 | ||
| 126 | /* The status is up-to-date; restart or stop the schedule as needed */ | 127 | /* The status is up-to-date; restart or stop the schedule as needed */ |
| @@ -159,14 +160,14 @@ static void ehci_poll_PSS(struct ehci_hcd *ehci) | |||
| 159 | 160 | ||
| 160 | if (want != actual) { | 161 | if (want != actual) { |
| 161 | 162 | ||
| 162 | /* Poll again later, but give up after about 20 ms */ | 163 | /* Poll again later */ |
| 163 | if (ehci->PSS_poll_count++ < 20) { | 164 | ehci_enable_event(ehci, EHCI_HRTIMER_POLL_PSS, true); |
| 164 | ehci_enable_event(ehci, EHCI_HRTIMER_POLL_PSS, true); | 165 | return; |
| 165 | return; | ||
| 166 | } | ||
| 167 | ehci_dbg(ehci, "Waited too long for the periodic schedule status (%x/%x), giving up\n", | ||
| 168 | want, actual); | ||
| 169 | } | 166 | } |
| 167 | |||
| 168 | if (ehci->PSS_poll_count > 20) | ||
| 169 | ehci_dbg(ehci, "PSS poll count reached %d\n", | ||
| 170 | ehci->PSS_poll_count); | ||
| 170 | ehci->PSS_poll_count = 0; | 171 | ehci->PSS_poll_count = 0; |
| 171 | 172 | ||
| 172 | /* The status is up-to-date; restart or stop the schedule as needed */ | 173 | /* The status is up-to-date; restart or stop the schedule as needed */ |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index a3b6d7104ae2..4c338ec03a07 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
| @@ -780,6 +780,7 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev) | |||
| 780 | "defaulting to EHCI.\n"); | 780 | "defaulting to EHCI.\n"); |
| 781 | dev_warn(&xhci_pdev->dev, | 781 | dev_warn(&xhci_pdev->dev, |
| 782 | "USB 3.0 devices will work at USB 2.0 speeds.\n"); | 782 | "USB 3.0 devices will work at USB 2.0 speeds.\n"); |
| 783 | usb_disable_xhci_ports(xhci_pdev); | ||
| 783 | return; | 784 | return; |
| 784 | } | 785 | } |
| 785 | 786 | ||
diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c index 768d54295a20..15d13229ddbb 100644 --- a/drivers/usb/host/uhci-hub.c +++ b/drivers/usb/host/uhci-hub.c | |||
| @@ -116,6 +116,7 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, | |||
| 116 | } | 116 | } |
| 117 | } | 117 | } |
| 118 | clear_bit(port, &uhci->resuming_ports); | 118 | clear_bit(port, &uhci->resuming_ports); |
| 119 | usb_hcd_end_port_resume(&uhci_to_hcd(uhci)->self, port); | ||
| 119 | } | 120 | } |
| 120 | 121 | ||
| 121 | /* Wait for the UHCI controller in HP's iLO2 server management chip. | 122 | /* Wait for the UHCI controller in HP's iLO2 server management chip. |
| @@ -167,6 +168,8 @@ static void uhci_check_ports(struct uhci_hcd *uhci) | |||
| 167 | set_bit(port, &uhci->resuming_ports); | 168 | set_bit(port, &uhci->resuming_ports); |
| 168 | uhci->ports_timeout = jiffies + | 169 | uhci->ports_timeout = jiffies + |
| 169 | msecs_to_jiffies(25); | 170 | msecs_to_jiffies(25); |
| 171 | usb_hcd_start_port_resume( | ||
| 172 | &uhci_to_hcd(uhci)->self, port); | ||
| 170 | 173 | ||
| 171 | /* Make sure we see the port again | 174 | /* Make sure we see the port again |
| 172 | * after the resuming period is over. */ | 175 | * after the resuming period is over. */ |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 59fb5c677dbe..7f76a49e90d3 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -1698,7 +1698,7 @@ static void handle_port_status(struct xhci_hcd *xhci, | |||
| 1698 | faked_port_index + 1); | 1698 | faked_port_index + 1); |
| 1699 | if (slot_id && xhci->devs[slot_id]) | 1699 | if (slot_id && xhci->devs[slot_id]) |
| 1700 | xhci_ring_device(xhci, slot_id); | 1700 | xhci_ring_device(xhci, slot_id); |
| 1701 | if (bus_state->port_remote_wakeup && (1 << faked_port_index)) { | 1701 | if (bus_state->port_remote_wakeup & (1 << faked_port_index)) { |
| 1702 | bus_state->port_remote_wakeup &= | 1702 | bus_state->port_remote_wakeup &= |
| 1703 | ~(1 << faked_port_index); | 1703 | ~(1 << faked_port_index); |
| 1704 | xhci_test_and_clear_bit(xhci, port_array, | 1704 | xhci_test_and_clear_bit(xhci, port_array, |
| @@ -2589,6 +2589,8 @@ cleanup: | |||
| 2589 | (trb_comp_code != COMP_STALL && | 2589 | (trb_comp_code != COMP_STALL && |
| 2590 | trb_comp_code != COMP_BABBLE)) | 2590 | trb_comp_code != COMP_BABBLE)) |
| 2591 | xhci_urb_free_priv(xhci, urb_priv); | 2591 | xhci_urb_free_priv(xhci, urb_priv); |
| 2592 | else | ||
| 2593 | kfree(urb_priv); | ||
| 2592 | 2594 | ||
| 2593 | usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb); | 2595 | usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb); |
| 2594 | if ((urb->actual_length != urb->transfer_buffer_length && | 2596 | if ((urb->actual_length != urb->transfer_buffer_length && |
| @@ -3108,7 +3110,7 @@ static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len, | |||
| 3108 | * running_total. | 3110 | * running_total. |
| 3109 | */ | 3111 | */ |
| 3110 | packets_transferred = (running_total + trb_buff_len) / | 3112 | packets_transferred = (running_total + trb_buff_len) / |
| 3111 | usb_endpoint_maxp(&urb->ep->desc); | 3113 | GET_MAX_PACKET(usb_endpoint_maxp(&urb->ep->desc)); |
| 3112 | 3114 | ||
| 3113 | if ((total_packet_count - packets_transferred) > 31) | 3115 | if ((total_packet_count - packets_transferred) > 31) |
| 3114 | return 31 << 17; | 3116 | return 31 << 17; |
| @@ -3642,7 +3644,8 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 3642 | td_len = urb->iso_frame_desc[i].length; | 3644 | td_len = urb->iso_frame_desc[i].length; |
| 3643 | td_remain_len = td_len; | 3645 | td_remain_len = td_len; |
| 3644 | total_packet_count = DIV_ROUND_UP(td_len, | 3646 | total_packet_count = DIV_ROUND_UP(td_len, |
| 3645 | usb_endpoint_maxp(&urb->ep->desc)); | 3647 | GET_MAX_PACKET( |
| 3648 | usb_endpoint_maxp(&urb->ep->desc))); | ||
| 3646 | /* A zero-length transfer still involves at least one packet. */ | 3649 | /* A zero-length transfer still involves at least one packet. */ |
| 3647 | if (total_packet_count == 0) | 3650 | if (total_packet_count == 0) |
| 3648 | total_packet_count++; | 3651 | total_packet_count++; |
| @@ -3664,9 +3667,11 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
| 3664 | td = urb_priv->td[i]; | 3667 | td = urb_priv->td[i]; |
| 3665 | for (j = 0; j < trbs_per_td; j++) { | 3668 | for (j = 0; j < trbs_per_td; j++) { |
| 3666 | u32 remainder = 0; | 3669 | u32 remainder = 0; |
| 3667 | field = TRB_TBC(burst_count) | TRB_TLBPC(residue); | 3670 | field = 0; |
| 3668 | 3671 | ||
| 3669 | if (first_trb) { | 3672 | if (first_trb) { |
| 3673 | field = TRB_TBC(burst_count) | | ||
| 3674 | TRB_TLBPC(residue); | ||
| 3670 | /* Queue the isoc TRB */ | 3675 | /* Queue the isoc TRB */ |
| 3671 | field |= TRB_TYPE(TRB_ISOC); | 3676 | field |= TRB_TYPE(TRB_ISOC); |
| 3672 | /* Assume URB_ISO_ASAP is set */ | 3677 | /* Assume URB_ISO_ASAP is set */ |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index f14736f647ff..edc0f0dcad83 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
| @@ -60,6 +60,7 @@ static const struct usb_device_id id_table[] = { | |||
| 60 | { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ | 60 | { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */ |
| 61 | { USB_DEVICE(0x0FCF, 0x1004) }, /* Dynastream ANT2USB */ | 61 | { USB_DEVICE(0x0FCF, 0x1004) }, /* Dynastream ANT2USB */ |
| 62 | { USB_DEVICE(0x0FCF, 0x1006) }, /* Dynastream ANT development board */ | 62 | { USB_DEVICE(0x0FCF, 0x1006) }, /* Dynastream ANT development board */ |
| 63 | { USB_DEVICE(0x0FDE, 0xCA05) }, /* OWL Wireless Electricity Monitor CM-160 */ | ||
| 63 | { USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */ | 64 | { USB_DEVICE(0x10A6, 0xAA26) }, /* Knock-off DCU-11 cable */ |
| 64 | { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */ | 65 | { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */ |
| 65 | { USB_DEVICE(0x10B5, 0xAC70) }, /* Nokia CA-42 USB */ | 66 | { USB_DEVICE(0x10B5, 0xAC70) }, /* Nokia CA-42 USB */ |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index ba68835d06a6..90ceef1776c3 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -584,6 +584,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 584 | /* | 584 | /* |
| 585 | * ELV devices: | 585 | * ELV devices: |
| 586 | */ | 586 | */ |
| 587 | { USB_DEVICE(FTDI_ELV_VID, FTDI_ELV_WS300_PID) }, | ||
| 587 | { USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) }, | 588 | { USB_DEVICE(FTDI_VID, FTDI_ELV_USR_PID) }, |
| 588 | { USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) }, | 589 | { USB_DEVICE(FTDI_VID, FTDI_ELV_MSM1_PID) }, |
| 589 | { USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) }, | 590 | { USB_DEVICE(FTDI_VID, FTDI_ELV_KL100_PID) }, |
| @@ -670,6 +671,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 670 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) }, | 671 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) }, |
| 671 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) }, | 672 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) }, |
| 672 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) }, | 673 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) }, |
| 674 | { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) }, | ||
| 673 | { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, | 675 | { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, |
| 674 | { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) }, | 676 | { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) }, |
| 675 | { USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) }, | 677 | { USB_DEVICE(FTDI_VID, FTDI_MHAM_KW_PID) }, |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index fa5d56038276..9d359e189a64 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -147,6 +147,11 @@ | |||
| 147 | #define XSENS_CONVERTER_6_PID 0xD38E | 147 | #define XSENS_CONVERTER_6_PID 0xD38E |
| 148 | #define XSENS_CONVERTER_7_PID 0xD38F | 148 | #define XSENS_CONVERTER_7_PID 0xD38F |
| 149 | 149 | ||
| 150 | /** | ||
| 151 | * Zolix (www.zolix.com.cb) product ids | ||
| 152 | */ | ||
| 153 | #define FTDI_OMNI1509 0xD491 /* Omni1509 embedded USB-serial */ | ||
| 154 | |||
| 150 | /* | 155 | /* |
| 151 | * NDI (www.ndigital.com) product ids | 156 | * NDI (www.ndigital.com) product ids |
| 152 | */ | 157 | */ |
| @@ -204,7 +209,7 @@ | |||
| 204 | 209 | ||
| 205 | /* | 210 | /* |
| 206 | * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). | 211 | * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). |
| 207 | * All of these devices use FTDI's vendor ID (0x0403). | 212 | * Almost all of these devices use FTDI's vendor ID (0x0403). |
| 208 | * Further IDs taken from ELV Windows .inf file. | 213 | * Further IDs taken from ELV Windows .inf file. |
| 209 | * | 214 | * |
| 210 | * The previously included PID for the UO 100 module was incorrect. | 215 | * The previously included PID for the UO 100 module was incorrect. |
| @@ -212,6 +217,8 @@ | |||
| 212 | * | 217 | * |
| 213 | * Armin Laeuger originally sent the PID for the UM 100 module. | 218 | * Armin Laeuger originally sent the PID for the UM 100 module. |
| 214 | */ | 219 | */ |
| 220 | #define FTDI_ELV_VID 0x1B1F /* ELV AG */ | ||
| 221 | #define FTDI_ELV_WS300_PID 0xC006 /* eQ3 WS 300 PC II */ | ||
| 215 | #define FTDI_ELV_USR_PID 0xE000 /* ELV Universal-Sound-Recorder */ | 222 | #define FTDI_ELV_USR_PID 0xE000 /* ELV Universal-Sound-Recorder */ |
| 216 | #define FTDI_ELV_MSM1_PID 0xE001 /* ELV Mini-Sound-Modul */ | 223 | #define FTDI_ELV_MSM1_PID 0xE001 /* ELV Mini-Sound-Modul */ |
| 217 | #define FTDI_ELV_KL100_PID 0xE002 /* ELV Kfz-Leistungsmesser KL 100 */ | 224 | #define FTDI_ELV_KL100_PID 0xE002 /* ELV Kfz-Leistungsmesser KL 100 */ |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 0d9dac9e7f93..567bc77d6397 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -242,6 +242,7 @@ static void option_instat_callback(struct urb *urb); | |||
| 242 | #define TELIT_PRODUCT_CC864_DUAL 0x1005 | 242 | #define TELIT_PRODUCT_CC864_DUAL 0x1005 |
| 243 | #define TELIT_PRODUCT_CC864_SINGLE 0x1006 | 243 | #define TELIT_PRODUCT_CC864_SINGLE 0x1006 |
| 244 | #define TELIT_PRODUCT_DE910_DUAL 0x1010 | 244 | #define TELIT_PRODUCT_DE910_DUAL 0x1010 |
| 245 | #define TELIT_PRODUCT_LE920 0x1200 | ||
| 245 | 246 | ||
| 246 | /* ZTE PRODUCTS */ | 247 | /* ZTE PRODUCTS */ |
| 247 | #define ZTE_VENDOR_ID 0x19d2 | 248 | #define ZTE_VENDOR_ID 0x19d2 |
| @@ -453,6 +454,10 @@ static void option_instat_callback(struct urb *urb); | |||
| 453 | #define TPLINK_VENDOR_ID 0x2357 | 454 | #define TPLINK_VENDOR_ID 0x2357 |
| 454 | #define TPLINK_PRODUCT_MA180 0x0201 | 455 | #define TPLINK_PRODUCT_MA180 0x0201 |
| 455 | 456 | ||
| 457 | /* Changhong products */ | ||
| 458 | #define CHANGHONG_VENDOR_ID 0x2077 | ||
| 459 | #define CHANGHONG_PRODUCT_CH690 0x7001 | ||
| 460 | |||
| 456 | /* some devices interfaces need special handling due to a number of reasons */ | 461 | /* some devices interfaces need special handling due to a number of reasons */ |
| 457 | enum option_blacklist_reason { | 462 | enum option_blacklist_reason { |
| 458 | OPTION_BLACKLIST_NONE = 0, | 463 | OPTION_BLACKLIST_NONE = 0, |
| @@ -534,6 +539,11 @@ static const struct option_blacklist_info zte_1255_blacklist = { | |||
| 534 | .reserved = BIT(3) | BIT(4), | 539 | .reserved = BIT(3) | BIT(4), |
| 535 | }; | 540 | }; |
| 536 | 541 | ||
| 542 | static const struct option_blacklist_info telit_le920_blacklist = { | ||
| 543 | .sendsetup = BIT(0), | ||
| 544 | .reserved = BIT(1) | BIT(5), | ||
| 545 | }; | ||
| 546 | |||
| 537 | static const struct usb_device_id option_ids[] = { | 547 | static const struct usb_device_id option_ids[] = { |
| 538 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, | 548 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, |
| 539 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, | 549 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, |
| @@ -784,6 +794,8 @@ static const struct usb_device_id option_ids[] = { | |||
| 784 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, | 794 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, |
| 785 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, | 795 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, |
| 786 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, | 796 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, |
| 797 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), | ||
| 798 | .driver_info = (kernel_ulong_t)&telit_le920_blacklist }, | ||
| 787 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ | 799 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ |
| 788 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), | 800 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0002, 0xff, 0xff, 0xff), |
| 789 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | 801 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, |
| @@ -1318,6 +1330,7 @@ static const struct usb_device_id option_ids[] = { | |||
| 1318 | { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T) }, | 1330 | { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T) }, |
| 1319 | { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), | 1331 | { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), |
| 1320 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 1332 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 1333 | { USB_DEVICE(CHANGHONG_VENDOR_ID, CHANGHONG_PRODUCT_CH690) }, | ||
| 1321 | { } /* Terminating entry */ | 1334 | { } /* Terminating entry */ |
| 1322 | }; | 1335 | }; |
| 1323 | MODULE_DEVICE_TABLE(usb, option_ids); | 1336 | MODULE_DEVICE_TABLE(usb, option_ids); |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index aa148c21ea40..24662547dc5b 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
| @@ -53,6 +53,7 @@ static const struct usb_device_id id_table[] = { | |||
| 53 | {DEVICE_G1K(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ | 53 | {DEVICE_G1K(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ |
| 54 | {DEVICE_G1K(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ | 54 | {DEVICE_G1K(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ |
| 55 | {DEVICE_G1K(0x1f45, 0x0001)}, /* Unknown Gobi QDL device */ | 55 | {DEVICE_G1K(0x1f45, 0x0001)}, /* Unknown Gobi QDL device */ |
| 56 | {DEVICE_G1K(0x1bc7, 0x900e)}, /* Telit Gobi QDL device */ | ||
| 56 | 57 | ||
| 57 | /* Gobi 2000 devices */ | 58 | /* Gobi 2000 devices */ |
| 58 | {USB_DEVICE(0x1410, 0xa010)}, /* Novatel Gobi 2000 QDL device */ | 59 | {USB_DEVICE(0x1410, 0xa010)}, /* Novatel Gobi 2000 QDL device */ |
diff --git a/drivers/usb/storage/initializers.c b/drivers/usb/storage/initializers.c index 105d900150c1..16b0bf055eeb 100644 --- a/drivers/usb/storage/initializers.c +++ b/drivers/usb/storage/initializers.c | |||
| @@ -92,8 +92,8 @@ int usb_stor_ucr61s2b_init(struct us_data *us) | |||
| 92 | return 0; | 92 | return 0; |
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | /* This places the HUAWEI E220 devices in multi-port mode */ | 95 | /* This places the HUAWEI usb dongles in multi-port mode */ |
| 96 | int usb_stor_huawei_e220_init(struct us_data *us) | 96 | static int usb_stor_huawei_feature_init(struct us_data *us) |
| 97 | { | 97 | { |
| 98 | int result; | 98 | int result; |
| 99 | 99 | ||
| @@ -104,3 +104,75 @@ int usb_stor_huawei_e220_init(struct us_data *us) | |||
| 104 | US_DEBUGP("Huawei mode set result is %d\n", result); | 104 | US_DEBUGP("Huawei mode set result is %d\n", result); |
| 105 | return 0; | 105 | return 0; |
| 106 | } | 106 | } |
| 107 | |||
| 108 | /* | ||
| 109 | * It will send a scsi switch command called rewind' to huawei dongle. | ||
| 110 | * When the dongle receives this command at the first time, | ||
| 111 | * it will reboot immediately. After rebooted, it will ignore this command. | ||
| 112 | * So it is unnecessary to read its response. | ||
| 113 | */ | ||
| 114 | static int usb_stor_huawei_scsi_init(struct us_data *us) | ||
| 115 | { | ||
| 116 | int result = 0; | ||
| 117 | int act_len = 0; | ||
| 118 | struct bulk_cb_wrap *bcbw = (struct bulk_cb_wrap *) us->iobuf; | ||
| 119 | char rewind_cmd[] = {0x11, 0x06, 0x20, 0x00, 0x00, 0x01, 0x01, 0x00, | ||
| 120 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | ||
| 121 | |||
| 122 | bcbw->Signature = cpu_to_le32(US_BULK_CB_SIGN); | ||
| 123 | bcbw->Tag = 0; | ||
| 124 | bcbw->DataTransferLength = 0; | ||
| 125 | bcbw->Flags = bcbw->Lun = 0; | ||
| 126 | bcbw->Length = sizeof(rewind_cmd); | ||
| 127 | memset(bcbw->CDB, 0, sizeof(bcbw->CDB)); | ||
| 128 | memcpy(bcbw->CDB, rewind_cmd, sizeof(rewind_cmd)); | ||
| 129 | |||
| 130 | result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe, bcbw, | ||
| 131 | US_BULK_CB_WRAP_LEN, &act_len); | ||
| 132 | US_DEBUGP("transfer actual length=%d, result=%d\n", act_len, result); | ||
| 133 | return result; | ||
| 134 | } | ||
| 135 | |||
| 136 | /* | ||
| 137 | * It tries to find the supported Huawei USB dongles. | ||
| 138 | * In Huawei, they assign the following product IDs | ||
| 139 | * for all of their mobile broadband dongles, | ||
| 140 | * including the new dongles in the future. | ||
| 141 | * So if the product ID is not included in this list, | ||
| 142 | * it means it is not Huawei's mobile broadband dongles. | ||
| 143 | */ | ||
| 144 | static int usb_stor_huawei_dongles_pid(struct us_data *us) | ||
| 145 | { | ||
| 146 | struct usb_interface_descriptor *idesc; | ||
| 147 | int idProduct; | ||
| 148 | |||
| 149 | idesc = &us->pusb_intf->cur_altsetting->desc; | ||
| 150 | idProduct = us->pusb_dev->descriptor.idProduct; | ||
| 151 | /* The first port is CDROM, | ||
| 152 | * means the dongle in the single port mode, | ||
| 153 | * and a switch command is required to be sent. */ | ||
| 154 | if (idesc && idesc->bInterfaceNumber == 0) { | ||
| 155 | if ((idProduct == 0x1001) | ||
| 156 | || (idProduct == 0x1003) | ||
| 157 | || (idProduct == 0x1004) | ||
| 158 | || (idProduct >= 0x1401 && idProduct <= 0x1500) | ||
| 159 | || (idProduct >= 0x1505 && idProduct <= 0x1600) | ||
| 160 | || (idProduct >= 0x1c02 && idProduct <= 0x2202)) { | ||
| 161 | return 1; | ||
| 162 | } | ||
| 163 | } | ||
| 164 | return 0; | ||
| 165 | } | ||
| 166 | |||
| 167 | int usb_stor_huawei_init(struct us_data *us) | ||
| 168 | { | ||
| 169 | int result = 0; | ||
| 170 | |||
| 171 | if (usb_stor_huawei_dongles_pid(us)) { | ||
| 172 | if (us->pusb_dev->descriptor.idProduct >= 0x1446) | ||
| 173 | result = usb_stor_huawei_scsi_init(us); | ||
| 174 | else | ||
| 175 | result = usb_stor_huawei_feature_init(us); | ||
| 176 | } | ||
| 177 | return result; | ||
| 178 | } | ||
diff --git a/drivers/usb/storage/initializers.h b/drivers/usb/storage/initializers.h index 529327fbb06b..5376d4fc76f0 100644 --- a/drivers/usb/storage/initializers.h +++ b/drivers/usb/storage/initializers.h | |||
| @@ -46,5 +46,5 @@ int usb_stor_euscsi_init(struct us_data *us); | |||
| 46 | * flash reader */ | 46 | * flash reader */ |
| 47 | int usb_stor_ucr61s2b_init(struct us_data *us); | 47 | int usb_stor_ucr61s2b_init(struct us_data *us); |
| 48 | 48 | ||
| 49 | /* This places the HUAWEI E220 devices in multi-port mode */ | 49 | /* This places the HUAWEI usb dongles in multi-port mode */ |
| 50 | int usb_stor_huawei_e220_init(struct us_data *us); | 50 | int usb_stor_huawei_init(struct us_data *us); |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index d305a5aa3a5d..72923b56bbf6 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -1527,335 +1527,10 @@ UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100, | |||
| 1527 | /* Reported by fangxiaozhi <huananhu@huawei.com> | 1527 | /* Reported by fangxiaozhi <huananhu@huawei.com> |
| 1528 | * This brings the HUAWEI data card devices into multi-port mode | 1528 | * This brings the HUAWEI data card devices into multi-port mode |
| 1529 | */ | 1529 | */ |
| 1530 | UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000, | 1530 | UNUSUAL_VENDOR_INTF(0x12d1, 0x08, 0x06, 0x50, |
| 1531 | "HUAWEI MOBILE", | 1531 | "HUAWEI MOBILE", |
| 1532 | "Mass Storage", | 1532 | "Mass Storage", |
| 1533 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | 1533 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_init, |
| 1534 | 0), | ||
| 1535 | UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000, | ||
| 1536 | "HUAWEI MOBILE", | ||
| 1537 | "Mass Storage", | ||
| 1538 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1539 | 0), | ||
| 1540 | UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000, | ||
| 1541 | "HUAWEI MOBILE", | ||
| 1542 | "Mass Storage", | ||
| 1543 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1544 | 0), | ||
| 1545 | UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000, | ||
| 1546 | "HUAWEI MOBILE", | ||
| 1547 | "Mass Storage", | ||
| 1548 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1549 | 0), | ||
| 1550 | UNUSUAL_DEV( 0x12d1, 0x1402, 0x0000, 0x0000, | ||
| 1551 | "HUAWEI MOBILE", | ||
| 1552 | "Mass Storage", | ||
| 1553 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1554 | 0), | ||
| 1555 | UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000, | ||
| 1556 | "HUAWEI MOBILE", | ||
| 1557 | "Mass Storage", | ||
| 1558 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1559 | 0), | ||
| 1560 | UNUSUAL_DEV( 0x12d1, 0x1404, 0x0000, 0x0000, | ||
| 1561 | "HUAWEI MOBILE", | ||
| 1562 | "Mass Storage", | ||
| 1563 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1564 | 0), | ||
| 1565 | UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000, | ||
| 1566 | "HUAWEI MOBILE", | ||
| 1567 | "Mass Storage", | ||
| 1568 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1569 | 0), | ||
| 1570 | UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000, | ||
| 1571 | "HUAWEI MOBILE", | ||
| 1572 | "Mass Storage", | ||
| 1573 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1574 | 0), | ||
| 1575 | UNUSUAL_DEV( 0x12d1, 0x1407, 0x0000, 0x0000, | ||
| 1576 | "HUAWEI MOBILE", | ||
| 1577 | "Mass Storage", | ||
| 1578 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1579 | 0), | ||
| 1580 | UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000, | ||
| 1581 | "HUAWEI MOBILE", | ||
| 1582 | "Mass Storage", | ||
| 1583 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1584 | 0), | ||
| 1585 | UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000, | ||
| 1586 | "HUAWEI MOBILE", | ||
| 1587 | "Mass Storage", | ||
| 1588 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1589 | 0), | ||
| 1590 | UNUSUAL_DEV( 0x12d1, 0x140A, 0x0000, 0x0000, | ||
| 1591 | "HUAWEI MOBILE", | ||
| 1592 | "Mass Storage", | ||
| 1593 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1594 | 0), | ||
| 1595 | UNUSUAL_DEV( 0x12d1, 0x140B, 0x0000, 0x0000, | ||
| 1596 | "HUAWEI MOBILE", | ||
| 1597 | "Mass Storage", | ||
| 1598 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1599 | 0), | ||
| 1600 | UNUSUAL_DEV( 0x12d1, 0x140C, 0x0000, 0x0000, | ||
| 1601 | "HUAWEI MOBILE", | ||
| 1602 | "Mass Storage", | ||
| 1603 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1604 | 0), | ||
| 1605 | UNUSUAL_DEV( 0x12d1, 0x140D, 0x0000, 0x0000, | ||
| 1606 | "HUAWEI MOBILE", | ||
| 1607 | "Mass Storage", | ||
| 1608 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1609 | 0), | ||
| 1610 | UNUSUAL_DEV( 0x12d1, 0x140E, 0x0000, 0x0000, | ||
| 1611 | "HUAWEI MOBILE", | ||
| 1612 | "Mass Storage", | ||
| 1613 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1614 | 0), | ||
| 1615 | UNUSUAL_DEV( 0x12d1, 0x140F, 0x0000, 0x0000, | ||
| 1616 | "HUAWEI MOBILE", | ||
| 1617 | "Mass Storage", | ||
| 1618 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1619 | 0), | ||
| 1620 | UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000, | ||
| 1621 | "HUAWEI MOBILE", | ||
| 1622 | "Mass Storage", | ||
| 1623 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1624 | 0), | ||
| 1625 | UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000, | ||
| 1626 | "HUAWEI MOBILE", | ||
| 1627 | "Mass Storage", | ||
| 1628 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1629 | 0), | ||
| 1630 | UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000, | ||
| 1631 | "HUAWEI MOBILE", | ||
| 1632 | "Mass Storage", | ||
| 1633 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1634 | 0), | ||
| 1635 | UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000, | ||
| 1636 | "HUAWEI MOBILE", | ||
| 1637 | "Mass Storage", | ||
| 1638 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1639 | 0), | ||
| 1640 | UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000, | ||
| 1641 | "HUAWEI MOBILE", | ||
| 1642 | "Mass Storage", | ||
| 1643 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1644 | 0), | ||
| 1645 | UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000, | ||
| 1646 | "HUAWEI MOBILE", | ||
| 1647 | "Mass Storage", | ||
| 1648 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1649 | 0), | ||
| 1650 | UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000, | ||
| 1651 | "HUAWEI MOBILE", | ||
| 1652 | "Mass Storage", | ||
| 1653 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1654 | 0), | ||
| 1655 | UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000, | ||
| 1656 | "HUAWEI MOBILE", | ||
| 1657 | "Mass Storage", | ||
| 1658 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1659 | 0), | ||
| 1660 | UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000, | ||
| 1661 | "HUAWEI MOBILE", | ||
| 1662 | "Mass Storage", | ||
| 1663 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1664 | 0), | ||
| 1665 | UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000, | ||
| 1666 | "HUAWEI MOBILE", | ||
| 1667 | "Mass Storage", | ||
| 1668 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1669 | 0), | ||
| 1670 | UNUSUAL_DEV( 0x12d1, 0x141A, 0x0000, 0x0000, | ||
| 1671 | "HUAWEI MOBILE", | ||
| 1672 | "Mass Storage", | ||
| 1673 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1674 | 0), | ||
| 1675 | UNUSUAL_DEV( 0x12d1, 0x141B, 0x0000, 0x0000, | ||
| 1676 | "HUAWEI MOBILE", | ||
| 1677 | "Mass Storage", | ||
| 1678 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1679 | 0), | ||
| 1680 | UNUSUAL_DEV( 0x12d1, 0x141C, 0x0000, 0x0000, | ||
| 1681 | "HUAWEI MOBILE", | ||
| 1682 | "Mass Storage", | ||
| 1683 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1684 | 0), | ||
| 1685 | UNUSUAL_DEV( 0x12d1, 0x141D, 0x0000, 0x0000, | ||
| 1686 | "HUAWEI MOBILE", | ||
| 1687 | "Mass Storage", | ||
| 1688 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1689 | 0), | ||
| 1690 | UNUSUAL_DEV( 0x12d1, 0x141E, 0x0000, 0x0000, | ||
| 1691 | "HUAWEI MOBILE", | ||
| 1692 | "Mass Storage", | ||
| 1693 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1694 | 0), | ||
| 1695 | UNUSUAL_DEV( 0x12d1, 0x141F, 0x0000, 0x0000, | ||
| 1696 | "HUAWEI MOBILE", | ||
| 1697 | "Mass Storage", | ||
| 1698 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1699 | 0), | ||
| 1700 | UNUSUAL_DEV( 0x12d1, 0x1420, 0x0000, 0x0000, | ||
| 1701 | "HUAWEI MOBILE", | ||
| 1702 | "Mass Storage", | ||
| 1703 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1704 | 0), | ||
| 1705 | UNUSUAL_DEV( 0x12d1, 0x1421, 0x0000, 0x0000, | ||
| 1706 | "HUAWEI MOBILE", | ||
| 1707 | "Mass Storage", | ||
| 1708 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1709 | 0), | ||
| 1710 | UNUSUAL_DEV( 0x12d1, 0x1422, 0x0000, 0x0000, | ||
| 1711 | "HUAWEI MOBILE", | ||
| 1712 | "Mass Storage", | ||
| 1713 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1714 | 0), | ||
| 1715 | UNUSUAL_DEV( 0x12d1, 0x1423, 0x0000, 0x0000, | ||
| 1716 | "HUAWEI MOBILE", | ||
| 1717 | "Mass Storage", | ||
| 1718 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1719 | 0), | ||
| 1720 | UNUSUAL_DEV( 0x12d1, 0x1424, 0x0000, 0x0000, | ||
| 1721 | "HUAWEI MOBILE", | ||
| 1722 | "Mass Storage", | ||
| 1723 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1724 | 0), | ||
| 1725 | UNUSUAL_DEV( 0x12d1, 0x1425, 0x0000, 0x0000, | ||
| 1726 | "HUAWEI MOBILE", | ||
| 1727 | "Mass Storage", | ||
| 1728 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1729 | 0), | ||
| 1730 | UNUSUAL_DEV( 0x12d1, 0x1426, 0x0000, 0x0000, | ||
| 1731 | "HUAWEI MOBILE", | ||
| 1732 | "Mass Storage", | ||
| 1733 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1734 | 0), | ||
| 1735 | UNUSUAL_DEV( 0x12d1, 0x1427, 0x0000, 0x0000, | ||
| 1736 | "HUAWEI MOBILE", | ||
| 1737 | "Mass Storage", | ||
| 1738 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1739 | 0), | ||
| 1740 | UNUSUAL_DEV( 0x12d1, 0x1428, 0x0000, 0x0000, | ||
| 1741 | "HUAWEI MOBILE", | ||
| 1742 | "Mass Storage", | ||
| 1743 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1744 | 0), | ||
| 1745 | UNUSUAL_DEV( 0x12d1, 0x1429, 0x0000, 0x0000, | ||
| 1746 | "HUAWEI MOBILE", | ||
| 1747 | "Mass Storage", | ||
| 1748 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1749 | 0), | ||
| 1750 | UNUSUAL_DEV( 0x12d1, 0x142A, 0x0000, 0x0000, | ||
| 1751 | "HUAWEI MOBILE", | ||
| 1752 | "Mass Storage", | ||
| 1753 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1754 | 0), | ||
| 1755 | UNUSUAL_DEV( 0x12d1, 0x142B, 0x0000, 0x0000, | ||
| 1756 | "HUAWEI MOBILE", | ||
| 1757 | "Mass Storage", | ||
| 1758 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1759 | 0), | ||
| 1760 | UNUSUAL_DEV( 0x12d1, 0x142C, 0x0000, 0x0000, | ||
| 1761 | "HUAWEI MOBILE", | ||
| 1762 | "Mass Storage", | ||
| 1763 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1764 | 0), | ||
| 1765 | UNUSUAL_DEV( 0x12d1, 0x142D, 0x0000, 0x0000, | ||
| 1766 | "HUAWEI MOBILE", | ||
| 1767 | "Mass Storage", | ||
| 1768 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1769 | 0), | ||
| 1770 | UNUSUAL_DEV( 0x12d1, 0x142E, 0x0000, 0x0000, | ||
| 1771 | "HUAWEI MOBILE", | ||
| 1772 | "Mass Storage", | ||
| 1773 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1774 | 0), | ||
| 1775 | UNUSUAL_DEV( 0x12d1, 0x142F, 0x0000, 0x0000, | ||
| 1776 | "HUAWEI MOBILE", | ||
| 1777 | "Mass Storage", | ||
| 1778 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1779 | 0), | ||
| 1780 | UNUSUAL_DEV( 0x12d1, 0x1430, 0x0000, 0x0000, | ||
| 1781 | "HUAWEI MOBILE", | ||
| 1782 | "Mass Storage", | ||
| 1783 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1784 | 0), | ||
| 1785 | UNUSUAL_DEV( 0x12d1, 0x1431, 0x0000, 0x0000, | ||
| 1786 | "HUAWEI MOBILE", | ||
| 1787 | "Mass Storage", | ||
| 1788 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1789 | 0), | ||
| 1790 | UNUSUAL_DEV( 0x12d1, 0x1432, 0x0000, 0x0000, | ||
| 1791 | "HUAWEI MOBILE", | ||
| 1792 | "Mass Storage", | ||
| 1793 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1794 | 0), | ||
| 1795 | UNUSUAL_DEV( 0x12d1, 0x1433, 0x0000, 0x0000, | ||
| 1796 | "HUAWEI MOBILE", | ||
| 1797 | "Mass Storage", | ||
| 1798 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1799 | 0), | ||
| 1800 | UNUSUAL_DEV( 0x12d1, 0x1434, 0x0000, 0x0000, | ||
| 1801 | "HUAWEI MOBILE", | ||
| 1802 | "Mass Storage", | ||
| 1803 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1804 | 0), | ||
| 1805 | UNUSUAL_DEV( 0x12d1, 0x1435, 0x0000, 0x0000, | ||
| 1806 | "HUAWEI MOBILE", | ||
| 1807 | "Mass Storage", | ||
| 1808 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1809 | 0), | ||
| 1810 | UNUSUAL_DEV( 0x12d1, 0x1436, 0x0000, 0x0000, | ||
| 1811 | "HUAWEI MOBILE", | ||
| 1812 | "Mass Storage", | ||
| 1813 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1814 | 0), | ||
| 1815 | UNUSUAL_DEV( 0x12d1, 0x1437, 0x0000, 0x0000, | ||
| 1816 | "HUAWEI MOBILE", | ||
| 1817 | "Mass Storage", | ||
| 1818 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1819 | 0), | ||
| 1820 | UNUSUAL_DEV( 0x12d1, 0x1438, 0x0000, 0x0000, | ||
| 1821 | "HUAWEI MOBILE", | ||
| 1822 | "Mass Storage", | ||
| 1823 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1824 | 0), | ||
| 1825 | UNUSUAL_DEV( 0x12d1, 0x1439, 0x0000, 0x0000, | ||
| 1826 | "HUAWEI MOBILE", | ||
| 1827 | "Mass Storage", | ||
| 1828 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1829 | 0), | ||
| 1830 | UNUSUAL_DEV( 0x12d1, 0x143A, 0x0000, 0x0000, | ||
| 1831 | "HUAWEI MOBILE", | ||
| 1832 | "Mass Storage", | ||
| 1833 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1834 | 0), | ||
| 1835 | UNUSUAL_DEV( 0x12d1, 0x143B, 0x0000, 0x0000, | ||
| 1836 | "HUAWEI MOBILE", | ||
| 1837 | "Mass Storage", | ||
| 1838 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1839 | 0), | ||
| 1840 | UNUSUAL_DEV( 0x12d1, 0x143C, 0x0000, 0x0000, | ||
| 1841 | "HUAWEI MOBILE", | ||
| 1842 | "Mass Storage", | ||
| 1843 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1844 | 0), | ||
| 1845 | UNUSUAL_DEV( 0x12d1, 0x143D, 0x0000, 0x0000, | ||
| 1846 | "HUAWEI MOBILE", | ||
| 1847 | "Mass Storage", | ||
| 1848 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1849 | 0), | ||
| 1850 | UNUSUAL_DEV( 0x12d1, 0x143E, 0x0000, 0x0000, | ||
| 1851 | "HUAWEI MOBILE", | ||
| 1852 | "Mass Storage", | ||
| 1853 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1854 | 0), | ||
| 1855 | UNUSUAL_DEV( 0x12d1, 0x143F, 0x0000, 0x0000, | ||
| 1856 | "HUAWEI MOBILE", | ||
| 1857 | "Mass Storage", | ||
| 1858 | USB_SC_DEVICE, USB_PR_DEVICE, usb_stor_huawei_e220_init, | ||
| 1859 | 0), | 1534 | 0), |
| 1860 | 1535 | ||
| 1861 | /* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */ | 1536 | /* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */ |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 31b3e1a61bbd..cf09b6ba71ff 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
| @@ -120,6 +120,17 @@ MODULE_PARM_DESC(quirks, "supplemental list of device IDs and their quirks"); | |||
| 120 | .useTransport = use_transport, \ | 120 | .useTransport = use_transport, \ |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | #define UNUSUAL_VENDOR_INTF(idVendor, cl, sc, pr, \ | ||
| 124 | vendor_name, product_name, use_protocol, use_transport, \ | ||
| 125 | init_function, Flags) \ | ||
| 126 | { \ | ||
| 127 | .vendorName = vendor_name, \ | ||
| 128 | .productName = product_name, \ | ||
| 129 | .useProtocol = use_protocol, \ | ||
| 130 | .useTransport = use_transport, \ | ||
| 131 | .initFunction = init_function, \ | ||
| 132 | } | ||
| 133 | |||
| 123 | static struct us_unusual_dev us_unusual_dev_list[] = { | 134 | static struct us_unusual_dev us_unusual_dev_list[] = { |
| 124 | # include "unusual_devs.h" | 135 | # include "unusual_devs.h" |
| 125 | { } /* Terminating entry */ | 136 | { } /* Terminating entry */ |
| @@ -131,6 +142,7 @@ static struct us_unusual_dev for_dynamic_ids = | |||
| 131 | #undef UNUSUAL_DEV | 142 | #undef UNUSUAL_DEV |
| 132 | #undef COMPLIANT_DEV | 143 | #undef COMPLIANT_DEV |
| 133 | #undef USUAL_DEV | 144 | #undef USUAL_DEV |
| 145 | #undef UNUSUAL_VENDOR_INTF | ||
| 134 | 146 | ||
| 135 | #ifdef CONFIG_LOCKDEP | 147 | #ifdef CONFIG_LOCKDEP |
| 136 | 148 | ||
diff --git a/drivers/usb/storage/usual-tables.c b/drivers/usb/storage/usual-tables.c index b78a526910fb..5ef8ce74aae4 100644 --- a/drivers/usb/storage/usual-tables.c +++ b/drivers/usb/storage/usual-tables.c | |||
| @@ -41,6 +41,20 @@ | |||
| 41 | #define USUAL_DEV(useProto, useTrans) \ | 41 | #define USUAL_DEV(useProto, useTrans) \ |
| 42 | { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans) } | 42 | { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans) } |
| 43 | 43 | ||
| 44 | /* Define the device is matched with Vendor ID and interface descriptors */ | ||
| 45 | #define UNUSUAL_VENDOR_INTF(id_vendor, cl, sc, pr, \ | ||
| 46 | vendorName, productName, useProtocol, useTransport, \ | ||
| 47 | initFunction, flags) \ | ||
| 48 | { \ | ||
| 49 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO \ | ||
| 50 | | USB_DEVICE_ID_MATCH_VENDOR, \ | ||
| 51 | .idVendor = (id_vendor), \ | ||
| 52 | .bInterfaceClass = (cl), \ | ||
| 53 | .bInterfaceSubClass = (sc), \ | ||
| 54 | .bInterfaceProtocol = (pr), \ | ||
| 55 | .driver_info = (flags) \ | ||
| 56 | } | ||
| 57 | |||
| 44 | struct usb_device_id usb_storage_usb_ids[] = { | 58 | struct usb_device_id usb_storage_usb_ids[] = { |
| 45 | # include "unusual_devs.h" | 59 | # include "unusual_devs.h" |
| 46 | { } /* Terminating entry */ | 60 | { } /* Terminating entry */ |
| @@ -50,6 +64,7 @@ MODULE_DEVICE_TABLE(usb, usb_storage_usb_ids); | |||
| 50 | #undef UNUSUAL_DEV | 64 | #undef UNUSUAL_DEV |
| 51 | #undef COMPLIANT_DEV | 65 | #undef COMPLIANT_DEV |
| 52 | #undef USUAL_DEV | 66 | #undef USUAL_DEV |
| 67 | #undef UNUSUAL_VENDOR_INTF | ||
| 53 | 68 | ||
| 54 | /* | 69 | /* |
| 55 | * The table of devices to ignore | 70 | * The table of devices to ignore |
diff --git a/drivers/vhost/tcm_vhost.c b/drivers/vhost/tcm_vhost.c index b20df5c829f5..22321cf84fbe 100644 --- a/drivers/vhost/tcm_vhost.c +++ b/drivers/vhost/tcm_vhost.c | |||
| @@ -575,10 +575,8 @@ static void vhost_scsi_handle_vq(struct vhost_scsi *vs) | |||
| 575 | 575 | ||
| 576 | /* Must use ioctl VHOST_SCSI_SET_ENDPOINT */ | 576 | /* Must use ioctl VHOST_SCSI_SET_ENDPOINT */ |
| 577 | tv_tpg = vs->vs_tpg; | 577 | tv_tpg = vs->vs_tpg; |
| 578 | if (unlikely(!tv_tpg)) { | 578 | if (unlikely(!tv_tpg)) |
| 579 | pr_err("%s endpoint not set\n", __func__); | ||
| 580 | return; | 579 | return; |
| 581 | } | ||
| 582 | 580 | ||
| 583 | mutex_lock(&vq->mutex); | 581 | mutex_lock(&vq->mutex); |
| 584 | vhost_disable_notify(&vs->dev, vq); | 582 | vhost_disable_notify(&vs->dev, vq); |
diff --git a/fs/dlm/user.c b/fs/dlm/user.c index 7ff49852b0cb..911649a47dd5 100644 --- a/fs/dlm/user.c +++ b/fs/dlm/user.c | |||
| @@ -503,11 +503,11 @@ static ssize_t device_write(struct file *file, const char __user *buf, | |||
| 503 | #endif | 503 | #endif |
| 504 | return -EINVAL; | 504 | return -EINVAL; |
| 505 | 505 | ||
| 506 | #ifdef CONFIG_COMPAT | 506 | /* |
| 507 | if (count > sizeof(struct dlm_write_request32) + DLM_RESNAME_MAXLEN) | 507 | * can't compare against COMPAT/dlm_write_request32 because |
| 508 | #else | 508 | * we don't yet know if is64bit is zero |
| 509 | */ | ||
| 509 | if (count > sizeof(struct dlm_write_request) + DLM_RESNAME_MAXLEN) | 510 | if (count > sizeof(struct dlm_write_request) + DLM_RESNAME_MAXLEN) |
| 510 | #endif | ||
| 511 | return -EINVAL; | 511 | return -EINVAL; |
| 512 | 512 | ||
| 513 | kbuf = kzalloc(count + 1, GFP_NOFS); | 513 | kbuf = kzalloc(count + 1, GFP_NOFS); |
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index fdb180769485..f3859354e41a 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c | |||
| @@ -664,8 +664,11 @@ static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp, | |||
| 664 | if (ret < 0) | 664 | if (ret < 0) |
| 665 | printk(KERN_ERR "NILFS: GC failed during preparation: " | 665 | printk(KERN_ERR "NILFS: GC failed during preparation: " |
| 666 | "cannot read source blocks: err=%d\n", ret); | 666 | "cannot read source blocks: err=%d\n", ret); |
| 667 | else | 667 | else { |
| 668 | if (nilfs_sb_need_update(nilfs)) | ||
| 669 | set_nilfs_discontinued(nilfs); | ||
| 668 | ret = nilfs_clean_segments(inode->i_sb, argv, kbufs); | 670 | ret = nilfs_clean_segments(inode->i_sb, argv, kbufs); |
| 671 | } | ||
| 669 | 672 | ||
| 670 | nilfs_remove_all_gcinodes(nilfs); | 673 | nilfs_remove_all_gcinodes(nilfs); |
| 671 | clear_nilfs_gc_running(nilfs); | 674 | clear_nilfs_gc_running(nilfs); |
diff --git a/include/linux/llist.h b/include/linux/llist.h index a5199f6d0e82..d0ab98f73d38 100644 --- a/include/linux/llist.h +++ b/include/linux/llist.h | |||
| @@ -125,6 +125,31 @@ static inline void init_llist_head(struct llist_head *list) | |||
| 125 | (pos) = llist_entry((pos)->member.next, typeof(*(pos)), member)) | 125 | (pos) = llist_entry((pos)->member.next, typeof(*(pos)), member)) |
| 126 | 126 | ||
| 127 | /** | 127 | /** |
| 128 | * llist_for_each_entry_safe - iterate safely against remove over some entries | ||
| 129 | * of lock-less list of given type. | ||
| 130 | * @pos: the type * to use as a loop cursor. | ||
| 131 | * @n: another type * to use as a temporary storage. | ||
| 132 | * @node: the fist entry of deleted list entries. | ||
| 133 | * @member: the name of the llist_node with the struct. | ||
| 134 | * | ||
| 135 | * In general, some entries of the lock-less list can be traversed | ||
| 136 | * safely only after being removed from list, so start with an entry | ||
| 137 | * instead of list head. This variant allows removal of entries | ||
| 138 | * as we iterate. | ||
| 139 | * | ||
| 140 | * If being used on entries deleted from lock-less list directly, the | ||
| 141 | * traverse order is from the newest to the oldest added entry. If | ||
| 142 | * you want to traverse from the oldest to the newest, you must | ||
| 143 | * reverse the order by yourself before traversing. | ||
| 144 | */ | ||
| 145 | #define llist_for_each_entry_safe(pos, n, node, member) \ | ||
| 146 | for ((pos) = llist_entry((node), typeof(*(pos)), member), \ | ||
| 147 | (n) = (pos)->member.next; \ | ||
| 148 | &(pos)->member != NULL; \ | ||
| 149 | (pos) = llist_entry(n, typeof(*(pos)), member), \ | ||
| 150 | (n) = (&(pos)->member != NULL) ? (pos)->member.next : NULL) | ||
| 151 | |||
| 152 | /** | ||
| 128 | * llist_empty - tests whether a lock-less list is empty | 153 | * llist_empty - tests whether a lock-less list is empty |
| 129 | * @head: the list to test | 154 | * @head: the list to test |
| 130 | * | 155 | * |
diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 0108a56f814e..28bd5fa2ff2e 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h | |||
| @@ -429,7 +429,7 @@ extern int memcg_limited_groups_array_size; | |||
| 429 | * the slab_mutex must be held when looping through those caches | 429 | * the slab_mutex must be held when looping through those caches |
| 430 | */ | 430 | */ |
| 431 | #define for_each_memcg_cache_index(_idx) \ | 431 | #define for_each_memcg_cache_index(_idx) \ |
| 432 | for ((_idx) = 0; i < memcg_limited_groups_array_size; (_idx)++) | 432 | for ((_idx) = 0; (_idx) < memcg_limited_groups_array_size; (_idx)++) |
| 433 | 433 | ||
| 434 | static inline bool memcg_kmem_enabled(void) | 434 | static inline bool memcg_kmem_enabled(void) |
| 435 | { | 435 | { |
diff --git a/include/linux/mmu_notifier.h b/include/linux/mmu_notifier.h index bc823c4c028b..deca87452528 100644 --- a/include/linux/mmu_notifier.h +++ b/include/linux/mmu_notifier.h | |||
| @@ -151,7 +151,7 @@ struct mmu_notifier_ops { | |||
| 151 | * Therefore notifier chains can only be traversed when either | 151 | * Therefore notifier chains can only be traversed when either |
| 152 | * | 152 | * |
| 153 | * 1. mmap_sem is held. | 153 | * 1. mmap_sem is held. |
| 154 | * 2. One of the reverse map locks is held (i_mmap_mutex or anon_vma->mutex). | 154 | * 2. One of the reverse map locks is held (i_mmap_mutex or anon_vma->rwsem). |
| 155 | * 3. No other concurrent thread can access the list (release) | 155 | * 3. No other concurrent thread can access the list (release) |
| 156 | */ | 156 | */ |
| 157 | struct mmu_notifier { | 157 | struct mmu_notifier { |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 689b14b26c8d..4d22d0f6167a 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
| @@ -357,6 +357,8 @@ struct usb_bus { | |||
| 357 | int bandwidth_int_reqs; /* number of Interrupt requests */ | 357 | int bandwidth_int_reqs; /* number of Interrupt requests */ |
| 358 | int bandwidth_isoc_reqs; /* number of Isoc. requests */ | 358 | int bandwidth_isoc_reqs; /* number of Isoc. requests */ |
| 359 | 359 | ||
| 360 | unsigned resuming_ports; /* bit array: resuming root-hub ports */ | ||
| 361 | |||
| 360 | #if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE) | 362 | #if defined(CONFIG_USB_MON) || defined(CONFIG_USB_MON_MODULE) |
| 361 | struct mon_bus *mon_bus; /* non-null when associated */ | 363 | struct mon_bus *mon_bus; /* non-null when associated */ |
| 362 | int monitored; /* non-zero when monitored */ | 364 | int monitored; /* non-zero when monitored */ |
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 608050b2545f..0a78df5f6cfd 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h | |||
| @@ -430,6 +430,9 @@ extern void usb_hcd_poll_rh_status(struct usb_hcd *hcd); | |||
| 430 | extern void usb_wakeup_notification(struct usb_device *hdev, | 430 | extern void usb_wakeup_notification(struct usb_device *hdev, |
| 431 | unsigned int portnum); | 431 | unsigned int portnum); |
| 432 | 432 | ||
| 433 | extern void usb_hcd_start_port_resume(struct usb_bus *bus, int portnum); | ||
| 434 | extern void usb_hcd_end_port_resume(struct usb_bus *bus, int portnum); | ||
| 435 | |||
| 433 | /* The D0/D1 toggle bits ... USE WITH CAUTION (they're almost hcd-internal) */ | 436 | /* The D0/D1 toggle bits ... USE WITH CAUTION (they're almost hcd-internal) */ |
| 434 | #define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1) | 437 | #define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1) |
| 435 | #define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << (ep))) | 438 | #define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << (ep))) |
diff --git a/include/uapi/linux/usb/ch9.h b/include/uapi/linux/usb/ch9.h index 50598472dc41..f738e25377ff 100644 --- a/include/uapi/linux/usb/ch9.h +++ b/include/uapi/linux/usb/ch9.h | |||
| @@ -152,6 +152,12 @@ | |||
| 152 | #define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0)) | 152 | #define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0)) |
| 153 | #define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1)) | 153 | #define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1)) |
| 154 | 154 | ||
| 155 | /* | ||
| 156 | * Interface status, Figure 9-5 USB 3.0 spec | ||
| 157 | */ | ||
| 158 | #define USB_INTRF_STAT_FUNC_RW_CAP 1 | ||
| 159 | #define USB_INTRF_STAT_FUNC_RW 2 | ||
| 160 | |||
| 155 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ | 161 | #define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ |
| 156 | 162 | ||
| 157 | /* Bit array elements as returned by the USB_REQ_GET_STATUS request. */ | 163 | /* Bit array elements as returned by the USB_REQ_GET_STATUS request. */ |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 301079d06f24..7b6646a8c067 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -908,6 +908,15 @@ list_add_event(struct perf_event *event, struct perf_event_context *ctx) | |||
| 908 | } | 908 | } |
| 909 | 909 | ||
| 910 | /* | 910 | /* |
| 911 | * Initialize event state based on the perf_event_attr::disabled. | ||
| 912 | */ | ||
| 913 | static inline void perf_event__state_init(struct perf_event *event) | ||
| 914 | { | ||
| 915 | event->state = event->attr.disabled ? PERF_EVENT_STATE_OFF : | ||
| 916 | PERF_EVENT_STATE_INACTIVE; | ||
| 917 | } | ||
| 918 | |||
| 919 | /* | ||
| 911 | * Called at perf_event creation and when events are attached/detached from a | 920 | * Called at perf_event creation and when events are attached/detached from a |
| 912 | * group. | 921 | * group. |
| 913 | */ | 922 | */ |
| @@ -6179,8 +6188,7 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, | |||
| 6179 | event->overflow_handler = overflow_handler; | 6188 | event->overflow_handler = overflow_handler; |
| 6180 | event->overflow_handler_context = context; | 6189 | event->overflow_handler_context = context; |
| 6181 | 6190 | ||
| 6182 | if (attr->disabled) | 6191 | perf_event__state_init(event); |
| 6183 | event->state = PERF_EVENT_STATE_OFF; | ||
| 6184 | 6192 | ||
| 6185 | pmu = NULL; | 6193 | pmu = NULL; |
| 6186 | 6194 | ||
| @@ -6609,9 +6617,17 @@ SYSCALL_DEFINE5(perf_event_open, | |||
| 6609 | 6617 | ||
| 6610 | mutex_lock(&gctx->mutex); | 6618 | mutex_lock(&gctx->mutex); |
| 6611 | perf_remove_from_context(group_leader); | 6619 | perf_remove_from_context(group_leader); |
| 6620 | |||
| 6621 | /* | ||
| 6622 | * Removing from the context ends up with disabled | ||
| 6623 | * event. What we want here is event in the initial | ||
| 6624 | * startup state, ready to be add into new context. | ||
| 6625 | */ | ||
| 6626 | perf_event__state_init(group_leader); | ||
| 6612 | list_for_each_entry(sibling, &group_leader->sibling_list, | 6627 | list_for_each_entry(sibling, &group_leader->sibling_list, |
| 6613 | group_entry) { | 6628 | group_entry) { |
| 6614 | perf_remove_from_context(sibling); | 6629 | perf_remove_from_context(sibling); |
| 6630 | perf_event__state_init(sibling); | ||
| 6615 | put_ctx(gctx); | 6631 | put_ctx(gctx); |
| 6616 | } | 6632 | } |
| 6617 | mutex_unlock(&gctx->mutex); | 6633 | mutex_unlock(&gctx->mutex); |
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h index f6e5ec2932b4..c1cc7e17ff9d 100644 --- a/kernel/rcutree_plugin.h +++ b/kernel/rcutree_plugin.h | |||
| @@ -40,8 +40,7 @@ | |||
| 40 | #ifdef CONFIG_RCU_NOCB_CPU | 40 | #ifdef CONFIG_RCU_NOCB_CPU |
| 41 | static cpumask_var_t rcu_nocb_mask; /* CPUs to have callbacks offloaded. */ | 41 | static cpumask_var_t rcu_nocb_mask; /* CPUs to have callbacks offloaded. */ |
| 42 | static bool have_rcu_nocb_mask; /* Was rcu_nocb_mask allocated? */ | 42 | static bool have_rcu_nocb_mask; /* Was rcu_nocb_mask allocated? */ |
| 43 | static bool rcu_nocb_poll; /* Offload kthread are to poll. */ | 43 | static bool __read_mostly rcu_nocb_poll; /* Offload kthread are to poll. */ |
| 44 | module_param(rcu_nocb_poll, bool, 0444); | ||
| 45 | static char __initdata nocb_buf[NR_CPUS * 5]; | 44 | static char __initdata nocb_buf[NR_CPUS * 5]; |
| 46 | #endif /* #ifdef CONFIG_RCU_NOCB_CPU */ | 45 | #endif /* #ifdef CONFIG_RCU_NOCB_CPU */ |
| 47 | 46 | ||
| @@ -2159,6 +2158,13 @@ static int __init rcu_nocb_setup(char *str) | |||
| 2159 | } | 2158 | } |
| 2160 | __setup("rcu_nocbs=", rcu_nocb_setup); | 2159 | __setup("rcu_nocbs=", rcu_nocb_setup); |
| 2161 | 2160 | ||
| 2161 | static int __init parse_rcu_nocb_poll(char *arg) | ||
| 2162 | { | ||
| 2163 | rcu_nocb_poll = 1; | ||
| 2164 | return 0; | ||
| 2165 | } | ||
| 2166 | early_param("rcu_nocb_poll", parse_rcu_nocb_poll); | ||
| 2167 | |||
| 2162 | /* Is the specified CPU a no-CPUs CPU? */ | 2168 | /* Is the specified CPU a no-CPUs CPU? */ |
| 2163 | static bool is_nocb_cpu(int cpu) | 2169 | static bool is_nocb_cpu(int cpu) |
| 2164 | { | 2170 | { |
| @@ -2366,10 +2372,11 @@ static int rcu_nocb_kthread(void *arg) | |||
| 2366 | for (;;) { | 2372 | for (;;) { |
| 2367 | /* If not polling, wait for next batch of callbacks. */ | 2373 | /* If not polling, wait for next batch of callbacks. */ |
| 2368 | if (!rcu_nocb_poll) | 2374 | if (!rcu_nocb_poll) |
| 2369 | wait_event(rdp->nocb_wq, rdp->nocb_head); | 2375 | wait_event_interruptible(rdp->nocb_wq, rdp->nocb_head); |
| 2370 | list = ACCESS_ONCE(rdp->nocb_head); | 2376 | list = ACCESS_ONCE(rdp->nocb_head); |
| 2371 | if (!list) { | 2377 | if (!list) { |
| 2372 | schedule_timeout_interruptible(1); | 2378 | schedule_timeout_interruptible(1); |
| 2379 | flush_signals(current); | ||
| 2373 | continue; | 2380 | continue; |
| 2374 | } | 2381 | } |
| 2375 | 2382 | ||
diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c index 2cd3c1b4e582..7ae4c4c5420e 100644 --- a/kernel/sched/debug.c +++ b/kernel/sched/debug.c | |||
| @@ -222,8 +222,8 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) | |||
| 222 | cfs_rq->runnable_load_avg); | 222 | cfs_rq->runnable_load_avg); |
| 223 | SEQ_printf(m, " .%-30s: %lld\n", "blocked_load_avg", | 223 | SEQ_printf(m, " .%-30s: %lld\n", "blocked_load_avg", |
| 224 | cfs_rq->blocked_load_avg); | 224 | cfs_rq->blocked_load_avg); |
| 225 | SEQ_printf(m, " .%-30s: %ld\n", "tg_load_avg", | 225 | SEQ_printf(m, " .%-30s: %lld\n", "tg_load_avg", |
| 226 | atomic64_read(&cfs_rq->tg->load_avg)); | 226 | (unsigned long long)atomic64_read(&cfs_rq->tg->load_avg)); |
| 227 | SEQ_printf(m, " .%-30s: %lld\n", "tg_load_contrib", | 227 | SEQ_printf(m, " .%-30s: %lld\n", "tg_load_contrib", |
| 228 | cfs_rq->tg_load_contrib); | 228 | cfs_rq->tg_load_contrib); |
| 229 | SEQ_printf(m, " .%-30s: %d\n", "tg_runnable_contrib", | 229 | SEQ_printf(m, " .%-30s: %d\n", "tg_runnable_contrib", |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 5eea8707234a..81fa53643409 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -2663,7 +2663,7 @@ static void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b) | |||
| 2663 | hrtimer_cancel(&cfs_b->slack_timer); | 2663 | hrtimer_cancel(&cfs_b->slack_timer); |
| 2664 | } | 2664 | } |
| 2665 | 2665 | ||
| 2666 | static void unthrottle_offline_cfs_rqs(struct rq *rq) | 2666 | static void __maybe_unused unthrottle_offline_cfs_rqs(struct rq *rq) |
| 2667 | { | 2667 | { |
| 2668 | struct cfs_rq *cfs_rq; | 2668 | struct cfs_rq *cfs_rq; |
| 2669 | 2669 | ||
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 418feb01344e..4f02b2847357 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c | |||
| @@ -566,7 +566,7 @@ static inline struct rt_bandwidth *sched_rt_bandwidth(struct rt_rq *rt_rq) | |||
| 566 | static int do_balance_runtime(struct rt_rq *rt_rq) | 566 | static int do_balance_runtime(struct rt_rq *rt_rq) |
| 567 | { | 567 | { |
| 568 | struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq); | 568 | struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq); |
| 569 | struct root_domain *rd = cpu_rq(smp_processor_id())->rd; | 569 | struct root_domain *rd = rq_of_rt_rq(rt_rq)->rd; |
| 570 | int i, weight, more = 0; | 570 | int i, weight, more = 0; |
| 571 | u64 rt_period; | 571 | u64 rt_period; |
| 572 | 572 | ||
diff --git a/lib/digsig.c b/lib/digsig.c index 8c0e62975c88..dc2be7ed1765 100644 --- a/lib/digsig.c +++ b/lib/digsig.c | |||
| @@ -162,6 +162,8 @@ static int digsig_verify_rsa(struct key *key, | |||
| 162 | memset(out1, 0, head); | 162 | memset(out1, 0, head); |
| 163 | memcpy(out1 + head, p, l); | 163 | memcpy(out1 + head, p, l); |
| 164 | 164 | ||
| 165 | kfree(p); | ||
| 166 | |||
| 165 | err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len); | 167 | err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len); |
| 166 | if (err) | 168 | if (err) |
| 167 | goto err; | 169 | goto err; |
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 6001ee6347a9..b5783d81eda9 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
| @@ -1257,6 +1257,10 @@ struct page *follow_trans_huge_pmd(struct vm_area_struct *vma, | |||
| 1257 | if (flags & FOLL_WRITE && !pmd_write(*pmd)) | 1257 | if (flags & FOLL_WRITE && !pmd_write(*pmd)) |
| 1258 | goto out; | 1258 | goto out; |
| 1259 | 1259 | ||
| 1260 | /* Avoid dumping huge zero page */ | ||
| 1261 | if ((flags & FOLL_DUMP) && is_huge_zero_pmd(*pmd)) | ||
| 1262 | return ERR_PTR(-EFAULT); | ||
| 1263 | |||
| 1260 | page = pmd_page(*pmd); | 1264 | page = pmd_page(*pmd); |
| 1261 | VM_BUG_ON(!PageHead(page)); | 1265 | VM_BUG_ON(!PageHead(page)); |
| 1262 | if (flags & FOLL_TOUCH) { | 1266 | if (flags & FOLL_TOUCH) { |
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 4f3ea0b1e57c..546db81820e4 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
| @@ -3033,6 +3033,7 @@ unsigned long hugetlb_change_protection(struct vm_area_struct *vma, | |||
| 3033 | if (!huge_pte_none(huge_ptep_get(ptep))) { | 3033 | if (!huge_pte_none(huge_ptep_get(ptep))) { |
| 3034 | pte = huge_ptep_get_and_clear(mm, address, ptep); | 3034 | pte = huge_ptep_get_and_clear(mm, address, ptep); |
| 3035 | pte = pte_mkhuge(pte_modify(pte, newprot)); | 3035 | pte = pte_mkhuge(pte_modify(pte, newprot)); |
| 3036 | pte = arch_make_huge_pte(pte, vma, NULL, 0); | ||
| 3036 | set_huge_pte_at(mm, address, ptep, pte); | 3037 | set_huge_pte_at(mm, address, ptep, pte); |
| 3037 | pages++; | 3038 | pages++; |
| 3038 | } | 3039 | } |
diff --git a/mm/migrate.c b/mm/migrate.c index c38778610aa8..2fd8b4af4744 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
| @@ -160,8 +160,10 @@ static int remove_migration_pte(struct page *new, struct vm_area_struct *vma, | |||
| 160 | if (is_write_migration_entry(entry)) | 160 | if (is_write_migration_entry(entry)) |
| 161 | pte = pte_mkwrite(pte); | 161 | pte = pte_mkwrite(pte); |
| 162 | #ifdef CONFIG_HUGETLB_PAGE | 162 | #ifdef CONFIG_HUGETLB_PAGE |
| 163 | if (PageHuge(new)) | 163 | if (PageHuge(new)) { |
| 164 | pte = pte_mkhuge(pte); | 164 | pte = pte_mkhuge(pte); |
| 165 | pte = arch_make_huge_pte(pte, vma, new, 0); | ||
| 166 | } | ||
| 165 | #endif | 167 | #endif |
| 166 | flush_cache_page(vma, addr, pte_pfn(pte)); | 168 | flush_cache_page(vma, addr, pte_pfn(pte)); |
| 167 | set_pte_at(mm, addr, ptep, pte); | 169 | set_pte_at(mm, addr, ptep, pte); |
| @@ -2943,7 +2943,7 @@ static void vm_lock_mapping(struct mm_struct *mm, struct address_space *mapping) | |||
| 2943 | * vma in this mm is backed by the same anon_vma or address_space. | 2943 | * vma in this mm is backed by the same anon_vma or address_space. |
| 2944 | * | 2944 | * |
| 2945 | * We can take all the locks in random order because the VM code | 2945 | * We can take all the locks in random order because the VM code |
| 2946 | * taking i_mmap_mutex or anon_vma->mutex outside the mmap_sem never | 2946 | * taking i_mmap_mutex or anon_vma->rwsem outside the mmap_sem never |
| 2947 | * takes more than one of them in a row. Secondly we're protected | 2947 | * takes more than one of them in a row. Secondly we're protected |
| 2948 | * against a concurrent mm_take_all_locks() by the mm_all_locks_mutex. | 2948 | * against a concurrent mm_take_all_locks() by the mm_all_locks_mutex. |
| 2949 | * | 2949 | * |
diff --git a/samples/seccomp/Makefile b/samples/seccomp/Makefile index bbbd276659ba..7203e66dcd6f 100644 --- a/samples/seccomp/Makefile +++ b/samples/seccomp/Makefile | |||
| @@ -19,6 +19,7 @@ bpf-direct-objs := bpf-direct.o | |||
| 19 | 19 | ||
| 20 | # Try to match the kernel target. | 20 | # Try to match the kernel target. |
| 21 | ifndef CONFIG_64BIT | 21 | ifndef CONFIG_64BIT |
| 22 | ifndef CROSS_COMPILE | ||
| 22 | 23 | ||
| 23 | # s390 has -m31 flag to build 31 bit binaries | 24 | # s390 has -m31 flag to build 31 bit binaries |
| 24 | ifndef CONFIG_S390 | 25 | ifndef CONFIG_S390 |
| @@ -35,6 +36,7 @@ HOSTLOADLIBES_bpf-direct += $(MFLAG) | |||
| 35 | HOSTLOADLIBES_bpf-fancy += $(MFLAG) | 36 | HOSTLOADLIBES_bpf-fancy += $(MFLAG) |
| 36 | HOSTLOADLIBES_dropper += $(MFLAG) | 37 | HOSTLOADLIBES_dropper += $(MFLAG) |
| 37 | endif | 38 | endif |
| 39 | endif | ||
| 38 | 40 | ||
| 39 | # Tell kbuild to always build the programs | 41 | # Tell kbuild to always build the programs |
| 40 | always := $(hostprogs-y) | 42 | always := $(hostprogs-y) |
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 4d2c7dfdaabd..2bb08a962ce3 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
| @@ -230,12 +230,12 @@ our $Inline = qr{inline|__always_inline|noinline}; | |||
| 230 | our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; | 230 | our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; |
| 231 | our $Lval = qr{$Ident(?:$Member)*}; | 231 | our $Lval = qr{$Ident(?:$Member)*}; |
| 232 | 232 | ||
| 233 | our $Float_hex = qr{(?i:0x[0-9a-f]+p-?[0-9]+[fl]?)}; | 233 | our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?}; |
| 234 | our $Float_dec = qr{(?i:((?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?))}; | 234 | our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?}; |
| 235 | our $Float_int = qr{(?i:[0-9]+e-?[0-9]+[fl]?)}; | 235 | our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?}; |
| 236 | our $Float = qr{$Float_hex|$Float_dec|$Float_int}; | 236 | our $Float = qr{$Float_hex|$Float_dec|$Float_int}; |
| 237 | our $Constant = qr{(?:$Float|(?i:(?:0x[0-9a-f]+|[0-9]+)[ul]*))}; | 237 | our $Constant = qr{$Float|(?i)(?:0x[0-9a-f]+|[0-9]+)[ul]*}; |
| 238 | our $Assignment = qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)}; | 238 | our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=}; |
| 239 | our $Compare = qr{<=|>=|==|!=|<|>}; | 239 | our $Compare = qr{<=|>=|==|!=|<|>}; |
| 240 | our $Operators = qr{ | 240 | our $Operators = qr{ |
| 241 | <=|>=|==|!=| | 241 | <=|>=|==|!=| |
diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig index a210c8d7b4bc..3b98159d9645 100644 --- a/sound/soc/fsl/Kconfig +++ b/sound/soc/fsl/Kconfig | |||
| @@ -108,13 +108,18 @@ if SND_IMX_SOC | |||
| 108 | config SND_SOC_IMX_SSI | 108 | config SND_SOC_IMX_SSI |
| 109 | tristate | 109 | tristate |
| 110 | 110 | ||
| 111 | config SND_SOC_IMX_PCM_FIQ | 111 | config SND_SOC_IMX_PCM |
| 112 | tristate | 112 | tristate |
| 113 | |||
| 114 | config SND_SOC_IMX_PCM_FIQ | ||
| 115 | bool | ||
| 113 | select FIQ | 116 | select FIQ |
| 117 | select SND_SOC_IMX_PCM | ||
| 114 | 118 | ||
| 115 | config SND_SOC_IMX_PCM_DMA | 119 | config SND_SOC_IMX_PCM_DMA |
| 116 | tristate | 120 | bool |
| 117 | select SND_SOC_DMAENGINE_PCM | 121 | select SND_SOC_DMAENGINE_PCM |
| 122 | select SND_SOC_IMX_PCM | ||
| 118 | 123 | ||
| 119 | config SND_SOC_IMX_AUDMUX | 124 | config SND_SOC_IMX_AUDMUX |
| 120 | tristate | 125 | tristate |
diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile index ec1457915d7c..afd34794db53 100644 --- a/sound/soc/fsl/Makefile +++ b/sound/soc/fsl/Makefile | |||
| @@ -41,10 +41,7 @@ endif | |||
| 41 | obj-$(CONFIG_SND_SOC_IMX_SSI) += snd-soc-imx-ssi.o | 41 | obj-$(CONFIG_SND_SOC_IMX_SSI) += snd-soc-imx-ssi.o |
| 42 | obj-$(CONFIG_SND_SOC_IMX_AUDMUX) += snd-soc-imx-audmux.o | 42 | obj-$(CONFIG_SND_SOC_IMX_AUDMUX) += snd-soc-imx-audmux.o |
| 43 | 43 | ||
| 44 | obj-$(CONFIG_SND_SOC_IMX_PCM_FIQ) += snd-soc-imx-pcm-fiq.o | 44 | obj-$(CONFIG_SND_SOC_IMX_PCM) += snd-soc-imx-pcm.o |
| 45 | snd-soc-imx-pcm-fiq-y := imx-pcm-fiq.o imx-pcm.o | ||
| 46 | obj-$(CONFIG_SND_SOC_IMX_PCM_DMA) += snd-soc-imx-pcm-dma.o | ||
| 47 | snd-soc-imx-pcm-dma-y := imx-pcm-dma.o imx-pcm.o | ||
| 48 | 45 | ||
| 49 | # i.MX Machine Support | 46 | # i.MX Machine Support |
| 50 | snd-soc-eukrea-tlv320-objs := eukrea-tlv320.o | 47 | snd-soc-eukrea-tlv320-objs := eukrea-tlv320.o |
diff --git a/sound/soc/fsl/imx-pcm-dma.c b/sound/soc/fsl/imx-pcm-dma.c index bf363d8d044a..500f8ce55d78 100644 --- a/sound/soc/fsl/imx-pcm-dma.c +++ b/sound/soc/fsl/imx-pcm-dma.c | |||
| @@ -154,26 +154,7 @@ static struct snd_soc_platform_driver imx_soc_platform_mx2 = { | |||
| 154 | .pcm_free = imx_pcm_free, | 154 | .pcm_free = imx_pcm_free, |
| 155 | }; | 155 | }; |
| 156 | 156 | ||
| 157 | static int imx_soc_platform_probe(struct platform_device *pdev) | 157 | int imx_pcm_dma_init(struct platform_device *pdev) |
| 158 | { | 158 | { |
| 159 | return snd_soc_register_platform(&pdev->dev, &imx_soc_platform_mx2); | 159 | return snd_soc_register_platform(&pdev->dev, &imx_soc_platform_mx2); |
| 160 | } | 160 | } |
| 161 | |||
| 162 | static int imx_soc_platform_remove(struct platform_device *pdev) | ||
| 163 | { | ||
| 164 | snd_soc_unregister_platform(&pdev->dev); | ||
| 165 | return 0; | ||
| 166 | } | ||
| 167 | |||
| 168 | static struct platform_driver imx_pcm_driver = { | ||
| 169 | .driver = { | ||
| 170 | .name = "imx-pcm-audio", | ||
| 171 | .owner = THIS_MODULE, | ||
| 172 | }, | ||
| 173 | .probe = imx_soc_platform_probe, | ||
| 174 | .remove = imx_soc_platform_remove, | ||
| 175 | }; | ||
| 176 | |||
| 177 | module_platform_driver(imx_pcm_driver); | ||
| 178 | MODULE_LICENSE("GPL"); | ||
| 179 | MODULE_ALIAS("platform:imx-pcm-audio"); | ||
diff --git a/sound/soc/fsl/imx-pcm-fiq.c b/sound/soc/fsl/imx-pcm-fiq.c index 5ec362ae4d01..920f945cb2f4 100644 --- a/sound/soc/fsl/imx-pcm-fiq.c +++ b/sound/soc/fsl/imx-pcm-fiq.c | |||
| @@ -281,7 +281,7 @@ static struct snd_soc_platform_driver imx_soc_platform_fiq = { | |||
| 281 | .pcm_free = imx_pcm_fiq_free, | 281 | .pcm_free = imx_pcm_fiq_free, |
| 282 | }; | 282 | }; |
| 283 | 283 | ||
| 284 | static int imx_soc_platform_probe(struct platform_device *pdev) | 284 | int imx_pcm_fiq_init(struct platform_device *pdev) |
| 285 | { | 285 | { |
| 286 | struct imx_ssi *ssi = platform_get_drvdata(pdev); | 286 | struct imx_ssi *ssi = platform_get_drvdata(pdev); |
| 287 | int ret; | 287 | int ret; |
| @@ -314,23 +314,3 @@ failed_register: | |||
| 314 | 314 | ||
| 315 | return ret; | 315 | return ret; |
| 316 | } | 316 | } |
| 317 | |||
| 318 | static int imx_soc_platform_remove(struct platform_device *pdev) | ||
| 319 | { | ||
| 320 | snd_soc_unregister_platform(&pdev->dev); | ||
| 321 | return 0; | ||
| 322 | } | ||
| 323 | |||
| 324 | static struct platform_driver imx_pcm_driver = { | ||
| 325 | .driver = { | ||
| 326 | .name = "imx-fiq-pcm-audio", | ||
| 327 | .owner = THIS_MODULE, | ||
| 328 | }, | ||
| 329 | |||
| 330 | .probe = imx_soc_platform_probe, | ||
| 331 | .remove = imx_soc_platform_remove, | ||
| 332 | }; | ||
| 333 | |||
| 334 | module_platform_driver(imx_pcm_driver); | ||
| 335 | |||
| 336 | MODULE_LICENSE("GPL"); | ||
diff --git a/sound/soc/fsl/imx-pcm.c b/sound/soc/fsl/imx-pcm.c index 0c9f188ddc68..0d0625bfcb65 100644 --- a/sound/soc/fsl/imx-pcm.c +++ b/sound/soc/fsl/imx-pcm.c | |||
| @@ -31,6 +31,7 @@ int snd_imx_pcm_mmap(struct snd_pcm_substream *substream, | |||
| 31 | runtime->dma_bytes); | 31 | runtime->dma_bytes); |
| 32 | return ret; | 32 | return ret; |
| 33 | } | 33 | } |
| 34 | EXPORT_SYMBOL_GPL(snd_imx_pcm_mmap); | ||
| 34 | 35 | ||
| 35 | static int imx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream) | 36 | static int imx_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream) |
| 36 | { | 37 | { |
| @@ -79,6 +80,7 @@ int imx_pcm_new(struct snd_soc_pcm_runtime *rtd) | |||
| 79 | out: | 80 | out: |
| 80 | return ret; | 81 | return ret; |
| 81 | } | 82 | } |
| 83 | EXPORT_SYMBOL_GPL(imx_pcm_new); | ||
| 82 | 84 | ||
| 83 | void imx_pcm_free(struct snd_pcm *pcm) | 85 | void imx_pcm_free(struct snd_pcm *pcm) |
| 84 | { | 86 | { |
| @@ -100,6 +102,39 @@ void imx_pcm_free(struct snd_pcm *pcm) | |||
| 100 | buf->area = NULL; | 102 | buf->area = NULL; |
| 101 | } | 103 | } |
| 102 | } | 104 | } |
| 105 | EXPORT_SYMBOL_GPL(imx_pcm_free); | ||
| 106 | |||
| 107 | static int imx_pcm_probe(struct platform_device *pdev) | ||
| 108 | { | ||
| 109 | if (strcmp(pdev->id_entry->name, "imx-fiq-pcm-audio") == 0) | ||
| 110 | return imx_pcm_fiq_init(pdev); | ||
| 111 | |||
| 112 | return imx_pcm_dma_init(pdev); | ||
| 113 | } | ||
| 114 | |||
| 115 | static int imx_pcm_remove(struct platform_device *pdev) | ||
| 116 | { | ||
| 117 | snd_soc_unregister_platform(&pdev->dev); | ||
| 118 | return 0; | ||
| 119 | } | ||
| 120 | |||
| 121 | static struct platform_device_id imx_pcm_devtype[] = { | ||
| 122 | { .name = "imx-pcm-audio", }, | ||
| 123 | { .name = "imx-fiq-pcm-audio", }, | ||
| 124 | { /* sentinel */ } | ||
| 125 | }; | ||
| 126 | MODULE_DEVICE_TABLE(platform, imx_pcm_devtype); | ||
| 127 | |||
| 128 | static struct platform_driver imx_pcm_driver = { | ||
| 129 | .driver = { | ||
| 130 | .name = "imx-pcm", | ||
| 131 | .owner = THIS_MODULE, | ||
| 132 | }, | ||
| 133 | .id_table = imx_pcm_devtype, | ||
| 134 | .probe = imx_pcm_probe, | ||
| 135 | .remove = imx_pcm_remove, | ||
| 136 | }; | ||
| 137 | module_platform_driver(imx_pcm_driver); | ||
| 103 | 138 | ||
| 104 | MODULE_DESCRIPTION("Freescale i.MX PCM driver"); | 139 | MODULE_DESCRIPTION("Freescale i.MX PCM driver"); |
| 105 | MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>"); | 140 | MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>"); |
diff --git a/sound/soc/fsl/imx-pcm.h b/sound/soc/fsl/imx-pcm.h index 83c0ed7d55c9..5ae13a13a353 100644 --- a/sound/soc/fsl/imx-pcm.h +++ b/sound/soc/fsl/imx-pcm.h | |||
| @@ -30,4 +30,22 @@ int snd_imx_pcm_mmap(struct snd_pcm_substream *substream, | |||
| 30 | int imx_pcm_new(struct snd_soc_pcm_runtime *rtd); | 30 | int imx_pcm_new(struct snd_soc_pcm_runtime *rtd); |
| 31 | void imx_pcm_free(struct snd_pcm *pcm); | 31 | void imx_pcm_free(struct snd_pcm *pcm); |
| 32 | 32 | ||
| 33 | #ifdef CONFIG_SND_SOC_IMX_PCM_DMA | ||
| 34 | int imx_pcm_dma_init(struct platform_device *pdev); | ||
| 35 | #else | ||
| 36 | static inline int imx_pcm_dma_init(struct platform_device *pdev) | ||
| 37 | { | ||
| 38 | return -ENODEV; | ||
| 39 | } | ||
| 40 | #endif | ||
| 41 | |||
| 42 | #ifdef CONFIG_SND_SOC_IMX_PCM_FIQ | ||
| 43 | int imx_pcm_fiq_init(struct platform_device *pdev); | ||
| 44 | #else | ||
| 45 | static inline int imx_pcm_fiq_init(struct platform_device *pdev) | ||
| 46 | { | ||
| 47 | return -ENODEV; | ||
| 48 | } | ||
| 49 | #endif | ||
| 50 | |||
| 33 | #endif /* _IMX_PCM_H */ | 51 | #endif /* _IMX_PCM_H */ |
diff --git a/tools/vm/.gitignore b/tools/vm/.gitignore new file mode 100644 index 000000000000..44f095fa2604 --- /dev/null +++ b/tools/vm/.gitignore | |||
| @@ -0,0 +1,2 @@ | |||
| 1 | slabinfo | ||
| 2 | page-types | ||
