At Thu, 19 Apr 2007 22:03:16 +0200,
Michal Piotrowski wrote:
>
> Hi Takashi,
>
> Takashi Iwai napisał(a):
> > 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 <[email protected]>
> >>> 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?
(snip)
>
> This patch solves the problem for me. Thanks!
Good to hear! I forgot the patch description and sign-off, so here it
is again:
[PATCH] ALSA: intel8x0 - Fix Oops in crash kernel
When intel8x0 driver is loaded in the crash kernel, it gets Oops
occasionally. This is because the irq handler gets called before
the proper hardware initialization. Now defer it after
snd_intel8x0_chip_init().
(reference: http://lkml.org/lkml/2007/3/5/252)
Signed-off-by: Takashi Iwai <[email protected]>
---
sound/pci/intel8x0.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff -r 202af90f8e68 -r a3f021fd290c sound/pci/intel8x0.c
--- a/sound/pci/intel8x0.c Thu Apr 19 15:22:56 2007 +0200
+++ b/sound/pci/intel8x0.c Fri Apr 20 12:30:28 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]