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