代码之家  ›  专栏  ›  技术社区  ›  ThisGuy

Linux网络驱动程序MSI中断问题

  •  3
  • ThisGuy  · 技术社区  · 10 年前

    我正在尝试为自定义硬件创建网络驱动程序。我的目标是Xilinx Zync-7000 FPGA设备。

    我的问题是CPU端MSI中断的软件处理。我遇到的问题是,当在PCIe设备上触发中断时,驱动程序代码执行一次中断处理程序并返回,但当我查看 lspci 。任何未来的中断都不会被内核捕捉到,PCIe设备几乎完全失效。我检查了硬件,没有向FPGA发出重置,所以我认为内核中发生了什么。

    提前谢谢。

    1 回复  |  直到 10 年前
        1
  •  3
  •   ThisGuy    10 年前

    发布这个问题后,我发现了困扰我一天多的问题。当我将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区域以及中断区域。希望我的错误能帮助别人。