Annotation of /trunk/kernel-magellan/patches-3.9/0105-3.9.6-all-fixes.patch
Parent Directory | Revision Log
Revision 2210 -
(hide annotations)
(download)
Fri Jun 14 10:30:22 2013 UTC (11 years, 3 months ago) by niro
File size: 96270 byte(s)
Fri Jun 14 10:30:22 2013 UTC (11 years, 3 months ago) by niro
File size: 96270 byte(s)
-linux-3.9.6
1 | niro | 2210 | diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile |
2 | index afed28e..27f3604 100644 | ||
3 | --- a/arch/arm/boot/compressed/Makefile | ||
4 | +++ b/arch/arm/boot/compressed/Makefile | ||
5 | @@ -121,7 +121,7 @@ KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) | ||
6 | endif | ||
7 | |||
8 | ccflags-y := -fpic -mno-single-pic-base -fno-builtin -I$(obj) | ||
9 | -asflags-y := -Wa,-march=all -DZIMAGE | ||
10 | +asflags-y := -DZIMAGE | ||
11 | |||
12 | # Supply kernel BSS size to the decompressor via a linker symbol. | ||
13 | KBSS_SZ = $(shell $(CROSS_COMPILE)size $(obj)/../../../../vmlinux | \ | ||
14 | diff --git a/arch/arm/boot/compressed/head-sa1100.S b/arch/arm/boot/compressed/head-sa1100.S | ||
15 | index 6179d94..3115e31 100644 | ||
16 | --- a/arch/arm/boot/compressed/head-sa1100.S | ||
17 | +++ b/arch/arm/boot/compressed/head-sa1100.S | ||
18 | @@ -11,6 +11,7 @@ | ||
19 | #include <asm/mach-types.h> | ||
20 | |||
21 | .section ".start", "ax" | ||
22 | + .arch armv4 | ||
23 | |||
24 | __SA1100_start: | ||
25 | |||
26 | diff --git a/arch/arm/boot/compressed/head-shark.S b/arch/arm/boot/compressed/head-shark.S | ||
27 | index 089c560..92b5689 100644 | ||
28 | --- a/arch/arm/boot/compressed/head-shark.S | ||
29 | +++ b/arch/arm/boot/compressed/head-shark.S | ||
30 | @@ -18,6 +18,7 @@ | ||
31 | |||
32 | .section ".start", "ax" | ||
33 | |||
34 | + .arch armv4 | ||
35 | b __beginning | ||
36 | |||
37 | __ofw_data: .long 0 @ the number of memory blocks | ||
38 | diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S | ||
39 | index fe4d9c3..6938559 100644 | ||
40 | --- a/arch/arm/boot/compressed/head.S | ||
41 | +++ b/arch/arm/boot/compressed/head.S | ||
42 | @@ -11,6 +11,7 @@ | ||
43 | #include <linux/linkage.h> | ||
44 | #include <asm/assembler.h> | ||
45 | |||
46 | + .arch armv7-a | ||
47 | /* | ||
48 | * Debugging stuff | ||
49 | * | ||
50 | diff --git a/arch/arm/include/asm/percpu.h b/arch/arm/include/asm/percpu.h | ||
51 | index 968c0a1..209e650 100644 | ||
52 | --- a/arch/arm/include/asm/percpu.h | ||
53 | +++ b/arch/arm/include/asm/percpu.h | ||
54 | @@ -30,8 +30,15 @@ static inline void set_my_cpu_offset(unsigned long off) | ||
55 | static inline unsigned long __my_cpu_offset(void) | ||
56 | { | ||
57 | unsigned long off; | ||
58 | - /* Read TPIDRPRW */ | ||
59 | - asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : : "memory"); | ||
60 | + register unsigned long *sp asm ("sp"); | ||
61 | + | ||
62 | + /* | ||
63 | + * Read TPIDRPRW. | ||
64 | + * We want to allow caching the value, so avoid using volatile and | ||
65 | + * instead use a fake stack read to hazard against barrier(). | ||
66 | + */ | ||
67 | + asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : "Q" (*sp)); | ||
68 | + | ||
69 | return off; | ||
70 | } | ||
71 | #define __my_cpu_offset __my_cpu_offset() | ||
72 | diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c | ||
73 | index 79282eb..606b9538 100644 | ||
74 | --- a/arch/arm/kernel/topology.c | ||
75 | +++ b/arch/arm/kernel/topology.c | ||
76 | @@ -13,6 +13,7 @@ | ||
77 | |||
78 | #include <linux/cpu.h> | ||
79 | #include <linux/cpumask.h> | ||
80 | +#include <linux/export.h> | ||
81 | #include <linux/init.h> | ||
82 | #include <linux/percpu.h> | ||
83 | #include <linux/node.h> | ||
84 | @@ -200,6 +201,7 @@ static inline void update_cpu_power(unsigned int cpuid, unsigned int mpidr) {} | ||
85 | * cpu topology table | ||
86 | */ | ||
87 | struct cputopo_arm cpu_topology[NR_CPUS]; | ||
88 | +EXPORT_SYMBOL_GPL(cpu_topology); | ||
89 | |||
90 | const struct cpumask *cpu_coregroup_mask(int cpu) | ||
91 | { | ||
92 | diff --git a/arch/arm/mach-kirkwood/board-ts219.c b/arch/arm/mach-kirkwood/board-ts219.c | ||
93 | index acb0187..4695d5f 100644 | ||
94 | --- a/arch/arm/mach-kirkwood/board-ts219.c | ||
95 | +++ b/arch/arm/mach-kirkwood/board-ts219.c | ||
96 | @@ -41,13 +41,3 @@ void __init qnap_dt_ts219_init(void) | ||
97 | |||
98 | pm_power_off = qnap_tsx1x_power_off; | ||
99 | } | ||
100 | - | ||
101 | -/* FIXME: Will not work with DT. Maybe use MPP40_GPIO? */ | ||
102 | -static int __init ts219_pci_init(void) | ||
103 | -{ | ||
104 | - if (machine_is_ts219()) | ||
105 | - kirkwood_pcie_init(KW_PCIE0); | ||
106 | - | ||
107 | - return 0; | ||
108 | -} | ||
109 | -subsys_initcall(ts219_pci_init); | ||
110 | diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h | ||
111 | index fb3245e..6e11f78 100644 | ||
112 | --- a/arch/powerpc/include/asm/cputable.h | ||
113 | +++ b/arch/powerpc/include/asm/cputable.h | ||
114 | @@ -175,6 +175,7 @@ extern const char *powerpc_base_platform; | ||
115 | #define CPU_FTR_BCTAR LONG_ASM_CONST(0x0100000000000000) | ||
116 | #define CPU_FTR_HAS_PPR LONG_ASM_CONST(0x0200000000000000) | ||
117 | #define CPU_FTR_DAWR LONG_ASM_CONST(0x0400000000000000) | ||
118 | +#define CPU_FTR_DABRX LONG_ASM_CONST(0x0800000000000000) | ||
119 | |||
120 | #ifndef __ASSEMBLY__ | ||
121 | |||
122 | @@ -391,19 +392,20 @@ extern const char *powerpc_base_platform; | ||
123 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_201 | \ | ||
124 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_CAN_NAP | CPU_FTR_MMCRA | \ | ||
125 | CPU_FTR_CP_USE_DCBTZ | CPU_FTR_STCX_CHECKS_ADDRESS | \ | ||
126 | - CPU_FTR_HVMODE) | ||
127 | + CPU_FTR_HVMODE | CPU_FTR_DABRX) | ||
128 | #define CPU_FTRS_POWER5 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | ||
129 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | ||
130 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | ||
131 | CPU_FTR_COHERENT_ICACHE | CPU_FTR_PURR | \ | ||
132 | - CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB) | ||
133 | + CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_DABRX) | ||
134 | #define CPU_FTRS_POWER6 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | ||
135 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | ||
136 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | ||
137 | CPU_FTR_COHERENT_ICACHE | \ | ||
138 | CPU_FTR_PURR | CPU_FTR_SPURR | CPU_FTR_REAL_LE | \ | ||
139 | CPU_FTR_DSCR | CPU_FTR_UNALIGNED_LD_STD | \ | ||
140 | - CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_CFAR) | ||
141 | + CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_CFAR | \ | ||
142 | + CPU_FTR_DABRX) | ||
143 | #define CPU_FTRS_POWER7 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | ||
144 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ | ||
145 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | ||
146 | @@ -412,7 +414,7 @@ extern const char *powerpc_base_platform; | ||
147 | CPU_FTR_DSCR | CPU_FTR_SAO | CPU_FTR_ASYM_SMT | \ | ||
148 | CPU_FTR_STCX_CHECKS_ADDRESS | CPU_FTR_POPCNTB | CPU_FTR_POPCNTD | \ | ||
149 | CPU_FTR_ICSWX | CPU_FTR_CFAR | CPU_FTR_HVMODE | \ | ||
150 | - CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR) | ||
151 | + CPU_FTR_VMX_COPY | CPU_FTR_HAS_PPR | CPU_FTR_DABRX) | ||
152 | #define CPU_FTRS_POWER8 (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | ||
153 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | CPU_FTR_ARCH_206 |\ | ||
154 | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | ||
155 | @@ -427,14 +429,15 @@ extern const char *powerpc_base_platform; | ||
156 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ | ||
157 | CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \ | ||
158 | CPU_FTR_PAUSE_ZERO | CPU_FTR_CELL_TB_BUG | CPU_FTR_CP_USE_DCBTZ | \ | ||
159 | - CPU_FTR_UNALIGNED_LD_STD) | ||
160 | + CPU_FTR_UNALIGNED_LD_STD | CPU_FTR_DABRX) | ||
161 | #define CPU_FTRS_PA6T (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ | ||
162 | CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP | \ | ||
163 | - CPU_FTR_PURR | CPU_FTR_REAL_LE) | ||
164 | + CPU_FTR_PURR | CPU_FTR_REAL_LE | CPU_FTR_DABRX) | ||
165 | #define CPU_FTRS_COMPATIBLE (CPU_FTR_USE_TB | CPU_FTR_PPCAS_ARCH_V2) | ||
166 | |||
167 | #define CPU_FTRS_A2 (CPU_FTR_USE_TB | CPU_FTR_SMT | CPU_FTR_DBELL | \ | ||
168 | - CPU_FTR_NOEXECUTE | CPU_FTR_NODSISRALIGN | CPU_FTR_ICSWX) | ||
169 | + CPU_FTR_NOEXECUTE | CPU_FTR_NODSISRALIGN | \ | ||
170 | + CPU_FTR_ICSWX | CPU_FTR_DABRX ) | ||
171 | |||
172 | #ifdef __powerpc64__ | ||
173 | #ifdef CONFIG_PPC_BOOK3E | ||
174 | diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h | ||
175 | index 3d6b410..ccfe2c8 100644 | ||
176 | --- a/arch/powerpc/include/asm/machdep.h | ||
177 | +++ b/arch/powerpc/include/asm/machdep.h | ||
178 | @@ -29,6 +29,7 @@ struct rtc_time; | ||
179 | struct file; | ||
180 | struct pci_controller; | ||
181 | struct kimage; | ||
182 | +struct pci_host_bridge; | ||
183 | |||
184 | struct machdep_calls { | ||
185 | char *name; | ||
186 | @@ -107,6 +108,8 @@ struct machdep_calls { | ||
187 | void (*pcibios_fixup)(void); | ||
188 | int (*pci_probe_mode)(struct pci_bus *); | ||
189 | void (*pci_irq_fixup)(struct pci_dev *dev); | ||
190 | + int (*pcibios_root_bridge_prepare)(struct pci_host_bridge | ||
191 | + *bridge); | ||
192 | |||
193 | /* To setup PHBs when using automatic OF platform driver for PCI */ | ||
194 | int (*pci_setup_phb)(struct pci_controller *host); | ||
195 | diff --git a/arch/powerpc/include/asm/pci-bridge.h b/arch/powerpc/include/asm/pci-bridge.h | ||
196 | index 025a130..bb21f5a 100644 | ||
197 | --- a/arch/powerpc/include/asm/pci-bridge.h | ||
198 | +++ b/arch/powerpc/include/asm/pci-bridge.h | ||
199 | @@ -154,6 +154,8 @@ struct pci_dn { | ||
200 | |||
201 | int pci_ext_config_space; /* for pci devices */ | ||
202 | |||
203 | + int force_32bit_msi:1; | ||
204 | + | ||
205 | struct pci_dev *pcidev; /* back-pointer to the pci device */ | ||
206 | #ifdef CONFIG_EEH | ||
207 | struct eeh_dev *edev; /* eeh device */ | ||
208 | diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c | ||
209 | index fa12ae4..9b315e5 100644 | ||
210 | --- a/arch/powerpc/kernel/pci-common.c | ||
211 | +++ b/arch/powerpc/kernel/pci-common.c | ||
212 | @@ -30,6 +30,7 @@ | ||
213 | #include <linux/irq.h> | ||
214 | #include <linux/vmalloc.h> | ||
215 | #include <linux/slab.h> | ||
216 | +#include <linux/vgaarb.h> | ||
217 | |||
218 | #include <asm/processor.h> | ||
219 | #include <asm/io.h> | ||
220 | @@ -844,6 +845,14 @@ int pci_proc_domain(struct pci_bus *bus) | ||
221 | return 1; | ||
222 | } | ||
223 | |||
224 | +int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) | ||
225 | +{ | ||
226 | + if (ppc_md.pcibios_root_bridge_prepare) | ||
227 | + return ppc_md.pcibios_root_bridge_prepare(bridge); | ||
228 | + | ||
229 | + return 0; | ||
230 | +} | ||
231 | + | ||
232 | /* This header fixup will do the resource fixup for all devices as they are | ||
233 | * probed, but not for bridge ranges | ||
234 | */ | ||
235 | @@ -1725,3 +1734,15 @@ static void fixup_hide_host_resource_fsl(struct pci_dev *dev) | ||
236 | } | ||
237 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MOTOROLA, PCI_ANY_ID, fixup_hide_host_resource_fsl); | ||
238 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, fixup_hide_host_resource_fsl); | ||
239 | + | ||
240 | +static void fixup_vga(struct pci_dev *pdev) | ||
241 | +{ | ||
242 | + u16 cmd; | ||
243 | + | ||
244 | + pci_read_config_word(pdev, PCI_COMMAND, &cmd); | ||
245 | + if ((cmd & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) || !vga_default_device()) | ||
246 | + vga_set_default_device(pdev); | ||
247 | + | ||
248 | +} | ||
249 | +DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID, | ||
250 | + PCI_CLASS_DISPLAY_VGA, 8, fixup_vga); | ||
251 | diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c | ||
252 | index 16e77a8..9600c36 100644 | ||
253 | --- a/arch/powerpc/kernel/process.c | ||
254 | +++ b/arch/powerpc/kernel/process.c | ||
255 | @@ -392,7 +392,8 @@ static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) | ||
256 | static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) | ||
257 | { | ||
258 | mtspr(SPRN_DABR, dabr); | ||
259 | - mtspr(SPRN_DABRX, dabrx); | ||
260 | + if (cpu_has_feature(CPU_FTR_DABRX)) | ||
261 | + mtspr(SPRN_DABRX, dabrx); | ||
262 | return 0; | ||
263 | } | ||
264 | #else | ||
265 | diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c | ||
266 | index 1c22b2d..29857c6 100644 | ||
267 | --- a/arch/powerpc/kernel/traps.c | ||
268 | +++ b/arch/powerpc/kernel/traps.c | ||
269 | @@ -1151,7 +1151,7 @@ void alignment_exception(struct pt_regs *regs) | ||
270 | local_irq_enable(); | ||
271 | |||
272 | if (tm_abort_check(regs, TM_CAUSE_ALIGNMENT | TM_CAUSE_PERSISTENT)) | ||
273 | - goto bail; | ||
274 | + return; | ||
275 | |||
276 | /* we don't implement logging of alignment exceptions */ | ||
277 | if (!(current->thread.align_ctl & PR_UNALIGN_SIGBUS)) | ||
278 | diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c | ||
279 | index 65362e9..9d858b0 100644 | ||
280 | --- a/arch/powerpc/perf/core-book3s.c | ||
281 | +++ b/arch/powerpc/perf/core-book3s.c | ||
282 | @@ -1528,7 +1528,7 @@ static void perf_event_interrupt(struct pt_regs *regs) | ||
283 | } | ||
284 | } | ||
285 | } | ||
286 | - if ((!found) && printk_ratelimit()) | ||
287 | + if (!found && !nmi && printk_ratelimit()) | ||
288 | printk(KERN_WARNING "Can't find PMC that caused IRQ\n"); | ||
289 | |||
290 | /* | ||
291 | diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c | ||
292 | index 19506f9..b456b15 100644 | ||
293 | --- a/arch/powerpc/platforms/pseries/eeh_pseries.c | ||
294 | +++ b/arch/powerpc/platforms/pseries/eeh_pseries.c | ||
295 | @@ -83,7 +83,11 @@ static int pseries_eeh_init(void) | ||
296 | ibm_configure_pe = rtas_token("ibm,configure-pe"); | ||
297 | ibm_configure_bridge = rtas_token("ibm,configure-bridge"); | ||
298 | |||
299 | - /* necessary sanity check */ | ||
300 | + /* | ||
301 | + * Necessary sanity check. We needn't check "get-config-addr-info" | ||
302 | + * and its variant since the old firmware probably support address | ||
303 | + * of domain/bus/slot/function for EEH RTAS operations. | ||
304 | + */ | ||
305 | if (ibm_set_eeh_option == RTAS_UNKNOWN_SERVICE) { | ||
306 | pr_warning("%s: RTAS service <ibm,set-eeh-option> invalid\n", | ||
307 | __func__); | ||
308 | @@ -102,12 +106,6 @@ static int pseries_eeh_init(void) | ||
309 | pr_warning("%s: RTAS service <ibm,slot-error-detail> invalid\n", | ||
310 | __func__); | ||
311 | return -EINVAL; | ||
312 | - } else if (ibm_get_config_addr_info2 == RTAS_UNKNOWN_SERVICE && | ||
313 | - ibm_get_config_addr_info == RTAS_UNKNOWN_SERVICE) { | ||
314 | - pr_warning("%s: RTAS service <ibm,get-config-addr-info2> and " | ||
315 | - "<ibm,get-config-addr-info> invalid\n", | ||
316 | - __func__); | ||
317 | - return -EINVAL; | ||
318 | } else if (ibm_configure_pe == RTAS_UNKNOWN_SERVICE && | ||
319 | ibm_configure_bridge == RTAS_UNKNOWN_SERVICE) { | ||
320 | pr_warning("%s: RTAS service <ibm,configure-pe> and " | ||
321 | diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c | ||
322 | index e5b0847..77b18a2 100644 | ||
323 | --- a/arch/powerpc/platforms/pseries/msi.c | ||
324 | +++ b/arch/powerpc/platforms/pseries/msi.c | ||
325 | @@ -24,6 +24,7 @@ static int query_token, change_token; | ||
326 | #define RTAS_RESET_FN 2 | ||
327 | #define RTAS_CHANGE_MSI_FN 3 | ||
328 | #define RTAS_CHANGE_MSIX_FN 4 | ||
329 | +#define RTAS_CHANGE_32MSI_FN 5 | ||
330 | |||
331 | static struct pci_dn *get_pdn(struct pci_dev *pdev) | ||
332 | { | ||
333 | @@ -58,7 +59,8 @@ static int rtas_change_msi(struct pci_dn *pdn, u32 func, u32 num_irqs) | ||
334 | |||
335 | seq_num = 1; | ||
336 | do { | ||
337 | - if (func == RTAS_CHANGE_MSI_FN || func == RTAS_CHANGE_MSIX_FN) | ||
338 | + if (func == RTAS_CHANGE_MSI_FN || func == RTAS_CHANGE_MSIX_FN || | ||
339 | + func == RTAS_CHANGE_32MSI_FN) | ||
340 | rc = rtas_call(change_token, 6, 4, rtas_ret, addr, | ||
341 | BUID_HI(buid), BUID_LO(buid), | ||
342 | func, num_irqs, seq_num); | ||
343 | @@ -392,6 +394,25 @@ static int check_msix_entries(struct pci_dev *pdev) | ||
344 | return 0; | ||
345 | } | ||
346 | |||
347 | +static void rtas_hack_32bit_msi_gen2(struct pci_dev *pdev) | ||
348 | +{ | ||
349 | + u32 addr_hi, addr_lo; | ||
350 | + int pos; | ||
351 | + | ||
352 | + /* | ||
353 | + * We should only get in here for IODA1 configs. This is based on the | ||
354 | + * fact that we using RTAS for MSIs, we don't have the 32 bit MSI RTAS | ||
355 | + * support, and we are in a PCIe Gen2 slot. | ||
356 | + */ | ||
357 | + dev_info(&pdev->dev, | ||
358 | + "rtas_msi: No 32 bit MSI firmware support, forcing 32 bit MSI\n"); | ||
359 | + pos = pci_find_capability(pdev, PCI_CAP_ID_MSI); | ||
360 | + pci_read_config_dword(pdev, pos + PCI_MSI_ADDRESS_HI, &addr_hi); | ||
361 | + addr_lo = 0xffff0000 | ((addr_hi >> (48 - 32)) << 4); | ||
362 | + pci_write_config_dword(pdev, pos + PCI_MSI_ADDRESS_LO, addr_lo); | ||
363 | + pci_write_config_dword(pdev, pos + PCI_MSI_ADDRESS_HI, 0); | ||
364 | +} | ||
365 | + | ||
366 | static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type) | ||
367 | { | ||
368 | struct pci_dn *pdn; | ||
369 | @@ -399,6 +420,7 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type) | ||
370 | struct msi_desc *entry; | ||
371 | struct msi_msg msg; | ||
372 | int nvec = nvec_in; | ||
373 | + int use_32bit_msi_hack = 0; | ||
374 | |||
375 | pdn = get_pdn(pdev); | ||
376 | if (!pdn) | ||
377 | @@ -426,12 +448,31 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type) | ||
378 | */ | ||
379 | again: | ||
380 | if (type == PCI_CAP_ID_MSI) { | ||
381 | - rc = rtas_change_msi(pdn, RTAS_CHANGE_MSI_FN, nvec); | ||
382 | + if (pdn->force_32bit_msi) { | ||
383 | + rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSI_FN, nvec); | ||
384 | + if (rc < 0) { | ||
385 | + /* | ||
386 | + * We only want to run the 32 bit MSI hack below if | ||
387 | + * the max bus speed is Gen2 speed | ||
388 | + */ | ||
389 | + if (pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) | ||
390 | + return rc; | ||
391 | + | ||
392 | + use_32bit_msi_hack = 1; | ||
393 | + } | ||
394 | + } else | ||
395 | + rc = -1; | ||
396 | + | ||
397 | + if (rc < 0) | ||
398 | + rc = rtas_change_msi(pdn, RTAS_CHANGE_MSI_FN, nvec); | ||
399 | |||
400 | if (rc < 0) { | ||
401 | pr_debug("rtas_msi: trying the old firmware call.\n"); | ||
402 | rc = rtas_change_msi(pdn, RTAS_CHANGE_FN, nvec); | ||
403 | } | ||
404 | + | ||
405 | + if (use_32bit_msi_hack && rc > 0) | ||
406 | + rtas_hack_32bit_msi_gen2(pdev); | ||
407 | } else | ||
408 | rc = rtas_change_msi(pdn, RTAS_CHANGE_MSIX_FN, nvec); | ||
409 | |||
410 | @@ -512,3 +553,13 @@ static int rtas_msi_init(void) | ||
411 | return 0; | ||
412 | } | ||
413 | arch_initcall(rtas_msi_init); | ||
414 | + | ||
415 | +static void quirk_radeon(struct pci_dev *dev) | ||
416 | +{ | ||
417 | + struct pci_dn *pdn = get_pdn(dev); | ||
418 | + | ||
419 | + if (pdn) | ||
420 | + pdn->force_32bit_msi = 1; | ||
421 | +} | ||
422 | +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x68f2, quirk_radeon); | ||
423 | +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0xaa68, quirk_radeon); | ||
424 | diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c | ||
425 | index 0b580f4..5f93856 100644 | ||
426 | --- a/arch/powerpc/platforms/pseries/pci.c | ||
427 | +++ b/arch/powerpc/platforms/pseries/pci.c | ||
428 | @@ -108,3 +108,56 @@ static void fixup_winbond_82c105(struct pci_dev* dev) | ||
429 | } | ||
430 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_WINBOND, PCI_DEVICE_ID_WINBOND_82C105, | ||
431 | fixup_winbond_82c105); | ||
432 | + | ||
433 | +int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) | ||
434 | +{ | ||
435 | + struct device_node *dn, *pdn; | ||
436 | + struct pci_bus *bus; | ||
437 | + const uint32_t *pcie_link_speed_stats; | ||
438 | + | ||
439 | + bus = bridge->bus; | ||
440 | + | ||
441 | + dn = pcibios_get_phb_of_node(bus); | ||
442 | + if (!dn) | ||
443 | + return 0; | ||
444 | + | ||
445 | + for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) { | ||
446 | + pcie_link_speed_stats = (const uint32_t *) of_get_property(pdn, | ||
447 | + "ibm,pcie-link-speed-stats", NULL); | ||
448 | + if (pcie_link_speed_stats) | ||
449 | + break; | ||
450 | + } | ||
451 | + | ||
452 | + of_node_put(pdn); | ||
453 | + | ||
454 | + if (!pcie_link_speed_stats) { | ||
455 | + pr_err("no ibm,pcie-link-speed-stats property\n"); | ||
456 | + return 0; | ||
457 | + } | ||
458 | + | ||
459 | + switch (pcie_link_speed_stats[0]) { | ||
460 | + case 0x01: | ||
461 | + bus->max_bus_speed = PCIE_SPEED_2_5GT; | ||
462 | + break; | ||
463 | + case 0x02: | ||
464 | + bus->max_bus_speed = PCIE_SPEED_5_0GT; | ||
465 | + break; | ||
466 | + default: | ||
467 | + bus->max_bus_speed = PCI_SPEED_UNKNOWN; | ||
468 | + break; | ||
469 | + } | ||
470 | + | ||
471 | + switch (pcie_link_speed_stats[1]) { | ||
472 | + case 0x01: | ||
473 | + bus->cur_bus_speed = PCIE_SPEED_2_5GT; | ||
474 | + break; | ||
475 | + case 0x02: | ||
476 | + bus->cur_bus_speed = PCIE_SPEED_5_0GT; | ||
477 | + break; | ||
478 | + default: | ||
479 | + bus->cur_bus_speed = PCI_SPEED_UNKNOWN; | ||
480 | + break; | ||
481 | + } | ||
482 | + | ||
483 | + return 0; | ||
484 | +} | ||
485 | diff --git a/arch/powerpc/platforms/pseries/pseries.h b/arch/powerpc/platforms/pseries/pseries.h | ||
486 | index 9a3dda0..b79393d 100644 | ||
487 | --- a/arch/powerpc/platforms/pseries/pseries.h | ||
488 | +++ b/arch/powerpc/platforms/pseries/pseries.h | ||
489 | @@ -60,4 +60,8 @@ extern int dlpar_detach_node(struct device_node *); | ||
490 | /* Snooze Delay, pseries_idle */ | ||
491 | DECLARE_PER_CPU(long, smt_snooze_delay); | ||
492 | |||
493 | +/* PCI root bridge prepare function override for pseries */ | ||
494 | +struct pci_host_bridge; | ||
495 | +int pseries_root_bridge_prepare(struct pci_host_bridge *bridge); | ||
496 | + | ||
497 | #endif /* _PSERIES_PSERIES_H */ | ||
498 | diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c | ||
499 | index 8bcc9ca..bf34cc9 100644 | ||
500 | --- a/arch/powerpc/platforms/pseries/setup.c | ||
501 | +++ b/arch/powerpc/platforms/pseries/setup.c | ||
502 | @@ -466,6 +466,8 @@ static void __init pSeries_setup_arch(void) | ||
503 | else | ||
504 | ppc_md.enable_pmcs = power4_enable_pmcs; | ||
505 | |||
506 | + ppc_md.pcibios_root_bridge_prepare = pseries_root_bridge_prepare; | ||
507 | + | ||
508 | if (firmware_has_feature(FW_FEATURE_SET_MODE)) { | ||
509 | long rc; | ||
510 | if ((rc = pSeries_enable_reloc_on_exc()) != H_SUCCESS) { | ||
511 | diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h | ||
512 | index fd80015..39a1c71 100644 | ||
513 | --- a/arch/s390/include/asm/pgtable.h | ||
514 | +++ b/arch/s390/include/asm/pgtable.h | ||
515 | @@ -1063,11 +1063,12 @@ static inline pte_t ptep_modify_prot_start(struct mm_struct *mm, | ||
516 | unsigned long address, | ||
517 | pte_t *ptep) | ||
518 | { | ||
519 | + pgste_t pgste; | ||
520 | pte_t pte; | ||
521 | |||
522 | mm->context.flush_mm = 1; | ||
523 | if (mm_has_pgste(mm)) | ||
524 | - pgste_get_lock(ptep); | ||
525 | + pgste = pgste_get_lock(ptep); | ||
526 | |||
527 | pte = *ptep; | ||
528 | if (!mm_exclusive(mm)) | ||
529 | diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c | ||
530 | index 901177d..1dc3d7c 100644 | ||
531 | --- a/arch/x86/pci/common.c | ||
532 | +++ b/arch/x86/pci/common.c | ||
533 | @@ -617,7 +617,9 @@ int pcibios_add_device(struct pci_dev *dev) | ||
534 | |||
535 | pa_data = boot_params.hdr.setup_data; | ||
536 | while (pa_data) { | ||
537 | - data = phys_to_virt(pa_data); | ||
538 | + data = ioremap(pa_data, sizeof(*rom)); | ||
539 | + if (!data) | ||
540 | + return -ENOMEM; | ||
541 | |||
542 | if (data->type == SETUP_PCI) { | ||
543 | rom = (struct pci_setup_rom *)data; | ||
544 | @@ -634,6 +636,7 @@ int pcibios_add_device(struct pci_dev *dev) | ||
545 | } | ||
546 | } | ||
547 | pa_data = data->next; | ||
548 | + iounmap(data); | ||
549 | } | ||
550 | return 0; | ||
551 | } | ||
552 | diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c | ||
553 | index 22c800a..96c4e85 100644 | ||
554 | --- a/arch/x86/xen/smp.c | ||
555 | +++ b/arch/x86/xen/smp.c | ||
556 | @@ -17,6 +17,7 @@ | ||
557 | #include <linux/slab.h> | ||
558 | #include <linux/smp.h> | ||
559 | #include <linux/irq_work.h> | ||
560 | +#include <linux/tick.h> | ||
561 | |||
562 | #include <asm/paravirt.h> | ||
563 | #include <asm/desc.h> | ||
564 | @@ -436,6 +437,13 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */ | ||
565 | play_dead_common(); | ||
566 | HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); | ||
567 | cpu_bringup(); | ||
568 | + /* | ||
569 | + * commit 4b0c0f294 (tick: Cleanup NOHZ per cpu data on cpu down) | ||
570 | + * clears certain data that the cpu_idle loop (which called us | ||
571 | + * and that we return from) expects. The only way to get that | ||
572 | + * data back is to call: | ||
573 | + */ | ||
574 | + tick_nohz_idle_enter(); | ||
575 | } | ||
576 | |||
577 | #else /* !CONFIG_HOTPLUG_CPU */ | ||
578 | diff --git a/drivers/acpi/device_pm.c b/drivers/acpi/device_pm.c | ||
579 | index 557e58d..391010a 100644 | ||
580 | --- a/drivers/acpi/device_pm.c | ||
581 | +++ b/drivers/acpi/device_pm.c | ||
582 | @@ -269,11 +269,13 @@ int acpi_bus_init_power(struct acpi_device *device) | ||
583 | if (result) | ||
584 | return result; | ||
585 | } else if (state == ACPI_STATE_UNKNOWN) { | ||
586 | - /* No power resources and missing _PSC? Try to force D0. */ | ||
587 | + /* | ||
588 | + * No power resources and missing _PSC? Cross fingers and make | ||
589 | + * it D0 in hope that this is what the BIOS put the device into. | ||
590 | + * [We tried to force D0 here by executing _PS0, but that broke | ||
591 | + * Toshiba P870-303 in a nasty way.] | ||
592 | + */ | ||
593 | state = ACPI_STATE_D0; | ||
594 | - result = acpi_dev_pm_explicit_set(device, state); | ||
595 | - if (result) | ||
596 | - return result; | ||
597 | } | ||
598 | device->power.state = state; | ||
599 | return 0; | ||
600 | diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c | ||
601 | index 313f959..81a9335 100644 | ||
602 | --- a/drivers/acpi/video.c | ||
603 | +++ b/drivers/acpi/video.c | ||
604 | @@ -447,6 +447,22 @@ static struct dmi_system_id video_dmi_table[] __initdata = { | ||
605 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Folio 13 - 2000 Notebook PC"), | ||
606 | }, | ||
607 | }, | ||
608 | + { | ||
609 | + .callback = video_ignore_initial_backlight, | ||
610 | + .ident = "HP Pavilion g6 Notebook PC", | ||
611 | + .matches = { | ||
612 | + DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
613 | + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"), | ||
614 | + }, | ||
615 | + }, | ||
616 | + { | ||
617 | + .callback = video_ignore_initial_backlight, | ||
618 | + .ident = "HP Pavilion m4", | ||
619 | + .matches = { | ||
620 | + DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
621 | + DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"), | ||
622 | + }, | ||
623 | + }, | ||
624 | {} | ||
625 | }; | ||
626 | |||
627 | diff --git a/drivers/cpufreq/acpi-cpufreq.c b/drivers/cpufreq/acpi-cpufreq.c | ||
628 | index 57a8774..bb5939b 100644 | ||
629 | --- a/drivers/cpufreq/acpi-cpufreq.c | ||
630 | +++ b/drivers/cpufreq/acpi-cpufreq.c | ||
631 | @@ -347,11 +347,11 @@ static u32 get_cur_val(const struct cpumask *mask) | ||
632 | switch (per_cpu(acfreq_data, cpumask_first(mask))->cpu_feature) { | ||
633 | case SYSTEM_INTEL_MSR_CAPABLE: | ||
634 | cmd.type = SYSTEM_INTEL_MSR_CAPABLE; | ||
635 | - cmd.addr.msr.reg = MSR_IA32_PERF_STATUS; | ||
636 | + cmd.addr.msr.reg = MSR_IA32_PERF_CTL; | ||
637 | break; | ||
638 | case SYSTEM_AMD_MSR_CAPABLE: | ||
639 | cmd.type = SYSTEM_AMD_MSR_CAPABLE; | ||
640 | - cmd.addr.msr.reg = MSR_AMD_PERF_STATUS; | ||
641 | + cmd.addr.msr.reg = MSR_AMD_PERF_CTL; | ||
642 | break; | ||
643 | case SYSTEM_IO_CAPABLE: | ||
644 | cmd.type = SYSTEM_IO_CAPABLE; | ||
645 | diff --git a/drivers/dma/ste_dma40.c b/drivers/dma/ste_dma40.c | ||
646 | index 1734fee..71bf4ec 100644 | ||
647 | --- a/drivers/dma/ste_dma40.c | ||
648 | +++ b/drivers/dma/ste_dma40.c | ||
649 | @@ -1566,10 +1566,12 @@ static void dma_tc_handle(struct d40_chan *d40c) | ||
650 | return; | ||
651 | } | ||
652 | |||
653 | - if (d40_queue_start(d40c) == NULL) | ||
654 | + if (d40_queue_start(d40c) == NULL) { | ||
655 | d40c->busy = false; | ||
656 | - pm_runtime_mark_last_busy(d40c->base->dev); | ||
657 | - pm_runtime_put_autosuspend(d40c->base->dev); | ||
658 | + | ||
659 | + pm_runtime_mark_last_busy(d40c->base->dev); | ||
660 | + pm_runtime_put_autosuspend(d40c->base->dev); | ||
661 | + } | ||
662 | |||
663 | d40_desc_remove(d40d); | ||
664 | d40_desc_done(d40c, d40d); | ||
665 | diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c | ||
666 | index a6a8643..8bcce78 100644 | ||
667 | --- a/drivers/gpu/drm/drm_irq.c | ||
668 | +++ b/drivers/gpu/drm/drm_irq.c | ||
669 | @@ -1054,7 +1054,7 @@ EXPORT_SYMBOL(drm_vblank_off); | ||
670 | */ | ||
671 | void drm_vblank_pre_modeset(struct drm_device *dev, int crtc) | ||
672 | { | ||
673 | - /* vblank is not initialized (IRQ not installed ?) */ | ||
674 | + /* vblank is not initialized (IRQ not installed ?), or has been freed */ | ||
675 | if (!dev->num_crtcs) | ||
676 | return; | ||
677 | /* | ||
678 | @@ -1076,6 +1076,10 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc) | ||
679 | { | ||
680 | unsigned long irqflags; | ||
681 | |||
682 | + /* vblank is not initialized (IRQ not installed ?), or has been freed */ | ||
683 | + if (!dev->num_crtcs) | ||
684 | + return; | ||
685 | + | ||
686 | if (dev->vblank_inmodeset[crtc]) { | ||
687 | spin_lock_irqsave(&dev->vbl_lock, irqflags); | ||
688 | dev->vblank_disable_allowed = 1; | ||
689 | diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c | ||
690 | index 2590cac..8d07078 100644 | ||
691 | --- a/drivers/gpu/drm/gma500/framebuffer.c | ||
692 | +++ b/drivers/gpu/drm/gma500/framebuffer.c | ||
693 | @@ -772,8 +772,8 @@ void psb_modeset_init(struct drm_device *dev) | ||
694 | for (i = 0; i < dev_priv->num_pipe; i++) | ||
695 | psb_intel_crtc_init(dev, i, mode_dev); | ||
696 | |||
697 | - dev->mode_config.max_width = 2048; | ||
698 | - dev->mode_config.max_height = 2048; | ||
699 | + dev->mode_config.max_width = 4096; | ||
700 | + dev->mode_config.max_height = 4096; | ||
701 | |||
702 | psb_setup_outputs(dev); | ||
703 | |||
704 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c | ||
705 | index 73cb479..db2cff3 100644 | ||
706 | --- a/drivers/gpu/drm/i915/i915_gem.c | ||
707 | +++ b/drivers/gpu/drm/i915/i915_gem.c | ||
708 | @@ -91,14 +91,11 @@ i915_gem_wait_for_error(struct i915_gpu_error *error) | ||
709 | { | ||
710 | int ret; | ||
711 | |||
712 | -#define EXIT_COND (!i915_reset_in_progress(error)) | ||
713 | +#define EXIT_COND (!i915_reset_in_progress(error) || \ | ||
714 | + i915_terminally_wedged(error)) | ||
715 | if (EXIT_COND) | ||
716 | return 0; | ||
717 | |||
718 | - /* GPU is already declared terminally dead, give up. */ | ||
719 | - if (i915_terminally_wedged(error)) | ||
720 | - return -EIO; | ||
721 | - | ||
722 | /* | ||
723 | * Only wait 10 seconds for the gpu reset to complete to avoid hanging | ||
724 | * userspace. If it takes that long something really bad is going on and | ||
725 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | ||
726 | index c2d173a..2ab65b4 100644 | ||
727 | --- a/drivers/gpu/drm/i915/intel_display.c | ||
728 | +++ b/drivers/gpu/drm/i915/intel_display.c | ||
729 | @@ -7960,6 +7960,21 @@ static void intel_set_config_restore_state(struct drm_device *dev, | ||
730 | } | ||
731 | } | ||
732 | |||
733 | +static bool | ||
734 | +is_crtc_connector_off(struct drm_crtc *crtc, struct drm_connector *connectors, | ||
735 | + int num_connectors) | ||
736 | +{ | ||
737 | + int i; | ||
738 | + | ||
739 | + for (i = 0; i < num_connectors; i++) | ||
740 | + if (connectors[i].encoder && | ||
741 | + connectors[i].encoder->crtc == crtc && | ||
742 | + connectors[i].dpms != DRM_MODE_DPMS_ON) | ||
743 | + return true; | ||
744 | + | ||
745 | + return false; | ||
746 | +} | ||
747 | + | ||
748 | static void | ||
749 | intel_set_config_compute_mode_changes(struct drm_mode_set *set, | ||
750 | struct intel_set_config *config) | ||
751 | @@ -7967,7 +7982,11 @@ intel_set_config_compute_mode_changes(struct drm_mode_set *set, | ||
752 | |||
753 | /* We should be able to check here if the fb has the same properties | ||
754 | * and then just flip_or_move it */ | ||
755 | - if (set->crtc->fb != set->fb) { | ||
756 | + if (set->connectors != NULL && | ||
757 | + is_crtc_connector_off(set->crtc, *set->connectors, | ||
758 | + set->num_connectors)) { | ||
759 | + config->mode_changed = true; | ||
760 | + } else if (set->crtc->fb != set->fb) { | ||
761 | /* If we have no fb then treat it as a full mode set */ | ||
762 | if (set->crtc->fb == NULL) { | ||
763 | DRM_DEBUG_KMS("crtc has no fb, full mode set\n"); | ||
764 | @@ -7979,8 +7998,9 @@ intel_set_config_compute_mode_changes(struct drm_mode_set *set, | ||
765 | } else if (set->fb->bits_per_pixel != | ||
766 | set->crtc->fb->bits_per_pixel) { | ||
767 | config->mode_changed = true; | ||
768 | - } else | ||
769 | + } else { | ||
770 | config->fb_changed = true; | ||
771 | + } | ||
772 | } | ||
773 | |||
774 | if (set->fb && (set->x != set->crtc->x || set->y != set->crtc->y)) | ||
775 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c | ||
776 | index e0d6985..e2ca9c1 100644 | ||
777 | --- a/drivers/gpu/drm/i915/intel_lvds.c | ||
778 | +++ b/drivers/gpu/drm/i915/intel_lvds.c | ||
779 | @@ -803,10 +803,10 @@ static const struct dmi_system_id intel_no_lvds[] = { | ||
780 | }, | ||
781 | { | ||
782 | .callback = intel_no_lvds_dmi_callback, | ||
783 | - .ident = "Hewlett-Packard HP t5740e Thin Client", | ||
784 | + .ident = "Hewlett-Packard HP t5740", | ||
785 | .matches = { | ||
786 | DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"), | ||
787 | - DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"), | ||
788 | + DMI_MATCH(DMI_PRODUCT_NAME, " t5740"), | ||
789 | }, | ||
790 | }, | ||
791 | { | ||
792 | diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c | ||
793 | index d6df786..cdd78ca 100644 | ||
794 | --- a/drivers/gpu/drm/i915/intel_sdvo.c | ||
795 | +++ b/drivers/gpu/drm/i915/intel_sdvo.c | ||
796 | @@ -1770,7 +1770,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector) | ||
797 | * Assume that the preferred modes are | ||
798 | * arranged in priority order. | ||
799 | */ | ||
800 | - intel_ddc_get_modes(connector, intel_sdvo->i2c); | ||
801 | + intel_ddc_get_modes(connector, &intel_sdvo->ddc); | ||
802 | if (list_empty(&connector->probed_modes) == false) | ||
803 | goto end; | ||
804 | |||
805 | diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c | ||
806 | index 713dd70..407e257 100644 | ||
807 | --- a/drivers/gpu/drm/mgag200/mgag200_mode.c | ||
808 | +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c | ||
809 | @@ -1041,13 +1041,14 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc, | ||
810 | else | ||
811 | hi_pri_lvl = 5; | ||
812 | |||
813 | - WREG8(0x1fde, 0x06); | ||
814 | - WREG8(0x1fdf, hi_pri_lvl); | ||
815 | + WREG8(MGAREG_CRTCEXT_INDEX, 0x06); | ||
816 | + WREG8(MGAREG_CRTCEXT_DATA, hi_pri_lvl); | ||
817 | } else { | ||
818 | + WREG8(MGAREG_CRTCEXT_INDEX, 0x06); | ||
819 | if (mdev->reg_1e24 >= 0x01) | ||
820 | - WREG8(0x1fdf, 0x03); | ||
821 | + WREG8(MGAREG_CRTCEXT_DATA, 0x03); | ||
822 | else | ||
823 | - WREG8(0x1fdf, 0x04); | ||
824 | + WREG8(MGAREG_CRTCEXT_DATA, 0x04); | ||
825 | } | ||
826 | } | ||
827 | return 0; | ||
828 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
829 | index 4552d4a..6cf2b52 100644 | ||
830 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c | ||
831 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
832 | @@ -667,6 +667,8 @@ atombios_digital_setup(struct drm_encoder *encoder, int action) | ||
833 | int | ||
834 | atombios_get_encoder_mode(struct drm_encoder *encoder) | ||
835 | { | ||
836 | + struct drm_device *dev = encoder->dev; | ||
837 | + struct radeon_device *rdev = dev->dev_private; | ||
838 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
839 | struct drm_connector *connector; | ||
840 | struct radeon_connector *radeon_connector; | ||
841 | @@ -693,7 +695,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | ||
842 | case DRM_MODE_CONNECTOR_DVII: | ||
843 | case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ | ||
844 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && | ||
845 | - radeon_audio) | ||
846 | + radeon_audio && | ||
847 | + !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||
848 | return ATOM_ENCODER_MODE_HDMI; | ||
849 | else if (radeon_connector->use_digital) | ||
850 | return ATOM_ENCODER_MODE_DVI; | ||
851 | @@ -704,7 +707,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | ||
852 | case DRM_MODE_CONNECTOR_HDMIA: | ||
853 | default: | ||
854 | if (drm_detect_hdmi_monitor(radeon_connector->edid) && | ||
855 | - radeon_audio) | ||
856 | + radeon_audio && | ||
857 | + !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||
858 | return ATOM_ENCODER_MODE_HDMI; | ||
859 | else | ||
860 | return ATOM_ENCODER_MODE_DVI; | ||
861 | @@ -718,7 +722,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | ||
862 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) | ||
863 | return ATOM_ENCODER_MODE_DP; | ||
864 | else if (drm_detect_hdmi_monitor(radeon_connector->edid) && | ||
865 | - radeon_audio) | ||
866 | + radeon_audio && | ||
867 | + !ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */ | ||
868 | return ATOM_ENCODER_MODE_HDMI; | ||
869 | else | ||
870 | return ATOM_ENCODER_MODE_DVI; | ||
871 | diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c | ||
872 | index 0ea6bdf..f8e36ac 100644 | ||
873 | --- a/drivers/gpu/drm/radeon/evergreen.c | ||
874 | +++ b/drivers/gpu/drm/radeon/evergreen.c | ||
875 | @@ -3728,6 +3728,12 @@ static int evergreen_startup(struct radeon_device *rdev) | ||
876 | } | ||
877 | |||
878 | /* Enable IRQ */ | ||
879 | + if (!rdev->irq.installed) { | ||
880 | + r = radeon_irq_kms_init(rdev); | ||
881 | + if (r) | ||
882 | + return r; | ||
883 | + } | ||
884 | + | ||
885 | r = r600_irq_init(rdev); | ||
886 | if (r) { | ||
887 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | ||
888 | @@ -3876,10 +3882,6 @@ int evergreen_init(struct radeon_device *rdev) | ||
889 | if (r) | ||
890 | return r; | ||
891 | |||
892 | - r = radeon_irq_kms_init(rdev); | ||
893 | - if (r) | ||
894 | - return r; | ||
895 | - | ||
896 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | ||
897 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | ||
898 | |||
899 | @@ -3944,8 +3946,7 @@ void evergreen_fini(struct radeon_device *rdev) | ||
900 | |||
901 | void evergreen_pcie_gen2_enable(struct radeon_device *rdev) | ||
902 | { | ||
903 | - u32 link_width_cntl, speed_cntl, mask; | ||
904 | - int ret; | ||
905 | + u32 link_width_cntl, speed_cntl; | ||
906 | |||
907 | if (radeon_pcie_gen2 == 0) | ||
908 | return; | ||
909 | @@ -3960,11 +3961,8 @@ void evergreen_pcie_gen2_enable(struct radeon_device *rdev) | ||
910 | if (ASIC_IS_X2(rdev)) | ||
911 | return; | ||
912 | |||
913 | - ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); | ||
914 | - if (ret != 0) | ||
915 | - return; | ||
916 | - | ||
917 | - if (!(mask & DRM_PCIE_SPEED_50)) | ||
918 | + if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && | ||
919 | + (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT)) | ||
920 | return; | ||
921 | |||
922 | speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); | ||
923 | diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c | ||
924 | index 0a32d89..d7968b8 100644 | ||
925 | --- a/drivers/gpu/drm/radeon/ni.c | ||
926 | +++ b/drivers/gpu/drm/radeon/ni.c | ||
927 | @@ -1711,6 +1711,12 @@ static int cayman_startup(struct radeon_device *rdev) | ||
928 | } | ||
929 | |||
930 | /* Enable IRQ */ | ||
931 | + if (!rdev->irq.installed) { | ||
932 | + r = radeon_irq_kms_init(rdev); | ||
933 | + if (r) | ||
934 | + return r; | ||
935 | + } | ||
936 | + | ||
937 | r = r600_irq_init(rdev); | ||
938 | if (r) { | ||
939 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | ||
940 | @@ -1857,10 +1863,6 @@ int cayman_init(struct radeon_device *rdev) | ||
941 | if (r) | ||
942 | return r; | ||
943 | |||
944 | - r = radeon_irq_kms_init(rdev); | ||
945 | - if (r) | ||
946 | - return r; | ||
947 | - | ||
948 | ring->ring_obj = NULL; | ||
949 | r600_ring_init(rdev, ring, 1024 * 1024); | ||
950 | |||
951 | diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c | ||
952 | index 4973bff..d0314ec 100644 | ||
953 | --- a/drivers/gpu/drm/radeon/r100.c | ||
954 | +++ b/drivers/gpu/drm/radeon/r100.c | ||
955 | @@ -3869,6 +3869,12 @@ static int r100_startup(struct radeon_device *rdev) | ||
956 | } | ||
957 | |||
958 | /* Enable IRQ */ | ||
959 | + if (!rdev->irq.installed) { | ||
960 | + r = radeon_irq_kms_init(rdev); | ||
961 | + if (r) | ||
962 | + return r; | ||
963 | + } | ||
964 | + | ||
965 | r100_irq_set(rdev); | ||
966 | rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
967 | /* 1M ring buffer */ | ||
968 | @@ -4024,9 +4030,6 @@ int r100_init(struct radeon_device *rdev) | ||
969 | r = radeon_fence_driver_init(rdev); | ||
970 | if (r) | ||
971 | return r; | ||
972 | - r = radeon_irq_kms_init(rdev); | ||
973 | - if (r) | ||
974 | - return r; | ||
975 | /* Memory manager */ | ||
976 | r = radeon_bo_init(rdev); | ||
977 | if (r) | ||
978 | diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c | ||
979 | index c60350e..b9b776f 100644 | ||
980 | --- a/drivers/gpu/drm/radeon/r300.c | ||
981 | +++ b/drivers/gpu/drm/radeon/r300.c | ||
982 | @@ -1382,6 +1382,12 @@ static int r300_startup(struct radeon_device *rdev) | ||
983 | } | ||
984 | |||
985 | /* Enable IRQ */ | ||
986 | + if (!rdev->irq.installed) { | ||
987 | + r = radeon_irq_kms_init(rdev); | ||
988 | + if (r) | ||
989 | + return r; | ||
990 | + } | ||
991 | + | ||
992 | r100_irq_set(rdev); | ||
993 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
994 | /* 1M ring buffer */ | ||
995 | @@ -1516,9 +1522,6 @@ int r300_init(struct radeon_device *rdev) | ||
996 | r = radeon_fence_driver_init(rdev); | ||
997 | if (r) | ||
998 | return r; | ||
999 | - r = radeon_irq_kms_init(rdev); | ||
1000 | - if (r) | ||
1001 | - return r; | ||
1002 | /* Memory manager */ | ||
1003 | r = radeon_bo_init(rdev); | ||
1004 | if (r) | ||
1005 | diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c | ||
1006 | index 6fce2eb..4e796ec 100644 | ||
1007 | --- a/drivers/gpu/drm/radeon/r420.c | ||
1008 | +++ b/drivers/gpu/drm/radeon/r420.c | ||
1009 | @@ -265,6 +265,12 @@ static int r420_startup(struct radeon_device *rdev) | ||
1010 | } | ||
1011 | |||
1012 | /* Enable IRQ */ | ||
1013 | + if (!rdev->irq.installed) { | ||
1014 | + r = radeon_irq_kms_init(rdev); | ||
1015 | + if (r) | ||
1016 | + return r; | ||
1017 | + } | ||
1018 | + | ||
1019 | r100_irq_set(rdev); | ||
1020 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
1021 | /* 1M ring buffer */ | ||
1022 | @@ -411,10 +417,6 @@ int r420_init(struct radeon_device *rdev) | ||
1023 | if (r) { | ||
1024 | return r; | ||
1025 | } | ||
1026 | - r = radeon_irq_kms_init(rdev); | ||
1027 | - if (r) { | ||
1028 | - return r; | ||
1029 | - } | ||
1030 | /* Memory manager */ | ||
1031 | r = radeon_bo_init(rdev); | ||
1032 | if (r) { | ||
1033 | diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c | ||
1034 | index f795a4e..e1aece7 100644 | ||
1035 | --- a/drivers/gpu/drm/radeon/r520.c | ||
1036 | +++ b/drivers/gpu/drm/radeon/r520.c | ||
1037 | @@ -194,6 +194,12 @@ static int r520_startup(struct radeon_device *rdev) | ||
1038 | } | ||
1039 | |||
1040 | /* Enable IRQ */ | ||
1041 | + if (!rdev->irq.installed) { | ||
1042 | + r = radeon_irq_kms_init(rdev); | ||
1043 | + if (r) | ||
1044 | + return r; | ||
1045 | + } | ||
1046 | + | ||
1047 | rs600_irq_set(rdev); | ||
1048 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
1049 | /* 1M ring buffer */ | ||
1050 | @@ -297,9 +303,6 @@ int r520_init(struct radeon_device *rdev) | ||
1051 | r = radeon_fence_driver_init(rdev); | ||
1052 | if (r) | ||
1053 | return r; | ||
1054 | - r = radeon_irq_kms_init(rdev); | ||
1055 | - if (r) | ||
1056 | - return r; | ||
1057 | /* Memory manager */ | ||
1058 | r = radeon_bo_init(rdev); | ||
1059 | if (r) | ||
1060 | diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c | ||
1061 | index 0740db3..bac1e2ac 100644 | ||
1062 | --- a/drivers/gpu/drm/radeon/r600.c | ||
1063 | +++ b/drivers/gpu/drm/radeon/r600.c | ||
1064 | @@ -2940,6 +2940,12 @@ static int r600_startup(struct radeon_device *rdev) | ||
1065 | } | ||
1066 | |||
1067 | /* Enable IRQ */ | ||
1068 | + if (!rdev->irq.installed) { | ||
1069 | + r = radeon_irq_kms_init(rdev); | ||
1070 | + if (r) | ||
1071 | + return r; | ||
1072 | + } | ||
1073 | + | ||
1074 | r = r600_irq_init(rdev); | ||
1075 | if (r) { | ||
1076 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | ||
1077 | @@ -3094,10 +3100,6 @@ int r600_init(struct radeon_device *rdev) | ||
1078 | if (r) | ||
1079 | return r; | ||
1080 | |||
1081 | - r = radeon_irq_kms_init(rdev); | ||
1082 | - if (r) | ||
1083 | - return r; | ||
1084 | - | ||
1085 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | ||
1086 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | ||
1087 | |||
1088 | @@ -4351,8 +4353,6 @@ static void r600_pcie_gen2_enable(struct radeon_device *rdev) | ||
1089 | { | ||
1090 | u32 link_width_cntl, lanes, speed_cntl, training_cntl, tmp; | ||
1091 | u16 link_cntl2; | ||
1092 | - u32 mask; | ||
1093 | - int ret; | ||
1094 | |||
1095 | if (radeon_pcie_gen2 == 0) | ||
1096 | return; | ||
1097 | @@ -4371,11 +4371,8 @@ static void r600_pcie_gen2_enable(struct radeon_device *rdev) | ||
1098 | if (rdev->family <= CHIP_R600) | ||
1099 | return; | ||
1100 | |||
1101 | - ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); | ||
1102 | - if (ret != 0) | ||
1103 | - return; | ||
1104 | - | ||
1105 | - if (!(mask & DRM_PCIE_SPEED_50)) | ||
1106 | + if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && | ||
1107 | + (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT)) | ||
1108 | return; | ||
1109 | |||
1110 | speed_cntl = RREG32_PCIE_P(PCIE_LC_SPEED_CNTL); | ||
1111 | diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c | ||
1112 | index 73051ce..233a9b9 100644 | ||
1113 | --- a/drivers/gpu/drm/radeon/rs400.c | ||
1114 | +++ b/drivers/gpu/drm/radeon/rs400.c | ||
1115 | @@ -417,6 +417,12 @@ static int rs400_startup(struct radeon_device *rdev) | ||
1116 | } | ||
1117 | |||
1118 | /* Enable IRQ */ | ||
1119 | + if (!rdev->irq.installed) { | ||
1120 | + r = radeon_irq_kms_init(rdev); | ||
1121 | + if (r) | ||
1122 | + return r; | ||
1123 | + } | ||
1124 | + | ||
1125 | r100_irq_set(rdev); | ||
1126 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
1127 | /* 1M ring buffer */ | ||
1128 | @@ -535,9 +541,6 @@ int rs400_init(struct radeon_device *rdev) | ||
1129 | r = radeon_fence_driver_init(rdev); | ||
1130 | if (r) | ||
1131 | return r; | ||
1132 | - r = radeon_irq_kms_init(rdev); | ||
1133 | - if (r) | ||
1134 | - return r; | ||
1135 | /* Memory manager */ | ||
1136 | r = radeon_bo_init(rdev); | ||
1137 | if (r) | ||
1138 | diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c | ||
1139 | index 46fa1b0..670b555 100644 | ||
1140 | --- a/drivers/gpu/drm/radeon/rs600.c | ||
1141 | +++ b/drivers/gpu/drm/radeon/rs600.c | ||
1142 | @@ -923,6 +923,12 @@ static int rs600_startup(struct radeon_device *rdev) | ||
1143 | } | ||
1144 | |||
1145 | /* Enable IRQ */ | ||
1146 | + if (!rdev->irq.installed) { | ||
1147 | + r = radeon_irq_kms_init(rdev); | ||
1148 | + if (r) | ||
1149 | + return r; | ||
1150 | + } | ||
1151 | + | ||
1152 | rs600_irq_set(rdev); | ||
1153 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
1154 | /* 1M ring buffer */ | ||
1155 | @@ -1047,9 +1053,6 @@ int rs600_init(struct radeon_device *rdev) | ||
1156 | r = radeon_fence_driver_init(rdev); | ||
1157 | if (r) | ||
1158 | return r; | ||
1159 | - r = radeon_irq_kms_init(rdev); | ||
1160 | - if (r) | ||
1161 | - return r; | ||
1162 | /* Memory manager */ | ||
1163 | r = radeon_bo_init(rdev); | ||
1164 | if (r) | ||
1165 | diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c | ||
1166 | index 5706d2a..fad6633 100644 | ||
1167 | --- a/drivers/gpu/drm/radeon/rs690.c | ||
1168 | +++ b/drivers/gpu/drm/radeon/rs690.c | ||
1169 | @@ -628,6 +628,12 @@ static int rs690_startup(struct radeon_device *rdev) | ||
1170 | } | ||
1171 | |||
1172 | /* Enable IRQ */ | ||
1173 | + if (!rdev->irq.installed) { | ||
1174 | + r = radeon_irq_kms_init(rdev); | ||
1175 | + if (r) | ||
1176 | + return r; | ||
1177 | + } | ||
1178 | + | ||
1179 | rs600_irq_set(rdev); | ||
1180 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
1181 | /* 1M ring buffer */ | ||
1182 | @@ -753,9 +759,6 @@ int rs690_init(struct radeon_device *rdev) | ||
1183 | r = radeon_fence_driver_init(rdev); | ||
1184 | if (r) | ||
1185 | return r; | ||
1186 | - r = radeon_irq_kms_init(rdev); | ||
1187 | - if (r) | ||
1188 | - return r; | ||
1189 | /* Memory manager */ | ||
1190 | r = radeon_bo_init(rdev); | ||
1191 | if (r) | ||
1192 | diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c | ||
1193 | index ffcba73..21c7d7b 100644 | ||
1194 | --- a/drivers/gpu/drm/radeon/rv515.c | ||
1195 | +++ b/drivers/gpu/drm/radeon/rv515.c | ||
1196 | @@ -532,6 +532,12 @@ static int rv515_startup(struct radeon_device *rdev) | ||
1197 | } | ||
1198 | |||
1199 | /* Enable IRQ */ | ||
1200 | + if (!rdev->irq.installed) { | ||
1201 | + r = radeon_irq_kms_init(rdev); | ||
1202 | + if (r) | ||
1203 | + return r; | ||
1204 | + } | ||
1205 | + | ||
1206 | rs600_irq_set(rdev); | ||
1207 | rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); | ||
1208 | /* 1M ring buffer */ | ||
1209 | @@ -662,9 +668,6 @@ int rv515_init(struct radeon_device *rdev) | ||
1210 | r = radeon_fence_driver_init(rdev); | ||
1211 | if (r) | ||
1212 | return r; | ||
1213 | - r = radeon_irq_kms_init(rdev); | ||
1214 | - if (r) | ||
1215 | - return r; | ||
1216 | /* Memory manager */ | ||
1217 | r = radeon_bo_init(rdev); | ||
1218 | if (r) | ||
1219 | diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c | ||
1220 | index d63fe1d..c872d2b 100644 | ||
1221 | --- a/drivers/gpu/drm/radeon/rv770.c | ||
1222 | +++ b/drivers/gpu/drm/radeon/rv770.c | ||
1223 | @@ -1041,6 +1041,12 @@ static int rv770_startup(struct radeon_device *rdev) | ||
1224 | } | ||
1225 | |||
1226 | /* Enable IRQ */ | ||
1227 | + if (!rdev->irq.installed) { | ||
1228 | + r = radeon_irq_kms_init(rdev); | ||
1229 | + if (r) | ||
1230 | + return r; | ||
1231 | + } | ||
1232 | + | ||
1233 | r = r600_irq_init(rdev); | ||
1234 | if (r) { | ||
1235 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | ||
1236 | @@ -1180,10 +1186,6 @@ int rv770_init(struct radeon_device *rdev) | ||
1237 | if (r) | ||
1238 | return r; | ||
1239 | |||
1240 | - r = radeon_irq_kms_init(rdev); | ||
1241 | - if (r) | ||
1242 | - return r; | ||
1243 | - | ||
1244 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | ||
1245 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | ||
1246 | |||
1247 | @@ -1238,8 +1240,6 @@ static void rv770_pcie_gen2_enable(struct radeon_device *rdev) | ||
1248 | { | ||
1249 | u32 link_width_cntl, lanes, speed_cntl, tmp; | ||
1250 | u16 link_cntl2; | ||
1251 | - u32 mask; | ||
1252 | - int ret; | ||
1253 | |||
1254 | if (radeon_pcie_gen2 == 0) | ||
1255 | return; | ||
1256 | @@ -1254,11 +1254,8 @@ static void rv770_pcie_gen2_enable(struct radeon_device *rdev) | ||
1257 | if (ASIC_IS_X2(rdev)) | ||
1258 | return; | ||
1259 | |||
1260 | - ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); | ||
1261 | - if (ret != 0) | ||
1262 | - return; | ||
1263 | - | ||
1264 | - if (!(mask & DRM_PCIE_SPEED_50)) | ||
1265 | + if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && | ||
1266 | + (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT)) | ||
1267 | return; | ||
1268 | |||
1269 | DRM_INFO("enabling PCIE gen 2 link speeds, disable with radeon.pcie_gen2=0\n"); | ||
1270 | diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c | ||
1271 | index aefefd5..a964a96 100644 | ||
1272 | --- a/drivers/gpu/drm/radeon/si.c | ||
1273 | +++ b/drivers/gpu/drm/radeon/si.c | ||
1274 | @@ -4374,6 +4374,12 @@ static int si_startup(struct radeon_device *rdev) | ||
1275 | } | ||
1276 | |||
1277 | /* Enable IRQ */ | ||
1278 | + if (!rdev->irq.installed) { | ||
1279 | + r = radeon_irq_kms_init(rdev); | ||
1280 | + if (r) | ||
1281 | + return r; | ||
1282 | + } | ||
1283 | + | ||
1284 | r = si_irq_init(rdev); | ||
1285 | if (r) { | ||
1286 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | ||
1287 | @@ -4534,10 +4540,6 @@ int si_init(struct radeon_device *rdev) | ||
1288 | if (r) | ||
1289 | return r; | ||
1290 | |||
1291 | - r = radeon_irq_kms_init(rdev); | ||
1292 | - if (r) | ||
1293 | - return r; | ||
1294 | - | ||
1295 | ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; | ||
1296 | ring->ring_obj = NULL; | ||
1297 | r600_ring_init(rdev, ring, 1024 * 1024); | ||
1298 | diff --git a/drivers/hwmon/adm1021.c b/drivers/hwmon/adm1021.c | ||
1299 | index 71bcba8a..1468be8 100644 | ||
1300 | --- a/drivers/hwmon/adm1021.c | ||
1301 | +++ b/drivers/hwmon/adm1021.c | ||
1302 | @@ -332,26 +332,68 @@ static int adm1021_detect(struct i2c_client *client, | ||
1303 | man_id = i2c_smbus_read_byte_data(client, ADM1021_REG_MAN_ID); | ||
1304 | dev_id = i2c_smbus_read_byte_data(client, ADM1021_REG_DEV_ID); | ||
1305 | |||
1306 | + if (man_id < 0 || dev_id < 0) | ||
1307 | + return -ENODEV; | ||
1308 | + | ||
1309 | if (man_id == 0x4d && dev_id == 0x01) | ||
1310 | type_name = "max1617a"; | ||
1311 | else if (man_id == 0x41) { | ||
1312 | if ((dev_id & 0xF0) == 0x30) | ||
1313 | type_name = "adm1023"; | ||
1314 | - else | ||
1315 | + else if ((dev_id & 0xF0) == 0x00) | ||
1316 | type_name = "adm1021"; | ||
1317 | + else | ||
1318 | + return -ENODEV; | ||
1319 | } else if (man_id == 0x49) | ||
1320 | type_name = "thmc10"; | ||
1321 | else if (man_id == 0x23) | ||
1322 | type_name = "gl523sm"; | ||
1323 | else if (man_id == 0x54) | ||
1324 | type_name = "mc1066"; | ||
1325 | - /* LM84 Mfr ID in a different place, and it has more unused bits */ | ||
1326 | - else if (conv_rate == 0x00 | ||
1327 | - && (config & 0x7F) == 0x00 | ||
1328 | - && (status & 0xAB) == 0x00) | ||
1329 | - type_name = "lm84"; | ||
1330 | - else | ||
1331 | - type_name = "max1617"; | ||
1332 | + else { | ||
1333 | + int lte, rte, lhi, rhi, llo, rlo; | ||
1334 | + | ||
1335 | + /* extra checks for LM84 and MAX1617 to avoid misdetections */ | ||
1336 | + | ||
1337 | + llo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(0)); | ||
1338 | + rlo = i2c_smbus_read_byte_data(client, ADM1021_REG_THYST_R(1)); | ||
1339 | + | ||
1340 | + /* fail if any of the additional register reads failed */ | ||
1341 | + if (llo < 0 || rlo < 0) | ||
1342 | + return -ENODEV; | ||
1343 | + | ||
1344 | + lte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(0)); | ||
1345 | + rte = i2c_smbus_read_byte_data(client, ADM1021_REG_TEMP(1)); | ||
1346 | + lhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(0)); | ||
1347 | + rhi = i2c_smbus_read_byte_data(client, ADM1021_REG_TOS_R(1)); | ||
1348 | + | ||
1349 | + /* | ||
1350 | + * Fail for negative temperatures and negative high limits. | ||
1351 | + * This check also catches read errors on the tested registers. | ||
1352 | + */ | ||
1353 | + if ((s8)lte < 0 || (s8)rte < 0 || (s8)lhi < 0 || (s8)rhi < 0) | ||
1354 | + return -ENODEV; | ||
1355 | + | ||
1356 | + /* fail if all registers hold the same value */ | ||
1357 | + if (lte == rte && lte == lhi && lte == rhi && lte == llo | ||
1358 | + && lte == rlo) | ||
1359 | + return -ENODEV; | ||
1360 | + | ||
1361 | + /* | ||
1362 | + * LM84 Mfr ID is in a different place, | ||
1363 | + * and it has more unused bits. | ||
1364 | + */ | ||
1365 | + if (conv_rate == 0x00 | ||
1366 | + && (config & 0x7F) == 0x00 | ||
1367 | + && (status & 0xAB) == 0x00) { | ||
1368 | + type_name = "lm84"; | ||
1369 | + } else { | ||
1370 | + /* fail if low limits are larger than high limits */ | ||
1371 | + if ((s8)llo > lhi || (s8)rlo > rhi) | ||
1372 | + return -ENODEV; | ||
1373 | + type_name = "max1617"; | ||
1374 | + } | ||
1375 | + } | ||
1376 | |||
1377 | pr_debug("adm1021: Detected chip %s at adapter %d, address 0x%02x.\n", | ||
1378 | type_name, i2c_adapter_id(adapter), client->addr); | ||
1379 | diff --git a/drivers/iio/frequency/adf4350.c b/drivers/iio/frequency/adf4350.c | ||
1380 | index a884252..e76d4ac 100644 | ||
1381 | --- a/drivers/iio/frequency/adf4350.c | ||
1382 | +++ b/drivers/iio/frequency/adf4350.c | ||
1383 | @@ -212,7 +212,7 @@ static int adf4350_set_freq(struct adf4350_state *st, unsigned long long freq) | ||
1384 | (pdata->r2_user_settings & (ADF4350_REG2_PD_POLARITY_POS | | ||
1385 | ADF4350_REG2_LDP_6ns | ADF4350_REG2_LDF_INT_N | | ||
1386 | ADF4350_REG2_CHARGE_PUMP_CURR_uA(5000) | | ||
1387 | - ADF4350_REG2_MUXOUT(0x7) | ADF4350_REG2_NOISE_MODE(0x9))); | ||
1388 | + ADF4350_REG2_MUXOUT(0x7) | ADF4350_REG2_NOISE_MODE(0x3))); | ||
1389 | |||
1390 | st->regs[ADF4350_REG3] = pdata->r3_user_settings & | ||
1391 | (ADF4350_REG3_12BIT_CLKDIV(0xFFF) | | ||
1392 | diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c | ||
1393 | index b289915..8ff1a2d 100644 | ||
1394 | --- a/drivers/iio/inkern.c | ||
1395 | +++ b/drivers/iio/inkern.c | ||
1396 | @@ -279,7 +279,7 @@ static int iio_convert_raw_to_processed_unlocked(struct iio_channel *chan, | ||
1397 | s64 raw64 = raw; | ||
1398 | int ret; | ||
1399 | |||
1400 | - ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_SCALE); | ||
1401 | + ret = iio_channel_read(chan, &offset, NULL, IIO_CHAN_INFO_OFFSET); | ||
1402 | if (ret == 0) | ||
1403 | raw64 += offset; | ||
1404 | |||
1405 | diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c | ||
1406 | index 5427787..563771f 100644 | ||
1407 | --- a/drivers/pci/probe.c | ||
1408 | +++ b/drivers/pci/probe.c | ||
1409 | @@ -988,7 +988,6 @@ int pci_setup_device(struct pci_dev *dev) | ||
1410 | dev->sysdata = dev->bus->sysdata; | ||
1411 | dev->dev.parent = dev->bus->bridge; | ||
1412 | dev->dev.bus = &pci_bus_type; | ||
1413 | - dev->dev.type = &pci_dev_type; | ||
1414 | dev->hdr_type = hdr_type & 0x7f; | ||
1415 | dev->multifunction = !!(hdr_type & 0x80); | ||
1416 | dev->error_state = pci_channel_io_normal; | ||
1417 | @@ -1208,6 +1207,7 @@ struct pci_dev *alloc_pci_dev(void) | ||
1418 | return NULL; | ||
1419 | |||
1420 | INIT_LIST_HEAD(&dev->bus_list); | ||
1421 | + dev->dev.type = &pci_dev_type; | ||
1422 | |||
1423 | return dev; | ||
1424 | } | ||
1425 | diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c | ||
1426 | index 1a779bb..72184cc 100644 | ||
1427 | --- a/drivers/platform/x86/hp-wmi.c | ||
1428 | +++ b/drivers/platform/x86/hp-wmi.c | ||
1429 | @@ -679,7 +679,7 @@ static int hp_wmi_rfkill_setup(struct platform_device *device) | ||
1430 | } | ||
1431 | rfkill_init_sw_state(gps_rfkill, | ||
1432 | hp_wmi_get_sw_state(HPWMI_GPS)); | ||
1433 | - rfkill_set_hw_state(bluetooth_rfkill, | ||
1434 | + rfkill_set_hw_state(gps_rfkill, | ||
1435 | hp_wmi_get_hw_state(HPWMI_GPS)); | ||
1436 | err = rfkill_register(gps_rfkill); | ||
1437 | if (err) | ||
1438 | diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c | ||
1439 | index e8d7768..1e04b79 100644 | ||
1440 | --- a/drivers/usb/dwc3/dwc3-pci.c | ||
1441 | +++ b/drivers/usb/dwc3/dwc3-pci.c | ||
1442 | @@ -196,9 +196,9 @@ static void dwc3_pci_remove(struct pci_dev *pci) | ||
1443 | { | ||
1444 | struct dwc3_pci *glue = pci_get_drvdata(pci); | ||
1445 | |||
1446 | + platform_device_unregister(glue->dwc3); | ||
1447 | platform_device_unregister(glue->usb2_phy); | ||
1448 | platform_device_unregister(glue->usb3_phy); | ||
1449 | - platform_device_unregister(glue->dwc3); | ||
1450 | pci_set_drvdata(pci, NULL); | ||
1451 | pci_disable_device(pci); | ||
1452 | } | ||
1453 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c | ||
1454 | index 82e160e..bab9630 100644 | ||
1455 | --- a/drivers/usb/dwc3/gadget.c | ||
1456 | +++ b/drivers/usb/dwc3/gadget.c | ||
1457 | @@ -1637,10 +1637,20 @@ static void dwc3_gadget_free_endpoints(struct dwc3 *dwc) | ||
1458 | |||
1459 | for (epnum = 0; epnum < DWC3_ENDPOINTS_NUM; epnum++) { | ||
1460 | dep = dwc->eps[epnum]; | ||
1461 | - dwc3_free_trb_pool(dep); | ||
1462 | |||
1463 | - if (epnum != 0 && epnum != 1) | ||
1464 | + /* | ||
1465 | + * Physical endpoints 0 and 1 are special; they form the | ||
1466 | + * bi-directional USB endpoint 0. | ||
1467 | + * | ||
1468 | + * For those two physical endpoints, we don't allocate a TRB | ||
1469 | + * pool nor do we add them the endpoints list. Due to that, we | ||
1470 | + * shouldn't do these two operations otherwise we would end up | ||
1471 | + * with all sorts of bugs when removing dwc3.ko. | ||
1472 | + */ | ||
1473 | + if (epnum != 0 && epnum != 1) { | ||
1474 | + dwc3_free_trb_pool(dep); | ||
1475 | list_del(&dep->endpoint.ep_list); | ||
1476 | + } | ||
1477 | |||
1478 | kfree(dep); | ||
1479 | } | ||
1480 | diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c | ||
1481 | index 010f686..5a00ef3 100644 | ||
1482 | --- a/drivers/usb/host/ehci-sched.c | ||
1483 | +++ b/drivers/usb/host/ehci-sched.c | ||
1484 | @@ -213,7 +213,7 @@ static inline unsigned char tt_start_uframe(struct ehci_hcd *ehci, __hc32 mask) | ||
1485 | } | ||
1486 | |||
1487 | static const unsigned char | ||
1488 | -max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 125, 25 }; | ||
1489 | +max_tt_usecs[] = { 125, 125, 125, 125, 125, 125, 30, 0 }; | ||
1490 | |||
1491 | /* carryover low/fullspeed bandwidth that crosses uframe boundries */ | ||
1492 | static inline void carryover_tt_bandwidth(unsigned short tt_usecs[8]) | ||
1493 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c | ||
1494 | index fd26470e428..905f38c 100644 | ||
1495 | --- a/drivers/usb/host/xhci-mem.c | ||
1496 | +++ b/drivers/usb/host/xhci-mem.c | ||
1497 | @@ -1827,6 +1827,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | ||
1498 | } | ||
1499 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
1500 | |||
1501 | + if (!xhci->rh_bw) | ||
1502 | + goto no_bw; | ||
1503 | + | ||
1504 | num_ports = HCS_MAX_PORTS(xhci->hcs_params1); | ||
1505 | for (i = 0; i < num_ports; i++) { | ||
1506 | struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; | ||
1507 | @@ -1845,6 +1848,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | ||
1508 | } | ||
1509 | } | ||
1510 | |||
1511 | +no_bw: | ||
1512 | xhci->num_usb2_ports = 0; | ||
1513 | xhci->num_usb3_ports = 0; | ||
1514 | xhci->num_active_eps = 0; | ||
1515 | @@ -2256,6 +2260,9 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | ||
1516 | u32 page_size, temp; | ||
1517 | int i; | ||
1518 | |||
1519 | + INIT_LIST_HEAD(&xhci->lpm_failed_devs); | ||
1520 | + INIT_LIST_HEAD(&xhci->cancel_cmd_list); | ||
1521 | + | ||
1522 | page_size = xhci_readl(xhci, &xhci->op_regs->page_size); | ||
1523 | xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size); | ||
1524 | for (i = 0; i < 16; i++) { | ||
1525 | @@ -2334,7 +2341,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | ||
1526 | xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags); | ||
1527 | if (!xhci->cmd_ring) | ||
1528 | goto fail; | ||
1529 | - INIT_LIST_HEAD(&xhci->cancel_cmd_list); | ||
1530 | xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring); | ||
1531 | xhci_dbg(xhci, "First segment DMA is 0x%llx\n", | ||
1532 | (unsigned long long)xhci->cmd_ring->first_seg->dma); | ||
1533 | @@ -2445,8 +2451,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | ||
1534 | if (xhci_setup_port_arrays(xhci, flags)) | ||
1535 | goto fail; | ||
1536 | |||
1537 | - INIT_LIST_HEAD(&xhci->lpm_failed_devs); | ||
1538 | - | ||
1539 | /* Enable USB 3.0 device notifications for function remote wake, which | ||
1540 | * is necessary for allowing USB 3.0 devices to do remote wakeup from | ||
1541 | * U3 (device suspend). | ||
1542 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
1543 | index 1a30c38..cc24e39 100644 | ||
1544 | --- a/drivers/usb/host/xhci-pci.c | ||
1545 | +++ b/drivers/usb/host/xhci-pci.c | ||
1546 | @@ -221,6 +221,14 @@ static void xhci_pci_remove(struct pci_dev *dev) | ||
1547 | static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup) | ||
1548 | { | ||
1549 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
1550 | + struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | ||
1551 | + | ||
1552 | + /* | ||
1553 | + * Systems with the TI redriver that loses port status change events | ||
1554 | + * need to have the registers polled during D3, so avoid D3cold. | ||
1555 | + */ | ||
1556 | + if (xhci_compliance_mode_recovery_timer_quirk_check()) | ||
1557 | + pdev->no_d3cold = true; | ||
1558 | |||
1559 | return xhci_suspend(xhci); | ||
1560 | } | ||
1561 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
1562 | index 53b8f89..82b0809 100644 | ||
1563 | --- a/drivers/usb/host/xhci.c | ||
1564 | +++ b/drivers/usb/host/xhci.c | ||
1565 | @@ -466,7 +466,7 @@ static void compliance_mode_recovery_timer_init(struct xhci_hcd *xhci) | ||
1566 | * Systems: | ||
1567 | * Vendor: Hewlett-Packard -> System Models: Z420, Z620 and Z820 | ||
1568 | */ | ||
1569 | -static bool compliance_mode_recovery_timer_quirk_check(void) | ||
1570 | +bool xhci_compliance_mode_recovery_timer_quirk_check(void) | ||
1571 | { | ||
1572 | const char *dmi_product_name, *dmi_sys_vendor; | ||
1573 | |||
1574 | @@ -517,7 +517,7 @@ int xhci_init(struct usb_hcd *hcd) | ||
1575 | xhci_dbg(xhci, "Finished xhci_init\n"); | ||
1576 | |||
1577 | /* Initializing Compliance Mode Recovery Data If Needed */ | ||
1578 | - if (compliance_mode_recovery_timer_quirk_check()) { | ||
1579 | + if (xhci_compliance_mode_recovery_timer_quirk_check()) { | ||
1580 | xhci->quirks |= XHCI_COMP_MODE_QUIRK; | ||
1581 | compliance_mode_recovery_timer_init(xhci); | ||
1582 | } | ||
1583 | @@ -952,6 +952,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | ||
1584 | struct usb_hcd *hcd = xhci_to_hcd(xhci); | ||
1585 | struct usb_hcd *secondary_hcd; | ||
1586 | int retval = 0; | ||
1587 | + bool comp_timer_running = false; | ||
1588 | |||
1589 | /* Wait a bit if either of the roothubs need to settle from the | ||
1590 | * transition into bus suspend. | ||
1591 | @@ -989,6 +990,13 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | ||
1592 | |||
1593 | /* If restore operation fails, re-initialize the HC during resume */ | ||
1594 | if ((temp & STS_SRE) || hibernated) { | ||
1595 | + | ||
1596 | + if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && | ||
1597 | + !(xhci_all_ports_seen_u0(xhci))) { | ||
1598 | + del_timer_sync(&xhci->comp_mode_recovery_timer); | ||
1599 | + xhci_dbg(xhci, "Compliance Mode Recovery Timer deleted!\n"); | ||
1600 | + } | ||
1601 | + | ||
1602 | /* Let the USB core know _both_ roothubs lost power. */ | ||
1603 | usb_root_hub_lost_power(xhci->main_hcd->self.root_hub); | ||
1604 | usb_root_hub_lost_power(xhci->shared_hcd->self.root_hub); | ||
1605 | @@ -1031,6 +1039,8 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | ||
1606 | retval = xhci_init(hcd->primary_hcd); | ||
1607 | if (retval) | ||
1608 | return retval; | ||
1609 | + comp_timer_running = true; | ||
1610 | + | ||
1611 | xhci_dbg(xhci, "Start the primary HCD\n"); | ||
1612 | retval = xhci_run(hcd->primary_hcd); | ||
1613 | if (!retval) { | ||
1614 | @@ -1072,7 +1082,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | ||
1615 | * to suffer the Compliance Mode issue again. It doesn't matter if | ||
1616 | * ports have entered previously to U0 before system's suspension. | ||
1617 | */ | ||
1618 | - if (xhci->quirks & XHCI_COMP_MODE_QUIRK) | ||
1619 | + if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && !comp_timer_running) | ||
1620 | compliance_mode_recovery_timer_init(xhci); | ||
1621 | |||
1622 | /* Re-enable port polling. */ | ||
1623 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h | ||
1624 | index 6358271..bde9f22 100644 | ||
1625 | --- a/drivers/usb/host/xhci.h | ||
1626 | +++ b/drivers/usb/host/xhci.h | ||
1627 | @@ -1853,4 +1853,7 @@ struct xhci_input_control_ctx *xhci_get_input_control_ctx(struct xhci_hcd *xhci, | ||
1628 | struct xhci_slot_ctx *xhci_get_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx); | ||
1629 | struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx *ctx, unsigned int ep_index); | ||
1630 | |||
1631 | +/* xHCI quirks */ | ||
1632 | +bool xhci_compliance_mode_recovery_timer_quirk_check(void); | ||
1633 | + | ||
1634 | #endif /* __LINUX_XHCI_HCD_H */ | ||
1635 | diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c | ||
1636 | index 1ce1fcf..6f26fd8 100644 | ||
1637 | --- a/drivers/usb/musb/musb_host.c | ||
1638 | +++ b/drivers/usb/musb/musb_host.c | ||
1639 | @@ -1232,7 +1232,6 @@ void musb_host_tx(struct musb *musb, u8 epnum) | ||
1640 | void __iomem *mbase = musb->mregs; | ||
1641 | struct dma_channel *dma; | ||
1642 | bool transfer_pending = false; | ||
1643 | - static bool use_sg; | ||
1644 | |||
1645 | musb_ep_select(mbase, epnum); | ||
1646 | tx_csr = musb_readw(epio, MUSB_TXCSR); | ||
1647 | @@ -1463,9 +1462,9 @@ done: | ||
1648 | * NULL. | ||
1649 | */ | ||
1650 | if (!urb->transfer_buffer) | ||
1651 | - use_sg = true; | ||
1652 | + qh->use_sg = true; | ||
1653 | |||
1654 | - if (use_sg) { | ||
1655 | + if (qh->use_sg) { | ||
1656 | /* sg_miter_start is already done in musb_ep_program */ | ||
1657 | if (!sg_miter_next(&qh->sg_miter)) { | ||
1658 | dev_err(musb->controller, "error: sg list empty\n"); | ||
1659 | @@ -1484,9 +1483,9 @@ done: | ||
1660 | |||
1661 | qh->segsize = length; | ||
1662 | |||
1663 | - if (use_sg) { | ||
1664 | + if (qh->use_sg) { | ||
1665 | if (offset + length >= urb->transfer_buffer_length) | ||
1666 | - use_sg = false; | ||
1667 | + qh->use_sg = false; | ||
1668 | } | ||
1669 | |||
1670 | musb_ep_select(mbase, epnum); | ||
1671 | @@ -1552,7 +1551,6 @@ void musb_host_rx(struct musb *musb, u8 epnum) | ||
1672 | bool done = false; | ||
1673 | u32 status; | ||
1674 | struct dma_channel *dma; | ||
1675 | - static bool use_sg; | ||
1676 | unsigned int sg_flags = SG_MITER_ATOMIC | SG_MITER_TO_SG; | ||
1677 | |||
1678 | musb_ep_select(mbase, epnum); | ||
1679 | @@ -1878,12 +1876,12 @@ void musb_host_rx(struct musb *musb, u8 epnum) | ||
1680 | * NULL. | ||
1681 | */ | ||
1682 | if (!urb->transfer_buffer) { | ||
1683 | - use_sg = true; | ||
1684 | + qh->use_sg = true; | ||
1685 | sg_miter_start(&qh->sg_miter, urb->sg, 1, | ||
1686 | sg_flags); | ||
1687 | } | ||
1688 | |||
1689 | - if (use_sg) { | ||
1690 | + if (qh->use_sg) { | ||
1691 | if (!sg_miter_next(&qh->sg_miter)) { | ||
1692 | dev_err(musb->controller, "error: sg list empty\n"); | ||
1693 | sg_miter_stop(&qh->sg_miter); | ||
1694 | @@ -1913,8 +1911,8 @@ finish: | ||
1695 | urb->actual_length += xfer_len; | ||
1696 | qh->offset += xfer_len; | ||
1697 | if (done) { | ||
1698 | - if (use_sg) | ||
1699 | - use_sg = false; | ||
1700 | + if (qh->use_sg) | ||
1701 | + qh->use_sg = false; | ||
1702 | |||
1703 | if (urb->status == -EINPROGRESS) | ||
1704 | urb->status = status; | ||
1705 | diff --git a/drivers/usb/musb/musb_host.h b/drivers/usb/musb/musb_host.h | ||
1706 | index 5a9c8fe..738f7eb 100644 | ||
1707 | --- a/drivers/usb/musb/musb_host.h | ||
1708 | +++ b/drivers/usb/musb/musb_host.h | ||
1709 | @@ -74,6 +74,7 @@ struct musb_qh { | ||
1710 | u16 frame; /* for periodic schedule */ | ||
1711 | unsigned iso_idx; /* in urb->iso_frame_desc[] */ | ||
1712 | struct sg_mapping_iter sg_miter; /* for highmem in PIO mode */ | ||
1713 | + bool use_sg; /* to track urb using sglist */ | ||
1714 | }; | ||
1715 | |||
1716 | /* map from control or bulk queue head to the first qh on that ring */ | ||
1717 | diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c | ||
1718 | index 4775f82..513d45f 100644 | ||
1719 | --- a/drivers/usb/serial/ark3116.c | ||
1720 | +++ b/drivers/usb/serial/ark3116.c | ||
1721 | @@ -43,7 +43,7 @@ | ||
1722 | #define DRIVER_NAME "ark3116" | ||
1723 | |||
1724 | /* usb timeout of 1 second */ | ||
1725 | -#define ARK_TIMEOUT (1*HZ) | ||
1726 | +#define ARK_TIMEOUT 1000 | ||
1727 | |||
1728 | static const struct usb_device_id id_table[] = { | ||
1729 | { USB_DEVICE(0x6547, 0x0232) }, | ||
1730 | diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c | ||
1731 | index ba7352e..9b145d3 100644 | ||
1732 | --- a/drivers/usb/serial/cypress_m8.c | ||
1733 | +++ b/drivers/usb/serial/cypress_m8.c | ||
1734 | @@ -65,6 +65,7 @@ static const struct usb_device_id id_table_earthmate[] = { | ||
1735 | static const struct usb_device_id id_table_cyphidcomrs232[] = { | ||
1736 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, | ||
1737 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, | ||
1738 | + { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) }, | ||
1739 | { } /* Terminating entry */ | ||
1740 | }; | ||
1741 | |||
1742 | @@ -78,6 +79,7 @@ static const struct usb_device_id id_table_combined[] = { | ||
1743 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, | ||
1744 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, | ||
1745 | { USB_DEVICE(VENDOR_ID_POWERCOM, PRODUCT_ID_UPS) }, | ||
1746 | + { USB_DEVICE(VENDOR_ID_FRWD, PRODUCT_ID_CYPHIDCOM_FRWD) }, | ||
1747 | { USB_DEVICE(VENDOR_ID_DAZZLE, PRODUCT_ID_CA42) }, | ||
1748 | { } /* Terminating entry */ | ||
1749 | }; | ||
1750 | @@ -230,6 +232,12 @@ static struct usb_serial_driver * const serial_drivers[] = { | ||
1751 | * Cypress serial helper functions | ||
1752 | *****************************************************************************/ | ||
1753 | |||
1754 | +/* FRWD Dongle hidcom needs to skip reset and speed checks */ | ||
1755 | +static inline bool is_frwd(struct usb_device *dev) | ||
1756 | +{ | ||
1757 | + return ((le16_to_cpu(dev->descriptor.idVendor) == VENDOR_ID_FRWD) && | ||
1758 | + (le16_to_cpu(dev->descriptor.idProduct) == PRODUCT_ID_CYPHIDCOM_FRWD)); | ||
1759 | +} | ||
1760 | |||
1761 | static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate) | ||
1762 | { | ||
1763 | @@ -239,6 +247,10 @@ static int analyze_baud_rate(struct usb_serial_port *port, speed_t new_rate) | ||
1764 | if (unstable_bauds) | ||
1765 | return new_rate; | ||
1766 | |||
1767 | + /* FRWD Dongle uses 115200 bps */ | ||
1768 | + if (is_frwd(port->serial->dev)) | ||
1769 | + return new_rate; | ||
1770 | + | ||
1771 | /* | ||
1772 | * The general purpose firmware for the Cypress M8 allows for | ||
1773 | * a maximum speed of 57600bps (I have no idea whether DeLorme | ||
1774 | @@ -449,7 +461,11 @@ static int cypress_generic_port_probe(struct usb_serial_port *port) | ||
1775 | return -ENOMEM; | ||
1776 | } | ||
1777 | |||
1778 | - usb_reset_configuration(serial->dev); | ||
1779 | + /* Skip reset for FRWD device. It is a workaound: | ||
1780 | + device hangs if it receives SET_CONFIGURE in Configured | ||
1781 | + state. */ | ||
1782 | + if (!is_frwd(serial->dev)) | ||
1783 | + usb_reset_configuration(serial->dev); | ||
1784 | |||
1785 | priv->cmd_ctrl = 0; | ||
1786 | priv->line_control = 0; | ||
1787 | diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h | ||
1788 | index 67cf608..b461311 100644 | ||
1789 | --- a/drivers/usb/serial/cypress_m8.h | ||
1790 | +++ b/drivers/usb/serial/cypress_m8.h | ||
1791 | @@ -24,6 +24,10 @@ | ||
1792 | #define VENDOR_ID_CYPRESS 0x04b4 | ||
1793 | #define PRODUCT_ID_CYPHIDCOM 0x5500 | ||
1794 | |||
1795 | +/* FRWD Dongle - a GPS sports watch */ | ||
1796 | +#define VENDOR_ID_FRWD 0x6737 | ||
1797 | +#define PRODUCT_ID_CYPHIDCOM_FRWD 0x0001 | ||
1798 | + | ||
1799 | /* Powercom UPS, chip CY7C63723 */ | ||
1800 | #define VENDOR_ID_POWERCOM 0x0d9f | ||
1801 | #define PRODUCT_ID_UPS 0x0002 | ||
1802 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
1803 | index 266ece7..e8e2837 100644 | ||
1804 | --- a/drivers/usb/serial/ftdi_sio.c | ||
1805 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
1806 | @@ -931,8 +931,8 @@ static int ftdi_get_icount(struct tty_struct *tty, | ||
1807 | static int ftdi_ioctl(struct tty_struct *tty, | ||
1808 | unsigned int cmd, unsigned long arg); | ||
1809 | static void ftdi_break_ctl(struct tty_struct *tty, int break_state); | ||
1810 | -static int ftdi_chars_in_buffer(struct tty_struct *tty); | ||
1811 | -static int ftdi_get_modem_status(struct tty_struct *tty, | ||
1812 | +static bool ftdi_tx_empty(struct usb_serial_port *port); | ||
1813 | +static int ftdi_get_modem_status(struct usb_serial_port *port, | ||
1814 | unsigned char status[2]); | ||
1815 | |||
1816 | static unsigned short int ftdi_232am_baud_base_to_divisor(int baud, int base); | ||
1817 | @@ -968,7 +968,7 @@ static struct usb_serial_driver ftdi_sio_device = { | ||
1818 | .ioctl = ftdi_ioctl, | ||
1819 | .set_termios = ftdi_set_termios, | ||
1820 | .break_ctl = ftdi_break_ctl, | ||
1821 | - .chars_in_buffer = ftdi_chars_in_buffer, | ||
1822 | + .tx_empty = ftdi_tx_empty, | ||
1823 | }; | ||
1824 | |||
1825 | static struct usb_serial_driver * const serial_drivers[] = { | ||
1826 | @@ -2092,27 +2092,18 @@ static void ftdi_break_ctl(struct tty_struct *tty, int break_state) | ||
1827 | |||
1828 | } | ||
1829 | |||
1830 | -static int ftdi_chars_in_buffer(struct tty_struct *tty) | ||
1831 | +static bool ftdi_tx_empty(struct usb_serial_port *port) | ||
1832 | { | ||
1833 | - struct usb_serial_port *port = tty->driver_data; | ||
1834 | - int chars; | ||
1835 | unsigned char buf[2]; | ||
1836 | int ret; | ||
1837 | |||
1838 | - chars = usb_serial_generic_chars_in_buffer(tty); | ||
1839 | - if (chars) | ||
1840 | - goto out; | ||
1841 | - | ||
1842 | - /* Check if hardware buffer is empty. */ | ||
1843 | - ret = ftdi_get_modem_status(tty, buf); | ||
1844 | + ret = ftdi_get_modem_status(port, buf); | ||
1845 | if (ret == 2) { | ||
1846 | if (!(buf[1] & FTDI_RS_TEMT)) | ||
1847 | - chars = 1; | ||
1848 | + return false; | ||
1849 | } | ||
1850 | -out: | ||
1851 | - dev_dbg(&port->dev, "%s - %d\n", __func__, chars); | ||
1852 | |||
1853 | - return chars; | ||
1854 | + return true; | ||
1855 | } | ||
1856 | |||
1857 | /* old_termios contains the original termios settings and tty->termios contains | ||
1858 | @@ -2304,10 +2295,9 @@ no_c_cflag_changes: | ||
1859 | * Returns the number of status bytes retrieved (device dependant), or | ||
1860 | * negative error code. | ||
1861 | */ | ||
1862 | -static int ftdi_get_modem_status(struct tty_struct *tty, | ||
1863 | +static int ftdi_get_modem_status(struct usb_serial_port *port, | ||
1864 | unsigned char status[2]) | ||
1865 | { | ||
1866 | - struct usb_serial_port *port = tty->driver_data; | ||
1867 | struct ftdi_private *priv = usb_get_serial_port_data(port); | ||
1868 | unsigned char *buf; | ||
1869 | int len; | ||
1870 | @@ -2372,7 +2362,7 @@ static int ftdi_tiocmget(struct tty_struct *tty) | ||
1871 | unsigned char buf[2]; | ||
1872 | int ret; | ||
1873 | |||
1874 | - ret = ftdi_get_modem_status(tty, buf); | ||
1875 | + ret = ftdi_get_modem_status(port, buf); | ||
1876 | if (ret < 0) | ||
1877 | return ret; | ||
1878 | |||
1879 | diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c | ||
1880 | index 4c5c23f..7f4342b 100644 | ||
1881 | --- a/drivers/usb/serial/generic.c | ||
1882 | +++ b/drivers/usb/serial/generic.c | ||
1883 | @@ -264,6 +264,37 @@ int usb_serial_generic_chars_in_buffer(struct tty_struct *tty) | ||
1884 | } | ||
1885 | EXPORT_SYMBOL_GPL(usb_serial_generic_chars_in_buffer); | ||
1886 | |||
1887 | +void usb_serial_generic_wait_until_sent(struct tty_struct *tty, long timeout) | ||
1888 | +{ | ||
1889 | + struct usb_serial_port *port = tty->driver_data; | ||
1890 | + unsigned int bps; | ||
1891 | + unsigned long period; | ||
1892 | + unsigned long expire; | ||
1893 | + | ||
1894 | + bps = tty_get_baud_rate(tty); | ||
1895 | + if (!bps) | ||
1896 | + bps = 9600; /* B0 */ | ||
1897 | + /* | ||
1898 | + * Use a poll-period of roughly the time it takes to send one | ||
1899 | + * character or at least one jiffy. | ||
1900 | + */ | ||
1901 | + period = max_t(unsigned long, (10 * HZ / bps), 1); | ||
1902 | + period = min_t(unsigned long, period, timeout); | ||
1903 | + | ||
1904 | + dev_dbg(&port->dev, "%s - timeout = %u ms, period = %u ms\n", | ||
1905 | + __func__, jiffies_to_msecs(timeout), | ||
1906 | + jiffies_to_msecs(period)); | ||
1907 | + expire = jiffies + timeout; | ||
1908 | + while (!port->serial->type->tx_empty(port)) { | ||
1909 | + schedule_timeout_interruptible(period); | ||
1910 | + if (signal_pending(current)) | ||
1911 | + break; | ||
1912 | + if (time_after(jiffies, expire)) | ||
1913 | + break; | ||
1914 | + } | ||
1915 | +} | ||
1916 | +EXPORT_SYMBOL_GPL(usb_serial_generic_wait_until_sent); | ||
1917 | + | ||
1918 | static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port, | ||
1919 | int index, gfp_t mem_flags) | ||
1920 | { | ||
1921 | diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c | ||
1922 | index 38f2489..f26decd 100644 | ||
1923 | --- a/drivers/usb/serial/io_ti.c | ||
1924 | +++ b/drivers/usb/serial/io_ti.c | ||
1925 | @@ -2033,8 +2033,6 @@ static int edge_chars_in_buffer(struct tty_struct *tty) | ||
1926 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | ||
1927 | int chars = 0; | ||
1928 | unsigned long flags; | ||
1929 | - int ret; | ||
1930 | - | ||
1931 | if (edge_port == NULL) | ||
1932 | return 0; | ||
1933 | |||
1934 | @@ -2042,16 +2040,22 @@ static int edge_chars_in_buffer(struct tty_struct *tty) | ||
1935 | chars = kfifo_len(&edge_port->write_fifo); | ||
1936 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); | ||
1937 | |||
1938 | - if (!chars) { | ||
1939 | - ret = tx_active(edge_port); | ||
1940 | - if (ret > 0) | ||
1941 | - chars = ret; | ||
1942 | - } | ||
1943 | - | ||
1944 | dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars); | ||
1945 | return chars; | ||
1946 | } | ||
1947 | |||
1948 | +static bool edge_tx_empty(struct usb_serial_port *port) | ||
1949 | +{ | ||
1950 | + struct edgeport_port *edge_port = usb_get_serial_port_data(port); | ||
1951 | + int ret; | ||
1952 | + | ||
1953 | + ret = tx_active(edge_port); | ||
1954 | + if (ret > 0) | ||
1955 | + return false; | ||
1956 | + | ||
1957 | + return true; | ||
1958 | +} | ||
1959 | + | ||
1960 | static void edge_throttle(struct tty_struct *tty) | ||
1961 | { | ||
1962 | struct usb_serial_port *port = tty->driver_data; | ||
1963 | @@ -2622,6 +2626,7 @@ static struct usb_serial_driver edgeport_1port_device = { | ||
1964 | .write = edge_write, | ||
1965 | .write_room = edge_write_room, | ||
1966 | .chars_in_buffer = edge_chars_in_buffer, | ||
1967 | + .tx_empty = edge_tx_empty, | ||
1968 | .break_ctl = edge_break, | ||
1969 | .read_int_callback = edge_interrupt_callback, | ||
1970 | .read_bulk_callback = edge_bulk_in_callback, | ||
1971 | @@ -2653,6 +2658,7 @@ static struct usb_serial_driver edgeport_2port_device = { | ||
1972 | .write = edge_write, | ||
1973 | .write_room = edge_write_room, | ||
1974 | .chars_in_buffer = edge_chars_in_buffer, | ||
1975 | + .tx_empty = edge_tx_empty, | ||
1976 | .break_ctl = edge_break, | ||
1977 | .read_int_callback = edge_interrupt_callback, | ||
1978 | .read_bulk_callback = edge_bulk_in_callback, | ||
1979 | diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c | ||
1980 | index ff77027..5687e26 100644 | ||
1981 | --- a/drivers/usb/serial/iuu_phoenix.c | ||
1982 | +++ b/drivers/usb/serial/iuu_phoenix.c | ||
1983 | @@ -289,7 +289,7 @@ static int bulk_immediate(struct usb_serial_port *port, u8 *buf, u8 count) | ||
1984 | usb_bulk_msg(serial->dev, | ||
1985 | usb_sndbulkpipe(serial->dev, | ||
1986 | port->bulk_out_endpointAddress), buf, | ||
1987 | - count, &actual, HZ * 1); | ||
1988 | + count, &actual, 1000); | ||
1989 | |||
1990 | if (status != IUU_OPERATION_OK) | ||
1991 | dev_dbg(&port->dev, "%s - error = %2x\n", __func__, status); | ||
1992 | @@ -309,7 +309,7 @@ static int read_immediate(struct usb_serial_port *port, u8 *buf, u8 count) | ||
1993 | usb_bulk_msg(serial->dev, | ||
1994 | usb_rcvbulkpipe(serial->dev, | ||
1995 | port->bulk_in_endpointAddress), buf, | ||
1996 | - count, &actual, HZ * 1); | ||
1997 | + count, &actual, 1000); | ||
1998 | |||
1999 | if (status != IUU_OPERATION_OK) | ||
2000 | dev_dbg(&port->dev, "%s - error = %2x\n", __func__, status); | ||
2001 | diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c | ||
2002 | index 1fd1935..34ed26e 100644 | ||
2003 | --- a/drivers/usb/serial/keyspan.c | ||
2004 | +++ b/drivers/usb/serial/keyspan.c | ||
2005 | @@ -1594,7 +1594,7 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial, | ||
2006 | d_details = s_priv->device_details; | ||
2007 | device_port = port->number - port->serial->minor; | ||
2008 | |||
2009 | - outcont_urb = d_details->outcont_endpoints[port->number]; | ||
2010 | + outcont_urb = d_details->outcont_endpoints[device_port]; | ||
2011 | this_urb = p_priv->outcont_urb; | ||
2012 | |||
2013 | dev_dbg(&port->dev, "%s - endpoint %d\n", __func__, usb_pipeendpoint(this_urb->pipe)); | ||
2014 | diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c | ||
2015 | index e0ebec3..0923689 100644 | ||
2016 | --- a/drivers/usb/serial/mos7720.c | ||
2017 | +++ b/drivers/usb/serial/mos7720.c | ||
2018 | @@ -40,7 +40,7 @@ | ||
2019 | #define DRIVER_DESC "Moschip USB Serial Driver" | ||
2020 | |||
2021 | /* default urb timeout */ | ||
2022 | -#define MOS_WDR_TIMEOUT (HZ * 5) | ||
2023 | +#define MOS_WDR_TIMEOUT 5000 | ||
2024 | |||
2025 | #define MOS_MAX_PORT 0x02 | ||
2026 | #define MOS_WRITE 0x0E | ||
2027 | @@ -228,11 +228,22 @@ static int read_mos_reg(struct usb_serial *serial, unsigned int serial_portnum, | ||
2028 | __u8 requesttype = (__u8)0xc0; | ||
2029 | __u16 index = get_reg_index(reg); | ||
2030 | __u16 value = get_reg_value(reg, serial_portnum); | ||
2031 | - int status = usb_control_msg(usbdev, pipe, request, requesttype, value, | ||
2032 | - index, data, 1, MOS_WDR_TIMEOUT); | ||
2033 | - if (status < 0) | ||
2034 | + u8 *buf; | ||
2035 | + int status; | ||
2036 | + | ||
2037 | + buf = kmalloc(1, GFP_KERNEL); | ||
2038 | + if (!buf) | ||
2039 | + return -ENOMEM; | ||
2040 | + | ||
2041 | + status = usb_control_msg(usbdev, pipe, request, requesttype, value, | ||
2042 | + index, buf, 1, MOS_WDR_TIMEOUT); | ||
2043 | + if (status == 1) | ||
2044 | + *data = *buf; | ||
2045 | + else if (status < 0) | ||
2046 | dev_err(&usbdev->dev, | ||
2047 | "mos7720: usb_control_msg() failed: %d", status); | ||
2048 | + kfree(buf); | ||
2049 | + | ||
2050 | return status; | ||
2051 | } | ||
2052 | |||
2053 | @@ -1633,7 +1644,7 @@ static void change_port_settings(struct tty_struct *tty, | ||
2054 | mos7720_port->shadowMCR |= (UART_MCR_XONANY); | ||
2055 | /* To set hardware flow control to the specified * | ||
2056 | * serial port, in SP1/2_CONTROL_REG */ | ||
2057 | - if (port->number) | ||
2058 | + if (port_number) | ||
2059 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x01); | ||
2060 | else | ||
2061 | write_mos_reg(serial, dummy, SP_CONTROL_REG, 0x02); | ||
2062 | @@ -1992,7 +2003,7 @@ static int mos7720_startup(struct usb_serial *serial) | ||
2063 | |||
2064 | /* setting configuration feature to one */ | ||
2065 | usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), | ||
2066 | - (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5*HZ); | ||
2067 | + (__u8)0x03, 0x00, 0x01, 0x00, NULL, 0x00, 5000); | ||
2068 | |||
2069 | /* start the interrupt urb */ | ||
2070 | ret_val = usb_submit_urb(serial->port[0]->interrupt_in_urb, GFP_KERNEL); | ||
2071 | @@ -2035,7 +2046,7 @@ static void mos7720_release(struct usb_serial *serial) | ||
2072 | /* wait for synchronous usb calls to return */ | ||
2073 | if (mos_parport->msg_pending) | ||
2074 | wait_for_completion_timeout(&mos_parport->syncmsg_compl, | ||
2075 | - MOS_WDR_TIMEOUT); | ||
2076 | + msecs_to_jiffies(MOS_WDR_TIMEOUT)); | ||
2077 | |||
2078 | parport_remove_port(mos_parport->pp); | ||
2079 | usb_set_serial_data(serial, NULL); | ||
2080 | diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c | ||
2081 | index b8051fa..2c14a31 100644 | ||
2082 | --- a/drivers/usb/serial/mos7840.c | ||
2083 | +++ b/drivers/usb/serial/mos7840.c | ||
2084 | @@ -2255,13 +2255,21 @@ static int mos7840_ioctl(struct tty_struct *tty, | ||
2085 | static int mos7810_check(struct usb_serial *serial) | ||
2086 | { | ||
2087 | int i, pass_count = 0; | ||
2088 | + u8 *buf; | ||
2089 | __u16 data = 0, mcr_data = 0; | ||
2090 | __u16 test_pattern = 0x55AA; | ||
2091 | + int res; | ||
2092 | + | ||
2093 | + buf = kmalloc(VENDOR_READ_LENGTH, GFP_KERNEL); | ||
2094 | + if (!buf) | ||
2095 | + return 0; /* failed to identify 7810 */ | ||
2096 | |||
2097 | /* Store MCR setting */ | ||
2098 | - usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | ||
2099 | + res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | ||
2100 | MCS_RDREQ, MCS_RD_RTYPE, 0x0300, MODEM_CONTROL_REGISTER, | ||
2101 | - &mcr_data, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | ||
2102 | + buf, VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | ||
2103 | + if (res == VENDOR_READ_LENGTH) | ||
2104 | + mcr_data = *buf; | ||
2105 | |||
2106 | for (i = 0; i < 16; i++) { | ||
2107 | /* Send the 1-bit test pattern out to MCS7810 test pin */ | ||
2108 | @@ -2271,9 +2279,12 @@ static int mos7810_check(struct usb_serial *serial) | ||
2109 | MODEM_CONTROL_REGISTER, NULL, 0, MOS_WDR_TIMEOUT); | ||
2110 | |||
2111 | /* Read the test pattern back */ | ||
2112 | - usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | ||
2113 | - MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, &data, | ||
2114 | - VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | ||
2115 | + res = usb_control_msg(serial->dev, | ||
2116 | + usb_rcvctrlpipe(serial->dev, 0), MCS_RDREQ, | ||
2117 | + MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, | ||
2118 | + VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | ||
2119 | + if (res == VENDOR_READ_LENGTH) | ||
2120 | + data = *buf; | ||
2121 | |||
2122 | /* If this is a MCS7810 device, both test patterns must match */ | ||
2123 | if (((test_pattern >> i) ^ (~data >> 1)) & 0x0001) | ||
2124 | @@ -2287,6 +2298,8 @@ static int mos7810_check(struct usb_serial *serial) | ||
2125 | MCS_WR_RTYPE, 0x0300 | mcr_data, MODEM_CONTROL_REGISTER, NULL, | ||
2126 | 0, MOS_WDR_TIMEOUT); | ||
2127 | |||
2128 | + kfree(buf); | ||
2129 | + | ||
2130 | if (pass_count == 16) | ||
2131 | return 1; | ||
2132 | |||
2133 | @@ -2296,11 +2309,17 @@ static int mos7810_check(struct usb_serial *serial) | ||
2134 | static int mos7840_calc_num_ports(struct usb_serial *serial) | ||
2135 | { | ||
2136 | __u16 data = 0x00; | ||
2137 | + u8 *buf; | ||
2138 | int mos7840_num_ports; | ||
2139 | |||
2140 | - usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | ||
2141 | - MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, &data, | ||
2142 | - VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | ||
2143 | + buf = kzalloc(VENDOR_READ_LENGTH, GFP_KERNEL); | ||
2144 | + if (buf) { | ||
2145 | + usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | ||
2146 | + MCS_RDREQ, MCS_RD_RTYPE, 0, GPIO_REGISTER, buf, | ||
2147 | + VENDOR_READ_LENGTH, MOS_WDR_TIMEOUT); | ||
2148 | + data = *buf; | ||
2149 | + kfree(buf); | ||
2150 | + } | ||
2151 | |||
2152 | if (serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7810 || | ||
2153 | serial->dev->descriptor.idProduct == MOSCHIP_DEVICE_ID_7820) { | ||
2154 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
2155 | index 87181be..9162db2 100644 | ||
2156 | --- a/drivers/usb/serial/option.c | ||
2157 | +++ b/drivers/usb/serial/option.c | ||
2158 | @@ -250,13 +250,7 @@ static void option_instat_callback(struct urb *urb); | ||
2159 | #define ZTE_PRODUCT_MF622 0x0001 | ||
2160 | #define ZTE_PRODUCT_MF628 0x0015 | ||
2161 | #define ZTE_PRODUCT_MF626 0x0031 | ||
2162 | -#define ZTE_PRODUCT_CDMA_TECH 0xfffe | ||
2163 | -#define ZTE_PRODUCT_AC8710 0xfff1 | ||
2164 | -#define ZTE_PRODUCT_AC2726 0xfff5 | ||
2165 | -#define ZTE_PRODUCT_AC8710T 0xffff | ||
2166 | #define ZTE_PRODUCT_MC2718 0xffe8 | ||
2167 | -#define ZTE_PRODUCT_AD3812 0xffeb | ||
2168 | -#define ZTE_PRODUCT_MC2716 0xffed | ||
2169 | |||
2170 | #define BENQ_VENDOR_ID 0x04a5 | ||
2171 | #define BENQ_PRODUCT_H10 0x4068 | ||
2172 | @@ -495,18 +489,10 @@ static const struct option_blacklist_info zte_k3765_z_blacklist = { | ||
2173 | .reserved = BIT(4), | ||
2174 | }; | ||
2175 | |||
2176 | -static const struct option_blacklist_info zte_ad3812_z_blacklist = { | ||
2177 | - .sendsetup = BIT(0) | BIT(1) | BIT(2), | ||
2178 | -}; | ||
2179 | - | ||
2180 | static const struct option_blacklist_info zte_mc2718_z_blacklist = { | ||
2181 | .sendsetup = BIT(1) | BIT(2) | BIT(3) | BIT(4), | ||
2182 | }; | ||
2183 | |||
2184 | -static const struct option_blacklist_info zte_mc2716_z_blacklist = { | ||
2185 | - .sendsetup = BIT(1) | BIT(2) | BIT(3), | ||
2186 | -}; | ||
2187 | - | ||
2188 | static const struct option_blacklist_info huawei_cdc12_blacklist = { | ||
2189 | .reserved = BIT(1) | BIT(2), | ||
2190 | }; | ||
2191 | @@ -593,6 +579,8 @@ static const struct usb_device_id option_ids[] = { | ||
2192 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, | ||
2193 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff), | ||
2194 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, | ||
2195 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x14ac, 0xff, 0xff, 0xff), /* Huawei E1820 */ | ||
2196 | + .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, | ||
2197 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff), | ||
2198 | .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, | ||
2199 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0xff, 0xff) }, | ||
2200 | @@ -797,7 +785,6 @@ static const struct usb_device_id option_ids[] = { | ||
2201 | { USB_DEVICE_INTERFACE_CLASS(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1012, 0xff) }, | ||
2202 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC650) }, | ||
2203 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, | ||
2204 | - { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ | ||
2205 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | ||
2206 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | ||
2207 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ | ||
2208 | @@ -1199,16 +1186,9 @@ static const struct usb_device_id option_ids[] = { | ||
2209 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff), | ||
2210 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
2211 | |||
2212 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, | ||
2213 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, | ||
2214 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, | ||
2215 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) }, | ||
2216 | + /* NOTE: most ZTE CDMA devices should be driven by zte_ev, not option */ | ||
2217 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff), | ||
2218 | .driver_info = (kernel_ulong_t)&zte_mc2718_z_blacklist }, | ||
2219 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AD3812, 0xff, 0xff, 0xff), | ||
2220 | - .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist }, | ||
2221 | - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff), | ||
2222 | - .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist }, | ||
2223 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, | ||
2224 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, | ||
2225 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, | ||
2226 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c | ||
2227 | index 59b32b7..bd794b4 100644 | ||
2228 | --- a/drivers/usb/serial/qcserial.c | ||
2229 | +++ b/drivers/usb/serial/qcserial.c | ||
2230 | @@ -118,6 +118,7 @@ static const struct usb_device_id id_table[] = { | ||
2231 | {USB_DEVICE(0x1199, 0x901b)}, /* Sierra Wireless MC7770 */ | ||
2232 | {USB_DEVICE(0x12D1, 0x14F0)}, /* Sony Gobi 3000 QDL */ | ||
2233 | {USB_DEVICE(0x12D1, 0x14F1)}, /* Sony Gobi 3000 Composite */ | ||
2234 | + {USB_DEVICE(0x0AF0, 0x8120)}, /* Option GTM681W */ | ||
2235 | |||
2236 | /* non Gobi Qualcomm serial devices */ | ||
2237 | {USB_DEVICE_INTERFACE_NUMBER(0x0f3d, 0x68a2, 0)}, /* Sierra Wireless MC7700 Device Management */ | ||
2238 | diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c | ||
2239 | index 5d9b178..42de53c 100644 | ||
2240 | --- a/drivers/usb/serial/usb-serial.c | ||
2241 | +++ b/drivers/usb/serial/usb-serial.c | ||
2242 | @@ -379,6 +379,22 @@ static int serial_chars_in_buffer(struct tty_struct *tty) | ||
2243 | return count; | ||
2244 | } | ||
2245 | |||
2246 | +static void serial_wait_until_sent(struct tty_struct *tty, int timeout) | ||
2247 | +{ | ||
2248 | + struct usb_serial_port *port = tty->driver_data; | ||
2249 | + struct usb_serial *serial = port->serial; | ||
2250 | + | ||
2251 | + dev_dbg(tty->dev, "%s\n", __func__); | ||
2252 | + | ||
2253 | + if (!port->serial->type->wait_until_sent) | ||
2254 | + return; | ||
2255 | + | ||
2256 | + mutex_lock(&serial->disc_mutex); | ||
2257 | + if (!serial->disconnected) | ||
2258 | + port->serial->type->wait_until_sent(tty, timeout); | ||
2259 | + mutex_unlock(&serial->disc_mutex); | ||
2260 | +} | ||
2261 | + | ||
2262 | static void serial_throttle(struct tty_struct *tty) | ||
2263 | { | ||
2264 | struct usb_serial_port *port = tty->driver_data; | ||
2265 | @@ -1204,6 +1220,7 @@ static const struct tty_operations serial_ops = { | ||
2266 | .unthrottle = serial_unthrottle, | ||
2267 | .break_ctl = serial_break, | ||
2268 | .chars_in_buffer = serial_chars_in_buffer, | ||
2269 | + .wait_until_sent = serial_wait_until_sent, | ||
2270 | .tiocmget = serial_tiocmget, | ||
2271 | .tiocmset = serial_tiocmset, | ||
2272 | .get_icount = serial_get_icount, | ||
2273 | @@ -1329,6 +1346,8 @@ static void fixup_generic(struct usb_serial_driver *device) | ||
2274 | set_to_generic_if_null(device, close); | ||
2275 | set_to_generic_if_null(device, write_room); | ||
2276 | set_to_generic_if_null(device, chars_in_buffer); | ||
2277 | + if (device->tx_empty) | ||
2278 | + set_to_generic_if_null(device, wait_until_sent); | ||
2279 | set_to_generic_if_null(device, read_bulk_callback); | ||
2280 | set_to_generic_if_null(device, write_bulk_callback); | ||
2281 | set_to_generic_if_null(device, disconnect); | ||
2282 | diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c | ||
2283 | index 1129aa7..c24ee17 100644 | ||
2284 | --- a/drivers/usb/serial/visor.c | ||
2285 | +++ b/drivers/usb/serial/visor.c | ||
2286 | @@ -566,10 +566,19 @@ static int treo_attach(struct usb_serial *serial) | ||
2287 | */ | ||
2288 | #define COPY_PORT(dest, src) \ | ||
2289 | do { \ | ||
2290 | + int i; \ | ||
2291 | + \ | ||
2292 | + for (i = 0; i < ARRAY_SIZE(src->read_urbs); ++i) { \ | ||
2293 | + dest->read_urbs[i] = src->read_urbs[i]; \ | ||
2294 | + dest->read_urbs[i]->context = dest; \ | ||
2295 | + dest->bulk_in_buffers[i] = src->bulk_in_buffers[i]; \ | ||
2296 | + } \ | ||
2297 | dest->read_urb = src->read_urb; \ | ||
2298 | dest->bulk_in_endpointAddress = src->bulk_in_endpointAddress;\ | ||
2299 | dest->bulk_in_buffer = src->bulk_in_buffer; \ | ||
2300 | + dest->bulk_in_size = src->bulk_in_size; \ | ||
2301 | dest->interrupt_in_urb = src->interrupt_in_urb; \ | ||
2302 | + dest->interrupt_in_urb->context = dest; \ | ||
2303 | dest->interrupt_in_endpointAddress = \ | ||
2304 | src->interrupt_in_endpointAddress;\ | ||
2305 | dest->interrupt_in_buffer = src->interrupt_in_buffer; \ | ||
2306 | diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c | ||
2307 | index b9fca35..347caad 100644 | ||
2308 | --- a/drivers/usb/serial/whiteheat.c | ||
2309 | +++ b/drivers/usb/serial/whiteheat.c | ||
2310 | @@ -649,7 +649,7 @@ static void firm_setup_port(struct tty_struct *tty) | ||
2311 | struct whiteheat_port_settings port_settings; | ||
2312 | unsigned int cflag = tty->termios.c_cflag; | ||
2313 | |||
2314 | - port_settings.port = port->number + 1; | ||
2315 | + port_settings.port = port->number - port->serial->minor + 1; | ||
2316 | |||
2317 | /* get the byte size */ | ||
2318 | switch (cflag & CSIZE) { | ||
2319 | diff --git a/drivers/usb/serial/zte_ev.c b/drivers/usb/serial/zte_ev.c | ||
2320 | index 39ee737..fca4c75 100644 | ||
2321 | --- a/drivers/usb/serial/zte_ev.c | ||
2322 | +++ b/drivers/usb/serial/zte_ev.c | ||
2323 | @@ -41,9 +41,6 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | ||
2324 | int len; | ||
2325 | unsigned char *buf; | ||
2326 | |||
2327 | - if (port->number != 0) | ||
2328 | - return -ENODEV; | ||
2329 | - | ||
2330 | buf = kmalloc(MAX_SETUP_DATA_SIZE, GFP_KERNEL); | ||
2331 | if (!buf) | ||
2332 | return -ENOMEM; | ||
2333 | @@ -53,7 +50,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | ||
2334 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2335 | 0x22, 0x21, | ||
2336 | 0x0001, 0x0000, NULL, len, | ||
2337 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2338 | + USB_CTRL_GET_TIMEOUT); | ||
2339 | dev_dbg(dev, "result = %d\n", result); | ||
2340 | |||
2341 | /* send 2st cmd and recieve data */ | ||
2342 | @@ -65,7 +62,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | ||
2343 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | ||
2344 | 0x21, 0xa1, | ||
2345 | 0x0000, 0x0000, buf, len, | ||
2346 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2347 | + USB_CTRL_GET_TIMEOUT); | ||
2348 | debug_data(dev, __func__, len, buf, result); | ||
2349 | |||
2350 | /* send 3 cmd */ | ||
2351 | @@ -84,7 +81,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | ||
2352 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2353 | 0x20, 0x21, | ||
2354 | 0x0000, 0x0000, buf, len, | ||
2355 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2356 | + USB_CTRL_GET_TIMEOUT); | ||
2357 | debug_data(dev, __func__, len, buf, result); | ||
2358 | |||
2359 | /* send 4 cmd */ | ||
2360 | @@ -95,7 +92,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | ||
2361 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2362 | 0x22, 0x21, | ||
2363 | 0x0003, 0x0000, NULL, len, | ||
2364 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2365 | + USB_CTRL_GET_TIMEOUT); | ||
2366 | dev_dbg(dev, "result = %d\n", result); | ||
2367 | |||
2368 | /* send 5 cmd */ | ||
2369 | @@ -107,7 +104,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | ||
2370 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | ||
2371 | 0x21, 0xa1, | ||
2372 | 0x0000, 0x0000, buf, len, | ||
2373 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2374 | + USB_CTRL_GET_TIMEOUT); | ||
2375 | debug_data(dev, __func__, len, buf, result); | ||
2376 | |||
2377 | /* send 6 cmd */ | ||
2378 | @@ -126,7 +123,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, | ||
2379 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2380 | 0x20, 0x21, | ||
2381 | 0x0000, 0x0000, buf, len, | ||
2382 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2383 | + USB_CTRL_GET_TIMEOUT); | ||
2384 | debug_data(dev, __func__, len, buf, result); | ||
2385 | kfree(buf); | ||
2386 | |||
2387 | @@ -166,9 +163,6 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | ||
2388 | int len; | ||
2389 | unsigned char *buf; | ||
2390 | |||
2391 | - if (port->number != 0) | ||
2392 | - return; | ||
2393 | - | ||
2394 | buf = kmalloc(MAX_SETUP_DATA_SIZE, GFP_KERNEL); | ||
2395 | if (!buf) | ||
2396 | return; | ||
2397 | @@ -178,7 +172,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | ||
2398 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2399 | 0x22, 0x21, | ||
2400 | 0x0002, 0x0000, NULL, len, | ||
2401 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2402 | + USB_CTRL_GET_TIMEOUT); | ||
2403 | dev_dbg(dev, "result = %d\n", result); | ||
2404 | |||
2405 | /* send 2st ctl cmd(CTL 21 22 03 00 00 00 00 00 ) */ | ||
2406 | @@ -186,7 +180,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | ||
2407 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2408 | 0x22, 0x21, | ||
2409 | 0x0003, 0x0000, NULL, len, | ||
2410 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2411 | + USB_CTRL_GET_TIMEOUT); | ||
2412 | dev_dbg(dev, "result = %d\n", result); | ||
2413 | |||
2414 | /* send 3st cmd and recieve data */ | ||
2415 | @@ -198,7 +192,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | ||
2416 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | ||
2417 | 0x21, 0xa1, | ||
2418 | 0x0000, 0x0000, buf, len, | ||
2419 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2420 | + USB_CTRL_GET_TIMEOUT); | ||
2421 | debug_data(dev, __func__, len, buf, result); | ||
2422 | |||
2423 | /* send 4 cmd */ | ||
2424 | @@ -217,7 +211,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | ||
2425 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2426 | 0x20, 0x21, | ||
2427 | 0x0000, 0x0000, buf, len, | ||
2428 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2429 | + USB_CTRL_GET_TIMEOUT); | ||
2430 | debug_data(dev, __func__, len, buf, result); | ||
2431 | |||
2432 | /* send 5 cmd */ | ||
2433 | @@ -228,7 +222,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | ||
2434 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2435 | 0x22, 0x21, | ||
2436 | 0x0003, 0x0000, NULL, len, | ||
2437 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2438 | + USB_CTRL_GET_TIMEOUT); | ||
2439 | dev_dbg(dev, "result = %d\n", result); | ||
2440 | |||
2441 | /* send 6 cmd */ | ||
2442 | @@ -240,7 +234,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | ||
2443 | result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | ||
2444 | 0x21, 0xa1, | ||
2445 | 0x0000, 0x0000, buf, len, | ||
2446 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2447 | + USB_CTRL_GET_TIMEOUT); | ||
2448 | debug_data(dev, __func__, len, buf, result); | ||
2449 | |||
2450 | /* send 7 cmd */ | ||
2451 | @@ -259,7 +253,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | ||
2452 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2453 | 0x20, 0x21, | ||
2454 | 0x0000, 0x0000, buf, len, | ||
2455 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2456 | + USB_CTRL_GET_TIMEOUT); | ||
2457 | debug_data(dev, __func__, len, buf, result); | ||
2458 | |||
2459 | /* send 8 cmd */ | ||
2460 | @@ -270,7 +264,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | ||
2461 | result = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
2462 | 0x22, 0x21, | ||
2463 | 0x0003, 0x0000, NULL, len, | ||
2464 | - HZ * USB_CTRL_GET_TIMEOUT); | ||
2465 | + USB_CTRL_GET_TIMEOUT); | ||
2466 | dev_dbg(dev, "result = %d\n", result); | ||
2467 | |||
2468 | kfree(buf); | ||
2469 | @@ -279,11 +273,29 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) | ||
2470 | } | ||
2471 | |||
2472 | static const struct usb_device_id id_table[] = { | ||
2473 | - { USB_DEVICE(0x19d2, 0xffff) }, /* AC8700 */ | ||
2474 | - { USB_DEVICE(0x19d2, 0xfffe) }, | ||
2475 | - { USB_DEVICE(0x19d2, 0xfffd) }, /* MG880 */ | ||
2476 | + /* AC8710, AC8710T */ | ||
2477 | + { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffff, 0xff, 0xff, 0xff) }, | ||
2478 | + /* AC8700 */ | ||
2479 | + { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfffe, 0xff, 0xff, 0xff) }, | ||
2480 | + /* MG880 */ | ||
2481 | + { USB_DEVICE(0x19d2, 0xfffd) }, | ||
2482 | + { USB_DEVICE(0x19d2, 0xfffc) }, | ||
2483 | + { USB_DEVICE(0x19d2, 0xfffb) }, | ||
2484 | + /* AC2726, AC8710_V3 */ | ||
2485 | + { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff1, 0xff, 0xff, 0xff) }, | ||
2486 | + { USB_DEVICE(0x19d2, 0xfff6) }, | ||
2487 | + { USB_DEVICE(0x19d2, 0xfff7) }, | ||
2488 | + { USB_DEVICE(0x19d2, 0xfff8) }, | ||
2489 | + { USB_DEVICE(0x19d2, 0xfff9) }, | ||
2490 | + { USB_DEVICE(0x19d2, 0xffee) }, | ||
2491 | + /* AC2716, MC2716 */ | ||
2492 | + { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffed, 0xff, 0xff, 0xff) }, | ||
2493 | + /* AD3812 */ | ||
2494 | + { USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xffeb, 0xff, 0xff, 0xff) }, | ||
2495 | + { USB_DEVICE(0x19d2, 0xffec) }, | ||
2496 | { USB_DEVICE(0x05C6, 0x3197) }, | ||
2497 | { USB_DEVICE(0x05C6, 0x6000) }, | ||
2498 | + { USB_DEVICE(0x05C6, 0x9008) }, | ||
2499 | { }, | ||
2500 | }; | ||
2501 | MODULE_DEVICE_TABLE(usb, id_table); | ||
2502 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c | ||
2503 | index 21b3a29..6c4b480 100644 | ||
2504 | --- a/fs/cifs/connect.c | ||
2505 | +++ b/fs/cifs/connect.c | ||
2506 | @@ -3332,8 +3332,8 @@ build_unc_path_to_root(const struct smb_vol *vol, | ||
2507 | pos = full_path + unc_len; | ||
2508 | |||
2509 | if (pplen) { | ||
2510 | - *pos++ = CIFS_DIR_SEP(cifs_sb); | ||
2511 | - strncpy(pos, vol->prepath, pplen); | ||
2512 | + *pos = CIFS_DIR_SEP(cifs_sb); | ||
2513 | + strncpy(pos + 1, vol->prepath, pplen); | ||
2514 | pos += pplen; | ||
2515 | } | ||
2516 | |||
2517 | diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c | ||
2518 | index 63b1f54..3d7fb59 100644 | ||
2519 | --- a/fs/ecryptfs/file.c | ||
2520 | +++ b/fs/ecryptfs/file.c | ||
2521 | @@ -294,6 +294,12 @@ static int ecryptfs_release(struct inode *inode, struct file *file) | ||
2522 | static int | ||
2523 | ecryptfs_fsync(struct file *file, loff_t start, loff_t end, int datasync) | ||
2524 | { | ||
2525 | + int rc; | ||
2526 | + | ||
2527 | + rc = filemap_write_and_wait(file->f_mapping); | ||
2528 | + if (rc) | ||
2529 | + return rc; | ||
2530 | + | ||
2531 | return vfs_fsync(ecryptfs_file_to_lower(file), datasync); | ||
2532 | } | ||
2533 | |||
2534 | diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c | ||
2535 | index 9f9dbec..5d325c5 100644 | ||
2536 | --- a/fs/hpfs/file.c | ||
2537 | +++ b/fs/hpfs/file.c | ||
2538 | @@ -109,10 +109,14 @@ static void hpfs_write_failed(struct address_space *mapping, loff_t to) | ||
2539 | { | ||
2540 | struct inode *inode = mapping->host; | ||
2541 | |||
2542 | + hpfs_lock(inode->i_sb); | ||
2543 | + | ||
2544 | if (to > inode->i_size) { | ||
2545 | truncate_pagecache(inode, to, inode->i_size); | ||
2546 | hpfs_truncate(inode); | ||
2547 | } | ||
2548 | + | ||
2549 | + hpfs_unlock(inode->i_sb); | ||
2550 | } | ||
2551 | |||
2552 | static int hpfs_write_begin(struct file *file, struct address_space *mapping, | ||
2553 | diff --git a/include/linux/usb/serial.h b/include/linux/usb/serial.h | ||
2554 | index 1819b59..73afb19 100644 | ||
2555 | --- a/include/linux/usb/serial.h | ||
2556 | +++ b/include/linux/usb/serial.h | ||
2557 | @@ -267,6 +267,8 @@ struct usb_serial_driver { | ||
2558 | struct usb_serial_port *port, struct ktermios *old); | ||
2559 | void (*break_ctl)(struct tty_struct *tty, int break_state); | ||
2560 | int (*chars_in_buffer)(struct tty_struct *tty); | ||
2561 | + void (*wait_until_sent)(struct tty_struct *tty, long timeout); | ||
2562 | + bool (*tx_empty)(struct usb_serial_port *port); | ||
2563 | void (*throttle)(struct tty_struct *tty); | ||
2564 | void (*unthrottle)(struct tty_struct *tty); | ||
2565 | int (*tiocmget)(struct tty_struct *tty); | ||
2566 | @@ -325,6 +327,8 @@ extern void usb_serial_generic_close(struct usb_serial_port *port); | ||
2567 | extern int usb_serial_generic_resume(struct usb_serial *serial); | ||
2568 | extern int usb_serial_generic_write_room(struct tty_struct *tty); | ||
2569 | extern int usb_serial_generic_chars_in_buffer(struct tty_struct *tty); | ||
2570 | +extern void usb_serial_generic_wait_until_sent(struct tty_struct *tty, | ||
2571 | + long timeout); | ||
2572 | extern void usb_serial_generic_read_bulk_callback(struct urb *urb); | ||
2573 | extern void usb_serial_generic_write_bulk_callback(struct urb *urb); | ||
2574 | extern void usb_serial_generic_throttle(struct tty_struct *tty); | ||
2575 | diff --git a/kernel/softirq.c b/kernel/softirq.c | ||
2576 | index 14d7758..d93dcb1 100644 | ||
2577 | --- a/kernel/softirq.c | ||
2578 | +++ b/kernel/softirq.c | ||
2579 | @@ -195,8 +195,12 @@ void local_bh_enable_ip(unsigned long ip) | ||
2580 | EXPORT_SYMBOL(local_bh_enable_ip); | ||
2581 | |||
2582 | /* | ||
2583 | - * We restart softirq processing for at most 2 ms, | ||
2584 | - * and if need_resched() is not set. | ||
2585 | + * We restart softirq processing for at most MAX_SOFTIRQ_RESTART times, | ||
2586 | + * but break the loop if need_resched() is set or after 2 ms. | ||
2587 | + * The MAX_SOFTIRQ_TIME provides a nice upper bound in most cases, but in | ||
2588 | + * certain cases, such as stop_machine(), jiffies may cease to | ||
2589 | + * increment and so we need the MAX_SOFTIRQ_RESTART limit as | ||
2590 | + * well to make sure we eventually return from this method. | ||
2591 | * | ||
2592 | * These limits have been established via experimentation. | ||
2593 | * The two things to balance is latency against fairness - | ||
2594 | @@ -204,6 +208,7 @@ EXPORT_SYMBOL(local_bh_enable_ip); | ||
2595 | * should not be able to lock up the box. | ||
2596 | */ | ||
2597 | #define MAX_SOFTIRQ_TIME msecs_to_jiffies(2) | ||
2598 | +#define MAX_SOFTIRQ_RESTART 10 | ||
2599 | |||
2600 | asmlinkage void __do_softirq(void) | ||
2601 | { | ||
2602 | @@ -212,6 +217,7 @@ asmlinkage void __do_softirq(void) | ||
2603 | unsigned long end = jiffies + MAX_SOFTIRQ_TIME; | ||
2604 | int cpu; | ||
2605 | unsigned long old_flags = current->flags; | ||
2606 | + int max_restart = MAX_SOFTIRQ_RESTART; | ||
2607 | |||
2608 | /* | ||
2609 | * Mask out PF_MEMALLOC s current task context is borrowed for the | ||
2610 | @@ -265,7 +271,8 @@ restart: | ||
2611 | |||
2612 | pending = local_softirq_pending(); | ||
2613 | if (pending) { | ||
2614 | - if (time_before(jiffies, end) && !need_resched()) | ||
2615 | + if (time_before(jiffies, end) && !need_resched() && | ||
2616 | + --max_restart) | ||
2617 | goto restart; | ||
2618 | |||
2619 | wakeup_softirqd(); | ||
2620 | diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c | ||
2621 | index 9a0bc98..183df62 100644 | ||
2622 | --- a/kernel/time/timekeeping.c | ||
2623 | +++ b/kernel/time/timekeeping.c | ||
2624 | @@ -826,6 +826,14 @@ static int timekeeping_suspend(void) | ||
2625 | |||
2626 | read_persistent_clock(&timekeeping_suspend_time); | ||
2627 | |||
2628 | + /* | ||
2629 | + * On some systems the persistent_clock can not be detected at | ||
2630 | + * timekeeping_init by its return value, so if we see a valid | ||
2631 | + * value returned, update the persistent_clock_exists flag. | ||
2632 | + */ | ||
2633 | + if (timekeeping_suspend_time.tv_sec || timekeeping_suspend_time.tv_nsec) | ||
2634 | + persistent_clock_exist = true; | ||
2635 | + | ||
2636 | write_seqlock_irqsave(&tk->lock, flags); | ||
2637 | timekeeping_forward_now(tk); | ||
2638 | timekeeping_suspended = 1; | ||
2639 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c | ||
2640 | index d74500b..222b6de 100644 | ||
2641 | --- a/sound/pci/hda/hda_generic.c | ||
2642 | +++ b/sound/pci/hda/hda_generic.c | ||
2643 | @@ -772,6 +772,8 @@ static void set_pin_eapd(struct hda_codec *codec, hda_nid_t pin, bool enable) | ||
2644 | return; | ||
2645 | if (codec->inv_eapd) | ||
2646 | enable = !enable; | ||
2647 | + if (spec->keep_eapd_on && !enable) | ||
2648 | + return; | ||
2649 | snd_hda_codec_update_cache(codec, pin, 0, | ||
2650 | AC_VERB_SET_EAPD_BTLENABLE, | ||
2651 | enable ? 0x02 : 0x00); | ||
2652 | @@ -3671,6 +3673,36 @@ static void update_automute_all(struct hda_codec *codec) | ||
2653 | snd_hda_gen_mic_autoswitch(codec, NULL); | ||
2654 | } | ||
2655 | |||
2656 | +/* call appropriate hooks */ | ||
2657 | +static void call_hp_automute(struct hda_codec *codec, struct hda_jack_tbl *jack) | ||
2658 | +{ | ||
2659 | + struct hda_gen_spec *spec = codec->spec; | ||
2660 | + if (spec->hp_automute_hook) | ||
2661 | + spec->hp_automute_hook(codec, jack); | ||
2662 | + else | ||
2663 | + snd_hda_gen_hp_automute(codec, jack); | ||
2664 | +} | ||
2665 | + | ||
2666 | +static void call_line_automute(struct hda_codec *codec, | ||
2667 | + struct hda_jack_tbl *jack) | ||
2668 | +{ | ||
2669 | + struct hda_gen_spec *spec = codec->spec; | ||
2670 | + if (spec->line_automute_hook) | ||
2671 | + spec->line_automute_hook(codec, jack); | ||
2672 | + else | ||
2673 | + snd_hda_gen_line_automute(codec, jack); | ||
2674 | +} | ||
2675 | + | ||
2676 | +static void call_mic_autoswitch(struct hda_codec *codec, | ||
2677 | + struct hda_jack_tbl *jack) | ||
2678 | +{ | ||
2679 | + struct hda_gen_spec *spec = codec->spec; | ||
2680 | + if (spec->mic_autoswitch_hook) | ||
2681 | + spec->mic_autoswitch_hook(codec, jack); | ||
2682 | + else | ||
2683 | + snd_hda_gen_mic_autoswitch(codec, jack); | ||
2684 | +} | ||
2685 | + | ||
2686 | /* | ||
2687 | * Auto-Mute mode mixer enum support | ||
2688 | */ | ||
2689 | @@ -3805,9 +3837,7 @@ static int check_auto_mute_availability(struct hda_codec *codec) | ||
2690 | snd_printdd("hda-codec: Enable HP auto-muting on NID 0x%x\n", | ||
2691 | nid); | ||
2692 | snd_hda_jack_detect_enable_callback(codec, nid, HDA_GEN_HP_EVENT, | ||
2693 | - spec->hp_automute_hook ? | ||
2694 | - spec->hp_automute_hook : | ||
2695 | - snd_hda_gen_hp_automute); | ||
2696 | + call_hp_automute); | ||
2697 | spec->detect_hp = 1; | ||
2698 | } | ||
2699 | |||
2700 | @@ -3820,9 +3850,7 @@ static int check_auto_mute_availability(struct hda_codec *codec) | ||
2701 | snd_printdd("hda-codec: Enable Line-Out auto-muting on NID 0x%x\n", nid); | ||
2702 | snd_hda_jack_detect_enable_callback(codec, nid, | ||
2703 | HDA_GEN_FRONT_EVENT, | ||
2704 | - spec->line_automute_hook ? | ||
2705 | - spec->line_automute_hook : | ||
2706 | - snd_hda_gen_line_automute); | ||
2707 | + call_line_automute); | ||
2708 | spec->detect_lo = 1; | ||
2709 | } | ||
2710 | spec->automute_lo_possible = spec->detect_hp; | ||
2711 | @@ -3864,9 +3892,7 @@ static bool auto_mic_check_imux(struct hda_codec *codec) | ||
2712 | snd_hda_jack_detect_enable_callback(codec, | ||
2713 | spec->am_entry[i].pin, | ||
2714 | HDA_GEN_MIC_EVENT, | ||
2715 | - spec->mic_autoswitch_hook ? | ||
2716 | - spec->mic_autoswitch_hook : | ||
2717 | - snd_hda_gen_mic_autoswitch); | ||
2718 | + call_mic_autoswitch); | ||
2719 | return true; | ||
2720 | } | ||
2721 | |||
2722 | diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h | ||
2723 | index 009b57b..aee3238 100644 | ||
2724 | --- a/sound/pci/hda/hda_generic.h | ||
2725 | +++ b/sound/pci/hda/hda_generic.h | ||
2726 | @@ -205,6 +205,7 @@ struct hda_gen_spec { | ||
2727 | unsigned int multi_cap_vol:1; /* allow multiple capture xxx volumes */ | ||
2728 | unsigned int inv_dmic_split:1; /* inverted dmic w/a for conexant */ | ||
2729 | unsigned int own_eapd_ctl:1; /* set EAPD by own function */ | ||
2730 | + unsigned int keep_eapd_on:1; /* don't turn off EAPD automatically */ | ||
2731 | unsigned int vmaster_mute_enum:1; /* add vmaster mute mode enum */ | ||
2732 | unsigned int indep_hp:1; /* independent HP supported */ | ||
2733 | unsigned int prefer_hp_amp:1; /* enable HP amp for speaker if any */ | ||
2734 | diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c | ||
2735 | index c35338a..9a9a032 100644 | ||
2736 | --- a/sound/pci/hda/patch_via.c | ||
2737 | +++ b/sound/pci/hda/patch_via.c | ||
2738 | @@ -136,6 +136,7 @@ static struct via_spec *via_new_spec(struct hda_codec *codec) | ||
2739 | spec->codec_type = VT1708S; | ||
2740 | spec->no_pin_power_ctl = 1; | ||
2741 | spec->gen.indep_hp = 1; | ||
2742 | + spec->gen.keep_eapd_on = 1; | ||
2743 | spec->gen.pcm_playback_hook = via_playback_pcm_hook; | ||
2744 | return spec; | ||
2745 | } | ||
2746 | @@ -231,9 +232,14 @@ static void vt1708_update_hp_work(struct hda_codec *codec) | ||
2747 | |||
2748 | static void set_widgets_power_state(struct hda_codec *codec) | ||
2749 | { | ||
2750 | +#if 0 /* FIXME: the assumed connections don't match always with the | ||
2751 | + * actual routes by the generic parser, so better to disable | ||
2752 | + * the control for safety. | ||
2753 | + */ | ||
2754 | struct via_spec *spec = codec->spec; | ||
2755 | if (spec->set_widgets_power_state) | ||
2756 | spec->set_widgets_power_state(codec); | ||
2757 | +#endif | ||
2758 | } | ||
2759 | |||
2760 | static void update_power_state(struct hda_codec *codec, hda_nid_t nid, | ||
2761 | @@ -478,7 +484,9 @@ static int via_suspend(struct hda_codec *codec) | ||
2762 | /* Fix pop noise on headphones */ | ||
2763 | int i; | ||
2764 | for (i = 0; i < spec->gen.autocfg.hp_outs; i++) | ||
2765 | - snd_hda_set_pin_ctl(codec, spec->gen.autocfg.hp_pins[i], 0); | ||
2766 | + snd_hda_codec_write(codec, spec->gen.autocfg.hp_pins[i], | ||
2767 | + 0, AC_VERB_SET_PIN_WIDGET_CONTROL, | ||
2768 | + 0x00); | ||
2769 | } | ||
2770 | |||
2771 | return 0; | ||
2772 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c | ||
2773 | index ca4739c..e5c7f9f 100644 | ||
2774 | --- a/sound/usb/mixer.c | ||
2775 | +++ b/sound/usb/mixer.c | ||
2776 | @@ -886,6 +886,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, | ||
2777 | case USB_ID(0x046d, 0x0808): | ||
2778 | case USB_ID(0x046d, 0x0809): | ||
2779 | case USB_ID(0x046d, 0x081d): /* HD Webcam c510 */ | ||
2780 | + case USB_ID(0x046d, 0x0825): /* HD Webcam c270 */ | ||
2781 | case USB_ID(0x046d, 0x0991): | ||
2782 | /* Most audio usb devices lie about volume resolution. | ||
2783 | * Most Logitech webcams have res = 384. | ||
2784 | diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h | ||
2785 | index c39f898..1c719d8 100644 | ||
2786 | --- a/sound/usb/quirks-table.h | ||
2787 | +++ b/sound/usb/quirks-table.h | ||
2788 | @@ -215,7 +215,13 @@ | ||
2789 | .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL | ||
2790 | }, | ||
2791 | { | ||
2792 | - USB_DEVICE(0x046d, 0x0990), | ||
2793 | + .match_flags = USB_DEVICE_ID_MATCH_DEVICE | | ||
2794 | + USB_DEVICE_ID_MATCH_INT_CLASS | | ||
2795 | + USB_DEVICE_ID_MATCH_INT_SUBCLASS, | ||
2796 | + .idVendor = 0x046d, | ||
2797 | + .idProduct = 0x0990, | ||
2798 | + .bInterfaceClass = USB_CLASS_AUDIO, | ||
2799 | + .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL, | ||
2800 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | ||
2801 | .vendor_name = "Logitech, Inc.", | ||
2802 | .product_name = "QuickCam Pro 9000", | ||
2803 | @@ -1714,7 +1720,11 @@ YAMAHA_DEVICE(0x7010, "UB99"), | ||
2804 | USB_DEVICE_VENDOR_SPEC(0x0582, 0x0108), | ||
2805 | .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { | ||
2806 | .ifnum = 0, | ||
2807 | - .type = QUIRK_MIDI_STANDARD_INTERFACE | ||
2808 | + .type = QUIRK_MIDI_FIXED_ENDPOINT, | ||
2809 | + .data = & (const struct snd_usb_midi_endpoint_info) { | ||
2810 | + .out_cables = 0x0007, | ||
2811 | + .in_cables = 0x0007 | ||
2812 | + } | ||
2813 | } | ||
2814 | }, | ||
2815 | { |