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

📄 pad_diag.c

📁 开发Inetl IXP2400平台所必须的硬件诊断和测试程序。该软件包支持的功能包括CPU基本功能检测
💻 C
📖 第 1 页 / 共 3 页
字号:
/* pad_diag.c
 *
 *-------------------------------------------------------------------------------
 *                                                                      
 *                  I N T E L   P R O P R I E T A R Y                   
 *                                                                      
 *     COPYRIGHT (c)  2002 BY  INTEL  CORPORATION.  ALL RIGHTS          
 *     RESERVED.   NO  PART  OF THIS PROGRAM  OR  PUBLICATION  MAY      
 *     BE  REPRODUCED,   TRANSMITTED,   TRANSCRIBED,   STORED  IN  A    
 *     RETRIEVAL SYSTEM, OR TRANSLATED INTO ANY LANGUAGE OR COMPUTER    
 *     LANGUAGE IN ANY FORM OR BY ANY MEANS, ELECTRONIC, MECHANICAL,    
 *     MAGNETIC,  OPTICAL,  CHEMICAL, MANUAL, OR OTHERWISE,  WITHOUT    
 *     THE PRIOR WRITTEN PERMISSION OF :                                
 *                                                                      
 *                        INTEL  CORPORATION                            
 *                                                                     
 *                     2200 MISSION COLLEGE BLVD                        
 *                                                                      
 *               SANTA  CLARA,  CALIFORNIA  95052-8119                  
 *                                                                      
 *-------------------------------------------------------------------------------
 *
 *
 *  system: IXDP2400
 *  subsystem: DIAG
 *  author: chinmay, NOVEMBER, 2002
 * 
 * 
 * ------------------------------------------------------------------------------
 */

typedef unsigned long ulong;
typedef unsigned short ushort;

#include "common.h"
#include "memory.h"
#include "msf_common.h"
#include "diagstruct.h"
#include "led.h"
#include "uc_load.h"
#include "pci_diag.h"
#include "pci.h"
#include "hal_ixdp2400.h"
#include "memory.h"
#include "syslog.h"
#include "uart.h"
#include "msf_init.h"
#include "diag_utils.h"

#include "error_code.h"
#include "error_map.h"
#include "reg_api.h"
#include "register_map.h"
#include "diag.h"
#include "dp_proto.h"
#include "mac_util.h"
#include "mac_init.h"

#define UNI_PKTFILCTRL	0x1
#define MUL_PKTFILCTRL	0x2
#define BRD_PKTFILCTRL	0x4
#define HI_MUL_ADDR	0xA1B0C0D0
#define LO_MUL_ADDR	0xE0F0

extern const int pl_sys_loopback_eg_rx[];
extern const int pl_sys_loopback_eg_tx[];
extern const int pl_sys_loopback_in_rx[];
extern const int pl_sys_loopback_in_tx[];

extern pci_device slave_dev_info;		// for slave npu info.
extern UINT32 PKT_48_SZ,PKT_64_SZ,PKT_138_SZ,PKT_4_SZ;
extern UINT32 PKT_SEQ_SZ,ALL_PORT_PKT_SEQ_SZ;

extern UINT32 Sz_pl_sys_loopback_eg_rx;
extern UINT32 Sz_pl_sys_loopback_eg_tx;
extern UINT32 Sz_pl_sys_loopback_in_rx;
extern UINT32 Sz_pl_sys_loopback_in_tx;

/** pl_sys_lb_data96_0 will be pointing to 48 byte data in this test */
extern  UINT32 *pl_sys_lb_data96_0;
extern  UINT32 *pl_sys_lb_data64_0;
extern  UINT32 *pl_sys_lb_data138_0;
extern  UINT32 *pl_sys_lb_data96_1;
extern  UINT32 *pl_sys_lb_data64_1;
extern  UINT32 *pl_sys_lb_data138_1;
extern  UINT32 *pl_sys_lb_data96_2;
extern  UINT32 *pl_sys_lb_data64_2;
extern  UINT32 *pl_sys_lb_data138_2;
extern  UINT32 *pl_sys_lb_data96_3;
extern  UINT32 *pl_sys_lb_data64_3;
extern  UINT32 *pl_sys_lb_data138_3;

extern UINT32 tx_data_pl_48[];
extern UINT32 tx_data_pl_48_0[];
extern UINT32 tx_data_pl_48_1[];
extern UINT32 tx_data_pl_48_2[];
extern UINT32 tx_data_pl_48_3[];
extern UINT32 tx_data_pl_4[];
extern UINT32 tx_data_pl_4_0[];
extern UINT32 tx_data_pl_4_1[];
extern UINT32 tx_data_pl_4_2[];
extern UINT32 tx_data_pl_4_3[];

#define PKTS_64			6	 /* expected 64 byte packets, per port */
#define PKTS_138		3	 /* expected 138 packets, per port */
#define EXP_BAD_PKTS	0	 /* expected dropped packets, per port */

#define SHORT_PKT_NOT_PADDED	0xBAD0
#define PADDED_64_PKT			0xBAD1
#define PADDED_138_PKT			0xBAD2
#define PREPEND_FAILED			0xBAD3

extern UINT32 data64_0[];
extern UINT32 data64_1[];
extern UINT32 data64_2[];
extern UINT32 data64_3[];
extern UINT32 data48_0[];
extern UINT32 data4_0[];
extern UINT32 data138_0[];
extern UINT32 data138_1[];
extern UINT32 data138_2[];
extern UINT32 data138_3[];


/** globals **/
extern UINT32 total_args,loop,ports,speed;  
extern char channel,test_opt;
extern UINT8 test_param;

extern UINT32 validate_params(void);
extern UINT32 init_mac_dev(UINT32);
extern void Set_Pci_Doorbell(int bit_num, int db_intr_addr);

/* Local Functions */
void get_packets_for_pad_test(void);
int verify_padding(short cflag);
void get_exp_pkt_sz(UINT32 * exp_sz);
void get_error(UINT32 pkt_size, UINT32 exp_pkt_sz, UINT32 *mailbox_value);
void cu_init(UINT32 set_int_lpbk);

	/***************************************************************************
	** 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
	*********************************************************************************/
	extern UINT32 rxport[4];


// ******************************************************************************
// Function: void pad_test(void)
//
// This function is called by the Test Manager when the user invokes the
// point Lone system crc test
// ******************************************************************************
UINT32 padding_test(void)
{
	UINT32 ctr, flag, slave_mailbox0_addr, pkt_size, status, tx_count=0, rx_count=0;
	UINT32 scratch_ring_tx_count, scratch_ring_rx;
	UINT32 dcache_status, forever = 0, combination, port_num, rx_port_num;
	UINT32 loop_count=0;
	UINT32 scratch_read_value=0, dram_addr;
	volatile int mailbox_value, temp;
	register PDiagCommon acL = (PDiagCommon) ACADDRESS;

	UINT32 pass_port[4],rxflag[4];
	UINT32 expected_num_pkts = 0,iteration = 0, port_ctr=0, pnum=0, *pktptr=0;
	UINT32 exp_pkt_sz = 0,cflag = 0;
	UINT32 counter=0;

    channel = 'f';		

	total_args = acL->argc;
	test_opt = acL->argv[2][0];
	test_param = acL->argv[3][0];
	channel = acL->argv[4][0]; 		   	
	speed = acL->decArg[5];	
	ports = acL->decArg[6];
	loop = acL->decArg[7];

	if ((channel == 'f') && (test_param == '5'))
	{
		eprintf("Runt frame is not valid for Fiber mode.\n");
		return ABORT;
	}
	if ((channel == 'f') && (test_param == '6'))
	{
		eprintf("Short frame is not valid for Fiber mode.\n");
		return ABORT;
	}

	if (validate_params() == INVALID_PARAMETERS)
	{
		eprintf("Invalid parameters. \n");
		return INVALID_PARAMETERS;
	}
	if (channel == 'c')
	{
		cflag = 1;
	}

	if (total_args <= 7)
	{
		loop = 1;
	}

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

	/* get the packet data used specifically for the test */
	get_packets_for_pad_test();

	switch(ports)
	{
		case 0: 
				if (test_param=='6')
					pktptr = tx_data_pl_4_0;
				else	
					pktptr = tx_data_pl_48_0;
				pnum = PKT_SEQ_SZ/4; 
				iteration = 1;
				break;
		case 1: 
				if (test_param=='6')
					pktptr = tx_data_pl_4_1;
				else	
					pktptr = tx_data_pl_48_1;
				pnum = PKT_SEQ_SZ/4;
				iteration = 1;
				break;
		case 2: 
				if (test_param=='6')
					pktptr = tx_data_pl_4_2;
				else	
					pktptr = tx_data_pl_48_2;
				pnum = PKT_SEQ_SZ/4;
				iteration = 1;
				break;
		case 3: 
				if (test_param=='6')
					pktptr = tx_data_pl_4_3;
				else	
					pktptr = tx_data_pl_48_3;
				pnum = PKT_SEQ_SZ/4;
				iteration = 1;
				break;
		case 4: 
				if (test_param=='6')
					pktptr = tx_data_pl_4;
				else	
					pktptr = tx_data_pl_48;
				pnum = ALL_PORT_PKT_SEQ_SZ/(4*4);
				if (cflag)
					iteration = 2;
				else
					iteration = 4;
				break;
	}


	scratch_ring_rx = SCR_RING_INSTR_ADDR + (5 << 2);
	scratch_ring_tx_count = SCR_RING_INSTR_ADDR + (4 << 2);

	if(acL->HostType == MASTER)		// if master NPU
	{
		flag = OK;

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

		eprintf("Initialising media card. Please wait...\n");
		status = init_mac_dev(0);	
		if (status != DONE)
		{
			eprintf("Aborting Test\n");
			return ABORT;
		}
	
		clear_stat_regs();
		spConfig();

		switch(test_param)
		{
		case 'e':	/* Enable Padding */
			    eprintf("Testing Padding ...\n");
				//reg_write((RXFIFO_DROP_ENABLE),0xF);  
				for(port_ctr=0; port_ctr<NUM_PORTS;port_ctr++)
				{
					/*enable Padding */
					if (!cflag)
						reg_write((DIV_CONFIG_WORD+(port_ctr*PORTSZ)),0x11ED); 
					else
						reg_write((DIV_CONFIG_WORD+(port_ctr*PORTSZ)),0x11CD); 
					/* enable CRC strip */
					reg_write(RXFIFO_PAD_CRCSTRIP_ENB, 0xF0);
				}
				break;

			case 'p':  /* Enable Pre-pending */
			    eprintf("Testing Pre-pending ...\n");
				//reg_write((RXFIFO_DROP_ENABLE),0xF);  
				for(port_ctr=0; port_ctr<NUM_PORTS;port_ctr++)
				{
					/*enable Padding */
					if (!cflag)
						reg_write((DIV_CONFIG_WORD+(port_ctr*PORTSZ)),0x11ED); 
					else
						reg_write((DIV_CONFIG_WORD+(port_ctr*PORTSZ)),0x11CD); 

					/* enable CRC strip and Pre-pending*/
					reg_write(RXFIFO_PAD_CRCSTRIP_ENB, 0xFF);
				}
				break;

			case '5':  /* RMON test for Short/Runt Rx stat. regs */

			case '6':
			    
				//reg_write((RXFIFO_DROP_ENABLE),0xF);  
				for(port_ctr=0; port_ctr<NUM_PORTS;port_ctr++)
				{
					if (!cflag)
						reg_write((DIV_CONFIG_WORD+(port_ctr*PORTSZ)),0x116D); 
					else
						reg_write((DIV_CONFIG_WORD+(port_ctr*PORTSZ)),0x114D); 

					/* set shortRunt Threshold to 40 bytes */
					reg_write(SHORT_RUNT_TSHD +(port_ctr*PORTSZ), 0x28);
				}
				//reg_write(RXFIFO_PAD_CRCSTRIP_ENB, 0xF0);
				break;

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

		spRestore();
		eprintf("Media card initialisation completed.\n");

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

		*(PCI_ADDR_EXT_REG) = (slave_dev_info.base_address[CSR_BAR] & 0xE0000000) >> 16;
		slave_mailbox0_addr = slave_dev_info.base_map[CSR_BAR] + PCI_CSR_BASE_FRM_PCI + MAILBOX_0_OFF;
		PUT32(slave_mailbox0_addr, 0);

#ifdef __ARMEB__
			PUT32((slave_dev_info.base_map[CSR_BAR] + PCI_CSR_BASE_FRM_PCI + MAILBOX_3_OFF), SWAP32(1));
#else
			PUT32((slave_dev_info.base_map[CSR_BAR] + PCI_CSR_BASE_FRM_PCI + MAILBOX_3_OFF), 1);
#endif

		PUT32((SCRATCHPAD_BASE + SCRATCH_MSG_BASE), DRAM_BASE_SRC);
		// Write packet data to DRAM for microcode to use
		if (test_param == '6')
		{
			for (ctr = 0; ctr < PKT_4_SZ; ctr+=4)
			{
				PUT32((DRAM_BASE_SRC + ((RING_DATA_4_0 >> 8) & (MASK_16BIT << 8)) + ctr), pl_sys_lb_data96_0[(ctr / 4)]);
			}
		}
		else
		{
			for (ctr = 0; ctr < PKT_48_SZ; ctr+=4)
			{
				PUT32((DRAM_BASE_SRC + ((RING_DATA_48_0 >> 8) & (MASK_16BIT << 8)) + ctr), pl_sys_lb_data96_0[(ctr / 4)]);
			}
		}
		for (ctr = 0; ctr < PKT_64_SZ; ctr+=4)
		{
			PUT32((DRAM_BASE_SRC + ((RING_DATA_64_0 >> 8) & (MASK_16BIT << 8)) + ctr), pl_sys_lb_data64_0[(ctr / 4)]);
		}

		for (ctr = 0; ctr < PKT_138_SZ; ctr+=4)
		{
			PUT32((DRAM_BASE_SRC + ((RING_DATA_138_0 >> 8) & (MASK_16BIT << 8)) + ctr), pl_sys_lb_data138_0[(ctr / 4)]);
		}
		if (test_param == '6')

⌨️ 快捷键说明

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