Marvell 88E6390是一款11端口全千兆以太网二层交换芯片,是一款较新的产品,芯片有原厂级别的BUG。我们的设备以交换芯片1port-8配置为千兆电口,port9-10千兆光口。光口在打包(满速率很快,低速时间较长,跟报文的总数有关系)一段时候之后拔掉网线,端口的状态仍然为Link,led灯闪烁,跟没有拔出网线端口的状态一样。沟通原厂给了解决方案,这里分享出来,希望能够帮助大家。
原厂的建议是在系统初始化的时候做如下配置:
按照原厂这个建议在初始化qdStart();初始化之做上述的配置时序代码如下;
/* load marvell chip driver */
qdStart(gDevCpuPort, 0);
/*init port patch ,zhoulinhua@2018-09-03*/
init_each_port();
配置时序代码:
/*init port patch,zhoulinhua@2018-09-03,*/
void init_each_port()
{
int port;
int buf;
/*step1:portstate for each port to be configured to disable
*Port register 4 [1:0] = 0x0
*/
for(port=1;port <= MAX_PORT_NUM; port++)
{
readPort(port,0x4,&buf);
buf &= 0xfffc;
//printf("%s %s %d: buf=0x%04x\r\n",__FILE__,__FUNCTION__,__LINE__,buf);//zhoulinhua@2018-09-26,test
writePort(port,0x4,buf);
}
/*step2:
*For Port 9:
* Swith Port 5 register 0x1A = 0x01C0
* Swith Port 4 register 0x1A = 0xFD20
*/
writePort(0x5,0x1a,0x01C0);
writePort(0x4,0x1a,0xFD20);
/*step3:
For Port 10:
* Swith Port 5 register 0x1A = 0x01C0
* Swith Port 4 register 0x1A = 0xFD40
*/
writePort(0x5,0x1a,0x01C0);
writePort(0x4,0x1a,0xFD40);
/*step4: Preform a software reset of swtich core:
* Global 1 Register 4 .15 = 1
*/
readGlobal(0x4,&buf);
buf |= 0x8000;
//printf("%s %s %d: buf=0x%04x\r\n",__FILE__,__FUNCTION__,__LINE__,buf);//zhoulinhua@2018-09-26,test
writeGlobal(0x4,buf);
/*step5: Change the PortState for each port back to the forwarding state
* Port register 4 [1:0] = 0x3
*/
for(port=1;port <= MAX_PORT_NUM; port++)
{
readPort(port,0x4,&buf);
buf |= 0x3;
//printf("%s %s %d: buf=0x%04x\r\n",__FILE__,__FUNCTION__,__LINE__,buf);//zhoulinhua@2018-09-26,test
writePort(port,0x4,buf);
}
return 0;
}
这样配置之后,光口慢速率打包端口状态正常了,但是环网测试倒换时间本来是ms级别变成了s级别,查看中断没有上来,读取交换芯片的DevIntEn(Global 1 offset 0x4)位被置为0,中断被关闭了。明明qdStart中有如下调用打开了中断:
/* Enable phy interrupt for port link state changed */
if((status=QDIntEnable(dev)) != GT_OK)
{
MSG_PRINT(("QDIntEnable return Failed\n"));
return status;
}
猜测可能software rest的时候被清,因此在调用 init_each_port()之后重新调用QDIntEnable(dev))得以解决、
以上是我分享的一点希望能帮到大家。