GMAC網卡相關介紹與分析 環境描述 MII 本節信息來源 MII MII共16根線,數據位寬4(tx rx各4根信號線),TX_CLK RX_CLK均是PHY提供的。 TX_ER(Transmit Error): 發送數據錯誤提示信號,同步於TX_CLK,高電平有效,表示TX_ER有效期內傳輸的數 ...
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網卡信息
xqzhang@greatwall:~$ sudo find /sys/ -name "*stmmac*"
/sys/bus/platform/drivers/stmmaceth
/sys/bus/mdio_bus/devices/stmmac-0:04
/sys/bus/mdio_bus/drivers/Atheros 8035 ethernet/stmmac-0:04
/sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0
/sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0/stmmac-0:04
/sys/class/mdio_bus/stmmac-0
/sys/kernel/debug/stmmaceth
/sys/module/dwmac_generic/drivers/platform:stmmaceth
/sys/module/stmmac
/sys/module/stmmac/holders/stmmac_platform
/sys/module/stmmac_platform
由上述信息可知,phy驅動為Atheros 8035 ethernet
,該設備為平臺設備,設備目錄為/sys/devices/platform/FTGM0001:00/
查看PHY工作介面模式
cat /sys/devices/platform/FTGM0001:00/mdio_bus/stmmac-0/stmmac-0:04/phy_interface
rgmii
獲取PHY ID
cat /sys/devices/platform/FTGM0001\:00/mdio_bus/stmmac-0/stmmac-0\:04/phy_id
0x004dd072
MAC晶元
讀寫MAC寄存器的方法
devmem2: https://gitee.com/Lematin_SZ/ARM_Linux_Debug_Tools/blob/master/devmem2/devmem2.c
Usage: devmem2 { address } [ type [ data ] ]
address : memory address to act upon
type : access operation type : [b]yte, [h]alfword, [w]ord
data : data to be written
對於FT2000/4核,MAC晶元是包含在CPU核內的,因此根據FT-2000/4+軟體編程手冊.pdf手冊可以拿到MAC晶元的物理地址,用戶態直接映射該物理地址可直接進行讀寫。
此外該物理地址也可以從設備樹 ACPI固件中讀取。
讀MAC寄存器
讀mac地址0寄存器
xqzhang@greatwall:~$ ifconfig enaftgm1i0
enaftgm1i0 Link encap:乙太網 硬體地址 00:07:3e:9a:79:d6
inet 地址:172.25.83.26 廣播:172.25.87.255 掩碼:255.255.248.0
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x40)) h
[sudo] xqzhang 的密碼:
/dev/mem opened.
Memory mapped at address 0x7fabbb3000.
Value at address 0x2820C040 (0x7fabbb3040): 0xD679
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x44)) h
/dev/mem opened.
Memory mapped at address 0x7f974b8000.
Value at address 0x2820C044 (0x7f974b8044): 0x700
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x46)) h
/dev/mem opened.
Memory mapped at address 0x7fa3e7c000.
Value at address 0x2820C046 (0x7fa3e7c046): 0x9A3E
寫MAC寄存器
寫0x48寄存器
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x48)) h 0x0001
/dev/mem opened.
Memory mapped at address 0x7f9e52e000.
Value at address 0x2820C048 (0x7f9e52e048): 0xFFFF
Written 0x1; readback 0x1
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x48)) h
/dev/mem opened.
Memory mapped at address 0x7facc88000.
Value at address 0x2820C048 (0x7facc88048): 0x1
MAC環回配置
環回寄存器在MAC控制寄存器0第12bit.
讀mac控制寄存器
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x0)) w
[sudo] xqzhang 的密碼:
/dev/mem opened.
Memory mapped at address 0x7f855a9000.
Value at address 0x2820C000 (0x7f855a9000): 0x614C8C
xqzhang@greatwall:~$ 0000 0000 1010 0001 0100 1100 1000 1100
配置bit12為1
xqzhang@greatwall:~$ sudo devmem2 $((0x0002820C000+0x0)) w 0x615c8c
/dev/mem opened.
Memory mapped at address 0x7f9b982000.
Value at address 0x2820C000 (0x7f9b982000): 0x614C8C
Written 0x615C8C; readback 0x615C8C
arp配置不存在的ip MAC地址為本機MAC,註意該mac地址必須與mac晶元的mac一致
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 該方式需要網卡驅動提供支持
phytool read IFACE/ADDR/REG
phytool write IFACE/ADDR/REG <0-0xffff>
phytool print IFACE/ADDR[/REG]
Clause 22:
ADDR := <0-0x1f>
REG := <0-0x1f>
Clause 45 (not supported by all MDIO drivers):
ADDR := PORT:DEV
PORT := <0-0x1f>
DEV := <0-0x1f>
REG := <0-0xffff>
其中ADDR的獲取方式可參考獲取GMAC網卡信息章節,或者使用如下命令獲取ethtool enaftgm1i0 | grep PHYAD
xqzhang@greatwall:/sys/devices/platform/FTGM0001:00$ ethtool enaftgm1i0 | grep PHYAD
PHYAD: 4
讀phy設備基礎信息
xqzhang@greatwall:~/phytool$ sudo ./phytool enaftgm1i0/00:04/
ieee-phy: id:0x004dd072
ieee-phy: reg:BMCR(0x00) val:0x1000
flags: -reset -loopback +aneg-enable -power-down -isolate -aneg-restart -collision-test
speed: 10-half
ieee-phy: reg:BMSR(0x01) val:0x796d
capabilities: -100-b4 +100-f +100-h +10-f +10-h -100-t2-f -100-t2-h
flags: +ext-status +aneg-complete -remote-fault +aneg-capable +link -jabber +ext-register
xqzhang@greatwall:~/phytool$ sudo ./phytool enaftgm1i0/0x4/
ieee-phy: id:0x004dd072
ieee-phy: reg:BMCR(0x00) val:0x1000
flags: -reset -loopback +aneg-enable -power-down -isolate -aneg-restart -collision-test
speed: 10-half
ieee-phy: reg:BMSR(0x01) val:0x796d
capabilities: -100-b4 +100-f +100-h +10-f +10-h -100-t2-f -100-t2-h
flags: +ext-status +aneg-complete -remote-fault +aneg-capable +link -jabber +ext-register
讀PHY設備寄存器
xqzhang@greatwall:~/phytool$ sudo ./phytool read enaftgm1i0/0x04/0x02
ieee-phy: reg:0x02 val:0x004d
xqzhang@greatwall:~/phytool$ sudo ./phytool read enaftgm1i0/0x4/0x03
ieee-phy: reg:0x03 val:0xd072
寫PHY設備寄存器
root@greatwall:/home/xqzhang/phytool# sudo ./phytool write enaftgm1i0/0x04/0x04 0x1de1
root@greatwall:/home/xqzhang/phytool# sudo ./phytool read enaftgm1i0/0x04/0x04
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 速率環回
sudo ./phytool write enaftgm1i0/0x4/0x0 0x4100
經測試在本節環境下,只有10M 環回才能正常UP
GMAC網卡驅動分析
查看Kconfig文件,發現該驅動支持Platform和多種SOC以及PCI等方式。
kylin@kylin-GW-001M1A-FTF:~/Workspace/xqzhang/ShangHai-GFSY-klinux/drivers/net/ethernet/stmicro/stmmac$ grep -nr support Kconfig
21: tristate "STMMAC Platform bus support"
26: This selects the platform specific bus support for the stmmac driver.
45: tristate "QCA IPQ806x DWMAC support"
52: This selects the IPQ806x SoC glue layer support for the stmmac
58: tristate "NXP LPC18xx/43xx DWMAC support"
66: tristate "Amlogic Meson dwmac support"
72: This selects the Amlogic Meson SoC glue layer support for
77: tristate "Rockchip dwmac support"
84: This selects the Rockchip RK3288 SoC glue layer support for
88: tristate "SOCFPGA dwmac support"
95: This selects the Altera SOCFPGA SoC glue layer support
100: tristate "STi GMAC support"
107: This selects STi SoC glue layer support for the stmmac
112: tristate "Allwinner GMAC support"
118: This selects Allwinner SoC glue layer support for the
124: tristate "STMMAC PCI bus support"
130: This PCI support is tested on XLINX XC2V3000 FF1152AMT0221
lsmod查看當前設備所載入的驅動模塊
xqzhang@greatwall:~$ lsmod | grep stmmac
stmmac_platform 9705 1 dwmac_generic
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標準寄存器解讀
ETHX日誌級別設置
日誌級別信息
enum {
NETIF_MSG_DRV = 0x0001,
NETIF_MSG_PROBE = 0x0002,
NETIF_MSG_LINK = 0x0004,
NETIF_MSG_TIMER = 0x0008,
NETIF_MSG_IFDOWN = 0x0010,
NETIF_MSG_IFUP = 0x0020,
NETIF_MSG_RX_ERR = 0x0040,
NETIF_MSG_TX_ERR = 0x0080,
NETIF_MSG_TX_QUEUED = 0x0100,
NETIF_MSG_INTR = 0x0200,
NETIF_MSG_TX_DONE = 0x0400,
NETIF_MSG_RX_STATUS = 0x0800,
NETIF_MSG_PKTDATA = 0x1000,
NETIF_MSG_HW = 0x2000,
NETIF_MSG_WOL = 0x4000,
};
預設的消息級別: 0x0063
static const u32 default_msg_level = (NETIF_MSG_DRV | NETIF_MSG_PROBE |
NETIF_MSG_LINK | NETIF_MSG_IFUP |
NETIF_MSG_IFDOWN | NETIF_MSG_TIMER);
列印rx ring desc
sudo ethtool -s enaftgm1i0 msglvl 0x0800
關閉日誌列印
sudo ethtool -s enaftgm1i0 msglvl 0x0000
恢復預設的日誌級別
sudo ethtool -s enaftgm1i0 msglvl 0x0063
該日誌信息可通過dmesg -w查看。
收發隊列描述符查看
通過cat /sys/kernel/debug/stmmaceth/eth0/descriptors_status