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

📄 crc_diag.c

📁 开发Inetl IXP2400平台所必须的硬件诊断和测试程序。该软件包支持的功能包括CPU基本功能检测
💻 C
📖 第 1 页 / 共 3 页
字号:
			do
			{
				for (combination = 0; combination < pnum; combination++)
				{
					for (port_ctr = 0; port_ctr < iteration; port_ctr++)
					{
						if (ports != 4)
						{
							port_num = ports;
							PUT32((SCR_RING_INSTR_ADDR + (port_num << 2)), pktptr[combination]);
						}
						else
						{
							if (cflag)
								port_num = port_ctr*2;
							else
								port_num = port_ctr;

							PUT32((SCR_RING_INSTR_ADDR + (port_num << 2)), tx_data_pl[((combination * 4) + port_num)]);
						}
					}
				}

				for (combination = 0; combination < pnum; combination++)
				{
					flag = OK;
					for (port_ctr = 0; port_ctr < iteration; port_ctr++)
					{
						if (ports != 4)
							port_num = ports;
						else
						{
							if (cflag)
								port_num = port_ctr*2;
							else
								port_num = port_ctr;
						}

						ctr = 0;

						do			// Do while waiting for all the packets to be transmitted
						{
							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;
								}

								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++;
							}
						}
						while (scratch_read_value == 0);

						if (flag == ERROR)
						{
							break;
						}


						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;

						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 'a':

							if ( ((exp_pkt_sz == 0x5C) && (pkt_size == 0x5C-4)) ||
								 ((exp_pkt_sz == 0x3C) && (pkt_size == 0x3C-4)) ||
								 ((exp_pkt_sz == 0x84) && (pkt_size == 0x84-4)) )
							{
								eprintf("\nActual packet size = 0x%x\n",pkt_size);
								eprintf("Expected packet size = 0x%x\n",exp_pkt_sz);
								eprintf("Illegal CRC Append !\n");
								mailbox_value = CRC_APPEND_FAILED;
								crcError = ERROR;
							}

							if ( ((exp_pkt_sz == 0x5C) && (pkt_size == 0x5C+4)) ||
								 ((exp_pkt_sz == 0x3C) && (pkt_size == 0x3C+4)) ||
								 ((exp_pkt_sz == 0x84) && (pkt_size == 0x84+4)) )
							{
								eprintf("\nActual packet size = 0x%x\n",pkt_size);
								eprintf("Expected packet size: 0x%x\n",exp_pkt_sz);
								eprintf("CRC Strip FAILED !\n");
								mailbox_value = CRC_STRIP_FAILED;
								crcError = ERROR;
							}

							break;
					

						case 'd':
						case '4':

							if ( ((exp_pkt_sz == 0x5C) && (pkt_size == 0x5C+4)) ||
								 ((exp_pkt_sz == 0x3C) && (pkt_size == 0x3C+4)) ||
								 ((exp_pkt_sz == 0x84) && (pkt_size == 0x84+4)) )
							{
								eprintf("\nActual packet size = 0x%x\n",pkt_size);
								eprintf("Expected packet size: 0x%x\n",exp_pkt_sz);
								eprintf("Illegal CRC Append !\n");
								mailbox_value = ILLEGAL_CRC_APPEND;
								crcError = ERROR;
							}
							if ( ((exp_pkt_sz == 0x5C) && (pkt_size == 0x5C-4)) ||
								 ((exp_pkt_sz == 0x3C) && (pkt_size == 0x3C-4)) ||
								 ((exp_pkt_sz == 0x84) && (pkt_size == 0x84-4)) )
							{
								eprintf("\nActual packet size = 0x%x\n",pkt_size);
								eprintf("Expected packet size: 0x%x\n",exp_pkt_sz);
								mailbox_value = ILLEGAL_CRC_STRIP;
								crcError = ERROR;
							}

							break;
						}


						if (crcError == ERROR)
							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 = ERROR;		// 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))
									{
										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)

⌨️ 快捷键说明

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