This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

Linux: crash after request_irq

Guru 20755 points


Tool/software: Linux

Hello,

I am doing very simple irq registration and I get crash 
as following:
Can anyone please advise how to resolve this ?

root@localhost:~# dmesg -c
root@localhost:~# [  180.710235] Can't get irq 163

root@localhost:~#
root@localhost:~# dmesg -c
[  180.709289] fpga_prot_irq 163

[ 180.709289] fpga_prot_irq 163
[ 180.709320] ------------[ cut here ]------------
[ 180.709350] WARNING: at arch/arm/mach-omap2/omap_l3_noc.c:117 l3_interrupt_handler+0x144/0x190()
[ 180.709381] L3 custom error: MASTER:MPU TARGET:L4CFG
[ 180.709381] Modules linked in: drv_irq(O) elbit_files(O) fpga(O)
[ 180.709442] [<c001c9a8>] (unwind_backtrace+0x0/0xfc) from [<c05b7940>] (dump_stack+0x20/0x24)
[ 180.709472] [<c05b7940>] (dump_stack+0x20/0x24) from [<c0042d00>] (warn_slowpath_common+0x5c/0x74)
[ 180.709503] [<c0042d00>] (warn_slowpath_common+0x5c/0x74) from [<c0042dd4>] (warn_slowpath_fmt+0x40/0x48)
[ 180.709533] [<c0042dd4>] (warn_slowpath_fmt+0x40/0x48) from [<c0037288>] (l3_interrupt_handler+0x144/0x190)
[ 180.709564] [<c0037288>] (l3_interrupt_handler+0x144/0x190) from [<c00bc998>] (handle_irq_event_percpu+0xb8/0x28c)
[ 180.709594] [<c00bc998>] (handle_irq_event_percpu+0xb8/0x28c) from [<c00bcbb8>] (handle_irq_event+0x4c/0x6c)
[ 180.709625] [<c00bcbb8>] (handle_irq_event+0x4c/0x6c) from [<c00bfa38>] (handle_fasteoi_irq+0xd8/0x144)
[ 180.709655] [<c00bfa38>] (handle_fasteoi_irq+0xd8/0x144) from [<c00bc384>] (generic_handle_irq+0x3c/0x50)
[ 180.709686] [<c00bc384>] (generic_handle_irq+0x3c/0x50) from [<c0015090>] (handle_IRQ+0x88/0xc8)
[ 180.709716] [<c0015090>] (handle_IRQ+0x88/0xc8) from [<c00086d4>] (gic_handle_irq+0x54/0x74)
[ 180.709747] [<c00086d4>] (gic_handle_irq+0x54/0x74) from [<c05bb880>] (__irq_svc+0x40/0x70)
[ 180.709777] Exception stack(0xeb4bfcb8 to 0xeb4bfd00)
[ 180.709777] fca0: c08ebc90 60000113
[ 180.709808] fcc0: 00000001 00000000 c08ebc40 00000001 c08ebc40 eb417c40 00000000 00000000
[ 180.709838] fce0: eb76e000 eb4bfd0c eb4bfd10 eb4bfd00 c00bc58c c05baf08 60000113 ffffffff
[ 180.709869] [<c05bb880>] (__irq_svc+0x40/0x70) from [<c05baf08>] (_raw_spin_unlock_irqrestore+0x2c/0x54)
[ 180.709899] [<c05baf08>] (_raw_spin_unlock_irqrestore+0x2c/0x54) from [<c00bc58c>] (__irq_put_desc_unlock+0x24/0x48)
[ 180.709930] [<c00bc58c>] (__irq_put_desc_unlock+0x24/0x48) from [<c00c0024>] (irq_set_irq_type+0x5c/0x68)
[ 180.709960] [<c00c0024>] (irq_set_irq_type+0x5c/0x68) from [<bf0140ec>] (elbit_irq_open+0x48/0xb4 [drv_irq])
[ 180.709991] [<bf0140ec>] (elbit_irq_open+0x48/0xb4 [drv_irq]) from [<c014863c>] (chrdev_open+0x134/0x154)
[ 180.710021] [<c014863c>] (chrdev_open+0x134/0x154) from [<c01428dc>] (__dentry_open+0x1b4/0x2c0)
[ 180.710052] [<c01428dc>] (__dentry_open+0x1b4/0x2c0) from [<c0142ac4>] (nameidata_to_filp+0x64/0x74)
[ 180.710083] [<c0142ac4>] (nameidata_to_filp+0x64/0x74) from [<c01530f8>] (do_last+0x91c/0xaac)
[ 180.710113] [<c01530f8>] (do_last+0x91c/0xaac) from [<c015335c>] (path_openat+0xd4/0x3ac)
[ 180.710113] [<c015335c>] (path_openat+0xd4/0x3ac) from [<c0153734>] (do_filp_open+0x40/0x8c)
[ 180.710144] [<c0153734>] (do_filp_open+0x40/0x8c) from [<c0142538>] (do_sys_open+0xf8/0x188)
[ 180.710174] [<c0142538>] (do_sys_open+0xf8/0x188) from [<c0142610>] (sys_open+0x2c/0x30)
[ 180.710205] [<c0142610>] (sys_open+0x2c/0x30) from [<c0013f00>] (ret_fast_syscall+0x0/0x30)
[ 180.710205] ---[ end trace 784577ce70100618 ]---
[ 180.710235] Can't get irq 163

Best Regards,

Ran

  • Hello,

    can you attach your simple irq registration driver code.

    Cheers,
    --Prabhakar Lad
  • ,Hi Prabhakar,

    Yes, here it is.

    I have solved it after adding the lines with "+" mark. 

    The interesting thing is that I have other irq registration which works good without this additional line codes, but the important thing is that I don't have this crash any more.

    #define GPIO_IRQ 3

    fpga_irq = gpio_to_irq(GPIO_IRQ);

    + gpio_request(GPIO_IRQ, "fpga_interrupt");
    + gpio_direction_input(GPIO_IRQ);
    + gpio_export(GPIO_IRQ, true);

    irq_set_irq_type(fpga_irq, IRQ_TYPE_EDGE_FALLING );
    ret = request_irq(fpga_irq, sample_irq, IRQF_SHARED, DEVICE_NAME, DEV_ID);

    Thank you,

    Ran