[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: hda: lost interrupt starting with 2.6.8




OK, I've spent most of the day making my poor iBook compile kernels and I've tracked down the error. I can't seem to figure out why it would happen on my machine and no one elses, at least unless it's a compiler issue (I am using gcc 3.2.2).

Somewhere between 2.6.8-rc1 and 2.6.8-rc2 interrupts just stop getting delivered.

I tracked it down to this patch to linux/arch/ppc/syslib/open_pic.c :

 /*
  *  Map an interrupt source to one or more CPUs
  */
-static void openpic_mapirq(u_int irq, u_int physmask, u_int keepmask)
+static void openpic_mapirq(u_int irq, cpumask_t physmask, cpumask_t keepmask)
 {
        if (ISR[irq] == 0)
                return;
-       if (keepmask != 0)
- physmask |= openpic_read(&ISR[irq]->Destination) & keepmask;
-       openpic_write(&ISR[irq]->Destination, physmask);
+       if (!cpus_empty(keepmask)) {
+ cpumask_t irqdest = { .bits[0] = openpic_read(&ISR[irq]->Destination) };
+               cpus_and(irqdest, irqdest, keepmask);
+               cpus_or(physmask, physmask, irqdest);
+       }
+       openpic_write(&ISR[irq]->Destination, cpus_addr(physmask)[0]);
 }

And this one:
-               openpic_mapirq(i, 1<<0, 0);
+               openpic_mapirq(i, CPU_MASK_CPU0, CPU_MASK_NONE);


Using printk's, I can see before the change I properly was writing "1" as the second argument to openpic_write, but afterwards it was 0.

It seems as though for some reason CPU_MASK_CPU0 is 0 on my kernel, rather than just a 1.

By patching the kernel to force it to write a 1 in openpic_write the kernel runs fine...

So, any ideas?  I'll be glad to try out anything else if you'd like me to.

Vince



Reply to: