]> git.ipfire.org Git - ipfire-2.x.git/blob - src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.20-21
Imported linux-2.6.27.39 suse/xen patches.
[ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.kernel.org / patch-2.6.27.20-21
1 From: Greg Kroah-Hartman <gregkh@suse.de>
2 Subject: Linux 2.6.27.21
3
4 Upstream 2.6.27.21 release from kernel.org
5
6 Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
7
8 diff --git a/Makefile b/Makefile
9 index 9f4860d..0664c76 100644
10 --- a/Makefile
11 +++ b/Makefile
12 @@ -1,7 +1,7 @@
13 VERSION = 2
14 PATCHLEVEL = 6
15 SUBLEVEL = 27
16 -EXTRAVERSION = .20
17 +EXTRAVERSION = .21
18 NAME = Trembling Tortoise
19
20 # *DOCUMENTATION*
21 @@ -555,6 +555,9 @@ KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
22 # disable pointer signed / unsigned warnings in gcc 4.0
23 KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
24
25 +# disable invalid "can't wrap" optimzations for signed / pointers
26 +KBUILD_CFLAGS += $(call cc-option,-fwrapv)
27 +
28 # Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
29 # But warn user when we do so
30 warn-assign = \
31 diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
32 index fb7e69c..48dfb6f 100644
33 --- a/arch/ia64/Kconfig
34 +++ b/arch/ia64/Kconfig
35 @@ -444,8 +444,7 @@ config HOLES_IN_ZONE
36 default y if VIRTUAL_MEM_MAP
37
38 config HAVE_ARCH_EARLY_PFN_TO_NID
39 - def_bool y
40 - depends on NEED_MULTIPLE_NODES
41 + def_bool NUMA && SPARSEMEM
42
43 config HAVE_ARCH_NODEDATA_EXTENSION
44 def_bool y
45 diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c
46 index 214388e..dd1d7ed 100644
47 --- a/arch/powerpc/sysdev/fsl_soc.c
48 +++ b/arch/powerpc/sysdev/fsl_soc.c
49 @@ -255,7 +255,7 @@ static int __init gfar_mdio_of_init(void)
50 gfar_mdio_of_init_one(np);
51
52 /* try the deprecated version */
53 - for_each_compatible_node(np, "mdio", "gianfar");
54 + for_each_compatible_node(np, "mdio", "gianfar")
55 gfar_mdio_of_init_one(np);
56
57 return 0;
58 diff --git a/arch/s390/lib/div64.c b/arch/s390/lib/div64.c
59 index a5f8300..d9e62c0 100644
60 --- a/arch/s390/lib/div64.c
61 +++ b/arch/s390/lib/div64.c
62 @@ -61,7 +61,7 @@ static uint32_t __div64_31(uint64_t *n, uint32_t base)
63 " clr %0,%3\n"
64 " jl 0f\n"
65 " slr %0,%3\n"
66 - " alr %1,%2\n"
67 + " ahi %1,1\n"
68 "0:\n"
69 : "+d" (reg2), "+d" (reg3), "=d" (tmp)
70 : "d" (base), "2" (1UL) : "cc" );
71 diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
72 index b75f256..31027aa 100644
73 --- a/arch/x86/kernel/cpu/intel.c
74 +++ b/arch/x86/kernel/cpu/intel.c
75 @@ -32,6 +32,19 @@ struct movsl_mask movsl_mask __read_mostly;
76
77 static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)
78 {
79 + /* Unmask CPUID levels if masked: */
80 + if (c->x86 == 6 && c->x86_model >= 15) {
81 + u64 misc_enable;
82 +
83 + rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
84 +
85 + if (misc_enable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID) {
86 + misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID;
87 + wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
88 + c->cpuid_level = cpuid_eax(0);
89 + }
90 + }
91 +
92 /* Netburst reports 64 bytes clflush size, but does IO in 128 bytes */
93 if (c->x86 == 15 && c->x86_cache_alignment == 64)
94 c->x86_cache_alignment = 128;
95 diff --git a/arch/x86/kernel/cpu/intel_64.c b/arch/x86/kernel/cpu/intel_64.c
96 index 1019c58..7ccd551 100644
97 --- a/arch/x86/kernel/cpu/intel_64.c
98 +++ b/arch/x86/kernel/cpu/intel_64.c
99 @@ -9,6 +9,19 @@
100
101 static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)
102 {
103 + /* Unmask CPUID levels if masked: */
104 + if (c->x86 == 6 && c->x86_model >= 15) {
105 + u64 misc_enable;
106 +
107 + rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
108 +
109 + if (misc_enable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID) {
110 + misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID;
111 + wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
112 + c->cpuid_level = cpuid_eax(0);
113 + }
114 + }
115 +
116 if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
117 (c->x86 == 0x6 && c->x86_model >= 0x0e))
118 set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
119 diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
120 index e6b4606..d78a5b2 100644
121 --- a/drivers/ata/ata_piix.c
122 +++ b/drivers/ata/ata_piix.c
123 @@ -1363,6 +1363,39 @@ static const int *__devinit piix_init_sata_map(struct pci_dev *pdev,
124 return map;
125 }
126
127 +static bool piix_no_sidpr(struct ata_host *host)
128 +{
129 + struct pci_dev *pdev = to_pci_dev(host->dev);
130 +
131 + /*
132 + * Samsung DB-P70 only has three ATA ports exposed and
133 + * curiously the unconnected first port reports link online
134 + * while not responding to SRST protocol causing excessive
135 + * detection delay.
136 + *
137 + * Unfortunately, the system doesn't carry enough DMI
138 + * information to identify the machine but does have subsystem
139 + * vendor and device set. As it's unclear whether the
140 + * subsystem vendor/device is used only for this specific
141 + * board, the port can't be disabled solely with the
142 + * information; however, turning off SIDPR access works around
143 + * the problem. Turn it off.
144 + *
145 + * This problem is reported in bnc#441240.
146 + *
147 + * https://bugzilla.novell.com/show_bug.cgi?id=441420
148 + */
149 + if (pdev->vendor == PCI_VENDOR_ID_INTEL && pdev->device == 0x2920 &&
150 + pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG &&
151 + pdev->subsystem_device == 0xb049) {
152 + dev_printk(KERN_WARNING, host->dev,
153 + "Samsung DB-P70 detected, disabling SIDPR\n");
154 + return true;
155 + }
156 +
157 + return false;
158 +}
159 +
160 static void __devinit piix_init_sidpr(struct ata_host *host)
161 {
162 struct pci_dev *pdev = to_pci_dev(host->dev);
163 @@ -1376,6 +1409,10 @@ static void __devinit piix_init_sidpr(struct ata_host *host)
164 if (hpriv->map[i] == IDE)
165 return;
166
167 + /* is it blacklisted? */
168 + if (piix_no_sidpr(host))
169 + return;
170 +
171 if (!(host->ports[0]->flags & PIIX_FLAG_SIDPR))
172 return;
173
174 diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
175 index 1395643..8ac02cf 100644
176 --- a/drivers/md/dm-crypt.c
177 +++ b/drivers/md/dm-crypt.c
178 @@ -59,6 +59,7 @@ struct dm_crypt_io {
179 };
180
181 struct dm_crypt_request {
182 + struct convert_context *ctx;
183 struct scatterlist sg_in;
184 struct scatterlist sg_out;
185 };
186 @@ -336,6 +337,18 @@ static void crypt_convert_init(struct crypt_config *cc,
187 atomic_set(&ctx->pending, 1);
188 }
189
190 +static struct dm_crypt_request *dmreq_of_req(struct crypt_config *cc,
191 + struct ablkcipher_request *req)
192 +{
193 + return (struct dm_crypt_request *)((char *)req + cc->dmreq_start);
194 +}
195 +
196 +static struct ablkcipher_request *req_of_dmreq(struct crypt_config *cc,
197 + struct dm_crypt_request *dmreq)
198 +{
199 + return (struct ablkcipher_request *)((char *)dmreq - cc->dmreq_start);
200 +}
201 +
202 static int crypt_convert_block(struct crypt_config *cc,
203 struct convert_context *ctx,
204 struct ablkcipher_request *req)
205 @@ -346,10 +359,11 @@ static int crypt_convert_block(struct crypt_config *cc,
206 u8 *iv;
207 int r = 0;
208
209 - dmreq = (struct dm_crypt_request *)((char *)req + cc->dmreq_start);
210 + dmreq = dmreq_of_req(cc, req);
211 iv = (u8 *)ALIGN((unsigned long)(dmreq + 1),
212 crypto_ablkcipher_alignmask(cc->tfm) + 1);
213
214 + dmreq->ctx = ctx;
215 sg_init_table(&dmreq->sg_in, 1);
216 sg_set_page(&dmreq->sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT,
217 bv_in->bv_offset + ctx->offset_in);
218 @@ -396,8 +410,9 @@ static void crypt_alloc_req(struct crypt_config *cc,
219 cc->req = mempool_alloc(cc->req_pool, GFP_NOIO);
220 ablkcipher_request_set_tfm(cc->req, cc->tfm);
221 ablkcipher_request_set_callback(cc->req, CRYPTO_TFM_REQ_MAY_BACKLOG |
222 - CRYPTO_TFM_REQ_MAY_SLEEP,
223 - kcryptd_async_done, ctx);
224 + CRYPTO_TFM_REQ_MAY_SLEEP,
225 + kcryptd_async_done,
226 + dmreq_of_req(cc, cc->req));
227 }
228
229 /*
230 @@ -757,7 +772,8 @@ static void kcryptd_crypt_read_convert(struct dm_crypt_io *io)
231 static void kcryptd_async_done(struct crypto_async_request *async_req,
232 int error)
233 {
234 - struct convert_context *ctx = async_req->data;
235 + struct dm_crypt_request *dmreq = async_req->data;
236 + struct convert_context *ctx = dmreq->ctx;
237 struct dm_crypt_io *io = container_of(ctx, struct dm_crypt_io, ctx);
238 struct crypt_config *cc = io->target->private;
239
240 @@ -766,7 +782,7 @@ static void kcryptd_async_done(struct crypto_async_request *async_req,
241 return;
242 }
243
244 - mempool_free(ablkcipher_request_cast(async_req), cc->req_pool);
245 + mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool);
246
247 if (!atomic_dec_and_test(&ctx->pending))
248 return;
249 diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c
250 index 4789c42..427e5ed 100644
251 --- a/drivers/md/dm-io.c
252 +++ b/drivers/md/dm-io.c
253 @@ -292,6 +292,8 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,
254 (PAGE_SIZE >> SECTOR_SHIFT));
255 num_bvecs = 1 + min_t(int, bio_get_nr_vecs(where->bdev),
256 num_bvecs);
257 + if (unlikely(num_bvecs > BIO_MAX_PAGES))
258 + num_bvecs = BIO_MAX_PAGES;
259 bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios);
260 bio->bi_sector = where->sector + (where->count - remaining);
261 bio->bi_bdev = where->bdev;
262 diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
263 index b262c00..b8ab11f 100644
264 --- a/drivers/md/dm-ioctl.c
265 +++ b/drivers/md/dm-ioctl.c
266 @@ -704,7 +704,8 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size)
267 char *new_name = (char *) param + param->data_start;
268
269 if (new_name < param->data ||
270 - invalid_str(new_name, (void *) param + param_size)) {
271 + invalid_str(new_name, (void *) param + param_size) ||
272 + strlen(new_name) > DM_NAME_LEN - 1) {
273 DMWARN("Invalid new logical volume name supplied.");
274 return -EINVAL;
275 }
276 diff --git a/drivers/media/video/cx23885/cx23885-417.c b/drivers/media/video/cx23885/cx23885-417.c
277 index 7b0e8c0..b2c68bc 100644
278 --- a/drivers/media/video/cx23885/cx23885-417.c
279 +++ b/drivers/media/video/cx23885/cx23885-417.c
280 @@ -1585,7 +1585,8 @@ static int mpeg_open(struct inode *inode, struct file *file)
281
282 list_for_each(list, &cx23885_devlist) {
283 h = list_entry(list, struct cx23885_dev, devlist);
284 - if (h->v4l_device->minor == minor) {
285 + if (h->v4l_device &&
286 + h->v4l_device->minor == minor) {
287 dev = h;
288 break;
289 }
290 diff --git a/drivers/media/video/cx23885/cx23885-video.c b/drivers/media/video/cx23885/cx23885-video.c
291 index 6047c78..7d2802a 100644
292 --- a/drivers/media/video/cx23885/cx23885-video.c
293 +++ b/drivers/media/video/cx23885/cx23885-video.c
294 @@ -733,12 +733,13 @@ static int video_open(struct inode *inode, struct file *file)
295
296 list_for_each(list, &cx23885_devlist) {
297 h = list_entry(list, struct cx23885_dev, devlist);
298 - if (h->video_dev->minor == minor) {
299 + if (h->video_dev &&
300 + h->video_dev->minor == minor) {
301 dev = h;
302 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
303 }
304 if (h->vbi_dev &&
305 - h->vbi_dev->minor == minor) {
306 + h->vbi_dev->minor == minor) {
307 dev = h;
308 type = V4L2_BUF_TYPE_VBI_CAPTURE;
309 }
310 diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
311 index 6b93007..34bb0e4 100644
312 --- a/drivers/misc/thinkpad_acpi.c
313 +++ b/drivers/misc/thinkpad_acpi.c
314 @@ -6826,7 +6826,7 @@ MODULE_ALIAS(TPACPI_DRVR_SHORTNAME);
315 * if it is not there yet.
316 */
317 #define IBM_BIOS_MODULE_ALIAS(__type) \
318 - MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW")
319 + MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*")
320
321 /* Non-ancient thinkpads */
322 MODULE_ALIAS("dmi:bvnIBM:*:svnIBM:*:pvrThinkPad*:rvnIBM:*");
323 @@ -6835,9 +6835,9 @@ MODULE_ALIAS("dmi:bvnLENOVO:*:svnLENOVO:*:pvrThinkPad*:rvnLENOVO:*");
324 /* Ancient thinkpad BIOSes have to be identified by
325 * BIOS type or model number, and there are far less
326 * BIOS types than model numbers... */
327 -IBM_BIOS_MODULE_ALIAS("I[B,D,H,I,M,N,O,T,W,V,Y,Z]");
328 -IBM_BIOS_MODULE_ALIAS("1[0,3,6,8,A-G,I,K,M-P,S,T]");
329 -IBM_BIOS_MODULE_ALIAS("K[U,X-Z]");
330 +IBM_BIOS_MODULE_ALIAS("I[BDHIMNOTWVYZ]");
331 +IBM_BIOS_MODULE_ALIAS("1[0368A-GIKM-PST]");
332 +IBM_BIOS_MODULE_ALIAS("K[UX-Z]");
333
334 MODULE_AUTHOR("Borislav Deianov, Henrique de Moraes Holschuh");
335 MODULE_DESCRIPTION(TPACPI_DESC);
336 diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
337 index e52e54e..8d2d79e 100644
338 --- a/drivers/usb/core/devio.c
339 +++ b/drivers/usb/core/devio.c
340 @@ -359,11 +359,6 @@ static void destroy_async(struct dev_state *ps, struct list_head *list)
341 spin_lock_irqsave(&ps->lock, flags);
342 }
343 spin_unlock_irqrestore(&ps->lock, flags);
344 - as = async_getcompleted(ps);
345 - while (as) {
346 - free_async(as);
347 - as = async_getcompleted(ps);
348 - }
349 }
350
351 static void destroy_async_on_interface(struct dev_state *ps,
352 @@ -639,6 +634,7 @@ static int usbdev_release(struct inode *inode, struct file *file)
353 struct dev_state *ps = file->private_data;
354 struct usb_device *dev = ps->dev;
355 unsigned int ifnum;
356 + struct async *as;
357
358 usb_lock_device(dev);
359
360 @@ -657,6 +653,12 @@ static int usbdev_release(struct inode *inode, struct file *file)
361 usb_unlock_device(dev);
362 usb_put_dev(dev);
363 put_pid(ps->disc_pid);
364 +
365 + as = async_getcompleted(ps);
366 + while (as) {
367 + free_async(as);
368 + as = async_getcompleted(ps);
369 + }
370 kfree(ps);
371 return 0;
372 }
373 diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
374 index 3712b92..ecc9b66 100644
375 --- a/drivers/usb/host/ehci-q.c
376 +++ b/drivers/usb/host/ehci-q.c
377 @@ -1095,7 +1095,8 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
378 prev->qh_next = qh->qh_next;
379 wmb ();
380
381 - if (unlikely (ehci_to_hcd(ehci)->state == HC_STATE_HALT)) {
382 + /* If the controller isn't running, we don't have to wait for it */
383 + if (unlikely(!HC_IS_RUNNING(ehci_to_hcd(ehci)->state))) {
384 /* if (unlikely (qh->reclaim != 0))
385 * this will recurse, probably not much
386 */
387 diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
388 index 07bcb93..1d0b49e 100644
389 --- a/drivers/usb/host/ehci-sched.c
390 +++ b/drivers/usb/host/ehci-sched.c
391 @@ -1536,7 +1536,7 @@ itd_link_urb (
392 struct ehci_itd, itd_list);
393 list_move_tail (&itd->itd_list, &stream->td_list);
394 itd->stream = iso_stream_get (stream);
395 - itd->urb = usb_get_urb (urb);
396 + itd->urb = urb;
397 itd_init (ehci, stream, itd);
398 }
399
400 @@ -1645,7 +1645,7 @@ itd_complete (
401 (void) disable_periodic(ehci);
402 ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
403
404 - if (unlikely (list_empty (&stream->td_list))) {
405 + if (unlikely(list_is_singular(&stream->td_list))) {
406 ehci_to_hcd(ehci)->self.bandwidth_allocated
407 -= stream->bandwidth;
408 ehci_vdbg (ehci,
409 @@ -1656,7 +1656,6 @@ itd_complete (
410 iso_stream_put (ehci, stream);
411
412 done:
413 - usb_put_urb(urb);
414 itd->urb = NULL;
415 if (ehci->clock_frame != itd->frame || itd->index[7] != -1) {
416 /* OK to recycle this ITD now. */
417 @@ -1949,7 +1948,7 @@ sitd_link_urb (
418 struct ehci_sitd, sitd_list);
419 list_move_tail (&sitd->sitd_list, &stream->td_list);
420 sitd->stream = iso_stream_get (stream);
421 - sitd->urb = usb_get_urb (urb);
422 + sitd->urb = urb;
423
424 sitd_patch(ehci, stream, sitd, sched, packet);
425 sitd_link (ehci, (next_uframe >> 3) % ehci->periodic_size,
426 @@ -2034,7 +2033,7 @@ sitd_complete (
427 (void) disable_periodic(ehci);
428 ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
429
430 - if (list_empty (&stream->td_list)) {
431 + if (list_is_singular(&stream->td_list)) {
432 ehci_to_hcd(ehci)->self.bandwidth_allocated
433 -= stream->bandwidth;
434 ehci_vdbg (ehci,
435 @@ -2045,7 +2044,6 @@ sitd_complete (
436 iso_stream_put (ehci, stream);
437 /* OK to recycle this SITD now that its completion callback ran. */
438 done:
439 - usb_put_urb(urb);
440 sitd->urb = NULL;
441 sitd->stream = NULL;
442 list_move(&sitd->sitd_list, &stream->free_list);
443 diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c
444 index 1279553..69e6687 100644
445 --- a/drivers/usb/serial/cp2101.c
446 +++ b/drivers/usb/serial/cp2101.c
447 @@ -77,6 +77,7 @@ static struct usb_device_id id_table [] = {
448 { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */
449 { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */
450 { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */
451 + { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */
452 { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */
453 { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */
454 { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */
455 diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
456 index 3dc93b5..2d78712 100644
457 --- a/drivers/usb/serial/ftdi_sio.c
458 +++ b/drivers/usb/serial/ftdi_sio.c
459 @@ -657,6 +657,11 @@ static struct usb_device_id id_table_combined [] = {
460 { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
461 { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
462 { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
463 + { USB_DEVICE(ATMEL_VID, STK541_PID) },
464 + { USB_DEVICE(DE_VID, STB_PID) },
465 + { USB_DEVICE(DE_VID, WHT_PID) },
466 + { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
467 + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
468 { }, /* Optional parameter entry */
469 { } /* Terminating entry */
470 };
471 diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
472 index 8a5b6df..80fa76e 100644
473 --- a/drivers/usb/serial/ftdi_sio.h
474 +++ b/drivers/usb/serial/ftdi_sio.h
475 @@ -870,6 +870,26 @@
476 #define RATOC_PRODUCT_ID_USB60F 0xb020
477
478 /*
479 + * Atmel STK541
480 + */
481 +#define ATMEL_VID 0x03eb /* Vendor ID */
482 +#define STK541_PID 0x2109 /* Zigbee Controller */
483 +
484 +/*
485 + * Dresden Elektronic Sensor Terminal Board
486 + */
487 +#define DE_VID 0x1cf1 /* Vendor ID */
488 +#define STB_PID 0x0001 /* Sensor Terminal Board */
489 +#define WHT_PID 0x0004 /* Wireless Handheld Terminal */
490 +
491 +/*
492 + * Blackfin gnICE JTAG
493 + * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice
494 + */
495 +#define ADI_VID 0x0456
496 +#define ADI_GNICE_PID 0xF000
497 +
498 +/*
499 * BmRequestType: 1100 0000b
500 * bRequest: FTDI_E2_READ
501 * wValue: 0
502 diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
503 index 9930150..211cd61 100644
504 --- a/drivers/usb/serial/option.c
505 +++ b/drivers/usb/serial/option.c
506 @@ -89,6 +89,7 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
507 #define OPTION_PRODUCT_ETNA_MODEM_GT 0x7041
508 #define OPTION_PRODUCT_ETNA_MODEM_EX 0x7061
509 #define OPTION_PRODUCT_ETNA_KOI_MODEM 0x7100
510 +#define OPTION_PRODUCT_GTM380_MODEM 0x7201
511
512 #define HUAWEI_VENDOR_ID 0x12D1
513 #define HUAWEI_PRODUCT_E600 0x1001
514 @@ -190,6 +191,7 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
515 /* OVATION PRODUCTS */
516 #define NOVATELWIRELESS_PRODUCT_MC727 0x4100
517 #define NOVATELWIRELESS_PRODUCT_MC950D 0x4400
518 +#define NOVATELWIRELESS_PRODUCT_U727 0x5010
519
520 /* FUTURE NOVATEL PRODUCTS */
521 #define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED 0X6000
522 @@ -281,14 +283,11 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
523
524 /* ZTE PRODUCTS */
525 #define ZTE_VENDOR_ID 0x19d2
526 +#define ZTE_PRODUCT_MF622 0x0001
527 #define ZTE_PRODUCT_MF628 0x0015
528 #define ZTE_PRODUCT_MF626 0x0031
529 #define ZTE_PRODUCT_CDMA_TECH 0xfffe
530
531 -/* Ericsson products */
532 -#define ERICSSON_VENDOR_ID 0x0bdb
533 -#define ERICSSON_PRODUCT_F3507G 0x1900
534 -
535 #define BENQ_VENDOR_ID 0x04a5
536 #define BENQ_PRODUCT_H10 0x4068
537
538 @@ -317,6 +316,7 @@ static struct usb_device_id option_ids[] = {
539 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
540 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
541 { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
542 + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTM380_MODEM) },
543 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
544 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
545 { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
546 @@ -402,6 +402,7 @@ static struct usb_device_id option_ids[] = {
547 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
548 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
549 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
550 + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel MC727/U727/USB727 */
551 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */
552 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */
553 { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */
554 @@ -429,7 +430,6 @@ static struct usb_device_id option_ids[] = {
555 { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
556 { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) }, /* Dell Wireless HSDPA 5520 */
557 { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
558 - { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
559 { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
560 { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
561 { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) }, /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
562 @@ -497,10 +497,10 @@ static struct usb_device_id option_ids[] = {
563 { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
564 { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
565 { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
566 + { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622) },
567 { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) },
568 { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
569 { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
570 - { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
571 { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
572 { USB_DEVICE(0x1da5, 0x4515) }, /* BenQ H20 */
573 { } /* Terminating entry */
574 diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
575 index 019bd62..d21995a 100644
576 --- a/drivers/usb/storage/unusual_devs.h
577 +++ b/drivers/usb/storage/unusual_devs.h
578 @@ -219,7 +219,7 @@ UNUSUAL_DEV( 0x0421, 0x047c, 0x0370, 0x0610,
579 US_FL_MAX_SECTORS_64 ),
580
581 /* Reported by Manuel Osdoba <manuel.osdoba@tu-ilmenau.de> */
582 -UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x0452,
583 +UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x9999,
584 "Nokia",
585 "Nokia 6233",
586 US_SC_DEVICE, US_PR_DEVICE, NULL,
587 @@ -990,7 +990,9 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001,
588 US_FL_FIX_CAPACITY ),
589
590 /* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */
591 -UNUSUAL_DEV( 0x067b, 0x2507, 0x0100, 0x0100,
592 +/* Change to bcdDeviceMin (0x0100 to 0x0001) reported by
593 + * Thomas Bartosik <tbartdev@gmx-topmail.de> */
594 +UNUSUAL_DEV( 0x067b, 0x2507, 0x0001, 0x0100,
595 "Prolific Technology Inc.",
596 "Mass Storage Device",
597 US_SC_DEVICE, US_PR_DEVICE, NULL,
598 @@ -1405,6 +1407,16 @@ UNUSUAL_DEV( 0x0af0, 0x7401, 0x0000, 0x0000,
599 US_SC_DEVICE, US_PR_DEVICE, NULL,
600 0 ),
601
602 +/* Reported by Jan Dumon <j.dumon@option.com>
603 + * This device (wrongly) has a vendor-specific device descriptor.
604 + * The entry is needed so usb-storage can bind to it's mass-storage
605 + * interface as an interface driver */
606 +UNUSUAL_DEV( 0x0af0, 0x7501, 0x0000, 0x0000,
607 + "Option",
608 + "GI 0431 SD-Card",
609 + US_SC_DEVICE, US_PR_DEVICE, NULL,
610 + 0 ),
611 +
612 #ifdef CONFIG_USB_STORAGE_ISD200
613 UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110,
614 "ATI",
615 diff --git a/fs/aio.c b/fs/aio.c
616 index 048648d..c1174b5 100644
617 --- a/fs/aio.c
618 +++ b/fs/aio.c
619 @@ -428,7 +428,7 @@ static struct kiocb *__aio_get_req(struct kioctx *ctx)
620 req->private = NULL;
621 req->ki_iovec = NULL;
622 INIT_LIST_HEAD(&req->ki_run_list);
623 - req->ki_eventfd = ERR_PTR(-EINVAL);
624 + req->ki_eventfd = NULL;
625
626 /* Check if the completion queue has enough free space to
627 * accept an event from this io.
628 @@ -470,8 +470,6 @@ static inline void really_put_req(struct kioctx *ctx, struct kiocb *req)
629 {
630 assert_spin_locked(&ctx->ctx_lock);
631
632 - if (!IS_ERR(req->ki_eventfd))
633 - fput(req->ki_eventfd);
634 if (req->ki_dtor)
635 req->ki_dtor(req);
636 if (req->ki_iovec != &req->ki_inline_vec)
637 @@ -493,8 +491,11 @@ static void aio_fput_routine(struct work_struct *data)
638 list_del(&req->ki_list);
639 spin_unlock_irq(&fput_lock);
640
641 - /* Complete the fput */
642 - __fput(req->ki_filp);
643 + /* Complete the fput(s) */
644 + if (req->ki_filp != NULL)
645 + __fput(req->ki_filp);
646 + if (req->ki_eventfd != NULL)
647 + __fput(req->ki_eventfd);
648
649 /* Link the iocb into the context's free list */
650 spin_lock_irq(&ctx->ctx_lock);
651 @@ -512,12 +513,14 @@ static void aio_fput_routine(struct work_struct *data)
652 */
653 static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)
654 {
655 + int schedule_putreq = 0;
656 +
657 dprintk(KERN_DEBUG "aio_put(%p): f_count=%ld\n",
658 req, atomic_long_read(&req->ki_filp->f_count));
659
660 assert_spin_locked(&ctx->ctx_lock);
661
662 - req->ki_users --;
663 + req->ki_users--;
664 BUG_ON(req->ki_users < 0);
665 if (likely(req->ki_users))
666 return 0;
667 @@ -525,10 +528,23 @@ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)
668 req->ki_cancel = NULL;
669 req->ki_retry = NULL;
670
671 - /* Must be done under the lock to serialise against cancellation.
672 - * Call this aio_fput as it duplicates fput via the fput_work.
673 + /*
674 + * Try to optimize the aio and eventfd file* puts, by avoiding to
675 + * schedule work in case it is not __fput() time. In normal cases,
676 + * we would not be holding the last reference to the file*, so
677 + * this function will be executed w/out any aio kthread wakeup.
678 */
679 - if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count))) {
680 + if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count)))
681 + schedule_putreq++;
682 + else
683 + req->ki_filp = NULL;
684 + if (req->ki_eventfd != NULL) {
685 + if (unlikely(atomic_long_dec_and_test(&req->ki_eventfd->f_count)))
686 + schedule_putreq++;
687 + else
688 + req->ki_eventfd = NULL;
689 + }
690 + if (unlikely(schedule_putreq)) {
691 get_ioctx(ctx);
692 spin_lock(&fput_lock);
693 list_add(&req->ki_list, &fput_head);
694 @@ -992,7 +1008,7 @@ int aio_complete(struct kiocb *iocb, long res, long res2)
695 * eventfd. The eventfd_signal() function is safe to be called
696 * from IRQ context.
697 */
698 - if (!IS_ERR(iocb->ki_eventfd))
699 + if (iocb->ki_eventfd != NULL)
700 eventfd_signal(iocb->ki_eventfd, 1);
701
702 put_rq:
703 @@ -1596,6 +1612,7 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
704 req->ki_eventfd = eventfd_fget((int) iocb->aio_resfd);
705 if (IS_ERR(req->ki_eventfd)) {
706 ret = PTR_ERR(req->ki_eventfd);
707 + req->ki_eventfd = NULL;
708 goto out_put_req;
709 }
710 }
711 diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
712 index 14ba4d9..b0b07df 100644
713 --- a/fs/nfsd/nfs4xdr.c
714 +++ b/fs/nfsd/nfs4xdr.c
715 @@ -2593,6 +2593,7 @@ static nfsd4_enc nfsd4_enc_ops[] = {
716 [OP_LOOKUPP] = (nfsd4_enc)nfsd4_encode_noop,
717 [OP_NVERIFY] = (nfsd4_enc)nfsd4_encode_noop,
718 [OP_OPEN] = (nfsd4_enc)nfsd4_encode_open,
719 + [OP_OPENATTR] = (nfsd4_enc)nfsd4_encode_noop,
720 [OP_OPEN_CONFIRM] = (nfsd4_enc)nfsd4_encode_open_confirm,
721 [OP_OPEN_DOWNGRADE] = (nfsd4_enc)nfsd4_encode_open_downgrade,
722 [OP_PUTFH] = (nfsd4_enc)nfsd4_encode_noop,
723 diff --git a/include/asm-x86/msr-index.h b/include/asm-x86/msr-index.h
724 index 44bce77..d3a20f3 100644
725 --- a/include/asm-x86/msr-index.h
726 +++ b/include/asm-x86/msr-index.h
727 @@ -196,6 +196,35 @@
728 #define MSR_IA32_THERM_STATUS 0x0000019c
729 #define MSR_IA32_MISC_ENABLE 0x000001a0
730
731 +/* MISC_ENABLE bits: architectural */
732 +#define MSR_IA32_MISC_ENABLE_FAST_STRING (1ULL << 0)
733 +#define MSR_IA32_MISC_ENABLE_TCC (1ULL << 1)
734 +#define MSR_IA32_MISC_ENABLE_EMON (1ULL << 7)
735 +#define MSR_IA32_MISC_ENABLE_BTS_UNAVAIL (1ULL << 11)
736 +#define MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL (1ULL << 12)
737 +#define MSR_IA32_MISC_ENABLE_ENHANCED_SPEEDSTEP (1ULL << 16)
738 +#define MSR_IA32_MISC_ENABLE_MWAIT (1ULL << 18)
739 +#define MSR_IA32_MISC_ENABLE_LIMIT_CPUID (1ULL << 22)
740 +#define MSR_IA32_MISC_ENABLE_XTPR_DISABLE (1ULL << 23)
741 +#define MSR_IA32_MISC_ENABLE_XD_DISABLE (1ULL << 34)
742 +
743 +/* MISC_ENABLE bits: model-specific, meaning may vary from core to core */
744 +#define MSR_IA32_MISC_ENABLE_X87_COMPAT (1ULL << 2)
745 +#define MSR_IA32_MISC_ENABLE_TM1 (1ULL << 3)
746 +#define MSR_IA32_MISC_ENABLE_SPLIT_LOCK_DISABLE (1ULL << 4)
747 +#define MSR_IA32_MISC_ENABLE_L3CACHE_DISABLE (1ULL << 6)
748 +#define MSR_IA32_MISC_ENABLE_SUPPRESS_LOCK (1ULL << 8)
749 +#define MSR_IA32_MISC_ENABLE_PREFETCH_DISABLE (1ULL << 9)
750 +#define MSR_IA32_MISC_ENABLE_FERR (1ULL << 10)
751 +#define MSR_IA32_MISC_ENABLE_FERR_MULTIPLEX (1ULL << 10)
752 +#define MSR_IA32_MISC_ENABLE_TM2 (1ULL << 13)
753 +#define MSR_IA32_MISC_ENABLE_ADJ_PREF_DISABLE (1ULL << 19)
754 +#define MSR_IA32_MISC_ENABLE_SPEEDSTEP_LOCK (1ULL << 20)
755 +#define MSR_IA32_MISC_ENABLE_L1D_CONTEXT (1ULL << 24)
756 +#define MSR_IA32_MISC_ENABLE_DCU_PREF_DISABLE (1ULL << 37)
757 +#define MSR_IA32_MISC_ENABLE_TURBO_DISABLE (1ULL << 38)
758 +#define MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE (1ULL << 39)
759 +
760 /* Intel Model 6 */
761 #define MSR_P6_EVNTSEL0 0x00000186
762 #define MSR_P6_EVNTSEL1 0x00000187
763 diff --git a/include/linux/capability.h b/include/linux/capability.h
764 index 9d1fe30..28863f4 100644
765 --- a/include/linux/capability.h
766 +++ b/include/linux/capability.h
767 @@ -382,8 +382,10 @@ typedef struct kernel_cap_struct {
768 # define CAP_FULL_SET ((kernel_cap_t){{ ~0, ~0 }})
769 # define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }})
770 # define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } })
771 -# define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \
772 - CAP_FS_MASK_B1 } })
773 +# define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \
774 + | CAP_TO_MASK(CAP_SYS_RESOURCE) \
775 + | CAP_TO_MASK(CAP_MKNOD), \
776 + CAP_FS_MASK_B1 } })
777
778 #endif /* _KERNEL_CAPABILITY_U32S != 2 */
779
780 diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
781 index 4c601b1..35afb41 100644
782 --- a/sound/core/oss/pcm_oss.c
783 +++ b/sound/core/oss/pcm_oss.c
784 @@ -2854,7 +2854,7 @@ static void snd_pcm_oss_proc_write(struct snd_info_entry *entry,
785 setup = kmalloc(sizeof(*setup), GFP_KERNEL);
786 if (! setup) {
787 buffer->error = -ENOMEM;
788 - mutex_lock(&pstr->oss.setup_mutex);
789 + mutex_unlock(&pstr->oss.setup_mutex);
790 return;
791 }
792 if (pstr->oss.setup_list == NULL)
793 @@ -2868,7 +2868,7 @@ static void snd_pcm_oss_proc_write(struct snd_info_entry *entry,
794 if (! template.task_name) {
795 kfree(setup);
796 buffer->error = -ENOMEM;
797 - mutex_lock(&pstr->oss.setup_mutex);
798 + mutex_unlock(&pstr->oss.setup_mutex);
799 return;
800 }
801 }
802 diff --git a/sound/core/sgbuf.c b/sound/core/sgbuf.c
803 index cefd228..91f16ac 100644
804 --- a/sound/core/sgbuf.c
805 +++ b/sound/core/sgbuf.c
806 @@ -38,6 +38,10 @@ int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab)
807 if (! sgbuf)
808 return -EINVAL;
809
810 + if (dmab->area)
811 + vunmap(dmab->area);
812 + dmab->area = NULL;
813 +
814 tmpb.dev.type = SNDRV_DMA_TYPE_DEV;
815 tmpb.dev.dev = sgbuf->dev;
816 for (i = 0; i < sgbuf->pages; i++) {
817 @@ -46,9 +50,6 @@ int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab)
818 tmpb.bytes = PAGE_SIZE;
819 snd_dma_free_pages(&tmpb);
820 }
821 - if (dmab->area)
822 - vunmap(dmab->area);
823 - dmab->area = NULL;
824
825 kfree(sgbuf->table);
826 kfree(sgbuf->page_table);
827 diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
828 index 0f014b1..0b93ef6 100644
829 --- a/sound/pci/hda/hda_intel.c
830 +++ b/sound/pci/hda/hda_intel.c
831 @@ -2110,9 +2110,17 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
832 gcap = azx_readw(chip, GCAP);
833 snd_printdd("chipset global capabilities = 0x%x\n", gcap);
834
835 + /* ATI chips seems buggy about 64bit DMA addresses */
836 + if (chip->driver_type == AZX_DRIVER_ATI)
837 + gcap &= ~0x01;
838 +
839 /* allow 64bit DMA address if supported by H/W */
840 if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK))
841 pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK);
842 + else {
843 + pci_set_dma_mask(pci, DMA_32BIT_MASK);
844 + pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK);
845 + }
846
847 /* read number of streams from GCAP register instead of using
848 * hardcoded value
849 diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c
850 index 3dd0c79..7e83131 100644
851 --- a/sound/pci/mixart/mixart.c
852 +++ b/sound/pci/mixart/mixart.c
853 @@ -607,6 +607,7 @@ static int snd_mixart_hw_params(struct snd_pcm_substream *subs,
854 /* set the format to the board */
855 err = mixart_set_format(stream, format);
856 if(err < 0) {
857 + mutex_unlock(&mgr->setup_mutex);
858 return err;
859 }
860