Linux网络驱动之Fixed-Link(31)
接前一篇文章Linux网络驱动之Fixed-Link30本文内容参考linux phy fixed-link-CSDN博客linux phy处理流程一:探测phy设备_phy link过程-CSDN博客linux phy处理流程三:fixed-link处理-CSDN博客ARM与交换芯片mac_to_mac固定模式总结_mac to mac-CSDN博客rk3399 mac to mac 连接switch - tccxy - 博客园特此致谢本回开始结合前边30个回目所讲知识讲解T113系列芯片上如何实现Fixed-Link。全志T113系列SoC中的MAC通过MAC-to-MAC的方式连接RTL8367RB Switch芯片。对Switch芯片来说它内部自带了MAC控制器所以可以具有多进多出的效果。可以把交换芯片当做成一个PHY芯片来使用也可以把Switch芯片当做mac控制器来使用与CPU之间采用MAC-to-MAC的连接方式。因此这种情况属于SoC的MAC和其它SoC的MAC直连即无PHY设备的情况。因为无PHY设备MAC无法获取连接双方协商出来的工作状态speed、full-duplex、half-duplex等.在这种情况下希望连接状态、链接速度、双工属性等参数为固定因此内核提供了Fixed-Link的机制所以只能通过解析fixed-link属性来进行配置。Fixed-Link是Linux通过虚拟一个属性固定的PHY设备来实现的。也就是说Fixed-Link本质上是通过一个软件模拟PHY设备的方式来实现的。Fixed-Link是Linux Device Tree设备树中的一个子结点/属性属于网络MAC结点的配置。本质上属于软件虚拟链路不涉及硬件的改动。其作用只有以下三点1强制声明物理链路永远UPlink-up2强制指定速率10/100/1000/2500 Mbps等3强制指定双工模式half-duplex、full-duplex。在T113的SDK的设备树board.dts文件中需要加入原版没有gmac0中设置了fixed-link属性gmac0 { phy-mode rgmii-id; pinctrl-names default, sleep; pinctrl-0 gmac0_pins_default gmac0_pins_pg11; pinctrl-1 gmac0_pins_sleep; sunxi,phy-clk-type 0; use_ephy25m 1; tx-delay 2; rx-delay 0; status okay; fixed-link { speed 1000; full-duplex; }; };前文书讲过Fixed-Link在Linux设备树中有“旧版 —— 属性”写法和“新版 —— 子结点”写法之分。旧版兼容写法属性写法示例如下fixed-link 1 1 1000 0 0;ps7_ethernet_0: ps7-ethernete000b000 { #address-cells 1; #size-cells 0; clock-names ref_clk, aper_clk; clocks clkc 13, clkc 30; compatible xlnx,ps7-ethernet-1.00.a; interrupt-parent ps7_scugic_0; interrupts 0 22 4; local-mac-address [00 0a 35 00 00 00]; fixed-link 0 1 1000 0 0; phy-mode gmii; reg 0xe000b000 0x1000; xlnx,ptp-enet-clock 0x69f6bcb; xlnx,enet-reset ; xlnx,eth-mode 0x0; xlnx,has-mdio 0x1; mdio_0: mdio { #address-cells 1; #size-cells 0; } ;新版标准写法子结点写法示例如下ethernetxxxxxxxx { compatible snps,dwmac-4.10a; reg 0xxxxxxxxx 0xxxxx; interrupts GIC_SPI xx IRQ_TYPE_LEVEL_HIGH; /* 固定链路配置 */ fixed-link { speed 1000; /* 速率10/100/1000 M */ full-duplex; /* 全双工半双工写 half-duplex */ pause; /* 可选流控使能 */ asym-pause; /* 可选非对称流控 */ }; phy-mode rgmii-id; /* 接口模式rgmii/sgmii/mii 等 */ };因此这里可以看出T113 SDK的board.dts中使用的是新版子结点写法。不过并未设置可选的流控使能和非对称流控而只是设置了速率为1000M bps全双工。gmac0 { phy-mode rgmii-id; pinctrl-names default, sleep; pinctrl-0 gmac0_pins_default gmac0_pins_pg11; pinctrl-1 gmac0_pins_sleep; sunxi,phy-clk-type 0; use_ephy25m 1; tx-delay 2; rx-delay 0; status okay; fixed-link { speed 1000; full-duplex; }; };下一回来看SDK中的Linux内核是如何解析gmac0中的“fixed-link”属性的。