如何阻止树内驱动程序/ko 绑定到设备而不禁用此类驱动程序

如何阻止树内驱动程序/ko 绑定到设备而不禁用此类驱动程序

我有一个特定的树内设备驱动程序,我想让它为设备启用(即不将其全部列入黑名单),但只是为了阻止它绑定到具有不同 PCI 设备 ID 的另一个设备。

具体情况是,我有两个网卡,RTL8168(1GbE,DID 0x8168)和RTL8125(2.5GbE,DID 0x8125)。有一个树内驱动程序r8169声称支持两者,但当 RTL8125 (2.5GbE) 设备使用此驱动程序时r8169,它的运行性能会下降(1GbE)。我使用的是 ubuntu 20.04 发行版,以防出现任何发行版特定的问题。

我希望继续对设备 RTL8168 (1GbE) 使用树内驱动程序,但对设备 RTL8125 (2.5GbE)r8169使用不同的树外驱动程序 ( )。r8125

我看到这条线声称 RTL8125 的 DID for r8169,所以从技术上讲我可以删除它然后重建内核,但我不喜欢走这条路(因为所有安全启动的麻烦)

我可以手动重新绑定驱动程序,但这不会在重新启动后继续存在。

希望听到有关覆盖此类驱动程序绑定的正确方法的建议。谢谢!以下是lspci该特定示例中这两个设备的输出。

06:00.0 0200: 10ec:8125
        Subsystem: 10ec:0123
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 32
        Region 0: I/O ports at e000 [size=256]
        Region 2: Memory at fc610000 (64-bit, non-prefetchable) [size=64K]
        Region 4: Memory at fc620000 (64-bit, non-prefetchable) [size=16K]
        Expansion ROM at fc600000 [disabled] [size=64K]
        Capabilities: <access denied>
        Kernel driver in use: r8169
        Kernel modules: r8169, r8125

0a:00.0 0200: 10ec:8168 (rev 15)
        Subsystem: 1043:8677
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 36
        Region 0: I/O ports at d000 [size=256]
        Region 2: Memory at fc504000 (64-bit, non-prefetchable) [size=4K]
        Region 4: Memory at fc500000 (64-bit, non-prefetchable) [size=16K]
        Capabilities: <access denied>
        Kernel driver in use: r8169
        Kernel modules: r8169

答案1

我就是这样做的:

  • 让系统正常启动并让它绑定8125卡和8169驱动
  • 使用某种启动脚本来解绑8125 卡的 8169 驱动程序和绑定8125 驱动程序

例子:

  • 通过命令查找卡的PCI地址
    lspci -k
    
    在此示例中,我假设该卡位于插槽中0000:01:00.0
  • 解除 PCI 设备000:01:00.1r8169驱动程序的绑定:
    echo 0000:01:00.0 > /sys/bus/pci/drivers/r8169/unbind
    
  • 然后将其绑定到r8125驱动程序:
    echo 0000:01:00.0 > /sys/bus/pci/drivers/r8125/bind
    

根据需要重新启动并重新配置网络接口(ip link upifconfig up等)。

这样,8169 卡仍与r8169驱动程序绑定,因此一切正常。

相关内容