88E6390端口Link问题BUG解决

Marvell 88E6390是一款11端口全千兆以太网二层交换芯片,是一款较新的产品,芯片有原厂级别的BUG。我们的设备以交换芯片1port-8配置为千兆电口,port9-10千兆光口。光口在打包(满速率很快,低速时间较长,跟报文的总数有关系)一段时候之后拔掉网线,端口的状态仍然为Link,led灯闪烁,跟没有拔出网线端口的状态一样。沟通原厂给了解决方案,这里分享出来,希望能够帮助大家。

原厂的建议是在系统初始化的时候做如下配置:

88E6390端口Link问题BUG解决_第1张图片

 按照原厂这个建议在初始化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))得以解决、

以上是我分享的一点希望能帮到大家。

 

你可能感兴趣的:(C语言函数,交换机,网络通信)