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

📄 wmark_diag.c

📁 开发Inetl IXP2400平台所必须的硬件诊断和测试程序。该软件包支持的功能包括CPU基本功能检测
💻 C
📖 第 1 页 / 共 2 页
字号:
		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;
}


// ******************************************************************************
// Function: void PL_Media_Loopback_Slave(void)
//
// This function will be called by the PCI Doorbell Interrupt handler after the
// Master NPU initiates a PCI Doorbell Interrupt on the Slave NPU
// ******************************************************************************
void PL_Media_Loopback_Slave2(void)
{
	UINT32 ctr, port_ctr, flag, status, loop_count, forever, packet_num = 0, error, rx_port_num=0;
	UINT32 dram_addr, lw1;
	UINT32 packet_len, mailbox_value=0;
	UINT32 get_ring_addr;
	UINT dcache_status;
	UINT32 pass_port[4],ports=0;
	UINT32 mailbox2_val = 0,data=0;
	UINT32 rxflag[4], temp =0,exp_pkt_sz=0;
	UINT32 iteration = 0,port_num=0, per_port_pkts = 0,freebuffer = 0;
	/***************************************************************************
	** The rxport is to be indexed by the txport and the value is the corresponding rxport.
	** Tx port	  Rxport
	**	0			1
	**  1			0
	**  2			3
	**  3			2
	*********************************************************************************/
	UINT32 rxport[4] = {1, 0, 3, 2};
	UINT32 msg,pnum=0, *pktptr=0;
	short cflag = 0,combination=0;

	flag = OK;
	get_ring_addr = SCR_RING_INSTR_ADDR + (0 << 2);

	Msf_OutOfReset();
	status = Msf_PLL();
	if (status == ERROR)
	{
		return;
	}

	dcache_status = get_CP15() & DCACHE_BIT;
	if(dcache_status != 0)	// if dcache ON
	{
		dcache_off();
	}
	

	/* initialize port array to 0 */
	for (ctr = 0;ctr<4;ctr++)
	{
		pass_port[ctr] = 0;
		rxflag[ctr] = ERROR;
	}

	msg = GET32(PCI_LOCAL_CSR_BASE + MAILBOX_2_OFF);
	ports = msg & 0xFF;
	cflag = msg >> 31;
	loop_count = (msg >> 16) & 0x7FFF;
	if (loop_count == 0)
	{
		forever = 1;
	}
	else
	{
		forever = 0;
	}


	flag = DownLoadUcode(PTLONE_MEDIA_LOOPBACK_RX_ME, Sz_pl_media_lpbk_jumboFrame_rx, (UINT32 *)(pl_media_lpbk_jumboFrame_rx));
	if (flag != OK)
		eprintf("Error downloading microcode on slave on ME 0!\n");

	hal_delay_us(1000);

	makePkt(256);
	makePkt(512);
	makePkt(1024);
	makePkt(1520);
	makePkt(5*1024);
	makePkt(10*1024);

	iteration=get_pkt_seq(&pktptr, &pnum,cflag,ports);
	
	while ((9*loop_count != per_port_pkts) || forever)
	{
		for (combination = 0; combination < pnum; combination++)
		{	
			//for (port_num = 0; port_num < 4; port_num++)
			for (port_ctr = 0; port_ctr < iteration; port_ctr++)
			{
				if (!cflag)
				{
					if (ports != 4)
						port_num = ports;
					else
						port_num = port_ctr;
				}
					else
				{
					if (ports != 4)
						port_num = rxport[ports];
					else
						port_num = port_ctr*2 + 1;
				}

		
				ctr = 0;
				mailbox_value = 0;
				do		// Poll for completion of receive by ME
				{
					if (ctr == 50000)	// After 3 seconds
					{
			    		eprintf("\nTimed out...packet not received on port %d\n",port_num);
						mailbox_value = NOT_RECEIVED;
						flag = ERROR;
						rxflag[port_num] = ERROR;
						break;
					}	

					mailbox_value = GET32(get_ring_addr);

					hal_delay_us(100);
					ctr++;
				}
				while (mailbox_value == 0);

				if (flag == ERROR)
				{
					break;
				}

				/* mailbox value =  sram descriptor */
				freebuffer = mailbox_value << 2;

				data = GET32(freebuffer+CHANNEL1_BASE_ADDRESS);
				rx_port_num = data >> 24;
				packet_len = data & 0xFFFF;
				//eprintf("Rx port = %d, packet length = 0x%x\n",rx_port_num,packet_len);

				pass_port[rx_port_num] = 1;
				rxflag[rx_port_num] = OK;
				packet_num++;
				//error = (mailbox_value >> 16) & 0xFF;
				//packet_len = mailbox_value & MASK_16BIT;

				error=0;
				if (error > 0)
				{
					if (error & 1)
					{
						eprintf("\nBit 10 (ABORT ERROR) of Receive Status Word set\n");
					}
					else if ((error >> 1) & 1)
					{
						eprintf("\nBit 11 (LENGTH ERROR) of Receive Status Word set\n");
					}
					else if ((error >> 2) & 1)
					{
						eprintf("\nBit 12 (PARITY ERROR) of Receive Status Word set\n");
					}
	
					mailbox_value = RECEIVE_ERROR;
	
					flag = ERROR;
					rxflag[rx_port_num] = ERROR;
					break;
				}
				if (ports == 4)
				{
					exp_pkt_sz = fs_tx_data_pl[((combination * 4) + port_num)] & 0xFFFF;
				}
				else
				{
					exp_pkt_sz = pktptr[combination] & 0xFFFF;
				}
				dram_addr =  ((freebuffer - SRAM_DESC_BASE) << 12) + DRAM_BASE_OFFSET;
				
				/*
				if (packet_len != exp_pkt_sz)
				{
					eprintf("Received packet length = 0x%x\n",packet_len);
					eprintf("Expected packet length = 0x%x\n",exp_pkt_sz);
					mailbox_value = INCORRECT_SIZE;
					flag = ERROR;
					rxflag[rx_port_num] = ERROR;
					break;
				}*/

				/* In this test, the same packet is used on all the 4 ports. 
				   Hence a chack on cflag is not required. */
#if 0
				if ((packet_len == (RING_DATA_96_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
				{
					orig_data_size = PKT_96_SZ;
					media_lb_data = (UINT32 *)data96_0;
				}
				else if ((packet_len == (RING_DATA_64_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
				{
					orig_data_size = PKT_64_SZ;
					media_lb_data = (UINT32 *)data64_0;
				}
				else if ((packet_len == (RING_DATA_138_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
				{
					orig_data_size = PKT_138_SZ;
					media_lb_data = (UINT32 *)data138_0;
				}
				else if ((packet_len == (RING_DATA_256_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
				{
					orig_data_size = PKT_256_SZ;
					media_lb_data = (UINT32 *)data256_0;
				}
				else if ((packet_len == (RING_DATA_512_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
				{
					orig_data_size = PKT_512_SZ;
					media_lb_data = (UINT32 *)data512_0;
				}
				else if ((packet_len == (RING_DATA_1024_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
				{
					orig_data_size = PKT_1024_SZ;
					media_lb_data = (UINT32 *)data1024_0;
				}
				else if ((packet_len == (RING_DATA_1520_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
				{
					orig_data_size = PKT_1520_SZ;
					media_lb_data = (UINT32 *)data1520_0;
				}
				else if ((packet_len == (RING_DATA_5K_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
				{
					orig_data_size = PKT_5K_SZ;
					media_lb_data = (UINT32 *)data5K_0;
				}
				else if ((packet_len == (RING_DATA_10K_0 & MASK_16BIT)) && ((rx_port_num == 0) || (rx_port_num == 1)||(rx_port_num == 2)||(rx_port_num == 3)))
				{
					orig_data_size = PKT_10K_SZ;
					media_lb_data = (UINT32 *)data10K_0;
					
				}
				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;
				}
				
#endif
				hal_delay_us(100000);

				lw1 = GET32(dram_addr + 3);
				//eprintf("2. dram_addr = 0x%08X   val = 0x%08X\n",dram_addr, *((unsigned int *)(dram_addr)));
				if (((lw1 >> 16) & 0xFFFF) == 0x8808)
				{
					mailbox_value = PAUSE_RECVD;
					break;
				}

			}	// end of per port processing
			if (flag == ERROR)
				break;
		}	  // combinations

		switch(ports)
		{
		   case 0:
		   case 1:
		   case 2:
		   case 3:   
					if (!cflag)
					{
						if (pass_port[ports] == 0)
						{
							eprintf("Did not Receive packet on port %d\n", ports);
							flag = ERROR;
							rxflag[ports] = ERROR;
						}
					}
					else
					{
						if (pass_port[rx_port_num] == 0)
						{
							eprintf("Did not Receive packet on port %d\n", rx_port_num);
							flag = ERROR;
							rxflag[rxport[ports]] = ERROR;
						}
					}


						break;

		   case 4:  
					if (!cflag)
					{
						for (ctr=0; ctr<4; ctr++)
						{
							if (pass_port[ctr] == 0)
							{
								eprintf("Did not Receive packet on port %d\n", ctr);
								rxflag[ctr] = ERROR;
							}
						}
					}
					else
					{
						for (ctr=0; ctr<2; ctr++)
						{
							if (pass_port[ctr*2+1] == 0)
							{
								eprintf("Did not Receive packet on port %d\n", ctr*2+1);
								rxflag[ctr*2+1] = ERROR;
							}
						}
					}
					
					break;
					
		   default:   eprintf("This is bad value for port number \n");
							break;

		}

		if (flag == ERROR)
			break;
		
		for (ctr =0;ctr <4; ctr ++)
		{
			if (rxflag[ctr] == OK)
				temp ++;
		}

		if ((ports >=0) && (ports <=3))
		{
			if (!cflag)
			{
				if (rxflag[ports] == OK)
				{	
					flag = OK;
				}
				else 
				{
					flag = ERROR;
				}
			}
			else
			{
				if (rxflag[rxport[ports]] == OK)
				{
					flag = OK;
				}
				else 
				{
					flag = ERROR;
				}
			}
		}

		if ((ports == 4) && (temp == 2))
		{
			flag = OK;		
		}	

		if((ports == 4) && (cflag))
			per_port_pkts = packet_num/2;
		else if((ports == 4) && (!cflag))
			per_port_pkts = packet_num/4;
		else 
			per_port_pkts = packet_num;
		
		eprintf("Received : %d\r",packet_num);

		PUT32((PCI_LOCAL_CSR_BASE + MAILBOX_1_OFF), PACKET_RECEIVED);
		// mailbox 2 has  : loop_count (31:16) and port (15:0)
		mailbox2_val = GET32(PCI_LOCAL_CSR_BASE + MAILBOX_2_OFF);
		mailbox2_val = (mailbox2_val >> 16) & 0x7FFF;
		
		if ((forever && mailbox2_val) || (flag == ERROR))
		{
			break;
		}

	}	// end of while loop

	eprintf("\n");
	
	switch(ports)
	{
		case 0:
		case 1:
		case 2:
		case 3:
				if (!cflag)
				{
					if (pass_port[ports] == 1)
					{	
						eprintf("Received %d packets on Port %d\n",packet_num,ports);
					}
				}
				else
				{
					if (pass_port[rxport[ports]] == 1)
					{	
						eprintf("Received %d packets on Port %d\n",packet_num,rxport[ports]);
					}
				}
				break;
		case 4:
				if (!cflag)
				{
					for (ctr=0; ctr<4; ctr++)
					{
						if (pass_port[ctr] == 1)
						{
							eprintf("Received: %d on port %d\n", packet_num/4, ctr);
						}
						
					}
				}
				else
				{
					for (ctr=0; ctr<2; ctr++)
					{
						if (pass_port[ctr*2+1] == 1)
						{
							eprintf("Received: %d on port %d\n", packet_num/2, ctr*2+1);
						}
						
					}
				}

				break;
	}
	
	if (flag == OK)
	{
		eprintf("Slave writing Test Complete \n"); 	
		PUT32((PCI_LOCAL_CSR_BASE + MAILBOX_0_OFF), TEST_COMPLETE);
	}
	else
	{
		eprintf("Slave writing : 0x%x\n",mailbox_value);
		PUT32((PCI_LOCAL_CSR_BASE + MAILBOX_0_OFF), mailbox_value);
	}

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

	Clear_All_ME();
}

short verify_flowControl(short cflag)
{
	UINT32 RxPauseFrames[4], TxPauseFrames[4];
	short test_passed = 0,iteration,port,port_ctr, rxok=0,txok=0;

	if (ports == 4)
	{
		if (!cflag)
			iteration = 4;
		else
			iteration = 2;
	}
	else
		iteration = 1;

	spConfig();
    for(port=0; port<4;port++)
    {	
		RxPauseFrames[port] = reg_read(((port*PORTSZ)+RX_PAUSE_MAC_CTL));  
		TxPauseFrames[port] = reg_read(((port*PORTSZ)+TX_PAUSE_FRAME));  
	}
	for(port_ctr=0; port_ctr<iteration;port_ctr++)
	{
		if ((!cflag) && (ports == 4))
			port = port_ctr;
		if ((cflag) && (ports == 4))
		{
			port = port_ctr*2;
			//port = rxport[port];
		}
		if ((!cflag) && (ports != 4))
			port = ports;
		if ((cflag) && (ports != 4))
			//port = rxport[ports];

		eprintf("Rx Pause Frames = %x on port %d\n",RxPauseFrames[port],port);
		if (RxPauseFrames[port] > 0)
		{
			eprintf("Pause frames Received on Port %d\n",port);
			rxok =1;
		}
		
		if (cflag)
			port=rxport[port];
		eprintf("Tx Pause Frames = %x on port %d\n",TxPauseFrames[port],port);
		if (TxPauseFrames[port] > 0)
		{
			eprintf("Pause frames transmitted on Port %d\n",port);
			txok =1;
		}
	}

	if (txok && rxok)
		test_passed = 1;

	return test_passed;
}
		
short verify_underRun(short cflag)
{

	UINT32 underflow,underRun[4];
	short test_passed = 0,iteration,port,port_ctr;
	short val= (1 << ports);

	if (ports == 4)
	{
		if (!cflag)
			iteration = 4;
		else
			iteration = 2;
		val = 0xF;
	}
	else
		iteration = 1;

	spConfig();

	underflow = reg_read(TXFIFO_OVFLW);
    for(port=0; port<4;port++)
    {	
		underRun[port] = reg_read(((port*PORTSZ)+TX_UNDERRUN));  
	}

	spRestore();

	for(port_ctr=0; port_ctr<iteration;port_ctr++)
	{
		if ((!cflag) && (ports == 4))
			port = port_ctr;
		if ((cflag) && (ports == 4))
		{
			port = port_ctr*2;
			port = rxport[port];
		}
		if ((!cflag) && (ports != 4))
			port = ports;
		if ((cflag) && (ports != 4))
			port = rxport[ports];

		if (cflag)
			port=rxport[port];

		eprintf("TX UnderRun = \t%d on port %x\n",underRun[port],port);
		eprintf("TX Underflow event register = \t%x on port %d\n",underflow,port);

		if ((underflow>>4) & val)
		{
			eprintf("Underflow has occurred, OK , Port %d\n",port);
			test_passed = 1;
		}
		else
		{
			eprintf("Underflow did not occur, FAILED , Port %d\n",port);
		}

	}

	return test_passed;
}



⌨️ 快捷键说明

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