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

📄 spi3_diag.c

📁 开发Inetl IXP2400平台所必须的硬件诊断和测试程序。该软件包支持的功能包括CPU基本功能检测
💻 C
📖 第 1 页 / 共 3 页
字号:
									}
									else if (pkt_size == (RING_DATA_138_2 & MASK_16BIT))
									{
										//eprintf("received 138 bytes on port 3\n");
										orig_data_size = PKT_138_SZ ;
										pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_2;
									}
									else 
										bad_pkt_size = 1;

									break;
							}
							if (bad_pkt_size ==1)
							{
								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("orig data size = 0x%08X\n",orig_data_size);
						}
						else  // cflag = 0 -> fiber mode
						{

							if ((pkt_size == (RING_DATA_96_0 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_96_0 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_96_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_0;
							}
							else if ((pkt_size == (RING_DATA_64_0 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_64_0 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_64_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_0;
							}
							else if ((pkt_size == (RING_DATA_138_0 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_138_0 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_138_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_0;
							}
							else if ((pkt_size == (RING_DATA_96_1 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_96_1 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_96_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_1;
							}
							else if ((pkt_size == (RING_DATA_64_1 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_64_1 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_64_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_1;
							}
							else if ((pkt_size == (RING_DATA_138_1 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_138_1 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_138_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_1;
							}
							else if ((pkt_size == (RING_DATA_96_2 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_96_2 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_96_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_2;
							}
							else if ((pkt_size == (RING_DATA_64_2 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_64_2 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_64_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_2;
							}
							else if ((pkt_size == (RING_DATA_138_2 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_138_2 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_138_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_2;
							}
							else if ((pkt_size == (RING_DATA_96_3 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_96_3 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_96_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data96_3;
							}
							else if ((pkt_size == (RING_DATA_64_3 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_64_3 >> 20) & MASK_8BIT)))
							{
								orig_data_size = PKT_64_SZ;
								pl_sys_lb_data = (UINT32 *)pl_sys_lb_data64_3;
							}
							else if ((pkt_size == (RING_DATA_138_3 & MASK_16BIT)) && (rx_port_num == ((RING_DATA_138_3 >> 20) & MASK_8BIT)))
							{
								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)
						{
							break;
						}

						hal_delay_us(800);
					}

					if (flag == ERROR)
					{
						break;
					}
				}

				if (flag == ERROR)
				{
					break;
				}

				//loop_count--;
				  loop_count++;

				if (forever && KEYPRESS)
				{
					break;
				}
				
			}
			while ((loop_count != loop) || forever);
			
			if (loop == 0)
			{
				counter = loop_count;
			}
			else
			{
				counter = loop;
			}
			switch(test_param)
			{
			case 'r':	expected_num_pkts = counter * 0;
						break;
			default:	expected_num_pkts = counter * 9;
						break;
			}

			switch(ports)
			{
		       case 0:
		       case 1:
		       case 2:
		       case 3:  if (!cflag) 
						{ 
							if ((pass_port[ports] != expected_num_pkts) || (pass_port[ports] == 0))
							{
								eprintf("\nDid not Receive expected number of packets on port %d\n", ports);
								eprintf("Packets Received = %d\n",pass_port[ports]);
								flag = ERROR;
								rxflag[ports] = ERROR;
							}
							else
							{
								eprintf("\nReceived on Port %d : %d\n",ports,pass_port[ports]);
								flag = OK;
							}
						}
						else
						{
							if ((pass_port[rxport[ports]] != expected_num_pkts) || (pass_port[rxport[ports]] == 0))
							{
								eprintf("\nDid not Receive expected number of packets on port %d\n", rxport[ports]);
								eprintf("Packets Received on port %d = %d\n",rxport[ports],pass_port[rxport[ports]]);
								flag = ERROR;
								rxflag[ports] = ERROR;
							}
							else
							{
								eprintf("\nReceived on Port %d : %d\n",rxport[ports],pass_port[rxport[ports]]);
								flag = OK;
							}
						}
						break;

		       case 4:  //eprintf("4 ports : %d\n",ports);
						eprintf("\n");
						if (!cflag)
						{
							for (ctr=0; ctr<4; ctr++)
							{
								if ((pass_port[ctr] != expected_num_pkts) || (pass_port[ports] == 0))
								{
									eprintf("\nDid not Receive expected number of packets on port %d\n", ctr);
									eprintf("Packets Received = %d\n",pass_port[ctr]);
									rxflag[ctr] = ERROR;
									flag = ERROR;
								}
								if (pass_port[ctr] == expected_num_pkts)
								{
									eprintf("Received %d packets on Port %d\n",pass_port[ctr],ctr);
									//flag = OK;
								}
							}
						}
						else
						{
							for (ctr=0; ctr<2; ctr++)
							{
								if ((pass_port[ctr*2+1] != expected_num_pkts) || (pass_port[ports] == 0))
								{
									eprintf("\nDid not Receive expected number of packets on port %d\n", ctr*2+1);
									eprintf("Packets Received = %d\n",pass_port[ctr*2+1]);
									rxflag[ctr*2+1] = ERROR;
									flag = ERROR;
								}
								if (pass_port[ctr*2+1] == expected_num_pkts)
								{
									eprintf("Received %d packets on Port %d\n",pass_port[ctr*2+1],ctr*2+1);
									//flag = OK;
								}
							}
						}
						
						break;
						
			   default:   eprintf("This is bad value for port number \n");
								break;
			}

		}
		eprintf("\n");

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

		if (loop == 0)
			loop = loop_count;

		if ((test_param == 'r') && (flag == ERROR))
			flag = OK;
	
		if (flag ==OK)
		{
			switch(test_param)
			{
			case 't':
				eprintf("TENB/TPA successfully assserted .\n");
				eprintf("SPI-3 TENB/TPA signal test...PASSED\n");
				break;
			case 'r':
				eprintf("TERR successfully assserted .\n");
				eprintf("SPI-3 TERR signal test...PASSED\n");
				break;
			case 'm':
				eprintf("MPHY loopback test ... PASSED\n");
				break;

			default:
				eprintf("Invalid parameters. \n");
				return INVALID_PARAMETERS;
			}

			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
			strcpy(syslog.desc, "SPI-3 test FAILED!");

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

			eprintf("SPI-3 test FAILED!\n");
			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();
		Msf_OutOfReset();

	}
	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;
}


void config_mphy(void)
{
	eprintf("Testing MPHY operation...\n");
	reg_write((RXFIFO_DROP_ENABLE),0xF); 
				
	mac_reset_config();
	reg_write(SERDES_CLKMODE_REG,0x0);
	reg_write(SERDES_CLKMODE_REG,0xf);
	reg_write(0x505,0xf);
	reg_write(0x505,0x0);
	reg_write(PORT_ENABLE,0x0);

	reg_write(SPI3_TX_GLOBAL_CONFIG,0x00aa0f);
	reg_write(SPI3_RX_CONFIG, 0xAA0F80);

	mac_disable_reset();
	reg_write(SERDES_CLKMODE_REG,0x0);
	reg_write(SERDES_CLKMODE_REG,0xf);
	reg_write(0x505,0xf);
	reg_write(0x505,0x0);
	reg_write(PORT_ENABLE,0xF);
}

⌨️ 快捷键说明

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