Messages in this thread Patch in this message | | | Date | Tue, 17 Apr 2007 12:09:04 +0200 | From | Takashi Iwai <> | Subject | Re: [1/2] 2.6.21-rc7: known regressions |
| |
At Mon, 16 Apr 2007 17:44:57 -0400, Chuck Ebbert wrote: > > Adrian Bunk wrote: > > > This email lists some known regressions in Linus' tree compared to 2.6.20. > > > > Subject : snd_intel8x0: divide error: 0000 > > References : http://lkml.org/lkml/2007/3/5/252 > > Submitter : Michal Piotrowski <michal.k.k.piotrowski@gmail.com> > > Status : unknown > > > > Oops is in sound/pci/intel8x0.c::snd_intel8x0_update(), part of > the interrupt handler: > > Line 751: > > ichdev->position += step * ichdev->fragsize1; > if (! chip->in_measurement) > ichdev->position %= ichdev->size; > > ichdev->size is 0. Interrupt happened upon request_irq(). > > Does chip->in_measurement need to be reset because this is a > crashdump kernel?
No, the problem seems to be the timing of request_irq() and the initialization of hardware. The irq handler shouldn't get called there at all.
How about the patch below?
Takashi
diff -r 4b6ed4ef4820 sound/pci/intel8x0.c --- a/sound/pci/intel8x0.c Mon Apr 16 19:20:17 2007 +0200 +++ b/sound/pci/intel8x0.c Tue Apr 17 11:02:49 2007 +0200 @@ -2493,6 +2493,7 @@ static int intel8x0_resume(struct pci_de return -EIO; } pci_set_master(pci); + snd_intel8x0_chip_init(chip, 0); if (request_irq(pci->irq, snd_intel8x0_interrupt, IRQF_SHARED, card->shortname, chip)) { printk(KERN_ERR "intel8x0: unable to grab IRQ %d, " @@ -2502,7 +2503,6 @@ static int intel8x0_resume(struct pci_de } chip->irq = pci->irq; synchronize_irq(chip->irq); - snd_intel8x0_chip_init(chip, 0); /* re-initialize mixer stuff */ if (chip->device_type == DEVICE_INTEL_ICH4 && !spdif_aclink) { @@ -2862,16 +2862,7 @@ static int __devinit snd_intel8x0_create ICH_REG_ALI_INTERRUPTSR : ICH_REG_GLOB_STA; chip->int_sta_mask = int_sta_masks; - /* request irq after initializaing int_sta_mask, etc */ - if (request_irq(pci->irq, snd_intel8x0_interrupt, - IRQF_SHARED, card->shortname, chip)) { - snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); - snd_intel8x0_free(chip); - return -EBUSY; - } - chip->irq = pci->irq; pci_set_master(pci); - synchronize_irq(chip->irq); switch(chip->device_type) { case DEVICE_INTEL_ICH4: @@ -2900,6 +2891,15 @@ static int __devinit snd_intel8x0_create snd_intel8x0_free(chip); return err; } + + /* request irq after initializaing int_sta_mask, etc */ + if (request_irq(pci->irq, snd_intel8x0_interrupt, + IRQF_SHARED, card->shortname, chip)) { + snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq); + snd_intel8x0_free(chip); + return -EBUSY; + } + chip->irq = pci->irq; if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { snd_intel8x0_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/
| |