Linux网卡
阅读原文时间:2021年04月22日阅读:1

版权声明:本文为博主原创文章,未经博主允许不得转载。
https://blog.csdn.net/huangweiqing80/article/details/83379460

在嵌入式SOC上,通常集成有ARM核和MAC控制器,以及增加数据传输带宽的MAC专用DMA,对这种形式的SOC通常使用外接物理PHY设备的方法,外接的PHY芯片如RTL8201F、88E1111、88E6096等,集成型以太网控制器集成了MAC和PHY,如DM9000、RTL8139CP等,它们常用于没有MAC控制器的SOC上,如S3c2440。MAC控制器将收到的数据通过MII、SMII、GMII、RGMII等接口(MII接口不是一条信号线,她包含一组信号线;包含MDIO、MDC等)将数据传递给PHY。向下PHY将MAC将数据转换成模拟信号通过RJ45向外传输、或者通光模块将PHY的模拟信号转换成光信息传输。

1.以太网硬件
MAC:通常集成在ARM芯片中,功能类似于一个controller,以太网协议层数据传送给MAC,由MAC通过DMA发送到外部接口,外部接口连接着PHY。或者接收从PHY传过来的信号,DMA搬运到内存中存储。
PHY:通常是一个独立芯片,有数字和模拟两部分,也可以集成在ARM芯片内部。负责把从MAC传送过来的数据转换成可以在网线上传输的信号,或者接收网线上传输过来的信号,转换成数字信号回传给MAC。分为百兆PHY和千兆PHY。
PHY配置:自协商模式开启/关闭; 自协商关闭状态下,配置为强制full duplex, half duplex, 强制1000Mbps/100Mbps/10Mbps;WOL开启/关闭。
MAC和PHY之间的接口分为RMII接口(百兆),RGMII接口(千兆)。
RMII接口:

数据传输信号线TX0, TX1, RX0,RX1,clock
控制口:MDC, MDIO
RGMII接口:

数据传输信号线TX0-3, RXD0-3,TX clock, RX clock
控制口:MDC, MDIO
MDC,MDIO用于控制信号的传输,MAC对PHY的读写数据通过MDIO接口传送。
TX,RX,信号线用于数据信号的传输。

读写PHY寄存器时通过2个函数

phy_read()和phy_write(),

下面的博文完美的解释了MAC控制器驱动和PHY驱动,这边就不在啰嗦了。总结一下:
MAC驱动:
现在的大部分CPU中都集成了MAC控制器,例如集成的MAC控制器是stmmac,他的驱动代码在kernel/drivers/net/ethernet/stmicro/stmmac/中,当我们up网卡ifconfig eth0 up的时候会调用MAC控制器驱动的stmmac_open函数并注册mdio总线,在这个函数中他会去调用stmmac_init_phy–>phy_connect去连接PHY驱动。
PHY驱动:
PHY层的初始化,PHY驱动通常可以使用缺省内核PHY驱动,该驱动是按照ieee802.3协议规定的标准来设计的。内核缺省的PHY驱动,是通过subsys_initcall(phy_init);在系统初始化的时候自动加载的,在phy_init函数中做的动作就是mdio_bus_init()phy_driver_register(&genphy_driver);代码在kernel/drivers/net/phy/
一些特殊的phy芯片不能使用上面的通用phy驱动,需要用特殊的phy驱动,如(以icplus为例)
他的代码在kernel/drivers/net/phy/

static int __init icplus_init(void)
{
    int ret = 0;

    ret = phy_driver_register(&ip1001_driver);
    if (ret < 0)
        return -ENODEV;

    ret = phy_driver_register(&ip101a_g_driver);
    if (ret < 0)
        return -ENODEV;

    return phy_driver_register(&ip175c_driver);
}

static void __exit icplus_exit(void)
{
    phy_driver_unregister(&ip1001_driver);
    phy_driver_unregister(&ip101a_g_driver);
    phy_driver_unregister(&ip175c_driver);
}

module_init(icplus_init);
module_exit(icplus_exit);

PHY驱动 MAC驱动 Mdio_Bus驱动 一个最全的网络部分驱动加载内容
hi35xx stmmac网卡驱动源码解读
RK3288 GMAC
phy子系统分析
linux ethernet PHY 驱动
linux以太网驱动总结
Linux phy system