华为以太网设备驱动 (hinic3) 系列的 Linux 内核驱动

概述

hinic3 是用于数据中心的网络接口卡 (NIC)。它支持一系列链路速度设备(10GE、25GE、100GE 等)。hinic3 设备可以具有多种物理形式:LOM(主板上局域网)NIC、PCIe 标准 NIC、OCP(开放计算项目)NIC 等。

hinic3 驱动程序支持以下功能:- IPv4/IPv6 TCP/UDP 校验和卸载 - TSO(TCP 分段卸载)、LRO(大接收卸载)- RSS(接收端缩放)- MSI-X 中断聚合配置和中断适配。- SR-IOV(单根 I/O 虚拟化)。

内容

  • 支持的 PCI 供应商 ID/设备 ID

  • Hinic3 驱动程序的源代码结构

  • 管理接口

支持的 PCI 供应商 ID/设备 ID

19e5:0222 - hinic3 PF/PPF 19e5:375F - hinic3 VF

主物理功能 (PPF) 负责整个网卡的管理。例如,NIC 和主机之间的时钟同步。任何 PF 都可以用作 PPF。 PPF 是动态选择的。

Hinic3 驱动程序的源代码结构

hinic3_pci_id_tbl.h

支持的设备 ID

hinic3_hw_intf.h

硬件和驱动程序之间的接口

hinic3_queue_common.[ch]

NIC 队列的通用结构和方法

hinic3_common.[ch]

Linux 中内存操作的封装

hinic3_csr.h

BAR 中的寄存器定义

hinic3_hwif.[ch]

BAR 的接口

hinic3_eqs.[ch]

AEQ 和 CEQ 的接口

hinic3_mbox.[ch]

邮箱的接口

hinic3_mgmt.[ch]

基于邮箱和 AEQ 的管理接口

hinic3_wq.[ch]

工作队列数据结构和接口

hinic3_cmdq.[ch]

命令队列用于将命令发布到硬件

hinic3_hwdev.[ch]

硬件结构和方法抽象

hinic3_lld.[ch]

辅助驱动程序适配层

hinic3_hw_comm.[ch]

通用硬件操作的接口

hinic3_mgmt_interface.h

固件和驱动程序之间的接口

hinic3_hw_cfg.[ch]

硬件配置的接口

hinic3_irq.c

中断请求

hinic3_netdev_ops.c

注册到 Linux 内核栈的操作

hinic3_nic_dev.h

NIC 结构和方法抽象

hinic3_main.c

主 Linux 内核驱动程序

hinic3_nic_cfg.[ch]

NIC 服务配置

hinic3_nic_io.[ch]

TX 和 RX 的管理平面接口

hinic3_rss.[ch]

接收端缩放 (RSS) 的接口

hinic3_rx.[ch]

发送接口

hinic3_tx.[ch]

接收接口

hinic3_ethtool.c

ethtool 操作 (ops) 的接口

hinic3_filter.c

MAC 地址的接口

管理接口

异步事件队列 (AEQ)

AEQ 通过描述符队列接收来自硬件的高优先级事件。每个描述符的大小固定为 64 字节。 AEQ 可以接收请求的或非请求的事件。每个设备、VF 或 PF 最多可以有 4 个 AEQ。每个 AEQ 都与一个专用的 IRQ 相关联。 AEQ 可以接收多种类型的事件,但实际上 hinic3 驱动程序忽略除 2 个邮箱相关事件之外的所有事件。

邮箱

邮箱是 hinic3 驱动程序和硬件之间的通信机制。每个设备都有一个独立的邮箱。驱动程序可以使用邮箱向管理发送请求。驱动程序通过 AEQ(使用事件 HINIC3_AEQ_FOR_MBOX)接收邮箱消息,例如对请求的响应。由于邮箱数据寄存器的大小有限,因此邮箱消息是分段发送的。

每个设备都可以使用其邮箱将请求发布到固件。邮箱也可以用于在 PF 和其 VF 之间发布请求和响应。

完成事件队列 (CEQ)

CEQ 的实现与 AEQ 相同。它通过 32 位的固定大小描述符接收来自硬件的完成事件。每个设备最多可以有 32 个 CEQ。每个 CEQ 都有一个专用的 IRQ。 CEQ 仅接收请求的事件,这些事件是对来自驱动程序的请求的响应。 CEQ 可以接收多种类型的事件,但实际上 hinic3 驱动程序忽略除 HINIC3_CMDQ 之外的所有事件,该事件表示先前在 cmdq 上发布的命令已完成。

命令队列 (cmdq)

每个 cmdq 都有一个专用的工作队列,命令发布在该队列上。工作队列上的命令是大小为 64 字节的固定大小描述符。命令的完成将使用携带该命令的描述符中的 ctrl 位来指示。命令完成的通知也将通过 CEQ 上的事件提供。每个设备都有 4 个命令队列,它们被初始化为一个集合(称为 cmdqs),每个队列都有自己的类型。 Hinic3 驱动程序仅使用 HINIC3_CMDQ_SYNC 类型。

工作队列 (WQ)

工作队列是固定大小 WQE 的逻辑数组。该数组可以使用间接表分布在多个非连续页面上。工作队列由 I/O 队列和命令队列使用。

全局函数 ID

每个函数(PF 或 VF)在设备中都有一个唯一的序号标识。许多管理命令(mbox 或 cmdq)都包含此 ID,以便硬件可以将命令效果应用于正确的函数。

PF 允许通过指定 VF 的 ID 将管理命令发布到从属 VF。 VF 必须提供自己的 ID。如果来自 VF 的命令包含错误的 ID,则硬件中的反欺骗会导致命令失败。