前言:
这一篇是对自己调试的一个过程记录,代码看的算是比较熟悉了,过程中一直没调过,没后询问原厂FAE,修改了一下dts一个地址参数,就可以了,最终没有太多成就感,修改了PHY芯片的一个状态寄存器。。。
关键点:
知道引脚定义、使用
能正确读到phy id
如何测试,常规可以ping测试。
网卡配置
1、arch/arm64/configs/meson64_smarthome_defconfig
CONFIG_DWMAC_MESON=m
2、/kernel/aml-4.9/drivers/amlogic/ethernet/phy/amlogic.c
EXPORT_SYMBOL_GPL(support_internal_phy_wol);
3、kernel/aml-4.9/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
EXPORT_SYMBOL_GPL(support_internal_phy_wol);
EXPORT_SYMBOL_GPL(support_external_phy_wol);
driver:
config DWMAC_MESON
tristate "Amlogic Meson dwmac support"
default n
depends on OF && COMMON_CLK
help
Support for Ethernet controller on Amlogic Meson SoCs.
This selects the Amlogic Meson SoC glue layer support for
the stmmac device driver. This driver is used for Meson6,
Meson8, Meson8b and GXBB SoCs.
config AMLOGIC_ETH_PRIVE
tristate "Amlogic private ethernet code"
default n
depends on OF
help
Support for Ethernet controller on Amlogic Meson SoCs.
This selects the Amlogic Meson SoC glue layer support for
the stmmac device driver. This driver is used for amlogic
private driver.
dts
ethmac: ethernet@0xff3f0000 {
compatible = "amlogic, gxbb-eth-dwmac";
reg = <0x0 0xff3f0000 0x0 0x10000
0x0 0xff634540 0x0 0x8>;
interrupts = <0 8 1>;
pinctrl-names = "external_eth_pins";
pinctrl-0 = <&external_eth_pins>;
mc_val_internal_phy = <0x1800>;
mc_val_external_phy = <0x1621>;
interrupt-names = "macirq";
clocks = <&clkc CLKID_ETH_CORE>;
clock-names = "ethclk81";
internal_phy=<0>;
};
设备消息
[ 1.208116@2] meson6-dwmac ff3f0000.ethernet: no reset control found
[ 1.213077@2] stmmac - user ID: 0x11, Synopsys ID: 0x37
[ 1.218297@2] Ring mode enabled
[ 1.221530@2] DMA HW capability register supported[ 1.226251@2] Normal descriptors
[ 1.229579@2] RX Checksum Offload Engine supported
[ 1.234475@2] COE Type 2
[ 1.237091@2] TX Checksum insertion supported
[ 1.241565@2] Wake-Up On Lan supported
[ 1.245470@2] Enable RX Mitigation via HW Watchdog Timer
[ 1.258095@2]
[ 1.274019@2] libphy: stmmac: probed
[ 1.274049@2] eth%d: PHY ID 001cc816 at 0 IRQ POLL (stmmac-0:00) active
[ 1.278619@2] eth%d: PHY ID 001cc816 at 1 IRQ POLL (stmmac-0:01)
设备信息
# ls /sys/bus/mdio_bus/devices/
stmmac-0:00 stmmac-0:01
调试
读状态寄存器
// test 读phy寄存器
pr_debug("read phy value = %04x\n",phy_read(phydev, MII_BMSR));
pr_debug("read phy value = %04x\n",phy_read(phydev, MII_PHYSID1));
pr_debug("read phy value = %04x\n",phy_read(phydev, MII_PHYSID2));
[ 1.292481@0] read phy value = 7869
[ 1.295975@0] read phy value = 001c
[ 1.299466@0] read phy value = c816
跟phy手册上规定的数据是一样的,通信没有问题
但是获取不到ip,不能ping通,不能上网,继续找原因
ping包测试
用wireshark抓包,发现根本没有数据包发出来。也可以通过量波形查看数据?
包过滤方法:
icmp // 直接过滤ping包
ip.src == 192.168.10.120
数据发送测试
下一步:
示波器抓数据,看有没有数据出去<TXD 0 1 2 3>,clock是否正常
硬件检查说有收到数据包,没检测到发送
下一步看代码发送部分
网卡驱动的发送函数在stmmac_netdev_ops
static const struct net_device_ops stmmac_netdev_ops = {
.ndo_open = stmmac_open,
.ndo_start_xmit = stmmac_xmit,
.ndo_stop = stmmac_release,
.ndo_change_mtu = stmmac_change_mtu,
.ndo_fix_features = stmmac_fix_features,
.ndo_set_features = stmmac_set_features,
.ndo_set_rx_mode = stmmac_set_rx_mode,
.ndo_tx_timeout = stmmac_tx_timeout,
.ndo_do_ioctl = stmmac_ioctl,
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = stmmac_poll_controller,
#endif
.ndo_set_mac_address = eth_mac_addr,
};
// stmmac_xmit 发送函数中添加注释
static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct stmmac_priv *priv = netdev_priv(dev);
unsigned int nopaged_len = skb_headlen(skb);
int i, csum_insertion = 0, is_jumbo = 0;
int nfrags = skb_shinfo(skb)->nr_frags;
unsigned int entry, first_entry;
struct dma_desc *desc, *first;
unsigned int enh_desc;
unsigned int des;
printk("stmmac xmit --------------------1--------------\n");
/* Manage oversized TCP frames for GMAC4 device */
if (skb_is_gso(skb) && priv->tso) {
if (ip_hdr(skb)->protocol == IPPROTO_TCP)
return stmmac_tso_xmit(skb, dev);
}
设置了ip,进行ping操作
# ping 192.168.10.12
PING 192.168.10.12 (192.168.10.12): 56 data bytes
[ 100.146708@1] stmmac xmit --------------------1--------------
[ 101.159213@1] stmmac xmit --------------------1--------------
[ 102.183251@1] stmmac xmit --------------------1--------------
[ 104.151487@1] stmmac xmit --------------------1--------------
[ 105.159232@1] stmmac xmit --------------------1--------------
[ 105.607249@2] stmmac xmit --------------------1--------------
[ 106.183253@1] stmmac xmit --------------------1--------------
[ 108.152230@1] stmmac xmit --------------------1--------------
[ 109.159212@1] stmmac xmit --------------------1--------------
[ 110.183299@1] stmmac xmit --------------------1--------------
[ 112.153056@1] stmmac xmit --------------------1--------------
[ 113.159210@1] stmmac xmit --------------------1--------------
[ 114.183212@1] stmmac xmit --------------------1--------------
可以看到数据发送函数调用了,具体深入这个函数看下,最终发送函数出口是否执行成功
思考:回想一下PHY芯片其实有俩天通路,一路是MII 接口的配置信息,一路是数据收发。
PHY 芯片 通过MII配置寄存器,这部分上面已经验证没有问题。数据收发有点独立,还需要验证,由MII接口成功直接认为数据收发没问题,有点突然!待下一步验证
数据到底从哪里发送
上面的只是回调注册,真正的数据发送调用其实是在 /kernel/net/目录下
xingzhibo@ws13:~/openlinux-A113/kernel/aml-4.9/net$ grep -R "ndo_start_xmit"
bridge/br_if.c: if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit)
bridge/br_device.c: .ndo_start_xmit = br_dev_xmit,
core/netpoll.c: dev->name, dev->netdev_ops->ndo_start_xmit);
hsr/hsr_device.c: return (dev->netdev_ops->ndo_start_xmit == hsr_dev_xmit);
batman-adv/soft-interface.c: if (net_dev->netdev_ops->ndo_start_xmit == batadv_interface_tx)
关于桥接使用
http://www.linuxfoundation.org/collaborate/workgroups/networking/bridge
A bridge is a way to connect two Ethernet segments together in a protocol independent way. Packets are forwarded based on Ethernet address, rather than IP address (like a router). Since forwarding is done at Layer 2, all protocols can go transparently through a bridge.
简单可以理解为:桥接通过以太网地址传送,而不是ip,数据传送在2层。
iproute2 - 桥接命令工具
Before you start make sure both network cards are set up and working properly. Don't set the IP address, and don't let the startup scripts run DHCP on the ethernet interfaces either. The IP address needs to be set after the bridge has been configured
可以理解为:在网卡正常工作前,不要设置ip,不要使用DHCP命令。必须在桥接设置好后才可以使用
# brctl addbr br0
# brctl setfd br0 0
# brctl addif br0 eth0
# dhclient eth0
调通
diff --git a/kernel/aml-4.9/arch/arm64/boot/dts/amlogic/axg_s400.dts b/kernel/aml-4.9/arch/arm64/boot/dts/amlogic/axg_s400.dts
index 3f48a3e..394e28b 100755
--- a/kernel/aml-4.9/arch/arm64/boot/dts/amlogic/axg_s400.dts
+++ b/kernel/aml-4.9/arch/arm64/boot/dts/amlogic/axg_s400.dts
@@ -176,7 +176,8 @@
pinctrl-names = "external_eth_pins";
pinctrl-0 = <&external_eth_pins>;
mc_val_internal_phy = <0x1800>;
- mc_val_external_phy = <0x1621>;
+ mc_val_external_phy = <0x1804>;
+ phy-mode = "rmii";
interrupt-names = "macirq";
clocks = <&clkc CLKID_ETH_CORE>;
clock-names = "ethclk81";
最后询问Amlogic,做了这么一点修改就好了,datasheet 也没找到出处…
测试
udhcp -i eth0
# udhcpc -i eth0
udhcpc: started, v1.26.2
udhcpc: sending discover
[ 6102.227981@2] ready send dma data.
udhcpc: sending select for 192.168.8.102
[ 6102.271974@2] ready send dma data.
udhcpc: lease of 192.168.8.102 obtained, lease time 86400
deleting routers
adding dns 192.168.8.1
# ifconfig
eth0 Link encap:Ethernet HWaddr 02:A3:0B:53:D4:B6
inet addr:192.168.8.102 Bcast:192.168.8.255 Mask:255.255.255.0
inet6 addr: fd54:bad6:1a5f:ad00:a3:bff:fe53:d4b6/64 Scope:Global
inet6 addr: fe80::a3:bff:fe53:d4b6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:100 errors:0 dropped:0 overruns:0 frame:0
TX packets:88 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:9878 (9.6 KiB) TX bytes:7447 (7.2 KiB)
Interrupt:28
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
usb0 Link encap:Ethernet HWaddr 22:6A:93:B5:4C:66
inet addr:192.168.5.1 Bcast:192.168.5.255 Mask:255.255.255.0
inet6 addr: fe80::206a:93ff:feb5:4c66/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
# ping 192.168.8.1
PING 192.168.8.1 (192.168.8.1): 56 data bytes
[ 6127.131419@3] ready send dma data.
64 bytes from 192.168.8.1: seq=0 ttl=64 time=1.897 ms
[ 6128.133230@3] ready send dma data.
64 bytes from 192.168.8.1: seq=1 ttl=64 time=1.070 ms
^C
--- 192.168.8.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.070/1.483/1.897 ms
# ping www.baidu.com[ 6132.383958@3] ready send dma data.
[ 6132.604788@2] ready send dma data.
PING www.baidu.com (103.235.46.39): 56 data bytes
[ 6132.623724@0] ready send dma data.
64 bytes from 103.235.46.39: seq=0 ttl=54 time=7.868 ms
[ 6133.625856@0] ready send dma data.
64 bytes from 103.235.46.39: seq=1 ttl=54 time=7.261 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 7.261/7.564/7.868 ms
#
ping网关ping百度都没问题了
参考资料
PHY状态机
ethertool
strace
// PHY单独控制
https://blog.csdn.net/wuheshi/article/details/79085546
PHY 调试 https://blog.csdn.net/lee790608/article/details/88642186