我正在编写为设备中断提供服务的设备驱动程序。该设备只有一个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设备都不相关。这个数字到底是什么意思?
可能需要注意的一些事情,由于设备的限制,我实际上是在主机端手动触发此中断。我正在从功能结构中读取中断地址和数据,然后指示设备将数据写入该地址。
我将如何进行进一步调试?我的描述中有什么可疑之处吗?任何帮助将不胜感激。
答案 0 :(得分:0)
当您输入cat / proc / interrupts时,是否显示此特定的irq?也许您可以从那里获得正确的irq号码,以及其他信息,例如它的连接位置以及与此中断线路相关的驱动程序!
答案 1 :(得分:0)
因此,问题最终出在事物的顺序上。为了手动创建中断,我在分配中断之前已经读取了中断地址和数据的配置空间。虽然很明显,但为设备分配irq向量会将适当的数据写入配置空间。因此,在消息数据字段中使用预先存在的值将指向不存在的irq向量。