翼度科技»论坛 云主机 LINUX 查看内容

GMAC网卡相关介绍与分析

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
GMAC网卡相关介绍与分析


目录

环境描述


MII

本节信息来源
MII


MII共16根线,数据位宽4(tx rx各4根信号线),TX_CLK RX_CLK均是PHY提供的。
TX_ER(Transmit Error): 发送数据错误提示信号,同步于TX_CLK,高电平有效,表示TX_ER有效期内传输的数据无效。对于10Mbps速率下,TX_ER不起作用;
    TX_EN(Transmit Enable): 发送使能信号,只有在TX_EN有效期内传的数据才有效;
    TX_CLK:发送参考时钟,100Mbps速率下,时钟频率为25MHz,10Mbps速率下,时钟频率为2.5MHz。注意,TX_CLK时钟的方向是从PHY侧指向MAC侧的,因此此时钟是由PHY提供的。
    TXD(Transmit Data)[3:0]:数据发送信号,共4根信号线;
    RX_ER(Receive Error): 接收数据错误提示信号,同步于RX_CLK,高电平有效,表示RX_ER有效期内传输的数据无效。对于10Mbps速率下,RX_ER不起作用;
    RX_DV(Reveive Data Valid): 接收数据有效信号,作用类型于发送通道的TX_EN;
    RXD(Receive Data)[3:0]:数据接收信号,共4根信号线;
    RX_CLK:接收数据参考时钟,100Mbps速率下,时钟频率为25MHz,10Mbps速率下,时钟频率为2.5MHz。RX_CLK也是由PHY侧提供的。
    CRS:Carrier Sense,载波侦测信号,不需要同步于参考时钟,只要有数据传输,CRS就有效,另外,CRS只有PHY在半双工模式下有效;
    COL:Collision Detectd,冲突检测信号,不需要同步于参考时钟,只有PHY在半双工模式下有效。
    MII接口一共有16根线。
RMII


RMII即 Reduced MII,是MII的简化板,共8根线,数据位宽2。
CLK_REF:是由外部时钟源提供的50MHz参考时钟,与MII接口不同,MII接口中的接收时钟和发送时钟是分开的,而且都是由PHY芯片提供给MAC芯片的。这里需要注意的是,由于数据接收时钟是由外部晶振提供而不是由载波信号提取的,所以在PHY层芯片内的数据接收部分需要设计一个FIFO,用来协调两个不同的时钟,在发送接收的数据时提供缓冲。PHY层芯片的发送部分则不需要FIFO,它直接将接收到的数据发送到MAC就可以了。
GMII


同MII,但数据位宽8位,共24根信号线,其中GTX_CLK由MAC侧提供,大多数GMII兼容MII。
RGMII

phy 如果工作在含有RGMII 接口的模式,按照业内惯例,tx clk delay 由MAC 来完成;rx clk delay 由phy 来完成。所以一般PHY芯片的rx clk delay默认是 2ns, tx clk delay默认是750ps。
来源https://blog.csdn.net/fangye945a/article/details/121109158

RGMII即Reduced GMII,是GMII的简化版本,共14根信号线,位宽为4,该时钟上升沿下降沿均采集数据。
SGMII


SGMII即Serial GMII,串行GMII,收发各一对差分信号线,时钟频率625MHz,在时钟信号的上升沿和下降沿均采样,参考时钟RX_CLK由PHY提供,是可选的,主要用于MAC侧没有时钟的情况,一般情况下,RX_CLK不使用。收发都可以从数据中恢复出时钟。大多数MAC芯片的SGMII接口都可以配置成SerDes接口(在物理上完全兼容,只需配置寄存器即可),直接外接光模块,而不需要PHY层芯片,此时时钟速率仍旧是625MHz。
GMAC网卡信息获取方法

获取GMAC网卡信息
  1.  xqzhang@greatwall:~$ sudo find /sys/ -name "*stmmac*"
  2. /sys/bus/platform/drivers/stmmaceth
  3. /sys/bus/mdio_bus/devices/stmmac-0:04
  4. /sys/bus/mdio_bus/drivers/Atheros 8035 ethernet/stmmac-0:04
  5. /sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0
  6. /sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0/stmmac-0:04
  7. /sys/class/mdio_bus/stmmac-0
  8. /sys/kernel/debug/stmmaceth
  9. /sys/module/dwmac_generic/drivers/platform:stmmaceth
  10. /sys/module/stmmac
  11. /sys/module/stmmac/holders/stmmac_platform
  12. /sys/module/stmmac_platform
复制代码
由上述信息可知,phy驱动为Atheros 8035 ethernet,该设备为平台设备,设备目录为/sys/devices/platform/FTGM0001:00/
查看PHY工作接口模式
  1. cat /sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0/stmmac-0:04/phy_interface
  2. rgmii
复制代码
获取PHY ID
  1. cat /sys/devices/platform/FTGM0001\:00/mdio_bus/stmmac-0/stmmac-0\:04/phy_id
  2. 0x004dd072
复制代码
MAC芯片

读写MAC寄存器的方法

devmem2: https://gitee.com/Lematin_SZ/ARM_Linux_Debug_Tools/blob/master/devmem2/devmem2.c
  1. Usage:  devmem2 { address } [ type [ data ] ]
  2.         address : memory address to act upon
  3.         type    : access operation type : [b]yte, [h]alfword, [w]ord
  4.         data    : data to be written
复制代码
对于FT2000/4核,MAC芯片是包含在CPU核内的,因此根据FT-2000/4+软件编程手册.pdf手册可以拿到MAC芯片的物理地址,用户态直接映射该物理地址可直接进行读写。
此外该物理地址也可以从设备树 ACPI固件中读取。

读MAC寄存器


读mac地址0寄存器
  1. xqzhang@greatwall:~$ ifconfig enaftgm1i0
  2. enaftgm1i0 Link encap:以太网  硬件地址 00:07:3e:9a:79:d6  
  3.           inet 地址:172.25.83.26  广播:172.25.87.255  掩码:255.255.248.0
复制代码
  1. xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x40))  h
  2. [sudo] xqzhang 的密码:
  3. /dev/mem opened.
  4. Memory mapped at address 0x7fabbb3000.
  5. Value at address 0x2820C040 (0x7fabbb3040): 0xD679
  6. xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x44))  h                                                         
  7. /dev/mem opened.
  8. Memory mapped at address 0x7f974b8000.
  9. Value at address 0x2820C044 (0x7f974b8044): 0x700
  10. xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x46))  h                                                         
  11. /dev/mem opened.
  12. Memory mapped at address 0x7fa3e7c000.
  13. Value at address 0x2820C046 (0x7fa3e7c046): 0x9A3E
复制代码
写MAC寄存器

写0x48寄存器
  1. xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x48))  h 0x0001
  2. /dev/mem opened.
  3. Memory mapped at address 0x7f9e52e000.
  4. Value at address 0x2820C048 (0x7f9e52e048): 0xFFFF
  5. Written 0x1; readback 0x1
  6. xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x48))  h
  7. /dev/mem opened.
  8. Memory mapped at address 0x7facc88000.
  9. Value at address 0x2820C048 (0x7facc88048): 0x1
复制代码
MAC环回配置

环回寄存器在MAC控制寄存器0第12bit.

读mac控制寄存器
  1. xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x0))  w
  2. [sudo] xqzhang 的密码:
  3. /dev/mem opened.
  4. Memory mapped at address 0x7f855a9000.
  5. Value at address 0x2820C000 (0x7f855a9000): 0x614C8C
  6. xqzhang@greatwall:~$ 0000 0000 1010 0001 0100 1100 1000 1100
复制代码
配置bit12为1
  1. xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x0))  w 0x615c8c
  2. /dev/mem opened.
  3. Memory mapped at address 0x7f9b982000.
  4. Value at address 0x2820C000 (0x7f9b982000): 0x614C8C
  5. Written 0x615C8C; readback 0x615C8C
复制代码
arp配置不存在的ip MAC地址为本机MAC,注意该mac地址必须与mac芯片的mac一致
  1. sudo arp -s 172.25.82.241 00:07:3e:9a:79:d6
复制代码
抓包并用ping验证

PHY芯片

CPU读写phy方法(待更新)

mdio读写phy寄存器

phytool: https://github.com/wkz/phytool.git 该方式需要网卡驱动提供支持
  1. phytool read  IFACE/ADDR/REG
  2. phytool write IFACE/ADDR/REG <0-0xffff>
  3. phytool print IFACE/ADDR[/REG]
  4. Clause 22:
  5. ADDR := <0-0x1f>
  6. REG  := <0-0x1f>
  7. Clause 45 (not supported by all MDIO drivers):
  8. ADDR := PORT:DEV
  9. PORT := <0-0x1f>
  10. DEV  := <0-0x1f>
  11. REG  := <0-0xffff>
复制代码
其中ADDR的获取方式可参考获取GMAC网卡信息章节,或者使用如下命令获取ethtool  enaftgm1i0  | grep PHYAD
  1. xqzhang@greatwall:/sys/devices/platform/FTGM0001:00$ ethtool  enaftgm1i0  | grep PHYAD
  2.         PHYAD: 4
复制代码
读phy设备基础信息
  1. xqzhang@greatwall:~/phytool$ sudo ./phytool enaftgm1i0/00:04/
  2. ieee-phy: id:0x004dd072
  3.    ieee-phy: reg:BMCR(0x00) val:0x1000
  4.       flags:          -reset -loopback +aneg-enable -power-down -isolate -aneg-restart -collision-test
  5.       speed:          10-half
  6.    ieee-phy: reg:BMSR(0x01) val:0x796d
  7.       capabilities:   -100-b4 +100-f +100-h +10-f +10-h -100-t2-f -100-t2-h
  8.       flags:          +ext-status +aneg-complete -remote-fault +aneg-capable +link -jabber +ext-register
复制代码
  1. xqzhang@greatwall:~/phytool$ sudo ./phytool enaftgm1i0/0x4/
  2. ieee-phy: id:0x004dd072
  3.    ieee-phy: reg:BMCR(0x00) val:0x1000
  4.       flags:          -reset -loopback +aneg-enable -power-down -isolate -aneg-restart -collision-test
  5.       speed:          10-half
  6.    ieee-phy: reg:BMSR(0x01) val:0x796d
  7.       capabilities:   -100-b4 +100-f +100-h +10-f +10-h -100-t2-f -100-t2-h
  8.       flags:          +ext-status +aneg-complete -remote-fault +aneg-capable +link -jabber +ext-register
复制代码

读PHY设备寄存器
  1. xqzhang@greatwall:~/phytool$ sudo ./phytool read enaftgm1i0/0x04/0x02
  2. ieee-phy: reg:0x02 val:0x004d
  3. xqzhang@greatwall:~/phytool$ sudo ./phytool read enaftgm1i0/0x4/0x03
  4. ieee-phy: reg:0x03 val:0xd072
复制代码
写PHY设备寄存器
  1. root@greatwall:/home/xqzhang/phytool# sudo ./phytool write  enaftgm1i0/0x04/0x04 0x1de1                                
  2. root@greatwall:/home/xqzhang/phytool# sudo ./phytool read enaftgm1i0/0x04/0x04
  3. ieee-phy: reg:0x04 val:0x1de1
复制代码
Atheros 8035 强制千兆百兆十兆配置方式



首先需要bit12=0关闭自协商,然后根据bit6 bit13强制配置速率。
千兆配置sudo ./phytool write  enaftgm1i0/0x4/0x0 0x0140
百兆配置sudo ./phytool write  enaftgm1i0/0x4/0x0 0x2100
十兆配置sudo ./phytool write  enaftgm1i0/0x4/0x0 0x0100
实际测试 强制千兆无法up,百兆千兆需要等很久才能ping通。
PHY环回配置

环回寄存器在phy控制寄存器0第14bit.

10M 速率环回
  1. sudo ./phytool write enaftgm1i0/0x4/0x0 0x4100
复制代码
经测试在本节环境下,只有10M 环回才能正常UP
GMAC网卡驱动分析

查看Kconfig文件,发现该驱动支持Platform和多种SOC以及PCI等方式。
  1. kylin@kylin-GW-001M1A-FTF:~/Workspace/xqzhang/ShangHai-GFSY-klinux/drivers/net/ethernet/stmicro/stmmac$ grep -nr support Kconfig
  2. 21:     tristate "STMMAC Platform bus support"
  3. 26:       This selects the platform specific bus support for the stmmac driver.
  4. 45:     tristate "QCA IPQ806x DWMAC support"
  5. 52:       This selects the IPQ806x SoC glue layer support for the stmmac
  6. 58:     tristate "NXP LPC18xx/43xx DWMAC support"
  7. 66:     tristate "Amlogic Meson dwmac support"
  8. 72:       This selects the Amlogic Meson SoC glue layer support for
  9. 77:     tristate "Rockchip dwmac support"
  10. 84:       This selects the Rockchip RK3288 SoC glue layer support for
  11. 88:     tristate "SOCFPGA dwmac support"
  12. 95:       This selects the Altera SOCFPGA SoC glue layer support
  13. 100:    tristate "STi GMAC support"
  14. 107:      This selects STi SoC glue layer support for the stmmac
  15. 112:    tristate "Allwinner GMAC support"
  16. 118:      This selects Allwinner SoC glue layer support for the
  17. 124:    tristate "STMMAC PCI bus support"
  18. 130:      This PCI support is tested on XLINX XC2V3000 FF1152AMT0221
复制代码
lsmod查看当前设备所加载的驱动模块
  1. xqzhang@greatwall:~$ lsmod | grep stmmac
  2. stmmac_platform         9705  1 dwmac_generic
  3. stmmac                 72158  3 dwmac_generic,stmmac_platform
复制代码
其中dwmac_generic属于驱动匹配入口,支持设备树、ACPI、Platform等匹配方式。
stmmac_platform则是提供设备树、ACPI、Platform等资源信息的获取方式,并提供了PM电源管理的ops。
stmmac为网卡驱动本体,负责probe配置、网卡open等。
stmmac_dvr_probe

在GMAC驱动probe过程中会先读取0x1058硬件功能寄存器,并将其复制给dma_cap,若mac芯片不支持PCS(TBI / SGMII / RTBI PHY 接口))则会遍历phy设备找到对应的phy id然后注册mdio bus.
当CONFIG_DEBUG_FS宏打开时,可通过cat /sys/kernel/debug/stmmaceth/eth0/dma_cap查看硬件功能寄存器中的内容。
stmmac_open

在GMAC的open函数中,如果不支持PCS(TBI / SGMII / RTBI PHY 接口)则先进行phy芯片的初始化工作,在phy初始化的过程中(stmmac_init_phy)如果设备树有定义phy_node(phy_node是通过device tree中的phy_handle构造的)则进行of_phy_connect连接,否则进行phy_connect连接。of_phy_connect和phy_connect差异在于前者已经找到的phy_device,后者需要先通过mdio bus找到phy_device。连接phy的实现主要在phy_connect_direct函数中,该函数共做了以下几步:

  • phy_attach_direct(attach a network device to a given PHY device pointer)
  • 赋值adjust_link = stmmac_adjust_link,该函数负责监控phy链路状态
  • phy_start_machine启动PHY状态机跟踪
  • 如果是中断模式,则启用中断
    连接过程重点在phy_attach_direct函数中,其会先判断是否匹配到具体的phy driver,若phy driver不存在则会调用通用genphy_driver进行probe和bind操作。之后会调用phy_init_hw进行phy config配置,配置完成后执行phy_resume启用phy设备。phy_init_hw函数中将对phy设备做soft_reset、fixup、config_init等操作,这些操作涉及一系列的phy寄存器操作。在stmmac_init_phy函数的最后会根据接口模式MII或RMII(GMII)设置不同的advertising带宽属性。
无论是否支持PCS,open函数中都要做的是alloc tx rx desc环形缓冲区、配置MAC芯片寄存器stmmac_hw_setup、创建1个stmmac_tx_timer定时器(用于定时清理环形缓冲区)、phy_start启动phy设备、request_irq注册相关中断。
stmmac_hw_setup函数中stmmac_init_dma_engine初始化dma引擎、set_umac_addr配置MAC addr、bus_setup总线配置(可选)、core_init MAC core的初始化、rx_ipc RX IPC Checksum offload启用、stmmac_set_mac启用MAC收发队列、stmmac_dma_operation_mode设置DMA模式、stmmac_mmc_setup设置mac管理计数器、stmmac_init_ptp初始化PTP硬件时钟驱动、start_tx start_rx 启用dma收发队列、rx_watchdog、ctrl_ane。
根据上述分析,在GMAC probe流程中主要对硬件功能寄存器进行读取,驱动根据具体的功能支持情况进行配置。GMAC open流程中phy_init_hw函数中包含了大量phy寄存器的配置,stmmac_hw_setup函数中包含了大量mac寄存器的配置。
stmmac_hw_setup配置解读(待补充)

PHY驱动分析(待补充)

phy_init_hw配置解读(待补充)

PHY标准寄存器解读

phy标准寄存器解读
ETHX日志级别设置

日志级别信息
  1. enum {                                                                           
  2.          NETIF_MSG_DRV           = 0x0001,                                       
  3.          NETIF_MSG_PROBE         = 0x0002,                                       
  4.          NETIF_MSG_LINK          = 0x0004,                                       
  5.          NETIF_MSG_TIMER         = 0x0008,                                       
  6.          NETIF_MSG_IFDOWN        = 0x0010,                                       
  7.          NETIF_MSG_IFUP          = 0x0020,                                       
  8.          NETIF_MSG_RX_ERR        = 0x0040,                                       
  9.          NETIF_MSG_TX_ERR        = 0x0080,                                       
  10.          NETIF_MSG_TX_QUEUED     = 0x0100,                                       
  11.          NETIF_MSG_INTR          = 0x0200,                                       
  12.          NETIF_MSG_TX_DONE       = 0x0400,                                       
  13.          NETIF_MSG_RX_STATUS     = 0x0800,                                       
  14.          NETIF_MSG_PKTDATA       = 0x1000,                                       
  15.          NETIF_MSG_HW            = 0x2000,                                       
  16.          NETIF_MSG_WOL           = 0x4000,                                       
  17. };                                    
  18. 默认的消息级别: 0x0063
  19. static const u32 default_msg_level = (NETIF_MSG_DRV | NETIF_MSG_PROBE |         
  20.                                        NETIF_MSG_LINK | NETIF_MSG_IFUP |         
  21.                                        NETIF_MSG_IFDOWN | NETIF_MSG_TIMER);      
复制代码
  1. 打印rx ring desc
  2. sudo ethtool -s enaftgm1i0 msglvl   0x0800
  3. 关闭日志打印
  4. sudo ethtool -s enaftgm1i0 msglvl   0x0000
  5. 恢复默认的日志级别
  6. sudo ethtool -s enaftgm1i0 msglvl   0x0063
复制代码
该日志信息可通过dmesg -w查看。
收发队列描述符查看

通过cat /sys/kernel/debug/stmmaceth/eth0/descriptors_status
以太网层图例


简单图解OSI七层网络模型


来源:https://www.cnblogs.com/forwards/p/17101438.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具