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

📄 addr_filter.c

📁 开发Inetl IXP2400平台所必须的硬件诊断和测试程序。该软件包支持的功能包括CPU基本功能检测
💻 C
📖 第 1 页 / 共 3 页
字号:
							if (ctr == 1000)	// After 1 second
							{
								eprintf("\nTimed out...No indication from scratch ring that all packets were transmitted\n");
								mailbox_value = NOT_SENT;
								flag = ERROR;
								break;
							}

							// Poll on scratch ring to check if the packets have been transmitted
							if ((scratch_read_value = GET32(scratch_ring_tx_count)) == 0)
							{
								hal_delay_us(2);
								ctr++;
							}
							else
							{
								switch(ports)
								{
									case 0 : 
									case 1 : 
									case 2 : 
									case 3 : 
											eprintf("Transmitted on port %d: %d         \r", ports,(scratch_read_value));
											
											break;
    
									case 4 : // all ports 
											if (!cflag)
											{
												eprintf("Transmitted on ports 0-3 : %d        \r", (scratch_read_value)/4);
												iteration = 4;
											}
											else
											{
												eprintf("Transmitted on ports 0 and 2 : %d\r", (scratch_read_value)/2);
												iteration = 2;
											}
											break;
								}
								MSG("Transmitted Packets (total): %d\r", scratch_read_value,0,0);
								tx_count++;
 
							}
						}
						while (scratch_read_value == 0);

						PUT32(scratch_ring_tx_count, 0);

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

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

				if (flag == ERROR)
				{
					break;
				}
				
				for (combination = 0; combination < pnum; combination++)
				{
	
					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;

						do			// Do while waiting for a signal that a packet has been received
						{
							if (ctr == 300)	// After 1 second
							{
								//eprintf("\nTimed out...No indication from scratch ring that all packets were received\n");
								//mailbox_value = NOT_RECEIVED;
								flag = ERROR;
								break;
							}

							// Poll on scratch ring to check if packets have been received
							if ((scratch_read_value = GET32(scratch_ring_rx)) == 0)
							{
								hal_delay_us(100);
								ctr++;
							}

							//MSG("port %d  scratch_read_value = 0x%x\n",port_num,scratch_read_value,0);
						}
						while (scratch_read_value == 0);

						if (flag == ERROR)
						{
							break;
						}

						//MSG("DEBUG: scratch_read_value = 0x%08X\n", scratch_read_value,0,0);

						rx_count++;
						pkt_size = scratch_read_value & MASK_8BIT;
						rx_port_num = (scratch_read_value >> 8) & MASK_8BIT;
						dram_addr = DRAM_BASE_DEST + ((scratch_read_value >> 16) << 8);
						// set the port on which packet was received.
						pass_port[rx_port_num]++;
						rxflag[rx_port_num] = OK;

						//MSG("port : %d   pkt size = 0x%x\n",rx_port_num, pkt_size,0);
						
						//MSG("DEBUG: pkt_size=0x%08X\tdram_addr=0x%08X\n\n", pkt_size, dram_addr,0);

						//MSG("DEBUG: pkt_size=%d\ttx_data_pl=%d\n", pkt_size, (tx_data_pl[((combination * 4) + port_num)] & 0xFFFF),0);

#if 0
					/* Vallejo WORKAROUND : Vallejo is not stripping of the CRC 
											for 96 byte packets in gig/half duplex mode */
						if ((pkt_size == 0x60) || (pkt_size == 0x40) || (pkt_size == 0x8A))
						{
							eprintf("\npacket size = 0x%x\n",pkt_size);
							pkt_size = pkt_size - 4;
						}
						/****** end of Workaround *******/
#endif

						if (ports == 4)
						{
							exp_pkt_sz = tx_data_pl[((combination * 4) + port_num)] & 0xFFFF;
						}
						else
						{
							exp_pkt_sz = pktptr[combination] & 0xFFFF;
						}
						switch(test_param)
						{
						case 'u':
								/* 64 byte packets are unicast packets.
								   These are dropped if unicast filtering is on,
							       as the destination address is different from
							       the station address for this test.
								   Next expected packet is a 138 byte frmae.*/
								if (exp_pkt_sz == 0x3C)
									exp_pkt_sz = 0x84;
								break;
						case 'm':
								break;

						case 'b':
								/* 96 byte packets are broadcast packets.
								   These are dropped if broadcast filtering is on,
								   Next expected packet is a 64 byte frmae. */
								if (exp_pkt_sz == 0x5C)
									exp_pkt_sz = 0x3C;
								else
									exp_pkt_sz = 0x84;
								break;
						}

						if (pkt_size != exp_pkt_sz)
						{
							eprintf("\nActual packet size = 0x%x\n",pkt_size);
							eprintf("Expected packet size: 0x%x\n",exp_pkt_sz);
							mailbox_value = INCORRECT_SIZE;
							flag = INCORRECT_SIZE;		// Set flag as error
							rxflag[rx_port_num] = ERROR;
							break;
						}

						if (cflag)
						{
							switch(rx_port_num)
							{
								case 0:  // rx on port 0 , check for pkt transmitted from port 1
									if (pkt_size == (RING_DATA_96_1 & MASK_16BIT) )
									{
										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))
									{
										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))
									{
										orig_data_size = PKT_138_SZ;
										pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_1;
									}
									else
										bad_pkt_size = 1;
									break;

								case 1:  // rx on port 1 , check for pkt transmitted from port 0
									if (pkt_size == (RING_DATA_96_0 & MASK_16BIT))
									{
										//eprintf("received 96 byte on port 1\n");
										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))
									{
										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))
									{
										orig_data_size = PKT_138_SZ ;
										pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_0;
									}
									else 
										bad_pkt_size = 1;
									break;
								case 2:  // rx on port 2 , check for pkt transmitted from port 3
									if (pkt_size == (RING_DATA_96_3 & MASK_16BIT))
									{
										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))
									{
										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))
									{
										orig_data_size = PKT_138_SZ ;
										pl_sys_lb_data = (UINT32 *)pl_sys_lb_data138_3;
									}
									else
										bad_pkt_size = 1;

									break;
								case 3:  // rx on port 2 , check for pkt transmitted from port 2
									if (pkt_size == (RING_DATA_96_2 & MASK_16BIT))
									{
										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))
									{
										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))
									{
										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;
							}
							
						}
						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;
							}
						}

						for (ctr = 0; ctr < orig_data_size; ctr+=4)
						{
							// Read the DRAM for the longword that was received
							temp = GET32(dram_addr + ctr);
							
							// 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 (ctr == 0)
							{
								//eprintf("1st LW : 0x%x\n",temp);
								if (((temp >>24) & 0xFF)== UC_CHECK)
									ucCount[rx_port_num]++;  /* unicast frame received */
								if (((temp >>24) & 0xFF)== MC_CHECK)
									mcCount[rx_port_num]++;  /* multicast frame received */
								if (((temp >>24) & 0xFF) == BC_CHECK)
									bcCount[rx_port_num]++;  /* broadcast frame received */
							}

						}

						if (flag == ERROR)
						{
							break;
						}

						hal_delay_us(10);
					}
					if (flag == INCORRECT_SIZE)
						break;
					if (flag == ERROR)
					{
						if ((test_param == 'u') || (test_param == 'b') || (test_param == 'm'))
							;
						else
						{
							break;
						}
					}
				}
				if (flag == INCORRECT_SIZE)
					break;
				if (flag == ERROR)
				{
					if ((test_param == 'u') || (test_param == 'b')|| (test_param == 'm') )
							;
					else
					{
						break;
					}
				}

	
				  loop_count++;

				if (forever && KEYPRESS)
				{
					break;
				}
				//eprintf("Loop count = %d\r",loop_count);
			}
			while ((loop_count != loop) || forever);
			
			if (loop == 0)
			{
				counter = loop_count;
			}
			else
			{
				counter = loop;
			}

		    switch(test_param)
			{
			case 'u': expected_num_pkts = counter*6;
				      break;
			case 'm': expected_num_pkts = counter*6;
				      break;
			case 'b': expected_num_pkts = counter*6;
				      break;
			case '1': expected_num_pkts = counter*9;
				      break;
			}
			MSG("\nexpected_num_pkts = %d\n",expected_num_pkts,0,0);

			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("\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);
								}
							}
						}
						else
						{
							for (ctr=0; ctr<2; ctr++)

⌨️ 快捷键说明

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