dwmac是众多网卡驱动中的一个通用驱动系列,里面包含了大部分能用到的多种系列网卡
- stm32
- sunxi
- ipq806x
- lpc18xx
- sti
- fpga
- …
其实本身这套驱动系列架构较为成熟,已将各种操作抽象成类,但是对于一个普通的项目来说并不需要支持如此多的网卡,故需要针对不同的硬件进行优化。
准确地来说stmmac层封装了一些纯底层接口并方便上层调用,但是一个简单的项目并不需要如此多的配置,也并不需要单独开辟一个结构体为其赋值等。
这套驱动的入口就是各种dwmac-xxxxxx的网卡类型入口,需要传入一些平台数据(共有数据),并在platform层写入一些具体硬件类型的系列数据(半共有数据),之后将上述数据向下发送至stmmac层进行转化,上述数据被填充至网卡驱动的私有结构体中(私有数据),随后,stmmac层的各类函数对私有结构体中的数据进行读写,这些操作最后都会在底层寄存器中实现。
一个项目很少能用到多种类型的网卡,故需要删减。
stmmac层以上的数据最后都会在网卡私有结构体中体现,所以最先砍掉的就应该是平台和入口的一些赋值操作。
正常情况下,赋值操作都会写一些固定的值进去,所以可以根据硬件类型写一些共有数据进去,至于半共有数据,可以根据用户配置进行删减。
例如:流量控制、巨型帧等,大部分应用可能并不会用到,这时添加上未免有些臃肿。
结构体platfromData就是共有数据,并且其实priv中的ioaddr同样也是共有数据,准确地来说它是一种用来联系用户侧和底层的媒介。大部分的底层的传参都需要它。
因此ioaddr可以从mac_device_info的pcsr中拿出来,直接弄成全局变量也是可以的。
像上述图片中的调用mac_device_info参数的API,只用到了pcsr,这种传参未免有些复杂。
dma与core部分是纯底层中的核心,里面包含了大部分的常用功能,所以要尽可能的保留。
还有就是版本号。
版本号其实是为了不同硬件中的兼容而设计的,如果自己的项目已知版本号,那么下面的版本号判断分支可以完全撤掉,如果并不知道,也可以使用分支预测,减小系统开销。
static int stmmac_change_mtu