Linux 网络驱动程序 MSI 中断问题
Linux Network Driver MSI Interrupt Issue
我正在尝试为自定义硬件创建网络驱动程序。我的目标是 Xilinx Zync-7000 FPGA 设备。
我的问题是 CPU 端 MSI 中断的软件处理。我遇到的问题是,当在 PCIe 设备上触发中断时,驱动程序代码执行一次中断处理程序 returns,但是当我查看 lspci
时,PCIe IO 停止工作并且 MSI 被重置].任何未来的中断都不会被内核捕获,PCIe 开发人员几乎已经死了。我检查了硬件,没有向 FPGA 发出重置,所以我认为内核中发生了某些事情。
提前致谢。
发布这个问题后,我发现了困扰我一天多一点的问题。当我按如下方式映射 DMA 缓冲区时发生了什么:
net_priv->rx_phy_addr = dma_map_single(&pdev->dev, net_priv->rx_virt_addr,
dev->mtu, PCI_DMA_FROMDEVICE);
我稍后使用
取消映射相同的缓冲区
dma_unmap_single(&pdev->dev, net_priv->rx_phy_addr, BUFFER_SIZE,
PCI_DMA_FROMDEVICE);
我的 BUFFER_SIZE
拼写错误大小为 1MB,dev->mtu
大小为 1.5kB。似乎发生的事情是,当我取消映射 space 的 1MB 时,它开始取消映射除了 1.5bkB 之外的其他内存映射。 dma_unmap_single
完成后,PCIe IO 区域和中断区域就死了。希望我的错误可以帮助其他人。
我正在尝试为自定义硬件创建网络驱动程序。我的目标是 Xilinx Zync-7000 FPGA 设备。
我的问题是 CPU 端 MSI 中断的软件处理。我遇到的问题是,当在 PCIe 设备上触发中断时,驱动程序代码执行一次中断处理程序 returns,但是当我查看 lspci
时,PCIe IO 停止工作并且 MSI 被重置].任何未来的中断都不会被内核捕获,PCIe 开发人员几乎已经死了。我检查了硬件,没有向 FPGA 发出重置,所以我认为内核中发生了某些事情。
提前致谢。
发布这个问题后,我发现了困扰我一天多一点的问题。当我按如下方式映射 DMA 缓冲区时发生了什么:
net_priv->rx_phy_addr = dma_map_single(&pdev->dev, net_priv->rx_virt_addr,
dev->mtu, PCI_DMA_FROMDEVICE);
我稍后使用
取消映射相同的缓冲区dma_unmap_single(&pdev->dev, net_priv->rx_phy_addr, BUFFER_SIZE,
PCI_DMA_FROMDEVICE);
我的 BUFFER_SIZE
拼写错误大小为 1MB,dev->mtu
大小为 1.5kB。似乎发生的事情是,当我取消映射 space 的 1MB 时,它开始取消映射除了 1.5bkB 之外的其他内存映射。 dma_unmap_single
完成后,PCIe IO 区域和中断区域就死了。希望我的错误可以帮助其他人。