diff options
83 files changed, 785 insertions, 341 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 9916e4d206a3..db3c5414223e 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -1111,9 +1111,9 @@ config ARM_NR_BANKS | |||
| 1111 | default 8 | 1111 | default 8 |
| 1112 | 1112 | ||
| 1113 | config IWMMXT | 1113 | config IWMMXT |
| 1114 | bool "Enable iWMMXt support" if !CPU_PJ4 | 1114 | bool "Enable iWMMXt support" |
| 1115 | depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 | 1115 | depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 || CPU_PJ4B |
| 1116 | default y if PXA27x || PXA3xx || ARCH_MMP || CPU_PJ4 | 1116 | default y if PXA27x || PXA3xx || ARCH_MMP || CPU_PJ4 || CPU_PJ4B |
| 1117 | help | 1117 | help |
| 1118 | Enable support for iWMMXt context switching at run time if | 1118 | Enable support for iWMMXt context switching at run time if |
| 1119 | running on a CPU that supports it. | 1119 | running on a CPU that supports it. |
diff --git a/arch/arm/include/asm/cputype.h b/arch/arm/include/asm/cputype.h index c651e3b26ec7..4764344367d4 100644 --- a/arch/arm/include/asm/cputype.h +++ b/arch/arm/include/asm/cputype.h | |||
| @@ -222,22 +222,22 @@ static inline int cpu_is_xsc3(void) | |||
| 222 | #endif | 222 | #endif |
| 223 | 223 | ||
| 224 | /* | 224 | /* |
| 225 | * Marvell's PJ4 core is based on V7 version. It has some modification | 225 | * Marvell's PJ4 and PJ4B cores are based on V7 version, |
| 226 | * for coprocessor setting. For this reason, we need a way to distinguish | 226 | * but require a specical sequence for enabling coprocessors. |
| 227 | * it. | 227 | * For this reason, we need a way to distinguish them. |
| 228 | */ | 228 | */ |
| 229 | #ifndef CONFIG_CPU_PJ4 | 229 | #if defined(CONFIG_CPU_PJ4) || defined(CONFIG_CPU_PJ4B) |
| 230 | #define cpu_is_pj4() 0 | ||
| 231 | #else | ||
| 232 | static inline int cpu_is_pj4(void) | 230 | static inline int cpu_is_pj4(void) |
| 233 | { | 231 | { |
| 234 | unsigned int id; | 232 | unsigned int id; |
| 235 | 233 | ||
| 236 | id = read_cpuid_id(); | 234 | id = read_cpuid_id(); |
| 237 | if ((id & 0xfffffff0) == 0x562f5840) | 235 | if ((id & 0xff0fff00) == 0x560f5800) |
| 238 | return 1; | 236 | return 1; |
| 239 | 237 | ||
| 240 | return 0; | 238 | return 0; |
| 241 | } | 239 | } |
| 240 | #else | ||
| 241 | #define cpu_is_pj4() 0 | ||
| 242 | #endif | 242 | #endif |
| 243 | #endif | 243 | #endif |
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index a766bcbaf8ad..040619c32d68 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile | |||
| @@ -79,6 +79,7 @@ obj-$(CONFIG_CPU_XSCALE) += xscale-cp0.o | |||
| 79 | obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o | 79 | obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o |
| 80 | obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o | 80 | obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o |
| 81 | obj-$(CONFIG_CPU_PJ4) += pj4-cp0.o | 81 | obj-$(CONFIG_CPU_PJ4) += pj4-cp0.o |
| 82 | obj-$(CONFIG_CPU_PJ4B) += pj4-cp0.o | ||
| 82 | obj-$(CONFIG_IWMMXT) += iwmmxt.o | 83 | obj-$(CONFIG_IWMMXT) += iwmmxt.o |
| 83 | obj-$(CONFIG_PERF_EVENTS) += perf_regs.o | 84 | obj-$(CONFIG_PERF_EVENTS) += perf_regs.o |
| 84 | obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o perf_event_cpu.o | 85 | obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o perf_event_cpu.o |
diff --git a/arch/arm/kernel/iwmmxt.S b/arch/arm/kernel/iwmmxt.S index a08783823b32..2452dd1bef53 100644 --- a/arch/arm/kernel/iwmmxt.S +++ b/arch/arm/kernel/iwmmxt.S | |||
| @@ -19,12 +19,16 @@ | |||
| 19 | #include <asm/thread_info.h> | 19 | #include <asm/thread_info.h> |
| 20 | #include <asm/asm-offsets.h> | 20 | #include <asm/asm-offsets.h> |
| 21 | 21 | ||
| 22 | #if defined(CONFIG_CPU_PJ4) | 22 | #if defined(CONFIG_CPU_PJ4) || defined(CONFIG_CPU_PJ4B) |
| 23 | #define PJ4(code...) code | 23 | #define PJ4(code...) code |
| 24 | #define XSC(code...) | 24 | #define XSC(code...) |
| 25 | #else | 25 | #elif defined(CONFIG_CPU_MOHAWK) || \ |
| 26 | defined(CONFIG_CPU_XSC3) || \ | ||
| 27 | defined(CONFIG_CPU_XSCALE) | ||
| 26 | #define PJ4(code...) | 28 | #define PJ4(code...) |
| 27 | #define XSC(code...) code | 29 | #define XSC(code...) code |
| 30 | #else | ||
| 31 | #error "Unsupported iWMMXt architecture" | ||
| 28 | #endif | 32 | #endif |
| 29 | 33 | ||
| 30 | #define MMX_WR0 (0x00) | 34 | #define MMX_WR0 (0x00) |
diff --git a/arch/arm/kernel/pj4-cp0.c b/arch/arm/kernel/pj4-cp0.c index fc7208636284..8153e36b2491 100644 --- a/arch/arm/kernel/pj4-cp0.c +++ b/arch/arm/kernel/pj4-cp0.c | |||
| @@ -45,7 +45,7 @@ static int iwmmxt_do(struct notifier_block *self, unsigned long cmd, void *t) | |||
| 45 | return NOTIFY_DONE; | 45 | return NOTIFY_DONE; |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | static struct notifier_block iwmmxt_notifier_block = { | 48 | static struct notifier_block __maybe_unused iwmmxt_notifier_block = { |
| 49 | .notifier_call = iwmmxt_do, | 49 | .notifier_call = iwmmxt_do, |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| @@ -72,6 +72,33 @@ static void __init pj4_cp_access_write(u32 value) | |||
| 72 | : "=r" (temp) : "r" (value)); | 72 | : "=r" (temp) : "r" (value)); |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | static int __init pj4_get_iwmmxt_version(void) | ||
| 76 | { | ||
| 77 | u32 cp_access, wcid; | ||
| 78 | |||
| 79 | cp_access = pj4_cp_access_read(); | ||
| 80 | pj4_cp_access_write(cp_access | 0xf); | ||
| 81 | |||
| 82 | /* check if coprocessor 0 and 1 are available */ | ||
| 83 | if ((pj4_cp_access_read() & 0xf) != 0xf) { | ||
| 84 | pj4_cp_access_write(cp_access); | ||
| 85 | return -ENODEV; | ||
| 86 | } | ||
| 87 | |||
| 88 | /* read iWMMXt coprocessor id register p1, c0 */ | ||
| 89 | __asm__ __volatile__ ("mrc p1, 0, %0, c0, c0, 0\n" : "=r" (wcid)); | ||
| 90 | |||
| 91 | pj4_cp_access_write(cp_access); | ||
| 92 | |||
| 93 | /* iWMMXt v1 */ | ||
| 94 | if ((wcid & 0xffffff00) == 0x56051000) | ||
| 95 | return 1; | ||
| 96 | /* iWMMXt v2 */ | ||
| 97 | if ((wcid & 0xffffff00) == 0x56052000) | ||
| 98 | return 2; | ||
| 99 | |||
| 100 | return -EINVAL; | ||
| 101 | } | ||
| 75 | 102 | ||
| 76 | /* | 103 | /* |
| 77 | * Disable CP0/CP1 on boot, and let call_fpe() and the iWMMXt lazy | 104 | * Disable CP0/CP1 on boot, and let call_fpe() and the iWMMXt lazy |
| @@ -79,17 +106,26 @@ static void __init pj4_cp_access_write(u32 value) | |||
| 79 | */ | 106 | */ |
| 80 | static int __init pj4_cp0_init(void) | 107 | static int __init pj4_cp0_init(void) |
| 81 | { | 108 | { |
| 82 | u32 cp_access; | 109 | u32 __maybe_unused cp_access; |
| 110 | int vers; | ||
| 83 | 111 | ||
| 84 | if (!cpu_is_pj4()) | 112 | if (!cpu_is_pj4()) |
| 85 | return 0; | 113 | return 0; |
| 86 | 114 | ||
| 115 | vers = pj4_get_iwmmxt_version(); | ||
| 116 | if (vers < 0) | ||
| 117 | return 0; | ||
| 118 | |||
| 119 | #ifndef CONFIG_IWMMXT | ||
| 120 | pr_info("PJ4 iWMMXt coprocessor detected, but kernel support is missing.\n"); | ||
| 121 | #else | ||
| 87 | cp_access = pj4_cp_access_read() & ~0xf; | 122 | cp_access = pj4_cp_access_read() & ~0xf; |
| 88 | pj4_cp_access_write(cp_access); | 123 | pj4_cp_access_write(cp_access); |
| 89 | 124 | ||
| 90 | printk(KERN_INFO "PJ4 iWMMXt coprocessor enabled.\n"); | 125 | pr_info("PJ4 iWMMXt v%d coprocessor enabled.\n", vers); |
| 91 | elf_hwcap |= HWCAP_IWMMXT; | 126 | elf_hwcap |= HWCAP_IWMMXT; |
| 92 | thread_register_notifier(&iwmmxt_notifier_block); | 127 | thread_register_notifier(&iwmmxt_notifier_block); |
| 128 | #endif | ||
| 93 | 129 | ||
| 94 | return 0; | 130 | return 0; |
| 95 | } | 131 | } |
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 8b1b0a870025..a0282928e9c1 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
| @@ -1296,7 +1296,7 @@ static struct resource adc_resources[] = { | |||
| 1296 | }; | 1296 | }; |
| 1297 | 1297 | ||
| 1298 | static struct platform_device at91_adc_device = { | 1298 | static struct platform_device at91_adc_device = { |
| 1299 | .name = "at91_adc", | 1299 | .name = "at91sam9260-adc", |
| 1300 | .id = -1, | 1300 | .id = -1, |
| 1301 | .dev = { | 1301 | .dev = { |
| 1302 | .platform_data = &adc_data, | 1302 | .platform_data = &adc_data, |
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index 77b04c2edd78..dab362c06487 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
| @@ -1204,7 +1204,7 @@ static struct resource adc_resources[] = { | |||
| 1204 | }; | 1204 | }; |
| 1205 | 1205 | ||
| 1206 | static struct platform_device at91_adc_device = { | 1206 | static struct platform_device at91_adc_device = { |
| 1207 | .name = "at91_adc", | 1207 | .name = "at91sam9g45-adc", |
| 1208 | .id = -1, | 1208 | .id = -1, |
| 1209 | .dev = { | 1209 | .dev = { |
| 1210 | .platform_data = &adc_data, | 1210 | .platform_data = &adc_data, |
diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index e6e4d3749a6e..e759af5d7098 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig | |||
| @@ -323,8 +323,6 @@ menu "CPU Power Management" | |||
| 323 | 323 | ||
| 324 | source "drivers/cpuidle/Kconfig" | 324 | source "drivers/cpuidle/Kconfig" |
| 325 | 325 | ||
| 326 | source "kernel/power/Kconfig" | ||
| 327 | |||
| 328 | source "drivers/cpufreq/Kconfig" | 326 | source "drivers/cpufreq/Kconfig" |
| 329 | 327 | ||
| 330 | endmenu | 328 | endmenu |
diff --git a/arch/arm64/include/asm/mmu.h b/arch/arm64/include/asm/mmu.h index f600d400c07d..aff0292c8f4d 100644 --- a/arch/arm64/include/asm/mmu.h +++ b/arch/arm64/include/asm/mmu.h | |||
| @@ -22,6 +22,9 @@ typedef struct { | |||
| 22 | void *vdso; | 22 | void *vdso; |
| 23 | } mm_context_t; | 23 | } mm_context_t; |
| 24 | 24 | ||
| 25 | #define INIT_MM_CONTEXT(name) \ | ||
| 26 | .context.id_lock = __RAW_SPIN_LOCK_UNLOCKED(name.context.id_lock), | ||
| 27 | |||
| 25 | #define ASID(mm) ((mm)->context.id & 0xffff) | 28 | #define ASID(mm) ((mm)->context.id & 0xffff) |
| 26 | 29 | ||
| 27 | extern void paging_init(void); | 30 | extern void paging_init(void); |
diff --git a/arch/arm64/include/asm/tlb.h b/arch/arm64/include/asm/tlb.h index 72cadf52ca80..80e2c08900d6 100644 --- a/arch/arm64/include/asm/tlb.h +++ b/arch/arm64/include/asm/tlb.h | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #ifndef __ASM_TLB_H | 19 | #ifndef __ASM_TLB_H |
| 20 | #define __ASM_TLB_H | 20 | #define __ASM_TLB_H |
| 21 | 21 | ||
| 22 | #define __tlb_remove_pmd_tlb_entry __tlb_remove_pmd_tlb_entry | ||
| 22 | 23 | ||
| 23 | #include <asm-generic/tlb.h> | 24 | #include <asm-generic/tlb.h> |
| 24 | 25 | ||
| @@ -99,5 +100,10 @@ static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, | |||
| 99 | } | 100 | } |
| 100 | #endif | 101 | #endif |
| 101 | 102 | ||
| 103 | static inline void __tlb_remove_pmd_tlb_entry(struct mmu_gather *tlb, pmd_t *pmdp, | ||
| 104 | unsigned long address) | ||
| 105 | { | ||
| 106 | tlb_add_flush(tlb, address); | ||
| 107 | } | ||
| 102 | 108 | ||
| 103 | #endif | 109 | #endif |
diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index bb8eb8a78e67..c8d8fc17bd5a 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h | |||
| @@ -403,8 +403,9 @@ __SYSCALL(378, sys_kcmp) | |||
| 403 | __SYSCALL(379, sys_finit_module) | 403 | __SYSCALL(379, sys_finit_module) |
| 404 | __SYSCALL(380, sys_sched_setattr) | 404 | __SYSCALL(380, sys_sched_setattr) |
| 405 | __SYSCALL(381, sys_sched_getattr) | 405 | __SYSCALL(381, sys_sched_getattr) |
| 406 | __SYSCALL(382, sys_renameat2) | ||
| 406 | 407 | ||
| 407 | #define __NR_compat_syscalls 379 | 408 | #define __NR_compat_syscalls 383 |
| 408 | 409 | ||
| 409 | /* | 410 | /* |
| 410 | * Compat syscall numbers used by the AArch64 kernel. | 411 | * Compat syscall numbers used by the AArch64 kernel. |
diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c index ed3955a95747..a7fb874b595e 100644 --- a/arch/arm64/kernel/debug-monitors.c +++ b/arch/arm64/kernel/debug-monitors.c | |||
| @@ -318,9 +318,6 @@ static int brk_handler(unsigned long addr, unsigned int esr, | |||
| 318 | if (call_break_hook(regs, esr) == DBG_HOOK_HANDLED) | 318 | if (call_break_hook(regs, esr) == DBG_HOOK_HANDLED) |
| 319 | return 0; | 319 | return 0; |
| 320 | 320 | ||
| 321 | pr_warn("unexpected brk exception at %lx, esr=0x%x\n", | ||
| 322 | (long)instruction_pointer(regs), esr); | ||
| 323 | |||
| 324 | if (!user_mode(regs)) | 321 | if (!user_mode(regs)) |
| 325 | return -EFAULT; | 322 | return -EFAULT; |
| 326 | 323 | ||
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 720853f70b6b..93e7df8968fe 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c | |||
| @@ -393,7 +393,6 @@ void __init setup_arch(char **cmdline_p) | |||
| 393 | 393 | ||
| 394 | static int __init arm64_device_init(void) | 394 | static int __init arm64_device_init(void) |
| 395 | { | 395 | { |
| 396 | of_clk_init(NULL); | ||
| 397 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 396 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
| 398 | return 0; | 397 | return 0; |
| 399 | } | 398 | } |
diff --git a/arch/arm64/kernel/time.c b/arch/arm64/kernel/time.c index 29c39d5d77e3..6815987b50f8 100644 --- a/arch/arm64/kernel/time.c +++ b/arch/arm64/kernel/time.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/irq.h> | 33 | #include <linux/irq.h> |
| 34 | #include <linux/delay.h> | 34 | #include <linux/delay.h> |
| 35 | #include <linux/clocksource.h> | 35 | #include <linux/clocksource.h> |
| 36 | #include <linux/clk-provider.h> | ||
| 36 | 37 | ||
| 37 | #include <clocksource/arm_arch_timer.h> | 38 | #include <clocksource/arm_arch_timer.h> |
| 38 | 39 | ||
| @@ -65,6 +66,7 @@ void __init time_init(void) | |||
| 65 | { | 66 | { |
| 66 | u32 arch_timer_rate; | 67 | u32 arch_timer_rate; |
| 67 | 68 | ||
| 69 | of_clk_init(NULL); | ||
| 68 | clocksource_of_init(); | 70 | clocksource_of_init(); |
| 69 | 71 | ||
| 70 | arch_timer_rate = arch_timer_get_rate(); | 72 | arch_timer_rate = arch_timer_get_rate(); |
diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c index c2bb4f896ce7..3aa5b46b2d40 100644 --- a/arch/mips/cavium-octeon/octeon-irq.c +++ b/arch/mips/cavium-octeon/octeon-irq.c | |||
| @@ -635,7 +635,7 @@ static void octeon_irq_cpu_offline_ciu(struct irq_data *data) | |||
| 635 | cpumask_clear(&new_affinity); | 635 | cpumask_clear(&new_affinity); |
| 636 | cpumask_set_cpu(cpumask_first(cpu_online_mask), &new_affinity); | 636 | cpumask_set_cpu(cpumask_first(cpu_online_mask), &new_affinity); |
| 637 | } | 637 | } |
| 638 | __irq_set_affinity_locked(data, &new_affinity); | 638 | irq_set_affinity_locked(data, &new_affinity, false); |
| 639 | } | 639 | } |
| 640 | 640 | ||
| 641 | static int octeon_irq_ciu_set_affinity(struct irq_data *data, | 641 | static int octeon_irq_ciu_set_affinity(struct irq_data *data, |
diff --git a/arch/s390/include/asm/ccwgroup.h b/arch/s390/include/asm/ccwgroup.h index 6e670f88d125..ebc2913f9ee0 100644 --- a/arch/s390/include/asm/ccwgroup.h +++ b/arch/s390/include/asm/ccwgroup.h | |||
| @@ -22,8 +22,8 @@ struct ccwgroup_device { | |||
| 22 | /* public: */ | 22 | /* public: */ |
| 23 | unsigned int count; | 23 | unsigned int count; |
| 24 | struct device dev; | 24 | struct device dev; |
| 25 | struct ccw_device *cdev[0]; | ||
| 26 | struct work_struct ungroup_work; | 25 | struct work_struct ungroup_work; |
| 26 | struct ccw_device *cdev[0]; | ||
| 27 | }; | 27 | }; |
| 28 | 28 | ||
| 29 | /** | 29 | /** |
diff --git a/drivers/acpi/acpica/exfield.c b/drivers/acpi/acpica/exfield.c index 68d97441432c..12878e1982f7 100644 --- a/drivers/acpi/acpica/exfield.c +++ b/drivers/acpi/acpica/exfield.c | |||
| @@ -45,10 +45,71 @@ | |||
| 45 | #include "accommon.h" | 45 | #include "accommon.h" |
| 46 | #include "acdispat.h" | 46 | #include "acdispat.h" |
| 47 | #include "acinterp.h" | 47 | #include "acinterp.h" |
| 48 | #include "amlcode.h" | ||
| 48 | 49 | ||
| 49 | #define _COMPONENT ACPI_EXECUTER | 50 | #define _COMPONENT ACPI_EXECUTER |
| 50 | ACPI_MODULE_NAME("exfield") | 51 | ACPI_MODULE_NAME("exfield") |
| 51 | 52 | ||
| 53 | /* Local prototypes */ | ||
| 54 | static u32 | ||
| 55 | acpi_ex_get_serial_access_length(u32 accessor_type, u32 access_length); | ||
| 56 | |||
| 57 | /******************************************************************************* | ||
| 58 | * | ||
| 59 | * FUNCTION: acpi_get_serial_access_bytes | ||
| 60 | * | ||
| 61 | * PARAMETERS: accessor_type - The type of the protocol indicated by region | ||
| 62 | * field access attributes | ||
| 63 | * access_length - The access length of the region field | ||
| 64 | * | ||
| 65 | * RETURN: Decoded access length | ||
| 66 | * | ||
| 67 | * DESCRIPTION: This routine returns the length of the generic_serial_bus | ||
| 68 | * protocol bytes | ||
| 69 | * | ||
| 70 | ******************************************************************************/ | ||
| 71 | |||
| 72 | static u32 | ||
| 73 | acpi_ex_get_serial_access_length(u32 accessor_type, u32 access_length) | ||
| 74 | { | ||
| 75 | u32 length; | ||
| 76 | |||
| 77 | switch (accessor_type) { | ||
| 78 | case AML_FIELD_ATTRIB_QUICK: | ||
| 79 | |||
| 80 | length = 0; | ||
| 81 | break; | ||
| 82 | |||
| 83 | case AML_FIELD_ATTRIB_SEND_RCV: | ||
| 84 | case AML_FIELD_ATTRIB_BYTE: | ||
| 85 | |||
| 86 | length = 1; | ||
| 87 | break; | ||
| 88 | |||
| 89 | case AML_FIELD_ATTRIB_WORD: | ||
| 90 | case AML_FIELD_ATTRIB_WORD_CALL: | ||
| 91 | |||
| 92 | length = 2; | ||
| 93 | break; | ||
| 94 | |||
| 95 | case AML_FIELD_ATTRIB_MULTIBYTE: | ||
| 96 | case AML_FIELD_ATTRIB_RAW_BYTES: | ||
| 97 | case AML_FIELD_ATTRIB_RAW_PROCESS: | ||
| 98 | |||
| 99 | length = access_length; | ||
| 100 | break; | ||
| 101 | |||
| 102 | case AML_FIELD_ATTRIB_BLOCK: | ||
| 103 | case AML_FIELD_ATTRIB_BLOCK_CALL: | ||
| 104 | default: | ||
| 105 | |||
| 106 | length = ACPI_GSBUS_BUFFER_SIZE; | ||
| 107 | break; | ||
| 108 | } | ||
| 109 | |||
| 110 | return (length); | ||
| 111 | } | ||
| 112 | |||
| 52 | /******************************************************************************* | 113 | /******************************************************************************* |
| 53 | * | 114 | * |
| 54 | * FUNCTION: acpi_ex_read_data_from_field | 115 | * FUNCTION: acpi_ex_read_data_from_field |
| @@ -63,8 +124,9 @@ ACPI_MODULE_NAME("exfield") | |||
| 63 | * Buffer, depending on the size of the field. | 124 | * Buffer, depending on the size of the field. |
| 64 | * | 125 | * |
| 65 | ******************************************************************************/ | 126 | ******************************************************************************/ |
| 127 | |||
| 66 | acpi_status | 128 | acpi_status |
| 67 | acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state, | 129 | acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state, |
| 68 | union acpi_operand_object *obj_desc, | 130 | union acpi_operand_object *obj_desc, |
| 69 | union acpi_operand_object **ret_buffer_desc) | 131 | union acpi_operand_object **ret_buffer_desc) |
| 70 | { | 132 | { |
| @@ -73,6 +135,7 @@ acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state, | |||
| 73 | acpi_size length; | 135 | acpi_size length; |
| 74 | void *buffer; | 136 | void *buffer; |
| 75 | u32 function; | 137 | u32 function; |
| 138 | u16 accessor_type; | ||
| 76 | 139 | ||
| 77 | ACPI_FUNCTION_TRACE_PTR(ex_read_data_from_field, obj_desc); | 140 | ACPI_FUNCTION_TRACE_PTR(ex_read_data_from_field, obj_desc); |
| 78 | 141 | ||
| @@ -116,9 +179,22 @@ acpi_ex_read_data_from_field(struct acpi_walk_state *walk_state, | |||
| 116 | ACPI_READ | (obj_desc->field.attribute << 16); | 179 | ACPI_READ | (obj_desc->field.attribute << 16); |
| 117 | } else if (obj_desc->field.region_obj->region.space_id == | 180 | } else if (obj_desc->field.region_obj->region.space_id == |
| 118 | ACPI_ADR_SPACE_GSBUS) { | 181 | ACPI_ADR_SPACE_GSBUS) { |
| 119 | length = ACPI_GSBUS_BUFFER_SIZE; | 182 | accessor_type = obj_desc->field.attribute; |
| 120 | function = | 183 | length = acpi_ex_get_serial_access_length(accessor_type, |
| 121 | ACPI_READ | (obj_desc->field.attribute << 16); | 184 | obj_desc-> |
| 185 | field. | ||
| 186 | access_length); | ||
| 187 | |||
| 188 | /* | ||
| 189 | * Add additional 2 bytes for modeled generic_serial_bus data buffer: | ||
| 190 | * typedef struct { | ||
| 191 | * BYTEStatus; // Byte 0 of the data buffer | ||
| 192 | * BYTELength; // Byte 1 of the data buffer | ||
| 193 | * BYTE[x-1]Data; // Bytes 2-x of the arbitrary length data buffer, | ||
| 194 | * } | ||
| 195 | */ | ||
| 196 | length += 2; | ||
| 197 | function = ACPI_READ | (accessor_type << 16); | ||
| 122 | } else { /* IPMI */ | 198 | } else { /* IPMI */ |
| 123 | 199 | ||
| 124 | length = ACPI_IPMI_BUFFER_SIZE; | 200 | length = ACPI_IPMI_BUFFER_SIZE; |
| @@ -231,6 +307,7 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, | |||
| 231 | void *buffer; | 307 | void *buffer; |
| 232 | union acpi_operand_object *buffer_desc; | 308 | union acpi_operand_object *buffer_desc; |
| 233 | u32 function; | 309 | u32 function; |
| 310 | u16 accessor_type; | ||
| 234 | 311 | ||
| 235 | ACPI_FUNCTION_TRACE_PTR(ex_write_data_to_field, obj_desc); | 312 | ACPI_FUNCTION_TRACE_PTR(ex_write_data_to_field, obj_desc); |
| 236 | 313 | ||
| @@ -284,9 +361,22 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, | |||
| 284 | ACPI_WRITE | (obj_desc->field.attribute << 16); | 361 | ACPI_WRITE | (obj_desc->field.attribute << 16); |
| 285 | } else if (obj_desc->field.region_obj->region.space_id == | 362 | } else if (obj_desc->field.region_obj->region.space_id == |
| 286 | ACPI_ADR_SPACE_GSBUS) { | 363 | ACPI_ADR_SPACE_GSBUS) { |
| 287 | length = ACPI_GSBUS_BUFFER_SIZE; | 364 | accessor_type = obj_desc->field.attribute; |
| 288 | function = | 365 | length = acpi_ex_get_serial_access_length(accessor_type, |
| 289 | ACPI_WRITE | (obj_desc->field.attribute << 16); | 366 | obj_desc-> |
| 367 | field. | ||
| 368 | access_length); | ||
| 369 | |||
| 370 | /* | ||
| 371 | * Add additional 2 bytes for modeled generic_serial_bus data buffer: | ||
| 372 | * typedef struct { | ||
| 373 | * BYTEStatus; // Byte 0 of the data buffer | ||
| 374 | * BYTELength; // Byte 1 of the data buffer | ||
| 375 | * BYTE[x-1]Data; // Bytes 2-x of the arbitrary length data buffer, | ||
| 376 | * } | ||
| 377 | */ | ||
| 378 | length += 2; | ||
| 379 | function = ACPI_WRITE | (accessor_type << 16); | ||
| 290 | } else { /* IPMI */ | 380 | } else { /* IPMI */ |
| 291 | 381 | ||
| 292 | length = ACPI_IPMI_BUFFER_SIZE; | 382 | length = ACPI_IPMI_BUFFER_SIZE; |
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index e7e5844c87d0..cf925c4f36b7 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
| @@ -380,9 +380,8 @@ static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) | |||
| 380 | break; | 380 | break; |
| 381 | 381 | ||
| 382 | default: | 382 | default: |
| 383 | acpi_handle_warn(handle, "Unsupported event type 0x%x\n", type); | 383 | acpi_handle_debug(handle, "Unknown event type 0x%x\n", type); |
| 384 | ost_code = ACPI_OST_SC_UNRECOGNIZED_NOTIFY; | 384 | break; |
| 385 | goto err; | ||
| 386 | } | 385 | } |
| 387 | 386 | ||
| 388 | adev = acpi_bus_get_acpi_device(handle); | 387 | adev = acpi_bus_get_acpi_device(handle); |
diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c index a6ee6d7cd63f..acf5a329d538 100644 --- a/drivers/clocksource/exynos_mct.c +++ b/drivers/clocksource/exynos_mct.c | |||
| @@ -416,8 +416,6 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) | |||
| 416 | evt->set_mode = exynos4_tick_set_mode; | 416 | evt->set_mode = exynos4_tick_set_mode; |
| 417 | evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; | 417 | evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; |
| 418 | evt->rating = 450; | 418 | evt->rating = 450; |
| 419 | clockevents_config_and_register(evt, clk_rate / (TICK_BASE_CNT + 1), | ||
| 420 | 0xf, 0x7fffffff); | ||
| 421 | 419 | ||
| 422 | exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET); | 420 | exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET); |
| 423 | 421 | ||
| @@ -430,9 +428,12 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) | |||
| 430 | evt->irq); | 428 | evt->irq); |
| 431 | return -EIO; | 429 | return -EIO; |
| 432 | } | 430 | } |
| 431 | irq_force_affinity(mct_irqs[MCT_L0_IRQ + cpu], cpumask_of(cpu)); | ||
| 433 | } else { | 432 | } else { |
| 434 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); | 433 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); |
| 435 | } | 434 | } |
| 435 | clockevents_config_and_register(evt, clk_rate / (TICK_BASE_CNT + 1), | ||
| 436 | 0xf, 0x7fffffff); | ||
| 436 | 437 | ||
| 437 | return 0; | 438 | return 0; |
| 438 | } | 439 | } |
| @@ -450,7 +451,6 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, | |||
| 450 | unsigned long action, void *hcpu) | 451 | unsigned long action, void *hcpu) |
| 451 | { | 452 | { |
| 452 | struct mct_clock_event_device *mevt; | 453 | struct mct_clock_event_device *mevt; |
| 453 | unsigned int cpu; | ||
| 454 | 454 | ||
| 455 | /* | 455 | /* |
| 456 | * Grab cpu pointer in each case to avoid spurious | 456 | * Grab cpu pointer in each case to avoid spurious |
| @@ -461,12 +461,6 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, | |||
| 461 | mevt = this_cpu_ptr(&percpu_mct_tick); | 461 | mevt = this_cpu_ptr(&percpu_mct_tick); |
| 462 | exynos4_local_timer_setup(&mevt->evt); | 462 | exynos4_local_timer_setup(&mevt->evt); |
| 463 | break; | 463 | break; |
| 464 | case CPU_ONLINE: | ||
| 465 | cpu = (unsigned long)hcpu; | ||
| 466 | if (mct_int_type == MCT_INT_SPI) | ||
| 467 | irq_set_affinity(mct_irqs[MCT_L0_IRQ + cpu], | ||
| 468 | cpumask_of(cpu)); | ||
| 469 | break; | ||
| 470 | case CPU_DYING: | 464 | case CPU_DYING: |
| 471 | mevt = this_cpu_ptr(&percpu_mct_tick); | 465 | mevt = this_cpu_ptr(&percpu_mct_tick); |
| 472 | exynos4_local_timer_stop(&mevt->evt); | 466 | exynos4_local_timer_stop(&mevt->evt); |
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm index 0e9cce82844b..580503513f0f 100644 --- a/drivers/cpufreq/Kconfig.arm +++ b/drivers/cpufreq/Kconfig.arm | |||
| @@ -92,11 +92,7 @@ config ARM_EXYNOS_CPU_FREQ_BOOST_SW | |||
| 92 | 92 | ||
| 93 | config ARM_HIGHBANK_CPUFREQ | 93 | config ARM_HIGHBANK_CPUFREQ |
| 94 | tristate "Calxeda Highbank-based" | 94 | tristate "Calxeda Highbank-based" |
| 95 | depends on ARCH_HIGHBANK | 95 | depends on ARCH_HIGHBANK && GENERIC_CPUFREQ_CPU0 && REGULATOR |
| 96 | select GENERIC_CPUFREQ_CPU0 | ||
| 97 | select PM_OPP | ||
| 98 | select REGULATOR | ||
| 99 | |||
| 100 | default m | 96 | default m |
| 101 | help | 97 | help |
| 102 | This adds the CPUFreq driver for Calxeda Highbank SoC | 98 | This adds the CPUFreq driver for Calxeda Highbank SoC |
diff --git a/drivers/cpufreq/powernv-cpufreq.c b/drivers/cpufreq/powernv-cpufreq.c index 9edccc63245d..af4968813e76 100644 --- a/drivers/cpufreq/powernv-cpufreq.c +++ b/drivers/cpufreq/powernv-cpufreq.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | 29 | ||
| 30 | #include <asm/cputhreads.h> | 30 | #include <asm/cputhreads.h> |
| 31 | #include <asm/reg.h> | 31 | #include <asm/reg.h> |
| 32 | #include <asm/smp.h> /* Required for cpu_sibling_mask() in UP configs */ | ||
| 32 | 33 | ||
| 33 | #define POWERNV_MAX_PSTATES 256 | 34 | #define POWERNV_MAX_PSTATES 256 |
| 34 | 35 | ||
diff --git a/drivers/cpufreq/ppc-corenet-cpufreq.c b/drivers/cpufreq/ppc-corenet-cpufreq.c index b7e677be1df0..a1ca3dd04a8e 100644 --- a/drivers/cpufreq/ppc-corenet-cpufreq.c +++ b/drivers/cpufreq/ppc-corenet-cpufreq.c | |||
| @@ -206,7 +206,7 @@ static int corenet_cpufreq_cpu_init(struct cpufreq_policy *policy) | |||
| 206 | per_cpu(cpu_data, i) = data; | 206 | per_cpu(cpu_data, i) = data; |
| 207 | 207 | ||
| 208 | policy->cpuinfo.transition_latency = | 208 | policy->cpuinfo.transition_latency = |
| 209 | (12 * NSEC_PER_SEC) / fsl_get_sys_freq(); | 209 | (12ULL * NSEC_PER_SEC) / fsl_get_sys_freq(); |
| 210 | of_node_put(np); | 210 | of_node_put(np); |
| 211 | 211 | ||
| 212 | return 0; | 212 | return 0; |
diff --git a/drivers/cpufreq/unicore2-cpufreq.c b/drivers/cpufreq/unicore2-cpufreq.c index 8d045afa7fb4..6f9dfa80563a 100644 --- a/drivers/cpufreq/unicore2-cpufreq.c +++ b/drivers/cpufreq/unicore2-cpufreq.c | |||
| @@ -60,9 +60,7 @@ static int __init ucv2_cpu_init(struct cpufreq_policy *policy) | |||
| 60 | policy->max = policy->cpuinfo.max_freq = 1000000; | 60 | policy->max = policy->cpuinfo.max_freq = 1000000; |
| 61 | policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; | 61 | policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL; |
| 62 | policy->clk = clk_get(NULL, "MAIN_CLK"); | 62 | policy->clk = clk_get(NULL, "MAIN_CLK"); |
| 63 | if (IS_ERR(policy->clk)) | 63 | return PTR_ERR_OR_ZERO(policy->clk); |
| 64 | return PTR_ERR(policy->clk); | ||
| 65 | return 0; | ||
| 66 | } | 64 | } |
| 67 | 65 | ||
| 68 | static struct cpufreq_driver ucv2_driver = { | 66 | static struct cpufreq_driver ucv2_driver = { |
diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c index a43220c2e3d9..4d140bbbe100 100644 --- a/drivers/idle/intel_idle.c +++ b/drivers/idle/intel_idle.c | |||
| @@ -750,9 +750,10 @@ void intel_idle_state_table_update(void) | |||
| 750 | if (package_num + 1 > num_sockets) { | 750 | if (package_num + 1 > num_sockets) { |
| 751 | num_sockets = package_num + 1; | 751 | num_sockets = package_num + 1; |
| 752 | 752 | ||
| 753 | if (num_sockets > 4) | 753 | if (num_sockets > 4) { |
| 754 | cpuidle_state_table = ivt_cstates_8s; | 754 | cpuidle_state_table = ivt_cstates_8s; |
| 755 | return; | 755 | return; |
| 756 | } | ||
| 756 | } | 757 | } |
| 757 | } | 758 | } |
| 758 | 759 | ||
diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c index 5b1aa027c034..89777ed9abd8 100644 --- a/drivers/iio/adc/at91_adc.c +++ b/drivers/iio/adc/at91_adc.c | |||
| @@ -765,14 +765,17 @@ static int at91_adc_probe_pdata(struct at91_adc_state *st, | |||
| 765 | if (!pdata) | 765 | if (!pdata) |
| 766 | return -EINVAL; | 766 | return -EINVAL; |
| 767 | 767 | ||
| 768 | st->caps = (struct at91_adc_caps *) | ||
| 769 | platform_get_device_id(pdev)->driver_data; | ||
| 770 | |||
| 768 | st->use_external = pdata->use_external_triggers; | 771 | st->use_external = pdata->use_external_triggers; |
| 769 | st->vref_mv = pdata->vref; | 772 | st->vref_mv = pdata->vref; |
| 770 | st->channels_mask = pdata->channels_used; | 773 | st->channels_mask = pdata->channels_used; |
| 771 | st->num_channels = pdata->num_channels; | 774 | st->num_channels = st->caps->num_channels; |
| 772 | st->startup_time = pdata->startup_time; | 775 | st->startup_time = pdata->startup_time; |
| 773 | st->trigger_number = pdata->trigger_number; | 776 | st->trigger_number = pdata->trigger_number; |
| 774 | st->trigger_list = pdata->trigger_list; | 777 | st->trigger_list = pdata->trigger_list; |
| 775 | st->registers = pdata->registers; | 778 | st->registers = &st->caps->registers; |
| 776 | 779 | ||
| 777 | return 0; | 780 | return 0; |
| 778 | } | 781 | } |
| @@ -1004,8 +1007,11 @@ static int at91_adc_probe(struct platform_device *pdev) | |||
| 1004 | * the best converted final value between two channels selection | 1007 | * the best converted final value between two channels selection |
| 1005 | * The formula thus is : Sample and Hold Time = (shtim + 1) / ADCClock | 1008 | * The formula thus is : Sample and Hold Time = (shtim + 1) / ADCClock |
| 1006 | */ | 1009 | */ |
| 1007 | shtim = round_up((st->sample_hold_time * adc_clk_khz / | 1010 | if (st->sample_hold_time > 0) |
| 1008 | 1000) - 1, 1); | 1011 | shtim = round_up((st->sample_hold_time * adc_clk_khz / 1000) |
| 1012 | - 1, 1); | ||
| 1013 | else | ||
| 1014 | shtim = 0; | ||
| 1009 | 1015 | ||
| 1010 | reg = AT91_ADC_PRESCAL_(prsc) & st->registers->mr_prescal_mask; | 1016 | reg = AT91_ADC_PRESCAL_(prsc) & st->registers->mr_prescal_mask; |
| 1011 | reg |= AT91_ADC_STARTUP_(ticks) & st->registers->mr_startup_mask; | 1017 | reg |= AT91_ADC_STARTUP_(ticks) & st->registers->mr_startup_mask; |
| @@ -1101,7 +1107,6 @@ static int at91_adc_remove(struct platform_device *pdev) | |||
| 1101 | return 0; | 1107 | return 0; |
| 1102 | } | 1108 | } |
| 1103 | 1109 | ||
| 1104 | #ifdef CONFIG_OF | ||
| 1105 | static struct at91_adc_caps at91sam9260_caps = { | 1110 | static struct at91_adc_caps at91sam9260_caps = { |
| 1106 | .calc_startup_ticks = calc_startup_ticks_9260, | 1111 | .calc_startup_ticks = calc_startup_ticks_9260, |
| 1107 | .num_channels = 4, | 1112 | .num_channels = 4, |
| @@ -1154,11 +1159,27 @@ static const struct of_device_id at91_adc_dt_ids[] = { | |||
| 1154 | {}, | 1159 | {}, |
| 1155 | }; | 1160 | }; |
| 1156 | MODULE_DEVICE_TABLE(of, at91_adc_dt_ids); | 1161 | MODULE_DEVICE_TABLE(of, at91_adc_dt_ids); |
| 1157 | #endif | 1162 | |
| 1163 | static const struct platform_device_id at91_adc_ids[] = { | ||
| 1164 | { | ||
| 1165 | .name = "at91sam9260-adc", | ||
| 1166 | .driver_data = (unsigned long)&at91sam9260_caps, | ||
| 1167 | }, { | ||
| 1168 | .name = "at91sam9g45-adc", | ||
| 1169 | .driver_data = (unsigned long)&at91sam9g45_caps, | ||
| 1170 | }, { | ||
| 1171 | .name = "at91sam9x5-adc", | ||
| 1172 | .driver_data = (unsigned long)&at91sam9x5_caps, | ||
| 1173 | }, { | ||
| 1174 | /* terminator */ | ||
| 1175 | } | ||
| 1176 | }; | ||
| 1177 | MODULE_DEVICE_TABLE(platform, at91_adc_ids); | ||
| 1158 | 1178 | ||
| 1159 | static struct platform_driver at91_adc_driver = { | 1179 | static struct platform_driver at91_adc_driver = { |
| 1160 | .probe = at91_adc_probe, | 1180 | .probe = at91_adc_probe, |
| 1161 | .remove = at91_adc_remove, | 1181 | .remove = at91_adc_remove, |
| 1182 | .id_table = at91_adc_ids, | ||
| 1162 | .driver = { | 1183 | .driver = { |
| 1163 | .name = DRIVER_NAME, | 1184 | .name = DRIVER_NAME, |
| 1164 | .of_match_table = of_match_ptr(at91_adc_dt_ids), | 1185 | .of_match_table = of_match_ptr(at91_adc_dt_ids), |
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index e108f2a9d827..e472cff6eeae 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c | |||
| @@ -165,7 +165,8 @@ static ssize_t iio_scan_el_show(struct device *dev, | |||
| 165 | int ret; | 165 | int ret; |
| 166 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); | 166 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); |
| 167 | 167 | ||
| 168 | ret = test_bit(to_iio_dev_attr(attr)->address, | 168 | /* Ensure ret is 0 or 1. */ |
| 169 | ret = !!test_bit(to_iio_dev_attr(attr)->address, | ||
| 169 | indio_dev->buffer->scan_mask); | 170 | indio_dev->buffer->scan_mask); |
| 170 | 171 | ||
| 171 | return sprintf(buf, "%d\n", ret); | 172 | return sprintf(buf, "%d\n", ret); |
| @@ -862,7 +863,8 @@ int iio_scan_mask_query(struct iio_dev *indio_dev, | |||
| 862 | if (!buffer->scan_mask) | 863 | if (!buffer->scan_mask) |
| 863 | return 0; | 864 | return 0; |
| 864 | 865 | ||
| 865 | return test_bit(bit, buffer->scan_mask); | 866 | /* Ensure return value is 0 or 1. */ |
| 867 | return !!test_bit(bit, buffer->scan_mask); | ||
| 866 | }; | 868 | }; |
| 867 | EXPORT_SYMBOL_GPL(iio_scan_mask_query); | 869 | EXPORT_SYMBOL_GPL(iio_scan_mask_query); |
| 868 | 870 | ||
diff --git a/drivers/iio/light/cm32181.c b/drivers/iio/light/cm32181.c index 47a6dbac2d0c..d976e6ce60db 100644 --- a/drivers/iio/light/cm32181.c +++ b/drivers/iio/light/cm32181.c | |||
| @@ -221,6 +221,7 @@ static int cm32181_read_raw(struct iio_dev *indio_dev, | |||
| 221 | *val = cm32181->calibscale; | 221 | *val = cm32181->calibscale; |
| 222 | return IIO_VAL_INT; | 222 | return IIO_VAL_INT; |
| 223 | case IIO_CHAN_INFO_INT_TIME: | 223 | case IIO_CHAN_INFO_INT_TIME: |
| 224 | *val = 0; | ||
| 224 | ret = cm32181_read_als_it(cm32181, val2); | 225 | ret = cm32181_read_als_it(cm32181, val2); |
| 225 | return ret; | 226 | return ret; |
| 226 | } | 227 | } |
diff --git a/drivers/iio/light/cm36651.c b/drivers/iio/light/cm36651.c index a45e07492db3..39fc67e82138 100644 --- a/drivers/iio/light/cm36651.c +++ b/drivers/iio/light/cm36651.c | |||
| @@ -652,7 +652,19 @@ static int cm36651_probe(struct i2c_client *client, | |||
| 652 | cm36651->client = client; | 652 | cm36651->client = client; |
| 653 | cm36651->ps_client = i2c_new_dummy(client->adapter, | 653 | cm36651->ps_client = i2c_new_dummy(client->adapter, |
| 654 | CM36651_I2C_ADDR_PS); | 654 | CM36651_I2C_ADDR_PS); |
| 655 | if (!cm36651->ps_client) { | ||
| 656 | dev_err(&client->dev, "%s: new i2c device failed\n", __func__); | ||
| 657 | ret = -ENODEV; | ||
| 658 | goto error_disable_reg; | ||
| 659 | } | ||
| 660 | |||
| 655 | cm36651->ara_client = i2c_new_dummy(client->adapter, CM36651_ARA); | 661 | cm36651->ara_client = i2c_new_dummy(client->adapter, CM36651_ARA); |
| 662 | if (!cm36651->ara_client) { | ||
| 663 | dev_err(&client->dev, "%s: new i2c device failed\n", __func__); | ||
| 664 | ret = -ENODEV; | ||
| 665 | goto error_i2c_unregister_ps; | ||
| 666 | } | ||
| 667 | |||
| 656 | mutex_init(&cm36651->lock); | 668 | mutex_init(&cm36651->lock); |
| 657 | indio_dev->dev.parent = &client->dev; | 669 | indio_dev->dev.parent = &client->dev; |
| 658 | indio_dev->channels = cm36651_channels; | 670 | indio_dev->channels = cm36651_channels; |
| @@ -664,7 +676,7 @@ static int cm36651_probe(struct i2c_client *client, | |||
| 664 | ret = cm36651_setup_reg(cm36651); | 676 | ret = cm36651_setup_reg(cm36651); |
| 665 | if (ret) { | 677 | if (ret) { |
| 666 | dev_err(&client->dev, "%s: register setup failed\n", __func__); | 678 | dev_err(&client->dev, "%s: register setup failed\n", __func__); |
| 667 | goto error_disable_reg; | 679 | goto error_i2c_unregister_ara; |
| 668 | } | 680 | } |
| 669 | 681 | ||
| 670 | ret = request_threaded_irq(client->irq, NULL, cm36651_irq_handler, | 682 | ret = request_threaded_irq(client->irq, NULL, cm36651_irq_handler, |
| @@ -672,7 +684,7 @@ static int cm36651_probe(struct i2c_client *client, | |||
| 672 | "cm36651", indio_dev); | 684 | "cm36651", indio_dev); |
| 673 | if (ret) { | 685 | if (ret) { |
| 674 | dev_err(&client->dev, "%s: request irq failed\n", __func__); | 686 | dev_err(&client->dev, "%s: request irq failed\n", __func__); |
| 675 | goto error_disable_reg; | 687 | goto error_i2c_unregister_ara; |
| 676 | } | 688 | } |
| 677 | 689 | ||
| 678 | ret = iio_device_register(indio_dev); | 690 | ret = iio_device_register(indio_dev); |
| @@ -685,6 +697,10 @@ static int cm36651_probe(struct i2c_client *client, | |||
| 685 | 697 | ||
| 686 | error_free_irq: | 698 | error_free_irq: |
| 687 | free_irq(client->irq, indio_dev); | 699 | free_irq(client->irq, indio_dev); |
| 700 | error_i2c_unregister_ara: | ||
| 701 | i2c_unregister_device(cm36651->ara_client); | ||
| 702 | error_i2c_unregister_ps: | ||
| 703 | i2c_unregister_device(cm36651->ps_client); | ||
| 688 | error_disable_reg: | 704 | error_disable_reg: |
| 689 | regulator_disable(cm36651->vled_reg); | 705 | regulator_disable(cm36651->vled_reg); |
| 690 | return ret; | 706 | return ret; |
| @@ -698,6 +714,8 @@ static int cm36651_remove(struct i2c_client *client) | |||
| 698 | iio_device_unregister(indio_dev); | 714 | iio_device_unregister(indio_dev); |
| 699 | regulator_disable(cm36651->vled_reg); | 715 | regulator_disable(cm36651->vled_reg); |
| 700 | free_irq(client->irq, indio_dev); | 716 | free_irq(client->irq, indio_dev); |
| 717 | i2c_unregister_device(cm36651->ps_client); | ||
| 718 | i2c_unregister_device(cm36651->ara_client); | ||
| 701 | 719 | ||
| 702 | return 0; | 720 | return 0; |
| 703 | } | 721 | } |
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c index 4300b6606f5e..57d165e026f4 100644 --- a/drivers/irqchip/irq-gic.c +++ b/drivers/irqchip/irq-gic.c | |||
| @@ -246,10 +246,14 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, | |||
| 246 | bool force) | 246 | bool force) |
| 247 | { | 247 | { |
| 248 | void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3); | 248 | void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3); |
| 249 | unsigned int shift = (gic_irq(d) % 4) * 8; | 249 | unsigned int cpu, shift = (gic_irq(d) % 4) * 8; |
| 250 | unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask); | ||
| 251 | u32 val, mask, bit; | 250 | u32 val, mask, bit; |
| 252 | 251 | ||
| 252 | if (!force) | ||
| 253 | cpu = cpumask_any_and(mask_val, cpu_online_mask); | ||
| 254 | else | ||
| 255 | cpu = cpumask_first(mask_val); | ||
| 256 | |||
| 253 | if (cpu >= NR_GIC_CPU_IF || cpu >= nr_cpu_ids) | 257 | if (cpu >= NR_GIC_CPU_IF || cpu >= nr_cpu_ids) |
| 254 | return -EINVAL; | 258 | return -EINVAL; |
| 255 | 259 | ||
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index 3bb05f17b9b4..4906c27fa3bd 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig | |||
| @@ -33,6 +33,7 @@ config PHY_MVEBU_SATA | |||
| 33 | 33 | ||
| 34 | config OMAP_CONTROL_PHY | 34 | config OMAP_CONTROL_PHY |
| 35 | tristate "OMAP CONTROL PHY Driver" | 35 | tristate "OMAP CONTROL PHY Driver" |
| 36 | depends on ARCH_OMAP2PLUS || COMPILE_TEST | ||
| 36 | help | 37 | help |
| 37 | Enable this to add support for the PHY part present in the control | 38 | Enable this to add support for the PHY part present in the control |
| 38 | module. This driver has API to power on the USB2 PHY and to write to | 39 | module. This driver has API to power on the USB2 PHY and to write to |
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index 2faf78edc864..7728518572a4 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile | |||
| @@ -13,8 +13,9 @@ obj-$(CONFIG_TI_PIPE3) += phy-ti-pipe3.o | |||
| 13 | obj-$(CONFIG_TWL4030_USB) += phy-twl4030-usb.o | 13 | obj-$(CONFIG_TWL4030_USB) += phy-twl4030-usb.o |
| 14 | obj-$(CONFIG_PHY_EXYNOS5250_SATA) += phy-exynos5250-sata.o | 14 | obj-$(CONFIG_PHY_EXYNOS5250_SATA) += phy-exynos5250-sata.o |
| 15 | obj-$(CONFIG_PHY_SUN4I_USB) += phy-sun4i-usb.o | 15 | obj-$(CONFIG_PHY_SUN4I_USB) += phy-sun4i-usb.o |
| 16 | obj-$(CONFIG_PHY_SAMSUNG_USB2) += phy-samsung-usb2.o | 16 | obj-$(CONFIG_PHY_SAMSUNG_USB2) += phy-exynos-usb2.o |
| 17 | obj-$(CONFIG_PHY_EXYNOS4210_USB2) += phy-exynos4210-usb2.o | 17 | phy-exynos-usb2-y += phy-samsung-usb2.o |
| 18 | obj-$(CONFIG_PHY_EXYNOS4X12_USB2) += phy-exynos4x12-usb2.o | 18 | phy-exynos-usb2-$(CONFIG_PHY_EXYNOS4210_USB2) += phy-exynos4210-usb2.o |
| 19 | obj-$(CONFIG_PHY_EXYNOS5250_USB2) += phy-exynos5250-usb2.o | 19 | phy-exynos-usb2-$(CONFIG_PHY_EXYNOS4X12_USB2) += phy-exynos4x12-usb2.o |
| 20 | phy-exynos-usb2-$(CONFIG_PHY_EXYNOS5250_USB2) += phy-exynos5250-usb2.o | ||
| 20 | obj-$(CONFIG_PHY_XGENE) += phy-xgene.o | 21 | obj-$(CONFIG_PHY_XGENE) += phy-xgene.o |
diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c index 623b71c54b3e..c64a2f3b2d62 100644 --- a/drivers/phy/phy-core.c +++ b/drivers/phy/phy-core.c | |||
| @@ -64,6 +64,9 @@ static struct phy *phy_lookup(struct device *device, const char *port) | |||
| 64 | class_dev_iter_init(&iter, phy_class, NULL, NULL); | 64 | class_dev_iter_init(&iter, phy_class, NULL, NULL); |
| 65 | while ((dev = class_dev_iter_next(&iter))) { | 65 | while ((dev = class_dev_iter_next(&iter))) { |
| 66 | phy = to_phy(dev); | 66 | phy = to_phy(dev); |
| 67 | |||
| 68 | if (!phy->init_data) | ||
| 69 | continue; | ||
| 67 | count = phy->init_data->num_consumers; | 70 | count = phy->init_data->num_consumers; |
| 68 | consumers = phy->init_data->consumers; | 71 | consumers = phy->init_data->consumers; |
| 69 | while (count--) { | 72 | while (count--) { |
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index 258fef272ea7..3736bc408adb 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | 15 | ||
| 16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
| 17 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
| 18 | #include <linux/pci.h> | ||
| 18 | #include <linux/string.h> | 19 | #include <linux/string.h> |
| 19 | #include <linux/slab.h> | 20 | #include <linux/slab.h> |
| 20 | #include <linux/pnp.h> | 21 | #include <linux/pnp.h> |
| @@ -334,6 +335,81 @@ static void quirk_amd_mmconfig_area(struct pnp_dev *dev) | |||
| 334 | } | 335 | } |
| 335 | #endif | 336 | #endif |
| 336 | 337 | ||
| 338 | #ifdef CONFIG_X86 | ||
| 339 | /* Device IDs of parts that have 32KB MCH space */ | ||
| 340 | static const unsigned int mch_quirk_devices[] = { | ||
| 341 | 0x0154, /* Ivy Bridge */ | ||
| 342 | 0x0c00, /* Haswell */ | ||
| 343 | }; | ||
| 344 | |||
| 345 | static struct pci_dev *get_intel_host(void) | ||
| 346 | { | ||
| 347 | int i; | ||
| 348 | struct pci_dev *host; | ||
| 349 | |||
| 350 | for (i = 0; i < ARRAY_SIZE(mch_quirk_devices); i++) { | ||
| 351 | host = pci_get_device(PCI_VENDOR_ID_INTEL, mch_quirk_devices[i], | ||
| 352 | NULL); | ||
| 353 | if (host) | ||
| 354 | return host; | ||
| 355 | } | ||
| 356 | return NULL; | ||
| 357 | } | ||
| 358 | |||
| 359 | static void quirk_intel_mch(struct pnp_dev *dev) | ||
| 360 | { | ||
| 361 | struct pci_dev *host; | ||
| 362 | u32 addr_lo, addr_hi; | ||
| 363 | struct pci_bus_region region; | ||
| 364 | struct resource mch; | ||
| 365 | struct pnp_resource *pnp_res; | ||
| 366 | struct resource *res; | ||
| 367 | |||
| 368 | host = get_intel_host(); | ||
| 369 | if (!host) | ||
| 370 | return; | ||
| 371 | |||
| 372 | /* | ||
| 373 | * MCHBAR is not an architected PCI BAR, so MCH space is usually | ||
| 374 | * reported as a PNP0C02 resource. The MCH space was originally | ||
| 375 | * 16KB, but is 32KB in newer parts. Some BIOSes still report a | ||
| 376 | * PNP0C02 resource that is only 16KB, which means the rest of the | ||
| 377 | * MCH space is consumed but unreported. | ||
| 378 | */ | ||
| 379 | |||
| 380 | /* | ||
| 381 | * Read MCHBAR for Host Member Mapped Register Range Base | ||
| 382 | * https://www-ssl.intel.com/content/www/us/en/processors/core/4th-gen-core-family-desktop-vol-2-datasheet | ||
| 383 | * Sec 3.1.12. | ||
| 384 | */ | ||
| 385 | pci_read_config_dword(host, 0x48, &addr_lo); | ||
| 386 | region.start = addr_lo & ~0x7fff; | ||
| 387 | pci_read_config_dword(host, 0x4c, &addr_hi); | ||
| 388 | region.start |= (u64) addr_hi << 32; | ||
| 389 | region.end = region.start + 32*1024 - 1; | ||
| 390 | |||
| 391 | memset(&mch, 0, sizeof(mch)); | ||
| 392 | mch.flags = IORESOURCE_MEM; | ||
| 393 | pcibios_bus_to_resource(host->bus, &mch, ®ion); | ||
| 394 | |||
| 395 | list_for_each_entry(pnp_res, &dev->resources, list) { | ||
| 396 | res = &pnp_res->res; | ||
| 397 | if (res->end < mch.start || res->start > mch.end) | ||
| 398 | continue; /* no overlap */ | ||
| 399 | if (res->start == mch.start && res->end == mch.end) | ||
| 400 | continue; /* exact match */ | ||
| 401 | |||
| 402 | dev_info(&dev->dev, FW_BUG "PNP resource %pR covers only part of %s Intel MCH; extending to %pR\n", | ||
| 403 | res, pci_name(host), &mch); | ||
| 404 | res->start = mch.start; | ||
| 405 | res->end = mch.end; | ||
| 406 | break; | ||
| 407 | } | ||
| 408 | |||
| 409 | pci_dev_put(host); | ||
| 410 | } | ||
| 411 | #endif | ||
| 412 | |||
| 337 | /* | 413 | /* |
| 338 | * PnP Quirks | 414 | * PnP Quirks |
| 339 | * Cards or devices that need some tweaking due to incomplete resource info | 415 | * Cards or devices that need some tweaking due to incomplete resource info |
| @@ -364,6 +440,9 @@ static struct pnp_fixup pnp_fixups[] = { | |||
| 364 | #ifdef CONFIG_AMD_NB | 440 | #ifdef CONFIG_AMD_NB |
| 365 | {"PNP0c01", quirk_amd_mmconfig_area}, | 441 | {"PNP0c01", quirk_amd_mmconfig_area}, |
| 366 | #endif | 442 | #endif |
| 443 | #ifdef CONFIG_X86 | ||
| 444 | {"PNP0c02", quirk_intel_mch}, | ||
| 445 | #endif | ||
| 367 | {""} | 446 | {""} |
| 368 | }; | 447 | }; |
| 369 | 448 | ||
diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c index 71db683098d6..b59af0303581 100644 --- a/drivers/staging/comedi/drivers/usbdux.c +++ b/drivers/staging/comedi/drivers/usbdux.c | |||
| @@ -493,7 +493,7 @@ static void usbduxsub_ao_isoc_irq(struct urb *urb) | |||
| 493 | /* pointer to the DA */ | 493 | /* pointer to the DA */ |
| 494 | *datap++ = val & 0xff; | 494 | *datap++ = val & 0xff; |
| 495 | *datap++ = (val >> 8) & 0xff; | 495 | *datap++ = (val >> 8) & 0xff; |
| 496 | *datap++ = chan; | 496 | *datap++ = chan << 6; |
| 497 | devpriv->ao_readback[chan] = val; | 497 | devpriv->ao_readback[chan] = val; |
| 498 | 498 | ||
| 499 | s->async->events |= COMEDI_CB_BLOCK; | 499 | s->async->events |= COMEDI_CB_BLOCK; |
| @@ -1040,11 +1040,8 @@ static int usbdux_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s) | |||
| 1040 | /* set current channel of the running acquisition to zero */ | 1040 | /* set current channel of the running acquisition to zero */ |
| 1041 | s->async->cur_chan = 0; | 1041 | s->async->cur_chan = 0; |
| 1042 | 1042 | ||
| 1043 | for (i = 0; i < cmd->chanlist_len; ++i) { | 1043 | for (i = 0; i < cmd->chanlist_len; ++i) |
| 1044 | unsigned int chan = CR_CHAN(cmd->chanlist[i]); | 1044 | devpriv->ao_chanlist[i] = CR_CHAN(cmd->chanlist[i]); |
| 1045 | |||
| 1046 | devpriv->ao_chanlist[i] = chan << 6; | ||
| 1047 | } | ||
| 1048 | 1045 | ||
| 1049 | /* we count in steps of 1ms (125us) */ | 1046 | /* we count in steps of 1ms (125us) */ |
| 1050 | /* 125us mode not used yet */ | 1047 | /* 125us mode not used yet */ |
diff --git a/drivers/staging/iio/adc/mxs-lradc.c b/drivers/staging/iio/adc/mxs-lradc.c index 11fb95201545..dae8d1a9038e 100644 --- a/drivers/staging/iio/adc/mxs-lradc.c +++ b/drivers/staging/iio/adc/mxs-lradc.c | |||
| @@ -1526,7 +1526,7 @@ static int mxs_lradc_probe(struct platform_device *pdev) | |||
| 1526 | struct resource *iores; | 1526 | struct resource *iores; |
| 1527 | int ret = 0, touch_ret; | 1527 | int ret = 0, touch_ret; |
| 1528 | int i, s; | 1528 | int i, s; |
| 1529 | unsigned int scale_uv; | 1529 | uint64_t scale_uv; |
| 1530 | 1530 | ||
| 1531 | /* Allocate the IIO device. */ | 1531 | /* Allocate the IIO device. */ |
| 1532 | iio = devm_iio_device_alloc(dev, sizeof(*lradc)); | 1532 | iio = devm_iio_device_alloc(dev, sizeof(*lradc)); |
diff --git a/drivers/staging/iio/resolver/ad2s1200.c b/drivers/staging/iio/resolver/ad2s1200.c index 36eedd8a0ea9..e2b482045158 100644 --- a/drivers/staging/iio/resolver/ad2s1200.c +++ b/drivers/staging/iio/resolver/ad2s1200.c | |||
| @@ -70,6 +70,7 @@ static int ad2s1200_read_raw(struct iio_dev *indio_dev, | |||
| 70 | vel = (((s16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); | 70 | vel = (((s16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); |
| 71 | vel = (vel << 4) >> 4; | 71 | vel = (vel << 4) >> 4; |
| 72 | *val = vel; | 72 | *val = vel; |
| 73 | break; | ||
| 73 | default: | 74 | default: |
| 74 | mutex_unlock(&st->lock); | 75 | mutex_unlock(&st->lock); |
| 75 | return -EINVAL; | 76 | return -EINVAL; |
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c index 81f909c2101f..0e1bf8858431 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c | |||
| @@ -1520,7 +1520,7 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) | |||
| 1520 | status = serial8250_rx_chars(up, status); | 1520 | status = serial8250_rx_chars(up, status); |
| 1521 | } | 1521 | } |
| 1522 | serial8250_modem_status(up); | 1522 | serial8250_modem_status(up); |
| 1523 | if (status & UART_LSR_THRE) | 1523 | if (!up->dma && (status & UART_LSR_THRE)) |
| 1524 | serial8250_tx_chars(up); | 1524 | serial8250_tx_chars(up); |
| 1525 | 1525 | ||
| 1526 | spin_unlock_irqrestore(&port->lock, flags); | 1526 | spin_unlock_irqrestore(&port->lock, flags); |
diff --git a/drivers/tty/serial/8250/8250_dma.c b/drivers/tty/serial/8250/8250_dma.c index 7046769608d4..ab9096dc3849 100644 --- a/drivers/tty/serial/8250/8250_dma.c +++ b/drivers/tty/serial/8250/8250_dma.c | |||
| @@ -20,12 +20,15 @@ static void __dma_tx_complete(void *param) | |||
| 20 | struct uart_8250_port *p = param; | 20 | struct uart_8250_port *p = param; |
| 21 | struct uart_8250_dma *dma = p->dma; | 21 | struct uart_8250_dma *dma = p->dma; |
| 22 | struct circ_buf *xmit = &p->port.state->xmit; | 22 | struct circ_buf *xmit = &p->port.state->xmit; |
| 23 | 23 | unsigned long flags; | |
| 24 | dma->tx_running = 0; | ||
| 25 | 24 | ||
| 26 | dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr, | 25 | dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr, |
| 27 | UART_XMIT_SIZE, DMA_TO_DEVICE); | 26 | UART_XMIT_SIZE, DMA_TO_DEVICE); |
| 28 | 27 | ||
| 28 | spin_lock_irqsave(&p->port.lock, flags); | ||
| 29 | |||
| 30 | dma->tx_running = 0; | ||
| 31 | |||
| 29 | xmit->tail += dma->tx_size; | 32 | xmit->tail += dma->tx_size; |
| 30 | xmit->tail &= UART_XMIT_SIZE - 1; | 33 | xmit->tail &= UART_XMIT_SIZE - 1; |
| 31 | p->port.icount.tx += dma->tx_size; | 34 | p->port.icount.tx += dma->tx_size; |
| @@ -35,6 +38,8 @@ static void __dma_tx_complete(void *param) | |||
| 35 | 38 | ||
| 36 | if (!uart_circ_empty(xmit) && !uart_tx_stopped(&p->port)) | 39 | if (!uart_circ_empty(xmit) && !uart_tx_stopped(&p->port)) |
| 37 | serial8250_tx_dma(p); | 40 | serial8250_tx_dma(p); |
| 41 | |||
| 42 | spin_unlock_irqrestore(&p->port.lock, flags); | ||
| 38 | } | 43 | } |
| 39 | 44 | ||
| 40 | static void __dma_rx_complete(void *param) | 45 | static void __dma_rx_complete(void *param) |
diff --git a/drivers/tty/serial/samsung.c b/drivers/tty/serial/samsung.c index 23f459600738..1f5505e7f90d 100644 --- a/drivers/tty/serial/samsung.c +++ b/drivers/tty/serial/samsung.c | |||
| @@ -1446,8 +1446,8 @@ static int s3c24xx_serial_get_poll_char(struct uart_port *port) | |||
| 1446 | static void s3c24xx_serial_put_poll_char(struct uart_port *port, | 1446 | static void s3c24xx_serial_put_poll_char(struct uart_port *port, |
| 1447 | unsigned char c) | 1447 | unsigned char c) |
| 1448 | { | 1448 | { |
| 1449 | unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON); | 1449 | unsigned int ufcon = rd_regl(port, S3C2410_UFCON); |
| 1450 | unsigned int ucon = rd_regl(cons_uart, S3C2410_UCON); | 1450 | unsigned int ucon = rd_regl(port, S3C2410_UCON); |
| 1451 | 1451 | ||
| 1452 | /* not possible to xmit on unconfigured port */ | 1452 | /* not possible to xmit on unconfigured port */ |
| 1453 | if (!s3c24xx_port_configured(ucon)) | 1453 | if (!s3c24xx_port_configured(ucon)) |
| @@ -1455,7 +1455,7 @@ static void s3c24xx_serial_put_poll_char(struct uart_port *port, | |||
| 1455 | 1455 | ||
| 1456 | while (!s3c24xx_serial_console_txrdy(port, ufcon)) | 1456 | while (!s3c24xx_serial_console_txrdy(port, ufcon)) |
| 1457 | cpu_relax(); | 1457 | cpu_relax(); |
| 1458 | wr_regb(cons_uart, S3C2410_UTXH, c); | 1458 | wr_regb(port, S3C2410_UTXH, c); |
| 1459 | } | 1459 | } |
| 1460 | 1460 | ||
| 1461 | #endif /* CONFIG_CONSOLE_POLL */ | 1461 | #endif /* CONFIG_CONSOLE_POLL */ |
| @@ -1463,22 +1463,23 @@ static void s3c24xx_serial_put_poll_char(struct uart_port *port, | |||
| 1463 | static void | 1463 | static void |
| 1464 | s3c24xx_serial_console_putchar(struct uart_port *port, int ch) | 1464 | s3c24xx_serial_console_putchar(struct uart_port *port, int ch) |
| 1465 | { | 1465 | { |
| 1466 | unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON); | 1466 | unsigned int ufcon = rd_regl(port, S3C2410_UFCON); |
| 1467 | unsigned int ucon = rd_regl(cons_uart, S3C2410_UCON); | ||
| 1468 | |||
| 1469 | /* not possible to xmit on unconfigured port */ | ||
| 1470 | if (!s3c24xx_port_configured(ucon)) | ||
| 1471 | return; | ||
| 1472 | 1467 | ||
| 1473 | while (!s3c24xx_serial_console_txrdy(port, ufcon)) | 1468 | while (!s3c24xx_serial_console_txrdy(port, ufcon)) |
| 1474 | barrier(); | 1469 | cpu_relax(); |
| 1475 | wr_regb(cons_uart, S3C2410_UTXH, ch); | 1470 | wr_regb(port, S3C2410_UTXH, ch); |
| 1476 | } | 1471 | } |
| 1477 | 1472 | ||
| 1478 | static void | 1473 | static void |
| 1479 | s3c24xx_serial_console_write(struct console *co, const char *s, | 1474 | s3c24xx_serial_console_write(struct console *co, const char *s, |
| 1480 | unsigned int count) | 1475 | unsigned int count) |
| 1481 | { | 1476 | { |
| 1477 | unsigned int ucon = rd_regl(cons_uart, S3C2410_UCON); | ||
| 1478 | |||
| 1479 | /* not possible to xmit on unconfigured port */ | ||
| 1480 | if (!s3c24xx_port_configured(ucon)) | ||
| 1481 | return; | ||
| 1482 | |||
| 1482 | uart_console_write(cons_uart, s, count, s3c24xx_serial_console_putchar); | 1483 | uart_console_write(cons_uart, s, count, s3c24xx_serial_console_putchar); |
| 1483 | } | 1484 | } |
| 1484 | 1485 | ||
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c index f26834d262b3..b68550d95a40 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c | |||
| @@ -137,6 +137,11 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state, | |||
| 137 | return 1; | 137 | return 1; |
| 138 | 138 | ||
| 139 | /* | 139 | /* |
| 140 | * Make sure the device is in D0 state. | ||
| 141 | */ | ||
| 142 | uart_change_pm(state, UART_PM_STATE_ON); | ||
| 143 | |||
| 144 | /* | ||
| 140 | * Initialise and allocate the transmit and temporary | 145 | * Initialise and allocate the transmit and temporary |
| 141 | * buffer. | 146 | * buffer. |
| 142 | */ | 147 | */ |
| @@ -825,25 +830,29 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port, | |||
| 825 | * If we fail to request resources for the | 830 | * If we fail to request resources for the |
| 826 | * new port, try to restore the old settings. | 831 | * new port, try to restore the old settings. |
| 827 | */ | 832 | */ |
| 828 | if (retval && old_type != PORT_UNKNOWN) { | 833 | if (retval) { |
| 829 | uport->iobase = old_iobase; | 834 | uport->iobase = old_iobase; |
| 830 | uport->type = old_type; | 835 | uport->type = old_type; |
| 831 | uport->hub6 = old_hub6; | 836 | uport->hub6 = old_hub6; |
| 832 | uport->iotype = old_iotype; | 837 | uport->iotype = old_iotype; |
| 833 | uport->regshift = old_shift; | 838 | uport->regshift = old_shift; |
| 834 | uport->mapbase = old_mapbase; | 839 | uport->mapbase = old_mapbase; |
| 835 | retval = uport->ops->request_port(uport); | ||
| 836 | /* | ||
| 837 | * If we failed to restore the old settings, | ||
| 838 | * we fail like this. | ||
| 839 | */ | ||
| 840 | if (retval) | ||
| 841 | uport->type = PORT_UNKNOWN; | ||
| 842 | 840 | ||
| 843 | /* | 841 | if (old_type != PORT_UNKNOWN) { |
| 844 | * We failed anyway. | 842 | retval = uport->ops->request_port(uport); |
| 845 | */ | 843 | /* |
| 846 | retval = -EBUSY; | 844 | * If we failed to restore the old settings, |
| 845 | * we fail like this. | ||
| 846 | */ | ||
| 847 | if (retval) | ||
| 848 | uport->type = PORT_UNKNOWN; | ||
| 849 | |||
| 850 | /* | ||
| 851 | * We failed anyway. | ||
| 852 | */ | ||
| 853 | retval = -EBUSY; | ||
| 854 | } | ||
| 855 | |||
| 847 | /* Added to return the correct error -Ram Gupta */ | 856 | /* Added to return the correct error -Ram Gupta */ |
| 848 | goto exit; | 857 | goto exit; |
| 849 | } | 858 | } |
| @@ -1571,12 +1580,6 @@ static int uart_open(struct tty_struct *tty, struct file *filp) | |||
| 1571 | } | 1580 | } |
| 1572 | 1581 | ||
| 1573 | /* | 1582 | /* |
| 1574 | * Make sure the device is in D0 state. | ||
| 1575 | */ | ||
| 1576 | if (port->count == 1) | ||
| 1577 | uart_change_pm(state, UART_PM_STATE_ON); | ||
| 1578 | |||
| 1579 | /* | ||
| 1580 | * Start up the serial port. | 1583 | * Start up the serial port. |
| 1581 | */ | 1584 | */ |
| 1582 | retval = uart_startup(tty, state, 0); | 1585 | retval = uart_startup(tty, state, 0); |
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index 8ebd9f88a6f6..f1d30f6945af 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c | |||
| @@ -255,11 +255,16 @@ static int __tty_buffer_request_room(struct tty_port *port, size_t size, | |||
| 255 | if (change || left < size) { | 255 | if (change || left < size) { |
| 256 | /* This is the slow path - looking for new buffers to use */ | 256 | /* This is the slow path - looking for new buffers to use */ |
| 257 | if ((n = tty_buffer_alloc(port, size)) != NULL) { | 257 | if ((n = tty_buffer_alloc(port, size)) != NULL) { |
| 258 | unsigned long iflags; | ||
| 259 | |||
| 258 | n->flags = flags; | 260 | n->flags = flags; |
| 259 | buf->tail = n; | 261 | buf->tail = n; |
| 262 | |||
| 263 | spin_lock_irqsave(&buf->flush_lock, iflags); | ||
| 260 | b->commit = b->used; | 264 | b->commit = b->used; |
| 261 | smp_mb(); | ||
| 262 | b->next = n; | 265 | b->next = n; |
| 266 | spin_unlock_irqrestore(&buf->flush_lock, iflags); | ||
| 267 | |||
| 263 | } else if (change) | 268 | } else if (change) |
| 264 | size = 0; | 269 | size = 0; |
| 265 | else | 270 | else |
| @@ -443,6 +448,7 @@ static void flush_to_ldisc(struct work_struct *work) | |||
| 443 | mutex_lock(&buf->lock); | 448 | mutex_lock(&buf->lock); |
| 444 | 449 | ||
| 445 | while (1) { | 450 | while (1) { |
| 451 | unsigned long flags; | ||
| 446 | struct tty_buffer *head = buf->head; | 452 | struct tty_buffer *head = buf->head; |
| 447 | int count; | 453 | int count; |
| 448 | 454 | ||
| @@ -450,14 +456,19 @@ static void flush_to_ldisc(struct work_struct *work) | |||
| 450 | if (atomic_read(&buf->priority)) | 456 | if (atomic_read(&buf->priority)) |
| 451 | break; | 457 | break; |
| 452 | 458 | ||
| 459 | spin_lock_irqsave(&buf->flush_lock, flags); | ||
| 453 | count = head->commit - head->read; | 460 | count = head->commit - head->read; |
| 454 | if (!count) { | 461 | if (!count) { |
| 455 | if (head->next == NULL) | 462 | if (head->next == NULL) { |
| 463 | spin_unlock_irqrestore(&buf->flush_lock, flags); | ||
| 456 | break; | 464 | break; |
| 465 | } | ||
| 457 | buf->head = head->next; | 466 | buf->head = head->next; |
| 467 | spin_unlock_irqrestore(&buf->flush_lock, flags); | ||
| 458 | tty_buffer_free(port, head); | 468 | tty_buffer_free(port, head); |
| 459 | continue; | 469 | continue; |
| 460 | } | 470 | } |
| 471 | spin_unlock_irqrestore(&buf->flush_lock, flags); | ||
| 461 | 472 | ||
| 462 | count = receive_buf(tty, head, count); | 473 | count = receive_buf(tty, head, count); |
| 463 | if (!count) | 474 | if (!count) |
| @@ -512,6 +523,7 @@ void tty_buffer_init(struct tty_port *port) | |||
| 512 | struct tty_bufhead *buf = &port->buf; | 523 | struct tty_bufhead *buf = &port->buf; |
| 513 | 524 | ||
| 514 | mutex_init(&buf->lock); | 525 | mutex_init(&buf->lock); |
| 526 | spin_lock_init(&buf->flush_lock); | ||
| 515 | tty_buffer_reset(&buf->sentinel, 0); | 527 | tty_buffer_reset(&buf->sentinel, 0); |
| 516 | buf->head = &buf->sentinel; | 528 | buf->head = &buf->sentinel; |
| 517 | buf->tail = &buf->sentinel; | 529 | buf->tail = &buf->sentinel; |
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index ca6831c5b763..1cd5d0ba587c 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c | |||
| @@ -277,6 +277,39 @@ static void hw_phymode_configure(struct ci_hdrc *ci) | |||
| 277 | } | 277 | } |
| 278 | 278 | ||
| 279 | /** | 279 | /** |
| 280 | * ci_usb_phy_init: initialize phy according to different phy type | ||
| 281 | * @ci: the controller | ||
| 282 | * | ||
| 283 | * This function returns an error code if usb_phy_init has failed | ||
| 284 | */ | ||
| 285 | static int ci_usb_phy_init(struct ci_hdrc *ci) | ||
| 286 | { | ||
| 287 | int ret; | ||
| 288 | |||
| 289 | switch (ci->platdata->phy_mode) { | ||
| 290 | case USBPHY_INTERFACE_MODE_UTMI: | ||
| 291 | case USBPHY_INTERFACE_MODE_UTMIW: | ||
| 292 | case USBPHY_INTERFACE_MODE_HSIC: | ||
| 293 | ret = usb_phy_init(ci->transceiver); | ||
| 294 | if (ret) | ||
| 295 | return ret; | ||
| 296 | hw_phymode_configure(ci); | ||
| 297 | break; | ||
| 298 | case USBPHY_INTERFACE_MODE_ULPI: | ||
| 299 | case USBPHY_INTERFACE_MODE_SERIAL: | ||
| 300 | hw_phymode_configure(ci); | ||
| 301 | ret = usb_phy_init(ci->transceiver); | ||
| 302 | if (ret) | ||
| 303 | return ret; | ||
| 304 | break; | ||
| 305 | default: | ||
| 306 | ret = usb_phy_init(ci->transceiver); | ||
| 307 | } | ||
| 308 | |||
| 309 | return ret; | ||
| 310 | } | ||
| 311 | |||
| 312 | /** | ||
| 280 | * hw_device_reset: resets chip (execute without interruption) | 313 | * hw_device_reset: resets chip (execute without interruption) |
| 281 | * @ci: the controller | 314 | * @ci: the controller |
| 282 | * | 315 | * |
| @@ -543,8 +576,6 @@ static int ci_hdrc_probe(struct platform_device *pdev) | |||
| 543 | return -ENODEV; | 576 | return -ENODEV; |
| 544 | } | 577 | } |
| 545 | 578 | ||
| 546 | hw_phymode_configure(ci); | ||
| 547 | |||
| 548 | if (ci->platdata->phy) | 579 | if (ci->platdata->phy) |
| 549 | ci->transceiver = ci->platdata->phy; | 580 | ci->transceiver = ci->platdata->phy; |
| 550 | else | 581 | else |
| @@ -564,7 +595,7 @@ static int ci_hdrc_probe(struct platform_device *pdev) | |||
| 564 | return -EPROBE_DEFER; | 595 | return -EPROBE_DEFER; |
| 565 | } | 596 | } |
| 566 | 597 | ||
| 567 | ret = usb_phy_init(ci->transceiver); | 598 | ret = ci_usb_phy_init(ci); |
| 568 | if (ret) { | 599 | if (ret) { |
| 569 | dev_err(dev, "unable to init phy: %d\n", ret); | 600 | dev_err(dev, "unable to init phy: %d\n", ret); |
| 570 | return ret; | 601 | return ret; |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index d001417e8e37..10aaaae9af25 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
| @@ -821,6 +821,7 @@ static void dwc3_complete(struct device *dev) | |||
| 821 | 821 | ||
| 822 | spin_lock_irqsave(&dwc->lock, flags); | 822 | spin_lock_irqsave(&dwc->lock, flags); |
| 823 | 823 | ||
| 824 | dwc3_event_buffers_setup(dwc); | ||
| 824 | switch (dwc->dr_mode) { | 825 | switch (dwc->dr_mode) { |
| 825 | case USB_DR_MODE_PERIPHERAL: | 826 | case USB_DR_MODE_PERIPHERAL: |
| 826 | case USB_DR_MODE_OTG: | 827 | case USB_DR_MODE_OTG: |
| @@ -828,7 +829,6 @@ static void dwc3_complete(struct device *dev) | |||
| 828 | /* FALLTHROUGH */ | 829 | /* FALLTHROUGH */ |
| 829 | case USB_DR_MODE_HOST: | 830 | case USB_DR_MODE_HOST: |
| 830 | default: | 831 | default: |
| 831 | dwc3_event_buffers_setup(dwc); | ||
| 832 | break; | 832 | break; |
| 833 | } | 833 | } |
| 834 | 834 | ||
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index a740eac74d56..70715eeededd 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
| @@ -187,15 +187,12 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc) | |||
| 187 | * improve this algorithm so that we better use the internal | 187 | * improve this algorithm so that we better use the internal |
| 188 | * FIFO space | 188 | * FIFO space |
| 189 | */ | 189 | */ |
| 190 | for (num = 0; num < DWC3_ENDPOINTS_NUM; num++) { | 190 | for (num = 0; num < dwc->num_in_eps; num++) { |
| 191 | struct dwc3_ep *dep = dwc->eps[num]; | 191 | /* bit0 indicates direction; 1 means IN ep */ |
| 192 | int fifo_number = dep->number >> 1; | 192 | struct dwc3_ep *dep = dwc->eps[(num << 1) | 1]; |
| 193 | int mult = 1; | 193 | int mult = 1; |
| 194 | int tmp; | 194 | int tmp; |
| 195 | 195 | ||
| 196 | if (!(dep->number & 1)) | ||
| 197 | continue; | ||
| 198 | |||
| 199 | if (!(dep->flags & DWC3_EP_ENABLED)) | 196 | if (!(dep->flags & DWC3_EP_ENABLED)) |
| 200 | continue; | 197 | continue; |
| 201 | 198 | ||
| @@ -224,8 +221,7 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc) | |||
| 224 | dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n", | 221 | dev_vdbg(dwc->dev, "%s: Fifo Addr %04x Size %d\n", |
| 225 | dep->name, last_fifo_depth, fifo_size & 0xffff); | 222 | dep->name, last_fifo_depth, fifo_size & 0xffff); |
| 226 | 223 | ||
| 227 | dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(fifo_number), | 224 | dwc3_writel(dwc->regs, DWC3_GTXFIFOSIZ(num), fifo_size); |
| 228 | fifo_size); | ||
| 229 | 225 | ||
| 230 | last_fifo_depth += (fifo_size & 0xffff); | 226 | last_fifo_depth += (fifo_size & 0xffff); |
| 231 | } | 227 | } |
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 2e164dca08e8..1e12b3ee56fd 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c | |||
| @@ -745,6 +745,12 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) | |||
| 745 | */ | 745 | */ |
| 746 | struct usb_gadget *gadget = epfile->ffs->gadget; | 746 | struct usb_gadget *gadget = epfile->ffs->gadget; |
| 747 | 747 | ||
| 748 | spin_lock_irq(&epfile->ffs->eps_lock); | ||
| 749 | /* In the meantime, endpoint got disabled or changed. */ | ||
| 750 | if (epfile->ep != ep) { | ||
| 751 | spin_unlock_irq(&epfile->ffs->eps_lock); | ||
| 752 | return -ESHUTDOWN; | ||
| 753 | } | ||
| 748 | /* | 754 | /* |
| 749 | * Controller may require buffer size to be aligned to | 755 | * Controller may require buffer size to be aligned to |
| 750 | * maxpacketsize of an out endpoint. | 756 | * maxpacketsize of an out endpoint. |
| @@ -752,6 +758,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) | |||
| 752 | data_len = io_data->read ? | 758 | data_len = io_data->read ? |
| 753 | usb_ep_align_maybe(gadget, ep->ep, io_data->len) : | 759 | usb_ep_align_maybe(gadget, ep->ep, io_data->len) : |
| 754 | io_data->len; | 760 | io_data->len; |
| 761 | spin_unlock_irq(&epfile->ffs->eps_lock); | ||
| 755 | 762 | ||
| 756 | data = kmalloc(data_len, GFP_KERNEL); | 763 | data = kmalloc(data_len, GFP_KERNEL); |
| 757 | if (unlikely(!data)) | 764 | if (unlikely(!data)) |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index c11761ce5113..9a4f49dc6ac4 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
| @@ -377,7 +377,7 @@ static struct sk_buff *rndis_add_header(struct gether *port, | |||
| 377 | if (skb2) | 377 | if (skb2) |
| 378 | rndis_add_hdr(skb2); | 378 | rndis_add_hdr(skb2); |
| 379 | 379 | ||
| 380 | dev_kfree_skb_any(skb); | 380 | dev_kfree_skb(skb); |
| 381 | return skb2; | 381 | return skb2; |
| 382 | } | 382 | } |
| 383 | 383 | ||
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 15960af0f67e..a2f26cdb56fe 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c | |||
| @@ -1219,6 +1219,10 @@ static int fsl_pullup(struct usb_gadget *gadget, int is_on) | |||
| 1219 | struct fsl_udc *udc; | 1219 | struct fsl_udc *udc; |
| 1220 | 1220 | ||
| 1221 | udc = container_of(gadget, struct fsl_udc, gadget); | 1221 | udc = container_of(gadget, struct fsl_udc, gadget); |
| 1222 | |||
| 1223 | if (!udc->vbus_active) | ||
| 1224 | return -EOPNOTSUPP; | ||
| 1225 | |||
| 1222 | udc->softconnect = (is_on != 0); | 1226 | udc->softconnect = (is_on != 0); |
| 1223 | if (can_pullup(udc)) | 1227 | if (can_pullup(udc)) |
| 1224 | fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP), | 1228 | fsl_writel((fsl_readl(&dr_regs->usbcmd) | USB_CMD_RUN_STOP), |
| @@ -2532,8 +2536,8 @@ static int __exit fsl_udc_remove(struct platform_device *pdev) | |||
| 2532 | if (!udc_controller) | 2536 | if (!udc_controller) |
| 2533 | return -ENODEV; | 2537 | return -ENODEV; |
| 2534 | 2538 | ||
| 2535 | usb_del_gadget_udc(&udc_controller->gadget); | ||
| 2536 | udc_controller->done = &done; | 2539 | udc_controller->done = &done; |
| 2540 | usb_del_gadget_udc(&udc_controller->gadget); | ||
| 2537 | 2541 | ||
| 2538 | fsl_udc_clk_release(); | 2542 | fsl_udc_clk_release(); |
| 2539 | 2543 | ||
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index b5be6f0308c2..a925d0cbcd41 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c | |||
| @@ -2043,6 +2043,7 @@ gadgetfs_fill_super (struct super_block *sb, void *opts, int silent) | |||
| 2043 | return -ESRCH; | 2043 | return -ESRCH; |
| 2044 | 2044 | ||
| 2045 | /* fake probe to determine $CHIP */ | 2045 | /* fake probe to determine $CHIP */ |
| 2046 | CHIP = NULL; | ||
| 2046 | usb_gadget_probe_driver(&probe_driver); | 2047 | usb_gadget_probe_driver(&probe_driver); |
| 2047 | if (!CHIP) | 2048 | if (!CHIP) |
| 2048 | return -ENODEV; | 2049 | return -ENODEV; |
diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c index d822d822efb3..7ed452d90f4d 100644 --- a/drivers/usb/gadget/rndis.c +++ b/drivers/usb/gadget/rndis.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <asm/byteorder.h> | 35 | #include <asm/byteorder.h> |
| 36 | #include <asm/unaligned.h> | 36 | #include <asm/unaligned.h> |
| 37 | 37 | ||
| 38 | #include "u_rndis.h" | ||
| 38 | 39 | ||
| 39 | #undef VERBOSE_DEBUG | 40 | #undef VERBOSE_DEBUG |
| 40 | 41 | ||
diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c index 50d09c289137..b7d4f82872b7 100644 --- a/drivers/usb/gadget/u_ether.c +++ b/drivers/usb/gadget/u_ether.c | |||
| @@ -48,8 +48,6 @@ | |||
| 48 | 48 | ||
| 49 | #define UETH__VERSION "29-May-2008" | 49 | #define UETH__VERSION "29-May-2008" |
| 50 | 50 | ||
| 51 | #define GETHER_NAPI_WEIGHT 32 | ||
| 52 | |||
| 53 | struct eth_dev { | 51 | struct eth_dev { |
| 54 | /* lock is held while accessing port_usb | 52 | /* lock is held while accessing port_usb |
| 55 | */ | 53 | */ |
| @@ -74,7 +72,6 @@ struct eth_dev { | |||
| 74 | struct sk_buff_head *list); | 72 | struct sk_buff_head *list); |
| 75 | 73 | ||
| 76 | struct work_struct work; | 74 | struct work_struct work; |
| 77 | struct napi_struct rx_napi; | ||
| 78 | 75 | ||
| 79 | unsigned long todo; | 76 | unsigned long todo; |
| 80 | #define WORK_RX_MEMORY 0 | 77 | #define WORK_RX_MEMORY 0 |
| @@ -256,16 +253,18 @@ enomem: | |||
| 256 | DBG(dev, "rx submit --> %d\n", retval); | 253 | DBG(dev, "rx submit --> %d\n", retval); |
| 257 | if (skb) | 254 | if (skb) |
| 258 | dev_kfree_skb_any(skb); | 255 | dev_kfree_skb_any(skb); |
| 256 | spin_lock_irqsave(&dev->req_lock, flags); | ||
| 257 | list_add(&req->list, &dev->rx_reqs); | ||
| 258 | spin_unlock_irqrestore(&dev->req_lock, flags); | ||
| 259 | } | 259 | } |
| 260 | return retval; | 260 | return retval; |
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | static void rx_complete(struct usb_ep *ep, struct usb_request *req) | 263 | static void rx_complete(struct usb_ep *ep, struct usb_request *req) |
| 264 | { | 264 | { |
| 265 | struct sk_buff *skb = req->context; | 265 | struct sk_buff *skb = req->context, *skb2; |
| 266 | struct eth_dev *dev = ep->driver_data; | 266 | struct eth_dev *dev = ep->driver_data; |
| 267 | int status = req->status; | 267 | int status = req->status; |
| 268 | bool rx_queue = 0; | ||
| 269 | 268 | ||
| 270 | switch (status) { | 269 | switch (status) { |
| 271 | 270 | ||
| @@ -289,8 +288,30 @@ static void rx_complete(struct usb_ep *ep, struct usb_request *req) | |||
| 289 | } else { | 288 | } else { |
| 290 | skb_queue_tail(&dev->rx_frames, skb); | 289 | skb_queue_tail(&dev->rx_frames, skb); |
| 291 | } | 290 | } |
| 292 | if (!status) | 291 | skb = NULL; |
| 293 | rx_queue = 1; | 292 | |
| 293 | skb2 = skb_dequeue(&dev->rx_frames); | ||
| 294 | while (skb2) { | ||
| 295 | if (status < 0 | ||
| 296 | || ETH_HLEN > skb2->len | ||
| 297 | || skb2->len > VLAN_ETH_FRAME_LEN) { | ||
| 298 | dev->net->stats.rx_errors++; | ||
| 299 | dev->net->stats.rx_length_errors++; | ||
| 300 | DBG(dev, "rx length %d\n", skb2->len); | ||
| 301 | dev_kfree_skb_any(skb2); | ||
| 302 | goto next_frame; | ||
| 303 | } | ||
| 304 | skb2->protocol = eth_type_trans(skb2, dev->net); | ||
| 305 | dev->net->stats.rx_packets++; | ||
| 306 | dev->net->stats.rx_bytes += skb2->len; | ||
| 307 | |||
| 308 | /* no buffer copies needed, unless hardware can't | ||
| 309 | * use skb buffers. | ||
| 310 | */ | ||
| 311 | status = netif_rx(skb2); | ||
| 312 | next_frame: | ||
| 313 | skb2 = skb_dequeue(&dev->rx_frames); | ||
| 314 | } | ||
| 294 | break; | 315 | break; |
| 295 | 316 | ||
| 296 | /* software-driven interface shutdown */ | 317 | /* software-driven interface shutdown */ |
| @@ -313,20 +334,22 @@ quiesce: | |||
| 313 | /* FALLTHROUGH */ | 334 | /* FALLTHROUGH */ |
| 314 | 335 | ||
| 315 | default: | 336 | default: |
| 316 | rx_queue = 1; | ||
| 317 | dev_kfree_skb_any(skb); | ||
| 318 | dev->net->stats.rx_errors++; | 337 | dev->net->stats.rx_errors++; |
| 319 | DBG(dev, "rx status %d\n", status); | 338 | DBG(dev, "rx status %d\n", status); |
| 320 | break; | 339 | break; |
| 321 | } | 340 | } |
| 322 | 341 | ||
| 342 | if (skb) | ||
| 343 | dev_kfree_skb_any(skb); | ||
| 344 | if (!netif_running(dev->net)) { | ||
| 323 | clean: | 345 | clean: |
| 324 | spin_lock(&dev->req_lock); | 346 | spin_lock(&dev->req_lock); |
| 325 | list_add(&req->list, &dev->rx_reqs); | 347 | list_add(&req->list, &dev->rx_reqs); |
| 326 | spin_unlock(&dev->req_lock); | 348 | spin_unlock(&dev->req_lock); |
| 327 | 349 | req = NULL; | |
| 328 | if (rx_queue && likely(napi_schedule_prep(&dev->rx_napi))) | 350 | } |
| 329 | __napi_schedule(&dev->rx_napi); | 351 | if (req) |
| 352 | rx_submit(dev, req, GFP_ATOMIC); | ||
| 330 | } | 353 | } |
| 331 | 354 | ||
| 332 | static int prealloc(struct list_head *list, struct usb_ep *ep, unsigned n) | 355 | static int prealloc(struct list_head *list, struct usb_ep *ep, unsigned n) |
| @@ -391,24 +414,16 @@ static void rx_fill(struct eth_dev *dev, gfp_t gfp_flags) | |||
| 391 | { | 414 | { |
| 392 | struct usb_request *req; | 415 | struct usb_request *req; |
| 393 | unsigned long flags; | 416 | unsigned long flags; |
| 394 | int rx_counts = 0; | ||
| 395 | 417 | ||
| 396 | /* fill unused rxq slots with some skb */ | 418 | /* fill unused rxq slots with some skb */ |
| 397 | spin_lock_irqsave(&dev->req_lock, flags); | 419 | spin_lock_irqsave(&dev->req_lock, flags); |
| 398 | while (!list_empty(&dev->rx_reqs)) { | 420 | while (!list_empty(&dev->rx_reqs)) { |
| 399 | |||
| 400 | if (++rx_counts > qlen(dev->gadget, dev->qmult)) | ||
| 401 | break; | ||
| 402 | |||
| 403 | req = container_of(dev->rx_reqs.next, | 421 | req = container_of(dev->rx_reqs.next, |
| 404 | struct usb_request, list); | 422 | struct usb_request, list); |
| 405 | list_del_init(&req->list); | 423 | list_del_init(&req->list); |
| 406 | spin_unlock_irqrestore(&dev->req_lock, flags); | 424 | spin_unlock_irqrestore(&dev->req_lock, flags); |
| 407 | 425 | ||
| 408 | if (rx_submit(dev, req, gfp_flags) < 0) { | 426 | if (rx_submit(dev, req, gfp_flags) < 0) { |
| 409 | spin_lock_irqsave(&dev->req_lock, flags); | ||
| 410 | list_add(&req->list, &dev->rx_reqs); | ||
| 411 | spin_unlock_irqrestore(&dev->req_lock, flags); | ||
| 412 | defer_kevent(dev, WORK_RX_MEMORY); | 427 | defer_kevent(dev, WORK_RX_MEMORY); |
| 413 | return; | 428 | return; |
| 414 | } | 429 | } |
| @@ -418,41 +433,6 @@ static void rx_fill(struct eth_dev *dev, gfp_t gfp_flags) | |||
| 418 | spin_unlock_irqrestore(&dev->req_lock, flags); | 433 | spin_unlock_irqrestore(&dev->req_lock, flags); |
| 419 | } | 434 | } |
| 420 | 435 | ||
| 421 | static int gether_poll(struct napi_struct *napi, int budget) | ||
| 422 | { | ||
| 423 | struct eth_dev *dev = container_of(napi, struct eth_dev, rx_napi); | ||
| 424 | struct sk_buff *skb; | ||
| 425 | unsigned int work_done = 0; | ||
| 426 | int status = 0; | ||
| 427 | |||
| 428 | while ((skb = skb_dequeue(&dev->rx_frames))) { | ||
| 429 | if (status < 0 | ||
| 430 | || ETH_HLEN > skb->len | ||
| 431 | || skb->len > VLAN_ETH_FRAME_LEN) { | ||
| 432 | dev->net->stats.rx_errors++; | ||
| 433 | dev->net->stats.rx_length_errors++; | ||
| 434 | DBG(dev, "rx length %d\n", skb->len); | ||
| 435 | dev_kfree_skb_any(skb); | ||
| 436 | continue; | ||
| 437 | } | ||
| 438 | skb->protocol = eth_type_trans(skb, dev->net); | ||
| 439 | dev->net->stats.rx_packets++; | ||
| 440 | dev->net->stats.rx_bytes += skb->len; | ||
| 441 | |||
| 442 | status = netif_rx_ni(skb); | ||
| 443 | } | ||
| 444 | |||
| 445 | if (netif_running(dev->net)) { | ||
| 446 | rx_fill(dev, GFP_KERNEL); | ||
| 447 | work_done++; | ||
| 448 | } | ||
| 449 | |||
| 450 | if (work_done < budget) | ||
| 451 | napi_complete(&dev->rx_napi); | ||
| 452 | |||
| 453 | return work_done; | ||
| 454 | } | ||
| 455 | |||
| 456 | static void eth_work(struct work_struct *work) | 436 | static void eth_work(struct work_struct *work) |
| 457 | { | 437 | { |
| 458 | struct eth_dev *dev = container_of(work, struct eth_dev, work); | 438 | struct eth_dev *dev = container_of(work, struct eth_dev, work); |
| @@ -645,7 +625,6 @@ static void eth_start(struct eth_dev *dev, gfp_t gfp_flags) | |||
| 645 | /* and open the tx floodgates */ | 625 | /* and open the tx floodgates */ |
| 646 | atomic_set(&dev->tx_qlen, 0); | 626 | atomic_set(&dev->tx_qlen, 0); |
| 647 | netif_wake_queue(dev->net); | 627 | netif_wake_queue(dev->net); |
| 648 | napi_enable(&dev->rx_napi); | ||
| 649 | } | 628 | } |
| 650 | 629 | ||
| 651 | static int eth_open(struct net_device *net) | 630 | static int eth_open(struct net_device *net) |
| @@ -672,7 +651,6 @@ static int eth_stop(struct net_device *net) | |||
| 672 | unsigned long flags; | 651 | unsigned long flags; |
| 673 | 652 | ||
| 674 | VDBG(dev, "%s\n", __func__); | 653 | VDBG(dev, "%s\n", __func__); |
| 675 | napi_disable(&dev->rx_napi); | ||
| 676 | netif_stop_queue(net); | 654 | netif_stop_queue(net); |
| 677 | 655 | ||
| 678 | DBG(dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n", | 656 | DBG(dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld\n", |
| @@ -790,7 +768,6 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g, | |||
| 790 | return ERR_PTR(-ENOMEM); | 768 | return ERR_PTR(-ENOMEM); |
| 791 | 769 | ||
| 792 | dev = netdev_priv(net); | 770 | dev = netdev_priv(net); |
| 793 | netif_napi_add(net, &dev->rx_napi, gether_poll, GETHER_NAPI_WEIGHT); | ||
| 794 | spin_lock_init(&dev->lock); | 771 | spin_lock_init(&dev->lock); |
| 795 | spin_lock_init(&dev->req_lock); | 772 | spin_lock_init(&dev->req_lock); |
| 796 | INIT_WORK(&dev->work, eth_work); | 773 | INIT_WORK(&dev->work, eth_work); |
| @@ -853,7 +830,6 @@ struct net_device *gether_setup_name_default(const char *netname) | |||
| 853 | return ERR_PTR(-ENOMEM); | 830 | return ERR_PTR(-ENOMEM); |
| 854 | 831 | ||
| 855 | dev = netdev_priv(net); | 832 | dev = netdev_priv(net); |
| 856 | netif_napi_add(net, &dev->rx_napi, gether_poll, GETHER_NAPI_WEIGHT); | ||
| 857 | spin_lock_init(&dev->lock); | 833 | spin_lock_init(&dev->lock); |
| 858 | spin_lock_init(&dev->req_lock); | 834 | spin_lock_init(&dev->req_lock); |
| 859 | INIT_WORK(&dev->work, eth_work); | 835 | INIT_WORK(&dev->work, eth_work); |
| @@ -1137,7 +1113,6 @@ void gether_disconnect(struct gether *link) | |||
| 1137 | { | 1113 | { |
| 1138 | struct eth_dev *dev = link->ioport; | 1114 | struct eth_dev *dev = link->ioport; |
| 1139 | struct usb_request *req; | 1115 | struct usb_request *req; |
| 1140 | struct sk_buff *skb; | ||
| 1141 | 1116 | ||
| 1142 | WARN_ON(!dev); | 1117 | WARN_ON(!dev); |
| 1143 | if (!dev) | 1118 | if (!dev) |
| @@ -1164,12 +1139,6 @@ void gether_disconnect(struct gether *link) | |||
| 1164 | spin_lock(&dev->req_lock); | 1139 | spin_lock(&dev->req_lock); |
| 1165 | } | 1140 | } |
| 1166 | spin_unlock(&dev->req_lock); | 1141 | spin_unlock(&dev->req_lock); |
| 1167 | |||
| 1168 | spin_lock(&dev->rx_frames.lock); | ||
| 1169 | while ((skb = __skb_dequeue(&dev->rx_frames))) | ||
| 1170 | dev_kfree_skb_any(skb); | ||
| 1171 | spin_unlock(&dev->rx_frames.lock); | ||
| 1172 | |||
| 1173 | link->in_ep->driver_data = NULL; | 1142 | link->in_ep->driver_data = NULL; |
| 1174 | link->in_ep->desc = NULL; | 1143 | link->in_ep->desc = NULL; |
| 1175 | 1144 | ||
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index 9f170c53e3d9..134f354ede62 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c | |||
| @@ -300,7 +300,7 @@ static int __init zero_bind(struct usb_composite_dev *cdev) | |||
| 300 | ss_opts->isoc_interval = gzero_options.isoc_interval; | 300 | ss_opts->isoc_interval = gzero_options.isoc_interval; |
| 301 | ss_opts->isoc_maxpacket = gzero_options.isoc_maxpacket; | 301 | ss_opts->isoc_maxpacket = gzero_options.isoc_maxpacket; |
| 302 | ss_opts->isoc_mult = gzero_options.isoc_mult; | 302 | ss_opts->isoc_mult = gzero_options.isoc_mult; |
| 303 | ss_opts->isoc_maxburst = gzero_options.isoc_maxpacket; | 303 | ss_opts->isoc_maxburst = gzero_options.isoc_maxburst; |
| 304 | ss_opts->bulk_buflen = gzero_options.bulk_buflen; | 304 | ss_opts->bulk_buflen = gzero_options.bulk_buflen; |
| 305 | 305 | ||
| 306 | func_ss = usb_get_function(func_inst_ss); | 306 | func_ss = usb_get_function(func_inst_ss); |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 47390e369cd4..35d447780707 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -134,6 +134,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
| 134 | */ | 134 | */ |
| 135 | if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP) | 135 | if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP) |
| 136 | xhci->quirks |= XHCI_SPURIOUS_WAKEUP; | 136 | xhci->quirks |= XHCI_SPURIOUS_WAKEUP; |
| 137 | |||
| 138 | xhci->quirks |= XHCI_SPURIOUS_REBOOT; | ||
| 137 | } | 139 | } |
| 138 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && | 140 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && |
| 139 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { | 141 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { |
| @@ -143,9 +145,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
| 143 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; | 145 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; |
| 144 | } | 146 | } |
| 145 | if (pdev->vendor == PCI_VENDOR_ID_RENESAS && | 147 | if (pdev->vendor == PCI_VENDOR_ID_RENESAS && |
| 146 | pdev->device == 0x0015 && | 148 | pdev->device == 0x0015) |
| 147 | pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG && | ||
| 148 | pdev->subsystem_device == 0xc0cd) | ||
| 149 | xhci->quirks |= XHCI_RESET_ON_RESUME; | 149 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
| 150 | if (pdev->vendor == PCI_VENDOR_ID_VIA) | 150 | if (pdev->vendor == PCI_VENDOR_ID_VIA) |
| 151 | xhci->quirks |= XHCI_RESET_ON_RESUME; | 151 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 5f926bea5ab1..7a0e3c720c00 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -550,6 +550,7 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
| 550 | struct xhci_ring *ep_ring; | 550 | struct xhci_ring *ep_ring; |
| 551 | struct xhci_generic_trb *trb; | 551 | struct xhci_generic_trb *trb; |
| 552 | dma_addr_t addr; | 552 | dma_addr_t addr; |
| 553 | u64 hw_dequeue; | ||
| 553 | 554 | ||
| 554 | ep_ring = xhci_triad_to_transfer_ring(xhci, slot_id, | 555 | ep_ring = xhci_triad_to_transfer_ring(xhci, slot_id, |
| 555 | ep_index, stream_id); | 556 | ep_index, stream_id); |
| @@ -559,16 +560,6 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
| 559 | stream_id); | 560 | stream_id); |
| 560 | return; | 561 | return; |
| 561 | } | 562 | } |
| 562 | state->new_cycle_state = 0; | ||
| 563 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | ||
| 564 | "Finding segment containing stopped TRB."); | ||
| 565 | state->new_deq_seg = find_trb_seg(cur_td->start_seg, | ||
| 566 | dev->eps[ep_index].stopped_trb, | ||
| 567 | &state->new_cycle_state); | ||
| 568 | if (!state->new_deq_seg) { | ||
| 569 | WARN_ON(1); | ||
| 570 | return; | ||
| 571 | } | ||
| 572 | 563 | ||
| 573 | /* Dig out the cycle state saved by the xHC during the stop ep cmd */ | 564 | /* Dig out the cycle state saved by the xHC during the stop ep cmd */ |
| 574 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 565 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
| @@ -577,46 +568,57 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
| 577 | if (ep->ep_state & EP_HAS_STREAMS) { | 568 | if (ep->ep_state & EP_HAS_STREAMS) { |
| 578 | struct xhci_stream_ctx *ctx = | 569 | struct xhci_stream_ctx *ctx = |
| 579 | &ep->stream_info->stream_ctx_array[stream_id]; | 570 | &ep->stream_info->stream_ctx_array[stream_id]; |
| 580 | state->new_cycle_state = 0x1 & le64_to_cpu(ctx->stream_ring); | 571 | hw_dequeue = le64_to_cpu(ctx->stream_ring); |
| 581 | } else { | 572 | } else { |
| 582 | struct xhci_ep_ctx *ep_ctx | 573 | struct xhci_ep_ctx *ep_ctx |
| 583 | = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); | 574 | = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); |
| 584 | state->new_cycle_state = 0x1 & le64_to_cpu(ep_ctx->deq); | 575 | hw_dequeue = le64_to_cpu(ep_ctx->deq); |
| 585 | } | 576 | } |
| 586 | 577 | ||
| 578 | /* Find virtual address and segment of hardware dequeue pointer */ | ||
| 579 | state->new_deq_seg = ep_ring->deq_seg; | ||
| 580 | state->new_deq_ptr = ep_ring->dequeue; | ||
| 581 | while (xhci_trb_virt_to_dma(state->new_deq_seg, state->new_deq_ptr) | ||
| 582 | != (dma_addr_t)(hw_dequeue & ~0xf)) { | ||
| 583 | next_trb(xhci, ep_ring, &state->new_deq_seg, | ||
| 584 | &state->new_deq_ptr); | ||
| 585 | if (state->new_deq_ptr == ep_ring->dequeue) { | ||
| 586 | WARN_ON(1); | ||
| 587 | return; | ||
| 588 | } | ||
| 589 | } | ||
| 590 | /* | ||
| 591 | * Find cycle state for last_trb, starting at old cycle state of | ||
| 592 | * hw_dequeue. If there is only one segment ring, find_trb_seg() will | ||
| 593 | * return immediately and cannot toggle the cycle state if this search | ||
| 594 | * wraps around, so add one more toggle manually in that case. | ||
| 595 | */ | ||
| 596 | state->new_cycle_state = hw_dequeue & 0x1; | ||
| 597 | if (ep_ring->first_seg == ep_ring->first_seg->next && | ||
| 598 | cur_td->last_trb < state->new_deq_ptr) | ||
| 599 | state->new_cycle_state ^= 0x1; | ||
| 600 | |||
| 587 | state->new_deq_ptr = cur_td->last_trb; | 601 | state->new_deq_ptr = cur_td->last_trb; |
| 588 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 602 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
| 589 | "Finding segment containing last TRB in TD."); | 603 | "Finding segment containing last TRB in TD."); |
| 590 | state->new_deq_seg = find_trb_seg(state->new_deq_seg, | 604 | state->new_deq_seg = find_trb_seg(state->new_deq_seg, |
| 591 | state->new_deq_ptr, | 605 | state->new_deq_ptr, &state->new_cycle_state); |
| 592 | &state->new_cycle_state); | ||
| 593 | if (!state->new_deq_seg) { | 606 | if (!state->new_deq_seg) { |
| 594 | WARN_ON(1); | 607 | WARN_ON(1); |
| 595 | return; | 608 | return; |
| 596 | } | 609 | } |
| 597 | 610 | ||
| 611 | /* Increment to find next TRB after last_trb. Cycle if appropriate. */ | ||
| 598 | trb = &state->new_deq_ptr->generic; | 612 | trb = &state->new_deq_ptr->generic; |
| 599 | if (TRB_TYPE_LINK_LE32(trb->field[3]) && | 613 | if (TRB_TYPE_LINK_LE32(trb->field[3]) && |
| 600 | (trb->field[3] & cpu_to_le32(LINK_TOGGLE))) | 614 | (trb->field[3] & cpu_to_le32(LINK_TOGGLE))) |
| 601 | state->new_cycle_state ^= 0x1; | 615 | state->new_cycle_state ^= 0x1; |
| 602 | next_trb(xhci, ep_ring, &state->new_deq_seg, &state->new_deq_ptr); | 616 | next_trb(xhci, ep_ring, &state->new_deq_seg, &state->new_deq_ptr); |
| 603 | 617 | ||
| 604 | /* | 618 | /* Don't update the ring cycle state for the producer (us). */ |
| 605 | * If there is only one segment in a ring, find_trb_seg()'s while loop | ||
| 606 | * will not run, and it will return before it has a chance to see if it | ||
| 607 | * needs to toggle the cycle bit. It can't tell if the stalled transfer | ||
| 608 | * ended just before the link TRB on a one-segment ring, or if the TD | ||
| 609 | * wrapped around the top of the ring, because it doesn't have the TD in | ||
| 610 | * question. Look for the one-segment case where stalled TRB's address | ||
| 611 | * is greater than the new dequeue pointer address. | ||
| 612 | */ | ||
| 613 | if (ep_ring->first_seg == ep_ring->first_seg->next && | ||
| 614 | state->new_deq_ptr < dev->eps[ep_index].stopped_trb) | ||
| 615 | state->new_cycle_state ^= 0x1; | ||
| 616 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 619 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
| 617 | "Cycle state = 0x%x", state->new_cycle_state); | 620 | "Cycle state = 0x%x", state->new_cycle_state); |
| 618 | 621 | ||
| 619 | /* Don't update the ring cycle state for the producer (us). */ | ||
| 620 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 622 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
| 621 | "New dequeue segment = %p (virtual)", | 623 | "New dequeue segment = %p (virtual)", |
| 622 | state->new_deq_seg); | 624 | state->new_deq_seg); |
| @@ -799,7 +801,6 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id, | |||
| 799 | if (list_empty(&ep->cancelled_td_list)) { | 801 | if (list_empty(&ep->cancelled_td_list)) { |
| 800 | xhci_stop_watchdog_timer_in_irq(xhci, ep); | 802 | xhci_stop_watchdog_timer_in_irq(xhci, ep); |
| 801 | ep->stopped_td = NULL; | 803 | ep->stopped_td = NULL; |
| 802 | ep->stopped_trb = NULL; | ||
| 803 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); | 804 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); |
| 804 | return; | 805 | return; |
| 805 | } | 806 | } |
| @@ -867,11 +868,9 @@ remove_finished_td: | |||
| 867 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); | 868 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); |
| 868 | } | 869 | } |
| 869 | 870 | ||
| 870 | /* Clear stopped_td and stopped_trb if endpoint is not halted */ | 871 | /* Clear stopped_td if endpoint is not halted */ |
| 871 | if (!(ep->ep_state & EP_HALTED)) { | 872 | if (!(ep->ep_state & EP_HALTED)) |
| 872 | ep->stopped_td = NULL; | 873 | ep->stopped_td = NULL; |
| 873 | ep->stopped_trb = NULL; | ||
| 874 | } | ||
| 875 | 874 | ||
| 876 | /* | 875 | /* |
| 877 | * Drop the lock and complete the URBs in the cancelled TD list. | 876 | * Drop the lock and complete the URBs in the cancelled TD list. |
| @@ -1941,14 +1940,12 @@ static void xhci_cleanup_halted_endpoint(struct xhci_hcd *xhci, | |||
| 1941 | struct xhci_virt_ep *ep = &xhci->devs[slot_id]->eps[ep_index]; | 1940 | struct xhci_virt_ep *ep = &xhci->devs[slot_id]->eps[ep_index]; |
| 1942 | ep->ep_state |= EP_HALTED; | 1941 | ep->ep_state |= EP_HALTED; |
| 1943 | ep->stopped_td = td; | 1942 | ep->stopped_td = td; |
| 1944 | ep->stopped_trb = event_trb; | ||
| 1945 | ep->stopped_stream = stream_id; | 1943 | ep->stopped_stream = stream_id; |
| 1946 | 1944 | ||
| 1947 | xhci_queue_reset_ep(xhci, slot_id, ep_index); | 1945 | xhci_queue_reset_ep(xhci, slot_id, ep_index); |
| 1948 | xhci_cleanup_stalled_ring(xhci, td->urb->dev, ep_index); | 1946 | xhci_cleanup_stalled_ring(xhci, td->urb->dev, ep_index); |
| 1949 | 1947 | ||
| 1950 | ep->stopped_td = NULL; | 1948 | ep->stopped_td = NULL; |
| 1951 | ep->stopped_trb = NULL; | ||
| 1952 | ep->stopped_stream = 0; | 1949 | ep->stopped_stream = 0; |
| 1953 | 1950 | ||
| 1954 | xhci_ring_cmd_db(xhci); | 1951 | xhci_ring_cmd_db(xhci); |
| @@ -2030,7 +2027,6 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 2030 | * the ring dequeue pointer or take this TD off any lists yet. | 2027 | * the ring dequeue pointer or take this TD off any lists yet. |
| 2031 | */ | 2028 | */ |
| 2032 | ep->stopped_td = td; | 2029 | ep->stopped_td = td; |
| 2033 | ep->stopped_trb = event_trb; | ||
| 2034 | return 0; | 2030 | return 0; |
| 2035 | } else { | 2031 | } else { |
| 2036 | if (trb_comp_code == COMP_STALL) { | 2032 | if (trb_comp_code == COMP_STALL) { |
| @@ -2042,7 +2038,6 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td, | |||
| 2042 | * USB class driver clear the stall later. | 2038 | * USB class driver clear the stall later. |
| 2043 | */ | 2039 | */ |
| 2044 | ep->stopped_td = td; | 2040 | ep->stopped_td = td; |
| 2045 | ep->stopped_trb = event_trb; | ||
| 2046 | ep->stopped_stream = ep_ring->stream_id; | 2041 | ep->stopped_stream = ep_ring->stream_id; |
| 2047 | } else if (xhci_requires_manual_halt_cleanup(xhci, | 2042 | } else if (xhci_requires_manual_halt_cleanup(xhci, |
| 2048 | ep_ctx, trb_comp_code)) { | 2043 | ep_ctx, trb_comp_code)) { |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 8fe4e124ddd4..300836972faa 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -408,16 +408,16 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) | |||
| 408 | 408 | ||
| 409 | #else | 409 | #else |
| 410 | 410 | ||
| 411 | static int xhci_try_enable_msi(struct usb_hcd *hcd) | 411 | static inline int xhci_try_enable_msi(struct usb_hcd *hcd) |
| 412 | { | 412 | { |
| 413 | return 0; | 413 | return 0; |
| 414 | } | 414 | } |
| 415 | 415 | ||
| 416 | static void xhci_cleanup_msix(struct xhci_hcd *xhci) | 416 | static inline void xhci_cleanup_msix(struct xhci_hcd *xhci) |
| 417 | { | 417 | { |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | static void xhci_msix_sync_irqs(struct xhci_hcd *xhci) | 420 | static inline void xhci_msix_sync_irqs(struct xhci_hcd *xhci) |
| 421 | { | 421 | { |
| 422 | } | 422 | } |
| 423 | 423 | ||
| @@ -2954,7 +2954,6 @@ void xhci_endpoint_reset(struct usb_hcd *hcd, | |||
| 2954 | xhci_ring_cmd_db(xhci); | 2954 | xhci_ring_cmd_db(xhci); |
| 2955 | } | 2955 | } |
| 2956 | virt_ep->stopped_td = NULL; | 2956 | virt_ep->stopped_td = NULL; |
| 2957 | virt_ep->stopped_trb = NULL; | ||
| 2958 | virt_ep->stopped_stream = 0; | 2957 | virt_ep->stopped_stream = 0; |
| 2959 | spin_unlock_irqrestore(&xhci->lock, flags); | 2958 | spin_unlock_irqrestore(&xhci->lock, flags); |
| 2960 | 2959 | ||
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index d280e9213d08..4746816aed3e 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -865,8 +865,6 @@ struct xhci_virt_ep { | |||
| 865 | #define EP_GETTING_NO_STREAMS (1 << 5) | 865 | #define EP_GETTING_NO_STREAMS (1 << 5) |
| 866 | /* ---- Related to URB cancellation ---- */ | 866 | /* ---- Related to URB cancellation ---- */ |
| 867 | struct list_head cancelled_td_list; | 867 | struct list_head cancelled_td_list; |
| 868 | /* The TRB that was last reported in a stopped endpoint ring */ | ||
| 869 | union xhci_trb *stopped_trb; | ||
| 870 | struct xhci_td *stopped_td; | 868 | struct xhci_td *stopped_td; |
| 871 | unsigned int stopped_stream; | 869 | unsigned int stopped_stream; |
| 872 | /* Watchdog timer for stop endpoint command to cancel URBs */ | 870 | /* Watchdog timer for stop endpoint command to cancel URBs */ |
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c index 3372ded5def7..e2fd263585de 100644 --- a/drivers/usb/musb/musb_dsps.c +++ b/drivers/usb/musb/musb_dsps.c | |||
| @@ -470,8 +470,9 @@ static int dsps_musb_exit(struct musb *musb) | |||
| 470 | struct dsps_glue *glue = dev_get_drvdata(dev->parent); | 470 | struct dsps_glue *glue = dev_get_drvdata(dev->parent); |
| 471 | 471 | ||
| 472 | del_timer_sync(&glue->timer); | 472 | del_timer_sync(&glue->timer); |
| 473 | |||
| 474 | usb_phy_shutdown(musb->xceiv); | 473 | usb_phy_shutdown(musb->xceiv); |
| 474 | debugfs_remove_recursive(glue->dbgfs_root); | ||
| 475 | |||
| 475 | return 0; | 476 | return 0; |
| 476 | } | 477 | } |
| 477 | 478 | ||
| @@ -708,8 +709,6 @@ static int dsps_remove(struct platform_device *pdev) | |||
| 708 | pm_runtime_put(&pdev->dev); | 709 | pm_runtime_put(&pdev->dev); |
| 709 | pm_runtime_disable(&pdev->dev); | 710 | pm_runtime_disable(&pdev->dev); |
| 710 | 711 | ||
| 711 | debugfs_remove_recursive(glue->dbgfs_root); | ||
| 712 | |||
| 713 | return 0; | 712 | return 0; |
| 714 | } | 713 | } |
| 715 | 714 | ||
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c index d341c149a2f9..d369bf1f3936 100644 --- a/drivers/usb/musb/omap2430.c +++ b/drivers/usb/musb/omap2430.c | |||
| @@ -316,7 +316,13 @@ static void omap_musb_mailbox_work(struct work_struct *mailbox_work) | |||
| 316 | { | 316 | { |
| 317 | struct omap2430_glue *glue = container_of(mailbox_work, | 317 | struct omap2430_glue *glue = container_of(mailbox_work, |
| 318 | struct omap2430_glue, omap_musb_mailbox_work); | 318 | struct omap2430_glue, omap_musb_mailbox_work); |
| 319 | struct musb *musb = glue_to_musb(glue); | ||
| 320 | struct device *dev = musb->controller; | ||
| 321 | |||
| 322 | pm_runtime_get_sync(dev); | ||
| 319 | omap_musb_set_mailbox(glue); | 323 | omap_musb_set_mailbox(glue); |
| 324 | pm_runtime_mark_last_busy(dev); | ||
| 325 | pm_runtime_put_autosuspend(dev); | ||
| 320 | } | 326 | } |
| 321 | 327 | ||
| 322 | static irqreturn_t omap2430_musb_interrupt(int irq, void *__hci) | 328 | static irqreturn_t omap2430_musb_interrupt(int irq, void *__hci) |
| @@ -416,6 +422,7 @@ static int omap2430_musb_init(struct musb *musb) | |||
| 416 | omap_musb_set_mailbox(glue); | 422 | omap_musb_set_mailbox(glue); |
| 417 | 423 | ||
| 418 | phy_init(musb->phy); | 424 | phy_init(musb->phy); |
| 425 | phy_power_on(musb->phy); | ||
| 419 | 426 | ||
| 420 | pm_runtime_put_noidle(musb->controller); | 427 | pm_runtime_put_noidle(musb->controller); |
| 421 | return 0; | 428 | return 0; |
| @@ -478,6 +485,7 @@ static int omap2430_musb_exit(struct musb *musb) | |||
| 478 | del_timer_sync(&musb_idle_timer); | 485 | del_timer_sync(&musb_idle_timer); |
| 479 | 486 | ||
| 480 | omap2430_low_level_exit(musb); | 487 | omap2430_low_level_exit(musb); |
| 488 | phy_power_off(musb->phy); | ||
| 481 | phy_exit(musb->phy); | 489 | phy_exit(musb->phy); |
| 482 | 490 | ||
| 483 | return 0; | 491 | return 0; |
diff --git a/drivers/usb/phy/phy-am335x-control.c b/drivers/usb/phy/phy-am335x-control.c index d75196ad5f2f..35b6083b7999 100644 --- a/drivers/usb/phy/phy-am335x-control.c +++ b/drivers/usb/phy/phy-am335x-control.c | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | #include <linux/err.h> | 3 | #include <linux/err.h> |
| 4 | #include <linux/of.h> | 4 | #include <linux/of.h> |
| 5 | #include <linux/io.h> | 5 | #include <linux/io.h> |
| 6 | #include <linux/delay.h> | ||
| 6 | #include "am35x-phy-control.h" | 7 | #include "am35x-phy-control.h" |
| 7 | 8 | ||
| 8 | struct am335x_control_usb { | 9 | struct am335x_control_usb { |
| @@ -86,6 +87,14 @@ static void am335x_phy_power(struct phy_control *phy_ctrl, u32 id, bool on) | |||
| 86 | } | 87 | } |
| 87 | 88 | ||
| 88 | writel(val, usb_ctrl->phy_reg + reg); | 89 | writel(val, usb_ctrl->phy_reg + reg); |
| 90 | |||
| 91 | /* | ||
| 92 | * Give the PHY ~1ms to complete the power up operation. | ||
| 93 | * Tests have shown unstable behaviour if other USB PHY related | ||
| 94 | * registers are written too shortly after such a transition. | ||
| 95 | */ | ||
| 96 | if (on) | ||
| 97 | mdelay(1); | ||
| 89 | } | 98 | } |
| 90 | 99 | ||
| 91 | static const struct phy_control ctrl_am335x = { | 100 | static const struct phy_control ctrl_am335x = { |
diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c index 8afa813d690b..36b6bce33b20 100644 --- a/drivers/usb/phy/phy.c +++ b/drivers/usb/phy/phy.c | |||
| @@ -132,6 +132,9 @@ struct usb_phy *usb_get_phy(enum usb_phy_type type) | |||
| 132 | if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) { | 132 | if (IS_ERR(phy) || !try_module_get(phy->dev->driver->owner)) { |
| 133 | pr_debug("PHY: unable to find transceiver of type %s\n", | 133 | pr_debug("PHY: unable to find transceiver of type %s\n", |
| 134 | usb_phy_type_string(type)); | 134 | usb_phy_type_string(type)); |
| 135 | if (!IS_ERR(phy)) | ||
| 136 | phy = ERR_PTR(-ENODEV); | ||
| 137 | |||
| 135 | goto err0; | 138 | goto err0; |
| 136 | } | 139 | } |
| 137 | 140 | ||
diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index a2db5be9c305..df90dae53eb9 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/spinlock.h> | 28 | #include <linux/spinlock.h> |
| 29 | #include <linux/mutex.h> | 29 | #include <linux/mutex.h> |
| 30 | #include <linux/serial.h> | 30 | #include <linux/serial.h> |
| 31 | #include <linux/swab.h> | ||
| 31 | #include <linux/kfifo.h> | 32 | #include <linux/kfifo.h> |
| 32 | #include <linux/ioctl.h> | 33 | #include <linux/ioctl.h> |
| 33 | #include <linux/firmware.h> | 34 | #include <linux/firmware.h> |
| @@ -280,7 +281,7 @@ static int read_download_mem(struct usb_device *dev, int start_address, | |||
| 280 | { | 281 | { |
| 281 | int status = 0; | 282 | int status = 0; |
| 282 | __u8 read_length; | 283 | __u8 read_length; |
| 283 | __be16 be_start_address; | 284 | u16 be_start_address; |
| 284 | 285 | ||
| 285 | dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, length); | 286 | dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, length); |
| 286 | 287 | ||
| @@ -296,10 +297,14 @@ static int read_download_mem(struct usb_device *dev, int start_address, | |||
| 296 | if (read_length > 1) { | 297 | if (read_length > 1) { |
| 297 | dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, read_length); | 298 | dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, read_length); |
| 298 | } | 299 | } |
| 299 | be_start_address = cpu_to_be16(start_address); | 300 | /* |
| 301 | * NOTE: Must use swab as wIndex is sent in little-endian | ||
| 302 | * byte order regardless of host byte order. | ||
| 303 | */ | ||
| 304 | be_start_address = swab16((u16)start_address); | ||
| 300 | status = ti_vread_sync(dev, UMPC_MEMORY_READ, | 305 | status = ti_vread_sync(dev, UMPC_MEMORY_READ, |
| 301 | (__u16)address_type, | 306 | (__u16)address_type, |
| 302 | (__force __u16)be_start_address, | 307 | be_start_address, |
| 303 | buffer, read_length); | 308 | buffer, read_length); |
| 304 | 309 | ||
| 305 | if (status) { | 310 | if (status) { |
| @@ -394,7 +399,7 @@ static int write_i2c_mem(struct edgeport_serial *serial, | |||
| 394 | struct device *dev = &serial->serial->dev->dev; | 399 | struct device *dev = &serial->serial->dev->dev; |
| 395 | int status = 0; | 400 | int status = 0; |
| 396 | int write_length; | 401 | int write_length; |
| 397 | __be16 be_start_address; | 402 | u16 be_start_address; |
| 398 | 403 | ||
| 399 | /* We can only send a maximum of 1 aligned byte page at a time */ | 404 | /* We can only send a maximum of 1 aligned byte page at a time */ |
| 400 | 405 | ||
| @@ -409,11 +414,16 @@ static int write_i2c_mem(struct edgeport_serial *serial, | |||
| 409 | __func__, start_address, write_length); | 414 | __func__, start_address, write_length); |
| 410 | usb_serial_debug_data(dev, __func__, write_length, buffer); | 415 | usb_serial_debug_data(dev, __func__, write_length, buffer); |
| 411 | 416 | ||
| 412 | /* Write first page */ | 417 | /* |
| 413 | be_start_address = cpu_to_be16(start_address); | 418 | * Write first page. |
| 419 | * | ||
| 420 | * NOTE: Must use swab as wIndex is sent in little-endian byte order | ||
| 421 | * regardless of host byte order. | ||
| 422 | */ | ||
| 423 | be_start_address = swab16((u16)start_address); | ||
| 414 | status = ti_vsend_sync(serial->serial->dev, | 424 | status = ti_vsend_sync(serial->serial->dev, |
| 415 | UMPC_MEMORY_WRITE, (__u16)address_type, | 425 | UMPC_MEMORY_WRITE, (__u16)address_type, |
| 416 | (__force __u16)be_start_address, | 426 | be_start_address, |
| 417 | buffer, write_length); | 427 | buffer, write_length); |
| 418 | if (status) { | 428 | if (status) { |
| 419 | dev_dbg(dev, "%s - ERROR %d\n", __func__, status); | 429 | dev_dbg(dev, "%s - ERROR %d\n", __func__, status); |
| @@ -436,11 +446,16 @@ static int write_i2c_mem(struct edgeport_serial *serial, | |||
| 436 | __func__, start_address, write_length); | 446 | __func__, start_address, write_length); |
| 437 | usb_serial_debug_data(dev, __func__, write_length, buffer); | 447 | usb_serial_debug_data(dev, __func__, write_length, buffer); |
| 438 | 448 | ||
| 439 | /* Write next page */ | 449 | /* |
| 440 | be_start_address = cpu_to_be16(start_address); | 450 | * Write next page. |
| 451 | * | ||
| 452 | * NOTE: Must use swab as wIndex is sent in little-endian byte | ||
| 453 | * order regardless of host byte order. | ||
| 454 | */ | ||
| 455 | be_start_address = swab16((u16)start_address); | ||
| 441 | status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE, | 456 | status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE, |
| 442 | (__u16)address_type, | 457 | (__u16)address_type, |
| 443 | (__force __u16)be_start_address, | 458 | be_start_address, |
| 444 | buffer, write_length); | 459 | buffer, write_length); |
| 445 | if (status) { | 460 | if (status) { |
| 446 | dev_err(dev, "%s - ERROR %d\n", __func__, status); | 461 | dev_err(dev, "%s - ERROR %d\n", __func__, status); |
| @@ -585,8 +600,8 @@ static int get_descriptor_addr(struct edgeport_serial *serial, | |||
| 585 | if (rom_desc->Type == desc_type) | 600 | if (rom_desc->Type == desc_type) |
| 586 | return start_address; | 601 | return start_address; |
| 587 | 602 | ||
| 588 | start_address = start_address + sizeof(struct ti_i2c_desc) | 603 | start_address = start_address + sizeof(struct ti_i2c_desc) + |
| 589 | + rom_desc->Size; | 604 | le16_to_cpu(rom_desc->Size); |
| 590 | 605 | ||
| 591 | } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type); | 606 | } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type); |
| 592 | 607 | ||
| @@ -599,7 +614,7 @@ static int valid_csum(struct ti_i2c_desc *rom_desc, __u8 *buffer) | |||
| 599 | __u16 i; | 614 | __u16 i; |
| 600 | __u8 cs = 0; | 615 | __u8 cs = 0; |
| 601 | 616 | ||
| 602 | for (i = 0; i < rom_desc->Size; i++) | 617 | for (i = 0; i < le16_to_cpu(rom_desc->Size); i++) |
| 603 | cs = (__u8)(cs + buffer[i]); | 618 | cs = (__u8)(cs + buffer[i]); |
| 604 | 619 | ||
| 605 | if (cs != rom_desc->CheckSum) { | 620 | if (cs != rom_desc->CheckSum) { |
| @@ -650,7 +665,7 @@ static int check_i2c_image(struct edgeport_serial *serial) | |||
| 650 | break; | 665 | break; |
| 651 | 666 | ||
| 652 | if ((start_address + sizeof(struct ti_i2c_desc) + | 667 | if ((start_address + sizeof(struct ti_i2c_desc) + |
| 653 | rom_desc->Size) > TI_MAX_I2C_SIZE) { | 668 | le16_to_cpu(rom_desc->Size)) > TI_MAX_I2C_SIZE) { |
| 654 | status = -ENODEV; | 669 | status = -ENODEV; |
| 655 | dev_dbg(dev, "%s - structure too big, erroring out.\n", __func__); | 670 | dev_dbg(dev, "%s - structure too big, erroring out.\n", __func__); |
| 656 | break; | 671 | break; |
| @@ -665,7 +680,8 @@ static int check_i2c_image(struct edgeport_serial *serial) | |||
| 665 | /* Read the descriptor data */ | 680 | /* Read the descriptor data */ |
| 666 | status = read_rom(serial, start_address + | 681 | status = read_rom(serial, start_address + |
| 667 | sizeof(struct ti_i2c_desc), | 682 | sizeof(struct ti_i2c_desc), |
| 668 | rom_desc->Size, buffer); | 683 | le16_to_cpu(rom_desc->Size), |
| 684 | buffer); | ||
| 669 | if (status) | 685 | if (status) |
| 670 | break; | 686 | break; |
| 671 | 687 | ||
| @@ -674,7 +690,7 @@ static int check_i2c_image(struct edgeport_serial *serial) | |||
| 674 | break; | 690 | break; |
| 675 | } | 691 | } |
| 676 | start_address = start_address + sizeof(struct ti_i2c_desc) + | 692 | start_address = start_address + sizeof(struct ti_i2c_desc) + |
| 677 | rom_desc->Size; | 693 | le16_to_cpu(rom_desc->Size); |
| 678 | 694 | ||
| 679 | } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && | 695 | } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && |
| 680 | (start_address < TI_MAX_I2C_SIZE)); | 696 | (start_address < TI_MAX_I2C_SIZE)); |
| @@ -712,7 +728,7 @@ static int get_manuf_info(struct edgeport_serial *serial, __u8 *buffer) | |||
| 712 | 728 | ||
| 713 | /* Read the descriptor data */ | 729 | /* Read the descriptor data */ |
| 714 | status = read_rom(serial, start_address+sizeof(struct ti_i2c_desc), | 730 | status = read_rom(serial, start_address+sizeof(struct ti_i2c_desc), |
| 715 | rom_desc->Size, buffer); | 731 | le16_to_cpu(rom_desc->Size), buffer); |
| 716 | if (status) | 732 | if (status) |
| 717 | goto exit; | 733 | goto exit; |
| 718 | 734 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 367c7f08b27c..f213ee978516 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -234,8 +234,31 @@ static void option_instat_callback(struct urb *urb); | |||
| 234 | #define QUALCOMM_VENDOR_ID 0x05C6 | 234 | #define QUALCOMM_VENDOR_ID 0x05C6 |
| 235 | 235 | ||
| 236 | #define CMOTECH_VENDOR_ID 0x16d8 | 236 | #define CMOTECH_VENDOR_ID 0x16d8 |
| 237 | #define CMOTECH_PRODUCT_6008 0x6008 | 237 | #define CMOTECH_PRODUCT_6001 0x6001 |
| 238 | #define CMOTECH_PRODUCT_6280 0x6280 | 238 | #define CMOTECH_PRODUCT_CMU_300 0x6002 |
| 239 | #define CMOTECH_PRODUCT_6003 0x6003 | ||
| 240 | #define CMOTECH_PRODUCT_6004 0x6004 | ||
| 241 | #define CMOTECH_PRODUCT_6005 0x6005 | ||
| 242 | #define CMOTECH_PRODUCT_CGU_628A 0x6006 | ||
| 243 | #define CMOTECH_PRODUCT_CHE_628S 0x6007 | ||
| 244 | #define CMOTECH_PRODUCT_CMU_301 0x6008 | ||
| 245 | #define CMOTECH_PRODUCT_CHU_628 0x6280 | ||
| 246 | #define CMOTECH_PRODUCT_CHU_628S 0x6281 | ||
| 247 | #define CMOTECH_PRODUCT_CDU_680 0x6803 | ||
| 248 | #define CMOTECH_PRODUCT_CDU_685A 0x6804 | ||
| 249 | #define CMOTECH_PRODUCT_CHU_720S 0x7001 | ||
| 250 | #define CMOTECH_PRODUCT_7002 0x7002 | ||
| 251 | #define CMOTECH_PRODUCT_CHU_629K 0x7003 | ||
| 252 | #define CMOTECH_PRODUCT_7004 0x7004 | ||
| 253 | #define CMOTECH_PRODUCT_7005 0x7005 | ||
| 254 | #define CMOTECH_PRODUCT_CGU_629 0x7006 | ||
| 255 | #define CMOTECH_PRODUCT_CHU_629S 0x700a | ||
| 256 | #define CMOTECH_PRODUCT_CHU_720I 0x7211 | ||
| 257 | #define CMOTECH_PRODUCT_7212 0x7212 | ||
| 258 | #define CMOTECH_PRODUCT_7213 0x7213 | ||
| 259 | #define CMOTECH_PRODUCT_7251 0x7251 | ||
| 260 | #define CMOTECH_PRODUCT_7252 0x7252 | ||
| 261 | #define CMOTECH_PRODUCT_7253 0x7253 | ||
| 239 | 262 | ||
| 240 | #define TELIT_VENDOR_ID 0x1bc7 | 263 | #define TELIT_VENDOR_ID 0x1bc7 |
| 241 | #define TELIT_PRODUCT_UC864E 0x1003 | 264 | #define TELIT_PRODUCT_UC864E 0x1003 |
| @@ -287,6 +310,7 @@ static void option_instat_callback(struct urb *urb); | |||
| 287 | #define ALCATEL_PRODUCT_X060S_X200 0x0000 | 310 | #define ALCATEL_PRODUCT_X060S_X200 0x0000 |
| 288 | #define ALCATEL_PRODUCT_X220_X500D 0x0017 | 311 | #define ALCATEL_PRODUCT_X220_X500D 0x0017 |
| 289 | #define ALCATEL_PRODUCT_L100V 0x011e | 312 | #define ALCATEL_PRODUCT_L100V 0x011e |
| 313 | #define ALCATEL_PRODUCT_L800MA 0x0203 | ||
| 290 | 314 | ||
| 291 | #define PIRELLI_VENDOR_ID 0x1266 | 315 | #define PIRELLI_VENDOR_ID 0x1266 |
| 292 | #define PIRELLI_PRODUCT_C100_1 0x1002 | 316 | #define PIRELLI_PRODUCT_C100_1 0x1002 |
| @@ -349,6 +373,7 @@ static void option_instat_callback(struct urb *urb); | |||
| 349 | #define OLIVETTI_PRODUCT_OLICARD100 0xc000 | 373 | #define OLIVETTI_PRODUCT_OLICARD100 0xc000 |
| 350 | #define OLIVETTI_PRODUCT_OLICARD145 0xc003 | 374 | #define OLIVETTI_PRODUCT_OLICARD145 0xc003 |
| 351 | #define OLIVETTI_PRODUCT_OLICARD200 0xc005 | 375 | #define OLIVETTI_PRODUCT_OLICARD200 0xc005 |
| 376 | #define OLIVETTI_PRODUCT_OLICARD500 0xc00b | ||
| 352 | 377 | ||
| 353 | /* Celot products */ | 378 | /* Celot products */ |
| 354 | #define CELOT_VENDOR_ID 0x211f | 379 | #define CELOT_VENDOR_ID 0x211f |
| @@ -502,6 +527,10 @@ static const struct option_blacklist_info huawei_cdc12_blacklist = { | |||
| 502 | .reserved = BIT(1) | BIT(2), | 527 | .reserved = BIT(1) | BIT(2), |
| 503 | }; | 528 | }; |
| 504 | 529 | ||
| 530 | static const struct option_blacklist_info net_intf0_blacklist = { | ||
| 531 | .reserved = BIT(0), | ||
| 532 | }; | ||
| 533 | |||
| 505 | static const struct option_blacklist_info net_intf1_blacklist = { | 534 | static const struct option_blacklist_info net_intf1_blacklist = { |
| 506 | .reserved = BIT(1), | 535 | .reserved = BIT(1), |
| 507 | }; | 536 | }; |
| @@ -1035,8 +1064,47 @@ static const struct usb_device_id option_ids[] = { | |||
| 1035 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | 1064 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
| 1036 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ | 1065 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ |
| 1037 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | 1066 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ |
| 1038 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ | 1067 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, |
| 1039 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, | 1068 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, |
| 1069 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), | ||
| 1070 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
| 1071 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6004) }, | ||
| 1072 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6005) }, | ||
| 1073 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CGU_628A) }, | ||
| 1074 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHE_628S), | ||
| 1075 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
| 1076 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_301), | ||
| 1077 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
| 1078 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_628), | ||
| 1079 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
| 1080 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_628S) }, | ||
| 1081 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU_680) }, | ||
| 1082 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CDU_685A) }, | ||
| 1083 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_720S), | ||
| 1084 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
| 1085 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7002), | ||
| 1086 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
| 1087 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_629K), | ||
| 1088 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 1089 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7004), | ||
| 1090 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
| 1091 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7005) }, | ||
| 1092 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CGU_629), | ||
| 1093 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | ||
| 1094 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_629S), | ||
| 1095 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | ||
| 1096 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CHU_720I), | ||
| 1097 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
| 1098 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7212), | ||
| 1099 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
| 1100 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7213), | ||
| 1101 | .driver_info = (kernel_ulong_t)&net_intf0_blacklist }, | ||
| 1102 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7251), | ||
| 1103 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
| 1104 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7252), | ||
| 1105 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
| 1106 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_7253), | ||
| 1107 | .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, | ||
| 1040 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, | 1108 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, |
| 1041 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, | 1109 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864G) }, |
| 1042 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, | 1110 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_DUAL) }, |
| @@ -1500,6 +1568,8 @@ static const struct usb_device_id option_ids[] = { | |||
| 1500 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, | 1568 | .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, |
| 1501 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L100V), | 1569 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L100V), |
| 1502 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 1570 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 1571 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_L800MA), | ||
| 1572 | .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, | ||
| 1503 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, | 1573 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, |
| 1504 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, | 1574 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, |
| 1505 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), | 1575 | { USB_DEVICE(LONGCHEER_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14), |
| @@ -1545,6 +1615,9 @@ static const struct usb_device_id option_ids[] = { | |||
| 1545 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200), | 1615 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD200), |
| 1546 | .driver_info = (kernel_ulong_t)&net_intf6_blacklist | 1616 | .driver_info = (kernel_ulong_t)&net_intf6_blacklist |
| 1547 | }, | 1617 | }, |
| 1618 | { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD500), | ||
| 1619 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist | ||
| 1620 | }, | ||
| 1548 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ | 1621 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ |
| 1549 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ | 1622 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ |
| 1550 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, | 1623 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index 968a40201e5f..7ed681a714a5 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
| @@ -136,9 +136,18 @@ static const struct usb_device_id id_table[] = { | |||
| 136 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 0)}, /* Sierra Wireless MC7710 Device Management */ | 136 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 0)}, /* Sierra Wireless MC7710 Device Management */ |
| 137 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 2)}, /* Sierra Wireless MC7710 NMEA */ | 137 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 2)}, /* Sierra Wireless MC7710 NMEA */ |
| 138 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 3)}, /* Sierra Wireless MC7710 Modem */ | 138 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68a2, 3)}, /* Sierra Wireless MC7710 Modem */ |
| 139 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 0)}, /* Sierra Wireless MC73xx Device Management */ | ||
| 140 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 2)}, /* Sierra Wireless MC73xx NMEA */ | ||
| 141 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x68c0, 3)}, /* Sierra Wireless MC73xx Modem */ | ||
| 139 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)}, /* Sierra Wireless EM7700 Device Management */ | 142 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 0)}, /* Sierra Wireless EM7700 Device Management */ |
| 140 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)}, /* Sierra Wireless EM7700 NMEA */ | 143 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 2)}, /* Sierra Wireless EM7700 NMEA */ |
| 141 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)}, /* Sierra Wireless EM7700 Modem */ | 144 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901c, 3)}, /* Sierra Wireless EM7700 Modem */ |
| 145 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 0)}, /* Sierra Wireless EM7355 Device Management */ | ||
| 146 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 2)}, /* Sierra Wireless EM7355 NMEA */ | ||
| 147 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x901f, 3)}, /* Sierra Wireless EM7355 Modem */ | ||
| 148 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 0)}, /* Sierra Wireless MC7305/MC7355 Device Management */ | ||
| 149 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 2)}, /* Sierra Wireless MC7305/MC7355 NMEA */ | ||
| 150 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9041, 3)}, /* Sierra Wireless MC7305/MC7355 Modem */ | ||
| 142 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 0)}, /* Netgear AirCard 340U Device Management */ | 151 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 0)}, /* Netgear AirCard 340U Device Management */ |
| 143 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 2)}, /* Netgear AirCard 340U NMEA */ | 152 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 2)}, /* Netgear AirCard 340U NMEA */ |
| 144 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 3)}, /* Netgear AirCard 340U Modem */ | 153 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 3)}, /* Netgear AirCard 340U Modem */ |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 81fc0dfcfdcf..6d40d56378d7 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
| @@ -1347,10 +1347,12 @@ static int usb_serial_register(struct usb_serial_driver *driver) | |||
| 1347 | static void usb_serial_deregister(struct usb_serial_driver *device) | 1347 | static void usb_serial_deregister(struct usb_serial_driver *device) |
| 1348 | { | 1348 | { |
| 1349 | pr_info("USB Serial deregistering driver %s\n", device->description); | 1349 | pr_info("USB Serial deregistering driver %s\n", device->description); |
| 1350 | |||
| 1350 | mutex_lock(&table_lock); | 1351 | mutex_lock(&table_lock); |
| 1351 | list_del(&device->driver_list); | 1352 | list_del(&device->driver_list); |
| 1352 | usb_serial_bus_deregister(device); | ||
| 1353 | mutex_unlock(&table_lock); | 1353 | mutex_unlock(&table_lock); |
| 1354 | |||
| 1355 | usb_serial_bus_deregister(device); | ||
| 1354 | } | 1356 | } |
| 1355 | 1357 | ||
| 1356 | /** | 1358 | /** |
diff --git a/drivers/usb/wusbcore/mmc.c b/drivers/usb/wusbcore/mmc.c index 44741267c917..3f485df96226 100644 --- a/drivers/usb/wusbcore/mmc.c +++ b/drivers/usb/wusbcore/mmc.c | |||
| @@ -301,7 +301,7 @@ int wusbhc_chid_set(struct wusbhc *wusbhc, const struct wusb_ckhdid *chid) | |||
| 301 | 301 | ||
| 302 | if (chid) | 302 | if (chid) |
| 303 | result = uwb_radio_start(&wusbhc->pal); | 303 | result = uwb_radio_start(&wusbhc->pal); |
| 304 | else | 304 | else if (wusbhc->uwb_rc) |
| 305 | uwb_radio_stop(&wusbhc->pal); | 305 | uwb_radio_stop(&wusbhc->pal); |
| 306 | 306 | ||
| 307 | return result; | 307 | return result; |
diff --git a/drivers/usb/wusbcore/wa-xfer.c b/drivers/usb/wusbcore/wa-xfer.c index c8e2a47d62a7..3e2e4ed20157 100644 --- a/drivers/usb/wusbcore/wa-xfer.c +++ b/drivers/usb/wusbcore/wa-xfer.c | |||
| @@ -2390,10 +2390,10 @@ error_complete: | |||
| 2390 | done) { | 2390 | done) { |
| 2391 | 2391 | ||
| 2392 | dev_info(dev, "Control EP stall. Queue delayed work.\n"); | 2392 | dev_info(dev, "Control EP stall. Queue delayed work.\n"); |
| 2393 | spin_lock_irq(&wa->xfer_list_lock); | 2393 | spin_lock(&wa->xfer_list_lock); |
| 2394 | /* move xfer from xfer_list to xfer_errored_list. */ | 2394 | /* move xfer from xfer_list to xfer_errored_list. */ |
| 2395 | list_move_tail(&xfer->list_node, &wa->xfer_errored_list); | 2395 | list_move_tail(&xfer->list_node, &wa->xfer_errored_list); |
| 2396 | spin_unlock_irq(&wa->xfer_list_lock); | 2396 | spin_unlock(&wa->xfer_list_lock); |
| 2397 | spin_unlock_irqrestore(&xfer->lock, flags); | 2397 | spin_unlock_irqrestore(&xfer->lock, flags); |
| 2398 | queue_work(wusbd, &wa->xfer_error_work); | 2398 | queue_work(wusbd, &wa->xfer_error_work); |
| 2399 | } else { | 2399 | } else { |
diff --git a/drivers/uwb/drp.c b/drivers/uwb/drp.c index 1a2fd9795367..468c89fb6a16 100644 --- a/drivers/uwb/drp.c +++ b/drivers/uwb/drp.c | |||
| @@ -59,6 +59,7 @@ static void uwb_rc_set_drp_cmd_done(struct uwb_rc *rc, void *arg, | |||
| 59 | struct uwb_rceb *reply, ssize_t reply_size) | 59 | struct uwb_rceb *reply, ssize_t reply_size) |
| 60 | { | 60 | { |
| 61 | struct uwb_rc_evt_set_drp_ie *r = (struct uwb_rc_evt_set_drp_ie *)reply; | 61 | struct uwb_rc_evt_set_drp_ie *r = (struct uwb_rc_evt_set_drp_ie *)reply; |
| 62 | unsigned long flags; | ||
| 62 | 63 | ||
| 63 | if (r != NULL) { | 64 | if (r != NULL) { |
| 64 | if (r->bResultCode != UWB_RC_RES_SUCCESS) | 65 | if (r->bResultCode != UWB_RC_RES_SUCCESS) |
| @@ -67,14 +68,14 @@ static void uwb_rc_set_drp_cmd_done(struct uwb_rc *rc, void *arg, | |||
| 67 | } else | 68 | } else |
| 68 | dev_err(&rc->uwb_dev.dev, "SET-DRP-IE: timeout\n"); | 69 | dev_err(&rc->uwb_dev.dev, "SET-DRP-IE: timeout\n"); |
| 69 | 70 | ||
| 70 | spin_lock_irq(&rc->rsvs_lock); | 71 | spin_lock_irqsave(&rc->rsvs_lock, flags); |
| 71 | if (rc->set_drp_ie_pending > 1) { | 72 | if (rc->set_drp_ie_pending > 1) { |
| 72 | rc->set_drp_ie_pending = 0; | 73 | rc->set_drp_ie_pending = 0; |
| 73 | uwb_rsv_queue_update(rc); | 74 | uwb_rsv_queue_update(rc); |
| 74 | } else { | 75 | } else { |
| 75 | rc->set_drp_ie_pending = 0; | 76 | rc->set_drp_ie_pending = 0; |
| 76 | } | 77 | } |
| 77 | spin_unlock_irq(&rc->rsvs_lock); | 78 | spin_unlock_irqrestore(&rc->rsvs_lock, flags); |
| 78 | } | 79 | } |
| 79 | 80 | ||
| 80 | /** | 81 | /** |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 4c48df572bd6..ba6b88528dc7 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
| @@ -2058,6 +2058,20 @@ struct btrfs_ioctl_defrag_range_args { | |||
| 2058 | #define btrfs_raw_test_opt(o, opt) ((o) & BTRFS_MOUNT_##opt) | 2058 | #define btrfs_raw_test_opt(o, opt) ((o) & BTRFS_MOUNT_##opt) |
| 2059 | #define btrfs_test_opt(root, opt) ((root)->fs_info->mount_opt & \ | 2059 | #define btrfs_test_opt(root, opt) ((root)->fs_info->mount_opt & \ |
| 2060 | BTRFS_MOUNT_##opt) | 2060 | BTRFS_MOUNT_##opt) |
| 2061 | #define btrfs_set_and_info(root, opt, fmt, args...) \ | ||
| 2062 | { \ | ||
| 2063 | if (!btrfs_test_opt(root, opt)) \ | ||
| 2064 | btrfs_info(root->fs_info, fmt, ##args); \ | ||
| 2065 | btrfs_set_opt(root->fs_info->mount_opt, opt); \ | ||
| 2066 | } | ||
| 2067 | |||
| 2068 | #define btrfs_clear_and_info(root, opt, fmt, args...) \ | ||
| 2069 | { \ | ||
| 2070 | if (btrfs_test_opt(root, opt)) \ | ||
| 2071 | btrfs_info(root->fs_info, fmt, ##args); \ | ||
| 2072 | btrfs_clear_opt(root->fs_info->mount_opt, opt); \ | ||
| 2073 | } | ||
| 2074 | |||
| 2061 | /* | 2075 | /* |
| 2062 | * Inode flags | 2076 | * Inode flags |
| 2063 | */ | 2077 | */ |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 029d46c2e170..983314932af3 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -2861,7 +2861,7 @@ retry_root_backup: | |||
| 2861 | printk(KERN_ERR "BTRFS: failed to read log tree\n"); | 2861 | printk(KERN_ERR "BTRFS: failed to read log tree\n"); |
| 2862 | free_extent_buffer(log_tree_root->node); | 2862 | free_extent_buffer(log_tree_root->node); |
| 2863 | kfree(log_tree_root); | 2863 | kfree(log_tree_root); |
| 2864 | goto fail_trans_kthread; | 2864 | goto fail_qgroup; |
| 2865 | } | 2865 | } |
| 2866 | /* returns with log_tree_root freed on success */ | 2866 | /* returns with log_tree_root freed on success */ |
| 2867 | ret = btrfs_recover_log_trees(log_tree_root); | 2867 | ret = btrfs_recover_log_trees(log_tree_root); |
| @@ -2870,24 +2870,24 @@ retry_root_backup: | |||
| 2870 | "Failed to recover log tree"); | 2870 | "Failed to recover log tree"); |
| 2871 | free_extent_buffer(log_tree_root->node); | 2871 | free_extent_buffer(log_tree_root->node); |
| 2872 | kfree(log_tree_root); | 2872 | kfree(log_tree_root); |
| 2873 | goto fail_trans_kthread; | 2873 | goto fail_qgroup; |
| 2874 | } | 2874 | } |
| 2875 | 2875 | ||
| 2876 | if (sb->s_flags & MS_RDONLY) { | 2876 | if (sb->s_flags & MS_RDONLY) { |
| 2877 | ret = btrfs_commit_super(tree_root); | 2877 | ret = btrfs_commit_super(tree_root); |
| 2878 | if (ret) | 2878 | if (ret) |
| 2879 | goto fail_trans_kthread; | 2879 | goto fail_qgroup; |
| 2880 | } | 2880 | } |
| 2881 | } | 2881 | } |
| 2882 | 2882 | ||
| 2883 | ret = btrfs_find_orphan_roots(tree_root); | 2883 | ret = btrfs_find_orphan_roots(tree_root); |
| 2884 | if (ret) | 2884 | if (ret) |
| 2885 | goto fail_trans_kthread; | 2885 | goto fail_qgroup; |
| 2886 | 2886 | ||
| 2887 | if (!(sb->s_flags & MS_RDONLY)) { | 2887 | if (!(sb->s_flags & MS_RDONLY)) { |
| 2888 | ret = btrfs_cleanup_fs_roots(fs_info); | 2888 | ret = btrfs_cleanup_fs_roots(fs_info); |
| 2889 | if (ret) | 2889 | if (ret) |
| 2890 | goto fail_trans_kthread; | 2890 | goto fail_qgroup; |
| 2891 | 2891 | ||
| 2892 | ret = btrfs_recover_relocation(tree_root); | 2892 | ret = btrfs_recover_relocation(tree_root); |
| 2893 | if (ret < 0) { | 2893 | if (ret < 0) { |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 1306487c82cf..5590af92094b 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -1542,6 +1542,7 @@ again: | |||
| 1542 | ret = 0; | 1542 | ret = 0; |
| 1543 | } | 1543 | } |
| 1544 | if (ret) { | 1544 | if (ret) { |
| 1545 | key.objectid = bytenr; | ||
| 1545 | key.type = BTRFS_EXTENT_ITEM_KEY; | 1546 | key.type = BTRFS_EXTENT_ITEM_KEY; |
| 1546 | key.offset = num_bytes; | 1547 | key.offset = num_bytes; |
| 1547 | btrfs_release_path(path); | 1548 | btrfs_release_path(path); |
| @@ -3542,11 +3543,13 @@ static u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags) | |||
| 3542 | return extended_to_chunk(flags | tmp); | 3543 | return extended_to_chunk(flags | tmp); |
| 3543 | } | 3544 | } |
| 3544 | 3545 | ||
| 3545 | static u64 get_alloc_profile(struct btrfs_root *root, u64 flags) | 3546 | static u64 get_alloc_profile(struct btrfs_root *root, u64 orig_flags) |
| 3546 | { | 3547 | { |
| 3547 | unsigned seq; | 3548 | unsigned seq; |
| 3549 | u64 flags; | ||
| 3548 | 3550 | ||
| 3549 | do { | 3551 | do { |
| 3552 | flags = orig_flags; | ||
| 3550 | seq = read_seqbegin(&root->fs_info->profiles_lock); | 3553 | seq = read_seqbegin(&root->fs_info->profiles_lock); |
| 3551 | 3554 | ||
| 3552 | if (flags & BTRFS_BLOCK_GROUP_DATA) | 3555 | if (flags & BTRFS_BLOCK_GROUP_DATA) |
| @@ -5719,6 +5722,7 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
| 5719 | 5722 | ||
| 5720 | if (ret > 0 && skinny_metadata) { | 5723 | if (ret > 0 && skinny_metadata) { |
| 5721 | skinny_metadata = false; | 5724 | skinny_metadata = false; |
| 5725 | key.objectid = bytenr; | ||
| 5722 | key.type = BTRFS_EXTENT_ITEM_KEY; | 5726 | key.type = BTRFS_EXTENT_ITEM_KEY; |
| 5723 | key.offset = num_bytes; | 5727 | key.offset = num_bytes; |
| 5724 | btrfs_release_path(path); | 5728 | btrfs_release_path(path); |
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index eb742c07e7a4..ae6af072b635 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
| @@ -800,7 +800,7 @@ next_slot: | |||
| 800 | if (start > key.offset && end < extent_end) { | 800 | if (start > key.offset && end < extent_end) { |
| 801 | BUG_ON(del_nr > 0); | 801 | BUG_ON(del_nr > 0); |
| 802 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { | 802 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { |
| 803 | ret = -EINVAL; | 803 | ret = -EOPNOTSUPP; |
| 804 | break; | 804 | break; |
| 805 | } | 805 | } |
| 806 | 806 | ||
| @@ -846,7 +846,7 @@ next_slot: | |||
| 846 | */ | 846 | */ |
| 847 | if (start <= key.offset && end < extent_end) { | 847 | if (start <= key.offset && end < extent_end) { |
| 848 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { | 848 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { |
| 849 | ret = -EINVAL; | 849 | ret = -EOPNOTSUPP; |
| 850 | break; | 850 | break; |
| 851 | } | 851 | } |
| 852 | 852 | ||
| @@ -872,7 +872,7 @@ next_slot: | |||
| 872 | if (start > key.offset && end >= extent_end) { | 872 | if (start > key.offset && end >= extent_end) { |
| 873 | BUG_ON(del_nr > 0); | 873 | BUG_ON(del_nr > 0); |
| 874 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { | 874 | if (extent_type == BTRFS_FILE_EXTENT_INLINE) { |
| 875 | ret = -EINVAL; | 875 | ret = -EOPNOTSUPP; |
| 876 | break; | 876 | break; |
| 877 | } | 877 | } |
| 878 | 878 | ||
| @@ -1777,7 +1777,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb, | |||
| 1777 | start_pos = round_down(pos, root->sectorsize); | 1777 | start_pos = round_down(pos, root->sectorsize); |
| 1778 | if (start_pos > i_size_read(inode)) { | 1778 | if (start_pos > i_size_read(inode)) { |
| 1779 | /* Expand hole size to cover write data, preventing empty gap */ | 1779 | /* Expand hole size to cover write data, preventing empty gap */ |
| 1780 | end_pos = round_up(pos + iov->iov_len, root->sectorsize); | 1780 | end_pos = round_up(pos + count, root->sectorsize); |
| 1781 | err = btrfs_cont_expand(inode, i_size_read(inode), end_pos); | 1781 | err = btrfs_cont_expand(inode, i_size_read(inode), end_pos); |
| 1782 | if (err) { | 1782 | if (err) { |
| 1783 | mutex_unlock(&inode->i_mutex); | 1783 | mutex_unlock(&inode->i_mutex); |
diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c index cc8ca193d830..86935f5ae291 100644 --- a/fs/btrfs/inode-map.c +++ b/fs/btrfs/inode-map.c | |||
| @@ -176,7 +176,11 @@ static void start_caching(struct btrfs_root *root) | |||
| 176 | 176 | ||
| 177 | tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n", | 177 | tsk = kthread_run(caching_kthread, root, "btrfs-ino-cache-%llu\n", |
| 178 | root->root_key.objectid); | 178 | root->root_key.objectid); |
| 179 | BUG_ON(IS_ERR(tsk)); /* -ENOMEM */ | 179 | if (IS_ERR(tsk)) { |
| 180 | btrfs_warn(root->fs_info, "failed to start inode caching task"); | ||
| 181 | btrfs_clear_and_info(root, CHANGE_INODE_CACHE, | ||
| 182 | "disabling inode map caching"); | ||
| 183 | } | ||
| 180 | } | 184 | } |
| 181 | 185 | ||
| 182 | int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) | 186 | int btrfs_find_free_ino(struct btrfs_root *root, u64 *objectid) |
| @@ -205,24 +209,14 @@ again: | |||
| 205 | 209 | ||
| 206 | void btrfs_return_ino(struct btrfs_root *root, u64 objectid) | 210 | void btrfs_return_ino(struct btrfs_root *root, u64 objectid) |
| 207 | { | 211 | { |
| 208 | struct btrfs_free_space_ctl *ctl = root->free_ino_ctl; | ||
| 209 | struct btrfs_free_space_ctl *pinned = root->free_ino_pinned; | 212 | struct btrfs_free_space_ctl *pinned = root->free_ino_pinned; |
| 210 | 213 | ||
| 211 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) | 214 | if (!btrfs_test_opt(root, INODE_MAP_CACHE)) |
| 212 | return; | 215 | return; |
| 213 | |||
| 214 | again: | 216 | again: |
| 215 | if (root->cached == BTRFS_CACHE_FINISHED) { | 217 | if (root->cached == BTRFS_CACHE_FINISHED) { |
| 216 | __btrfs_add_free_space(ctl, objectid, 1); | 218 | __btrfs_add_free_space(pinned, objectid, 1); |
| 217 | } else { | 219 | } else { |
| 218 | /* | ||
| 219 | * If we are in the process of caching free ino chunks, | ||
| 220 | * to avoid adding the same inode number to the free_ino | ||
| 221 | * tree twice due to cross transaction, we'll leave it | ||
| 222 | * in the pinned tree until a transaction is committed | ||
| 223 | * or the caching work is done. | ||
| 224 | */ | ||
| 225 | |||
| 226 | down_write(&root->fs_info->commit_root_sem); | 220 | down_write(&root->fs_info->commit_root_sem); |
| 227 | spin_lock(&root->cache_lock); | 221 | spin_lock(&root->cache_lock); |
| 228 | if (root->cached == BTRFS_CACHE_FINISHED) { | 222 | if (root->cached == BTRFS_CACHE_FINISHED) { |
| @@ -234,11 +228,7 @@ again: | |||
| 234 | 228 | ||
| 235 | start_caching(root); | 229 | start_caching(root); |
| 236 | 230 | ||
| 237 | if (objectid <= root->cache_progress || | 231 | __btrfs_add_free_space(pinned, objectid, 1); |
| 238 | objectid >= root->highest_objectid) | ||
| 239 | __btrfs_add_free_space(ctl, objectid, 1); | ||
| 240 | else | ||
| 241 | __btrfs_add_free_space(pinned, objectid, 1); | ||
| 242 | 232 | ||
| 243 | up_write(&root->fs_info->commit_root_sem); | 233 | up_write(&root->fs_info->commit_root_sem); |
| 244 | } | 234 | } |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index e79ff6b90cb7..2ad7de94efef 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -3066,7 +3066,7 @@ process_slot: | |||
| 3066 | new_key.offset + datal, | 3066 | new_key.offset + datal, |
| 3067 | 1); | 3067 | 1); |
| 3068 | if (ret) { | 3068 | if (ret) { |
| 3069 | if (ret != -EINVAL) | 3069 | if (ret != -EOPNOTSUPP) |
| 3070 | btrfs_abort_transaction(trans, | 3070 | btrfs_abort_transaction(trans, |
| 3071 | root, ret); | 3071 | root, ret); |
| 3072 | btrfs_end_transaction(trans, root); | 3072 | btrfs_end_transaction(trans, root); |
| @@ -3141,7 +3141,7 @@ process_slot: | |||
| 3141 | new_key.offset + datal, | 3141 | new_key.offset + datal, |
| 3142 | 1); | 3142 | 1); |
| 3143 | if (ret) { | 3143 | if (ret) { |
| 3144 | if (ret != -EINVAL) | 3144 | if (ret != -EOPNOTSUPP) |
| 3145 | btrfs_abort_transaction(trans, | 3145 | btrfs_abort_transaction(trans, |
| 3146 | root, ret); | 3146 | root, ret); |
| 3147 | btrfs_end_transaction(trans, root); | 3147 | btrfs_end_transaction(trans, root); |
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c index 1ac3ca98c429..eb6537a08c1b 100644 --- a/fs/btrfs/send.c +++ b/fs/btrfs/send.c | |||
| @@ -349,6 +349,11 @@ static int fs_path_ensure_buf(struct fs_path *p, int len) | |||
| 349 | if (p->buf_len >= len) | 349 | if (p->buf_len >= len) |
| 350 | return 0; | 350 | return 0; |
| 351 | 351 | ||
| 352 | if (len > PATH_MAX) { | ||
| 353 | WARN_ON(1); | ||
| 354 | return -ENOMEM; | ||
| 355 | } | ||
| 356 | |||
| 352 | path_len = p->end - p->start; | 357 | path_len = p->end - p->start; |
| 353 | old_buf_len = p->buf_len; | 358 | old_buf_len = p->buf_len; |
| 354 | 359 | ||
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 5011aadacab8..9601d25a4607 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
| @@ -385,20 +385,6 @@ static match_table_t tokens = { | |||
| 385 | {Opt_err, NULL}, | 385 | {Opt_err, NULL}, |
| 386 | }; | 386 | }; |
| 387 | 387 | ||
| 388 | #define btrfs_set_and_info(root, opt, fmt, args...) \ | ||
| 389 | { \ | ||
| 390 | if (!btrfs_test_opt(root, opt)) \ | ||
| 391 | btrfs_info(root->fs_info, fmt, ##args); \ | ||
| 392 | btrfs_set_opt(root->fs_info->mount_opt, opt); \ | ||
| 393 | } | ||
| 394 | |||
| 395 | #define btrfs_clear_and_info(root, opt, fmt, args...) \ | ||
| 396 | { \ | ||
| 397 | if (btrfs_test_opt(root, opt)) \ | ||
| 398 | btrfs_info(root->fs_info, fmt, ##args); \ | ||
| 399 | btrfs_clear_opt(root->fs_info->mount_opt, opt); \ | ||
| 400 | } | ||
| 401 | |||
| 402 | /* | 388 | /* |
| 403 | * Regular mount options parser. Everything that is needed only when | 389 | * Regular mount options parser. Everything that is needed only when |
| 404 | * reading in a new superblock is parsed here. | 390 | * reading in a new superblock is parsed here. |
| @@ -1186,7 +1172,6 @@ static struct dentry *mount_subvol(const char *subvol_name, int flags, | |||
| 1186 | return ERR_PTR(-ENOMEM); | 1172 | return ERR_PTR(-ENOMEM); |
| 1187 | mnt = vfs_kern_mount(&btrfs_fs_type, flags, device_name, | 1173 | mnt = vfs_kern_mount(&btrfs_fs_type, flags, device_name, |
| 1188 | newargs); | 1174 | newargs); |
| 1189 | kfree(newargs); | ||
| 1190 | 1175 | ||
| 1191 | if (PTR_RET(mnt) == -EBUSY) { | 1176 | if (PTR_RET(mnt) == -EBUSY) { |
| 1192 | if (flags & MS_RDONLY) { | 1177 | if (flags & MS_RDONLY) { |
| @@ -1196,17 +1181,22 @@ static struct dentry *mount_subvol(const char *subvol_name, int flags, | |||
| 1196 | int r; | 1181 | int r; |
| 1197 | mnt = vfs_kern_mount(&btrfs_fs_type, flags | MS_RDONLY, device_name, | 1182 | mnt = vfs_kern_mount(&btrfs_fs_type, flags | MS_RDONLY, device_name, |
| 1198 | newargs); | 1183 | newargs); |
| 1199 | if (IS_ERR(mnt)) | 1184 | if (IS_ERR(mnt)) { |
| 1185 | kfree(newargs); | ||
| 1200 | return ERR_CAST(mnt); | 1186 | return ERR_CAST(mnt); |
| 1187 | } | ||
| 1201 | 1188 | ||
| 1202 | r = btrfs_remount(mnt->mnt_sb, &flags, NULL); | 1189 | r = btrfs_remount(mnt->mnt_sb, &flags, NULL); |
| 1203 | if (r < 0) { | 1190 | if (r < 0) { |
| 1204 | /* FIXME: release vfsmount mnt ??*/ | 1191 | /* FIXME: release vfsmount mnt ??*/ |
| 1192 | kfree(newargs); | ||
| 1205 | return ERR_PTR(r); | 1193 | return ERR_PTR(r); |
| 1206 | } | 1194 | } |
| 1207 | } | 1195 | } |
| 1208 | } | 1196 | } |
| 1209 | 1197 | ||
| 1198 | kfree(newargs); | ||
| 1199 | |||
| 1210 | if (IS_ERR(mnt)) | 1200 | if (IS_ERR(mnt)) |
| 1211 | return ERR_CAST(mnt); | 1201 | return ERR_CAST(mnt); |
| 1212 | 1202 | ||
diff --git a/fs/kernfs/dir.c b/fs/kernfs/dir.c index 78f3403300af..ac127cd008bf 100644 --- a/fs/kernfs/dir.c +++ b/fs/kernfs/dir.c | |||
| @@ -232,9 +232,6 @@ static int kernfs_link_sibling(struct kernfs_node *kn) | |||
| 232 | struct rb_node **node = &kn->parent->dir.children.rb_node; | 232 | struct rb_node **node = &kn->parent->dir.children.rb_node; |
| 233 | struct rb_node *parent = NULL; | 233 | struct rb_node *parent = NULL; |
| 234 | 234 | ||
| 235 | if (kernfs_type(kn) == KERNFS_DIR) | ||
| 236 | kn->parent->dir.subdirs++; | ||
| 237 | |||
| 238 | while (*node) { | 235 | while (*node) { |
| 239 | struct kernfs_node *pos; | 236 | struct kernfs_node *pos; |
| 240 | int result; | 237 | int result; |
| @@ -249,9 +246,15 @@ static int kernfs_link_sibling(struct kernfs_node *kn) | |||
| 249 | else | 246 | else |
| 250 | return -EEXIST; | 247 | return -EEXIST; |
| 251 | } | 248 | } |
| 249 | |||
| 252 | /* add new node and rebalance the tree */ | 250 | /* add new node and rebalance the tree */ |
| 253 | rb_link_node(&kn->rb, parent, node); | 251 | rb_link_node(&kn->rb, parent, node); |
| 254 | rb_insert_color(&kn->rb, &kn->parent->dir.children); | 252 | rb_insert_color(&kn->rb, &kn->parent->dir.children); |
| 253 | |||
| 254 | /* successfully added, account subdir number */ | ||
| 255 | if (kernfs_type(kn) == KERNFS_DIR) | ||
| 256 | kn->parent->dir.subdirs++; | ||
| 257 | |||
| 255 | return 0; | 258 | return 0; |
| 256 | } | 259 | } |
| 257 | 260 | ||
diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c index 8034706a7af8..e01ea4a14a01 100644 --- a/fs/kernfs/file.c +++ b/fs/kernfs/file.c | |||
| @@ -484,6 +484,8 @@ static int kernfs_fop_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 484 | 484 | ||
| 485 | ops = kernfs_ops(of->kn); | 485 | ops = kernfs_ops(of->kn); |
| 486 | rc = ops->mmap(of, vma); | 486 | rc = ops->mmap(of, vma); |
| 487 | if (rc) | ||
| 488 | goto out_put; | ||
| 487 | 489 | ||
| 488 | /* | 490 | /* |
| 489 | * PowerPC's pci_mmap of legacy_mem uses shmem_zero_setup() | 491 | * PowerPC's pci_mmap of legacy_mem uses shmem_zero_setup() |
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h index c7bfac1c4a7b..8834a7e5b944 100644 --- a/include/linux/interrupt.h +++ b/include/linux/interrupt.h | |||
| @@ -203,7 +203,40 @@ static inline int check_wakeup_irqs(void) { return 0; } | |||
| 203 | 203 | ||
| 204 | extern cpumask_var_t irq_default_affinity; | 204 | extern cpumask_var_t irq_default_affinity; |
| 205 | 205 | ||
| 206 | extern int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask); | 206 | /* Internal implementation. Use the helpers below */ |
| 207 | extern int __irq_set_affinity(unsigned int irq, const struct cpumask *cpumask, | ||
| 208 | bool force); | ||
| 209 | |||
| 210 | /** | ||
| 211 | * irq_set_affinity - Set the irq affinity of a given irq | ||
| 212 | * @irq: Interrupt to set affinity | ||
| 213 | * @mask: cpumask | ||
| 214 | * | ||
| 215 | * Fails if cpumask does not contain an online CPU | ||
| 216 | */ | ||
| 217 | static inline int | ||
| 218 | irq_set_affinity(unsigned int irq, const struct cpumask *cpumask) | ||
| 219 | { | ||
| 220 | return __irq_set_affinity(irq, cpumask, false); | ||
| 221 | } | ||
| 222 | |||
| 223 | /** | ||
| 224 | * irq_force_affinity - Force the irq affinity of a given irq | ||
| 225 | * @irq: Interrupt to set affinity | ||
| 226 | * @mask: cpumask | ||
| 227 | * | ||
| 228 | * Same as irq_set_affinity, but without checking the mask against | ||
| 229 | * online cpus. | ||
| 230 | * | ||
| 231 | * Solely for low level cpu hotplug code, where we need to make per | ||
| 232 | * cpu interrupts affine before the cpu becomes online. | ||
| 233 | */ | ||
| 234 | static inline int | ||
| 235 | irq_force_affinity(unsigned int irq, const struct cpumask *cpumask) | ||
| 236 | { | ||
| 237 | return __irq_set_affinity(irq, cpumask, true); | ||
| 238 | } | ||
| 239 | |||
| 207 | extern int irq_can_set_affinity(unsigned int irq); | 240 | extern int irq_can_set_affinity(unsigned int irq); |
| 208 | extern int irq_select_affinity(unsigned int irq); | 241 | extern int irq_select_affinity(unsigned int irq); |
| 209 | 242 | ||
diff --git a/include/linux/irq.h b/include/linux/irq.h index d278838908cb..10a0b1ac4ea0 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
| @@ -394,7 +394,8 @@ extern void remove_percpu_irq(unsigned int irq, struct irqaction *act); | |||
| 394 | 394 | ||
| 395 | extern void irq_cpu_online(void); | 395 | extern void irq_cpu_online(void); |
| 396 | extern void irq_cpu_offline(void); | 396 | extern void irq_cpu_offline(void); |
| 397 | extern int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *cpumask); | 397 | extern int irq_set_affinity_locked(struct irq_data *data, |
| 398 | const struct cpumask *cpumask, bool force); | ||
| 398 | 399 | ||
| 399 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) | 400 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) |
| 400 | void irq_move_irq(struct irq_data *data); | 401 | void irq_move_irq(struct irq_data *data); |
diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h index e2f5ca96cddc..2760744cb2a7 100644 --- a/include/linux/phy/phy.h +++ b/include/linux/phy/phy.h | |||
| @@ -174,21 +174,29 @@ void devm_of_phy_provider_unregister(struct device *dev, | |||
| 174 | #else | 174 | #else |
| 175 | static inline int phy_pm_runtime_get(struct phy *phy) | 175 | static inline int phy_pm_runtime_get(struct phy *phy) |
| 176 | { | 176 | { |
| 177 | if (!phy) | ||
| 178 | return 0; | ||
| 177 | return -ENOSYS; | 179 | return -ENOSYS; |
| 178 | } | 180 | } |
| 179 | 181 | ||
| 180 | static inline int phy_pm_runtime_get_sync(struct phy *phy) | 182 | static inline int phy_pm_runtime_get_sync(struct phy *phy) |
| 181 | { | 183 | { |
| 184 | if (!phy) | ||
| 185 | return 0; | ||
| 182 | return -ENOSYS; | 186 | return -ENOSYS; |
| 183 | } | 187 | } |
| 184 | 188 | ||
| 185 | static inline int phy_pm_runtime_put(struct phy *phy) | 189 | static inline int phy_pm_runtime_put(struct phy *phy) |
| 186 | { | 190 | { |
| 191 | if (!phy) | ||
| 192 | return 0; | ||
| 187 | return -ENOSYS; | 193 | return -ENOSYS; |
| 188 | } | 194 | } |
| 189 | 195 | ||
| 190 | static inline int phy_pm_runtime_put_sync(struct phy *phy) | 196 | static inline int phy_pm_runtime_put_sync(struct phy *phy) |
| 191 | { | 197 | { |
| 198 | if (!phy) | ||
| 199 | return 0; | ||
| 192 | return -ENOSYS; | 200 | return -ENOSYS; |
| 193 | } | 201 | } |
| 194 | 202 | ||
| @@ -204,21 +212,29 @@ static inline void phy_pm_runtime_forbid(struct phy *phy) | |||
| 204 | 212 | ||
| 205 | static inline int phy_init(struct phy *phy) | 213 | static inline int phy_init(struct phy *phy) |
| 206 | { | 214 | { |
| 215 | if (!phy) | ||
| 216 | return 0; | ||
| 207 | return -ENOSYS; | 217 | return -ENOSYS; |
| 208 | } | 218 | } |
| 209 | 219 | ||
| 210 | static inline int phy_exit(struct phy *phy) | 220 | static inline int phy_exit(struct phy *phy) |
| 211 | { | 221 | { |
| 222 | if (!phy) | ||
| 223 | return 0; | ||
| 212 | return -ENOSYS; | 224 | return -ENOSYS; |
| 213 | } | 225 | } |
| 214 | 226 | ||
| 215 | static inline int phy_power_on(struct phy *phy) | 227 | static inline int phy_power_on(struct phy *phy) |
| 216 | { | 228 | { |
| 229 | if (!phy) | ||
| 230 | return 0; | ||
| 217 | return -ENOSYS; | 231 | return -ENOSYS; |
| 218 | } | 232 | } |
| 219 | 233 | ||
| 220 | static inline int phy_power_off(struct phy *phy) | 234 | static inline int phy_power_off(struct phy *phy) |
| 221 | { | 235 | { |
| 236 | if (!phy) | ||
| 237 | return 0; | ||
| 222 | return -ENOSYS; | 238 | return -ENOSYS; |
| 223 | } | 239 | } |
| 224 | 240 | ||
diff --git a/include/linux/tty.h b/include/linux/tty.h index 1c3316a47d7e..036cccd80d9f 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
| @@ -61,6 +61,7 @@ struct tty_bufhead { | |||
| 61 | struct tty_buffer *head; /* Queue head */ | 61 | struct tty_buffer *head; /* Queue head */ |
| 62 | struct work_struct work; | 62 | struct work_struct work; |
| 63 | struct mutex lock; | 63 | struct mutex lock; |
| 64 | spinlock_t flush_lock; | ||
| 64 | atomic_t priority; | 65 | atomic_t priority; |
| 65 | struct tty_buffer sentinel; | 66 | struct tty_buffer sentinel; |
| 66 | struct llist_head free; /* Free queue head */ | 67 | struct llist_head free; /* Free queue head */ |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 2486a4c1a710..d34131ca372b 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
| @@ -180,7 +180,7 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask, | |||
| 180 | struct irq_chip *chip = irq_data_get_irq_chip(data); | 180 | struct irq_chip *chip = irq_data_get_irq_chip(data); |
| 181 | int ret; | 181 | int ret; |
| 182 | 182 | ||
| 183 | ret = chip->irq_set_affinity(data, mask, false); | 183 | ret = chip->irq_set_affinity(data, mask, force); |
| 184 | switch (ret) { | 184 | switch (ret) { |
| 185 | case IRQ_SET_MASK_OK: | 185 | case IRQ_SET_MASK_OK: |
| 186 | cpumask_copy(data->affinity, mask); | 186 | cpumask_copy(data->affinity, mask); |
| @@ -192,7 +192,8 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask, | |||
| 192 | return ret; | 192 | return ret; |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) | 195 | int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, |
| 196 | bool force) | ||
| 196 | { | 197 | { |
| 197 | struct irq_chip *chip = irq_data_get_irq_chip(data); | 198 | struct irq_chip *chip = irq_data_get_irq_chip(data); |
| 198 | struct irq_desc *desc = irq_data_to_desc(data); | 199 | struct irq_desc *desc = irq_data_to_desc(data); |
| @@ -202,7 +203,7 @@ int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) | |||
| 202 | return -EINVAL; | 203 | return -EINVAL; |
| 203 | 204 | ||
| 204 | if (irq_can_move_pcntxt(data)) { | 205 | if (irq_can_move_pcntxt(data)) { |
| 205 | ret = irq_do_set_affinity(data, mask, false); | 206 | ret = irq_do_set_affinity(data, mask, force); |
| 206 | } else { | 207 | } else { |
| 207 | irqd_set_move_pending(data); | 208 | irqd_set_move_pending(data); |
| 208 | irq_copy_pending(desc, mask); | 209 | irq_copy_pending(desc, mask); |
| @@ -217,13 +218,7 @@ int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) | |||
| 217 | return ret; | 218 | return ret; |
| 218 | } | 219 | } |
| 219 | 220 | ||
| 220 | /** | 221 | int __irq_set_affinity(unsigned int irq, const struct cpumask *mask, bool force) |
| 221 | * irq_set_affinity - Set the irq affinity of a given irq | ||
| 222 | * @irq: Interrupt to set affinity | ||
| 223 | * @mask: cpumask | ||
| 224 | * | ||
| 225 | */ | ||
| 226 | int irq_set_affinity(unsigned int irq, const struct cpumask *mask) | ||
| 227 | { | 222 | { |
| 228 | struct irq_desc *desc = irq_to_desc(irq); | 223 | struct irq_desc *desc = irq_to_desc(irq); |
| 229 | unsigned long flags; | 224 | unsigned long flags; |
| @@ -233,7 +228,7 @@ int irq_set_affinity(unsigned int irq, const struct cpumask *mask) | |||
| 233 | return -EINVAL; | 228 | return -EINVAL; |
| 234 | 229 | ||
| 235 | raw_spin_lock_irqsave(&desc->lock, flags); | 230 | raw_spin_lock_irqsave(&desc->lock, flags); |
| 236 | ret = __irq_set_affinity_locked(irq_desc_get_irq_data(desc), mask); | 231 | ret = irq_set_affinity_locked(irq_desc_get_irq_data(desc), mask, force); |
| 237 | raw_spin_unlock_irqrestore(&desc->lock, flags); | 232 | raw_spin_unlock_irqrestore(&desc->lock, flags); |
| 238 | return ret; | 233 | return ret; |
| 239 | } | 234 | } |
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index c3ad9cafe930..8233cd4047d7 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <linux/console.h> | 15 | #include <linux/console.h> |
| 16 | #include <linux/cpu.h> | 16 | #include <linux/cpu.h> |
| 17 | #include <linux/cpuidle.h> | ||
| 17 | #include <linux/syscalls.h> | 18 | #include <linux/syscalls.h> |
| 18 | #include <linux/gfp.h> | 19 | #include <linux/gfp.h> |
| 19 | #include <linux/io.h> | 20 | #include <linux/io.h> |
| @@ -53,7 +54,9 @@ static void freeze_begin(void) | |||
| 53 | 54 | ||
| 54 | static void freeze_enter(void) | 55 | static void freeze_enter(void) |
| 55 | { | 56 | { |
| 57 | cpuidle_resume(); | ||
| 56 | wait_event(suspend_freeze_wait_head, suspend_freeze_wake); | 58 | wait_event(suspend_freeze_wait_head, suspend_freeze_wake); |
| 59 | cpuidle_pause(); | ||
| 57 | } | 60 | } |
| 58 | 61 | ||
| 59 | void freeze_wake(void) | 62 | void freeze_wake(void) |
diff --git a/tools/power/acpi/Makefile b/tools/power/acpi/Makefile index d9186a2fdf06..c2c0f20067a5 100644 --- a/tools/power/acpi/Makefile +++ b/tools/power/acpi/Makefile | |||
| @@ -89,15 +89,6 @@ else | |||
| 89 | STRIPCMD = $(STRIP) -s --remove-section=.note --remove-section=.comment | 89 | STRIPCMD = $(STRIP) -s --remove-section=.note --remove-section=.comment |
| 90 | endif | 90 | endif |
| 91 | 91 | ||
| 92 | # if DEBUG is enabled, then we do not strip or optimize | ||
| 93 | ifeq ($(strip $(DEBUG)),true) | ||
| 94 | CFLAGS += -O1 -g -DDEBUG | ||
| 95 | STRIPCMD = /bin/true -Since_we_are_debugging | ||
| 96 | else | ||
| 97 | CFLAGS += $(OPTIMIZATION) -fomit-frame-pointer | ||
| 98 | STRIPCMD = $(STRIP) -s --remove-section=.note --remove-section=.comment | ||
| 99 | endif | ||
| 100 | |||
| 101 | # --- ACPIDUMP BEGIN --- | 92 | # --- ACPIDUMP BEGIN --- |
| 102 | 93 | ||
| 103 | vpath %.c \ | 94 | vpath %.c \ |
| @@ -128,7 +119,7 @@ clean: | |||
| 128 | -rm -f $(OUTPUT)acpidump | 119 | -rm -f $(OUTPUT)acpidump |
| 129 | 120 | ||
| 130 | install-tools: | 121 | install-tools: |
| 131 | $(INSTALL) -d $(DESTDIR)${bindir} | 122 | $(INSTALL) -d $(DESTDIR)${sbindir} |
| 132 | $(INSTALL_PROGRAM) $(OUTPUT)acpidump $(DESTDIR)${sbindir} | 123 | $(INSTALL_PROGRAM) $(OUTPUT)acpidump $(DESTDIR)${sbindir} |
| 133 | 124 | ||
| 134 | install-man: | 125 | install-man: |
