打印
[技术问题解答]

IMX6Q AR8031百兆模式

[复制链接]
3434|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kl1125290220|  楼主 | 2017-5-25 15:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,
       今天我遇到了一点问题,我们公司之前的开发人员在开发imx6sl的板子时候,将网卡设置成为了100M模式,但是在最近测试中,
我们发现我们的机器延迟很大,经过测试发现我们的网卡变回了千兆模式,而我们之前的开发人员说千兆模式下丢包很严重。
       可是,我们没有修改过任何的内核源码,只是替换了一个**,现在我们编译出来的内核都是千兆模式。

      然后,我们发现了之前开发人员留下的一个文档,内容如下:
      我又重新检查了源码,发现源码是已经修改过了的。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
解决imx6千兆网卡AR8031数据丢包问题:

修改android源码中内核代码kernel_imx/arch/arm/mach-imx/mach-imx6sl.c文件
1.添加头文件包含#include <linux/phy.h>

2.添加如下代码
//******************************************************
static int ar8031_phy_fixup(struct phy_device *dev)
{
u16 val;

/* disable phy AR8031 SmartEEE function. */
phy_write(dev, 0xd, 0x3);
phy_write(dev, 0xe, 0x805d);
phy_write(dev, 0xd, 0x4003);
val = phy_read(dev, 0xe);
val &= ~(0x1 << 8);
phy_write(dev, 0xe, val);

/* To enable AR8031 output a 125MHz clk from CLK_25M */
phy_write(dev, 0xd, 0x7);
phy_write(dev, 0xe, 0x8016);
phy_write(dev, 0xd, 0x4007);

val = phy_read(dev, 0xe);
val &= 0xffe3;
val |= 0x18;
phy_write(dev, 0xe, val);

/* introduce tx clock delay */
phy_write(dev, 0x1d, 0x5);
val = phy_read(dev, 0x1e);
val |= 0x0100;
phy_write(dev, 0x1e, val);

return 0;
}

#define PHY_ID_AR8031 0x004dd074

static void __init imx6q_enet_phy_init(void)
{
  phy_register_fixup_for_uid(PHY_ID_AR8031, 0xffffffff,
    ar8031_phy_fixup);
}
//*******************************************************************

3.修改函数如下,添加调用关系
static inline void imx6sl_fec_init(void)
{
imx6sl_fec_clk_init();
imx6q_enet_phy_init(); //这一行是添加的!!!!
imx6_enet_mac_init("fsl,imx6sl-fec");

}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题1:按照这个文档的处理方式是否真的能够将千兆网设置为百兆?
问题2:如果可以,那么我们网络变回千兆网是什么问题导致的?是不是还需要配置内核的其它信息?

问题3:如果不可以,那么怎么设置AR8031运行在100M模式下呢


相关帖子

沙发
kl1125290220|  楼主 | 2017-5-25 15:32 | 只看该作者
看了下内核源码,这个部分的修改,完全是复制mach-imx/mach-imx6q.c文件里的一部分代码过来。
而且,我在这些函数了做了printk,发现内核启动的时候根本没有运行imx6sl相关的代码,而运行的是imx6q的代码,因为我们的设备树是imx6d的。

不过我已经排除了是设备树导致这个问题

我使用imx6d的设备树,配合之前开发人员留下的内核依旧是100M。
使用之前开发人员留下的设备树,配合我现在编译的内核,依旧是1000M。

使用特权

评论回复
板凳
yzzchen| | 2017-8-3 19:15 | 只看该作者
你的问题解决没有。现在我这边的板子发现在1000M模式下 ping数据,丢包比较严重,现在也不确认是不是硬件的问题。

使用特权

评论回复
地板
kl1125290220|  楼主 | 2017-8-5 17:13 | 只看该作者
yzzchen 发表于 2017-8-3 19:15
你的问题解决没有。现在我这边的板子发现在1000M模式下 ping数据,丢包比较严重,现在也不确认是不是硬件的 ...

你好,我这个问题已经解决了,解决的方案是直接将其限制在百兆网模式,具体为什么千兆网络出现丢包我们这边也没有找到原因,初步判定是硬件问题。如果你的项目场景不需要用到千兆网,那么我觉得你可以尝试切换到百兆网尝试下。

使用特权

评论回复
5
qiledexin| | 2017-9-5 13:10 | 只看该作者
楼主,你好!
你是按照你自己说的改代码的方式解决的吗?

使用特权

评论回复
6
qiledexin| | 2017-9-5 19:41 | 只看该作者
是怎么把它限制在百兆模式下的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

12

帖子

0

粉丝