⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rmon_diag.c

📁 开发Inetl IXP2400平台所必须的硬件诊断和测试程序。该软件包支持的功能包括CPU基本功能检测
💻 C
📖 第 1 页 / 共 3 页
字号:
							{
								orig_data_size = PKT_138_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_3;
							}
							else
							{
								eprintf("pkt size mismatch !! port = %d\n",rx_port_num);
								mailbox_value = NOT_COMPLETE;
								flag = ERROR;		// Set flag as error
								rxflag[rx_port_num] = ERROR;
								break;
							}
						}

						//eprintf("packet ******\n");
						for (ctr = 0; ctr < orig_data_size; ctr+=4)
						{
							// Read the DRAM for the longword that was received
							temp = GET32(dram_addr + ctr);
							//eprintf("dram data = 0x%08X\n",temp);
							//eprintf("pkt data = 0x%08X\n",pl_sys_lb_data[(ctr / 4)]);	
							// Compare with original value
							if (temp != pl_sys_lb_data[(ctr / 4)])
							{
								mailbox_value = ERROR_PATTERN;
								eprintf("Packet:%d Longword:%d Expected:0x%X  Received:0x%X\n", (rx_count + 1), (ctr / 4), pl_sys_lb_data[(ctr / 4)], temp);
								flag = ERROR;		// Set flag as error
								rxflag[rx_port_num] = ERROR;
								break;
							}
						}

						if (flag == ERROR)
						{
							eprintf("1. break. \n");
							break;
						}

						hal_delay_us(800);
					}

					if (flag == ERROR)
					{
						break;
					}
				}
#endif // skip receive process.

				if (flag == ERROR)
				{
					break;
				}

				loop_count++;

				if (forever && KEYPRESS)
				{
					break;
				}
			
			}
			while ((loop_count != loop) || forever);
		}

		eprintf("\n");

		if(dcache_status != 0)	// if dcache was originally ON
		{
			dcache_on();
		}

		if (loop == 0)
			loop = loop_count;


		rmon_flag = ERROR;
		switch(test_param)
		{
		case 'c' :
					if (get_TX_collisions())
					{
						rmon_flag = OK;
						eprintf("\nTx Collisions Test PASSED..\n");
					}
					break;
					break;
		case 'a':
					if(get_Rx_AlignError())
					{
						rmon_flag = OK;
						eprintf("\nRx AlignError Test PASSED..\n");
					}
		case 's':
					if(get_Rx_SeqError())
					{
						rmon_flag = OK;
						eprintf("\nRx Sequence Error Test PASSED..\n");
					}
					break;
		case 'l':
					if(get_Rx_LongError())
					{
						rmon_flag = OK;
						eprintf("\nRx Long Error Test PASSED..\n");
					}
					break;
		case 'b':
					if(get_Rx_JabberError())
					{
						rmon_flag = OK;
						eprintf("\nRx Jabber Error Test PASSED..\n");
					}
					break;

		}

		if (rmon_flag==OK)
		{
			Set_LED("PASS");
			slowport_code[0] = SP_XSC;
			slowport_code[1] = SP_PASS;
			dump_slowport(slowport_code, 2, SP_NON_FATAL);
		} 
		else
		{
			if (mailbox_value == INIT_ERROR)
			{
				eprintf("The slave NPU did not succeed in loading the microcode to its microengines\n");
			}
			else if (mailbox_value == NOT_RECEIVED)
			{
				eprintf("There was no sign that the expected packet was received\n");
			}
			else if (mailbox_value == ERROR_PATTERN)
			{
				eprintf("mailbox = 0x%x\n",mailbox_value);
				eprintf("The packet received was not the same as the packet transmitted.\n");
			}
			else if (mailbox_value == INCORRECT_SIZE)
			{
				eprintf("mailbox = 0x%x\n",mailbox_value);
				eprintf("The packet received was not the same size as the packet transmitted.\n");
			}
				
			/* get statistics from Vallejo */
			//get_stats();
			
			// prepare structure for dumping
			syslog.type = TYPE_ERROR;
			syslog.source_comp = MASTER_DIAG;	// Determine master/slave
			switch(test_param)
			{
			case 'c' :
						eprintf("\nTx Collisions Test FAILED..\n");
						strcpy(syslog.desc, "Tx Collisions Test FAILED");
						break;
			case 'd':
						eprintf("\nRx DataError Test FAILED..\n");
						strcpy(syslog.desc, "Rx DataError Test FAILED..");
						break;
			case 'a':
						eprintf("\nRx AlignError Test FAILED..\n");
						strcpy(syslog.desc, "Rx AlignError Test FAILED..");
						break;
			case 's':
						eprintf("\nRx Sequence Error Test FAILED..\n");
						strcpy(syslog.desc, "Rx Sequence Error Test FAILED..");
						break;
			case 'y':
						eprintf("\nRx Symbol Error Test FAILED..\n");
						strcpy(syslog.desc, "Rx Symbol Error Test FAILED..");
						break;
			case 'l':
						eprintf("\nRx Long Error Test FAILED..\n");
						strcpy(syslog.desc, "Rx Long Error Test FAILED..");
						break;
			case 'b':
						eprintf("\nRx Jabber Error Test FAILED..\n");
						strcpy(syslog.desc, "Rx Jabber Error Test FAILED..");
						break;
			}

			// write to syslog
			syslog_dump(&syslog, sizeof(SYSLOG_DATA));

			Set_LED("FAIL");
			slowport_code[0] = SP_XSC;
			slowport_code[1] = SP_FAIL;
			dump_slowport(slowport_code, 2, SP_NON_FATAL);
			acL->Err = ERROR;
		}		
		Clear_All_ME();
	}
	else
	{
		eprintf("\nThis test cannot be run directly on the Slave console\n");
		return DONE;	// To indicate that the slave does not do this.
	}
	return DONE;
}

int get_TX_collisions(void)
{

	int port=0,res=0;
	UINT32 txSingleCollisions[4];
	UINT32 txMultipleCollisions[4];
	UINT32 txTotalCollisions[4];
	UINT32 txExcvCollisions[4];
	short test_passed = 0,iteration,port_ctr;

	if (ports == 4)
		iteration = 4;
	else
		iteration = 1;

	spConfig();
    for(port=0; port<=3;port++)
    {

		txSingleCollisions[port] = reg_read((port*PORTSZ)+TX_SINGLE_COLLISION);
		txMultipleCollisions[port] = reg_read((port*PORTSZ)+TX_MUL_COLLISION);
		txTotalCollisions[port] = reg_read((port*PORTSZ)+TX_TOTAL_COLLISION);
		txExcvCollisions[port] = reg_read((port*PORTSZ)+TX_EXCV_COLLISION);

		/* Reading the total packets received */
		eprintf("Total UC pkts : %x\n",reg_read((port*PORTSZ+TX_UC_PKTS)));  
		eprintf("Total MC pkts : %x\n",reg_read(((port*PORTSZ)+TX_MC_PKTS)));  
		eprintf("Total BC pkts : %x\n",reg_read(((port*PORTSZ)+TX_BC_PKTS)));  
		eprintf("Port: %d  Total collisions : %x\n",port,txTotalCollisions[port]);  
		eprintf("Tx deferred : %x\n",reg_read(((port*PORTSZ)+TX_DEFERRED_ERR)));  
		eprintf("Port: %d  Tx Single collisions : %x\n",port,txSingleCollisions[port]);  
		eprintf("Port: %d  Tx multiple collisions : %x\n",port,txMultipleCollisions[port]);  
		eprintf("Late collisons : %x\n",reg_read(((port*PORTSZ)+LATE_COLLISION)));  
		eprintf("Excessive collisions : %x\n",reg_read(((port*PORTSZ)+TX_EXCV_COLLISION)));  
		eprintf("Excessive deferred : %x\n",reg_read(((port*PORTSZ)+TX_EXCV_DEFERRED_ERR)));  
	}
	spRestore();

	port = 0;
	for(port_ctr=0; port_ctr<iteration;port_ctr++)
	{  
		if (ports == 4)
			port = port_ctr;
		else
			port = ports;
		
		if ((txSingleCollisions[port] > 0) || (txMultipleCollisions[port] > 0) || (txTotalCollisions[port] > 0) || (txExcvCollisions[port] > 0))
			res |= 1<< port;
	}
	
	if ((res == 0xF) || (res & (1<<ports)))
		test_passed = 1;

	return test_passed;
}


int get_Rx_AlignError(void)
{

	int port=0,res=0;
	UINT32 rxAlignError[4];
	short test_passed = 0,iteration,port_ctr;

	if (ports == 4)
		iteration = 4;
	else
		iteration = 1;

	spConfig();
    for(port=0; port<=3;port++)
    {
		/* Reading the total packets received */
		rxAlignError[port] = reg_read(port*PORTSZ+RX_ALIGN_ERR);
		eprintf("Port %d: Rx Data Error: %x\n",port, rxAlignError[port]);  
	}
	spRestore();
	port = 0;

	for(port_ctr=0; port_ctr<iteration;port_ctr++)
	{  
		if (ports == 4)
			port = port_ctr;
		else
			port = ports;

		if (rxAlignError[port] > 0)
			res|=1<<port;
	}
	if ((res == 0xF) || (res & (1<<ports)))
		test_passed = 1;

	return test_passed;
}

int get_Rx_SeqError(void)
{

	int port=0,res=0;
	UINT32 rxSeqError[4];
	short test_passed = 0,iteration,port_ctr;

	if (ports == 4)
		iteration = 4;
	else
		iteration = 1;

	spConfig();
    for(port=0; port<=3;port++)
    {
		/* Reading the total packets received */
		rxSeqError[port] = reg_read(port*PORTSZ+RX_ALIGN_ERR);
		eprintf("Port %d: Rx Data Error: %x\n",port, rxSeqError[port]);  
	}
	spRestore();
	port = 0;

	for(port_ctr=0; port_ctr<iteration;port_ctr++)
	{  
		if (ports == 4)
			port = port_ctr;
		else
			port = ports;

		if (rxSeqError[port] > 0)
			res|=1<<port;
	}

	if ((res == 0xF) || (res & (1<<ports)))
		test_passed = 1;

	return test_passed;
}


int get_Rx_LongError(void)
{

	int port=0,res=0;
	UINT32 rxLongError[4];
	short test_passed = 0,iteration,port_ctr;

	if (ports == 4)
		iteration = 4;
	else
		iteration = 1;

	spConfig();
    for(port=0; port<=3;port++)
    {
		/* Reading the total packets received */
		rxLongError[port] = reg_read(port*PORTSZ+RX_LONG_ERR);
		eprintf("Port %d: Rx Data Error: %x\n",port, rxLongError[port]);  
	}
	spRestore();
	port =0;

	for(port_ctr=0; port_ctr<iteration;port_ctr++)
	{  
		if (ports == 4)
			port = port_ctr;
		else
			port = ports;

		if (rxLongError[port] > 0)
			res|=1<<port;
	}

	if ((res == 0xF) || (res & (1<<ports)))
		test_passed = 1;

	return test_passed;
}

int get_Rx_JabberError(void)
{

	int port=0,res=0;
	UINT32 rxJabError[4];
	short test_passed = 0,iteration,port_ctr;

	if (ports == 4)
		iteration = 4;
	else
		iteration = 1;

	spConfig();
    for(port=0; port<=3;port++)
    {
		/* Reading the total packets received */
		rxJabError[port] = reg_read(port*PORTSZ+RX_JABBER_ERR);
		eprintf("Port %d: Rx Data Error: %x\n",port, rxJabError[port]);  
	}
	spRestore();
	port = 0;

	for(port_ctr=0; port_ctr<iteration;port_ctr++)
	{  
		if (ports == 4)
			port = port_ctr;
		else
			port = ports;

		if (rxJabError[port] > 0)
			res|=1<<port;
	}
	if ((res == 0xF) || (res & (1<<ports)))
		test_passed = 1;

	return test_passed;

}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -