Annotation of /trunk/kernel26-magellan/patches-2.6.25-r5/0114-2.6.25.15-all-fixes.patch
Parent Directory | Revision Log
Revision 677 -
(hide annotations)
(download)
Wed Sep 10 21:27:27 2008 UTC (16 years ago) by niro
File size: 51825 byte(s)
Wed Sep 10 21:27:27 2008 UTC (16 years 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, §); | ||
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(®ister_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), |