Magellan Linux

Annotation of /trunk/kernel26-magellan-server/patches-2.6.25-r5/0114-2.6.25.15-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 677 - (hide annotations) (download)
Wed Sep 10 21:27:27 2008 UTC (15 years, 9 months ago) by niro
File size: 51825 byte(s)
2.6.25-magellan-r5:
- updated to linux-2.6.25.17

1 niro 677 diff --git a/arch/powerpc/kernel/ppc32.h b/arch/powerpc/kernel/ppc32.h
2     index 90e5627..fda05e2 100644
3     --- a/arch/powerpc/kernel/ppc32.h
4     +++ b/arch/powerpc/kernel/ppc32.h
5     @@ -135,4 +135,6 @@ struct ucontext32 {
6     struct mcontext32 uc_mcontext;
7     };
8    
9     +extern int copy_siginfo_to_user32(struct compat_siginfo __user *d, siginfo_t *s);
10     +
11     #endif /* _PPC64_PPC32_H */
12     diff --git a/arch/powerpc/kernel/ptrace32.c b/arch/powerpc/kernel/ptrace32.c
13     index 4c1de6a..9d30e10 100644
14     --- a/arch/powerpc/kernel/ptrace32.c
15     +++ b/arch/powerpc/kernel/ptrace32.c
16     @@ -29,12 +29,15 @@
17     #include <linux/security.h>
18     #include <linux/signal.h>
19     #include <linux/compat.h>
20     +#include <linux/elf.h>
21    
22     #include <asm/uaccess.h>
23     #include <asm/page.h>
24     #include <asm/pgtable.h>
25     #include <asm/system.h>
26    
27     +#include "ppc32.h"
28     +
29     /*
30     * does not yet catch signals sent when the child dies.
31     * in exit.c or in signal.c.
32     @@ -64,6 +67,27 @@ static long compat_ptrace_old(struct task_struct *child, long request,
33     return -EPERM;
34     }
35    
36     +static int compat_ptrace_getsiginfo(struct task_struct *child, compat_siginfo_t __user *data)
37     +{
38     + siginfo_t lastinfo;
39     + int error = -ESRCH;
40     +
41     + read_lock(&tasklist_lock);
42     + if (likely(child->sighand != NULL)) {
43     + error = -EINVAL;
44     + spin_lock_irq(&child->sighand->siglock);
45     + if (likely(child->last_siginfo != NULL)) {
46     + lastinfo = *child->last_siginfo;
47     + error = 0;
48     + }
49     + spin_unlock_irq(&child->sighand->siglock);
50     + }
51     + read_unlock(&tasklist_lock);
52     + if (!error)
53     + return copy_siginfo_to_user32(data, &lastinfo);
54     + return error;
55     +}
56     +
57     long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
58     compat_ulong_t caddr, compat_ulong_t cdata)
59     {
60     @@ -282,6 +306,9 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
61     0, PT_REGS_COUNT * sizeof(compat_long_t),
62     compat_ptr(data));
63    
64     + case PTRACE_GETSIGINFO:
65     + return compat_ptrace_getsiginfo(child, compat_ptr(data));
66     +
67     case PTRACE_GETFPREGS:
68     case PTRACE_SETFPREGS:
69     case PTRACE_GETVRREGS:
70     diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
71     index 794895c..f96b2e4 100644
72     --- a/arch/x86/mm/ioremap.c
73     +++ b/arch/x86/mm/ioremap.c
74     @@ -39,7 +39,7 @@ EXPORT_SYMBOL(__phys_addr);
75    
76     int page_is_ram(unsigned long pagenr)
77     {
78     - unsigned long addr, end;
79     + resource_size_t addr, end;
80     int i;
81    
82     /*
83     @@ -109,7 +109,8 @@ static int ioremap_change_attr(unsigned long vaddr, unsigned long size,
84     static void __iomem *__ioremap(resource_size_t phys_addr, unsigned long size,
85     enum ioremap_mode mode)
86     {
87     - unsigned long pfn, offset, last_addr, vaddr;
88     + unsigned long pfn, offset, vaddr;
89     + resource_size_t last_addr;
90     struct vm_struct *area;
91     pgprot_t prot;
92    
93     diff --git a/drivers/acpi/bay.c b/drivers/acpi/bay.c
94     index 1fa8681..a845062 100644
95     --- a/drivers/acpi/bay.c
96     +++ b/drivers/acpi/bay.c
97     @@ -299,16 +299,20 @@ static int bay_add(acpi_handle handle, int id)
98     */
99     pdev->dev.uevent_suppress = 0;
100    
101     - if (acpi_bay_add_fs(new_bay)) {
102     - platform_device_unregister(new_bay->pdev);
103     - goto bay_add_err;
104     - }
105     -
106     /* register for events on this device */
107     status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
108     bay_notify, new_bay);
109     if (ACPI_FAILURE(status)) {
110     - printk(KERN_ERR PREFIX "Error installing bay notify handler\n");
111     + printk(KERN_INFO PREFIX "Error installing bay notify handler\n");
112     + platform_device_unregister(new_bay->pdev);
113     + goto bay_add_err;
114     + }
115     +
116     + if (acpi_bay_add_fs(new_bay)) {
117     + acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
118     + bay_notify);
119     + platform_device_unregister(new_bay->pdev);
120     + goto bay_add_err;
121     }
122    
123     /* if we are on a dock station, we should register for dock
124     diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
125     index 1bcecc7..a32aed9 100644
126     --- a/drivers/acpi/thermal.c
127     +++ b/drivers/acpi/thermal.c
128     @@ -359,10 +359,17 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
129     if (flag & ACPI_TRIPS_CRITICAL) {
130     status = acpi_evaluate_integer(tz->device->handle,
131     "_CRT", NULL, &tz->trips.critical.temperature);
132     - if (ACPI_FAILURE(status)) {
133     + /*
134     + * Treat freezing temperatures as invalid as well; some
135     + * BIOSes return really low values and cause reboots at startup.
136     + * Below zero (Celcius) values clearly aren't right for sure..
137     + * ... so lets discard those as invalid.
138     + */
139     + if (ACPI_FAILURE(status) ||
140     + tz->trips.critical.temperature <= 2732) {
141     tz->trips.critical.flags.valid = 0;
142     ACPI_EXCEPTION((AE_INFO, status,
143     - "No critical threshold"));
144     + "No or invalid critical threshold"));
145     return -ENODEV;
146     } else {
147     tz->trips.critical.flags.valid = 1;
148     @@ -884,10 +891,15 @@ static void acpi_thermal_check(void *data)
149     static int thermal_get_temp(struct thermal_zone_device *thermal, char *buf)
150     {
151     struct acpi_thermal *tz = thermal->devdata;
152     + int result;
153    
154     if (!tz)
155     return -EINVAL;
156    
157     + result = acpi_thermal_get_temperature(tz);
158     + if (result)
159     + return result;
160     +
161     return sprintf(buf, "%ld\n", KELVIN_TO_MILLICELSIUS(tz->temperature));
162     }
163    
164     diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c
165     index 8dd3942..ce6fdec 100644
166     --- a/drivers/input/mouse/appletouch.c
167     +++ b/drivers/input/mouse/appletouch.c
168     @@ -589,6 +589,21 @@ static void atp_close(struct input_dev *input)
169     dev->open = 0;
170     }
171    
172     +static int atp_handle_geyser(struct atp *dev)
173     +{
174     + struct usb_device *udev = dev->udev;
175     +
176     + if (!atp_is_fountain(dev)) {
177     + /* switch to raw sensor mode */
178     + if (atp_geyser_init(udev))
179     + return -EIO;
180     +
181     + printk(KERN_INFO "appletouch: Geyser mode initialized.\n");
182     + }
183     +
184     + return 0;
185     +}
186     +
187     static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id)
188     {
189     struct atp *dev;
190     @@ -633,14 +648,6 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
191     else
192     dev->datalen = 81;
193    
194     - if (!atp_is_fountain(dev)) {
195     - /* switch to raw sensor mode */
196     - if (atp_geyser_init(udev))
197     - goto err_free_devs;
198     -
199     - printk(KERN_INFO "appletouch: Geyser mode initialized.\n");
200     - }
201     -
202     dev->urb = usb_alloc_urb(0, GFP_KERNEL);
203     if (!dev->urb)
204     goto err_free_devs;
205     @@ -654,6 +661,10 @@ static int atp_probe(struct usb_interface *iface, const struct usb_device_id *id
206     usb_rcvintpipe(udev, int_in_endpointAddr),
207     dev->data, dev->datalen, atp_complete, dev, 1);
208    
209     + error = atp_handle_geyser(dev);
210     + if (error)
211     + goto err_free_buffer;
212     +
213     usb_make_path(udev, dev->phys, sizeof(dev->phys));
214     strlcat(dev->phys, "/input0", sizeof(dev->phys));
215    
216     @@ -744,6 +755,20 @@ static void atp_disconnect(struct usb_interface *iface)
217     printk(KERN_INFO "input: appletouch disconnected\n");
218     }
219    
220     +static int atp_recover(struct atp *dev)
221     +{
222     + int error;
223     +
224     + error = atp_handle_geyser(dev);
225     + if (error)
226     + return error;
227     +
228     + if (dev->open && usb_submit_urb(dev->urb, GFP_ATOMIC))
229     + return -EIO;
230     +
231     + return 0;
232     +}
233     +
234     static int atp_suspend(struct usb_interface *iface, pm_message_t message)
235     {
236     struct atp *dev = usb_get_intfdata(iface);
237     @@ -764,12 +789,20 @@ static int atp_resume(struct usb_interface *iface)
238     return 0;
239     }
240    
241     +static int atp_reset_resume(struct usb_interface *iface)
242     +{
243     + struct atp *dev = usb_get_intfdata(iface);
244     +
245     + return atp_recover(dev);
246     +}
247     +
248     static struct usb_driver atp_driver = {
249     .name = "appletouch",
250     .probe = atp_probe,
251     .disconnect = atp_disconnect,
252     .suspend = atp_suspend,
253     .resume = atp_resume,
254     + .reset_resume = atp_reset_resume,
255     .id_table = atp_table,
256     };
257    
258     diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
259     index 60931ac..17a3568 100644
260     --- a/drivers/input/serio/i8042-x86ia64io.h
261     +++ b/drivers/input/serio/i8042-x86ia64io.h
262     @@ -63,7 +63,7 @@ static inline void i8042_write_command(int val)
263     outb(val, I8042_COMMAND_REG);
264     }
265    
266     -#if defined(__i386__) || defined(__x86_64__)
267     +#ifdef CONFIG_X86
268    
269     #include <linux/dmi.h>
270    
271     @@ -193,6 +193,20 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
272     },
273     },
274     {
275     + .ident = "Fujitsu-Siemens Amilo Pro 2030",
276     + .matches = {
277     + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
278     + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"),
279     + },
280     + },
281     + {
282     + .ident = "Fujitsu-Siemens Amilo Pro 2010",
283     + .matches = {
284     + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
285     + DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2010"),
286     + },
287     + },
288     + {
289     /*
290     * No data is coming from the touchscreen unless KBC
291     * is in legacy mode.
292     @@ -284,17 +298,36 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
293     DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
294     },
295     },
296     + {
297     + .ident = "Acer Aspire 1360",
298     + .matches = {
299     + DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
300     + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1360"),
301     + },
302     + },
303     { }
304     };
305    
306     -
307     -
308     +#ifdef CONFIG_PNP
309     +static struct dmi_system_id __initdata i8042_dmi_nopnp_table[] = {
310     + {
311     + .ident = "Intel MBO Desktop D845PESV",
312     + .matches = {
313     + DMI_MATCH(DMI_BOARD_NAME, "D845PESV"),
314     + DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
315     + },
316     + },
317     + {
318     + .ident = "Gericom Bellagio",
319     + .matches = {
320     + DMI_MATCH(DMI_SYS_VENDOR, "Gericom"),
321     + DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
322     + },
323     + },
324     + { }
325     +};
326     #endif
327    
328     -#ifdef CONFIG_X86
329     -
330     -#include <linux/dmi.h>
331     -
332     /*
333     * Some Wistron based laptops need us to explicitly enable the 'Dritek
334     * keyboard extension' to make their extra keys start generating scancodes.
335     @@ -342,7 +375,6 @@ static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = {
336    
337     #endif /* CONFIG_X86 */
338    
339     -
340     #ifdef CONFIG_PNP
341     #include <linux/pnp.h>
342    
343     @@ -452,6 +484,11 @@ static int __init i8042_pnp_init(void)
344     int pnp_data_busted = 0;
345     int err;
346    
347     +#ifdef CONFIG_X86
348     + if (dmi_check_system(i8042_dmi_nopnp_table))
349     + i8042_nopnp = 1;
350     +#endif
351     +
352     if (i8042_nopnp) {
353     printk(KERN_INFO "i8042: PNP detection disabled\n");
354     return 0;
355     @@ -577,15 +614,13 @@ static int __init i8042_platform_init(void)
356     i8042_reset = 1;
357     #endif
358    
359     -#if defined(__i386__) || defined(__x86_64__)
360     +#ifdef CONFIG_X86
361     if (dmi_check_system(i8042_dmi_noloop_table))
362     i8042_noloop = 1;
363    
364     if (dmi_check_system(i8042_dmi_nomux_table))
365     i8042_nomux = 1;
366     -#endif
367    
368     -#ifdef CONFIG_X86
369     if (dmi_check_system(i8042_dmi_dritek_table))
370     i8042_dritek = 1;
371     #endif /* CONFIG_X86 */
372     diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c
373     index 65a74cf..f3228ae 100644
374     --- a/drivers/input/serio/i8042.c
375     +++ b/drivers/input/serio/i8042.c
376     @@ -938,8 +938,12 @@ static int i8042_resume(struct platform_device *dev)
377     i8042_ctr |= I8042_CTR_AUXDIS | I8042_CTR_KBDDIS;
378     i8042_ctr &= ~(I8042_CTR_AUXINT | I8042_CTR_KBDINT);
379     if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
380     - printk(KERN_ERR "i8042: Can't write CTR to resume\n");
381     - return -EIO;
382     + printk(KERN_WARNING "i8042: Can't write CTR to resume, retrying...\n");
383     + msleep(50);
384     + if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) {
385     + printk(KERN_ERR "i8042: CTR write retry failed\n");
386     + return -EIO;
387     + }
388     }
389    
390     if (i8042_mux_present) {
391     diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
392     index c3ded21..28b52c8 100644
393     --- a/drivers/net/wireless/ath5k/base.c
394     +++ b/drivers/net/wireless/ath5k/base.c
395     @@ -2864,7 +2864,9 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
396    
397     switch(key->alg) {
398     case ALG_WEP:
399     - break;
400     + /* XXX: fix hardware encryption, its not working. For now
401     + * allow software encryption */
402     + /* break; */
403     case ALG_TKIP:
404     case ALG_CCMP:
405     return -EOPNOTSUPP;
406     diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
407     index e887aa4..8d55044 100644
408     --- a/drivers/pci/quirks.c
409     +++ b/drivers/pci/quirks.c
410     @@ -1675,6 +1675,7 @@ static void __init quirk_disable_all_msi(struct pci_dev *dev)
411     DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_disable_all_msi);
412     DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_disable_all_msi);
413     DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi);
414     +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3336, quirk_disable_all_msi);
415     DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi);
416    
417     /* Disable MSI on chipsets that are known to not support it */
418     diff --git a/drivers/ps3/ps3-lpm.c b/drivers/ps3/ps3-lpm.c
419     index 6c9592c..85edf94 100644
420     --- a/drivers/ps3/ps3-lpm.c
421     +++ b/drivers/ps3/ps3-lpm.c
422     @@ -22,6 +22,7 @@
423     #include <linux/module.h>
424     #include <linux/interrupt.h>
425     #include <linux/uaccess.h>
426     +#include <asm/time.h>
427     #include <asm/ps3.h>
428     #include <asm/lv1call.h>
429     #include <asm/cell-pmu.h>
430     diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c
431     index 9f04192..2d0ee60 100644
432     --- a/drivers/scsi/megaraid/megaraid_mbox.c
433     +++ b/drivers/scsi/megaraid/megaraid_mbox.c
434     @@ -3168,6 +3168,23 @@ megaraid_mbox_support_random_del(adapter_t *adapter)
435     uint8_t raw_mbox[sizeof(mbox_t)];
436     int rval;
437    
438     + /*
439     + * Newer firmware on Dell CERC expect a different
440     + * random deletion handling, so disable it.
441     + */
442     + if (adapter->pdev->vendor == PCI_VENDOR_ID_AMI &&
443     + adapter->pdev->device == PCI_DEVICE_ID_AMI_MEGARAID3 &&
444     + adapter->pdev->subsystem_vendor == PCI_VENDOR_ID_DELL &&
445     + adapter->pdev->subsystem_device == PCI_SUBSYS_ID_CERC_ATA100_4CH &&
446     + (adapter->fw_version[0] > '6' ||
447     + (adapter->fw_version[0] == '6' &&
448     + adapter->fw_version[2] > '6') ||
449     + (adapter->fw_version[0] == '6'
450     + && adapter->fw_version[2] == '6'
451     + && adapter->fw_version[3] > '1'))) {
452     + con_log(CL_DLEVEL1, ("megaraid: disable random deletion\n"));
453     + return 0;
454     + }
455    
456     mbox = (mbox_t *)raw_mbox;
457    
458     diff --git a/drivers/scsi/megaraid/megaraid_mbox.h b/drivers/scsi/megaraid/megaraid_mbox.h
459     index 626459d..c1d86d9 100644
460     --- a/drivers/scsi/megaraid/megaraid_mbox.h
461     +++ b/drivers/scsi/megaraid/megaraid_mbox.h
462     @@ -88,6 +88,7 @@
463     #define PCI_SUBSYS_ID_PERC3_QC 0x0471
464     #define PCI_SUBSYS_ID_PERC3_DC 0x0493
465     #define PCI_SUBSYS_ID_PERC3_SC 0x0475
466     +#define PCI_SUBSYS_ID_CERC_ATA100_4CH 0x0511
467    
468    
469     #define MBOX_MAX_SCSI_CMDS 128 // number of cmds reserved for kernel
470     diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
471     index dfc5418..c06d0ea 100644
472     --- a/drivers/usb/core/quirks.c
473     +++ b/drivers/usb/core/quirks.c
474     @@ -47,6 +47,9 @@ static const struct usb_device_id usb_quirk_list[] = {
475     /* Edirol SD-20 */
476     { USB_DEVICE(0x0582, 0x0027), .driver_info = USB_QUIRK_RESET_RESUME },
477    
478     + /* appletouch */
479     + { USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME },
480     +
481     /* M-Systems Flash Disk Pioneers */
482     { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
483    
484     diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
485     index 4e065e5..fe930d5 100644
486     --- a/drivers/usb/host/ehci-hub.c
487     +++ b/drivers/usb/host/ehci-hub.c
488     @@ -621,7 +621,7 @@ static int ehci_hub_control (
489     }
490     break;
491     case USB_PORT_FEAT_C_SUSPEND:
492     - /* we auto-clear this feature */
493     + clear_bit(wIndex, &ehci->port_c_suspend);
494     break;
495     case USB_PORT_FEAT_POWER:
496     if (HCS_PPC (ehci->hcs_params))
497     @@ -700,7 +700,7 @@ static int ehci_hub_control (
498     /* resume completed? */
499     else if (time_after_eq(jiffies,
500     ehci->reset_done[wIndex])) {
501     - status |= 1 << USB_PORT_FEAT_C_SUSPEND;
502     + set_bit(wIndex, &ehci->port_c_suspend);
503     ehci->reset_done[wIndex] = 0;
504    
505     /* stop resume signaling */
506     @@ -777,6 +777,8 @@ static int ehci_hub_control (
507     status |= 1 << USB_PORT_FEAT_RESET;
508     if (temp & PORT_POWER)
509     status |= 1 << USB_PORT_FEAT_POWER;
510     + if (test_bit(wIndex, &ehci->port_c_suspend))
511     + status |= 1 << USB_PORT_FEAT_C_SUSPEND;
512    
513     #ifndef EHCI_VERBOSE_DEBUG
514     if (status & ~0xffff) /* only if wPortChange is interesting */
515     diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
516     index 888e81e..4769ba2 100644
517     --- a/drivers/usb/host/ehci.h
518     +++ b/drivers/usb/host/ehci.h
519     @@ -97,6 +97,8 @@ struct ehci_hcd { /* one per controller */
520     dedicated to the companion controller */
521     unsigned long owned_ports; /* which ports are
522     owned by the companion during a bus suspend */
523     + unsigned long port_c_suspend; /* which ports have
524     + the change-suspend feature turned on */
525    
526     /* per-HC memory pools (could be per-bus, but ...) */
527     struct dma_pool *qh_pool; /* qh per active urb */
528     diff --git a/fs/fat/inode.c b/fs/fat/inode.c
529     index 53f3cf6..98f0e87 100644
530     --- a/fs/fat/inode.c
531     +++ b/fs/fat/inode.c
532     @@ -1208,7 +1208,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent,
533     */
534    
535     media = b->media;
536     - if (!FAT_VALID_MEDIA(media)) {
537     + if (!fat_valid_media(media)) {
538     if (!silent)
539     printk(KERN_ERR "FAT: invalid media value (0x%02x)\n",
540     media);
541     diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c
542     index a38c718..cd931ef 100644
543     --- a/fs/jbd/commit.c
544     +++ b/fs/jbd/commit.c
545     @@ -407,22 +407,6 @@ void journal_commit_transaction(journal_t *journal)
546     jbd_debug (3, "JBD: commit phase 2\n");
547    
548     /*
549     - * First, drop modified flag: all accesses to the buffers
550     - * will be tracked for a new trasaction only -bzzz
551     - */
552     - spin_lock(&journal->j_list_lock);
553     - if (commit_transaction->t_buffers) {
554     - new_jh = jh = commit_transaction->t_buffers->b_tnext;
555     - do {
556     - J_ASSERT_JH(new_jh, new_jh->b_modified == 1 ||
557     - new_jh->b_modified == 0);
558     - new_jh->b_modified = 0;
559     - new_jh = new_jh->b_tnext;
560     - } while (new_jh != jh);
561     - }
562     - spin_unlock(&journal->j_list_lock);
563     -
564     - /*
565     * Now start flushing things to disk, in the order they appear
566     * on the transaction lists. Data blocks go first.
567     */
568     @@ -488,6 +472,9 @@ void journal_commit_transaction(journal_t *journal)
569     */
570     commit_transaction->t_state = T_COMMIT;
571    
572     + J_ASSERT(commit_transaction->t_nr_buffers <=
573     + commit_transaction->t_outstanding_credits);
574     +
575     descriptor = NULL;
576     bufs = 0;
577     while (commit_transaction->t_buffers) {
578     diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c
579     index 2c9e8f5..7665e01 100644
580     --- a/fs/jbd/transaction.c
581     +++ b/fs/jbd/transaction.c
582     @@ -609,6 +609,12 @@ repeat:
583     goto done;
584    
585     /*
586     + * this is the first time this transaction is touching this buffer,
587     + * reset the modified flag
588     + */
589     + jh->b_modified = 0;
590     +
591     + /*
592     * If there is already a copy-out version of this buffer, then we don't
593     * need to make another one
594     */
595     @@ -820,9 +826,16 @@ int journal_get_create_access(handle_t *handle, struct buffer_head *bh)
596    
597     if (jh->b_transaction == NULL) {
598     jh->b_transaction = transaction;
599     +
600     + /* first access by this transaction */
601     + jh->b_modified = 0;
602     +
603     JBUFFER_TRACE(jh, "file as BJ_Reserved");
604     __journal_file_buffer(jh, transaction, BJ_Reserved);
605     } else if (jh->b_transaction == journal->j_committing_transaction) {
606     + /* first access by this transaction */
607     + jh->b_modified = 0;
608     +
609     JBUFFER_TRACE(jh, "set next transaction");
610     jh->b_next_transaction = transaction;
611     }
612     @@ -1222,6 +1235,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
613     struct journal_head *jh;
614     int drop_reserve = 0;
615     int err = 0;
616     + int was_modified = 0;
617    
618     BUFFER_TRACE(bh, "entry");
619    
620     @@ -1240,6 +1254,9 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
621     goto not_jbd;
622     }
623    
624     + /* keep track of wether or not this transaction modified us */
625     + was_modified = jh->b_modified;
626     +
627     /*
628     * The buffer's going from the transaction, we must drop
629     * all references -bzzz
630     @@ -1257,7 +1274,12 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
631    
632     JBUFFER_TRACE(jh, "belongs to current transaction: unfile");
633    
634     - drop_reserve = 1;
635     + /*
636     + * we only want to drop a reference if this transaction
637     + * modified the buffer
638     + */
639     + if (was_modified)
640     + drop_reserve = 1;
641    
642     /*
643     * We are no longer going to journal this buffer.
644     @@ -1297,7 +1319,13 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
645     if (jh->b_next_transaction) {
646     J_ASSERT(jh->b_next_transaction == transaction);
647     jh->b_next_transaction = NULL;
648     - drop_reserve = 1;
649     +
650     + /*
651     + * only drop a reference if this transaction modified
652     + * the buffer
653     + */
654     + if (was_modified)
655     + drop_reserve = 1;
656     }
657     }
658    
659     @@ -1620,12 +1648,42 @@ out:
660     return;
661     }
662    
663     +/*
664     + * journal_try_to_free_buffers() could race with journal_commit_transaction()
665     + * The latter might still hold the a count on buffers when inspecting
666     + * them on t_syncdata_list or t_locked_list.
667     + *
668     + * journal_try_to_free_buffers() will call this function to
669     + * wait for the current transaction to finish syncing data buffers, before
670     + * tryinf to free that buffer.
671     + *
672     + * Called with journal->j_state_lock held.
673     + */
674     +static void journal_wait_for_transaction_sync_data(journal_t *journal)
675     +{
676     + transaction_t *transaction = NULL;
677     + tid_t tid;
678     +
679     + spin_lock(&journal->j_state_lock);
680     + transaction = journal->j_committing_transaction;
681     +
682     + if (!transaction) {
683     + spin_unlock(&journal->j_state_lock);
684     + return;
685     + }
686     +
687     + tid = transaction->t_tid;
688     + spin_unlock(&journal->j_state_lock);
689     + log_wait_commit(journal, tid);
690     +}
691    
692     /**
693     * int journal_try_to_free_buffers() - try to free page buffers.
694     * @journal: journal for operation
695     * @page: to try and free
696     - * @unused_gfp_mask: unused
697     + * @gfp_mask: we use the mask to detect how hard should we try to release
698     + * buffers. If __GFP_WAIT and __GFP_FS is set, we wait for commit code to
699     + * release the buffers.
700     *
701     *
702     * For all the buffers on this page,
703     @@ -1654,9 +1712,11 @@ out:
704     * journal_try_to_free_buffer() is changing its state. But that
705     * cannot happen because we never reallocate freed data as metadata
706     * while the data is part of a transaction. Yes?
707     + *
708     + * Return 0 on failure, 1 on success
709     */
710     int journal_try_to_free_buffers(journal_t *journal,
711     - struct page *page, gfp_t unused_gfp_mask)
712     + struct page *page, gfp_t gfp_mask)
713     {
714     struct buffer_head *head;
715     struct buffer_head *bh;
716     @@ -1685,7 +1745,28 @@ int journal_try_to_free_buffers(journal_t *journal,
717     if (buffer_jbd(bh))
718     goto busy;
719     } while ((bh = bh->b_this_page) != head);
720     +
721     ret = try_to_free_buffers(page);
722     +
723     + /*
724     + * There are a number of places where journal_try_to_free_buffers()
725     + * could race with journal_commit_transaction(), the later still
726     + * holds the reference to the buffers to free while processing them.
727     + * try_to_free_buffers() failed to free those buffers. Some of the
728     + * caller of releasepage() request page buffers to be dropped, otherwise
729     + * treat the fail-to-free as errors (such as generic_file_direct_IO())
730     + *
731     + * So, if the caller of try_to_release_page() wants the synchronous
732     + * behaviour(i.e make sure buffers are dropped upon return),
733     + * let's wait for the current transaction to finish flush of
734     + * dirty data buffers, then try to free those buffers again,
735     + * with the journal locked.
736     + */
737     + if (ret == 0 && (gfp_mask & __GFP_WAIT) && (gfp_mask & __GFP_FS)) {
738     + journal_wait_for_transaction_sync_data(journal);
739     + ret = try_to_free_buffers(page);
740     + }
741     +
742     busy:
743     return ret;
744     }
745     @@ -2069,7 +2150,7 @@ void __journal_refile_buffer(struct journal_head *jh)
746     jh->b_transaction = jh->b_next_transaction;
747     jh->b_next_transaction = NULL;
748     __journal_file_buffer(jh, jh->b_transaction,
749     - was_dirty ? BJ_Metadata : BJ_Reserved);
750     + jh->b_modified ? BJ_Metadata : BJ_Reserved);
751     J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING);
752    
753     if (was_dirty)
754     diff --git a/fs/namei.c b/fs/namei.c
755     index 8cf9bb9..a6fdd95 100644
756     --- a/fs/namei.c
757     +++ b/fs/namei.c
758     @@ -514,7 +514,14 @@ static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, s
759     */
760     result = d_lookup(parent, name);
761     if (!result) {
762     - struct dentry * dentry = d_alloc(parent, name);
763     + struct dentry *dentry;
764     +
765     + /* Don't create child dentry for a dead directory. */
766     + result = ERR_PTR(-ENOENT);
767     + if (IS_DEADDIR(dir))
768     + goto out_unlock;
769     +
770     + dentry = d_alloc(parent, name);
771     result = ERR_PTR(-ENOMEM);
772     if (dentry) {
773     result = dir->i_op->lookup(dir, dentry, nd);
774     @@ -523,6 +530,7 @@ static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, s
775     else
776     result = dentry;
777     }
778     +out_unlock:
779     mutex_unlock(&dir->i_mutex);
780     return result;
781     }
782     @@ -1313,7 +1321,14 @@ static struct dentry *__lookup_hash(struct qstr *name,
783    
784     dentry = cached_lookup(base, name, nd);
785     if (!dentry) {
786     - struct dentry *new = d_alloc(base, name);
787     + struct dentry *new;
788     +
789     + /* Don't create child dentry for a dead directory. */
790     + dentry = ERR_PTR(-ENOENT);
791     + if (IS_DEADDIR(inode))
792     + goto out;
793     +
794     + new = d_alloc(base, name);
795     dentry = ERR_PTR(-ENOMEM);
796     if (!new)
797     goto out;
798     @@ -1904,18 +1919,22 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir)
799     if (IS_ERR(dentry))
800     goto fail;
801    
802     + if (dentry->d_inode)
803     + goto eexist;
804     /*
805     * Special case - lookup gave negative, but... we had foo/bar/
806     * From the vfs_mknod() POV we just have a negative dentry -
807     * all is fine. Let's be bastards - you had / on the end, you've
808     * been asking for (non-existent) directory. -ENOENT for you.
809     */
810     - if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
811     - goto enoent;
812     + if (unlikely(!is_dir && nd->last.name[nd->last.len])) {
813     + dput(dentry);
814     + dentry = ERR_PTR(-ENOENT);
815     + }
816     return dentry;
817     -enoent:
818     +eexist:
819     dput(dentry);
820     - dentry = ERR_PTR(-ENOENT);
821     + dentry = ERR_PTR(-EEXIST);
822     fail:
823     return dentry;
824     }
825     diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
826     index 6f88d7c..f83fb73 100644
827     --- a/fs/nfs/inode.c
828     +++ b/fs/nfs/inode.c
829     @@ -57,8 +57,6 @@ static int enable_ino64 = NFS_64_BIT_INODE_NUMBERS_ENABLED;
830     static void nfs_invalidate_inode(struct inode *);
831     static int nfs_update_inode(struct inode *, struct nfs_fattr *);
832    
833     -static void nfs_zap_acl_cache(struct inode *);
834     -
835     static struct kmem_cache * nfs_inode_cachep;
836    
837     static inline unsigned long
838     @@ -167,7 +165,7 @@ void nfs_zap_mapping(struct inode *inode, struct address_space *mapping)
839     }
840     }
841    
842     -static void nfs_zap_acl_cache(struct inode *inode)
843     +void nfs_zap_acl_cache(struct inode *inode)
844     {
845     void (*clear_acl_cache)(struct inode *);
846    
847     diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
848     index 9319927..4c62be1 100644
849     --- a/fs/nfs/internal.h
850     +++ b/fs/nfs/internal.h
851     @@ -153,6 +153,7 @@ extern void nfs_clear_inode(struct inode *);
852     #ifdef CONFIG_NFS_V4
853     extern void nfs4_clear_inode(struct inode *);
854     #endif
855     +void nfs_zap_acl_cache(struct inode *inode);
856    
857     /* super.c */
858     extern struct file_system_type nfs_xdev_fs_type;
859     diff --git a/fs/nfs/nfs3acl.c b/fs/nfs/nfs3acl.c
860     index 9b73625..423842f 100644
861     --- a/fs/nfs/nfs3acl.c
862     +++ b/fs/nfs/nfs3acl.c
863     @@ -5,6 +5,8 @@
864     #include <linux/posix_acl_xattr.h>
865     #include <linux/nfsacl.h>
866    
867     +#include "internal.h"
868     +
869     #define NFSDBG_FACILITY NFSDBG_PROC
870    
871     ssize_t nfs3_listxattr(struct dentry *dentry, char *buffer, size_t size)
872     @@ -205,6 +207,8 @@ struct posix_acl *nfs3_proc_getacl(struct inode *inode, int type)
873     status = nfs_revalidate_inode(server, inode);
874     if (status < 0)
875     return ERR_PTR(status);
876     + if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL)
877     + nfs_zap_acl_cache(inode);
878     acl = nfs3_get_cached_acl(inode, type);
879     if (acl != ERR_PTR(-EAGAIN))
880     return acl;
881     @@ -319,9 +323,8 @@ static int nfs3_proc_setacls(struct inode *inode, struct posix_acl *acl,
882     dprintk("NFS call setacl\n");
883     msg.rpc_proc = &server->client_acl->cl_procinfo[ACLPROC3_SETACL];
884     status = rpc_call_sync(server->client_acl, &msg, 0);
885     - spin_lock(&inode->i_lock);
886     - NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ACCESS;
887     - spin_unlock(&inode->i_lock);
888     + nfs_access_zap_cache(inode);
889     + nfs_zap_acl_cache(inode);
890     dprintk("NFS reply setacl: %d\n", status);
891    
892     /* pages may have been allocated at the xdr layer. */
893     diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
894     index 7ce0786..3a2ff77 100644
895     --- a/fs/nfs/nfs4proc.c
896     +++ b/fs/nfs/nfs4proc.c
897     @@ -52,6 +52,7 @@
898     #include "nfs4_fs.h"
899     #include "delegation.h"
900     #include "iostat.h"
901     +#include "internal.h"
902    
903     #define NFSDBG_FACILITY NFSDBG_PROC
904    
905     @@ -2707,6 +2708,8 @@ static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen)
906     ret = nfs_revalidate_inode(server, inode);
907     if (ret < 0)
908     return ret;
909     + if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL)
910     + nfs_zap_acl_cache(inode);
911     ret = nfs4_read_cached_acl(inode, buf, buflen);
912     if (ret != -ENOENT)
913     return ret;
914     @@ -2734,7 +2737,8 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl
915     nfs_inode_return_delegation(inode);
916     buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase);
917     ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
918     - nfs_zap_caches(inode);
919     + nfs_access_zap_cache(inode);
920     + nfs_zap_acl_cache(inode);
921     return ret;
922     }
923    
924     diff --git a/fs/partitions/msdos.c b/fs/partitions/msdos.c
925     index 5567ec0..7965118 100644
926     --- a/fs/partitions/msdos.c
927     +++ b/fs/partitions/msdos.c
928     @@ -18,7 +18,7 @@
929     *
930     * Re-organised Feb 1998 Russell King
931     */
932     -
933     +#include <linux/msdos_fs.h>
934    
935     #include "check.h"
936     #include "msdos.h"
937     @@ -419,6 +419,7 @@ int msdos_partition(struct parsed_partitions *state, struct block_device *bdev)
938     Sector sect;
939     unsigned char *data;
940     struct partition *p;
941     + struct fat_boot_sector *fb;
942     int slot;
943    
944     data = read_dev_sector(bdev, 0, &sect);
945     @@ -444,8 +445,21 @@ int msdos_partition(struct parsed_partitions *state, struct block_device *bdev)
946     p = (struct partition *) (data + 0x1be);
947     for (slot = 1; slot <= 4; slot++, p++) {
948     if (p->boot_ind != 0 && p->boot_ind != 0x80) {
949     - put_dev_sector(sect);
950     - return 0;
951     + /*
952     + * Even without a valid boot inidicator value
953     + * its still possible this is valid FAT filesystem
954     + * without a partition table.
955     + */
956     + fb = (struct fat_boot_sector *) data;
957     + if (slot == 1 && fb->reserved && fb->fats
958     + && fat_valid_media(fb->media)) {
959     + printk("\n");
960     + put_dev_sector(sect);
961     + return 1;
962     + } else {
963     + put_dev_sector(sect);
964     + return 0;
965     + }
966     }
967     }
968    
969     diff --git a/fs/romfs/inode.c b/fs/romfs/inode.c
970     index 3f13d49..35e5c6e 100644
971     --- a/fs/romfs/inode.c
972     +++ b/fs/romfs/inode.c
973     @@ -418,7 +418,8 @@ static int
974     romfs_readpage(struct file *file, struct page * page)
975     {
976     struct inode *inode = page->mapping->host;
977     - loff_t offset, avail, readlen;
978     + loff_t offset, size;
979     + unsigned long filled;
980     void *buf;
981     int result = -EIO;
982    
983     @@ -430,21 +431,29 @@ romfs_readpage(struct file *file, struct page * page)
984    
985     /* 32 bit warning -- but not for us :) */
986     offset = page_offset(page);
987     - if (offset < i_size_read(inode)) {
988     - avail = inode->i_size-offset;
989     - readlen = min_t(unsigned long, avail, PAGE_SIZE);
990     - if (romfs_copyfrom(inode, buf, ROMFS_I(inode)->i_dataoffset+offset, readlen) == readlen) {
991     - if (readlen < PAGE_SIZE) {
992     - memset(buf + readlen,0,PAGE_SIZE-readlen);
993     - }
994     - SetPageUptodate(page);
995     - result = 0;
996     + size = i_size_read(inode);
997     + filled = 0;
998     + result = 0;
999     + if (offset < size) {
1000     + unsigned long readlen;
1001     +
1002     + size -= offset;
1003     + readlen = size > PAGE_SIZE ? PAGE_SIZE : size;
1004     +
1005     + filled = romfs_copyfrom(inode, buf, ROMFS_I(inode)->i_dataoffset+offset, readlen);
1006     +
1007     + if (filled != readlen) {
1008     + SetPageError(page);
1009     + filled = 0;
1010     + result = -EIO;
1011     }
1012     }
1013     - if (result) {
1014     - memset(buf, 0, PAGE_SIZE);
1015     - SetPageError(page);
1016     - }
1017     +
1018     + if (filled < PAGE_SIZE)
1019     + memset(buf + filled, 0, PAGE_SIZE-filled);
1020     +
1021     + if (!result)
1022     + SetPageUptodate(page);
1023     flush_dcache_page(page);
1024    
1025     unlock_page(page);
1026     diff --git a/include/linux/msdos_fs.h b/include/linux/msdos_fs.h
1027     index f950921..20277ad 100644
1028     --- a/include/linux/msdos_fs.h
1029     +++ b/include/linux/msdos_fs.h
1030     @@ -58,7 +58,11 @@
1031     #define MSDOS_DOTDOT ".. " /* "..", padded to MSDOS_NAME chars */
1032    
1033     /* media of boot sector */
1034     -#define FAT_VALID_MEDIA(x) ((0xF8 <= (x) && (x) <= 0xFF) || (x) == 0xF0)
1035     +static inline int fat_valid_media(u8 media)
1036     +{
1037     + return 0xf8 <= media || media == 0xf0;
1038     +}
1039     +
1040     #define FAT_FIRST_ENT(s, x) ((MSDOS_SB(s)->fat_bits == 32 ? 0x0FFFFF00 : \
1041     MSDOS_SB(s)->fat_bits == 16 ? 0xFF00 : 0xF00) | (x))
1042    
1043     diff --git a/include/sound/ac97_codec.h b/include/sound/ac97_codec.h
1044     index 0148058..771e4b3 100644
1045     --- a/include/sound/ac97_codec.h
1046     +++ b/include/sound/ac97_codec.h
1047     @@ -504,6 +504,7 @@ struct snd_ac97 {
1048     unsigned short pcmreg[3]; // PCM registers
1049     unsigned short codec_cfg[3]; // CODEC_CFG bits
1050     unsigned char swap_mic_linein; // AD1986/AD1986A only
1051     + unsigned char lo_as_master; /* LO as master */
1052     } ad18xx;
1053     unsigned int dev_flags; /* device specific */
1054     } spec;
1055     diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
1056     index 7b7b9b1..10ee28e 100644
1057     --- a/include/sound/emu10k1.h
1058     +++ b/include/sound/emu10k1.h
1059     @@ -1670,6 +1670,7 @@ struct snd_emu_chip_details {
1060     unsigned char spi_dac; /* SPI interface for DAC */
1061     unsigned char i2c_adc; /* I2C interface for ADC */
1062     unsigned char adc_1361t; /* Use Philips 1361T ADC */
1063     + unsigned char invert_shared_spdif; /* analog/digital switch inverted */
1064     const char *driver;
1065     const char *name;
1066     const char *id; /* for backward compatibility - can be NULL if not needed */
1067     diff --git a/mm/filemap.c b/mm/filemap.c
1068     index 703f2c8..d721ad5 100644
1069     --- a/mm/filemap.c
1070     +++ b/mm/filemap.c
1071     @@ -2574,9 +2574,8 @@ out:
1072     * Otherwise return zero.
1073     *
1074     * The @gfp_mask argument specifies whether I/O may be performed to release
1075     - * this page (__GFP_IO), and whether the call may block (__GFP_WAIT).
1076     + * this page (__GFP_IO), and whether the call may block (__GFP_WAIT & __GFP_FS).
1077     *
1078     - * NOTE: @gfp_mask may go away, and this function may become non-blocking.
1079     */
1080     int try_to_release_page(struct page *page, gfp_t gfp_mask)
1081     {
1082     diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c
1083     index 347e935..2f0ffc3 100644
1084     --- a/net/bluetooth/bnep/core.c
1085     +++ b/net/bluetooth/bnep/core.c
1086     @@ -507,6 +507,11 @@ static int bnep_session(void *arg)
1087     /* Delete network device */
1088     unregister_netdev(dev);
1089    
1090     + /* Wakeup user-space polling for socket errors */
1091     + s->sock->sk->sk_err = EUNATCH;
1092     +
1093     + wake_up_interruptible(s->sock->sk->sk_sleep);
1094     +
1095     /* Release the socket */
1096     fput(s->sock->file);
1097    
1098     diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
1099     index 519cdb9..96434d7 100644
1100     --- a/net/bluetooth/hidp/core.c
1101     +++ b/net/bluetooth/hidp/core.c
1102     @@ -581,6 +581,12 @@ static int hidp_session(void *arg)
1103     hid_free_device(session->hid);
1104     }
1105    
1106     + /* Wakeup user-space polling for socket errors */
1107     + session->intr_sock->sk->sk_err = EUNATCH;
1108     + session->ctrl_sock->sk->sk_err = EUNATCH;
1109     +
1110     + hidp_schedule(session);
1111     +
1112     fput(session->intr_sock->file);
1113    
1114     wait_event_timeout(*(ctrl_sk->sk_sleep),
1115     @@ -879,6 +885,10 @@ int hidp_del_connection(struct hidp_conndel_req *req)
1116     skb_queue_purge(&session->ctrl_transmit);
1117     skb_queue_purge(&session->intr_transmit);
1118    
1119     + /* Wakeup user-space polling for socket errors */
1120     + session->intr_sock->sk->sk_err = EUNATCH;
1121     + session->ctrl_sock->sk->sk_err = EUNATCH;
1122     +
1123     /* Kill session thread */
1124     atomic_inc(&session->terminate);
1125     hidp_schedule(session);
1126     diff --git a/sound/core/init.c b/sound/core/init.c
1127     index e3338d6..6200f42 100644
1128     --- a/sound/core/init.c
1129     +++ b/sound/core/init.c
1130     @@ -311,6 +311,9 @@ int snd_card_disconnect(struct snd_card *card)
1131     struct file *file;
1132     int err;
1133    
1134     + if (!card)
1135     + return -EINVAL;
1136     +
1137     spin_lock(&card->files_lock);
1138     if (card->shutdown) {
1139     spin_unlock(&card->files_lock);
1140     @@ -322,6 +325,7 @@ int snd_card_disconnect(struct snd_card *card)
1141     /* phase 1: disable fops (user space) operations for ALSA API */
1142     mutex_lock(&snd_card_mutex);
1143     snd_cards[card->number] = NULL;
1144     + snd_cards_lock &= ~(1 << card->number);
1145     mutex_unlock(&snd_card_mutex);
1146    
1147     /* phase 2: replace file->f_op with special dummy operations */
1148     @@ -360,6 +364,15 @@ int snd_card_disconnect(struct snd_card *card)
1149     snd_printk(KERN_ERR "not all devices for card %i can be disconnected\n", card->number);
1150    
1151     snd_info_card_disconnect(card);
1152     +#ifndef CONFIG_SYSFS_DEPRECATED
1153     + if (card->card_dev) {
1154     + device_unregister(card->card_dev);
1155     + card->card_dev = NULL;
1156     + }
1157     +#endif
1158     +#ifdef CONFIG_PM
1159     + wake_up(&card->power_sleep);
1160     +#endif
1161     return 0;
1162     }
1163    
1164     @@ -401,33 +414,14 @@ static int snd_card_do_free(struct snd_card *card)
1165     snd_printk(KERN_WARNING "unable to free card info\n");
1166     /* Not fatal error */
1167     }
1168     -#ifndef CONFIG_SYSFS_DEPRECATED
1169     - if (card->card_dev)
1170     - device_unregister(card->card_dev);
1171     -#endif
1172     kfree(card);
1173     return 0;
1174     }
1175    
1176     -static int snd_card_free_prepare(struct snd_card *card)
1177     -{
1178     - if (card == NULL)
1179     - return -EINVAL;
1180     - (void) snd_card_disconnect(card);
1181     - mutex_lock(&snd_card_mutex);
1182     - snd_cards[card->number] = NULL;
1183     - snd_cards_lock &= ~(1 << card->number);
1184     - mutex_unlock(&snd_card_mutex);
1185     -#ifdef CONFIG_PM
1186     - wake_up(&card->power_sleep);
1187     -#endif
1188     - return 0;
1189     -}
1190     -
1191     int snd_card_free_when_closed(struct snd_card *card)
1192     {
1193     int free_now = 0;
1194     - int ret = snd_card_free_prepare(card);
1195     + int ret = snd_card_disconnect(card);
1196     if (ret)
1197     return ret;
1198    
1199     @@ -447,7 +441,7 @@ EXPORT_SYMBOL(snd_card_free_when_closed);
1200    
1201     int snd_card_free(struct snd_card *card)
1202     {
1203     - int ret = snd_card_free_prepare(card);
1204     + int ret = snd_card_disconnect(card);
1205     if (ret)
1206     return ret;
1207    
1208     diff --git a/sound/core/oss/mixer_oss.c b/sound/core/oss/mixer_oss.c
1209     index 75daed2..581aa2c 100644
1210     --- a/sound/core/oss/mixer_oss.c
1211     +++ b/sound/core/oss/mixer_oss.c
1212     @@ -1257,6 +1257,8 @@ static void snd_mixer_oss_build(struct snd_mixer_oss *mixer)
1213     { SOUND_MIXER_DIGITAL3, "Digital", 2 },
1214     { SOUND_MIXER_PHONEIN, "Phone", 0 },
1215     { SOUND_MIXER_PHONEOUT, "Master Mono", 0 },
1216     + { SOUND_MIXER_PHONEOUT, "Speaker", 0 }, /*fallback*/
1217     + { SOUND_MIXER_PHONEOUT, "Mono", 0 }, /*fallback*/
1218     { SOUND_MIXER_PHONEOUT, "Phone", 0 }, /* fallback */
1219     { SOUND_MIXER_VIDEO, "Video", 0 },
1220     { SOUND_MIXER_RADIO, "Radio", 0 },
1221     diff --git a/sound/core/seq/oss/seq_oss_synth.c b/sound/core/seq/oss/seq_oss_synth.c
1222     index ab570a0..2490259 100644
1223     --- a/sound/core/seq/oss/seq_oss_synth.c
1224     +++ b/sound/core/seq/oss/seq_oss_synth.c
1225     @@ -599,6 +599,9 @@ snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_in
1226     {
1227     struct seq_oss_synth *rec;
1228    
1229     + if (dev < 0 || dev >= dp->max_synthdev)
1230     + return -ENXIO;
1231     +
1232     if (dp->synths[dev].is_midi) {
1233     struct midi_info minf;
1234     snd_seq_oss_midi_make_info(dp, dp->synths[dev].midi_mapped, &minf);
1235     diff --git a/sound/pci/ac97/ac97_patch.c b/sound/pci/ac97/ac97_patch.c
1236     index 50c637e..3d70241 100644
1237     --- a/sound/pci/ac97/ac97_patch.c
1238     +++ b/sound/pci/ac97/ac97_patch.c
1239     @@ -1960,6 +1960,9 @@ static int snd_ac97_ad1888_lohpsel_get(struct snd_kcontrol *kcontrol, struct snd
1240    
1241     val = ac97->regs[AC97_AD_MISC];
1242     ucontrol->value.integer.value[0] = !(val & AC97_AD198X_LOSEL);
1243     + if (ac97->spec.ad18xx.lo_as_master)
1244     + ucontrol->value.integer.value[0] =
1245     + !ucontrol->value.integer.value[0];
1246     return 0;
1247     }
1248    
1249     @@ -1968,8 +1971,10 @@ static int snd_ac97_ad1888_lohpsel_put(struct snd_kcontrol *kcontrol, struct snd
1250     struct snd_ac97 *ac97 = snd_kcontrol_chip(kcontrol);
1251     unsigned short val;
1252    
1253     - val = !ucontrol->value.integer.value[0]
1254     - ? (AC97_AD198X_LOSEL | AC97_AD198X_HPSEL) : 0;
1255     + val = !ucontrol->value.integer.value[0];
1256     + if (ac97->spec.ad18xx.lo_as_master)
1257     + val = !val;
1258     + val = val ? (AC97_AD198X_LOSEL | AC97_AD198X_HPSEL) : 0;
1259     return snd_ac97_update_bits(ac97, AC97_AD_MISC,
1260     AC97_AD198X_LOSEL | AC97_AD198X_HPSEL, val);
1261     }
1262     @@ -2020,7 +2025,7 @@ static void ad1888_update_jacks(struct snd_ac97 *ac97)
1263     {
1264     unsigned short val = 0;
1265     /* clear LODIS if shared jack is to be used for Surround out */
1266     - if (is_shared_linein(ac97))
1267     + if (!ac97->spec.ad18xx.lo_as_master && is_shared_linein(ac97))
1268     val |= (1 << 12);
1269     /* clear CLDIS if shared jack is to be used for C/LFE out */
1270     if (is_shared_micin(ac97))
1271     @@ -2056,9 +2061,13 @@ static const struct snd_kcontrol_new snd_ac97_ad1888_controls[] = {
1272    
1273     static int patch_ad1888_specific(struct snd_ac97 *ac97)
1274     {
1275     - /* rename 0x04 as "Master" and 0x02 as "Master Surround" */
1276     - snd_ac97_rename_vol_ctl(ac97, "Master Playback", "Master Surround Playback");
1277     - snd_ac97_rename_vol_ctl(ac97, "Headphone Playback", "Master Playback");
1278     + if (!ac97->spec.ad18xx.lo_as_master) {
1279     + /* rename 0x04 as "Master" and 0x02 as "Master Surround" */
1280     + snd_ac97_rename_vol_ctl(ac97, "Master Playback",
1281     + "Master Surround Playback");
1282     + snd_ac97_rename_vol_ctl(ac97, "Headphone Playback",
1283     + "Master Playback");
1284     + }
1285     return patch_build_controls(ac97, snd_ac97_ad1888_controls, ARRAY_SIZE(snd_ac97_ad1888_controls));
1286     }
1287    
1288     @@ -2077,16 +2086,27 @@ static int patch_ad1888(struct snd_ac97 * ac97)
1289    
1290     patch_ad1881(ac97);
1291     ac97->build_ops = &patch_ad1888_build_ops;
1292     - /* Switch FRONT/SURROUND LINE-OUT/HP-OUT default connection */
1293     - /* it seems that most vendors connect line-out connector to headphone out of AC'97 */
1294     +
1295     + /*
1296     + * LO can be used as a real line-out on some devices,
1297     + * and we need to revert the front/surround mixer switches
1298     + */
1299     + if (ac97->subsystem_vendor == 0x1043 &&
1300     + ac97->subsystem_device == 0x1193) /* ASUS A9T laptop */
1301     + ac97->spec.ad18xx.lo_as_master = 1;
1302     +
1303     + misc = snd_ac97_read(ac97, AC97_AD_MISC);
1304     /* AD-compatible mode */
1305     /* Stereo mutes enabled */
1306     - misc = snd_ac97_read(ac97, AC97_AD_MISC);
1307     - snd_ac97_write_cache(ac97, AC97_AD_MISC, misc |
1308     - AC97_AD198X_LOSEL |
1309     - AC97_AD198X_HPSEL |
1310     - AC97_AD198X_MSPLT |
1311     - AC97_AD198X_AC97NC);
1312     + misc |= AC97_AD198X_MSPLT | AC97_AD198X_AC97NC;
1313     + if (!ac97->spec.ad18xx.lo_as_master)
1314     + /* Switch FRONT/SURROUND LINE-OUT/HP-OUT default connection */
1315     + /* it seems that most vendors connect line-out connector to
1316     + * headphone out of AC'97
1317     + */
1318     + misc |= AC97_AD198X_LOSEL | AC97_AD198X_HPSEL;
1319     +
1320     + snd_ac97_write_cache(ac97, AC97_AD_MISC, misc);
1321     ac97->flags |= AC97_STEREO_MUTES;
1322     return 0;
1323     }
1324     diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
1325     index d0330d8..df278ba 100644
1326     --- a/sound/pci/emu10k1/emu10k1_main.c
1327     +++ b/sound/pci/emu10k1/emu10k1_main.c
1328     @@ -1527,6 +1527,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
1329     .ca0151_chip = 1,
1330     .spk71 = 1,
1331     .spdif_bug = 1,
1332     + .invert_shared_spdif = 1, /* digital/analog switch swapped */
1333     .adc_1361t = 1, /* 24 bit capture instead of 16bit. Fixes ALSA bug#324 */
1334     .ac97_chip = 1} ,
1335     {.vendor = 0x1102, .device = 0x0004, .revision = 0x04,
1336     diff --git a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c
1337     index fd22120..9f77692 100644
1338     --- a/sound/pci/emu10k1/emumixer.c
1339     +++ b/sound/pci/emu10k1/emumixer.c
1340     @@ -1578,6 +1578,10 @@ static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol,
1341     ucontrol->value.integer.value[0] = inl(emu->port + A_IOCFG) & A_IOCFG_GPOUT0 ? 1 : 0;
1342     else
1343     ucontrol->value.integer.value[0] = inl(emu->port + HCFG) & HCFG_GPOUT0 ? 1 : 0;
1344     + if (emu->card_capabilities->invert_shared_spdif)
1345     + ucontrol->value.integer.value[0] =
1346     + !ucontrol->value.integer.value[0];
1347     +
1348     return 0;
1349     }
1350    
1351     @@ -1586,15 +1590,18 @@ static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
1352     {
1353     unsigned long flags;
1354     struct snd_emu10k1 *emu = snd_kcontrol_chip(kcontrol);
1355     - unsigned int reg, val;
1356     + unsigned int reg, val, sw;
1357     int change = 0;
1358    
1359     + sw = ucontrol->value.integer.value[0];
1360     + if (emu->card_capabilities->invert_shared_spdif)
1361     + sw = !sw;
1362     spin_lock_irqsave(&emu->reg_lock, flags);
1363     if ( emu->card_capabilities->i2c_adc) {
1364     /* Do nothing for Audigy 2 ZS Notebook */
1365     } else if (emu->audigy) {
1366     reg = inl(emu->port + A_IOCFG);
1367     - val = ucontrol->value.integer.value[0] ? A_IOCFG_GPOUT0 : 0;
1368     + val = sw ? A_IOCFG_GPOUT0 : 0;
1369     change = (reg & A_IOCFG_GPOUT0) != val;
1370     if (change) {
1371     reg &= ~A_IOCFG_GPOUT0;
1372     @@ -1603,7 +1610,7 @@ static int snd_emu10k1_shared_spdif_put(struct snd_kcontrol *kcontrol,
1373     }
1374     }
1375     reg = inl(emu->port + HCFG);
1376     - val = ucontrol->value.integer.value[0] ? HCFG_GPOUT0 : 0;
1377     + val = sw ? HCFG_GPOUT0 : 0;
1378     change |= (reg & HCFG_GPOUT0) != val;
1379     if (change) {
1380     reg &= ~HCFG_GPOUT0;
1381     diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
1382     index c864928..d7cba53 100644
1383     --- a/sound/pci/hda/patch_analog.c
1384     +++ b/sound/pci/hda/patch_analog.c
1385     @@ -1563,6 +1563,7 @@ static const char *ad1981_models[AD1981_MODELS] = {
1386    
1387     static struct snd_pci_quirk ad1981_cfg_tbl[] = {
1388     SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD),
1389     + SND_PCI_QUIRK(0x1014, 0x05b7, "Lenovo Z60m", AD1981_THINKPAD),
1390     /* All HP models */
1391     SND_PCI_QUIRK(0x103c, 0, "HP nx", AD1981_HP),
1392     SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba U205", AD1981_TOSHIBA),
1393     @@ -2557,7 +2558,7 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
1394     {
1395     struct ad198x_spec *spec = codec->spec;
1396     hda_nid_t nid;
1397     - int idx, err;
1398     + int i, idx, err;
1399     char name[32];
1400    
1401     if (! pin)
1402     @@ -2565,16 +2566,26 @@ static int ad1988_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
1403    
1404     idx = ad1988_pin_idx(pin);
1405     nid = ad1988_idx_to_dac(codec, idx);
1406     - /* specify the DAC as the extra output */
1407     - if (! spec->multiout.hp_nid)
1408     - spec->multiout.hp_nid = nid;
1409     - else
1410     - spec->multiout.extra_out_nid[0] = nid;
1411     - /* control HP volume/switch on the output mixer amp */
1412     - sprintf(name, "%s Playback Volume", pfx);
1413     - if ((err = add_control(spec, AD_CTL_WIDGET_VOL, name,
1414     - HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT))) < 0)
1415     - return err;
1416     + /* check whether the corresponding DAC was already taken */
1417     + for (i = 0; i < spec->autocfg.line_outs; i++) {
1418     + hda_nid_t pin = spec->autocfg.line_out_pins[i];
1419     + hda_nid_t dac = ad1988_idx_to_dac(codec, ad1988_pin_idx(pin));
1420     + if (dac == nid)
1421     + break;
1422     + }
1423     + if (i >= spec->autocfg.line_outs) {
1424     + /* specify the DAC as the extra output */
1425     + if (!spec->multiout.hp_nid)
1426     + spec->multiout.hp_nid = nid;
1427     + else
1428     + spec->multiout.extra_out_nid[0] = nid;
1429     + /* control HP volume/switch on the output mixer amp */
1430     + sprintf(name, "%s Playback Volume", pfx);
1431     + err = add_control(spec, AD_CTL_WIDGET_VOL, name,
1432     + HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
1433     + if (err < 0)
1434     + return err;
1435     + }
1436     nid = ad1988_mixer_nids[idx];
1437     sprintf(name, "%s Playback Switch", pfx);
1438     if ((err = add_control(spec, AD_CTL_BIND_MUTE, name,
1439     diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
1440     index f48838a..d0bc988 100644
1441     --- a/sound/usb/usbaudio.c
1442     +++ b/sound/usb/usbaudio.c
1443     @@ -1762,8 +1762,10 @@ static int check_hw_params_convention(struct snd_usb_substream *subs)
1444    
1445     channels = kcalloc(MAX_MASK, sizeof(u32), GFP_KERNEL);
1446     rates = kcalloc(MAX_MASK, sizeof(u32), GFP_KERNEL);
1447     - if (!channels || !rates)
1448     + if (!channels || !rates) {
1449     + err = -ENOMEM;
1450     goto __out;
1451     + }
1452    
1453     list_for_each(p, &subs->fmt_list) {
1454     struct audioformat *f;
1455     @@ -1916,7 +1918,10 @@ static int setup_hw_info(struct snd_pcm_runtime *runtime, struct snd_usb_substre
1456     1000 * MIN_PACKS_URB,
1457     /*(nrpacks * MAX_URBS) * 1000*/ UINT_MAX);
1458    
1459     - if (check_hw_params_convention(subs)) {
1460     + err = check_hw_params_convention(subs);
1461     + if (err < 0)
1462     + return err;
1463     + else if (err) {
1464     hwc_debug("setting extra hw constraints...\n");
1465     if ((err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
1466     hw_rule_rate, subs,
1467     @@ -2463,11 +2468,12 @@ static int parse_audio_format_i_type(struct snd_usb_audio *chip, struct audiofor
1468     }
1469     break;
1470     case USB_AUDIO_FORMAT_PCM8:
1471     - /* Dallas DS4201 workaround */
1472     + pcm_format = SNDRV_PCM_FORMAT_U8;
1473     +
1474     + /* Dallas DS4201 workaround: it advertises U8 format, but really
1475     + supports S8. */
1476     if (chip->usb_id == USB_ID(0x04fa, 0x4201))
1477     pcm_format = SNDRV_PCM_FORMAT_S8;
1478     - else
1479     - pcm_format = SNDRV_PCM_FORMAT_U8;
1480     break;
1481     case USB_AUDIO_FORMAT_IEEE_FLOAT:
1482     pcm_format = SNDRV_PCM_FORMAT_FLOAT_LE;
1483     @@ -2671,12 +2677,23 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
1484     int format;
1485     struct audioformat *fp;
1486     unsigned char *fmt, *csep;
1487     + int num;
1488    
1489     dev = chip->dev;
1490    
1491     /* parse the interface's altsettings */
1492     iface = usb_ifnum_to_if(dev, iface_no);
1493     - for (i = 0; i < iface->num_altsetting; i++) {
1494     +
1495     + num = iface->num_altsetting;
1496     +
1497     + /*
1498     + * Dallas DS4201 workaround: It presents 5 altsettings, but the last
1499     + * one misses syncpipe, and does not produce any sound.
1500     + */
1501     + if (chip->usb_id == USB_ID(0x04fa, 0x4201))
1502     + num = 4;
1503     +
1504     + for (i = 0; i < num; i++) {
1505     alts = &iface->altsetting[i];
1506     altsd = get_iface_desc(alts);
1507     /* skip invalid one */
1508     @@ -3406,7 +3423,6 @@ static void snd_usb_audio_create_proc(struct snd_usb_audio *chip)
1509    
1510     static int snd_usb_audio_free(struct snd_usb_audio *chip)
1511     {
1512     - usb_chip[chip->index] = NULL;
1513     kfree(chip);
1514     return 0;
1515     }
1516     @@ -3600,8 +3616,8 @@ static void *snd_usb_audio_probe(struct usb_device *dev,
1517     snd_card_set_dev(chip->card, &intf->dev);
1518     break;
1519     }
1520     - if (! chip) {
1521     - snd_printk(KERN_ERR "no available usb audio device\n");
1522     + if (!chip) {
1523     + printk(KERN_ERR "no available usb audio device\n");
1524     goto __error;
1525     }
1526     }
1527     @@ -3671,6 +3687,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
1528     list_for_each(p, &chip->mixer_list) {
1529     snd_usb_mixer_disconnect(p);
1530     }
1531     + usb_chip[chip->index] = NULL;
1532     mutex_unlock(&register_mutex);
1533     snd_card_free_when_closed(card);
1534     } else {
1535     diff --git a/sound/usb/usbquirks.h b/sound/usb/usbquirks.h
1536     index 938dff5..82a8d14 100644
1537     --- a/sound/usb/usbquirks.h
1538     +++ b/sound/usb/usbquirks.h
1539     @@ -39,6 +39,30 @@
1540     .idProduct = prod, \
1541     .bInterfaceClass = USB_CLASS_VENDOR_SPEC
1542    
1543     +/* Creative/E-Mu devices */
1544     +{
1545     + USB_DEVICE(0x041e, 0x3010),
1546     + .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1547     + .vendor_name = "Creative Labs",
1548     + .product_name = "Sound Blaster MP3+",
1549     + .ifnum = QUIRK_NO_INTERFACE
1550     + }
1551     +},
1552     +{
1553     + /* E-Mu 0202 USB */
1554     + .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
1555     + .idVendor = 0x041e,
1556     + .idProduct = 0x3f02,
1557     + .bInterfaceClass = USB_CLASS_AUDIO,
1558     +},
1559     +{
1560     + /* E-Mu 0404 USB */
1561     + .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
1562     + .idVendor = 0x041e,
1563     + .idProduct = 0x3f04,
1564     + .bInterfaceClass = USB_CLASS_AUDIO,
1565     +},
1566     +
1567     /*
1568     * Logitech QuickCam: bDeviceClass is vendor-specific, so generic interface
1569     * class matches do not take effect without an explicit ID match.
1570     @@ -97,19 +121,7 @@
1571     .bInterfaceClass = USB_CLASS_AUDIO,
1572     .bInterfaceSubClass = USB_SUBCLASS_AUDIO_CONTROL
1573     },
1574     -/* E-Mu devices */
1575     -{
1576     - .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
1577     - .idVendor = 0x041e,
1578     - .idProduct = 0x3f02,
1579     - .bInterfaceClass = USB_CLASS_AUDIO,
1580     -},
1581     -{
1582     - .match_flags = USB_DEVICE_ID_MATCH_DEVICE,
1583     - .idVendor = 0x041e,
1584     - .idProduct = 0x3f04,
1585     - .bInterfaceClass = USB_CLASS_AUDIO,
1586     -},
1587     +
1588     /*
1589     * Yamaha devices
1590     */
1591     @@ -1165,19 +1177,6 @@ YAMAHA_DEVICE(0x7010, "UB99"),
1592     }
1593     }
1594     },
1595     -{
1596     - USB_DEVICE(0x582, 0x00a6),
1597     - .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1598     - .vendor_name = "Roland",
1599     - .product_name = "Juno-G",
1600     - .ifnum = 0,
1601     - .type = QUIRK_MIDI_FIXED_ENDPOINT,
1602     - .data = & (const struct snd_usb_midi_endpoint_info) {
1603     - .out_cables = 0x0001,
1604     - .in_cables = 0x0001
1605     - }
1606     - }
1607     -},
1608     { /*
1609     * This quirk is for the "Advanced" modes of the Edirol UA-25.
1610     * If the switch is not in an advanced setting, the UA-25 has
1611     @@ -1336,6 +1335,19 @@ YAMAHA_DEVICE(0x7010, "UB99"),
1612     },
1613     /* TODO: add Edirol MD-P1 support */
1614     {
1615     + USB_DEVICE(0x582, 0x00a6),
1616     + .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1617     + .vendor_name = "Roland",
1618     + .product_name = "Juno-G",
1619     + .ifnum = 0,
1620     + .type = QUIRK_MIDI_FIXED_ENDPOINT,
1621     + .data = & (const struct snd_usb_midi_endpoint_info) {
1622     + .out_cables = 0x0001,
1623     + .in_cables = 0x0001
1624     + }
1625     + }
1626     +},
1627     +{
1628     /* Roland SH-201 */
1629     USB_DEVICE(0x0582, 0x00ad),
1630     .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1631     @@ -1719,17 +1731,6 @@ YAMAHA_DEVICE(0x7010, "UB99"),
1632     }
1633     },
1634    
1635     -{
1636     - /* Creative Sound Blaster MP3+ */
1637     - USB_DEVICE(0x041e, 0x3010),
1638     - .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
1639     - .vendor_name = "Creative Labs",
1640     - .product_name = "Sound Blaster MP3+",
1641     - .ifnum = QUIRK_NO_INTERFACE
1642     - }
1643     -
1644     -},
1645     -
1646     /* Emagic devices */
1647     {
1648     USB_DEVICE(0x086a, 0x0001),