Contents of /trunk/kernel26-magellan-server/patches-2.6.27-r2/0108-2.6.27.9-all-fixes.patch
Parent Directory | Revision Log
Revision 728 -
(show annotations)
(download)
Tue Dec 23 09:41:15 2008 UTC (15 years, 9 months ago) by niro
File size: 106337 byte(s)
Tue Dec 23 09:41:15 2008 UTC (15 years, 9 months ago) by niro
File size: 106337 byte(s)
-ver bump to 2.6.27-r2: - updated to linux-2.6.27.10 - using tuxonice current-20081025 - adjusted kernel-configs to use tuxonice and enabled ufs filesystem support
1 | diff --git a/arch/powerpc/kernel/cpu_setup_44x.S b/arch/powerpc/kernel/cpu_setup_44x.S |
2 | index 80cac98..f812452 100644 |
3 | --- a/arch/powerpc/kernel/cpu_setup_44x.S |
4 | +++ b/arch/powerpc/kernel/cpu_setup_44x.S |
5 | @@ -35,6 +35,7 @@ _GLOBAL(__setup_cpu_440grx) |
6 | _GLOBAL(__setup_cpu_460ex) |
7 | _GLOBAL(__setup_cpu_460gt) |
8 | b __init_fpu_44x |
9 | +_GLOBAL(__setup_cpu_440x5) |
10 | _GLOBAL(__setup_cpu_440gx) |
11 | _GLOBAL(__setup_cpu_440spe) |
12 | b __fixup_440A_mcheck |
13 | diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c |
14 | index 25c273c..2b88cae 100644 |
15 | --- a/arch/powerpc/kernel/cputable.c |
16 | +++ b/arch/powerpc/kernel/cputable.c |
17 | @@ -39,6 +39,7 @@ extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec); |
18 | extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec); |
19 | extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec); |
20 | extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec); |
21 | +extern void __setup_cpu_440x5(unsigned long offset, struct cpu_spec* spec); |
22 | extern void __setup_cpu_460ex(unsigned long offset, struct cpu_spec* spec); |
23 | extern void __setup_cpu_460gt(unsigned long offset, struct cpu_spec* spec); |
24 | extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec); |
25 | @@ -1463,6 +1464,8 @@ static struct cpu_spec __initdata cpu_specs[] = { |
26 | .cpu_user_features = COMMON_USER_BOOKE, |
27 | .icache_bsize = 32, |
28 | .dcache_bsize = 32, |
29 | + .cpu_setup = __setup_cpu_440x5, |
30 | + .machine_check = machine_check_440A, |
31 | .platform = "ppc440", |
32 | }, |
33 | { /* 460EX */ |
34 | diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c |
35 | index efb3964..c0d86e1 100644 |
36 | --- a/arch/powerpc/platforms/cell/smp.c |
37 | +++ b/arch/powerpc/platforms/cell/smp.c |
38 | @@ -54,8 +54,8 @@ |
39 | #endif |
40 | |
41 | /* |
42 | - * The primary thread of each non-boot processor is recorded here before |
43 | - * smp init. |
44 | + * The Primary thread of each non-boot processor was started from the OF client |
45 | + * interface by prom_hold_cpus and is spinning on secondary_hold_spinloop. |
46 | */ |
47 | static cpumask_t of_spin_map; |
48 | |
49 | @@ -208,11 +208,7 @@ void __init smp_init_cell(void) |
50 | /* Mark threads which are still spinning in hold loops. */ |
51 | if (cpu_has_feature(CPU_FTR_SMT)) { |
52 | for_each_present_cpu(i) { |
53 | - if (i % 2 == 0) |
54 | - /* |
55 | - * Even-numbered logical cpus correspond to |
56 | - * primary threads. |
57 | - */ |
58 | + if (cpu_thread_in_core(i) == 0) |
59 | cpu_set(i, of_spin_map); |
60 | } |
61 | } else { |
62 | diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c |
63 | index 9d8f8c8..c9337c7 100644 |
64 | --- a/arch/powerpc/platforms/pseries/smp.c |
65 | +++ b/arch/powerpc/platforms/pseries/smp.c |
66 | @@ -52,8 +52,8 @@ |
67 | |
68 | |
69 | /* |
70 | - * The primary thread of each non-boot processor is recorded here before |
71 | - * smp init. |
72 | + * The Primary thread of each non-boot processor was started from the OF client |
73 | + * interface by prom_hold_cpus and is spinning on secondary_hold_spinloop. |
74 | */ |
75 | static cpumask_t of_spin_map; |
76 | |
77 | @@ -191,8 +191,7 @@ static void __devinit smp_pSeries_kick_cpu(int nr) |
78 | static int smp_pSeries_cpu_bootable(unsigned int nr) |
79 | { |
80 | /* Special case - we inhibit secondary thread startup |
81 | - * during boot if the user requests it. Odd-numbered |
82 | - * cpus are assumed to be secondary threads. |
83 | + * during boot if the user requests it. |
84 | */ |
85 | if (system_state < SYSTEM_RUNNING && |
86 | cpu_has_feature(CPU_FTR_SMT) && |
87 | @@ -229,11 +228,7 @@ static void __init smp_init_pseries(void) |
88 | /* Mark threads which are still spinning in hold loops. */ |
89 | if (cpu_has_feature(CPU_FTR_SMT)) { |
90 | for_each_present_cpu(i) { |
91 | - if (i % 2 == 0) |
92 | - /* |
93 | - * Even-numbered logical cpus correspond to |
94 | - * primary threads. |
95 | - */ |
96 | + if (cpu_thread_in_core(i) == 0) |
97 | cpu_set(i, of_spin_map); |
98 | } |
99 | } else { |
100 | diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c |
101 | index f6299cc..b24e1d0 100644 |
102 | --- a/arch/powerpc/sysdev/mpic.c |
103 | +++ b/arch/powerpc/sysdev/mpic.c |
104 | @@ -1271,6 +1271,7 @@ void __init mpic_set_default_senses(struct mpic *mpic, u8 *senses, int count) |
105 | void __init mpic_init(struct mpic *mpic) |
106 | { |
107 | int i; |
108 | + int cpu; |
109 | |
110 | BUG_ON(mpic->num_sources == 0); |
111 | |
112 | @@ -1313,6 +1314,11 @@ void __init mpic_init(struct mpic *mpic) |
113 | |
114 | mpic_pasemi_msi_init(mpic); |
115 | |
116 | + if (mpic->flags & MPIC_PRIMARY) |
117 | + cpu = hard_smp_processor_id(); |
118 | + else |
119 | + cpu = 0; |
120 | + |
121 | for (i = 0; i < mpic->num_sources; i++) { |
122 | /* start with vector = source number, and masked */ |
123 | u32 vecpri = MPIC_VECPRI_MASK | i | |
124 | @@ -1323,8 +1329,7 @@ void __init mpic_init(struct mpic *mpic) |
125 | continue; |
126 | /* init hw */ |
127 | mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI), vecpri); |
128 | - mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION), |
129 | - 1 << hard_smp_processor_id()); |
130 | + mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION), 1 << cpu); |
131 | } |
132 | |
133 | /* Init spurious vector */ |
134 | diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h |
135 | index 296ef30..c64e767 100644 |
136 | --- a/arch/sparc/include/asm/uaccess_64.h |
137 | +++ b/arch/sparc/include/asm/uaccess_64.h |
138 | @@ -265,8 +265,8 @@ extern long __strnlen_user(const char __user *, long len); |
139 | |
140 | #define strlen_user __strlen_user |
141 | #define strnlen_user __strnlen_user |
142 | -#define __copy_to_user_inatomic __copy_to_user |
143 | -#define __copy_from_user_inatomic __copy_from_user |
144 | +#define __copy_to_user_inatomic ___copy_to_user |
145 | +#define __copy_from_user_inatomic ___copy_from_user |
146 | |
147 | #endif /* __ASSEMBLY__ */ |
148 | |
149 | diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c |
150 | index 80dad76..83b4725 100644 |
151 | --- a/arch/sparc64/kernel/pci.c |
152 | +++ b/arch/sparc64/kernel/pci.c |
153 | @@ -1017,6 +1017,7 @@ static int __pci_mmap_make_offset(struct pci_dev *pdev, |
154 | |
155 | for (i = 0; i <= PCI_ROM_RESOURCE; i++) { |
156 | struct resource *rp = &pdev->resource[i]; |
157 | + resource_size_t aligned_end; |
158 | |
159 | /* Active? */ |
160 | if (!rp->flags) |
161 | @@ -1034,8 +1035,15 @@ static int __pci_mmap_make_offset(struct pci_dev *pdev, |
162 | continue; |
163 | } |
164 | |
165 | + /* Align the resource end to the next page address. |
166 | + * PAGE_SIZE intentionally added instead of (PAGE_SIZE - 1), |
167 | + * because actually we need the address of the next byte |
168 | + * after rp->end. |
169 | + */ |
170 | + aligned_end = (rp->end + PAGE_SIZE) & PAGE_MASK; |
171 | + |
172 | if ((rp->start <= user_paddr) && |
173 | - (user_paddr + user_size) <= (rp->end + 1UL)) |
174 | + (user_paddr + user_size) <= aligned_end) |
175 | break; |
176 | } |
177 | |
178 | diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c |
179 | index 10306e4..2df5b9b 100644 |
180 | --- a/arch/sparc64/kernel/ptrace.c |
181 | +++ b/arch/sparc64/kernel/ptrace.c |
182 | @@ -1014,7 +1014,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) |
183 | break; |
184 | |
185 | case PTRACE_SETFPREGS64: |
186 | - ret = copy_regset_to_user(child, view, REGSET_FP, |
187 | + ret = copy_regset_from_user(child, view, REGSET_FP, |
188 | 0 * sizeof(u64), |
189 | 33 * sizeof(u64), |
190 | fps); |
191 | diff --git a/arch/sparc64/kernel/visemul.c b/arch/sparc64/kernel/visemul.c |
192 | index c3fd647..a4428fd 100644 |
193 | --- a/arch/sparc64/kernel/visemul.c |
194 | +++ b/arch/sparc64/kernel/visemul.c |
195 | @@ -131,7 +131,7 @@ |
196 | #define VIS_OPF_SHIFT 5 |
197 | #define VIS_OPF_MASK (0x1ff << VIS_OPF_SHIFT) |
198 | |
199 | -#define RS1(INSN) (((INSN) >> 24) & 0x1f) |
200 | +#define RS1(INSN) (((INSN) >> 14) & 0x1f) |
201 | #define RS2(INSN) (((INSN) >> 0) & 0x1f) |
202 | #define RD(INSN) (((INSN) >> 25) & 0x1f) |
203 | |
204 | @@ -445,7 +445,7 @@ static void pdist(struct pt_regs *regs, unsigned int insn) |
205 | unsigned long i; |
206 | |
207 | rs1 = fpd_regval(f, RS1(insn)); |
208 | - rs2 = fpd_regval(f, RS1(insn)); |
209 | + rs2 = fpd_regval(f, RS2(insn)); |
210 | rd = fpd_regaddr(f, RD(insn)); |
211 | |
212 | rd_val = *rd; |
213 | @@ -807,6 +807,8 @@ int vis_emul(struct pt_regs *regs, unsigned int insn) |
214 | if (get_user(insn, (u32 __user *) pc)) |
215 | return -EFAULT; |
216 | |
217 | + save_and_clear_fpu(); |
218 | + |
219 | opf = (insn & VIS_OPF_MASK) >> VIS_OPF_SHIFT; |
220 | switch (opf) { |
221 | default: |
222 | diff --git a/arch/sparc64/lib/user_fixup.c b/arch/sparc64/lib/user_fixup.c |
223 | index 19d1fdb..05a361b 100644 |
224 | --- a/arch/sparc64/lib/user_fixup.c |
225 | +++ b/arch/sparc64/lib/user_fixup.c |
226 | @@ -24,7 +24,7 @@ static unsigned long compute_size(unsigned long start, unsigned long size, unsig |
227 | if (fault_addr < start || fault_addr >= end) { |
228 | *offset = 0; |
229 | } else { |
230 | - *offset = start - fault_addr; |
231 | + *offset = fault_addr - start; |
232 | size = end - fault_addr; |
233 | } |
234 | return size; |
235 | diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c |
236 | index 19d579d..8f44ebb 100644 |
237 | --- a/arch/um/drivers/mconsole_kern.c |
238 | +++ b/arch/um/drivers/mconsole_kern.c |
239 | @@ -16,6 +16,8 @@ |
240 | #include <linux/slab.h> |
241 | #include <linux/syscalls.h> |
242 | #include <linux/utsname.h> |
243 | +#include <linux/socket.h> |
244 | +#include <linux/un.h> |
245 | #include <linux/workqueue.h> |
246 | #include <linux/mutex.h> |
247 | #include <asm/uaccess.h> |
248 | @@ -785,7 +787,7 @@ static int __init mconsole_init(void) |
249 | /* long to avoid size mismatch warnings from gcc */ |
250 | long sock; |
251 | int err; |
252 | - char file[256]; |
253 | + char file[UNIX_PATH_MAX]; |
254 | |
255 | if (umid_file_name("mconsole", file, sizeof(file))) |
256 | return -1; |
257 | diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c |
258 | index 73deaff..759e8da 100644 |
259 | --- a/arch/x86/kernel/hpet.c |
260 | +++ b/arch/x86/kernel/hpet.c |
261 | @@ -283,7 +283,7 @@ static int hpet_legacy_next_event(unsigned long delta, |
262 | * what we wrote hit the chip before we compare it to the |
263 | * counter. |
264 | */ |
265 | - WARN_ON((u32)hpet_readl(HPET_T0_CMP) != cnt); |
266 | + WARN_ON_ONCE((u32)hpet_readl(HPET_T0_CMP) != cnt); |
267 | |
268 | return (s32)((u32)hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0; |
269 | } |
270 | diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c |
271 | index d3746ef..1adbb3e 100644 |
272 | --- a/arch/x86/mm/init_64.c |
273 | +++ b/arch/x86/mm/init_64.c |
274 | @@ -721,12 +721,12 @@ int arch_add_memory(int nid, u64 start, u64 size) |
275 | unsigned long nr_pages = size >> PAGE_SHIFT; |
276 | int ret; |
277 | |
278 | - last_mapped_pfn = init_memory_mapping(start, start + size-1); |
279 | + last_mapped_pfn = init_memory_mapping(start, start + size); |
280 | if (last_mapped_pfn > max_pfn_mapped) |
281 | max_pfn_mapped = last_mapped_pfn; |
282 | |
283 | ret = __add_pages(zone, start_pfn, nr_pages); |
284 | - WARN_ON(1); |
285 | + WARN_ON_ONCE(ret); |
286 | |
287 | return ret; |
288 | } |
289 | diff --git a/block/bsg.c b/block/bsg.c |
290 | index 0aae8d7..9cfbea8 100644 |
291 | --- a/block/bsg.c |
292 | +++ b/block/bsg.c |
293 | @@ -202,6 +202,8 @@ static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq, |
294 | rq->timeout = q->sg_timeout; |
295 | if (!rq->timeout) |
296 | rq->timeout = BLK_DEFAULT_SG_TIMEOUT; |
297 | + if (rq->timeout < BLK_MIN_SG_TIMEOUT) |
298 | + rq->timeout = BLK_MIN_SG_TIMEOUT; |
299 | |
300 | return 0; |
301 | } |
302 | diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c |
303 | index ec4b7f2..dd3281a 100644 |
304 | --- a/block/scsi_ioctl.c |
305 | +++ b/block/scsi_ioctl.c |
306 | @@ -208,6 +208,8 @@ static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, |
307 | rq->timeout = q->sg_timeout; |
308 | if (!rq->timeout) |
309 | rq->timeout = BLK_DEFAULT_SG_TIMEOUT; |
310 | + if (rq->timeout < BLK_MIN_SG_TIMEOUT) |
311 | + rq->timeout = BLK_MIN_SG_TIMEOUT; |
312 | |
313 | return 0; |
314 | } |
315 | diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c |
316 | index 235a138..b0d40aa 100644 |
317 | --- a/drivers/acpi/osl.c |
318 | +++ b/drivers/acpi/osl.c |
319 | @@ -1261,34 +1261,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object) |
320 | return (AE_OK); |
321 | } |
322 | |
323 | -/** |
324 | - * acpi_dmi_dump - dump DMI slots needed for blacklist entry |
325 | - * |
326 | - * Returns 0 on success |
327 | - */ |
328 | -static int acpi_dmi_dump(void) |
329 | -{ |
330 | - |
331 | - if (!dmi_available) |
332 | - return -1; |
333 | - |
334 | - printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n", |
335 | - dmi_get_system_info(DMI_SYS_VENDOR)); |
336 | - printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n", |
337 | - dmi_get_system_info(DMI_PRODUCT_NAME)); |
338 | - printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n", |
339 | - dmi_get_system_info(DMI_PRODUCT_VERSION)); |
340 | - printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n", |
341 | - dmi_get_system_info(DMI_BOARD_NAME)); |
342 | - printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n", |
343 | - dmi_get_system_info(DMI_BIOS_VENDOR)); |
344 | - printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n", |
345 | - dmi_get_system_info(DMI_BIOS_DATE)); |
346 | - |
347 | - return 0; |
348 | -} |
349 | - |
350 | - |
351 | /****************************************************************************** |
352 | * |
353 | * FUNCTION: acpi_os_validate_interface |
354 | @@ -1315,14 +1287,6 @@ acpi_os_validate_interface (char *interface) |
355 | osi_linux.cmdline ? " via cmdline" : |
356 | osi_linux.dmi ? " via DMI" : ""); |
357 | |
358 | - if (!osi_linux.dmi) { |
359 | - if (acpi_dmi_dump()) |
360 | - printk(KERN_NOTICE PREFIX |
361 | - "[please extract dmidecode output]\n"); |
362 | - printk(KERN_NOTICE PREFIX |
363 | - "Please send DMI info above to " |
364 | - "linux-acpi@vger.kernel.org\n"); |
365 | - } |
366 | if (!osi_linux.known && !osi_linux.cmdline) { |
367 | printk(KERN_NOTICE PREFIX |
368 | "If \"acpi_osi=%sLinux\" works better, " |
369 | diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c |
370 | index 4751909..3706469 100644 |
371 | --- a/drivers/acpi/sleep/main.c |
372 | +++ b/drivers/acpi/sleep/main.c |
373 | @@ -60,6 +60,18 @@ void __init acpi_old_suspend_ordering(void) |
374 | old_suspend_ordering = true; |
375 | } |
376 | |
377 | +/* |
378 | + * According to the ACPI specification the BIOS should make sure that ACPI is |
379 | + * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states. Still, |
380 | + * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI |
381 | + * on such systems during resume. Unfortunately that doesn't help in |
382 | + * particularly pathological cases in which SCI_EN has to be set directly on |
383 | + * resume, although the specification states very clearly that this flag is |
384 | + * owned by the hardware. The set_sci_en_on_resume variable will be set in such |
385 | + * cases. |
386 | + */ |
387 | +static bool set_sci_en_on_resume; |
388 | + |
389 | /** |
390 | * acpi_pm_disable_gpes - Disable the GPEs. |
391 | */ |
392 | @@ -201,7 +213,11 @@ static int acpi_suspend_enter(suspend_state_t pm_state) |
393 | } |
394 | |
395 | /* If ACPI is not enabled by the BIOS, we need to enable it here. */ |
396 | - acpi_enable(); |
397 | + if (set_sci_en_on_resume) |
398 | + acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1); |
399 | + else |
400 | + acpi_enable(); |
401 | + |
402 | /* Reprogram control registers and execute _BFS */ |
403 | acpi_leave_sleep_state_prep(acpi_state); |
404 | |
405 | @@ -289,6 +305,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d) |
406 | return 0; |
407 | } |
408 | |
409 | +static int __init init_set_sci_en_on_resume(const struct dmi_system_id *d) |
410 | +{ |
411 | + set_sci_en_on_resume = true; |
412 | + return 0; |
413 | +} |
414 | + |
415 | static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
416 | { |
417 | .callback = init_old_suspend_ordering, |
418 | @@ -306,6 +328,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
419 | DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"), |
420 | }, |
421 | }, |
422 | + { |
423 | + .callback = init_set_sci_en_on_resume, |
424 | + .ident = "Apple MacBook 1,1", |
425 | + .matches = { |
426 | + DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), |
427 | + DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"), |
428 | + }, |
429 | + }, |
430 | + { |
431 | + .callback = init_set_sci_en_on_resume, |
432 | + .ident = "Apple MacMini 1,1", |
433 | + .matches = { |
434 | + DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."), |
435 | + DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"), |
436 | + }, |
437 | + }, |
438 | {}, |
439 | }; |
440 | #endif /* CONFIG_SUSPEND */ |
441 | diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c |
442 | index 2a4c516..bb26a26 100644 |
443 | --- a/drivers/ata/libata-sff.c |
444 | +++ b/drivers/ata/libata-sff.c |
445 | @@ -1227,10 +1227,19 @@ fsm_start: |
446 | /* ATA PIO protocol */ |
447 | if (unlikely((status & ATA_DRQ) == 0)) { |
448 | /* handle BSY=0, DRQ=0 as error */ |
449 | - if (likely(status & (ATA_ERR | ATA_DF))) |
450 | + if (likely(status & (ATA_ERR | ATA_DF))) { |
451 | /* device stops HSM for abort/error */ |
452 | qc->err_mask |= AC_ERR_DEV; |
453 | - else { |
454 | + |
455 | + /* If diagnostic failed and this is |
456 | + * IDENTIFY, it's likely a phantom |
457 | + * device. Mark hint. |
458 | + */ |
459 | + if (qc->dev->horkage & |
460 | + ATA_HORKAGE_DIAGNOSTIC) |
461 | + qc->err_mask |= |
462 | + AC_ERR_NODEV_HINT; |
463 | + } else { |
464 | /* HSM violation. Let EH handle this. |
465 | * Phantom devices also trigger this |
466 | * condition. Mark hint. |
467 | diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c |
468 | index 31d08b6..b899d91 100644 |
469 | --- a/drivers/char/applicom.c |
470 | +++ b/drivers/char/applicom.c |
471 | @@ -712,8 +712,7 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un |
472 | |
473 | IndexCard = adgl->num_card-1; |
474 | |
475 | - if(cmd != 0 && cmd != 6 && |
476 | - ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) { |
477 | + if(cmd != 6 && ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) { |
478 | static int warncount = 10; |
479 | if (warncount) { |
480 | printk( KERN_WARNING "APPLICOM driver IOCTL, bad board number %d\n",(int)IndexCard+1); |
481 | @@ -832,8 +831,7 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un |
482 | } |
483 | break; |
484 | default: |
485 | - printk(KERN_INFO "APPLICOM driver ioctl, unknown function code %d\n",cmd) ; |
486 | - ret = -EINVAL; |
487 | + ret = -ENOTTY; |
488 | break; |
489 | } |
490 | Dummy = readb(apbs[IndexCard].RamIO + VERS); |
491 | diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c |
492 | index 887072f..cd2e3b8 100644 |
493 | --- a/drivers/edac/cell_edac.c |
494 | +++ b/drivers/edac/cell_edac.c |
495 | @@ -9,6 +9,7 @@ |
496 | */ |
497 | #undef DEBUG |
498 | |
499 | +#include <linux/edac.h> |
500 | #include <linux/module.h> |
501 | #include <linux/init.h> |
502 | #include <linux/platform_device.h> |
503 | @@ -164,6 +165,8 @@ static int __devinit cell_edac_probe(struct platform_device *pdev) |
504 | if (regs == NULL) |
505 | return -ENODEV; |
506 | |
507 | + edac_op_state = EDAC_OPSTATE_POLL; |
508 | + |
509 | /* Get channel population */ |
510 | reg = in_be64(®s->mic_mnt_cfg); |
511 | dev_dbg(&pdev->dev, "MIC_MNT_CFG = 0x%016lx\n", reg); |
512 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c |
513 | index 49144cb..e87956a 100644 |
514 | --- a/drivers/hid/usbhid/hid-quirks.c |
515 | +++ b/drivers/hid/usbhid/hid-quirks.c |
516 | @@ -83,6 +83,7 @@ |
517 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 |
518 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a |
519 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b |
520 | +#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241 |
521 | #define USB_DEVICE_ID_APPLE_IRCONTROL4 0x8242 |
522 | |
523 | #define USB_VENDOR_ID_ASUS 0x0b05 |
524 | @@ -458,6 +459,7 @@ static const struct hid_blacklist { |
525 | { USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016, HID_QUIRK_FULLSPEED_INTERVAL }, |
526 | |
527 | { USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV }, |
528 | + { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT }, |
529 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT }, |
530 | { USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT }, |
531 | { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV, HID_QUIRK_HIDINPUT }, |
532 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
533 | index 5aafe24..29e6863 100644 |
534 | --- a/drivers/input/serio/i8042-x86ia64io.h |
535 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
536 | @@ -135,6 +135,14 @@ static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = { |
537 | DMI_MATCH(DMI_PRODUCT_VERSION, "5a"), |
538 | }, |
539 | }, |
540 | + { |
541 | + .ident = "Blue FB5601", |
542 | + .matches = { |
543 | + DMI_MATCH(DMI_SYS_VENDOR, "blue"), |
544 | + DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"), |
545 | + DMI_MATCH(DMI_PRODUCT_VERSION, "M606"), |
546 | + }, |
547 | + }, |
548 | { } |
549 | }; |
550 | |
551 | @@ -322,6 +330,27 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { |
552 | DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"), |
553 | }, |
554 | }, |
555 | + { |
556 | + .ident = "IBM 2656", |
557 | + .matches = { |
558 | + DMI_MATCH(DMI_SYS_VENDOR, "IBM"), |
559 | + DMI_MATCH(DMI_PRODUCT_NAME, "2656"), |
560 | + }, |
561 | + }, |
562 | + { |
563 | + .ident = "Dell XPS M1530", |
564 | + .matches = { |
565 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
566 | + DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"), |
567 | + }, |
568 | + }, |
569 | + { |
570 | + .ident = "Compal HEL80I", |
571 | + .matches = { |
572 | + DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"), |
573 | + DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"), |
574 | + }, |
575 | + }, |
576 | { } |
577 | }; |
578 | |
579 | diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h |
580 | index 2711404..b1a694b 100644 |
581 | --- a/drivers/net/cxgb3/adapter.h |
582 | +++ b/drivers/net/cxgb3/adapter.h |
583 | @@ -285,6 +285,7 @@ void t3_os_link_changed(struct adapter *adapter, int port_id, int link_status, |
584 | |
585 | void t3_sge_start(struct adapter *adap); |
586 | void t3_sge_stop(struct adapter *adap); |
587 | +void t3_stop_sge_timers(struct adapter *adap); |
588 | void t3_free_sge_resources(struct adapter *adap); |
589 | void t3_sge_err_intr_handler(struct adapter *adapter); |
590 | irq_handler_t t3_intr_handler(struct adapter *adap, int polling); |
591 | diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c |
592 | index 5447f3e..d355c82 100644 |
593 | --- a/drivers/net/cxgb3/cxgb3_main.c |
594 | +++ b/drivers/net/cxgb3/cxgb3_main.c |
595 | @@ -479,6 +479,7 @@ static int setup_sge_qsets(struct adapter *adap) |
596 | irq_idx, |
597 | &adap->params.sge.qset[qset_idx], ntxq, dev); |
598 | if (err) { |
599 | + t3_stop_sge_timers(adap); |
600 | t3_free_sge_resources(adap); |
601 | return err; |
602 | } |
603 | @@ -2449,6 +2450,9 @@ static pci_ers_result_t t3_io_error_detected(struct pci_dev *pdev, |
604 | test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map)) |
605 | offload_close(&adapter->tdev); |
606 | |
607 | + /* Stop SGE timers */ |
608 | + t3_stop_sge_timers(adapter); |
609 | + |
610 | adapter->flags &= ~FULL_INIT_DONE; |
611 | |
612 | pci_disable_device(pdev); |
613 | @@ -2801,6 +2805,7 @@ static void __devexit remove_one(struct pci_dev *pdev) |
614 | if (test_bit(i, &adapter->registered_device_map)) |
615 | unregister_netdev(adapter->port[i]); |
616 | |
617 | + t3_stop_sge_timers(adapter); |
618 | t3_free_sge_resources(adapter); |
619 | cxgb_disable_msi(adapter); |
620 | |
621 | diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c |
622 | index 1b0861d..52f4138 100644 |
623 | --- a/drivers/net/cxgb3/sge.c |
624 | +++ b/drivers/net/cxgb3/sge.c |
625 | @@ -603,9 +603,6 @@ static void t3_free_qset(struct adapter *adapter, struct sge_qset *q) |
626 | int i; |
627 | struct pci_dev *pdev = adapter->pdev; |
628 | |
629 | - if (q->tx_reclaim_timer.function) |
630 | - del_timer_sync(&q->tx_reclaim_timer); |
631 | - |
632 | for (i = 0; i < SGE_RXQ_PER_SET; ++i) |
633 | if (q->fl[i].desc) { |
634 | spin_lock_irq(&adapter->sge.reg_lock); |
635 | @@ -1937,38 +1934,6 @@ static inline int lro_frame_ok(const struct cpl_rx_pkt *p) |
636 | eh->h_proto == htons(ETH_P_IP) && ih->ihl == (sizeof(*ih) >> 2); |
637 | } |
638 | |
639 | -#define TCP_FLAG_MASK (TCP_FLAG_CWR | TCP_FLAG_ECE | TCP_FLAG_URG |\ |
640 | - TCP_FLAG_ACK | TCP_FLAG_PSH | TCP_FLAG_RST |\ |
641 | - TCP_FLAG_SYN | TCP_FLAG_FIN) |
642 | -#define TSTAMP_WORD ((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |\ |
643 | - (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP) |
644 | - |
645 | -/** |
646 | - * lro_segment_ok - check if a TCP segment is eligible for LRO |
647 | - * @tcph: the TCP header of the packet |
648 | - * |
649 | - * Returns true if a TCP packet is eligible for LRO. This requires that |
650 | - * the packet have only the ACK flag set and no TCP options besides |
651 | - * time stamps. |
652 | - */ |
653 | -static inline int lro_segment_ok(const struct tcphdr *tcph) |
654 | -{ |
655 | - int optlen; |
656 | - |
657 | - if (unlikely((tcp_flag_word(tcph) & TCP_FLAG_MASK) != TCP_FLAG_ACK)) |
658 | - return 0; |
659 | - |
660 | - optlen = (tcph->doff << 2) - sizeof(*tcph); |
661 | - if (optlen) { |
662 | - const u32 *opt = (const u32 *)(tcph + 1); |
663 | - |
664 | - if (optlen != TCPOLEN_TSTAMP_ALIGNED || |
665 | - *opt != htonl(TSTAMP_WORD) || !opt[2]) |
666 | - return 0; |
667 | - } |
668 | - return 1; |
669 | -} |
670 | - |
671 | static int t3_get_lro_header(void **eh, void **iph, void **tcph, |
672 | u64 *hdr_flags, void *priv) |
673 | { |
674 | @@ -1981,9 +1946,6 @@ static int t3_get_lro_header(void **eh, void **iph, void **tcph, |
675 | *iph = (struct iphdr *)((struct ethhdr *)*eh + 1); |
676 | *tcph = (struct tcphdr *)((struct iphdr *)*iph + 1); |
677 | |
678 | - if (!lro_segment_ok(*tcph)) |
679 | - return -1; |
680 | - |
681 | *hdr_flags = LRO_IPV4 | LRO_TCP; |
682 | return 0; |
683 | } |
684 | @@ -3043,6 +3005,24 @@ err: |
685 | } |
686 | |
687 | /** |
688 | + * t3_stop_sge_timers - stop SGE timer call backs |
689 | + * @adap: the adapter |
690 | + * |
691 | + * Stops each SGE queue set's timer call back |
692 | + */ |
693 | +void t3_stop_sge_timers(struct adapter *adap) |
694 | +{ |
695 | + int i; |
696 | + |
697 | + for (i = 0; i < SGE_QSETS; ++i) { |
698 | + struct sge_qset *q = &adap->sge.qs[i]; |
699 | + |
700 | + if (q->tx_reclaim_timer.function) |
701 | + del_timer_sync(&q->tx_reclaim_timer); |
702 | + } |
703 | +} |
704 | + |
705 | +/** |
706 | * t3_free_sge_resources - free SGE resources |
707 | * @adap: the adapter |
708 | * |
709 | diff --git a/drivers/net/niu.c b/drivers/net/niu.c |
710 | index e3be81e..6f9809e 100644 |
711 | --- a/drivers/net/niu.c |
712 | +++ b/drivers/net/niu.c |
713 | @@ -51,8 +51,7 @@ MODULE_VERSION(DRV_MODULE_VERSION); |
714 | #ifndef readq |
715 | static u64 readq(void __iomem *reg) |
716 | { |
717 | - return (((u64)readl(reg + 0x4UL) << 32) | |
718 | - (u64)readl(reg)); |
719 | + return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32); |
720 | } |
721 | |
722 | static void writeq(u64 val, void __iomem *reg) |
723 | diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c |
724 | index ff175e8..de80ba4 100644 |
725 | --- a/drivers/net/pppol2tp.c |
726 | +++ b/drivers/net/pppol2tp.c |
727 | @@ -1353,6 +1353,7 @@ static int pppol2tp_release(struct socket *sock) |
728 | kfree_skb(skb); |
729 | sock_put(sk); |
730 | } |
731 | + sock_put(sk); |
732 | } |
733 | |
734 | release_sock(sk); |
735 | diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c |
736 | index 851f5b8..aa6fda1 100644 |
737 | --- a/drivers/pci/pcie/aspm.c |
738 | +++ b/drivers/pci/pcie/aspm.c |
739 | @@ -16,6 +16,7 @@ |
740 | #include <linux/pm.h> |
741 | #include <linux/init.h> |
742 | #include <linux/slab.h> |
743 | +#include <linux/jiffies.h> |
744 | #include <linux/pci-aspm.h> |
745 | #include "../pci.h" |
746 | |
747 | @@ -161,11 +162,12 @@ static void pcie_check_clock_pm(struct pci_dev *pdev) |
748 | */ |
749 | static void pcie_aspm_configure_common_clock(struct pci_dev *pdev) |
750 | { |
751 | - int pos, child_pos; |
752 | + int pos, child_pos, i = 0; |
753 | u16 reg16 = 0; |
754 | struct pci_dev *child_dev; |
755 | int same_clock = 1; |
756 | - |
757 | + unsigned long start_jiffies; |
758 | + u16 child_regs[8], parent_reg; |
759 | /* |
760 | * all functions of a slot should have the same Slot Clock |
761 | * Configuration, so just check one function |
762 | @@ -191,16 +193,19 @@ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev) |
763 | child_pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP); |
764 | pci_read_config_word(child_dev, child_pos + PCI_EXP_LNKCTL, |
765 | ®16); |
766 | + child_regs[i] = reg16; |
767 | if (same_clock) |
768 | reg16 |= PCI_EXP_LNKCTL_CCC; |
769 | else |
770 | reg16 &= ~PCI_EXP_LNKCTL_CCC; |
771 | pci_write_config_word(child_dev, child_pos + PCI_EXP_LNKCTL, |
772 | reg16); |
773 | + i++; |
774 | } |
775 | |
776 | /* Configure upstream component */ |
777 | pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, ®16); |
778 | + parent_reg = reg16; |
779 | if (same_clock) |
780 | reg16 |= PCI_EXP_LNKCTL_CCC; |
781 | else |
782 | @@ -212,12 +217,30 @@ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev) |
783 | pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16); |
784 | |
785 | /* Wait for link training end */ |
786 | - while (1) { |
787 | + /* break out after waiting for 1 second */ |
788 | + start_jiffies = jiffies; |
789 | + while ((jiffies - start_jiffies) < HZ) { |
790 | pci_read_config_word(pdev, pos + PCI_EXP_LNKSTA, ®16); |
791 | if (!(reg16 & PCI_EXP_LNKSTA_LT)) |
792 | break; |
793 | cpu_relax(); |
794 | } |
795 | + /* training failed -> recover */ |
796 | + if ((jiffies - start_jiffies) >= HZ) { |
797 | + dev_printk (KERN_ERR, &pdev->dev, "ASPM: Could not configure" |
798 | + " common clock\n"); |
799 | + i = 0; |
800 | + list_for_each_entry(child_dev, &pdev->subordinate->devices, |
801 | + bus_list) { |
802 | + child_pos = pci_find_capability(child_dev, |
803 | + PCI_CAP_ID_EXP); |
804 | + pci_write_config_word(child_dev, |
805 | + child_pos + PCI_EXP_LNKCTL, |
806 | + child_regs[i]); |
807 | + i++; |
808 | + } |
809 | + pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, parent_reg); |
810 | + } |
811 | } |
812 | |
813 | /* |
814 | diff --git a/drivers/pci/slot.c b/drivers/pci/slot.c |
815 | index b703b09..e423fd9 100644 |
816 | --- a/drivers/pci/slot.c |
817 | +++ b/drivers/pci/slot.c |
818 | @@ -243,6 +243,7 @@ placeholder: |
819 | __func__, pci_domain_nr(parent), parent->number, slot_nr); |
820 | |
821 | out: |
822 | + kfree(slot_name); |
823 | up_write(&pci_bus_sem); |
824 | return slot; |
825 | err: |
826 | diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h |
827 | index 9fd7bb9..7cc7bf5 100644 |
828 | --- a/drivers/pnp/base.h |
829 | +++ b/drivers/pnp/base.h |
830 | @@ -147,7 +147,7 @@ char *pnp_resource_type_name(struct resource *res); |
831 | void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc); |
832 | |
833 | void pnp_free_resources(struct pnp_dev *dev); |
834 | -int pnp_resource_type(struct resource *res); |
835 | +unsigned long pnp_resource_type(struct resource *res); |
836 | |
837 | struct pnp_resource { |
838 | struct list_head list; |
839 | diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c |
840 | index 0bdf9b8..d15e2b7 100644 |
841 | --- a/drivers/pnp/quirks.c |
842 | +++ b/drivers/pnp/quirks.c |
843 | @@ -245,7 +245,7 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) |
844 | */ |
845 | for_each_pci_dev(pdev) { |
846 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { |
847 | - unsigned int type; |
848 | + unsigned long type; |
849 | |
850 | type = pci_resource_flags(pdev, i) & |
851 | (IORESOURCE_IO | IORESOURCE_MEM); |
852 | diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c |
853 | index 4cfe3a1..dbae23a 100644 |
854 | --- a/drivers/pnp/resource.c |
855 | +++ b/drivers/pnp/resource.c |
856 | @@ -467,14 +467,14 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res) |
857 | #endif |
858 | } |
859 | |
860 | -int pnp_resource_type(struct resource *res) |
861 | +unsigned long pnp_resource_type(struct resource *res) |
862 | { |
863 | return res->flags & (IORESOURCE_IO | IORESOURCE_MEM | |
864 | IORESOURCE_IRQ | IORESOURCE_DMA); |
865 | } |
866 | |
867 | struct resource *pnp_get_resource(struct pnp_dev *dev, |
868 | - unsigned int type, unsigned int num) |
869 | + unsigned long type, unsigned int num) |
870 | { |
871 | struct pnp_resource *pnp_res; |
872 | struct resource *res; |
873 | diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c |
874 | index e5e0cfe..bdc4d4e 100644 |
875 | --- a/drivers/spi/spidev.c |
876 | +++ b/drivers/spi/spidev.c |
877 | @@ -598,7 +598,9 @@ static int spidev_probe(struct spi_device *spi) |
878 | } |
879 | mutex_unlock(&device_list_lock); |
880 | |
881 | - if (status != 0) |
882 | + if (status == 0) |
883 | + spi_set_drvdata(spi, spidev); |
884 | + else |
885 | kfree(spidev); |
886 | |
887 | return status; |
888 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
889 | index 73f8277..b205311 100644 |
890 | --- a/drivers/usb/serial/option.c |
891 | +++ b/drivers/usb/serial/option.c |
892 | @@ -79,38 +79,36 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po |
893 | #define OPTION_PRODUCT_VIPER 0x6600 |
894 | #define OPTION_PRODUCT_VIPER_BUS 0x6601 |
895 | #define OPTION_PRODUCT_GT_MAX_READY 0x6701 |
896 | -#define OPTION_PRODUCT_GT_MAX 0x6711 |
897 | #define OPTION_PRODUCT_FUJI_MODEM_LIGHT 0x6721 |
898 | #define OPTION_PRODUCT_FUJI_MODEM_GT 0x6741 |
899 | #define OPTION_PRODUCT_FUJI_MODEM_EX 0x6761 |
900 | -#define OPTION_PRODUCT_FUJI_NETWORK_LIGHT 0x6731 |
901 | -#define OPTION_PRODUCT_FUJI_NETWORK_GT 0x6751 |
902 | -#define OPTION_PRODUCT_FUJI_NETWORK_EX 0x6771 |
903 | #define OPTION_PRODUCT_KOI_MODEM 0x6800 |
904 | -#define OPTION_PRODUCT_KOI_NETWORK 0x6811 |
905 | #define OPTION_PRODUCT_SCORPION_MODEM 0x6901 |
906 | -#define OPTION_PRODUCT_SCORPION_NETWORK 0x6911 |
907 | #define OPTION_PRODUCT_ETNA_MODEM 0x7001 |
908 | -#define OPTION_PRODUCT_ETNA_NETWORK 0x7011 |
909 | #define OPTION_PRODUCT_ETNA_MODEM_LITE 0x7021 |
910 | #define OPTION_PRODUCT_ETNA_MODEM_GT 0x7041 |
911 | #define OPTION_PRODUCT_ETNA_MODEM_EX 0x7061 |
912 | -#define OPTION_PRODUCT_ETNA_NETWORK_LITE 0x7031 |
913 | -#define OPTION_PRODUCT_ETNA_NETWORK_GT 0x7051 |
914 | -#define OPTION_PRODUCT_ETNA_NETWORK_EX 0x7071 |
915 | #define OPTION_PRODUCT_ETNA_KOI_MODEM 0x7100 |
916 | -#define OPTION_PRODUCT_ETNA_KOI_NETWORK 0x7111 |
917 | |
918 | #define HUAWEI_VENDOR_ID 0x12D1 |
919 | #define HUAWEI_PRODUCT_E600 0x1001 |
920 | #define HUAWEI_PRODUCT_E220 0x1003 |
921 | #define HUAWEI_PRODUCT_E220BIS 0x1004 |
922 | #define HUAWEI_PRODUCT_E1401 0x1401 |
923 | +#define HUAWEI_PRODUCT_E1402 0x1402 |
924 | #define HUAWEI_PRODUCT_E1403 0x1403 |
925 | +#define HUAWEI_PRODUCT_E1404 0x1404 |
926 | #define HUAWEI_PRODUCT_E1405 0x1405 |
927 | #define HUAWEI_PRODUCT_E1406 0x1406 |
928 | +#define HUAWEI_PRODUCT_E1407 0x1407 |
929 | #define HUAWEI_PRODUCT_E1408 0x1408 |
930 | #define HUAWEI_PRODUCT_E1409 0x1409 |
931 | +#define HUAWEI_PRODUCT_E140A 0x140A |
932 | +#define HUAWEI_PRODUCT_E140B 0x140B |
933 | +#define HUAWEI_PRODUCT_E140C 0x140C |
934 | +#define HUAWEI_PRODUCT_E140D 0x140D |
935 | +#define HUAWEI_PRODUCT_E140E 0x140E |
936 | +#define HUAWEI_PRODUCT_E140F 0x140F |
937 | #define HUAWEI_PRODUCT_E1410 0x1410 |
938 | #define HUAWEI_PRODUCT_E1411 0x1411 |
939 | #define HUAWEI_PRODUCT_E1412 0x1412 |
940 | @@ -121,9 +119,52 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po |
941 | #define HUAWEI_PRODUCT_E1417 0x1417 |
942 | #define HUAWEI_PRODUCT_E1418 0x1418 |
943 | #define HUAWEI_PRODUCT_E1419 0x1419 |
944 | +#define HUAWEI_PRODUCT_E141A 0x141A |
945 | +#define HUAWEI_PRODUCT_E141B 0x141B |
946 | +#define HUAWEI_PRODUCT_E141C 0x141C |
947 | +#define HUAWEI_PRODUCT_E141D 0x141D |
948 | +#define HUAWEI_PRODUCT_E141E 0x141E |
949 | +#define HUAWEI_PRODUCT_E141F 0x141F |
950 | +#define HUAWEI_PRODUCT_E1420 0x1420 |
951 | +#define HUAWEI_PRODUCT_E1421 0x1421 |
952 | +#define HUAWEI_PRODUCT_E1422 0x1422 |
953 | +#define HUAWEI_PRODUCT_E1423 0x1423 |
954 | +#define HUAWEI_PRODUCT_E1424 0x1424 |
955 | +#define HUAWEI_PRODUCT_E1425 0x1425 |
956 | +#define HUAWEI_PRODUCT_E1426 0x1426 |
957 | +#define HUAWEI_PRODUCT_E1427 0x1427 |
958 | +#define HUAWEI_PRODUCT_E1428 0x1428 |
959 | +#define HUAWEI_PRODUCT_E1429 0x1429 |
960 | +#define HUAWEI_PRODUCT_E142A 0x142A |
961 | +#define HUAWEI_PRODUCT_E142B 0x142B |
962 | +#define HUAWEI_PRODUCT_E142C 0x142C |
963 | +#define HUAWEI_PRODUCT_E142D 0x142D |
964 | +#define HUAWEI_PRODUCT_E142E 0x142E |
965 | +#define HUAWEI_PRODUCT_E142F 0x142F |
966 | +#define HUAWEI_PRODUCT_E1430 0x1430 |
967 | +#define HUAWEI_PRODUCT_E1431 0x1431 |
968 | +#define HUAWEI_PRODUCT_E1432 0x1432 |
969 | +#define HUAWEI_PRODUCT_E1433 0x1433 |
970 | +#define HUAWEI_PRODUCT_E1434 0x1434 |
971 | +#define HUAWEI_PRODUCT_E1435 0x1435 |
972 | +#define HUAWEI_PRODUCT_E1436 0x1436 |
973 | +#define HUAWEI_PRODUCT_E1437 0x1437 |
974 | +#define HUAWEI_PRODUCT_E1438 0x1438 |
975 | +#define HUAWEI_PRODUCT_E1439 0x1439 |
976 | +#define HUAWEI_PRODUCT_E143A 0x143A |
977 | +#define HUAWEI_PRODUCT_E143B 0x143B |
978 | +#define HUAWEI_PRODUCT_E143C 0x143C |
979 | +#define HUAWEI_PRODUCT_E143D 0x143D |
980 | +#define HUAWEI_PRODUCT_E143E 0x143E |
981 | +#define HUAWEI_PRODUCT_E143F 0x143F |
982 | |
983 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 |
984 | |
985 | +/* YISO PRODUCTS */ |
986 | + |
987 | +#define YISO_VENDOR_ID 0x0EAB |
988 | +#define YISO_PRODUCT_U893 0xC893 |
989 | + |
990 | /* MERLIN EVDO PRODUCTS */ |
991 | #define NOVATELWIRELESS_PRODUCT_V640 0x1100 |
992 | #define NOVATELWIRELESS_PRODUCT_V620 0x1110 |
993 | @@ -183,6 +224,7 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po |
994 | #define ONDA_VENDOR_ID 0x19d2 |
995 | #define ONDA_PRODUCT_MSA501HS 0x0001 |
996 | #define ONDA_PRODUCT_ET502HS 0x0002 |
997 | +#define ONDA_PRODUCT_MT503HS 0x0200 |
998 | |
999 | #define BANDRICH_VENDOR_ID 0x1A8D |
1000 | #define BANDRICH_PRODUCT_C100_1 0x1002 |
1001 | @@ -218,8 +260,19 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po |
1002 | /* ZTE PRODUCTS */ |
1003 | #define ZTE_VENDOR_ID 0x19d2 |
1004 | #define ZTE_PRODUCT_MF628 0x0015 |
1005 | +#define ZTE_PRODUCT_MF626 0x0031 |
1006 | #define ZTE_PRODUCT_CDMA_TECH 0xfffe |
1007 | |
1008 | +/* Ericsson products */ |
1009 | +#define ERICSSON_VENDOR_ID 0x0bdb |
1010 | +#define ERICSSON_PRODUCT_F3507G 0x1900 |
1011 | + |
1012 | +/* Pantech products */ |
1013 | +#define PANTECH_VENDOR_ID 0x106c |
1014 | +#define PANTECH_PRODUCT_PC5740 0x3701 |
1015 | +#define PANTECH_PRODUCT_PC5750 0x3702 /* PX-500 */ |
1016 | +#define PANTECH_PRODUCT_UM150 0x3711 |
1017 | + |
1018 | static struct usb_device_id option_ids[] = { |
1019 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, |
1020 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, |
1021 | @@ -235,36 +288,34 @@ static struct usb_device_id option_ids[] = { |
1022 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER) }, |
1023 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER_BUS) }, |
1024 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX_READY) }, |
1025 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX) }, |
1026 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_LIGHT) }, |
1027 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_GT) }, |
1028 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_EX) }, |
1029 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_LIGHT) }, |
1030 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_GT) }, |
1031 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_EX) }, |
1032 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_MODEM) }, |
1033 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_NETWORK) }, |
1034 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_MODEM) }, |
1035 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_NETWORK) }, |
1036 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM) }, |
1037 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK) }, |
1038 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_LITE) }, |
1039 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) }, |
1040 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) }, |
1041 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_LITE) }, |
1042 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_GT) }, |
1043 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_EX) }, |
1044 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) }, |
1045 | - { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) }, |
1046 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) }, |
1047 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) }, |
1048 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) }, |
1049 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) }, |
1050 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1402, 0xff, 0xff, 0xff) }, |
1051 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) }, |
1052 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1404, 0xff, 0xff, 0xff) }, |
1053 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) }, |
1054 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) }, |
1055 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1407, 0xff, 0xff, 0xff) }, |
1056 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408, 0xff, 0xff, 0xff) }, |
1057 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409, 0xff, 0xff, 0xff) }, |
1058 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140A, 0xff, 0xff, 0xff) }, |
1059 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140B, 0xff, 0xff, 0xff) }, |
1060 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140C, 0xff, 0xff, 0xff) }, |
1061 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140D, 0xff, 0xff, 0xff) }, |
1062 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140E, 0xff, 0xff, 0xff) }, |
1063 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140F, 0xff, 0xff, 0xff) }, |
1064 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410, 0xff, 0xff, 0xff) }, |
1065 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411, 0xff, 0xff, 0xff) }, |
1066 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412, 0xff, 0xff, 0xff) }, |
1067 | @@ -275,6 +326,44 @@ static struct usb_device_id option_ids[] = { |
1068 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417, 0xff, 0xff, 0xff) }, |
1069 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) }, |
1070 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419, 0xff, 0xff, 0xff) }, |
1071 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141A, 0xff, 0xff, 0xff) }, |
1072 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141B, 0xff, 0xff, 0xff) }, |
1073 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141C, 0xff, 0xff, 0xff) }, |
1074 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141D, 0xff, 0xff, 0xff) }, |
1075 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141E, 0xff, 0xff, 0xff) }, |
1076 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141F, 0xff, 0xff, 0xff) }, |
1077 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1420, 0xff, 0xff, 0xff) }, |
1078 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1421, 0xff, 0xff, 0xff) }, |
1079 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1422, 0xff, 0xff, 0xff) }, |
1080 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1423, 0xff, 0xff, 0xff) }, |
1081 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1424, 0xff, 0xff, 0xff) }, |
1082 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1425, 0xff, 0xff, 0xff) }, |
1083 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1426, 0xff, 0xff, 0xff) }, |
1084 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1427, 0xff, 0xff, 0xff) }, |
1085 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1428, 0xff, 0xff, 0xff) }, |
1086 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1429, 0xff, 0xff, 0xff) }, |
1087 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142A, 0xff, 0xff, 0xff) }, |
1088 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142B, 0xff, 0xff, 0xff) }, |
1089 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142C, 0xff, 0xff, 0xff) }, |
1090 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142D, 0xff, 0xff, 0xff) }, |
1091 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142E, 0xff, 0xff, 0xff) }, |
1092 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142F, 0xff, 0xff, 0xff) }, |
1093 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1430, 0xff, 0xff, 0xff) }, |
1094 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1431, 0xff, 0xff, 0xff) }, |
1095 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1432, 0xff, 0xff, 0xff) }, |
1096 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1433, 0xff, 0xff, 0xff) }, |
1097 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1434, 0xff, 0xff, 0xff) }, |
1098 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1435, 0xff, 0xff, 0xff) }, |
1099 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1436, 0xff, 0xff, 0xff) }, |
1100 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1437, 0xff, 0xff, 0xff) }, |
1101 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1438, 0xff, 0xff, 0xff) }, |
1102 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1439, 0xff, 0xff, 0xff) }, |
1103 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143A, 0xff, 0xff, 0xff) }, |
1104 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143B, 0xff, 0xff, 0xff) }, |
1105 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143C, 0xff, 0xff, 0xff) }, |
1106 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) }, |
1107 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) }, |
1108 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) }, |
1109 | { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) }, |
1110 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */ |
1111 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */ |
1112 | @@ -318,12 +407,48 @@ static struct usb_device_id option_ids[] = { |
1113 | { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */ |
1114 | { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */ |
1115 | { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */ |
1116 | - { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, |
1117 | + { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */ |
1118 | + { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, /* ADU-E100, ADU-310 */ |
1119 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, |
1120 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, |
1121 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, |
1122 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) }, |
1123 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) }, |
1124 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0003) }, |
1125 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0004) }, |
1126 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0005) }, |
1127 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0006) }, |
1128 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0007) }, |
1129 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0008) }, |
1130 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0009) }, |
1131 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x000a) }, |
1132 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x000b) }, |
1133 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x000c) }, |
1134 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x000d) }, |
1135 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x000e) }, |
1136 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x000f) }, |
1137 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0010) }, |
1138 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0011) }, |
1139 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0012) }, |
1140 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0013) }, |
1141 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0014) }, |
1142 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0015) }, |
1143 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0016) }, |
1144 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0017) }, |
1145 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0018) }, |
1146 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0019) }, |
1147 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0020) }, |
1148 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0021) }, |
1149 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0022) }, |
1150 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0023) }, |
1151 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0024) }, |
1152 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0025) }, |
1153 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0026) }, |
1154 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0027) }, |
1155 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0028) }, |
1156 | + { USB_DEVICE(ONDA_VENDOR_ID, 0x0029) }, |
1157 | + { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MT503HS) }, |
1158 | + { USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) }, |
1159 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, |
1160 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, |
1161 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) }, |
1162 | @@ -347,8 +472,13 @@ static struct usb_device_id option_ids[] = { |
1163 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
1164 | { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ |
1165 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, |
1166 | + { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) }, |
1167 | { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) }, |
1168 | { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) }, |
1169 | + { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) }, |
1170 | + { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5740) }, |
1171 | + { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5750) }, |
1172 | + { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_UM150) }, |
1173 | { } /* Terminating entry */ |
1174 | }; |
1175 | MODULE_DEVICE_TABLE(usb, option_ids); |
1176 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
1177 | index ccebf89..e61f2bf 100644 |
1178 | --- a/drivers/usb/storage/unusual_devs.h |
1179 | +++ b/drivers/usb/storage/unusual_devs.h |
1180 | @@ -167,6 +167,13 @@ UNUSUAL_DEV( 0x0421, 0x005d, 0x0001, 0x0600, |
1181 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1182 | US_FL_FIX_CAPACITY ), |
1183 | |
1184 | +/* Patch for Nokia 5310 capacity */ |
1185 | +UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591, |
1186 | + "Nokia", |
1187 | + "5310", |
1188 | + US_SC_DEVICE, US_PR_DEVICE, NULL, |
1189 | + US_FL_FIX_CAPACITY ), |
1190 | + |
1191 | /* Reported by Mario Rettig <mariorettig@web.de> */ |
1192 | UNUSUAL_DEV( 0x0421, 0x042e, 0x0100, 0x0100, |
1193 | "Nokia", |
1194 | @@ -233,14 +240,14 @@ UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370, |
1195 | US_FL_MAX_SECTORS_64 ), |
1196 | |
1197 | /* Reported by Cedric Godin <cedric@belbone.be> */ |
1198 | -UNUSUAL_DEV( 0x0421, 0x04b9, 0x0551, 0x0551, |
1199 | +UNUSUAL_DEV( 0x0421, 0x04b9, 0x0500, 0x0551, |
1200 | "Nokia", |
1201 | "5300", |
1202 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1203 | US_FL_FIX_CAPACITY ), |
1204 | |
1205 | /* Reported by Richard Nauber <RichardNauber@web.de> */ |
1206 | -UNUSUAL_DEV( 0x0421, 0x04fa, 0x0601, 0x0601, |
1207 | +UNUSUAL_DEV( 0x0421, 0x04fa, 0x0550, 0x0660, |
1208 | "Nokia", |
1209 | "6300", |
1210 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1211 | @@ -253,6 +260,14 @@ UNUSUAL_DEV( 0x0421, 0x006a, 0x0000, 0x0591, |
1212 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1213 | US_FL_FIX_CAPACITY ), |
1214 | |
1215 | +/* Submitted by Ricky Wong Yung Fei <evilbladewarrior@gmail.com> */ |
1216 | +/* Nokia 7610 Supernova - Too many sectors reported in usb storage mode */ |
1217 | +UNUSUAL_DEV( 0x0421, 0x00f5, 0x0000, 0x0470, |
1218 | + "Nokia", |
1219 | + "7610 Supernova", |
1220 | + US_SC_DEVICE, US_PR_DEVICE, NULL, |
1221 | + US_FL_FIX_CAPACITY ), |
1222 | + |
1223 | /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */ |
1224 | UNUSUAL_DEV( 0x0424, 0x0fdc, 0x0210, 0x0210, |
1225 | "SMSC", |
1226 | @@ -303,6 +318,18 @@ UNUSUAL_DEV( 0x045a, 0x5210, 0x0101, 0x0101, |
1227 | US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0), |
1228 | #endif |
1229 | |
1230 | +/* Reported by Tamas Kerecsen <kerecsen@bigfoot.com> |
1231 | + * Obviously the PROM has not been customized by the VAR; |
1232 | + * the Vendor and Product string descriptors are: |
1233 | + * Generic Mass Storage (PROTOTYPE--Remember to change idVendor) |
1234 | + * Generic Manufacturer (PROTOTYPE--Remember to change idVendor) |
1235 | + */ |
1236 | +UNUSUAL_DEV( 0x045e, 0xffff, 0x0000, 0x0000, |
1237 | + "Mitac", |
1238 | + "GPS", |
1239 | + US_SC_DEVICE, US_PR_DEVICE, NULL, |
1240 | + US_FL_MAX_SECTORS_64 ), |
1241 | + |
1242 | /* |
1243 | * This virtual floppy is found in Sun equipment (x4600, x4200m2, etc.) |
1244 | * Reported by Pete Zaitcev <zaitcev@redhat.com> |
1245 | @@ -333,6 +360,13 @@ UNUSUAL_DEV( 0x0482, 0x0103, 0x0100, 0x0100, |
1246 | "Finecam S5", |
1247 | US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY), |
1248 | |
1249 | +/* Patch submitted by Jens Taprogge <jens.taprogge@taprogge.org> */ |
1250 | +UNUSUAL_DEV( 0x0482, 0x0107, 0x0100, 0x0100, |
1251 | + "Kyocera", |
1252 | + "CONTAX SL300R T*", |
1253 | + US_SC_DEVICE, US_PR_DEVICE, NULL, |
1254 | + US_FL_FIX_CAPACITY | US_FL_NOT_LOCKABLE), |
1255 | + |
1256 | /* Reported by Paul Stewart <stewart@wetlogic.net> |
1257 | * This entry is needed because the device reports Sub=ff */ |
1258 | UNUSUAL_DEV( 0x04a4, 0x0004, 0x0001, 0x0001, |
1259 | @@ -355,6 +389,13 @@ UNUSUAL_DEV( 0x04b0, 0x0401, 0x0200, 0x0200, |
1260 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1261 | US_FL_FIX_CAPACITY), |
1262 | |
1263 | +/* Reported by Tobias Kunze Briseno <t-linux@fictive.com> */ |
1264 | +UNUSUAL_DEV( 0x04b0, 0x0403, 0x0200, 0x0200, |
1265 | + "NIKON", |
1266 | + "NIKON DSC D2H", |
1267 | + US_SC_DEVICE, US_PR_DEVICE, NULL, |
1268 | + US_FL_FIX_CAPACITY), |
1269 | + |
1270 | /* Reported by Milinevsky Dmitry <niam.niam@gmail.com> */ |
1271 | UNUSUAL_DEV( 0x04b0, 0x0409, 0x0100, 0x0100, |
1272 | "NIKON", |
1273 | @@ -411,6 +452,13 @@ UNUSUAL_DEV( 0x04b0, 0x0417, 0x0100, 0x0100, |
1274 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1275 | US_FL_FIX_CAPACITY), |
1276 | |
1277 | +/* Reported by paul ready <lxtwin@homecall.co.uk> */ |
1278 | +UNUSUAL_DEV( 0x04b0, 0x0419, 0x0100, 0x0200, |
1279 | + "NIKON", |
1280 | + "NIKON DSC D300", |
1281 | + US_SC_DEVICE, US_PR_DEVICE, NULL, |
1282 | + US_FL_FIX_CAPACITY), |
1283 | + |
1284 | /* Reported by Doug Maxey (dwm@austin.ibm.com) */ |
1285 | UNUSUAL_DEV( 0x04b3, 0x4001, 0x0110, 0x0110, |
1286 | "IBM", |
1287 | @@ -1635,97 +1683,332 @@ UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100, |
1288 | /* Reported by fangxiaozhi <huananhu@huawei.com> |
1289 | * This brings the HUAWEI data card devices into multi-port mode |
1290 | */ |
1291 | -UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000, |
1292 | +UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000, |
1293 | + "HUAWEI MOBILE", |
1294 | + "Mass Storage", |
1295 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1296 | + 0), |
1297 | +UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000, |
1298 | + "HUAWEI MOBILE", |
1299 | + "Mass Storage", |
1300 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1301 | + 0), |
1302 | +UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000, |
1303 | + "HUAWEI MOBILE", |
1304 | + "Mass Storage", |
1305 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1306 | + 0), |
1307 | +UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000, |
1308 | + "HUAWEI MOBILE", |
1309 | + "Mass Storage", |
1310 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1311 | + 0), |
1312 | +UNUSUAL_DEV( 0x12d1, 0x1402, 0x0000, 0x0000, |
1313 | + "HUAWEI MOBILE", |
1314 | + "Mass Storage", |
1315 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1316 | + 0), |
1317 | +UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000, |
1318 | + "HUAWEI MOBILE", |
1319 | + "Mass Storage", |
1320 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1321 | + 0), |
1322 | +UNUSUAL_DEV( 0x12d1, 0x1404, 0x0000, 0x0000, |
1323 | + "HUAWEI MOBILE", |
1324 | + "Mass Storage", |
1325 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1326 | + 0), |
1327 | +UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000, |
1328 | + "HUAWEI MOBILE", |
1329 | + "Mass Storage", |
1330 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1331 | + 0), |
1332 | +UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000, |
1333 | + "HUAWEI MOBILE", |
1334 | + "Mass Storage", |
1335 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1336 | + 0), |
1337 | +UNUSUAL_DEV( 0x12d1, 0x1407, 0x0000, 0x0000, |
1338 | + "HUAWEI MOBILE", |
1339 | + "Mass Storage", |
1340 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1341 | + 0), |
1342 | +UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000, |
1343 | + "HUAWEI MOBILE", |
1344 | + "Mass Storage", |
1345 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1346 | + 0), |
1347 | +UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000, |
1348 | + "HUAWEI MOBILE", |
1349 | + "Mass Storage", |
1350 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1351 | + 0), |
1352 | +UNUSUAL_DEV( 0x12d1, 0x140A, 0x0000, 0x0000, |
1353 | + "HUAWEI MOBILE", |
1354 | + "Mass Storage", |
1355 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1356 | + 0), |
1357 | +UNUSUAL_DEV( 0x12d1, 0x140B, 0x0000, 0x0000, |
1358 | + "HUAWEI MOBILE", |
1359 | + "Mass Storage", |
1360 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1361 | + 0), |
1362 | +UNUSUAL_DEV( 0x12d1, 0x140C, 0x0000, 0x0000, |
1363 | + "HUAWEI MOBILE", |
1364 | + "Mass Storage", |
1365 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1366 | + 0), |
1367 | +UNUSUAL_DEV( 0x12d1, 0x140D, 0x0000, 0x0000, |
1368 | + "HUAWEI MOBILE", |
1369 | + "Mass Storage", |
1370 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1371 | + 0), |
1372 | +UNUSUAL_DEV( 0x12d1, 0x140E, 0x0000, 0x0000, |
1373 | + "HUAWEI MOBILE", |
1374 | + "Mass Storage", |
1375 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1376 | + 0), |
1377 | +UNUSUAL_DEV( 0x12d1, 0x140F, 0x0000, 0x0000, |
1378 | + "HUAWEI MOBILE", |
1379 | + "Mass Storage", |
1380 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1381 | + 0), |
1382 | +UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000, |
1383 | + "HUAWEI MOBILE", |
1384 | + "Mass Storage", |
1385 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1386 | + 0), |
1387 | +UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000, |
1388 | + "HUAWEI MOBILE", |
1389 | + "Mass Storage", |
1390 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1391 | + 0), |
1392 | +UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000, |
1393 | + "HUAWEI MOBILE", |
1394 | + "Mass Storage", |
1395 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1396 | + 0), |
1397 | +UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000, |
1398 | + "HUAWEI MOBILE", |
1399 | + "Mass Storage", |
1400 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1401 | + 0), |
1402 | +UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000, |
1403 | + "HUAWEI MOBILE", |
1404 | + "Mass Storage", |
1405 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1406 | + 0), |
1407 | +UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000, |
1408 | + "HUAWEI MOBILE", |
1409 | + "Mass Storage", |
1410 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1411 | + 0), |
1412 | +UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000, |
1413 | + "HUAWEI MOBILE", |
1414 | + "Mass Storage", |
1415 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1416 | + 0), |
1417 | +UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000, |
1418 | + "HUAWEI MOBILE", |
1419 | + "Mass Storage", |
1420 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1421 | + 0), |
1422 | +UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000, |
1423 | + "HUAWEI MOBILE", |
1424 | + "Mass Storage", |
1425 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1426 | + 0), |
1427 | +UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000, |
1428 | + "HUAWEI MOBILE", |
1429 | + "Mass Storage", |
1430 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1431 | + 0), |
1432 | +UNUSUAL_DEV( 0x12d1, 0x141A, 0x0000, 0x0000, |
1433 | + "HUAWEI MOBILE", |
1434 | + "Mass Storage", |
1435 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1436 | + 0), |
1437 | +UNUSUAL_DEV( 0x12d1, 0x141B, 0x0000, 0x0000, |
1438 | + "HUAWEI MOBILE", |
1439 | + "Mass Storage", |
1440 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1441 | + 0), |
1442 | +UNUSUAL_DEV( 0x12d1, 0x141C, 0x0000, 0x0000, |
1443 | + "HUAWEI MOBILE", |
1444 | + "Mass Storage", |
1445 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1446 | + 0), |
1447 | +UNUSUAL_DEV( 0x12d1, 0x141D, 0x0000, 0x0000, |
1448 | + "HUAWEI MOBILE", |
1449 | + "Mass Storage", |
1450 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1451 | + 0), |
1452 | +UNUSUAL_DEV( 0x12d1, 0x141E, 0x0000, 0x0000, |
1453 | + "HUAWEI MOBILE", |
1454 | + "Mass Storage", |
1455 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1456 | + 0), |
1457 | +UNUSUAL_DEV( 0x12d1, 0x141F, 0x0000, 0x0000, |
1458 | + "HUAWEI MOBILE", |
1459 | + "Mass Storage", |
1460 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1461 | + 0), |
1462 | +UNUSUAL_DEV( 0x12d1, 0x1420, 0x0000, 0x0000, |
1463 | + "HUAWEI MOBILE", |
1464 | + "Mass Storage", |
1465 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1466 | + 0), |
1467 | +UNUSUAL_DEV( 0x12d1, 0x1421, 0x0000, 0x0000, |
1468 | + "HUAWEI MOBILE", |
1469 | + "Mass Storage", |
1470 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1471 | + 0), |
1472 | +UNUSUAL_DEV( 0x12d1, 0x1422, 0x0000, 0x0000, |
1473 | + "HUAWEI MOBILE", |
1474 | + "Mass Storage", |
1475 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1476 | + 0), |
1477 | +UNUSUAL_DEV( 0x12d1, 0x1423, 0x0000, 0x0000, |
1478 | + "HUAWEI MOBILE", |
1479 | + "Mass Storage", |
1480 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1481 | + 0), |
1482 | +UNUSUAL_DEV( 0x12d1, 0x1424, 0x0000, 0x0000, |
1483 | + "HUAWEI MOBILE", |
1484 | + "Mass Storage", |
1485 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1486 | + 0), |
1487 | +UNUSUAL_DEV( 0x12d1, 0x1425, 0x0000, 0x0000, |
1488 | + "HUAWEI MOBILE", |
1489 | + "Mass Storage", |
1490 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1491 | + 0), |
1492 | +UNUSUAL_DEV( 0x12d1, 0x1426, 0x0000, 0x0000, |
1493 | + "HUAWEI MOBILE", |
1494 | + "Mass Storage", |
1495 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1496 | + 0), |
1497 | +UNUSUAL_DEV( 0x12d1, 0x1427, 0x0000, 0x0000, |
1498 | "HUAWEI MOBILE", |
1499 | "Mass Storage", |
1500 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1501 | 0), |
1502 | -UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000, |
1503 | +UNUSUAL_DEV( 0x12d1, 0x1428, 0x0000, 0x0000, |
1504 | "HUAWEI MOBILE", |
1505 | "Mass Storage", |
1506 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1507 | 0), |
1508 | -UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000, |
1509 | +UNUSUAL_DEV( 0x12d1, 0x1429, 0x0000, 0x0000, |
1510 | "HUAWEI MOBILE", |
1511 | "Mass Storage", |
1512 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1513 | 0), |
1514 | -UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000, |
1515 | +UNUSUAL_DEV( 0x12d1, 0x142A, 0x0000, 0x0000, |
1516 | "HUAWEI MOBILE", |
1517 | "Mass Storage", |
1518 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1519 | 0), |
1520 | -UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000, |
1521 | +UNUSUAL_DEV( 0x12d1, 0x142B, 0x0000, 0x0000, |
1522 | "HUAWEI MOBILE", |
1523 | "Mass Storage", |
1524 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1525 | 0), |
1526 | -UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000, |
1527 | +UNUSUAL_DEV( 0x12d1, 0x142C, 0x0000, 0x0000, |
1528 | "HUAWEI MOBILE", |
1529 | "Mass Storage", |
1530 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1531 | 0), |
1532 | -UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000, |
1533 | +UNUSUAL_DEV( 0x12d1, 0x142D, 0x0000, 0x0000, |
1534 | "HUAWEI MOBILE", |
1535 | "Mass Storage", |
1536 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1537 | 0), |
1538 | -UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000, |
1539 | +UNUSUAL_DEV( 0x12d1, 0x142E, 0x0000, 0x0000, |
1540 | "HUAWEI MOBILE", |
1541 | "Mass Storage", |
1542 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1543 | 0), |
1544 | -UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000, |
1545 | +UNUSUAL_DEV( 0x12d1, 0x142F, 0x0000, 0x0000, |
1546 | "HUAWEI MOBILE", |
1547 | "Mass Storage", |
1548 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1549 | 0), |
1550 | -UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000, |
1551 | +UNUSUAL_DEV( 0x12d1, 0x1430, 0x0000, 0x0000, |
1552 | "HUAWEI MOBILE", |
1553 | "Mass Storage", |
1554 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1555 | 0), |
1556 | -UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000, |
1557 | +UNUSUAL_DEV( 0x12d1, 0x1431, 0x0000, 0x0000, |
1558 | "HUAWEI MOBILE", |
1559 | "Mass Storage", |
1560 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1561 | 0), |
1562 | -UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000, |
1563 | +UNUSUAL_DEV( 0x12d1, 0x1432, 0x0000, 0x0000, |
1564 | "HUAWEI MOBILE", |
1565 | "Mass Storage", |
1566 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1567 | 0), |
1568 | -UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000, |
1569 | +UNUSUAL_DEV( 0x12d1, 0x1433, 0x0000, 0x0000, |
1570 | "HUAWEI MOBILE", |
1571 | "Mass Storage", |
1572 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1573 | 0), |
1574 | -UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000, |
1575 | +UNUSUAL_DEV( 0x12d1, 0x1434, 0x0000, 0x0000, |
1576 | "HUAWEI MOBILE", |
1577 | "Mass Storage", |
1578 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1579 | 0), |
1580 | -UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000, |
1581 | +UNUSUAL_DEV( 0x12d1, 0x1435, 0x0000, 0x0000, |
1582 | "HUAWEI MOBILE", |
1583 | "Mass Storage", |
1584 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1585 | 0), |
1586 | -UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000, |
1587 | +UNUSUAL_DEV( 0x12d1, 0x1436, 0x0000, 0x0000, |
1588 | "HUAWEI MOBILE", |
1589 | "Mass Storage", |
1590 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1591 | 0), |
1592 | -UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000, |
1593 | +UNUSUAL_DEV( 0x12d1, 0x1437, 0x0000, 0x0000, |
1594 | "HUAWEI MOBILE", |
1595 | "Mass Storage", |
1596 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1597 | 0), |
1598 | -UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000, |
1599 | +UNUSUAL_DEV( 0x12d1, 0x1438, 0x0000, 0x0000, |
1600 | "HUAWEI MOBILE", |
1601 | "Mass Storage", |
1602 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1603 | 0), |
1604 | -UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000, |
1605 | +UNUSUAL_DEV( 0x12d1, 0x1439, 0x0000, 0x0000, |
1606 | + "HUAWEI MOBILE", |
1607 | + "Mass Storage", |
1608 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1609 | + 0), |
1610 | +UNUSUAL_DEV( 0x12d1, 0x143A, 0x0000, 0x0000, |
1611 | + "HUAWEI MOBILE", |
1612 | + "Mass Storage", |
1613 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1614 | + 0), |
1615 | +UNUSUAL_DEV( 0x12d1, 0x143B, 0x0000, 0x0000, |
1616 | + "HUAWEI MOBILE", |
1617 | + "Mass Storage", |
1618 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1619 | + 0), |
1620 | +UNUSUAL_DEV( 0x12d1, 0x143C, 0x0000, 0x0000, |
1621 | + "HUAWEI MOBILE", |
1622 | + "Mass Storage", |
1623 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1624 | + 0), |
1625 | +UNUSUAL_DEV( 0x12d1, 0x143D, 0x0000, 0x0000, |
1626 | + "HUAWEI MOBILE", |
1627 | + "Mass Storage", |
1628 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1629 | + 0), |
1630 | +UNUSUAL_DEV( 0x12d1, 0x143E, 0x0000, 0x0000, |
1631 | + "HUAWEI MOBILE", |
1632 | + "Mass Storage", |
1633 | + US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1634 | + 0), |
1635 | +UNUSUAL_DEV( 0x12d1, 0x143F, 0x0000, 0x0000, |
1636 | "HUAWEI MOBILE", |
1637 | "Mass Storage", |
1638 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init, |
1639 | @@ -1834,6 +2117,15 @@ UNUSUAL_DEV( 0x2770, 0x915d, 0x0010, 0x0010, |
1640 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1641 | US_FL_FIX_CAPACITY ), |
1642 | |
1643 | +/* Reported by Frederic Marchal <frederic.marchal@wowcompany.com> |
1644 | + * Mio Moov 330 |
1645 | + */ |
1646 | +UNUSUAL_DEV( 0x3340, 0xffff, 0x0000, 0x0000, |
1647 | + "Mitac", |
1648 | + "Mio DigiWalker USB Sync", |
1649 | + US_SC_DEVICE,US_PR_DEVICE,NULL, |
1650 | + US_FL_MAX_SECTORS_64 ), |
1651 | + |
1652 | /* Reported by Andrey Rahmatullin <wrar@altlinux.org> */ |
1653 | UNUSUAL_DEV( 0x4102, 0x1020, 0x0100, 0x0100, |
1654 | "iRiver", |
1655 | diff --git a/drivers/watchdog/ib700wdt.c b/drivers/watchdog/ib700wdt.c |
1656 | index 05a2810..8782ec1 100644 |
1657 | --- a/drivers/watchdog/ib700wdt.c |
1658 | +++ b/drivers/watchdog/ib700wdt.c |
1659 | @@ -154,7 +154,7 @@ static int ibwdt_set_heartbeat(int t) |
1660 | return -EINVAL; |
1661 | |
1662 | for (i = 0x0F; i > -1; i--) |
1663 | - if (wd_times[i] > t) |
1664 | + if (wd_times[i] >= t) |
1665 | break; |
1666 | wd_margin = i; |
1667 | return 0; |
1668 | diff --git a/fs/binfmt_em86.c b/fs/binfmt_em86.c |
1669 | index f9c88d0..32fb00b 100644 |
1670 | --- a/fs/binfmt_em86.c |
1671 | +++ b/fs/binfmt_em86.c |
1672 | @@ -43,7 +43,7 @@ static int load_em86(struct linux_binprm *bprm,struct pt_regs *regs) |
1673 | return -ENOEXEC; |
1674 | } |
1675 | |
1676 | - bprm->sh_bang = 1; /* Well, the bang-shell is implicit... */ |
1677 | + bprm->recursion_depth++; /* Well, the bang-shell is implicit... */ |
1678 | allow_write_access(bprm->file); |
1679 | fput(bprm->file); |
1680 | bprm->file = NULL; |
1681 | diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c |
1682 | index 8d7e88e..f2744ab 100644 |
1683 | --- a/fs/binfmt_misc.c |
1684 | +++ b/fs/binfmt_misc.c |
1685 | @@ -117,7 +117,7 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs) |
1686 | goto _ret; |
1687 | |
1688 | retval = -ENOEXEC; |
1689 | - if (bprm->misc_bang) |
1690 | + if (bprm->recursion_depth > BINPRM_MAX_RECURSION) |
1691 | goto _ret; |
1692 | |
1693 | /* to keep locking time low, we copy the interpreter string */ |
1694 | @@ -197,7 +197,7 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs) |
1695 | if (retval < 0) |
1696 | goto _error; |
1697 | |
1698 | - bprm->misc_bang = 1; |
1699 | + bprm->recursion_depth++; |
1700 | |
1701 | retval = search_binary_handler (bprm, regs); |
1702 | if (retval < 0) |
1703 | diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c |
1704 | index 9e3963f..0834350 100644 |
1705 | --- a/fs/binfmt_script.c |
1706 | +++ b/fs/binfmt_script.c |
1707 | @@ -22,14 +22,15 @@ static int load_script(struct linux_binprm *bprm,struct pt_regs *regs) |
1708 | char interp[BINPRM_BUF_SIZE]; |
1709 | int retval; |
1710 | |
1711 | - if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || (bprm->sh_bang)) |
1712 | + if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || |
1713 | + (bprm->recursion_depth > BINPRM_MAX_RECURSION)) |
1714 | return -ENOEXEC; |
1715 | /* |
1716 | * This section does the #! interpretation. |
1717 | * Sorta complicated, but hopefully it will work. -TYT |
1718 | */ |
1719 | |
1720 | - bprm->sh_bang = 1; |
1721 | + bprm->recursion_depth++; |
1722 | allow_write_access(bprm->file); |
1723 | fput(bprm->file); |
1724 | bprm->file = NULL; |
1725 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
1726 | index 6e2be4a..223647f 100644 |
1727 | --- a/fs/cifs/connect.c |
1728 | +++ b/fs/cifs/connect.c |
1729 | @@ -128,7 +128,7 @@ cifs_reconnect(struct TCP_Server_Info *server) |
1730 | struct mid_q_entry *mid_entry; |
1731 | |
1732 | spin_lock(&GlobalMid_Lock); |
1733 | - if (kthread_should_stop()) { |
1734 | + if (server->tcpStatus == CifsExiting) { |
1735 | /* the demux thread will exit normally |
1736 | next time through the loop */ |
1737 | spin_unlock(&GlobalMid_Lock); |
1738 | @@ -182,7 +182,8 @@ cifs_reconnect(struct TCP_Server_Info *server) |
1739 | spin_unlock(&GlobalMid_Lock); |
1740 | up(&server->tcpSem); |
1741 | |
1742 | - while ((!kthread_should_stop()) && (server->tcpStatus != CifsGood)) { |
1743 | + while ((server->tcpStatus != CifsExiting) && |
1744 | + (server->tcpStatus != CifsGood)) { |
1745 | try_to_freeze(); |
1746 | if (server->addr.sockAddr6.sin6_family == AF_INET6) { |
1747 | rc = ipv6_connect(&server->addr.sockAddr6, |
1748 | @@ -200,7 +201,7 @@ cifs_reconnect(struct TCP_Server_Info *server) |
1749 | } else { |
1750 | atomic_inc(&tcpSesReconnectCount); |
1751 | spin_lock(&GlobalMid_Lock); |
1752 | - if (!kthread_should_stop()) |
1753 | + if (server->tcpStatus != CifsExiting) |
1754 | server->tcpStatus = CifsGood; |
1755 | server->sequence_number = 0; |
1756 | spin_unlock(&GlobalMid_Lock); |
1757 | @@ -355,7 +356,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server) |
1758 | GFP_KERNEL); |
1759 | |
1760 | set_freezable(); |
1761 | - while (!kthread_should_stop()) { |
1762 | + while (server->tcpStatus != CifsExiting) { |
1763 | if (try_to_freeze()) |
1764 | continue; |
1765 | if (bigbuf == NULL) { |
1766 | @@ -396,7 +397,7 @@ incomplete_rcv: |
1767 | kernel_recvmsg(csocket, &smb_msg, |
1768 | &iov, 1, pdu_length, 0 /* BB other flags? */); |
1769 | |
1770 | - if (kthread_should_stop()) { |
1771 | + if (server->tcpStatus == CifsExiting) { |
1772 | break; |
1773 | } else if (server->tcpStatus == CifsNeedReconnect) { |
1774 | cFYI(1, ("Reconnect after server stopped responding")); |
1775 | @@ -527,7 +528,7 @@ incomplete_rcv: |
1776 | total_read += length) { |
1777 | length = kernel_recvmsg(csocket, &smb_msg, &iov, 1, |
1778 | pdu_length - total_read, 0); |
1779 | - if (kthread_should_stop() || |
1780 | + if ((server->tcpStatus == CifsExiting) || |
1781 | (length == -EINTR)) { |
1782 | /* then will exit */ |
1783 | reconnect = 2; |
1784 | @@ -661,14 +662,6 @@ multi_t2_fnd: |
1785 | spin_unlock(&GlobalMid_Lock); |
1786 | wake_up_all(&server->response_q); |
1787 | |
1788 | - /* don't exit until kthread_stop is called */ |
1789 | - set_current_state(TASK_UNINTERRUPTIBLE); |
1790 | - while (!kthread_should_stop()) { |
1791 | - schedule(); |
1792 | - set_current_state(TASK_UNINTERRUPTIBLE); |
1793 | - } |
1794 | - set_current_state(TASK_RUNNING); |
1795 | - |
1796 | /* check if we have blocked requests that need to free */ |
1797 | /* Note that cifs_max_pending is normally 50, but |
1798 | can be set at module install time to as little as two */ |
1799 | @@ -764,6 +757,7 @@ multi_t2_fnd: |
1800 | read_unlock(&cifs_tcp_ses_lock); |
1801 | |
1802 | kfree(server->hostname); |
1803 | + task_to_wake = xchg(&server->tsk, NULL); |
1804 | kfree(server); |
1805 | |
1806 | length = atomic_dec_return(&tcpSesAllocCount); |
1807 | @@ -771,6 +765,16 @@ multi_t2_fnd: |
1808 | mempool_resize(cifs_req_poolp, length + cifs_min_rcv, |
1809 | GFP_KERNEL); |
1810 | |
1811 | + /* if server->tsk was NULL then wait for a signal before exiting */ |
1812 | + if (!task_to_wake) { |
1813 | + set_current_state(TASK_INTERRUPTIBLE); |
1814 | + while (!signal_pending(current)) { |
1815 | + schedule(); |
1816 | + set_current_state(TASK_INTERRUPTIBLE); |
1817 | + } |
1818 | + set_current_state(TASK_RUNNING); |
1819 | + } |
1820 | + |
1821 | return 0; |
1822 | } |
1823 | |
1824 | @@ -2310,7 +2314,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, |
1825 | /* on error free sesinfo and tcon struct if needed */ |
1826 | mount_fail_check: |
1827 | if (rc) { |
1828 | - /* If find_unc succeeded then rc == 0 so we can not end */ |
1829 | + /* If find_unc succeeded then rc == 0 so we can not end */ |
1830 | /* up accidently freeing someone elses tcon struct */ |
1831 | if (tcon) |
1832 | cifs_put_tcon(tcon); |
1833 | @@ -3715,8 +3719,10 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo, |
1834 | cERROR(1, ("Send error in SessSetup = %d", rc)); |
1835 | } else { |
1836 | cFYI(1, ("CIFS Session Established successfully")); |
1837 | + spin_lock(&GlobalMid_Lock); |
1838 | pSesInfo->status = CifsGood; |
1839 | pSesInfo->need_reconnect = false; |
1840 | + spin_unlock(&GlobalMid_Lock); |
1841 | } |
1842 | |
1843 | ss_err_exit: |
1844 | diff --git a/fs/exec.c b/fs/exec.c |
1845 | index cecee50..b266ace 100644 |
1846 | --- a/fs/exec.c |
1847 | +++ b/fs/exec.c |
1848 | @@ -1164,6 +1164,7 @@ EXPORT_SYMBOL(remove_arg_zero); |
1849 | */ |
1850 | int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) |
1851 | { |
1852 | + unsigned int depth = bprm->recursion_depth; |
1853 | int try,retval; |
1854 | struct linux_binfmt *fmt; |
1855 | #ifdef __alpha__ |
1856 | @@ -1224,8 +1225,15 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) |
1857 | continue; |
1858 | read_unlock(&binfmt_lock); |
1859 | retval = fn(bprm, regs); |
1860 | + /* |
1861 | + * Restore the depth counter to its starting value |
1862 | + * in this call, so we don't have to rely on every |
1863 | + * load_binary function to restore it on return. |
1864 | + */ |
1865 | + bprm->recursion_depth = depth; |
1866 | if (retval >= 0) { |
1867 | - tracehook_report_exec(fmt, bprm, regs); |
1868 | + if (depth == 0) |
1869 | + tracehook_report_exec(fmt, bprm, regs); |
1870 | put_binfmt(fmt); |
1871 | allow_write_access(bprm->file); |
1872 | if (bprm->file) |
1873 | diff --git a/fs/fcntl.c b/fs/fcntl.c |
1874 | index ac4f7db..549daf8 100644 |
1875 | --- a/fs/fcntl.c |
1876 | +++ b/fs/fcntl.c |
1877 | @@ -19,6 +19,7 @@ |
1878 | #include <linux/signal.h> |
1879 | #include <linux/rcupdate.h> |
1880 | #include <linux/pid_namespace.h> |
1881 | +#include <linux/smp_lock.h> |
1882 | |
1883 | #include <asm/poll.h> |
1884 | #include <asm/siginfo.h> |
1885 | @@ -175,6 +176,11 @@ static int setfl(int fd, struct file * filp, unsigned long arg) |
1886 | if (error) |
1887 | return error; |
1888 | |
1889 | + /* |
1890 | + * We still need a lock here for now to keep multiple FASYNC calls |
1891 | + * from racing with each other. |
1892 | + */ |
1893 | + lock_kernel(); |
1894 | if ((arg ^ filp->f_flags) & FASYNC) { |
1895 | if (filp->f_op && filp->f_op->fasync) { |
1896 | error = filp->f_op->fasync(fd, filp, (arg & FASYNC) != 0); |
1897 | @@ -185,6 +191,7 @@ static int setfl(int fd, struct file * filp, unsigned long arg) |
1898 | |
1899 | filp->f_flags = (arg & SETFL_MASK) | (filp->f_flags & ~SETFL_MASK); |
1900 | out: |
1901 | + unlock_kernel(); |
1902 | return error; |
1903 | } |
1904 | |
1905 | diff --git a/fs/ioctl.c b/fs/ioctl.c |
1906 | index 7db32b3..612e0b2 100644 |
1907 | --- a/fs/ioctl.c |
1908 | +++ b/fs/ioctl.c |
1909 | @@ -123,11 +123,9 @@ static int ioctl_fioasync(unsigned int fd, struct file *filp, |
1910 | |
1911 | /* Did FASYNC state change ? */ |
1912 | if ((flag ^ filp->f_flags) & FASYNC) { |
1913 | - if (filp->f_op && filp->f_op->fasync) { |
1914 | - lock_kernel(); |
1915 | + if (filp->f_op && filp->f_op->fasync) |
1916 | error = filp->f_op->fasync(fd, filp, on); |
1917 | - unlock_kernel(); |
1918 | - } else |
1919 | + else |
1920 | error = -ENOTTY; |
1921 | } |
1922 | if (error) |
1923 | @@ -163,11 +161,17 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, |
1924 | break; |
1925 | |
1926 | case FIONBIO: |
1927 | + /* BKL needed to avoid races tweaking f_flags */ |
1928 | + lock_kernel(); |
1929 | error = ioctl_fionbio(filp, argp); |
1930 | + unlock_kernel(); |
1931 | break; |
1932 | |
1933 | case FIOASYNC: |
1934 | + /* BKL needed to avoid races tweaking f_flags */ |
1935 | + lock_kernel(); |
1936 | error = ioctl_fioasync(fd, filp, argp); |
1937 | + unlock_kernel(); |
1938 | break; |
1939 | |
1940 | case FIOQSIZE: |
1941 | diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c |
1942 | index a5432bb..fe85219 100644 |
1943 | --- a/fs/jbd/checkpoint.c |
1944 | +++ b/fs/jbd/checkpoint.c |
1945 | @@ -93,7 +93,8 @@ static int __try_to_free_cp_buf(struct journal_head *jh) |
1946 | int ret = 0; |
1947 | struct buffer_head *bh = jh2bh(jh); |
1948 | |
1949 | - if (jh->b_jlist == BJ_None && !buffer_locked(bh) && !buffer_dirty(bh)) { |
1950 | + if (jh->b_jlist == BJ_None && !buffer_locked(bh) && |
1951 | + !buffer_dirty(bh) && !buffer_write_io_error(bh)) { |
1952 | JBUFFER_TRACE(jh, "remove from checkpoint list"); |
1953 | ret = __journal_remove_checkpoint(jh) + 1; |
1954 | jbd_unlock_bh_state(bh); |
1955 | @@ -160,21 +161,25 @@ static void jbd_sync_bh(journal_t *journal, struct buffer_head *bh) |
1956 | * buffers. Note that we take the buffers in the opposite ordering |
1957 | * from the one in which they were submitted for IO. |
1958 | * |
1959 | + * Return 0 on success, and return <0 if some buffers have failed |
1960 | + * to be written out. |
1961 | + * |
1962 | * Called with j_list_lock held. |
1963 | */ |
1964 | -static void __wait_cp_io(journal_t *journal, transaction_t *transaction) |
1965 | +static int __wait_cp_io(journal_t *journal, transaction_t *transaction) |
1966 | { |
1967 | struct journal_head *jh; |
1968 | struct buffer_head *bh; |
1969 | tid_t this_tid; |
1970 | int released = 0; |
1971 | + int ret = 0; |
1972 | |
1973 | this_tid = transaction->t_tid; |
1974 | restart: |
1975 | /* Did somebody clean up the transaction in the meanwhile? */ |
1976 | if (journal->j_checkpoint_transactions != transaction || |
1977 | transaction->t_tid != this_tid) |
1978 | - return; |
1979 | + return ret; |
1980 | while (!released && transaction->t_checkpoint_io_list) { |
1981 | jh = transaction->t_checkpoint_io_list; |
1982 | bh = jh2bh(jh); |
1983 | @@ -194,6 +199,9 @@ restart: |
1984 | spin_lock(&journal->j_list_lock); |
1985 | goto restart; |
1986 | } |
1987 | + if (unlikely(buffer_write_io_error(bh))) |
1988 | + ret = -EIO; |
1989 | + |
1990 | /* |
1991 | * Now in whatever state the buffer currently is, we know that |
1992 | * it has been written out and so we can drop it from the list |
1993 | @@ -203,6 +211,8 @@ restart: |
1994 | journal_remove_journal_head(bh); |
1995 | __brelse(bh); |
1996 | } |
1997 | + |
1998 | + return ret; |
1999 | } |
2000 | |
2001 | #define NR_BATCH 64 |
2002 | @@ -226,7 +236,8 @@ __flush_batch(journal_t *journal, struct buffer_head **bhs, int *batch_count) |
2003 | * Try to flush one buffer from the checkpoint list to disk. |
2004 | * |
2005 | * Return 1 if something happened which requires us to abort the current |
2006 | - * scan of the checkpoint list. |
2007 | + * scan of the checkpoint list. Return <0 if the buffer has failed to |
2008 | + * be written out. |
2009 | * |
2010 | * Called with j_list_lock held and drops it if 1 is returned |
2011 | * Called under jbd_lock_bh_state(jh2bh(jh)), and drops it |
2012 | @@ -256,6 +267,9 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh, |
2013 | log_wait_commit(journal, tid); |
2014 | ret = 1; |
2015 | } else if (!buffer_dirty(bh)) { |
2016 | + ret = 1; |
2017 | + if (unlikely(buffer_write_io_error(bh))) |
2018 | + ret = -EIO; |
2019 | J_ASSERT_JH(jh, !buffer_jbddirty(bh)); |
2020 | BUFFER_TRACE(bh, "remove from checkpoint"); |
2021 | __journal_remove_checkpoint(jh); |
2022 | @@ -263,7 +277,6 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh, |
2023 | jbd_unlock_bh_state(bh); |
2024 | journal_remove_journal_head(bh); |
2025 | __brelse(bh); |
2026 | - ret = 1; |
2027 | } else { |
2028 | /* |
2029 | * Important: we are about to write the buffer, and |
2030 | @@ -295,6 +308,7 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh, |
2031 | * to disk. We submit larger chunks of data at once. |
2032 | * |
2033 | * The journal should be locked before calling this function. |
2034 | + * Called with j_checkpoint_mutex held. |
2035 | */ |
2036 | int log_do_checkpoint(journal_t *journal) |
2037 | { |
2038 | @@ -318,6 +332,7 @@ int log_do_checkpoint(journal_t *journal) |
2039 | * OK, we need to start writing disk blocks. Take one transaction |
2040 | * and write it. |
2041 | */ |
2042 | + result = 0; |
2043 | spin_lock(&journal->j_list_lock); |
2044 | if (!journal->j_checkpoint_transactions) |
2045 | goto out; |
2046 | @@ -334,7 +349,7 @@ restart: |
2047 | int batch_count = 0; |
2048 | struct buffer_head *bhs[NR_BATCH]; |
2049 | struct journal_head *jh; |
2050 | - int retry = 0; |
2051 | + int retry = 0, err; |
2052 | |
2053 | while (!retry && transaction->t_checkpoint_list) { |
2054 | struct buffer_head *bh; |
2055 | @@ -347,6 +362,8 @@ restart: |
2056 | break; |
2057 | } |
2058 | retry = __process_buffer(journal, jh, bhs,&batch_count); |
2059 | + if (retry < 0 && !result) |
2060 | + result = retry; |
2061 | if (!retry && (need_resched() || |
2062 | spin_needbreak(&journal->j_list_lock))) { |
2063 | spin_unlock(&journal->j_list_lock); |
2064 | @@ -371,14 +388,18 @@ restart: |
2065 | * Now we have cleaned up the first transaction's checkpoint |
2066 | * list. Let's clean up the second one |
2067 | */ |
2068 | - __wait_cp_io(journal, transaction); |
2069 | + err = __wait_cp_io(journal, transaction); |
2070 | + if (!result) |
2071 | + result = err; |
2072 | } |
2073 | out: |
2074 | spin_unlock(&journal->j_list_lock); |
2075 | - result = cleanup_journal_tail(journal); |
2076 | if (result < 0) |
2077 | - return result; |
2078 | - return 0; |
2079 | + journal_abort(journal, result); |
2080 | + else |
2081 | + result = cleanup_journal_tail(journal); |
2082 | + |
2083 | + return (result < 0) ? result : 0; |
2084 | } |
2085 | |
2086 | /* |
2087 | @@ -394,8 +415,9 @@ out: |
2088 | * This is the only part of the journaling code which really needs to be |
2089 | * aware of transaction aborts. Checkpointing involves writing to the |
2090 | * main filesystem area rather than to the journal, so it can proceed |
2091 | - * even in abort state, but we must not update the journal superblock if |
2092 | - * we have an abort error outstanding. |
2093 | + * even in abort state, but we must not update the super block if |
2094 | + * checkpointing may have failed. Otherwise, we would lose some metadata |
2095 | + * buffers which should be written-back to the filesystem. |
2096 | */ |
2097 | |
2098 | int cleanup_journal_tail(journal_t *journal) |
2099 | @@ -404,6 +426,9 @@ int cleanup_journal_tail(journal_t *journal) |
2100 | tid_t first_tid; |
2101 | unsigned long blocknr, freed; |
2102 | |
2103 | + if (is_journal_aborted(journal)) |
2104 | + return 1; |
2105 | + |
2106 | /* OK, work out the oldest transaction remaining in the log, and |
2107 | * the log block it starts at. |
2108 | * |
2109 | diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c |
2110 | index aa7143a..9e4fa52 100644 |
2111 | --- a/fs/jbd/journal.c |
2112 | +++ b/fs/jbd/journal.c |
2113 | @@ -1121,9 +1121,12 @@ recovery_error: |
2114 | * |
2115 | * Release a journal_t structure once it is no longer in use by the |
2116 | * journaled object. |
2117 | + * Return <0 if we couldn't clean up the journal. |
2118 | */ |
2119 | -void journal_destroy(journal_t *journal) |
2120 | +int journal_destroy(journal_t *journal) |
2121 | { |
2122 | + int err = 0; |
2123 | + |
2124 | /* Wait for the commit thread to wake up and die. */ |
2125 | journal_kill_thread(journal); |
2126 | |
2127 | @@ -1146,11 +1149,16 @@ void journal_destroy(journal_t *journal) |
2128 | J_ASSERT(journal->j_checkpoint_transactions == NULL); |
2129 | spin_unlock(&journal->j_list_lock); |
2130 | |
2131 | - /* We can now mark the journal as empty. */ |
2132 | - journal->j_tail = 0; |
2133 | - journal->j_tail_sequence = ++journal->j_transaction_sequence; |
2134 | if (journal->j_sb_buffer) { |
2135 | - journal_update_superblock(journal, 1); |
2136 | + if (!is_journal_aborted(journal)) { |
2137 | + /* We can now mark the journal as empty. */ |
2138 | + journal->j_tail = 0; |
2139 | + journal->j_tail_sequence = |
2140 | + ++journal->j_transaction_sequence; |
2141 | + journal_update_superblock(journal, 1); |
2142 | + } else { |
2143 | + err = -EIO; |
2144 | + } |
2145 | brelse(journal->j_sb_buffer); |
2146 | } |
2147 | |
2148 | @@ -1160,6 +1168,8 @@ void journal_destroy(journal_t *journal) |
2149 | journal_destroy_revoke(journal); |
2150 | kfree(journal->j_wbuf); |
2151 | kfree(journal); |
2152 | + |
2153 | + return err; |
2154 | } |
2155 | |
2156 | |
2157 | @@ -1359,10 +1369,16 @@ int journal_flush(journal_t *journal) |
2158 | spin_lock(&journal->j_list_lock); |
2159 | while (!err && journal->j_checkpoint_transactions != NULL) { |
2160 | spin_unlock(&journal->j_list_lock); |
2161 | + mutex_lock(&journal->j_checkpoint_mutex); |
2162 | err = log_do_checkpoint(journal); |
2163 | + mutex_unlock(&journal->j_checkpoint_mutex); |
2164 | spin_lock(&journal->j_list_lock); |
2165 | } |
2166 | spin_unlock(&journal->j_list_lock); |
2167 | + |
2168 | + if (is_journal_aborted(journal)) |
2169 | + return -EIO; |
2170 | + |
2171 | cleanup_journal_tail(journal); |
2172 | |
2173 | /* Finally, mark the journal as really needing no recovery. |
2174 | @@ -1384,7 +1400,7 @@ int journal_flush(journal_t *journal) |
2175 | J_ASSERT(journal->j_head == journal->j_tail); |
2176 | J_ASSERT(journal->j_tail_sequence == journal->j_transaction_sequence); |
2177 | spin_unlock(&journal->j_state_lock); |
2178 | - return err; |
2179 | + return 0; |
2180 | } |
2181 | |
2182 | /** |
2183 | diff --git a/fs/jbd/recovery.c b/fs/jbd/recovery.c |
2184 | index 43bc5e5..db5e982 100644 |
2185 | --- a/fs/jbd/recovery.c |
2186 | +++ b/fs/jbd/recovery.c |
2187 | @@ -223,7 +223,7 @@ do { \ |
2188 | */ |
2189 | int journal_recover(journal_t *journal) |
2190 | { |
2191 | - int err; |
2192 | + int err, err2; |
2193 | journal_superblock_t * sb; |
2194 | |
2195 | struct recovery_info info; |
2196 | @@ -261,7 +261,10 @@ int journal_recover(journal_t *journal) |
2197 | journal->j_transaction_sequence = ++info.end_transaction; |
2198 | |
2199 | journal_clear_revoke(journal); |
2200 | - sync_blockdev(journal->j_fs_dev); |
2201 | + err2 = sync_blockdev(journal->j_fs_dev); |
2202 | + if (!err) |
2203 | + err = err2; |
2204 | + |
2205 | return err; |
2206 | } |
2207 | |
2208 | diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c |
2209 | index f3ada04..8b84227 100644 |
2210 | --- a/fs/proc/task_mmu.c |
2211 | +++ b/fs/proc/task_mmu.c |
2212 | @@ -563,9 +563,9 @@ static u64 swap_pte_to_pagemap_entry(pte_t pte) |
2213 | return swp_type(e) | (swp_offset(e) << MAX_SWAPFILES_SHIFT); |
2214 | } |
2215 | |
2216 | -static unsigned long pte_to_pagemap_entry(pte_t pte) |
2217 | +static u64 pte_to_pagemap_entry(pte_t pte) |
2218 | { |
2219 | - unsigned long pme = 0; |
2220 | + u64 pme = 0; |
2221 | if (is_swap_pte(pte)) |
2222 | pme = PM_PFRAME(swap_pte_to_pagemap_entry(pte)) |
2223 | | PM_PSHIFT(PAGE_SHIFT) | PM_SWAP; |
2224 | diff --git a/fs/xfs/xfs_rename.c b/fs/xfs/xfs_rename.c |
2225 | index d700dac..c903130 100644 |
2226 | --- a/fs/xfs/xfs_rename.c |
2227 | +++ b/fs/xfs/xfs_rename.c |
2228 | @@ -212,7 +212,7 @@ xfs_rename( |
2229 | if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) && |
2230 | (target_dp->i_d.di_projid != src_ip->i_d.di_projid))) { |
2231 | error = XFS_ERROR(EXDEV); |
2232 | - xfs_rename_unlock4(inodes, XFS_ILOCK_SHARED); |
2233 | + xfs_rename_unlock4(inodes, XFS_ILOCK_EXCL); |
2234 | xfs_trans_cancel(tp, cancel_flags); |
2235 | goto std_return; |
2236 | } |
2237 | diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h |
2238 | index 826f623..12413a1 100644 |
2239 | --- a/include/linux/binfmts.h |
2240 | +++ b/include/linux/binfmts.h |
2241 | @@ -36,6 +36,7 @@ struct linux_binprm{ |
2242 | unsigned long p; /* current top of mem */ |
2243 | unsigned int sh_bang:1, |
2244 | misc_bang:1; |
2245 | + unsigned int recursion_depth; |
2246 | struct file * file; |
2247 | int e_uid, e_gid; |
2248 | kernel_cap_t cap_post_exec_permitted; |
2249 | @@ -58,6 +59,7 @@ struct linux_binprm{ |
2250 | #define BINPRM_FLAGS_EXECFD_BIT 1 |
2251 | #define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT) |
2252 | |
2253 | +#define BINPRM_MAX_RECURSION 4 |
2254 | |
2255 | /* |
2256 | * This structure defines the functions that are used to load the binary formats that |
2257 | diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h |
2258 | index 53ea933..73f4532 100644 |
2259 | --- a/include/linux/blkdev.h |
2260 | +++ b/include/linux/blkdev.h |
2261 | @@ -623,6 +623,7 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn; |
2262 | * default timeout for SG_IO if none specified |
2263 | */ |
2264 | #define BLK_DEFAULT_SG_TIMEOUT (60 * HZ) |
2265 | +#define BLK_MIN_SG_TIMEOUT (7 * HZ) |
2266 | |
2267 | #ifdef CONFIG_BOUNCE |
2268 | extern int init_emergency_isa_pool(void); |
2269 | diff --git a/include/linux/jbd.h b/include/linux/jbd.h |
2270 | index 07a9b52..0be86be 100644 |
2271 | --- a/include/linux/jbd.h |
2272 | +++ b/include/linux/jbd.h |
2273 | @@ -908,7 +908,7 @@ extern int journal_set_features |
2274 | (journal_t *, unsigned long, unsigned long, unsigned long); |
2275 | extern int journal_create (journal_t *); |
2276 | extern int journal_load (journal_t *journal); |
2277 | -extern void journal_destroy (journal_t *); |
2278 | +extern int journal_destroy (journal_t *); |
2279 | extern int journal_recover (journal_t *journal); |
2280 | extern int journal_wipe (journal_t *, int); |
2281 | extern int journal_skip_recovery (journal_t *); |
2282 | diff --git a/include/linux/pnp.h b/include/linux/pnp.h |
2283 | index be764e5..53b70fd 100644 |
2284 | --- a/include/linux/pnp.h |
2285 | +++ b/include/linux/pnp.h |
2286 | @@ -22,9 +22,11 @@ struct pnp_dev; |
2287 | * Resource Management |
2288 | */ |
2289 | #ifdef CONFIG_PNP |
2290 | -struct resource *pnp_get_resource(struct pnp_dev *, unsigned int, unsigned int); |
2291 | +struct resource *pnp_get_resource(struct pnp_dev *dev, unsigned long type, |
2292 | + unsigned int num); |
2293 | #else |
2294 | -static inline struct resource *pnp_get_resource(struct pnp_dev *dev, unsigned int type, unsigned int num) |
2295 | +static inline struct resource *pnp_get_resource(struct pnp_dev *dev, |
2296 | + unsigned long type, unsigned int num) |
2297 | { |
2298 | return NULL; |
2299 | } |
2300 | diff --git a/kernel/fork.c b/kernel/fork.c |
2301 | index 7ce2ebe..d8ad2c6 100644 |
2302 | --- a/kernel/fork.c |
2303 | +++ b/kernel/fork.c |
2304 | @@ -313,17 +313,20 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) |
2305 | file = tmp->vm_file; |
2306 | if (file) { |
2307 | struct inode *inode = file->f_path.dentry->d_inode; |
2308 | + struct address_space *mapping = file->f_mapping; |
2309 | + |
2310 | get_file(file); |
2311 | if (tmp->vm_flags & VM_DENYWRITE) |
2312 | atomic_dec(&inode->i_writecount); |
2313 | - |
2314 | - /* insert tmp into the share list, just after mpnt */ |
2315 | - spin_lock(&file->f_mapping->i_mmap_lock); |
2316 | + spin_lock(&mapping->i_mmap_lock); |
2317 | + if (tmp->vm_flags & VM_SHARED) |
2318 | + mapping->i_mmap_writable++; |
2319 | tmp->vm_truncate_count = mpnt->vm_truncate_count; |
2320 | - flush_dcache_mmap_lock(file->f_mapping); |
2321 | + flush_dcache_mmap_lock(mapping); |
2322 | + /* insert tmp into the share list, just after mpnt */ |
2323 | vma_prio_tree_add(tmp, mpnt); |
2324 | - flush_dcache_mmap_unlock(file->f_mapping); |
2325 | - spin_unlock(&file->f_mapping->i_mmap_lock); |
2326 | + flush_dcache_mmap_unlock(mapping); |
2327 | + spin_unlock(&mapping->i_mmap_lock); |
2328 | } |
2329 | |
2330 | /* |
2331 | diff --git a/kernel/sched.c b/kernel/sched.c |
2332 | index a992cbe..92c0a70 100644 |
2333 | --- a/kernel/sched.c |
2334 | +++ b/kernel/sched.c |
2335 | @@ -6500,7 +6500,9 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu) |
2336 | req = list_entry(rq->migration_queue.next, |
2337 | struct migration_req, list); |
2338 | list_del_init(&req->list); |
2339 | + spin_unlock_irq(&rq->lock); |
2340 | complete(&req->done); |
2341 | + spin_lock_irq(&rq->lock); |
2342 | } |
2343 | spin_unlock_irq(&rq->lock); |
2344 | break; |
2345 | @@ -6802,15 +6804,17 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu) |
2346 | struct sched_domain *tmp; |
2347 | |
2348 | /* Remove the sched domains which do not contribute to scheduling. */ |
2349 | - for (tmp = sd; tmp; tmp = tmp->parent) { |
2350 | + for (tmp = sd; tmp; ) { |
2351 | struct sched_domain *parent = tmp->parent; |
2352 | if (!parent) |
2353 | break; |
2354 | + |
2355 | if (sd_parent_degenerate(tmp, parent)) { |
2356 | tmp->parent = parent->parent; |
2357 | if (parent->parent) |
2358 | parent->parent->child = tmp; |
2359 | - } |
2360 | + } else |
2361 | + tmp = tmp->parent; |
2362 | } |
2363 | |
2364 | if (sd && sd_degenerate(sd)) { |
2365 | diff --git a/net/atm/svc.c b/net/atm/svc.c |
2366 | index de1e4f2..8fb54dc 100644 |
2367 | --- a/net/atm/svc.c |
2368 | +++ b/net/atm/svc.c |
2369 | @@ -293,7 +293,10 @@ static int svc_listen(struct socket *sock,int backlog) |
2370 | error = -EINVAL; |
2371 | goto out; |
2372 | } |
2373 | - vcc_insert_socket(sk); |
2374 | + if (test_bit(ATM_VF_LISTEN, &vcc->flags)) { |
2375 | + error = -EADDRINUSE; |
2376 | + goto out; |
2377 | + } |
2378 | set_bit(ATM_VF_WAITING, &vcc->flags); |
2379 | prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE); |
2380 | sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local); |
2381 | @@ -307,6 +310,7 @@ static int svc_listen(struct socket *sock,int backlog) |
2382 | goto out; |
2383 | } |
2384 | set_bit(ATM_VF_LISTEN,&vcc->flags); |
2385 | + vcc_insert_socket(sk); |
2386 | sk->sk_max_ack_backlog = backlog > 0 ? backlog : ATM_BACKLOG_DEFAULT; |
2387 | error = -sk->sk_err; |
2388 | out: |
2389 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c |
2390 | index 57e26fa..915e6b7 100644 |
2391 | --- a/net/ipv4/udp.c |
2392 | +++ b/net/ipv4/udp.c |
2393 | @@ -302,7 +302,7 @@ static struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr, |
2394 | return result; |
2395 | } |
2396 | |
2397 | -static inline struct sock *udp_v4_mcast_next(struct sock *sk, |
2398 | +static inline struct sock *udp_v4_mcast_next(struct net *net, struct sock *sk, |
2399 | __be16 loc_port, __be32 loc_addr, |
2400 | __be16 rmt_port, __be32 rmt_addr, |
2401 | int dif) |
2402 | @@ -314,7 +314,8 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk, |
2403 | sk_for_each_from(s, node) { |
2404 | struct inet_sock *inet = inet_sk(s); |
2405 | |
2406 | - if (s->sk_hash != hnum || |
2407 | + if (!net_eq(sock_net(s), net) || |
2408 | + s->sk_hash != hnum || |
2409 | (inet->daddr && inet->daddr != rmt_addr) || |
2410 | (inet->dport != rmt_port && inet->dport) || |
2411 | (inet->rcv_saddr && inet->rcv_saddr != loc_addr) || |
2412 | @@ -1097,15 +1098,16 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb, |
2413 | read_lock(&udp_hash_lock); |
2414 | sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]); |
2415 | dif = skb->dev->ifindex; |
2416 | - sk = udp_v4_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); |
2417 | + sk = udp_v4_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif); |
2418 | if (sk) { |
2419 | struct sock *sknext = NULL; |
2420 | |
2421 | do { |
2422 | struct sk_buff *skb1 = skb; |
2423 | |
2424 | - sknext = udp_v4_mcast_next(sk_next(sk), uh->dest, daddr, |
2425 | - uh->source, saddr, dif); |
2426 | + sknext = udp_v4_mcast_next(net, sk_next(sk), uh->dest, |
2427 | + daddr, uh->source, saddr, |
2428 | + dif); |
2429 | if (sknext) |
2430 | skb1 = skb_clone(skb, GFP_ATOMIC); |
2431 | |
2432 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c |
2433 | index a6aecf7..e53d101 100644 |
2434 | --- a/net/ipv6/udp.c |
2435 | +++ b/net/ipv6/udp.c |
2436 | @@ -313,7 +313,7 @@ drop: |
2437 | return -1; |
2438 | } |
2439 | |
2440 | -static struct sock *udp_v6_mcast_next(struct sock *sk, |
2441 | +static struct sock *udp_v6_mcast_next(struct net *net, struct sock *sk, |
2442 | __be16 loc_port, struct in6_addr *loc_addr, |
2443 | __be16 rmt_port, struct in6_addr *rmt_addr, |
2444 | int dif) |
2445 | @@ -325,7 +325,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk, |
2446 | sk_for_each_from(s, node) { |
2447 | struct inet_sock *inet = inet_sk(s); |
2448 | |
2449 | - if (sock_net(s) != sock_net(sk)) |
2450 | + if (!net_eq(sock_net(s), net)) |
2451 | continue; |
2452 | |
2453 | if (s->sk_hash == num && s->sk_family == PF_INET6) { |
2454 | @@ -368,14 +368,14 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb, |
2455 | read_lock(&udp_hash_lock); |
2456 | sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]); |
2457 | dif = inet6_iif(skb); |
2458 | - sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif); |
2459 | + sk = udp_v6_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif); |
2460 | if (!sk) { |
2461 | kfree_skb(skb); |
2462 | goto out; |
2463 | } |
2464 | |
2465 | sk2 = sk; |
2466 | - while ((sk2 = udp_v6_mcast_next(sk_next(sk2), uh->dest, daddr, |
2467 | + while ((sk2 = udp_v6_mcast_next(net, sk_next(sk2), uh->dest, daddr, |
2468 | uh->source, saddr, dif))) { |
2469 | struct sk_buff *buff = skb_clone(skb, GFP_ATOMIC); |
2470 | if (buff) { |
2471 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c |
2472 | index b0785ef..8e66fe0 100644 |
2473 | --- a/net/unix/af_unix.c |
2474 | +++ b/net/unix/af_unix.c |
2475 | @@ -2230,7 +2230,7 @@ static int unix_net_init(struct net *net) |
2476 | #endif |
2477 | error = 0; |
2478 | out: |
2479 | - return 0; |
2480 | + return error; |
2481 | } |
2482 | |
2483 | static void unix_net_exit(struct net *net) |
2484 | diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c |
2485 | index 2f283ea..de5ee8f 100644 |
2486 | --- a/sound/pci/emu10k1/emu10k1_main.c |
2487 | +++ b/sound/pci/emu10k1/emu10k1_main.c |
2488 | @@ -1464,6 +1464,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { |
2489 | .ca0151_chip = 1, |
2490 | .spk71 = 1, |
2491 | .spdif_bug = 1, |
2492 | + .invert_shared_spdif = 1, /* digital/analog switch swapped */ |
2493 | .ac97_chip = 1} , |
2494 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102, |
2495 | .driver = "Audigy2", .name = "Audigy 2 ZS [SB0350]", |
2496 | @@ -1473,6 +1474,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { |
2497 | .ca0151_chip = 1, |
2498 | .spk71 = 1, |
2499 | .spdif_bug = 1, |
2500 | + .invert_shared_spdif = 1, /* digital/analog switch swapped */ |
2501 | .ac97_chip = 1} , |
2502 | {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102, |
2503 | .driver = "Audigy2", .name = "Audigy 2 ZS [2001]", |
2504 | @@ -1482,6 +1484,7 @@ static struct snd_emu_chip_details emu_chip_details[] = { |
2505 | .ca0151_chip = 1, |
2506 | .spk71 = 1, |
2507 | .spdif_bug = 1, |
2508 | + .invert_shared_spdif = 1, /* digital/analog switch swapped */ |
2509 | .ac97_chip = 1} , |
2510 | /* Audigy 2 */ |
2511 | /* Tested by James@superbug.co.uk 3rd July 2005 */ |
2512 | diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c |
2513 | index 1e5aff5..2fe4ea1 100644 |
2514 | --- a/sound/pci/hda/hda_proc.c |
2515 | +++ b/sound/pci/hda/hda_proc.c |
2516 | @@ -216,7 +216,7 @@ static void print_pin_caps(struct snd_info_buffer *buffer, |
2517 | unsigned int caps, val; |
2518 | |
2519 | caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP); |
2520 | - snd_iprintf(buffer, " Pincap 0x08%x:", caps); |
2521 | + snd_iprintf(buffer, " Pincap 0x%08x:", caps); |
2522 | if (caps & AC_PINCAP_IN) |
2523 | snd_iprintf(buffer, " IN"); |
2524 | if (caps & AC_PINCAP_OUT) |
2525 | diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c |
2526 | index e8003d9..cb13307 100644 |
2527 | --- a/sound/pci/hda/patch_analog.c |
2528 | +++ b/sound/pci/hda/patch_analog.c |
2529 | @@ -2247,8 +2247,12 @@ static struct hda_verb ad1988_spdif_init_verbs[] = { |
2530 | |
2531 | /* AD1989 has no ADC -> SPDIF route */ |
2532 | static struct hda_verb ad1989_spdif_init_verbs[] = { |
2533 | - /* SPDIF out pin */ |
2534 | + /* SPDIF-1 out pin */ |
2535 | + {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, |
2536 | {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */ |
2537 | + /* SPDIF-2/HDMI out pin */ |
2538 | + {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, |
2539 | + {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */ |
2540 | { } |
2541 | }; |
2542 | |
2543 | @@ -2868,6 +2872,7 @@ static struct snd_pci_quirk ad1988_cfg_tbl[] = { |
2544 | SND_PCI_QUIRK(0x1043, 0x81ec, "Asus P5B-DLX", AD1988_6STACK_DIG), |
2545 | SND_PCI_QUIRK(0x1043, 0x81f6, "Asus M2N-SLI", AD1988_6STACK_DIG), |
2546 | SND_PCI_QUIRK(0x1043, 0x8277, "Asus P5K-E/WIFI-AP", AD1988_6STACK_DIG), |
2547 | + SND_PCI_QUIRK(0x1043, 0x8311, "Asus P5Q-Premium/Pro", AD1988_6STACK_DIG), |
2548 | {} |
2549 | }; |
2550 | |
2551 | @@ -3842,6 +3847,9 @@ static const char *ad1884a_models[AD1884A_MODELS] = { |
2552 | |
2553 | static struct snd_pci_quirk ad1884a_cfg_tbl[] = { |
2554 | SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE), |
2555 | + SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE), |
2556 | + SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP), |
2557 | + SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP), |
2558 | SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD), |
2559 | {} |
2560 | }; |
2561 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2562 | index 6602516..a1a3a34 100644 |
2563 | --- a/sound/pci/hda/patch_realtek.c |
2564 | +++ b/sound/pci/hda/patch_realtek.c |
2565 | @@ -100,6 +100,7 @@ enum { |
2566 | ALC262_BENQ_T31, |
2567 | ALC262_ULTRA, |
2568 | ALC262_LENOVO_3000, |
2569 | + ALC262_NEC, |
2570 | ALC262_AUTO, |
2571 | ALC262_MODEL_LAST /* last tag */ |
2572 | }; |
2573 | @@ -291,6 +292,13 @@ struct alc_spec { |
2574 | /* for PLL fix */ |
2575 | hda_nid_t pll_nid; |
2576 | unsigned int pll_coef_idx, pll_coef_bit; |
2577 | + |
2578 | +#ifdef SND_HDA_NEEDS_RESUME |
2579 | +#define ALC_MAX_PINS 16 |
2580 | + unsigned int num_pins; |
2581 | + hda_nid_t pin_nids[ALC_MAX_PINS]; |
2582 | + unsigned int pin_cfgs[ALC_MAX_PINS]; |
2583 | +#endif |
2584 | }; |
2585 | |
2586 | /* |
2587 | @@ -2722,6 +2730,64 @@ static void alc_free(struct hda_codec *codec) |
2588 | codec->spec = NULL; /* to be sure */ |
2589 | } |
2590 | |
2591 | +#ifdef SND_HDA_NEEDS_RESUME |
2592 | +static void store_pin_configs(struct hda_codec *codec) |
2593 | +{ |
2594 | + struct alc_spec *spec = codec->spec; |
2595 | + hda_nid_t nid, end_nid; |
2596 | + |
2597 | + end_nid = codec->start_nid + codec->num_nodes; |
2598 | + for (nid = codec->start_nid; nid < end_nid; nid++) { |
2599 | + unsigned int wid_caps = get_wcaps(codec, nid); |
2600 | + unsigned int wid_type = |
2601 | + (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT; |
2602 | + if (wid_type != AC_WID_PIN) |
2603 | + continue; |
2604 | + if (spec->num_pins >= ARRAY_SIZE(spec->pin_nids)) |
2605 | + break; |
2606 | + spec->pin_nids[spec->num_pins] = nid; |
2607 | + spec->pin_cfgs[spec->num_pins] = |
2608 | + snd_hda_codec_read(codec, nid, 0, |
2609 | + AC_VERB_GET_CONFIG_DEFAULT, 0); |
2610 | + spec->num_pins++; |
2611 | + } |
2612 | +} |
2613 | + |
2614 | +static void resume_pin_configs(struct hda_codec *codec) |
2615 | +{ |
2616 | + struct alc_spec *spec = codec->spec; |
2617 | + int i; |
2618 | + |
2619 | + for (i = 0; i < spec->num_pins; i++) { |
2620 | + hda_nid_t pin_nid = spec->pin_nids[i]; |
2621 | + unsigned int pin_config = spec->pin_cfgs[i]; |
2622 | + snd_hda_codec_write(codec, pin_nid, 0, |
2623 | + AC_VERB_SET_CONFIG_DEFAULT_BYTES_0, |
2624 | + pin_config & 0x000000ff); |
2625 | + snd_hda_codec_write(codec, pin_nid, 0, |
2626 | + AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, |
2627 | + (pin_config & 0x0000ff00) >> 8); |
2628 | + snd_hda_codec_write(codec, pin_nid, 0, |
2629 | + AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, |
2630 | + (pin_config & 0x00ff0000) >> 16); |
2631 | + snd_hda_codec_write(codec, pin_nid, 0, |
2632 | + AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, |
2633 | + pin_config >> 24); |
2634 | + } |
2635 | +} |
2636 | + |
2637 | +static int alc_resume(struct hda_codec *codec) |
2638 | +{ |
2639 | + resume_pin_configs(codec); |
2640 | + codec->patch_ops.init(codec); |
2641 | + snd_hda_codec_resume_amp(codec); |
2642 | + snd_hda_codec_resume_cache(codec); |
2643 | + return 0; |
2644 | +} |
2645 | +#else |
2646 | +#define store_pin_configs(codec) |
2647 | +#endif |
2648 | + |
2649 | /* |
2650 | */ |
2651 | static struct hda_codec_ops alc_patch_ops = { |
2652 | @@ -2730,6 +2796,9 @@ static struct hda_codec_ops alc_patch_ops = { |
2653 | .init = alc_init, |
2654 | .free = alc_free, |
2655 | .unsol_event = alc_unsol_event, |
2656 | +#ifdef SND_HDA_NEEDS_RESUME |
2657 | + .resume = alc_resume, |
2658 | +#endif |
2659 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
2660 | .check_power_status = alc_check_power_status, |
2661 | #endif |
2662 | @@ -3776,6 +3845,7 @@ static int alc880_parse_auto_config(struct hda_codec *codec) |
2663 | spec->num_mux_defs = 1; |
2664 | spec->input_mux = &spec->private_imux; |
2665 | |
2666 | + store_pin_configs(codec); |
2667 | return 1; |
2668 | } |
2669 | |
2670 | @@ -5124,6 +5194,7 @@ static int alc260_parse_auto_config(struct hda_codec *codec) |
2671 | } |
2672 | spec->num_mixers++; |
2673 | |
2674 | + store_pin_configs(codec); |
2675 | return 1; |
2676 | } |
2677 | |
2678 | @@ -6554,6 +6625,7 @@ static int patch_alc882(struct hda_codec *codec) |
2679 | board_config = ALC885_MACPRO; |
2680 | break; |
2681 | case 0x106b1000: /* iMac 24 */ |
2682 | + case 0x106b2800: /* AppleTV */ |
2683 | board_config = ALC885_IMAC24; |
2684 | break; |
2685 | case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */ |
2686 | @@ -6563,7 +6635,8 @@ static int patch_alc882(struct hda_codec *codec) |
2687 | break; |
2688 | default: |
2689 | /* ALC889A is handled better as ALC888-compatible */ |
2690 | - if (codec->revision_id == 0x100103) { |
2691 | + if (codec->revision_id == 0x100101 || |
2692 | + codec->revision_id == 0x100103) { |
2693 | alc_free(codec); |
2694 | return patch_alc883(codec); |
2695 | } |
2696 | @@ -7940,6 +8013,7 @@ static const char *alc883_models[ALC883_MODEL_LAST] = { |
2697 | static struct snd_pci_quirk alc883_cfg_tbl[] = { |
2698 | SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG), |
2699 | SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE), |
2700 | + SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE), |
2701 | SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE), |
2702 | SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE), |
2703 | SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), |
2704 | @@ -7990,6 +8064,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { |
2705 | SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), |
2706 | SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763), |
2707 | SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), |
2708 | + SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG), |
2709 | SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG), |
2710 | SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), |
2711 | SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL), |
2712 | @@ -8948,6 +9023,41 @@ static void alc262_hippo1_unsol_event(struct hda_codec *codec, |
2713 | } |
2714 | |
2715 | /* |
2716 | + * nec model |
2717 | + * 0x15 = headphone |
2718 | + * 0x16 = internal speaker |
2719 | + * 0x18 = external mic |
2720 | + */ |
2721 | + |
2722 | +static struct snd_kcontrol_new alc262_nec_mixer[] = { |
2723 | + HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT), |
2724 | + HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT), |
2725 | + |
2726 | + HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
2727 | + HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
2728 | + HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT), |
2729 | + |
2730 | + HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT), |
2731 | + HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT), |
2732 | + { } /* end */ |
2733 | +}; |
2734 | + |
2735 | +static struct hda_verb alc262_nec_verbs[] = { |
2736 | + /* Unmute Speaker */ |
2737 | + {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
2738 | + |
2739 | + /* Headphone */ |
2740 | + {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT}, |
2741 | + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
2742 | + |
2743 | + /* External mic to headphone */ |
2744 | + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, |
2745 | + /* External mic to speaker */ |
2746 | + {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, |
2747 | + {} |
2748 | +}; |
2749 | + |
2750 | +/* |
2751 | * fujitsu model |
2752 | * 0x14 = headphone/spdif-out, 0x15 = internal speaker, |
2753 | * 0x1b = port replicator headphone out |
2754 | @@ -9693,6 +9803,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec) |
2755 | if (err < 0) |
2756 | return err; |
2757 | |
2758 | + store_pin_configs(codec); |
2759 | return 1; |
2760 | } |
2761 | |
2762 | @@ -9731,11 +9842,13 @@ static const char *alc262_models[ALC262_MODEL_LAST] = { |
2763 | [ALC262_SONY_ASSAMD] = "sony-assamd", |
2764 | [ALC262_ULTRA] = "ultra", |
2765 | [ALC262_LENOVO_3000] = "lenovo-3000", |
2766 | + [ALC262_NEC] = "nec", |
2767 | [ALC262_AUTO] = "auto", |
2768 | }; |
2769 | |
2770 | static struct snd_pci_quirk alc262_cfg_tbl[] = { |
2771 | SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO), |
2772 | + SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC), |
2773 | SND_PCI_QUIRK(0x103c, 0x12fe, "HP xw9400", ALC262_HP_BPC), |
2774 | SND_PCI_QUIRK(0x103c, 0x12ff, "HP xw4550", ALC262_HP_BPC), |
2775 | SND_PCI_QUIRK(0x103c, 0x1306, "HP xw8600", ALC262_HP_BPC), |
2776 | @@ -9946,6 +10059,16 @@ static struct alc_config_preset alc262_presets[] = { |
2777 | .input_mux = &alc262_fujitsu_capture_source, |
2778 | .unsol_event = alc262_lenovo_3000_unsol_event, |
2779 | }, |
2780 | + [ALC262_NEC] = { |
2781 | + .mixers = { alc262_nec_mixer }, |
2782 | + .init_verbs = { alc262_nec_verbs }, |
2783 | + .num_dacs = ARRAY_SIZE(alc262_dac_nids), |
2784 | + .dac_nids = alc262_dac_nids, |
2785 | + .hp_nid = 0x03, |
2786 | + .num_channel_mode = ARRAY_SIZE(alc262_modes), |
2787 | + .channel_mode = alc262_modes, |
2788 | + .input_mux = &alc262_capture_source, |
2789 | + }, |
2790 | }; |
2791 | |
2792 | static int patch_alc262(struct hda_codec *codec) |
2793 | @@ -10712,6 +10835,7 @@ static int alc268_parse_auto_config(struct hda_codec *codec) |
2794 | if (err < 0) |
2795 | return err; |
2796 | |
2797 | + store_pin_configs(codec); |
2798 | return 1; |
2799 | } |
2800 | |
2801 | @@ -10758,6 +10882,7 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { |
2802 | SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST), |
2803 | SND_PCI_QUIRK(0x1179, 0xff10, "TOSHIBA A205", ALC268_TOSHIBA), |
2804 | SND_PCI_QUIRK(0x1179, 0xff50, "TOSHIBA A305", ALC268_TOSHIBA), |
2805 | + SND_PCI_QUIRK(0x1179, 0xff64, "TOSHIBA L305", ALC268_TOSHIBA), |
2806 | SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), |
2807 | SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), |
2808 | SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), |
2809 | @@ -10990,6 +11115,14 @@ static hda_nid_t alc269_adc_nids[1] = { |
2810 | 0x08, |
2811 | }; |
2812 | |
2813 | +static hda_nid_t alc269_capsrc_nids[1] = { |
2814 | + 0x23, |
2815 | +}; |
2816 | + |
2817 | +/* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24), |
2818 | + * not a mux! |
2819 | + */ |
2820 | + |
2821 | static struct hda_input_mux alc269_eeepc_dmic_capture_source = { |
2822 | .num_items = 2, |
2823 | .items = { |
2824 | @@ -11356,6 +11489,10 @@ static int alc269_parse_auto_config(struct hda_codec *codec) |
2825 | spec->init_verbs[spec->num_init_verbs++] = alc269_init_verbs; |
2826 | spec->num_mux_defs = 1; |
2827 | spec->input_mux = &spec->private_imux; |
2828 | + /* set default input source */ |
2829 | + snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0], |
2830 | + 0, AC_VERB_SET_CONNECT_SEL, |
2831 | + spec->input_mux->items[0].index); |
2832 | |
2833 | err = alc_auto_add_mic_boost(codec); |
2834 | if (err < 0) |
2835 | @@ -11364,6 +11501,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) |
2836 | spec->mixers[spec->num_mixers] = alc269_capture_mixer; |
2837 | spec->num_mixers++; |
2838 | |
2839 | + store_pin_configs(codec); |
2840 | return 1; |
2841 | } |
2842 | |
2843 | @@ -11488,6 +11626,7 @@ static int patch_alc269(struct hda_codec *codec) |
2844 | |
2845 | spec->adc_nids = alc269_adc_nids; |
2846 | spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids); |
2847 | + spec->capsrc_nids = alc269_capsrc_nids; |
2848 | |
2849 | codec->patch_ops = alc_patch_ops; |
2850 | if (board_config == ALC269_AUTO) |
2851 | @@ -12431,6 +12570,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec) |
2852 | spec->mixers[spec->num_mixers] = alc861_capture_mixer; |
2853 | spec->num_mixers++; |
2854 | |
2855 | + store_pin_configs(codec); |
2856 | return 1; |
2857 | } |
2858 | |
2859 | @@ -13542,6 +13682,7 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec) |
2860 | if (err < 0) |
2861 | return err; |
2862 | |
2863 | + store_pin_configs(codec); |
2864 | return 1; |
2865 | } |
2866 | |
2867 | @@ -14789,6 +14930,8 @@ static int alc662_parse_auto_config(struct hda_codec *codec) |
2868 | |
2869 | spec->mixers[spec->num_mixers] = alc662_capture_mixer; |
2870 | spec->num_mixers++; |
2871 | + |
2872 | + store_pin_configs(codec); |
2873 | return 1; |
2874 | } |
2875 | |
2876 | @@ -14846,6 +14989,9 @@ static int patch_alc662(struct hda_codec *codec) |
2877 | if (codec->vendor_id == 0x10ec0663) { |
2878 | spec->stream_name_analog = "ALC663 Analog"; |
2879 | spec->stream_name_digital = "ALC663 Digital"; |
2880 | + } else if (codec->vendor_id == 0x10ec0272) { |
2881 | + spec->stream_name_analog = "ALC272 Analog"; |
2882 | + spec->stream_name_digital = "ALC272 Digital"; |
2883 | } else { |
2884 | spec->stream_name_analog = "ALC662 Analog"; |
2885 | spec->stream_name_digital = "ALC662 Digital"; |
2886 | @@ -14883,6 +15029,7 @@ struct hda_codec_preset snd_hda_preset_realtek[] = { |
2887 | { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 }, |
2888 | { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 }, |
2889 | { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 }, |
2890 | + { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 }, |
2891 | { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660", |
2892 | .patch = patch_alc861 }, |
2893 | { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd }, |
2894 | @@ -14896,9 +15043,12 @@ struct hda_codec_preset snd_hda_preset_realtek[] = { |
2895 | { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, |
2896 | { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, |
2897 | { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc883 }, |
2898 | + { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A", |
2899 | + .patch = patch_alc882 }, /* should be patch_alc883() in future */ |
2900 | { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A", |
2901 | .patch = patch_alc882 }, /* should be patch_alc883() in future */ |
2902 | { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 }, |
2903 | + { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc883 }, |
2904 | { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc883 }, |
2905 | { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc883 }, |
2906 | {} /* terminator */ |
2907 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c |
2908 | index 732ce13..1d96aed 100644 |
2909 | --- a/sound/pci/hda/patch_sigmatel.c |
2910 | +++ b/sound/pci/hda/patch_sigmatel.c |
2911 | @@ -105,6 +105,7 @@ enum { |
2912 | STAC_MACBOOK_PRO_V2, |
2913 | STAC_IMAC_INTEL, |
2914 | STAC_IMAC_INTEL_20, |
2915 | + STAC_ECS_202, |
2916 | STAC_922X_DELL_D81, |
2917 | STAC_922X_DELL_D82, |
2918 | STAC_922X_DELL_M81, |
2919 | @@ -547,8 +548,8 @@ static struct hda_verb dell_eq_core_init[] = { |
2920 | { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec}, |
2921 | /* setup audio connections */ |
2922 | { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, |
2923 | - { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, |
2924 | - { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x02}, |
2925 | + { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x02}, |
2926 | + { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x01}, |
2927 | /* setup adcs to point to mixer */ |
2928 | { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b}, |
2929 | { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b}, |
2930 | @@ -1310,7 +1311,7 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { |
2931 | SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, |
2932 | "DFI LanParty", STAC_92HD73XX_REF), |
2933 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254, |
2934 | - "unknown Dell", STAC_DELL_M6), |
2935 | + "Dell Studio 1535", STAC_DELL_M6), |
2936 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255, |
2937 | "unknown Dell", STAC_DELL_M6), |
2938 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256, |
2939 | @@ -1323,6 +1324,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = { |
2940 | "unknown Dell", STAC_DELL_M6), |
2941 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271, |
2942 | "unknown Dell", STAC_DELL_M6), |
2943 | + SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f, |
2944 | + "Dell Studio 15", STAC_DELL_M6), |
2945 | {} /* terminator */ |
2946 | }; |
2947 | |
2948 | @@ -1478,6 +1481,11 @@ static unsigned int intel_mac_v5_pin_configs[10] = { |
2949 | 0x400000fc, 0x400000fb, |
2950 | }; |
2951 | |
2952 | +static unsigned int ecs202_pin_configs[10] = { |
2953 | + 0x0221401f, 0x02a19020, 0x01a19020, 0x01114010, |
2954 | + 0x408000f0, 0x01813022, 0x074510a0, 0x40c400f1, |
2955 | + 0x9037012e, 0x40e000f2, |
2956 | +}; |
2957 | |
2958 | static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = { |
2959 | [STAC_D945_REF] = ref922x_pin_configs, |
2960 | @@ -1496,6 +1504,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = { |
2961 | [STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs, |
2962 | [STAC_IMAC_INTEL] = intel_mac_v2_pin_configs, |
2963 | [STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs, |
2964 | + [STAC_ECS_202] = ecs202_pin_configs, |
2965 | [STAC_922X_DELL_D81] = dell_922x_d81_pin_configs, |
2966 | [STAC_922X_DELL_D82] = dell_922x_d82_pin_configs, |
2967 | [STAC_922X_DELL_M81] = dell_922x_m81_pin_configs, |
2968 | @@ -1519,6 +1528,7 @@ static const char *stac922x_models[STAC_922X_MODELS] = { |
2969 | [STAC_MACBOOK_PRO_V2] = "macbook-pro", |
2970 | [STAC_IMAC_INTEL] = "imac-intel", |
2971 | [STAC_IMAC_INTEL_20] = "imac-intel-20", |
2972 | + [STAC_ECS_202] = "ecs202", |
2973 | [STAC_922X_DELL_D81] = "dell-d81", |
2974 | [STAC_922X_DELL_D82] = "dell-d82", |
2975 | [STAC_922X_DELL_M81] = "dell-m81", |
2976 | @@ -1605,6 +1615,33 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = { |
2977 | "unknown Dell", STAC_922X_DELL_D81), |
2978 | SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7, |
2979 | "Dell XPS M1210", STAC_922X_DELL_M82), |
2980 | + /* ECS/PC Chips boards */ |
2981 | + SND_PCI_QUIRK(0x1019, 0x2144, |
2982 | + "ECS/PC chips", STAC_ECS_202), |
2983 | + SND_PCI_QUIRK(0x1019, 0x2608, |
2984 | + "ECS/PC chips", STAC_ECS_202), |
2985 | + SND_PCI_QUIRK(0x1019, 0x2633, |
2986 | + "ECS/PC chips P17G/1333", STAC_ECS_202), |
2987 | + SND_PCI_QUIRK(0x1019, 0x2811, |
2988 | + "ECS/PC chips", STAC_ECS_202), |
2989 | + SND_PCI_QUIRK(0x1019, 0x2812, |
2990 | + "ECS/PC chips", STAC_ECS_202), |
2991 | + SND_PCI_QUIRK(0x1019, 0x2813, |
2992 | + "ECS/PC chips", STAC_ECS_202), |
2993 | + SND_PCI_QUIRK(0x1019, 0x2814, |
2994 | + "ECS/PC chips", STAC_ECS_202), |
2995 | + SND_PCI_QUIRK(0x1019, 0x2815, |
2996 | + "ECS/PC chips", STAC_ECS_202), |
2997 | + SND_PCI_QUIRK(0x1019, 0x2816, |
2998 | + "ECS/PC chips", STAC_ECS_202), |
2999 | + SND_PCI_QUIRK(0x1019, 0x2817, |
3000 | + "ECS/PC chips", STAC_ECS_202), |
3001 | + SND_PCI_QUIRK(0x1019, 0x2818, |
3002 | + "ECS/PC chips", STAC_ECS_202), |
3003 | + SND_PCI_QUIRK(0x1019, 0x2819, |
3004 | + "ECS/PC chips", STAC_ECS_202), |
3005 | + SND_PCI_QUIRK(0x1019, 0x2820, |
3006 | + "ECS/PC chips", STAC_ECS_202), |
3007 | {} /* terminator */ |
3008 | }; |
3009 | |
3010 | @@ -2468,7 +2505,7 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec, |
3011 | } |
3012 | } |
3013 | |
3014 | - if (cfg->hp_outs > 1) { |
3015 | + if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) { |
3016 | err = stac92xx_add_control(spec, |
3017 | STAC_CTL_WIDGET_HP_SWITCH, |
3018 | "Headphone as Line Out Switch", 0); |