Annotation of /trunk/kernel26-magellan-server/patches-2.6.27-r2/0108-2.6.27.9-all-fixes.patch
Parent Directory | Revision Log
Revision 728 -
(hide 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 | niro | 728 | 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); |