2001-02-11 02:54:42

by Dave Jones

[permalink] [raw]
Subject: [PATCH] Sound drivers pci_enable_device clean_up


Hi guys,
Here's a small fixup to your respective drivers to make
pci_enable_device() calls happen before reading irq/resources.

regards,

Davej.


--
| Dave Jones. http://www.suse.de/~davej
| SuSE Labs


diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/es1370.c linux-dj/drivers/sound/es1370.c
--- linux/drivers/sound/es1370.c Sat Feb 10 02:49:52 2001
+++ linux-dj/drivers/sound/es1370.c Sat Feb 10 03:05:52 2001
@@ -117,6 +117,7 @@
* Tim Janik's BSE (Bedevilled Sound Engine) found this
* 07.02.2000 0.33 Use pci_alloc_consistent and pci_register_driver
* 21.11.2000 0.34 Initialize dma buffers in poll, otherwise poll may return a bogus mask
+ * 09.02.2001 0.35 pci_enable_device before reading irq/resources <[email protected]>
*
* some important things missing in Ensoniq documentation:
*
@@ -2544,14 +2545,21 @@
spin_lock_init(&s->lock);
s->magic = ES1370_MAGIC;
s->dev = pcidev;
+
+ i = pci_enable_device(pcidev);
+ if (i) {
+ kfree(s);
+ return i;
+ }
+
s->io = pci_resource_start(pcidev, 0);
s->irq = pcidev->irq;
+
if (!request_region(s->io, ES1370_EXTENT, "es1370")) {
printk(KERN_ERR "es1370: io ports %#lx-%#lx in use\n", s->io, s->io+ES1370_EXTENT-1);
goto err_region;
}
- if (pci_enable_device(pcidev))
- goto err_irq;
+
if (request_irq(s->irq, es1370_interrupt, SA_SHIRQ, "es1370", s)) {
printk(KERN_ERR "es1370: irq %u in use\n", s->irq);
goto err_irq;
@@ -2671,7 +2679,7 @@
{
if (!pci_present()) /* No PCI bus in this machine! */
return -ENODEV;
- printk(KERN_INFO "es1370: version v0.34 time " __TIME__ " " __DATE__ "\n");
+ printk(KERN_INFO "es1370: version v0.35 time " __TIME__ " " __DATE__ "\n");
return pci_module_init(&es1370_driver);
}

diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/es1371.c linux-dj/drivers/sound/es1371.c
--- linux/drivers/sound/es1371.c Sat Feb 10 02:49:52 2001
+++ linux-dj/drivers/sound/es1371.c Sat Feb 10 03:05:52 2001
@@ -102,6 +102,7 @@
* 01.03.2000 0.26 SPDIF patch by Mikael Bouillot <[email protected]>
* Use pci_module_init
* 21.11.2000 0.27 Initialize dma buffers in poll, otherwise poll may return a bogus mask
+ * 09.02.2001 0.28 pci_enable_device before reading irq/resources <[email protected]>
*/

/*****************************************************************************/
@@ -2756,6 +2757,13 @@
spin_lock_init(&s->lock);
s->magic = ES1371_MAGIC;
s->dev = pcidev;
+
+ i = pci_enable_device(pcidev);
+ if (i) {
+ kfree(s);
+ return i;
+ }
+
s->io = pci_resource_start(pcidev, 0);
s->irq = pcidev->irq;
s->vendor = pcidev->vendor;
@@ -2771,8 +2779,6 @@
printk(KERN_ERR PFX "io ports %#lx-%#lx in use\n", s->io, s->io+ES1371_EXTENT-1);
goto err_region;
}
- if (pci_enable_device(pcidev))
- goto err_irq;
if (request_irq(s->irq, es1371_interrupt, SA_SHIRQ, "es1371", s)) {
printk(KERN_ERR PFX "irq %u in use\n", s->irq);
goto err_irq;
@@ -2942,7 +2948,7 @@
{
if (!pci_present()) /* No PCI bus in this machine! */
return -ENODEV;
- printk(KERN_INFO PFX "version v0.27 time " __TIME__ " " __DATE__ "\n");
+ printk(KERN_INFO PFX "version v0.28 time " __TIME__ " " __DATE__ "\n");
return pci_module_init(&es1371_driver);
}

diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/esssolo1.c linux-dj/drivers/sound/esssolo1.c
--- linux/drivers/sound/esssolo1.c Sat Feb 10 02:49:52 2001
+++ linux-dj/drivers/sound/esssolo1.c Sat Feb 10 03:05:52 2001
@@ -70,6 +70,7 @@
* 19.02.2000 0.14 Use pci_dma_supported to determine if recording should be disabled
* 13.03.2000 0.15 Reintroduce initialization of a couple of PCI config space registers
* 21.11.2000 0.16 Initialize dma buffers in poll, otherwise poll may return a bogus mask
+ * 09.02.2001 0.17 pci_enable_device before reading irq/resources <[email protected]>
*/

/*****************************************************************************/
@@ -2275,6 +2276,11 @@
spin_lock_init(&s->lock);
s->magic = SOLO1_MAGIC;
s->dev = pcidev;
+ i = pci_enable_device(pcidev);
+ if (i) {
+ kfree (s);
+ return i;
+ }
s->iobase = pci_resource_start(pcidev, 0);
s->sbbase = pci_resource_start(pcidev, 1);
s->vcbase = pci_resource_start(pcidev, 2);
@@ -2302,8 +2308,6 @@
printk(KERN_ERR "solo1: irq %u in use\n", s->irq);
goto err_irq;
}
- if (pci_enable_device(pcidev))
- goto err_irq;
printk(KERN_INFO "solo1: joystick port at %#lx\n", s->gpbase+1);
/* register devices */
if ((s->dev_audio = register_sound_dsp(&solo1_audio_fops, -1)) < 0)
@@ -2397,7 +2401,7 @@
{
if (!pci_present()) /* No PCI bus in this machine! */
return -ENODEV;
- printk(KERN_INFO "solo1: version v0.16 time " __TIME__ " " __DATE__ "\n");
+ printk(KERN_INFO "solo1: version v0.17 time " __TIME__ " " __DATE__ "\n");
if (!pci_register_driver(&solo1_driver)) {
pci_unregister_driver(&solo1_driver);
return -ENODEV;
diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/maestro.c linux-dj/drivers/sound/maestro.c
--- linux/drivers/sound/maestro.c Sat Feb 10 02:49:52 2001
+++ linux-dj/drivers/sound/maestro.c Sat Feb 10 03:05:52 2001
@@ -115,6 +115,9 @@
* themselves, but we'll see.
*
* History
+ * (0.14 still?) - Dave Jones <[email protected]>
+ * Reworked PCI init code to pci_enable_device before reading
+ * irq / resources.
* (still kind of v0.14) Nov 23 - Alan Cox <[email protected]>
* Add clocking= for people with seriously warped hardware
* (still v0.14) Nov 10 2000 - Bartlomiej Zolnierkiewicz <[email protected]>
@@ -3322,6 +3325,13 @@
if(((pcidev->class >> 8) & 0xffff) != PCI_CLASS_MULTIMEDIA_AUDIO)
return 0;

+ if (pci_enable_device(pcidev)) {
+ printk (KERN_ERR "maestro: pci_enable_device() failed\n");
+ return 0;
+ }
+ /* just to be sure */
+ pci_set_master(pcidev);
+
iobase = SILLY_PCI_BASE_ADDRESS(pcidev);

/* stake our claim on the iospace */
@@ -3336,9 +3346,6 @@
printk(KERN_WARNING "maestro: pci subsystem reports irq 0, this might not be correct.\n");
}

- /* just to be sure */
- pci_set_master(pcidev);
-
card = kmalloc(sizeof(struct ess_card), GFP_KERNEL);
if(card == NULL)
{
@@ -3407,19 +3414,6 @@

ess = &card->channels[0];

- if (pci_enable_device(pcidev)) {
- printk (KERN_ERR "maestro: pci_enable_device() failed\n");
- for (i = 0; i < NR_DSPS; i++) {
- struct ess_state *s = &card->channels[i];
- if (s->dev_audio != -1)
- unregister_sound_dsp(s->dev_audio);
- }
- release_region(card->iobase, 256);
- unregister_reboot_notifier(&maestro_nb);
- kfree(card);
- return 0;
- }
-
/*
* Ok card ready. Begin setup proper
*/
@@ -3432,7 +3426,7 @@
/* turn off power management unless:
* - the user explicitly asks for it
* or
- * - we're not a 2e, lesser chipps seem to have problems.
+ * - we're not a 2e, lesser chips seem to have problems.
* - we're not on our _very_ small whitelist. some implemenetations
* really dont' like the pm code, others require it.
* feel free to expand this as required.
diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/maestro3.c linux-dj/drivers/sound/maestro3.c
--- linux/drivers/sound/maestro3.c Sat Feb 10 02:49:52 2001
+++ linux-dj/drivers/sound/maestro3.c Sat Feb 10 03:05:53 2001
@@ -28,6 +28,8 @@
* Shouts go out to Mike "DJ XPCom" Ang.
*
* History
+ * v1.22 - Feb 09 2001 - Dave Jones <[email protected]>
+ * pci_enable_device cleanup
* v1.21 - Feb 04 2001 - Zach Brown <[email protected]>
* fix up really dumb notifier -> suspend oops
* v1.20 - Jan 30 2001 - Zach Brown <[email protected]>
@@ -2588,7 +2590,7 @@
u32 n;
int i;
struct m3_card *card = NULL;
- int ret = 0;
+ int ret;
int card_type = pci_id->driver_data;

DPRINTK(DPMOD, "in maestro_install\n");
@@ -2598,8 +2600,8 @@
return -ENODEV;
}

- if (pci_enable_device(pci_dev))
- return -EIO;
+ ret = pci_enable_device(pci_dev);
+ if (ret) return ret;

pci_set_master(pci_dev);

diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/sonicvibes.c linux-dj/drivers/sound/sonicvibes.c
--- linux/drivers/sound/sonicvibes.c Sat Feb 10 02:49:53 2001
+++ linux-dj/drivers/sound/sonicvibes.c Sat Feb 10 03:05:53 2001
@@ -88,6 +88,7 @@
* use Martin Mares' pci_assign_resource
* 07.02.2000 0.26 Use pci_alloc_consistent and pci_register_driver
* 21.11.2000 0.27 Initialize dma buffers in poll, otherwise poll may return a bogus mask
+ * 09.02.2001 0.28 pci_enable_device() before reading irq/resources <[email protected]>
*
*/

@@ -2470,6 +2471,9 @@
char *ddmaname;
unsigned ddmanamelen;

+ i = pci_enable_device(pcidev);
+ if (i) return i;
+
if (!RSRCISIOREGION(pcidev, RESOURCE_SB) ||
!RSRCISIOREGION(pcidev, RESOURCE_ENH) ||
!RSRCISIOREGION(pcidev, RESOURCE_SYNTH) ||
@@ -2549,8 +2553,7 @@
printk(KERN_ERR "sv: io ports %#lx-%#lx in use\n", s->iosynth, s->iosynth+SV_EXTENT_SYNTH-1);
goto err_region1;
}
- if (pci_enable_device(pcidev))
- goto err_irq;
+
/* initialize codec registers */
outb(0x80, s->ioenh + SV_CODEC_CONTROL); /* assert reset */
udelay(50);
@@ -2679,7 +2682,7 @@
{
if (!pci_present()) /* No PCI bus in this machine! */
return -ENODEV;
- printk(KERN_INFO "sv: version v0.27 time " __TIME__ " " __DATE__ "\n");
+ printk(KERN_INFO "sv: version v0.28 time " __TIME__ " " __DATE__ "\n");
#if 0
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");
diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/trident.c linux-dj/drivers/sound/trident.c
--- linux/drivers/sound/trident.c Sat Feb 10 02:49:53 2001
+++ linux-dj/drivers/sound/trident.c Sat Feb 10 03:05:50 2001
@@ -31,6 +31,8 @@
*
* History
* v0.14.6
+ * Feb 9 2001 Dave Jones <[email protected]>
+ * pci_enable_device before reading irq/ioaddr
* Nov 1 2000 Ching-Ling Lee
* Fix the bug of memory leak when swithing 5.1-channels to 2 channels.
* Add lock protection into dynamic changing format of data.
@@ -3106,8 +3108,12 @@
{
unsigned long iobase;
struct trident_card *card;
+ int err;
u8 revision;

+ err = pci_enable_device(pci_dev);
+ if (err) return err;
+
if (!pci_dma_supported(pci_dev, TRIDENT_DMA_MASK)) {
printk(KERN_ERR "trident: architecture does not support"
" 30bit PCI busmaster DMA\n");
@@ -3121,9 +3127,6 @@
iobase);
return -ENODEV;
}
-
- if (pci_enable_device(pci_dev))
- return -ENODEV;

if ((card = kmalloc(sizeof(struct trident_card), GFP_KERNEL)) == NULL) {
printk(KERN_ERR "trident: out of memory\n");
diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/via82cxxx_audio.c linux-dj/drivers/sound/via82cxxx_audio.c
--- linux/drivers/sound/via82cxxx_audio.c Sat Feb 10 02:49:53 2001
+++ linux-dj/drivers/sound/via82cxxx_audio.c Sat Feb 10 03:05:53 2001
@@ -3001,17 +3001,15 @@
if (printed_version++ == 0)
printk (KERN_INFO "Via 686a audio driver " VIA_VERSION "\n");

+ rc = pci_enable_device (pdev);
+ if (rc) return rc;
+
if (!request_region (pci_resource_start (pdev, 0),
pci_resource_len (pdev, 0),
VIA_MODULE_NAME)) {
printk (KERN_ERR PFX "unable to obtain I/O resources, aborting\n");
rc = -EBUSY;
goto err_out;
- }
-
- if (pci_enable_device (pdev)) {
- rc = -EIO;
- goto err_out_none;
}

card = kmalloc (sizeof (*card), GFP_KERNEL);
diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/ymfpci.c linux-dj/drivers/sound/ymfpci.c
--- linux/drivers/sound/ymfpci.c Sat Feb 10 02:49:53 2001
+++ linux-dj/drivers/sound/ymfpci.c Sat Feb 10 03:05:52 2001
@@ -2369,9 +2369,10 @@

int err;

- if (pci_enable_device(pcidev) < 0) {
+ err = pci_enable_device(pcidev);
+ if (err)
printk(KERN_ERR "ymfpci: pci_enable_device failed\n");
- return -ENODEV;
+ return err;
}

if ((codec = kmalloc(sizeof(ymfpci_t), GFP_KERNEL)) == NULL) {


2001-02-11 13:26:55

by Francois Romieu

[permalink] [raw]
Subject: Re: [PATCH] Sound drivers pci_enable_device clean_up

[email protected] <[email protected]> ?crit :
[...]
> diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/es1370.c linux-dj/drivers/sound/es1370.c
> --- linux/drivers/sound/es1370.c Sat Feb 10 02:49:52 2001
> +++ linux-dj/drivers/sound/es1370.c Sat Feb 10 03:05:52 2001
> @@ -117,6 +117,7 @@
> * Tim Janik's BSE (Bedevilled Sound Engine) found this
> * 07.02.2000 0.33 Use pci_alloc_consistent and pci_register_driver
> * 21.11.2000 0.34 Initialize dma buffers in poll, otherwise poll may return a bogus mask
> + * 09.02.2001 0.35 pci_enable_device before reading irq/resources <[email protected]>
> *
> * some important things missing in Ensoniq documentation:
> *
> @@ -2544,14 +2545,21 @@
> spin_lock_init(&s->lock);
> s->magic = ES1370_MAGIC;
> s->dev = pcidev;
> +
> + i = pci_enable_device(pcidev);
> + if (i) {
> + kfree(s);
> + return i;
> + }
> +

Here ac9 says:
[...]
2526 if (pcidev->irq == 0)
2527 return -1;
We will never go through the tests in pcibios_enable_irq.
[...]
2631 err_region:
2632 kfree(s);
2633 return -1;
No need to add it one more time.

--- linux-2.4.1-ac9.orig/drivers/sound/es1370.c Sat Feb 10 07:11:28 2001
+++ linux-2.4.1-ac9/drivers/sound/es1370.c Sun Feb 11 08:58:08 2001
@@ -2521,6 +2521,8 @@
mm_segment_t fs;
int i, val;

+ if (pci_enable_device(pcidev))
+ return -1;
if (!RSRCISIOREGION(pcidev, 0))
return -1;
if (pcidev->irq == 0)
@@ -2550,8 +2552,6 @@
printk(KERN_ERR "es1370: io ports %#lx-%#lx in use\n", s->io, s->io+ES1370_EXTENT-1);
goto err_region;
}
- if (pci_enable_device(pcidev))
- goto err_irq;
if (request_irq(s->irq, es1370_interrupt, SA_SHIRQ, "es1370", s)) {
printk(KERN_ERR "es1370: irq %u in use\n", s->irq);
goto err_irq;


> diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/es1371.c linux-dj/drivers/sound/es1371.c
> --- linux/drivers/sound/es1371.c Sat Feb 10 02:49:52 2001
> +++ linux-dj/drivers/sound/es1371.c Sat Feb 10 03:05:52 2001
[...]

Same remarks.

--- linux-2.4.1-ac9.orig/drivers/sound/es1371.c Sat Feb 10 07:11:28 2001
+++ linux-2.4.1-ac9/drivers/sound/es1371.c Sun Feb 11 09:02:59 2001
@@ -2733,6 +2733,8 @@
signed long tmo2;
unsigned int cssr;

+ if (pci_enable_device(pcidev))
+ return -1;
if (!RSRCISIOREGION(pcidev, 0))
return -1;
if (pcidev->irq == 0)
@@ -2771,8 +2773,6 @@
printk(KERN_ERR PFX "io ports %#lx-%#lx in use\n", s->io, s->io+ES1371_EXTENT-1);
goto err_region;
}
- if (pci_enable_device(pcidev))
- goto err_irq;
if (request_irq(s->irq, es1371_interrupt, SA_SHIRQ, "es1371", s)) {
printk(KERN_ERR PFX "irq %u in use\n", s->irq);
goto err_irq;

> diff -urN --exclude-from=/home/davej/.exclude linux/drivers/sound/esssolo1.c linux-dj/drivers/sound/esssolo1.c
> --- linux/drivers/sound/esssolo1.c Sat Feb 10 02:49:52 2001
> +++ linux-dj/drivers/sound/esssolo1.c Sat Feb 10 03:05:52 2001
[...]

Same remarks.

--- linux-2.4.1-ac9.orig/drivers/sound/esssolo1.c Sat Feb 10 07:11:28 2001
+++ linux-2.4.1-ac9/drivers/sound/esssolo1.c Sun Feb 11 09:04:58 2001
@@ -2246,6 +2246,8 @@
struct pm_dev *pmdev;
dma_addr_t dma_mask;

+ if (pci_enable_device(pcidev))
+ return -1;
if (!RSRCISIOREGION(pcidev, 0) ||
!RSRCISIOREGION(pcidev, 1) ||
!RSRCISIOREGION(pcidev, 2) ||
@@ -2302,8 +2304,6 @@
printk(KERN_ERR "solo1: irq %u in use\n", s->irq);
goto err_irq;
}
- if (pci_enable_device(pcidev))
- goto err_irq;
printk(KERN_INFO "solo1: joystick port at %#lx\n", s->gpbase+1);
/* register devices */
if ((s->dev_audio = register_sound_dsp(&solo1_audio_fops, -1)) < 0)


--
Ueimor