千兆以太网的网络网络方案:6657 EMAC接PHY(888E1112),再接交换机芯片(BCM53125)到RJ45;
1、通过网线接到PC机上面,链路协商的速率是千兆,交换机芯片的两个交换端口互联传输数据,使用的feiq,传输速度可以到45MB/s,说明交换机芯片的工作正常;
2、整个网络链路的传输速率测试只有1.12MB/s,可能的原因是DSP和PHY之间的链路速率只有10M;
3、DSP端的SGMII接口在配置的时候只能配置为slave模式(在和PHY连接的时候),SGMII在配置自己端速率的 时候根据Link Partner Advertised Ability Register (MR_LP_ADV_ABILITY)寄存器获取的值来配置;检查该寄存器的值为0xD0001,显示的从PHY端(执行完SGMII自协商后)获取的速率为10M,所以整个链路的整体速率也就只能跑到1.12MB/s;
问题基本能够确定是由于DSP和PHY在自协商的时候获取的对端速率能力不是正确的1000M,导致整个链路速率跑不上去;
关于DSP和PHY之间速率配置的问题该如何解决,如何使速率可以正确的配置到1000M???
或者我上面思路有问题???
Thomas Yang1:
1)SGMII在做自协商时,会先将速率降到10M,再根据两端最大支持速率和双工模式配置能力,请问你的SGMII PORT初始化代码是什么样的呢?
在传输前要保证自协商标志位都是正常的,如下是个例子,供参考:
if((ETHERNET_AUTO_NEGOTIAT_SLAVE==ge_cfg->ethernet_port_cfg[i]->mode) ||(ETHERNET_AUTO_NEGOTIAT_MASTER==ge_cfg->ethernet_port_cfg[i]->mode)) { /*1 Setup the SGMII as slave and enable autonegotiation: */ /*1a Set bit 0 of the MR_ADV_ABILITY register */ gpSGMII_regs[i]->MR_ADV_ABILITY_REG &= 0xFFFF0000; /* Clear the register contents */
if(ETHERNET_AUTO_NEGOTIAT_SLAVE==ge_cfg->ethernet_port_cfg[i]->mode) { gpSGMII_regs[i]->MR_ADV_ABILITY_REG |= 0x00000001;
/*1b Enable autonegotiation by setting the MR_AN_ENABLE bit in the*/ gpSGMII_regs[i]->CONTROL_REG |= CSL_CPSGMII_CONTROL_REG_MR_AN_ENABLE_MASK; } else { gpSGMII_regs[i]->MR_ADV_ABILITY_REG |= 0x00009801;
/*1b Enable autonegotiation by setting the MR_AN_ENABLE bit in the*/ gpSGMII_regs[i]->CONTROL_REG |= CSL_CPSGMII_CONTROL_REG_MR_AN_ENABLE_MASK |CSL_CPSGMII_CONTROL_REG_MASTER_MASK; } /*2 Poll the SGMII_STATUS register to determine when autonegotiation is complete without error. The AN_ERROR bit in the SGMII_STATUS register will be set if the mode was commanded to be half-duplex gigabit.*/ while(0==gpSGMII_regs[i]->STATUS_REG&CSL_CPSGMII_STATUS_REG_LOCK_MASK); while(0==gpSGMII_regs[i]->STATUS_REG&CSL_CPSGMII_STATUS_REG_LINK_MASK); while(0==gpSGMII_regs[i]->STATUS_REG&CSL_CPSGMII_STATUS_REG_MR_AN_COMPLETE_MASK);
if(gpSGMII_regs[i]->STATUS_REG&CSL_CPSGMII_STATUS_REG_AN_ERROR_MASK) puts("Half dulpex mode was negotiated!");
2)对端交换机芯片上配置的是什么能力,你可以从对端交换机直接获取。
3)请检查SGMII LINK PARTNER ADV ABILITY_REG 看PHY获取的是什么能力,若PHY获取的能力是正常的,只是SGMII获取有问题,我们可以通过设置EXT_EN 来对SGMII能力进行软件配置,而不通过PHY协商结果自动获取
du jianfeng:
回复 Thomas Yang1:
1、我的SGMII端口初始化的代码是使用的官方PDK6657中emac_drv.c中eamc_open()函数中的初始化代码,SGMII配置的是slaver;使能atuonegotiation;按照手册,SGMII如果配置为slaver,DSP端的速率等能力是根据MR_LP_ADV_ABILITY寄存器的值来配置的,该寄存器的值是在完成SGMII的自协商过程后获取的(这里我个人的理解是否有误),现在该寄存器获取的值是0xd001,即10M全双工;2、交换机芯片的是MDI接口接到PHY端,交换机芯片的工作速率是工作在1000M(根据两个交换端口之间互联的数据测试);3、你说的“请检查SGMII PARTNER ADV AABILITY 看PHY获取的是什么能力”,是不是指的DSP端的SGMII获取的PHY的能力?如果是,现在SGMII获取的PHY端的能力是不正确的,值是0xd001(根据MR_LP_ADV_ABILITY寄存器的值);后面的通过设置EXT_En对SGMII进行软件配置是通过DSP在初始化SGMII的时候进行,还使用MDIO接口对PHY进行配置?4、DSP端的SGMII只能配置为salver,MR_LP_ADV_ABILITY寄存器是只读;MR_ADV_ABILITY是可读写;如果软件配置SGMII的能力,该如何配置?谢谢!
du jianfeng:
回复 Thomas Yang1:
谢谢Thomas Yang1的回复,我还有一些问题需要你的帮助!
1、我的SGMII端口初始化的代码是使用的官方PDK6657中emac_drv.c中eamc_open()函数中的初始化代码,SGMII配置的是slaver;使能atuonegotiation;按照手册,SGMII如果配置为slaver,DSP端的速率等能力是根据MR_LP_ADV_ABILITY寄存器的值来配置的,该寄存器的值是在完成SGMII的自协商过程后获取的(这里我个人的理解是否有误),现在该寄存器获取的值是0xd001,即10M全双工;2、交换机芯片的是MDI接口接到PHY端,交换机芯片的工作速率是工作在1000M(根据两个交换端口之间互联的数据测试);3、你说的“请检查SGMII PARTNER ADV AABILITY 看PHY获取的是什么能力”,是不是指的DSP端的SGMII获取的PHY的能力?如果是,现在SGMII获取的PHY端的能力是不正确的,值是0xd001(根据MR_LP_ADV_ABILITY寄存器的值);后面的通过设置EXT_En对SGMII进行软件配置是通过DSP在初始化SGMII的时候进行,还使用MDIO接口对PHY进行配置?4、DSP端的SGMII只能配置为salver,MR_LP_ADV_ABILITY寄存器是只读;MR_ADV_ABILITY是可读写;如果软件配置SGMII的能力,该如何配置?谢谢