2006-09-25 22:24:59

by Alan

[permalink] [raw]
Subject: [PATCH] trident oss: Switch to newer API also fix a bug

The old driver erroneously passed pdev not NULL to a second search. This
happened to always work except with pci=reverse because of chip
ordering.

Signed-off-by: Alan Cox <[email protected]>

diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.18-mm1/sound/oss/trident.c linux-2.6.18-mm1/sound/oss/trident.c
--- linux.vanilla-2.6.18-mm1/sound/oss/trident.c 2006-09-25 12:10:29.000000000 +0100
+++ linux-2.6.18-mm1/sound/oss/trident.c 2006-09-25 12:29:39.000000000 +0100
@@ -3269,7 +3269,7 @@
char temp;
struct pci_dev *pci_dev = NULL;

- pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
+ pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
pci_dev);
if (pci_dev == NULL)
return;
@@ -3283,6 +3283,8 @@
temp &= (~0x20);
temp |= 0x10;
pci_write_config_byte(pci_dev, 0x7e, temp);
+
+ pci_dev_put(pci_dev);

ch = inb(TRID_REG(card, ALI_SCTRL));
outb(ch | ALI_SPDIF_OUT_ENABLE, TRID_REG(card, ALI_SCTRL));
@@ -3490,22 +3492,25 @@
char temp = 0;
struct pci_dev *pci_dev = NULL;

- pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
+ pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
pci_dev);
if (pci_dev == NULL)
return -1;
+
pci_read_config_byte(pci_dev, 0x59, &temp);
temp &= ~0x80;
pci_write_config_byte(pci_dev, 0x59, temp);
-
- pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
- pci_dev);
+
+ pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
+ NULL);
if (pci_dev == NULL)
return -1;

pci_read_config_byte(pci_dev, 0xB8, &temp);
temp &= ~0x20;
pci_write_config_byte(pci_dev, 0xB8, temp);
+
+ pci_dev_put(pci_dev);

return 0;
}
@@ -3517,7 +3522,7 @@
char temp = 0;
struct pci_dev *pci_dev = NULL;

- pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
+ pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
pci_dev);
if (pci_dev == NULL)
return -1;
@@ -3525,13 +3530,16 @@
temp |= 0x80;
pci_write_config_byte(pci_dev, 0x59, temp);

- pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
- pci_dev);
+ pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,
+ NULL);
if (pci_dev == NULL)
return -1;
pci_read_config_byte(pci_dev, (int) 0xB8, &temp);
temp |= 0x20;
pci_write_config_byte(pci_dev, (int) 0xB8, (u8) temp);
+
+ pci_dev_put(pci_dev);
+
if (chan_nums == 6) {
dwValue = inl(TRID_REG(card, ALI_SCTRL)) | 0x000f0000;
outl(dwValue, TRID_REG(card, ALI_SCTRL));
@@ -4103,7 +4111,7 @@
unsigned int dwVal;
unsigned short wCount, wReg;

- pci_dev = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
+ pci_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533,
pci_dev);
if (pci_dev == NULL)
return -1;
@@ -4114,6 +4122,9 @@
pci_read_config_dword(pci_dev, 0x7c, &dwVal);
pci_write_config_dword(pci_dev, 0x7c, dwVal & 0xf7ffffff);
udelay(5000);
+
+ pci_dev_put(pdev);
+

pci_dev = card->pci_dev;
if (pci_dev == NULL)
@@ -4393,7 +4404,7 @@

init_timer(&card->timer);
card->iobase = iobase;
- card->pci_dev = pci_dev;
+ card->pci_dev = pci_dev_get(pci_dev);
card->pci_id = pci_id->device;
card->revision = revision;
card->irq = pci_dev->irq;
@@ -4597,9 +4608,9 @@
}
unregister_sound_dsp(card->dev_audio);

- kfree(card);
-
pci_set_drvdata(pci_dev, NULL);
+ pci_dev_put(card->pci_dev);
+ kfree(card);
}

MODULE_AUTHOR("Alan Cox, Aaron Holtzman, Ollie Lho, Ching Ling Lee, Muli Ben-Yehuda");


2006-09-26 05:44:26

by Muli Ben-Yehuda

[permalink] [raw]
Subject: Re: [PATCH] trident oss: Switch to newer API also fix a bug

On Mon, Sep 25, 2006 at 11:49:43PM +0100, Alan Cox wrote:

> The old driver erroneously passed pdev not NULL to a second search. This
> happened to always work except with pci=reverse because of chip
> ordering.

[please CC me on trident patches]

/home/muli/kernel/trident/trident.hg/sound/oss/trident.c: In function `ali_reset_5451':
/home/muli/kernel/trident/trident.hg/sound/oss/trident.c:4128: `pdev' undeclared (first use in this function)
/home/muli/kernel/trident/trident.hg/sound/oss/trident.c:4128: (Each undeclared identifier is reported only once
/home/muli/kernel/trident/trident.hg/sound/oss/trident.c:4128: for each function it appears in.)

I'll fix it up and resubmit. Thanks for the patch!

Cheers,
Muli