使用来自pci_irq_vector(9)函数的irq注册中断会导致“此函数没有irq处理程序”?

问题描述 投票:1回答:2

我正在编写一个设备驱动程序来处理来自设备的中断。该器件只有一个MSI中断向量,因此我用pci_irq_vector(dev,0)轮询irq,接收irq,然后注册中断。这在以下代码片段中显示(相当于我减去错误处理的内容):

retval = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_MSI);
irq = pci_irq_vector(dev, 0);
retval = request_irq(irq, irq_fnc, 0, "name", dev);

这一切都成功完成,没有任何警告(至少使用dmesg)。然而,当中断进来时,我得到了错误。

kernel:do_IRQ: 0.xxx No irq handler for this vector (irq -1)

xxx似乎是一个任意数字,每次加载驱动程序时都会更改,但与irq数字不匹配。相反,它匹配从MSI中断发送的消息数据的最后两个十六进制数字,从MSI功能结构读取。试图请求这个数字的irq返回EINVAL,我认为这意味着它与任何PCI设备无关。这个数字究竟意味着什么?

可能需要注意的重要事项是,由于设备的限制,我实际上是从主机端手动触发此中断。我正从能力结构中读取中断地址和数据,然后指示设备将数据写入该地址。

我该如何进一步调试呢?我的描述中有什么东西可疑吗?任何帮助,将不胜感激。

linux-kernel linux-device-driver pci-e
2个回答
0
投票

当你输入cat / proc / interrupts时,这个特殊的irq会显示吗?也许您可以从那里获得正确的irq编号,以及其他信息,例如它的附加位置以及与此中断线相关的驱动程序!


0
投票

所以这个问题最终成了事物的顺序。为了手动创建中断,我在分配中断之前已经读取了中断地址和数据的配置空间。虽然回想起来很明显,但为设备分配irq向量会将适当的数据写入配置空间。因此,使用消息数据字段中的预先存在的值将指向不存在的irq向量。

© www.soinside.com 2019 - 2024. All rights reserved.