【发布时间】: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_iddev之后,您将不得不为该中断做一些事情,至少忽略中断。
标签: linux-kernel linux-device-driver interrupt-handling smp