From: Takashi Iwai <tiwai@suse.de>
To: dveatch@woh.rr.com
Cc: alsa-devel@lists.sourceforge.net
Subject: Re: 0.9.7c, cs4236b and kernel oops
Date: Thu, 16 Oct 2003 13:22:37 +0200 [thread overview]
Message-ID: <s5h65ipig02.wl@alsa2.suse.de> (raw)
In-Reply-To: <s5hwub6insq.wl@alsa2.suse.de>
[-- Attachment #1: Type: text/plain, Size: 1490 bytes --]
At Wed, 15 Oct 2003 16:21:57 +0200,
私 wrote:
>
> At Wed, 15 Oct 2003 09:20:53 -0400,
> Dennis Veatch wrote:
> >
> > On Wednesday 15 October 2003 06:33 am, Takashi Iwai wrote:
> > > At Tue, 14 Oct 2003 21:24:56 -0400,
> > >
> > > Dennis Veatch wrote:
> > > > This is a Dell GX1 with a cs4236b integrated sound card. Running kernel
> > > > version 2.4.20. I have tried recompiling the kernel any number of ways
> > > > making the sound stuff modules and part of the kernel all with the same
> > > > results. I have wiped out /lib/modules and /usr/src/linux entirely,
> > > > re-downloaded all the kernel stuff and still had the same results. If I
> > > > use the 0.9.6 version of alsa-driver there are no problems.
> > >
> > > is it a pnp device or non-pnp?
> > >
> > > there are no big changes in the cs423x codes.
> > > so the problem must be in either pnp layer or the change in the core
> > > part.
> > >
> > > if it's pnp card, please try to replace snd-pnp.o with the old one in
> > > 0.9.6.
> > >
> > >
> >
> > Actually I am not sure if its pnp or not. During boot it says "isapnp: Card
> > 'CS4236B' so I assume its pnp?
>
> yes.
>
> > There is definitely something different in snd-pnp.o between version 0.9.6 and
> > 0.9.7 on up. Tried your suggestion of copying snd-pnp.o (version 0.9.60) over
> > the same of version 0.9.7c and there was no Oops.
>
> ok, it looks like the pnp layer is the cause.
> i'll take a look.
could you try the attached patch?
Takashi
[-- Attachment #2: pnp-fix.dif --]
[-- Type: application/octet-stream, Size: 5334 bytes --]
Index: alsa-driver/support/pnp/pnp.c
===================================================================
RCS file: /suse/tiwai/cvs/alsa/alsa-driver/support/pnp/pnp.c,v
retrieving revision 1.11
diff -u -r1.11 pnp.c
--- alsa-driver/support/pnp/pnp.c 24 Sep 2003 15:59:31 -0000 1.11
+++ alsa-driver/support/pnp/pnp.c 16 Oct 2003 11:13:28 -0000
@@ -158,46 +158,51 @@
int pnp_register_card_driver(struct pnp_card_driver * drv)
{
unsigned short vendor, device;
+ unsigned short subvendor, subdevice;
unsigned int i, res = 0;
const struct pnp_card_device_id *cid;
struct pnp_card *card;
struct pnp_dev *dev;
struct pnp_card_driver_instance *ninst = NULL;
+ if (! drv->probe) {
+ printk(KERN_ERR "pnp: no probe function!\n");
+ return -EINVAL;
+ }
+
for (cid = drv->id_table; cid->id[0] != '\0'; cid++) {
- __next_card:
- card = NULL;
- do {
- __next:
- if (parse_id(cid->id, &vendor, &device) < 0)
- break;
- card = (struct pnp_card *)isapnp_find_card(vendor, device, (struct isapnp_card *)card);
- if (card) {
- if (ninst == NULL) {
- ninst = kmalloc(sizeof(*ninst), GFP_KERNEL);
- if (ninst == NULL)
- return res > 0 ? (int)res : -ENOMEM;
- memset(ninst, 0, sizeof(*ninst));
- INIT_LIST_HEAD(&ninst->list);
- }
- for (i = 0; i < PNP_MAX_DEVICES; i++)
- ninst->devs[i] = NULL;
- for (i = 0; i < PNP_MAX_DEVICES && cid->devs[i].id[0] != '\0'; i++) {
- if (parse_id(cid->devs[i].id, &vendor, &device) < 0) {
- cid++;
- goto __next_card;
- }
- dev = ninst->devs[i] = (struct pnp_dev *)isapnp_find_dev((struct isapnp_card *)card, vendor, device, NULL);
- if (dev == NULL)
- goto __next;
- if (! dev->p.active) {
- if (! (drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE)) {
- pnp_activate_dev(dev);
- }
- } else {
- if ((drv->flags & PNP_DRIVER_RES_DISABLE) == PNP_DRIVER_RES_DISABLE) {
- pnp_disable_dev(dev);
- }
+ if (parse_id(cid->id, &vendor, &device) < 0)
+ continue;
+ card = NULL;
+ while ((card = (struct pnp_card *)isapnp_find_card(vendor, device, (struct isapnp_card *)card)) != NULL) {
+ if (ninst == NULL) {
+ ninst = kmalloc(sizeof(*ninst), GFP_KERNEL);
+ if (ninst == NULL)
+ return res > 0 ? (int)res : -ENOMEM;
+ memset(ninst, 0, sizeof(*ninst));
+ INIT_LIST_HEAD(&ninst->list);
+ }
+ for (i = 0; i < PNP_MAX_DEVICES; i++)
+ ninst->devs[i] = NULL;
+ for (i = 0; i < PNP_MAX_DEVICES && cid->devs[i].id[0] != '\0'; i++) {
+ if (parse_id(cid->devs[i].id, &subvendor, &subdevice) < 0)
+ goto __next_card;
+ dev = ninst->devs[i] = (struct pnp_dev *)isapnp_find_dev((struct isapnp_card *)card, subvendor, subdevice, NULL);
+ if (dev == NULL)
+ break;
+ }
+ if (i == PNP_MAX_DEVICES || !cid->devs[i].id[0]) {
+ /* all parsed successfully */
+ /* activate or deactivate devices before probing */
+ for (i = 0; i < PNP_MAX_DEVICES; i++) {
+ dev = ninst->devs[i];
+ if (! dev)
+ break;
+ if ((drv->flags & PNP_DRIVER_RES_DISABLE) != PNP_DRIVER_RES_DISABLE)
+ dev->p.activate((struct isapnp_dev *)dev);
+ else {
+ dev->p.deactivate((struct isapnp_dev *)dev);
+ dev->p.prepare((struct isapnp_dev *)dev);
}
}
ninst->link.card = card;
@@ -209,7 +214,9 @@
res++;
}
}
- } while (card != NULL);
+ }
+ __next_card:
+ ;
}
if (ninst != NULL)
@@ -227,7 +234,8 @@
inst = list_entry(p, struct pnp_card_driver_instance, list);
if (inst->link.driver == drv) {
list_del(p);
- drv->remove(&inst->link);
+ if (drv->remove)
+ drv->remove(&inst->link);
kfree(inst);
}
}
@@ -321,14 +329,9 @@
}
}
-/* FIXME: this function cannot be called many times. the setting is cleared at each time */
int pnp_manual_config_dev(struct pnp_dev *dev, struct pnp_resource_table *res, int mode)
{
unsigned int idx;
- int err;
-
- /* prepare the isapnp */
- err = dev->p.prepare((struct isapnp_dev *)dev);
for (idx = 0; idx < PNP_MAX_IRQ; idx++)
copy_resource(&dev->p.irq_resource[idx], &res->irq_resource[idx]);
@@ -344,30 +347,8 @@
int pnp_activate_dev(struct pnp_dev *dev)
{
- struct pnp_resource_table *tmp;
- unsigned int idx;
-
if (dev->p.active)
- return 0; /* FIXME: should be -EBUSY but 2.6 pnp layer behaves like this */
-
- /* reserve the manual configuration */
- tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
- if (! tmp)
- return -ENOMEM;
- pnp_init_resource_table(tmp);
- for (idx = 0; idx < PNP_MAX_IRQ; idx++)
- copy_resource(&tmp->irq_resource[idx], &dev->p.irq_resource[idx]);
- for (idx = 0; idx < PNP_MAX_DMA; idx++)
- copy_resource(&tmp->dma_resource[idx], &dev->p.dma_resource[idx]);
- for (idx = 0; idx < PNP_MAX_PORT; idx++)
- copy_resource(&tmp->port_resource[idx], &dev->p.resource[idx]);
- for (idx = 0; idx < PNP_MAX_MEM; idx++)
- copy_resource(&tmp->mem_resource[idx], &dev->p.resource[idx+8]);
-
- /* restore the manual configuration again */
- pnp_manual_config_dev(dev, tmp, 0);
- kfree(tmp);
-
+ return 0; /* 2.6 pnp layer behaves like this */
return dev->p.activate((struct isapnp_dev *)dev);
}
@@ -376,7 +357,6 @@
if (! dev->p.active)
return 0;
return dev->p.deactivate((struct isapnp_dev *)dev);
- /* FIXME: do we need clean up the resources again? */
}
static int __init pnp_init(void)
next prev parent reply other threads:[~2003-10-16 11:22 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-10-15 1:24 0.9.7c, cs4236b and kernel oops Dennis Veatch
2003-10-15 10:33 ` Takashi Iwai
2003-10-15 13:20 ` Dennis Veatch
2003-10-15 14:21 ` Takashi Iwai
2003-10-16 11:22 ` Takashi Iwai [this message]
2003-10-16 11:40 ` Takashi Iwai
2003-10-16 12:46 ` Stumbles
2003-10-16 12:54 ` Takashi Iwai
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=s5h65ipig02.wl@alsa2.suse.de \
--to=tiwai@suse.de \
--cc=alsa-devel@lists.sourceforge.net \
--cc=dveatch@woh.rr.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.