大家好,
今天我遇到了一点问题,我们公司之前的开发人员在开发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模式下呢
|