Looking at linux-2.6.10 I notice that the function
startup_match20_interrupt() has been mofified as follow:
#ifdef CONFIG_PM
-void startup_match20_interrupt(void)
+void startup_match20_interrupt(void (*handler)(int, void *, struct
pt_regs *))
{
+ static struct irqaction action;
+ /* This is a big problem.... since we didn't use request_irq
+ when kernel/irq.c calls probe_irq_xxx this interrupt will
+ be probed for usage. This will end up disabling the device :(
+
+ Give it a bogus "action" pointer -- this will keep it from
+ getting auto-probed!
+
+ By setting the status to match that of request_irq() we
+ can avoid it. --cgray
+ */
+ action.dev_id = handler;
+ action.flags = 0;
+ action.mask = 0;
+ action.name = "Au1xxx TOY";
+ action.handler = handler;
+ action.next = NULL;
+
+ irq_desc[AU1000_TOY_MATCH2_INT].action = &action;
+ irq_desc[AU1000_TOY_MATCH2_INT].status
+ &= ~(IRQ_DISABLED | IRQ_AUTODETECT | IRQ_WAITING |
IRQ_INPROGRESS);
+
local_enable_irq(AU1000_TOY_MATCH2_INT);
}
#endif
and the irq dispatcher has been modified as follow:
irq = au_ffs(intc0_req1) - 1;
intc0_req1 &= ~(1<<irq);
-#ifdef CONFIG_PM
- if (irq == AU1000_TOY_MATCH2_INT) {
- mask_and_ack_rise_edge_irq(irq);
- counter0_irq(irq, NULL, regs);
- local_enable_irq(irq);
- }
- else
-#endif
- {
- do_IRQ(irq, regs);
- }
+ do_IRQ(irq, regs);
}
Well, running old code on my au1100 I have no problem but using new one I
got:
Linux version 2.6.12 (giometti@vvonth) (gcc version 3.4.3) #29 Tue Jul 12
19:41:24 CEST 2005
CPU revision is: 02030204
AMD Alchemy WWPC Board
(PRId 02030204) @ 396MHZ
BCLK switching enabled!
Determined physical RAM map:
memory: 04000000 @ 00000000 (usable)
Built 1 zonelists
Kernel command line: console=ttyS0,115200 root=/dev/nfs rw
nfsroot=192.168.32.254:/home/develop/embedded/mipsel/distro/_geek
ip=192.168.32.23:192.168.32.254::255.255.255.0:wwpc:eth0:off
Primary instruction cache 16kB, physically tagged, 4-way, linesize 32 bytes.
Primary data cache 16kB, 4-way, linesize 32 bytes.
Synthesized TLB refill handler (20 instructions).
Synthesized TLB load handler fastpath (32 instructions).
Synthesized TLB store handler fastpath (32 instructions).
Synthesized TLB modify handler fastpath (31 instructions).
PID hash table entries: 512 (order: 9, 8192 bytes)
calculating r4koff... 00060ae0(396000)
CPU frequency 396.00 MHz
Console: colour dummy device 80x25
Break instruction in kernel code in arch/mips/kernel/traps.c::do_bp, line
629[#1]:
Cpu 0
$ 0 : 00000000 10007c00 00000000 000f41fa
$ 4 : 80462000 000f41fa 00000000 00000000
$ 8 : 26aa8a40 000f41fa 80462000 00000000
$12 : 0000006e fffffffa ffffffff 0000000a
$16 : 00000af8 804d0000 80461ef0 804d0000
$20 : 80461e18 80462000 00000002 00000000
$24 : 00000001 80461dea
$28 : 80460000 80461e08 83fc92b8 8010277c
Hi : 000f41fa
Lo : 26aa8a40
epc : 80148b28 run_posix_cpu_timers+0x804/0x86c Not tainted
ra : 8010277c counter0_irq+0x98/0x168
Status: 10007c03 KERNEL EXL IE
Cause : 00808024
PrId : 02030204
Modules linked in:
Process swapper (pid: 0, threadinfo=80460000, task=80462000)
Stack : 000003f4 000003f4 38313932 804c8934 80461e18 80461e18 00000000
00000000
80462000 00000000 00000af8 804d0000 80461ef0 804d0000 00000b1b
00000011
00000002 00000000 83fc92b8 8010277c 804de270 00000013 804de270
80461ec8
804cf9d4 00000000 00000000 00000001 80461ef0 80150964 804e0000
80435d90
00000002 10007c00 804a4220 00000011 804cf9d4 804e0000 80461ef0
83f43c00
...
Call Trace:
[<8010277c>] counter0_irq+0x98/0x168
[<80150964>] handle_IRQ_event+0x7c/0x134
[<80150b24>] __do_IRQ+0x108/0x194
[<804be264>] uart_set_options+0xe0/0x178
[<8010600c>] do_IRQ+0x1c/0x34
[<80101390>] au1000_IRQ+0x150/0x1a0
[<801292d8>] __call_console_drivers+0x80/0xac
[<80416fc4>] _etext+0x0/0x8f03c
[<804a6700>] start_kernel+0x11c/0x254
[<804a6710>] start_kernel+0x12c/0x254
[<804a6134>] unknown_bootoption+0x0/0x310
Code: aea30140 08052103 aea4013c <0200000d> 080520de 8ea4013c 2404001e
24050001 0c04e2c9
Kernel panic - not syncing: Aiee, killing interrupt handler!
I suppose the problem is when function startup_match20_interrupt()
tries to install the irq handler for the counter0.
Why did you modify such function?
Where could be the problem in the new code?
Should we come back to the old code? ;-p
Thanks,
Rodolfo
--
GNU/Linux Solutions e-mail: giometti@linux.it
Linux Device Driver giometti@enneenne.com
Embedded Systems home page: giometti.enneenne.com
UNIX programming phone: +39 349 2432127
signature.asc
Description: Digital signature
|