【问题标题】:Why interrupts are globally disabled before connecting ISR?为什么在连接 ISR 之前全局禁用中断?
【发布时间】:2015-03-13 15:14:57
【问题描述】:

我正在通过以下驱动的探测功能

/drivers/net/ethernet/smsc/smsc911x.c

在probe函数里面有注释

/* Ensure interrupts are globally disabled before connecting ISR */

    smsc911x_disable_irq_chip(dev);

    retval = request_irq(dev->irq, smsc911x_irqhandler,
                         irq_flags | IRQF_SHARED, dev->name, dev);

但我认为对于所有其他设备驱动程序来说它不是 TRUE,那么为什么它是在这个特定网络驱动程序的情况下呢?

为什么在连接 ISR 之前全局禁用中断?

【问题讨论】:

  • 我不知道@Miline 在说什么,但是如果您阅读代码,您很容易发现smsc911x_disable_irq_chip()设备端 禁用中断,这是一个很好的解决方案,如果在调用->probe() 之前,您不太确定设备处于哪个状态。
  • 是的,Andy 是对的,它禁用了设备上的中断,而不是 disable_irq() 整个 irq 行。由于 irq 线是共享的,你不能真正disable_irq()。由于它是一个共享的中断,驱动程序应该为它立即发生做好准备。因此,即使您正在将 ISR 分配给 IRQ,中断实际上也可能发生,并且在查看了您的 dev_id dev 之后,您将不得不为该中断做一些事情,至少忽略中断。

标签: linux-kernel linux-device-driver interrupt-handling smp


【解决方案1】:

评论说中断被全局禁用;但正如在下面的函数调用中,中断仅对连接到的设备 smsc 驱动程序禁用。这通常是为了避免在驱动程序准备好处理中断之前获得中断。由于这是针对以太网驱动程序的,因此很可能在接口启动期间启用中断。 有问题的代码片段在模块加载期间执行,这在接口启动之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多