Messages in this thread Patch in this message | | | Date | Tue, 06 Jun 2006 12:15:48 +0200 | From | Takashi Iwai <> | Subject | Re: 2.6.17-rc5-mm3 |
| |
At Mon, 5 Jun 2006 13:06:26 -0700, Andrew Morton wrote: > > On Mon, 5 Jun 2006 15:48:45 -0400 > Dave Jones <davej@redhat.com> wrote: > > > On Sat, Jun 03, 2006 at 11:20:04PM -0700, Andrew Morton wrote: > > > > > > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.17-rc5/2.6.17-rc5-mm3/ > > > > > > - Lots of PCI and USB updates > > > > > > - The various lock validator, stack backtracing and IRQ management problems > > > are converging, but we're not quite there yet. > > > > Thought I'd try my bi-annual "poke at -mm". Results were less > > than spectacular. > > > > http://www.codemonkey.org.uk/junk/DSC00347.JPG > > First the sound driver oopsed. > > That's a bug in sound/pci/cs4281.c. > > There's a debug patch in -mm > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.17-rc5/2.6.17-rc5-mm3/broken-out/debug-shared-irqs.patch > which trips up drivers which request an IRQ before their IRQ handler is > ready to accept IRQs (they'll crash in real life if the IRQ is shared).
I guess that the bug in cs4281 is ioremap too lately issued after the registration of irq handler.
Does the patch below fix the problem?
Takashi
[PATCH] Fix possible Oops in cs4281 irq handler
Call ioremap before request_irq for avoiding possible Oops in cs4281 driver.
Signed-off-by: Takashi Iwai <tiwai@suse.de> --- diff -r 84d14cbbd713 sound/pci/cs4281.c --- a/sound/pci/cs4281.c Fri Jun 02 09:15:44 2006 +0200 +++ b/sound/pci/cs4281.c Tue Jun 06 12:11:56 2006 +0200 @@ -1379,6 +1379,13 @@ static int __devinit snd_cs4281_create(s chip->ba0_addr = pci_resource_start(pci, 0); chip->ba1_addr = pci_resource_start(pci, 1); + chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0)); + chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1)); + if (!chip->ba0 || !chip->ba1) { + snd_cs4281_free(chip); + return -ENOMEM; + } + if (request_irq(pci->irq, snd_cs4281_interrupt, SA_INTERRUPT|SA_SHIRQ, "CS4281", chip)) { snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); @@ -1387,13 +1394,6 @@ static int __devinit snd_cs4281_create(s } chip->irq = pci->irq; - chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0)); - chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1)); - if (!chip->ba0 || !chip->ba1) { - snd_cs4281_free(chip); - return -ENOMEM; - } - tmp = snd_cs4281_chip_init(chip); if (tmp) { snd_cs4281_free(chip); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |