我正在尝试为自定义硬件创建网络驱动程序。我的目标是Xilinx Zync-7000 FPGA器件。
我的问题是CPU端的MSI中断的软件处理。我遇到的问题是当在PCIe设备上触发中断时,驱动程序代码执行中断处理程序一次并返回,但是当我查看lspci
时,PCIe IO停止工作并重置MSI。任何未来的中断都不会被内核捕获,并且PCIe dev几乎已经死了。我检查了硬件,没有给FPGA发出任何重置,所以我认为内核中正在发生一些事情。
提前谢谢。
答案 0 :(得分:3)
在发布这个问题之后,我发现了一个困扰我一天多一点的问题。发生的事情是我按如下方式映射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。似乎发生的事情是,当我取消映射1MB的空间时,除了1.5bkB之外,它还开始取消映射其他内存映射。只要dma_unmap_single
完成PCIe IO区域以及中断区域就会死亡。希望我的错误可以帮助其他人。