编译 RAID 控制器设备驱动程序(linux 内核模块)

Compile RAID controller device driver (linux kernel module)

我有一个 adaptec 6805e RAID 控制器,我正在为 ubuntu 20.04(内核=v5.4)编译 linux 驱动程序,但两者之间有大量变化内核 ~4x => 5x 我不是内核开发人员。

OS:
Ubuntu LTS 20.04

Kernel:
v5.4

Adaptec 6805e:
https://storage.microsemi.com/en-us/support/raid/sas_raid/sas-6805e/

感谢任何明显的主要障碍或建议,但现在我遇到的问题是试图找到 'pci_set_dma_max_seg_size' 函数的替代品。我找到了 'dma_set_max_seg_size' 但该函数接受通用设备结构 (struct device),而 adaptec 代码正在使用似乎特定于 PCI 设备的 (struct pci_dev) 结构。

aacraid-1.2.1-52011/linit.c:3992:10: error: implicit declaration of function ‘pci_set_dma_max_seg_size’; did you mean ‘dma_set_max_seg_size’? [-Werror=implicit-function-declaration]
 3992 |  error = pci_set_dma_max_seg_size(pdev,

就像我说的那样,我们感谢任何帮助,如果这似乎是解决此问题的错误方法,我愿意接受想法——我希望能够利用最近 linux 使用稍旧的 adaptec 芯片组进行开发。

谢谢

参考资料: https://elixir.bootlin.com/linux/v5.4.128/source/include/linux

我相信自从 Linux v4.x 以来,您就成为了(或从中受益,具体取决于您的观点)对 DMA 取消映射支持进行全面改革的努力的受害者。该补丁集,尤其是链接到此处的特定补丁,显示了有义务适应此返工的 PCI 驱动程序维护者应该做的事情:

[3/3] PCI: remove pci_set_dma_max_seg_size

幸运的是,他们给出了现有驱动程序如何修补的具体示例,这还不错。您应该非常简单地至少粗略地找出此更改对应于上游补丁接受日期的 2018-19 左右的 Linux 版本,在 Adaptec 驱动程序源代码中编写一个新节以相应地更新它(例如

#if ((LINUX_VERSION_CODE > KERNEL_VERSION(5,1,0))
    <patch Adaptec's code to use dma_set_max_seg_size() here>
#else

编译驱动程序并开始使用。请注意,README 尚未明确提及对 Adaptec 6805e RAID 控制器的支持,因此如果您设法让它工作并且 post 您的补丁,您至少应该添加一条评论,说明您认为它支持该控制器现在。