【A113】网卡芯片Realtek RTL8201驱动调试

5 篇文章 0 订阅
3 篇文章 0 订阅

前言:

这一篇是对自己调试的一个过程记录,代码看的算是比较熟悉了,过程中一直没调过,没后询问原厂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

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值