Commit 263374db authored by Thomas Sailer's avatar Thomas Sailer Committed by Greg Kroah-Hartman

[PATCH] : 2.5.54: fix oopsable bug in OSS PCI sound drivers

The following patch fixes an oopsable (according to a few reports) bug
in the multiple open exclusion logic in my sound drivers and a driver
derived from my code.
parent 4f38da4d
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
* - speaker mixer support * - speaker mixer support
* Mon Aug 13 2001 * Mon Aug 13 2001
* - optimizations and cleanups * - optimizations and cleanups
* 03/01/2003 - open_mode fixes from Georg Acher <acher@in.tum.de>
* *
*/ */
/*****************************************************************************/ /*****************************************************************************/
...@@ -2272,7 +2273,7 @@ static int cm_release(struct inode *inode, struct file *file) ...@@ -2272,7 +2273,7 @@ static int cm_release(struct inode *inode, struct file *file)
stop_adc(s); stop_adc(s);
dealloc_dmabuf(&s->dma_adc); dealloc_dmabuf(&s->dma_adc);
} }
s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE));
up(&s->open_sem); up(&s->open_sem);
wake_up(&s->open_wait); wake_up(&s->open_wait);
unlock_kernel(); unlock_kernel();
...@@ -2540,7 +2541,7 @@ static int cm_midi_release(struct inode *inode, struct file *file) ...@@ -2540,7 +2541,7 @@ static int cm_midi_release(struct inode *inode, struct file *file)
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
} }
down(&s->open_sem); down(&s->open_sem);
s->open_mode &= (~(file->f_mode << FMODE_MIDI_SHIFT)) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE); s->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE));
spin_lock_irqsave(&s->lock, flags); spin_lock_irqsave(&s->lock, flags);
if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
del_timer(&s->midi.timer); del_timer(&s->midi.timer);
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
/* /*
* es1370.c -- Ensoniq ES1370/Asahi Kasei AK4531 audio driver. * es1370.c -- Ensoniq ES1370/Asahi Kasei AK4531 audio driver.
* *
* Copyright (C) 1998-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * Copyright (C) 1998-2001, 2003 Thomas Sailer (t.sailer@alumni.ethz.ch)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -117,6 +117,7 @@ ...@@ -117,6 +117,7 @@
* 07.01.2001 0.36 Timeout change in wrcodec as requested by Frank Klemm <pfk@fuchs.offl.uni-jena.de> * 07.01.2001 0.36 Timeout change in wrcodec as requested by Frank Klemm <pfk@fuchs.offl.uni-jena.de>
* 31.01.2001 0.37 Register/Unregister gameport * 31.01.2001 0.37 Register/Unregister gameport
* Fix SETTRIGGER non OSS API conformity * Fix SETTRIGGER non OSS API conformity
* 03.01.2003 0.38 open_mode fixes from Georg Acher <acher@in.tum.de>
* *
* some important things missing in Ensoniq documentation: * some important things missing in Ensoniq documentation:
* *
...@@ -1807,7 +1808,7 @@ static int es1370_release(struct inode *inode, struct file *file) ...@@ -1807,7 +1808,7 @@ static int es1370_release(struct inode *inode, struct file *file)
stop_adc(s); stop_adc(s);
dealloc_dmabuf(s, &s->dma_adc); dealloc_dmabuf(s, &s->dma_adc);
} }
s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE));
wake_up(&s->open_wait); wake_up(&s->open_wait);
up(&s->open_sem); up(&s->open_sem);
unlock_kernel(); unlock_kernel();
...@@ -2498,7 +2499,7 @@ static int es1370_midi_release(struct inode *inode, struct file *file) ...@@ -2498,7 +2499,7 @@ static int es1370_midi_release(struct inode *inode, struct file *file)
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
} }
down(&s->open_sem); down(&s->open_sem);
s->open_mode &= (~(file->f_mode << FMODE_MIDI_SHIFT)) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE); s->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE));
spin_lock_irqsave(&s->lock, flags); spin_lock_irqsave(&s->lock, flags);
if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
s->ctrl &= ~CTRL_UART_EN; s->ctrl &= ~CTRL_UART_EN;
...@@ -2740,7 +2741,7 @@ static int __init init_es1370(void) ...@@ -2740,7 +2741,7 @@ static int __init init_es1370(void)
{ {
if (!pci_present()) /* No PCI bus in this machine! */ if (!pci_present()) /* No PCI bus in this machine! */
return -ENODEV; return -ENODEV;
printk(KERN_INFO "es1370: version v0.37 time " __TIME__ " " __DATE__ "\n"); printk(KERN_INFO "es1370: version v0.38 time " __TIME__ " " __DATE__ "\n");
return pci_module_init(&es1370_driver); return pci_module_init(&es1370_driver);
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
/* /*
* es1371.c -- Creative Ensoniq ES1371. * es1371.c -- Creative Ensoniq ES1371.
* *
* Copyright (C) 1998-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * Copyright (C) 1998-2001, 2003 Thomas Sailer (t.sailer@alumni.ethz.ch)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -104,6 +104,7 @@ ...@@ -104,6 +104,7 @@
* 31.01.2001 0.30 Register/Unregister gameport * 31.01.2001 0.30 Register/Unregister gameport
* Fix SETTRIGGER non OSS API conformity * Fix SETTRIGGER non OSS API conformity
* 14.07.2001 0.31 Add list of laptops needing amplifier control * 14.07.2001 0.31 Add list of laptops needing amplifier control
* 03.01.2003 0.32 open_mode fixes from Georg Acher <acher@in.tum.de>
*/ */
/*****************************************************************************/ /*****************************************************************************/
...@@ -1995,7 +1996,7 @@ static int es1371_release(struct inode *inode, struct file *file) ...@@ -1995,7 +1996,7 @@ static int es1371_release(struct inode *inode, struct file *file)
stop_adc(s); stop_adc(s);
dealloc_dmabuf(s, &s->dma_adc); dealloc_dmabuf(s, &s->dma_adc);
} }
s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE));
up(&s->open_sem); up(&s->open_sem);
wake_up(&s->open_wait); wake_up(&s->open_wait);
unlock_kernel(); unlock_kernel();
...@@ -2675,7 +2676,7 @@ static int es1371_midi_release(struct inode *inode, struct file *file) ...@@ -2675,7 +2676,7 @@ static int es1371_midi_release(struct inode *inode, struct file *file)
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
} }
down(&s->open_sem); down(&s->open_sem);
s->open_mode &= (~(file->f_mode << FMODE_MIDI_SHIFT)) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE); s->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE));
spin_lock_irqsave(&s->lock, flags); spin_lock_irqsave(&s->lock, flags);
if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
s->ctrl &= ~CTRL_UART_EN; s->ctrl &= ~CTRL_UART_EN;
...@@ -3044,7 +3045,7 @@ static int __init init_es1371(void) ...@@ -3044,7 +3045,7 @@ static int __init init_es1371(void)
{ {
if (!pci_present()) /* No PCI bus in this machine! */ if (!pci_present()) /* No PCI bus in this machine! */
return -ENODEV; return -ENODEV;
printk(KERN_INFO PFX "version v0.30 time " __TIME__ " " __DATE__ "\n"); printk(KERN_INFO PFX "version v0.32 time " __TIME__ " " __DATE__ "\n");
return pci_module_init(&es1371_driver); return pci_module_init(&es1371_driver);
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
/* /*
* esssolo1.c -- ESS Technology Solo1 (ES1946) audio driver. * esssolo1.c -- ESS Technology Solo1 (ES1946) audio driver.
* *
* Copyright (C) 1998-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * Copyright (C) 1998-2001, 2003 Thomas Sailer (t.sailer@alumni.ethz.ch)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
* 22.05.2001 0.19 more cleanups, changed PM to PCI 2.4 style, got rid * 22.05.2001 0.19 more cleanups, changed PM to PCI 2.4 style, got rid
* of global list of devices, using pci device data. * of global list of devices, using pci device data.
* Marcus Meissner <mm@caldera.de> * Marcus Meissner <mm@caldera.de>
* 03.01.2003 0.20 open_mode fixes from Georg Acher <acher@in.tum.de>
*/ */
/*****************************************************************************/ /*****************************************************************************/
...@@ -1986,7 +1987,7 @@ static int solo1_midi_release(struct inode *inode, struct file *file) ...@@ -1986,7 +1987,7 @@ static int solo1_midi_release(struct inode *inode, struct file *file)
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
} }
down(&s->open_sem); down(&s->open_sem);
s->open_mode &= (~(file->f_mode << FMODE_MIDI_SHIFT)) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE); s->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE));
spin_lock_irqsave(&s->lock, flags); spin_lock_irqsave(&s->lock, flags);
if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
outb(0x30, s->iobase + 7); /* enable A1, A2 irq's */ outb(0x30, s->iobase + 7); /* enable A1, A2 irq's */
...@@ -2461,7 +2462,7 @@ static int __init init_solo1(void) ...@@ -2461,7 +2462,7 @@ static int __init init_solo1(void)
{ {
if (!pci_present()) /* No PCI bus in this machine! */ if (!pci_present()) /* No PCI bus in this machine! */
return -ENODEV; return -ENODEV;
printk(KERN_INFO "solo1: version v0.19 time " __TIME__ " " __DATE__ "\n"); printk(KERN_INFO "solo1: version v0.20 time " __TIME__ " " __DATE__ "\n");
if (!pci_register_driver(&solo1_driver)) { if (!pci_register_driver(&solo1_driver)) {
pci_unregister_driver(&solo1_driver); pci_unregister_driver(&solo1_driver);
return -ENODEV; return -ENODEV;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
/* /*
* sonicvibes.c -- S3 Sonic Vibes audio driver. * sonicvibes.c -- S3 Sonic Vibes audio driver.
* *
* Copyright (C) 1998-2001 Thomas Sailer (t.sailer@alumni.ethz.ch) * Copyright (C) 1998-2001, 2003 Thomas Sailer (t.sailer@alumni.ethz.ch)
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
...@@ -94,6 +94,7 @@ ...@@ -94,6 +94,7 @@
* Fix SETTRIGGER non OSS API conformity * Fix SETTRIGGER non OSS API conformity
* 18.05.2001 0.30 PCI probing and error values cleaned up by Marcus * 18.05.2001 0.30 PCI probing and error values cleaned up by Marcus
* Meissner <mm@caldera.de> * Meissner <mm@caldera.de>
* 03.01.2003 0.31 open_mode fixes from Georg Acher <acher@in.tum.de>
* *
*/ */
...@@ -1969,7 +1970,7 @@ static int sv_release(struct inode *inode, struct file *file) ...@@ -1969,7 +1970,7 @@ static int sv_release(struct inode *inode, struct file *file)
stop_adc(s); stop_adc(s);
dealloc_dmabuf(s, &s->dma_adc); dealloc_dmabuf(s, &s->dma_adc);
} }
s->open_mode &= (~file->f_mode) & (FMODE_READ|FMODE_WRITE); s->open_mode &= ~(file->f_mode & (FMODE_READ|FMODE_WRITE));
wake_up(&s->open_wait); wake_up(&s->open_wait);
up(&s->open_sem); up(&s->open_sem);
unlock_kernel(); unlock_kernel();
...@@ -2245,7 +2246,7 @@ static int sv_midi_release(struct inode *inode, struct file *file) ...@@ -2245,7 +2246,7 @@ static int sv_midi_release(struct inode *inode, struct file *file)
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
} }
down(&s->open_sem); down(&s->open_sem);
s->open_mode &= (~(file->f_mode << FMODE_MIDI_SHIFT)) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE); s->open_mode &= ~((file->f_mode << FMODE_MIDI_SHIFT) & (FMODE_MIDI_READ|FMODE_MIDI_WRITE));
spin_lock_irqsave(&s->lock, flags); spin_lock_irqsave(&s->lock, flags);
if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) { if (!(s->open_mode & (FMODE_MIDI_READ | FMODE_MIDI_WRITE))) {
outb(inb(s->ioenh + SV_CODEC_INTMASK) & ~SV_CINTMASK_MIDI, s->ioenh + SV_CODEC_INTMASK); outb(inb(s->ioenh + SV_CODEC_INTMASK) & ~SV_CINTMASK_MIDI, s->ioenh + SV_CODEC_INTMASK);
...@@ -2725,7 +2726,7 @@ static int __init init_sonicvibes(void) ...@@ -2725,7 +2726,7 @@ static int __init init_sonicvibes(void)
{ {
if (!pci_present()) /* No PCI bus in this machine! */ if (!pci_present()) /* No PCI bus in this machine! */
return -ENODEV; return -ENODEV;
printk(KERN_INFO "sv: version v0.30 time " __TIME__ " " __DATE__ "\n"); printk(KERN_INFO "sv: version v0.31 time " __TIME__ " " __DATE__ "\n");
#if 0 #if 0
if (!(wavetable_mem = __get_free_pages(GFP_KERNEL, 20-PAGE_SHIFT))) if (!(wavetable_mem = __get_free_pages(GFP_KERNEL, 20-PAGE_SHIFT)))
printk(KERN_INFO "sv: cannot allocate 1MB of contiguous nonpageable memory for wavetable data\n"); printk(KERN_INFO "sv: cannot allocate 1MB of contiguous nonpageable memory for wavetable data\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment