问题描述:

两个ambarella peanut板子的网口之间用网线直连,会发现不能自动协商成功(网口灯不亮),但是ambarella peanut板子的网口和其他X86 Linux机器网口直连可以协商成功(网口灯亮)。

对于想使用peanut板子网口作LAN口,给其他peanut 板子DHCP分配IP地址会失败。

问题分析

1. 查看ambarella peanut平台驱动 kernel/linux-4.4/drivers/net/ethernet/ambarella/ambarella_eth.c 对网卡芯片 KSZ9031 做了哪些 MDIO 读写,关于MDIO定义看此篇博客:MDC/MDIO接口定义

static int ambhw_mdio_write(struct mii_bus *bus,int mii_id, intregnum, u16 value)

{int ret_val = 0;struct ambeth_info *lp;intval;int cnt = 0;

lp= (struct ambeth_info *)bus->priv;

printk("MII Write: reg[0x%.2x], val[0x%.4x].\n",

regnum, value); //添加的打印MDIO写了哪些寄存器,写了哪些值if(netif_msg_hw(lp))

dev_info(&lp->ndev->dev,"MII Write: id[0x%02x], add[0x%02x], val[0x%04x].\n",

mii_id, regnum, value);for (cnt = AMBETH_MII_RETRY_CNT; cnt > 0; cnt--) {

val= readl_relaxed(lp->regbase +ETH_MAC_GMII_ADDR_OFFSET);if (!(val &ETH_MAC_GMII_ADDR_GB))break;

udelay(10);

}if ((cnt <= 0) &&netif_msg_hw(lp)) {

dev_err(&lp->ndev->dev, "MII Error: Prewrite tmo!\n");

ret_val= -EIO;gotoambhw_mdio_write_exit;

}

val=value;

writel_relaxed(val, lp->regbase +ETH_MAC_GMII_DATA_OFFSET); //把要写到网卡芯片寄存器的值写到ambarella SoC芯片的 lp->regbase+ETH_MAC_GMII_DATA_OFFSET 寄存器里

val= ETH_MAC_GMII_ADDR_PA(mii_id) |ETH_MAC_GMII_ADDR_GR(regnum);

val|= ETH_MAC_GMII_ADDR_CR_250_300MHZ | ETH_MAC_GMII_ADDR_GW |ETH_MAC_GMII_ADDR_GB;

writel_relaxed(val, lp->regbase +ETH_MAC_GMII_ADDR_OFFSET); //给lp->regbase+ETH_MAC_GMII_ADDR_OFFSET写入一些flag(包括要写入的网卡芯片寄存器的地址)触发 lp->regbase+ETH_MAC_GMII_DATA_OFFSET里的值写入到网卡芯片相关寄存器里for (cnt = AMBETH_MII_RETRY_CNT; cnt > 0; cnt--) {

val= readl_relaxed(lp->regbase +ETH_MAC_GMII_ADDR_OFFSET);if (!(val &ETH_MAC_GMII_ADDR_GB))break;

udelay(10);

}if ((cnt <= 0) &&netif_msg_hw(lp)) {

dev_err(&lp->ndev->dev, "MII Error: Postwrite tmo!\n");

ret_val= -EIO;gotoambhw_mdio_write_exit;

}

ambhw_mdio_write_exit:returnret_val;

}

修改后发现打印信息如下:

MII Write: reg[0x00], val[0x8000].

MII Write: reg[0x0d], val[0x0002].

MII Write: reg[0x0e], val[0x0008].

MII Write: reg[0x0d], val[0x4002].

MII Write: reg[0x0d], val[0x0002].

MII Write: reg[0x0e], val[0x0008].

MII Write: reg[0x0d], val[0x4002].

MII Write: reg[0x0e], val[0x3df6].

MII Write: reg[0x0d], val[0x0002].

MII Write: reg[0x0e], val[0x0004].

MII Write: reg[0x0d], val[0x4002].

MII Write: reg[0x0d], val[0x0002].

MII Write: reg[0x0e], val[0x0004].

MII Write: reg[0x0d], val[0x4002].

MII Write: reg[0x0e], val[0x0027].

MII Write: reg[0x0d], val[0x0002].

MII Write: reg[0x0e], val[0x0005].

MII Write: reg[0x0d], val[0x4002].

MII Write: reg[0x0e], val[0x2222].

MII Write: reg[0x0d], val[0x0000].

MII Write: reg[0x0e], val[0x0004].

MII Write: reg[0x0d], val[0x4000].

MII Write: reg[0x0e], val[0x0006].

MII Write: reg[0x0d], val[0x0000].

MII Write: reg[0x0e], val[0x0003].

MII Write: reg[0x0d], val[0x4000].

MII Write: reg[0x0e], val[0x1a80].

MII Write: reg[0x00], val[0x1340].MII Write: reg[0x00], val[0x1140].

MII Write: reg[0x09], val[0x0300].

MII Write: reg[0x09], val[0x1300].

对照KSZ9031 datasheet比较下来,导致问题的可疑之处定位在 MII Write: reg[0x09], val[0x1300] 上面。

本来09H的第12位网卡默认值为0的,但被设置为1了,从哪个位置设置的呢?

2. 为了找到在哪个地方把09H的第12位设置为1的,我找到了kernel source code里的 kernel/linux-4.4/drivers/net/phy/micrel.c ,这个驱动是microchip系列网卡芯片相关寄存器配置的地方,找到如下函数:

static int ksz9031_config_aneg(struct phy_device *phydev)

{

u32 val;

genphy_config_aneg(phydev);/*Set auto Master/Slave resolution process*/val=phy_read(phydev, MII_CTRL1000);

val|= 0x1000; // MII_CTRL1000宏的值就是0x9,需要把此行注释掉

val&= ~(0x0800);

phy_write(phydev, MII_CTRL1000, val);return 0;

}

原来是在这里设置的 Enable master-slave manual configuration ,Microchip提供到kernel里的网卡驱动让ambarella修改了,注释掉val |= 0x1000; 这一行,重新编译进内核或者编译成模块,问题解决。

拓展

这个问题的根本原因就是两个peanut板子都设置成了 使能手动主从控制,导致用网线直连两个网卡不能自动协商,其中有一个peanut板子 Disable master-slave manual configuration 都不会有这个问题, peanut板子与其他X86主板的连接也没有这个问题;

在问题发生后,给其中一个peanut板子的网口接到交换机上,正常识别后再拔掉网线会导致网卡 MDIO 配置的复位(9H寄存器的第12位恢复默认值0),这时候再用网线直连两个peanut板子,是可以正常协商成功的。

虽然这个问题解决了,但还是不知道ambarella原厂为啥做这样的修改,在其他ambarella SoC平台里用的Realtek网卡芯片ambarella没有做类似的修改,是为了修复什么bug? 在咨询过microchip FAE后,得到的回复是千兆自动协商有时会遇到兼容性问题,例如某些千兆设备的连接,发现要在slave模式,或者必须工作在master模式,不然工作不稳定。

ksz9031 mmd读取不了_Ambarella 平台KSZ9031网卡直连不识别问题相关推荐

  1. ksz9031 mmd读取不了_am335x开机不显示启动进度条,sdk最新的06.03

    现在am335x开机不显示启动进度条,只有光标在闪,然后进入gui界面,rcS.d下面有脚本,S00psplash.sh,并且是链接到init.d/psplash.sh.里面的内容为: #!/bin/ ...

  2. php图像识别api,使用腾讯AI开放平台api进行图片OCR文字识别

    重要:本文最后更新于2019-05-20 08:46:46,某些文章具有时效性,若有错误或已失效,请在下方留言或联系代码狗. 其实图片的文字识别其实还算简单,一般是根据特定字体制作出字码文件,然后分割 ...

  3. RC522读取NFC Forum Type2 Tag流程及代码解析——Mifare Ultralight卡片读取(采用PHY6212平台,可移植)

    RC522作为一款NFC读写芯片,性价比还是很高的,因为在项目里需要采用NFC OOB配对,所以需要读取配对方模拟的NFC卡片信息 读取对象采用NRF52832,使用其NFC功能模拟type2 tag ...

  4. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(一):下载平台并基于直连环境运行...

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. 腾讯AR开放平台今日正式开放,提供识别、追踪、展现等多项能力

    在2017腾讯全球合作伙伴大会上,腾讯宣布11月9日QQ-AR开放平台免费开放.QQ-AR软件可以提供多种识别,追踪,展现,跳转,辅助工具等功能. 腾讯公司社交网络事业群即通产品部总经理冼业成在大会上 ...

  6. Qualcomm平台下基于QSEE的指纹识别方案移植之五多厂商兼容方案

    一.为什么要兼容? 通常在一款手机一个项目上用的物料,为了降低风险,很少是由一家独供的,通常会有二供.三供.拿指纹来说,一般都会有多家指纹厂商调试.为了 方便和减少出错,都会要求调试完之后,烧录同一个 ...

  7. python反爬虫应对之借助平台超级鹰突破网页验证码识别

    在爬虫过程中,有些网页需要登录才能获取里面的数据,在大部分的登录过程中,都会需要一个叫验证码识别,目前的网页有各种各样的验证码,有数字加字母的组合,有物品识别等等 在代码进行网页爬取过程中,如果由人为 ...

  8. windows7以上平台 NDISFilter 网卡过滤驱动开发

    by fanxiushu 2019-01-16 转载或引用请注明原始作者 这里讨论的都是基于WIN7以上平台,NDIS 6.0以上版本的网络驱动. 做个驱动的目的,是因为很早之前,我使用 TDI 和 ...

  9. 3行代码实现全平台多语言离线OCR文字识别,完全免费开源

    你想在全平台多语言,包括windows/linux/嵌入式设备等等所有设备上实现离线OCR吗?只要三行代码(核心代码). 代码如下: BPHANDLE Handle= BPOcrInit(szDetM ...

最新文章

  1. 浅谈Java中的final关键字
  2. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...
  3. 王义成:阿里云Redis服务助力游戏行业发展
  4. 机器学习-cs229-线性回归-泰勒展开法
  5. 前端学习(3006):vue+element今日头条管理--实现基本登录功能
  6. [算法]判断一个数是不是2的N次方
  7. excel 2007 vba与宏完全剖析_Excel宏VBA小技巧系列 | 分段加合
  8. 浪潮云海OS再度登顶 SPEC Cloud性能得分「全球第一」
  9. 中国计算机学会推荐国际学术会议和期刊目录(2019)
  10. 平面方程、夹角与点到平面的距离
  11. html图片自适应屏幕大小
  12. 游戏夜读 | 游戏关卡设计师
  13. 数字孪生-输电铁塔及线路的结冰、融化
  14. 服务器系统日志应怎么查看,怎么查看服务器操作系统日志
  15. alist搭建云盘管理程序。
  16. c语言考场排座系统,具才考场座次编排系统
  17. 数据分析八大模型:详解RFM模型
  18. 《智能商业》由阿里巴巴学术委员会主席、前总参谋长曾鸣亲自编写,值得一读!
  19. CA证书签发系统(web版)
  20. 华为路ws5200设置虚拟服务器,华为WS5200无线路由器怎么设置?

热门文章

  1. csdn上面文章转发
  2. Macbook Pro 启动Win7的过程中黑屏(black screen)
  3. netty系列之IO基础
  4. 再探阿里的“数据+业务”双中台架构
  5. AMD是什么?CMD是什么?他们之间有哪些区别
  6. android倒影效果,Android 设置图片倒影效果
  7. 作业python 内部小卖铺
  8. wince车机可以连接电脑吗_WINCE车机平台手机互联使用说明
  9. 方框加对勾怎么输入_word里如何往方框中加对号?带方框的对号怎么弄,原来是这样的...
  10. windows许可证即将过期 win10的解决办法