A222开发2

发布于 2025-05-10T19:12:07+0800

记一下Linux源码阅读和Windows学习,防止之后忘了

HNS3

PF和VF

应该不会有错,PF是Physical Function,VF是Virtual Function

CQP

提交记录里写了CQP是Command Queue Pair,分为CSQ和CRQ,合理猜测分别是命令发送队列和命令接收队列。

linux4.14和最新(6.15-rc4,下同)的驱动均未使用CRQ,合理猜测是给类似SD100之类的玩意设计的?

TQP

我猜TQP是指Transmission Queue Pair,是网卡IO的队列对。

TC

copylot猜测TC是Traffic Class,不保准

RSS和TQP和TC

RSS实现要设置“TC_MODE”

我这个网卡刚启动的时候TQPCount是4个,TC是1个,合理猜测通过命令配置开启RSS后TC的数量会变成TQP数量

VPORT

VPORT大约是虚拟端口,可能和SR-IOV有关。猜测当启用了SR-IOV后,每个VF对应一个VPORT

ring和中断

ring配置在HNS3_RING_RX_RING_BASEADDR_L/H_REG

然后通过HCLGE_OPC_ADD_RING_TO_VECTOR配置关联的vector

vector开启配置在HCLGE_VECTOR_REG_BASE(见4.14的hclge_get_vector,新版的太抽象)

其中第0个索引对应第0个vector,这个是misc interrupt,似乎用在重置之类的地方

之后按顺序是vport的vector

也就是说vector 1 -> vport 0(PF) -> TQPs

typo

大约是typo

#define HCLGE_SUPPORT_1G_BIT		BIT(0)
#define HCLGE_SUPPORT_10G_BIT		BIT(1)
#define HCLGE_SUPPORT_25G_BIT		BIT(2)
#define HCLGE_SUPPORT_50G_R2_BIT	BIT(3)
#define HCLGE_SUPPORT_100G_R4_BIT	BIT(4)
/* to be compatible with exsit board */
#define HCLGE_SUPPORT_40G_BIT		BIT(5)
#define HCLGE_SUPPORT_100M_BIT		BIT(6)
#define HCLGE_SUPPORT_10M_BIT		BIT(7)
#define HCLGE_SUPPORT_200G_R4_EXT_BIT	BIT(8)
#define HCLGE_SUPPORT_50G_R1_BIT	BIT(9)
#define HCLGE_SUPPORT_100G_R2_BIT	BIT(10)
#define HCLGE_SUPPORT_200G_R4_BIT	BIT(11)

Windows

IRQL

中断的级别,分为PASSIVE_LEVEL和DISPATCH_LEVEL,DIRQL啥的

PASSIVE_LEVEL可以用PAGED内存,DISPATCH_LEVEL及更高不可以用PAGED内存

要避免在DISPATCH_LEVEL和更高的IRQL下搞什么阻塞的操作

如果用错了函数内存啥的,就会给你抛一个BSOD

SAL

源码标记语言,用来描述参数属性啥的,比如_In_表示参数用于输入,VS里可以通过静态分析根据SAL标注检查代码

NET_RING

NET_RING是netadapterCx的ring buffer,可以对应若干个tx/rx queue

其中的queue分为两种环形缓冲区,其中一个是Packet Ring,另一个是Fragment Ring。TX队列里每个packet可能有多个fragment,RX队列里似乎是一一对应的?从RX的角度看我应该不需要一个packet对应多个fragment?

ISR和DPC

ISR是中断服务例程,DPC是延迟过程调用

ISR跑在DIRQL,在这里基本上啥设施都不能用,得最小化代码。DPC跑在DISPATCH_LEVEL,能用大部分设施。

处理中断的时候,现在ISR看看是不是自己的中断,如果不是,返回FALSE,如果是,保存一下交给DPC去跑,不在DIRQL直接处理。

DPC的时候再通知NET_RING之类的东西

进展

没啥进展,研究了好久A222到底咋工作的,linux驱动里套来套去的,很难阅读,要是a222有fbsd之类的驱动就好了。

两发单抽抽出来了爱可菲,好感队都没空位了,牛牛成带头大姐了,这两天得多肝点原了。

想玩哈摸你PC,看看是不是还用的HNS3的网卡