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

📄 ether_test.c

📁 移植到WLIT项目的redboot源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		/* It worked! */		mask_557_ints ();       /* Disable 557 interrupt */		printf ("\nEthernet controller passed.  Press return to continue.\n");		sgets (buf);	}}/* Perform internal self test - returns OK if sucessful, ERROR if not. */static int i557SelfTest (){volatile struct selfTest *pSelfTestMem;UINT32 oldWord2;long delay;UINT32 temp;int	rtnVal;	/* reset the 82557 to start with a clean slate */	resetChip();	/* Allocate some memory for the self test */	pSelfTestMem = (struct selfTest *) malloc (sizeof(struct selfTest));	if (pSelfTestMem == NULL)	{		printf ("Couldn't get memory for self test.\n");		return (ERROR);	}	printf ("Sending PORT* self-test command...\n");	printf ("Local Dump address = 0x%X\n", pSelfTestMem);	/* Set all bits in  second word, wait until it changes or a timeout */	pSelfTestMem->u.word2 = ~0;	oldWord2 = pSelfTestMem->u.word2;	temp = ((UINT32) pSelfTestMem) + PORT_SELF_TEST;	portWrite (temp);	/* Wait for test completion or for timeout */	for (delay = 0; (delay < MAX_DELAY) && (pSelfTestMem->u.word2 == oldWord2); delay++);	/* Wait... */	/* Print results */	printf ("Self test result: %s\n", (pSelfTestMem->u.bits.selfTest) ? "Fail" : "Pass");	printf ("ROM content test: %s\n", (pSelfTestMem->u.bits.romTest) ? "Fail" : "Pass");	printf ("Register test:    %s\n", (pSelfTestMem->u.bits.regTest) ? "Fail" : "Pass");	printf ("Diagnose test:    %s\n", (pSelfTestMem->u.bits.diagnTest) ? "Fail" : "Pass");	printf ("ROM signature:    0x%X\n", pSelfTestMem->romSig);	rtnVal = pSelfTestMem->u.bits.selfTest ? ERROR : OK;	return (rtnVal);}/* Initialize the 82557. */static int i557Init (void){	/* Get memory for system data structures */	if ( ((pRfd = (struct rfd *) malloc (sizeof(struct rfd))) == NULL) || 				((pPacketBuf = malloc(ETHERMTU + sizeof(UINT16) + 6)) == NULL) ||				((pCmdBlock = (union cmdBlock *) malloc (sizeof(union cmdBlock))) == NULL) )	{		printf ("Memory allocation failed.\n");		return (ERROR);	}	/* Set EL bits in command block and rfd so we don't fall of the end */	pCmdBlock->nop.el = END_OF_LIST;	pRfd->el = END_OF_LIST;	/* Reset chip and initialize */	printf ("Initializing... ");	/* Reset 82557 */	resetChip ();			/* set up the CU and RU base values to 0x0 */	sendCommand (LOAD_CU_BASE, RU_NOP, 0);	sendCommand (CU_NOP, LOAD_RU_BASE, 0);		/* Initialize interrupts */		/* if it is the onboard i82559, it does not use the conventional PCI	   interrupt routines because the interrupt is not multiplexed onto	   the PCI bus */	if ((unit_busno == 2) && (unit_devno == 0) && (unit_funcno == 0)) 	{		if (isr_connect (ENET_INT_ID, (VOIDFUNCPTR)i557IntHandler, 0xdeadbeef) != OK)		{			printf ("Error connecting Ethernet interrupt!\n");			return (ERROR);		}		if (enable_external_interrupt (ENET_INT_ID) != OK)		{			printf ("Error enabling Ethernet interrupt!\n");			return (ERROR);		}	}	else  /* use regular PCI int connect scheme */	{		if (pci_isr_connect (unit_intpin, unit_busno, unit_devno, i557IntHandler, 0xdeadbeef) != OK)		{			printf ("Error connecting Ethernet interrupt!\n");			return (ERROR);		}	}	unmask_557_ints();	printf ("Done\n");	return (OK);}static int initPHY (UINT32 device_type, int loop_mode){UINT16 temp_reg;UINT8 revision;	/* strip off revision and phy. id information */ 	revision = (UINT8)(device_type & REVISION_MASK);	device_type &= ~REVISION_MASK;    switch (device_type)	{		case ICS1890_PHY_ID: 			temp_reg = readMDI (0, MDI_DEFAULT_PHY_ADDR, MDI_PHY_CTRL);  /* get ready for loopback setting */	    			switch (loop_mode)			{				case EXT_LOOP_BACK:  /* loopback on the MII interface */    			temp_reg |= MDI_CTRL_LOOPBACK;	/* MII loopback */					break;				case INT_LOOP_BACK:				default:					break;			}    	    			writeMDI(0, MDI_DEFAULT_PHY_ADDR, MDI_PHY_CTRL, temp_reg);			break;				case DP83840_PHY_ID:  /* set the Intel-specified "must set" bits */    		temp_reg = readMDI (0,MDI_DEFAULT_PHY_ADDR, DP83840_PCR_REG);    		temp_reg |= (PCR_TXREADY_SEL | PCR_FCONNECT);    		writeMDI (0,MDI_DEFAULT_PHY_ADDR, DP83840_PCR_REG, temp_reg);			/* get ready for loopback setting */    		temp_reg = readMDI (0,MDI_DEFAULT_PHY_ADDR, DP83840_LOOPBACK_REG);    		temp_reg &= CLEAR_LOOP_BITS;			switch (loop_mode)			{				case EXT_LOOP_BACK:    			temp_reg |= TWISTER_LOOPBACK;				break;				case INT_LOOP_BACK:				default:				break;			}    		writeMDI (0,MDI_DEFAULT_PHY_ADDR, DP83840_LOOPBACK_REG, temp_reg);			break;		case I82553_PHY_ID:		case I82553_REVAB_PHY_ID:		case I82555_PHY_ID:			break;		default:			return (ERROR);			break;  }  return (OK);}/* Set hardware address of the 82557. */static int i557AddrSet (){    printf ("Setting hardware ethernet address to ");    printf ("%02X:%02X:%02X:", node_address[0], node_address[1], node_address[2]);    printf ("%02X:%02X:%02X... ", node_address[3], node_address[4], node_address[5]);	/* Set up iaSetup command block and execute */	bzero ((char *) pCmdBlock, sizeof(union cmdBlock));	pCmdBlock->iaSetup.code = IA_SETUP;	pCmdBlock->iaSetup.el = END_OF_LIST;	bcopy (node_address, pCmdBlock->iaSetup.enetAddr, sizeof(node_address));	sendCommand (CU_START, RU_NOP, ((UINT32)pCmdBlock));	if ((waitForInt() == ERROR) || (pCmdBlock->iaSetup.ok != 1))	{		printf ("failed.  Status: 0x%04X.\n", pSCB->cmdStat.words.status);		printf ("C bit = %d\n",pCmdBlock->iaSetup.c);		printf ("OK bit = %d\n",pCmdBlock->iaSetup.ok);		return (ERROR);	}    	printf ("done.\n");	return (OK);}/* Configure the 82557. */static int i557Config (UINT8 loopBackMode)	/* None, int, or ext 1, 2 (see etherTest.h) */{	printf ("\nConfiguring for ");	switch (loopBackMode)	{		case INT_LOOP_BACK:			printf ("internal loopback... ");			break;		case EXT_LOOP_BACK:			printf ("external loopback, LPBK* active... ");			break;		default:			printf ("Unknown loopback mode, exiting...\n");			return (ERROR);	}	/* Set up configure command block and execute */	bzero ((char *) pCmdBlock, sizeof(union cmdBlock));	pCmdBlock->configure.code = CONFIGURE;	pCmdBlock->configure.el = END_OF_LIST;	pCmdBlock->configure.configData[ 0] = CONFIG_BYTE_00;	pCmdBlock->configure.configData[ 1] = CONFIG_BYTE_01;	pCmdBlock->configure.configData[ 2] = CONFIG_BYTE_02;	pCmdBlock->configure.configData[ 3] = CONFIG_BYTE_03;	pCmdBlock->configure.configData[ 4] = CONFIG_BYTE_04;	pCmdBlock->configure.configData[ 5] = CONFIG_BYTE_05;	pCmdBlock->configure.configData[ 6] = CONFIG_BYTE_06;	pCmdBlock->configure.configData[ 7] = CONFIG_BYTE_07;	pCmdBlock->configure.configData[ 8] = CONFIG_BYTE_08;	pCmdBlock->configure.configData[ 9] = CONFIG_BYTE_09;	pCmdBlock->configure.configData[10] = CONFIG_BYTE_10 | loopBackMode;	pCmdBlock->configure.configData[11] = CONFIG_BYTE_11;	pCmdBlock->configure.configData[12] = CONFIG_BYTE_12;	pCmdBlock->configure.configData[13] = CONFIG_BYTE_13;	pCmdBlock->configure.configData[14] = CONFIG_BYTE_14;	pCmdBlock->configure.configData[15] = CONFIG_BYTE_15;	pCmdBlock->configure.configData[16] = CONFIG_BYTE_16;	pCmdBlock->configure.configData[17] = CONFIG_BYTE_17;	pCmdBlock->configure.configData[18] = CONFIG_BYTE_18;	if (link_speed == SPEED_100M) 		pCmdBlock->configure.configData[19] = CONFIG_BYTE_19_100T;	else	{		pCmdBlock->configure.configData[19] = CONFIG_BYTE_19_10T;		pCmdBlock->configure.configData[20] = CONFIG_BYTE_20;		pCmdBlock->configure.configData[21] = CONFIG_BYTE_21;	}	sendCommand (CU_START, RU_NOP, ((UINT32)pCmdBlock));	if ((waitForInt() == ERROR) || (pCmdBlock->configure.ok != 1))	{		printf ("failed.  Status: 0x%04X.\n",		pSCB->cmdStat.words.status);		return (ERROR);	}	initPHY (phy_id, loopBackMode);  /* set up the PHY interface appropriately */	printf ("done.\n");	return (OK);}static int i557RUStart (){	volatile long delay;#if 0	printf ("Enabling receiver... ");#endif	bzero ((char *) pRfd, sizeof(struct rfd));	/* Set end-of-list bit in the rfd so we don't fall off the end */	pRfd->el = END_OF_LIST;	pRfd->s = 1;	pRfd->sf = 0;				/* Simplified mode */	pRfd->rbdAddr = (UINT8 *) 0xffffffff; 	/* No RBD */	/* buffer size: */	pRfd->size = sizeof (pRfd->rxData) + sizeof (pRfd->destAddr) + sizeof (pRfd->sourceAddr) + sizeof (pRfd->length); 	sendCommand (CU_NOP, RU_START, ((UINT32)pRfd));	/*	 * Poll, can't use waitForInt (), as this step doesn't generate interrupts.	 */	i557Status = 0;	/* Wait for timeout (i557Status changes) or RU_STAT is RU_READY */	for (delay = 0; (delay < MAX_DELAY) && (pSCB->cmdStat.bits.rus != RU_READY); delay++)		;	/* Wait... */	if (pSCB->cmdStat.bits.rus != RU_READY)	{		printf ("failed.  Status: 0x%04X.\n",		pSCB->cmdStat.words.status);		return (ERROR);	}#if 0	printf ("done.  Status: 0x%04X.\n", pSCB->cmdStat.words.status);#endif	return (OK);}/* * Get packet ready to send out over the network.  Buffer should be * ETHERMTU + sizeof(enet_addr) + sizeof(UINT16) */static void setUpPacket (char *pBuf)/* Where to put it */{	bcopy (node_address, pBuf, sizeof(node_address));	pBuf += sizeof(node_address); /* skip dest. address */	*((UINT16 *) pBuf) = 0;	pBuf += sizeof(UINT16);      /* skip length field */	makePacket (pBuf, ETHERMTU);}/* Send and verify a packet using the current loopback mode. */static int txPacket (char *pBuf) /* Dest addr, ethertype, buffer */{	int status = OK;	/* Set up transmit command block and execute */	bzero ((char *) pCmdBlock, sizeof(union cmdBlock));	pCmdBlock->transmit.code = TRANSMIT;	pCmdBlock->transmit.el = END_OF_LIST;	pCmdBlock->transmit.sf = 0;				/* Simplified mode */	pCmdBlock->transmit.tbdAddr = (UINT8 *) 0xffffffff; /* No TBD */	pCmdBlock->transmit.eof = 1;			/* Entire frame here */	/* # bytes to tx: */	pCmdBlock->transmit.tcbCount = sizeof (pCmdBlock->transmit.destAddr) + sizeof (pCmdBlock->transmit.length) +																 sizeof (pCmdBlock->transmit.txData);#if 0	printf ("destAddr size = %d\n", sizeof (pCmdBlock->transmit.destAddr));	printf ("length size = %d\n", sizeof (pCmdBlock->transmit.length));	printf ("Transmitting %d bytes\n", pCmdBlock->transmit.tcbCount);#endif	bcopy (pBuf, pCmdBlock->transmit.destAddr, sizeof(node_address) + sizeof(UINT16) + ETHERMTU);	rxSem = 0;	/* no Receive interrupt */	sendCommand (CU_START, RU_NOP, ((UINT32)pCmdBlock));	if (waitForInt() == ERROR)	{		printf ("No Transmit Interrupt\n");		status = ERROR;	}	if (pCmdBlock->transmit.ok != 1)	{			printf ("tx failed.  Status: 0x%04X.\n",		pSCB->cmdStat.words.status);		status = ERROR;	}	if (status == ERROR)	{		printf ("Transmit OK = %d\n", pCmdBlock->transmit.ok);		return (ERROR);	}#if 1	if (waitForRxInt() == ERROR)	{		printf ("No Receive Interrupt\n");		status = ERROR;	}	if (pRfd->ok != 1)	{		printf ("rx failed.  Status: 0x%04X.\n", pSCB->cmdStat.words.status);		status = ERROR;	}#if 1	/* If RU still ready, hang for receive interrupt */	if (pSCB->cmdStat.bits.rus == RU_READY)	{		if (waitForRxInt() == ERROR)		{		    printf ("No Receive Interrupt\n");			status = ERROR;		}		if (pRfd->ok != 1)		{			printf ("rx failed.  Status: 0x%04X.\n", pSCB->cmdStat.words.status);			status = ERROR;		}	}#endif	if (status == ERROR)	{		printf ("\nTransmit Stats:\n");		printf ("---------------\n");		printf ("Transmit OK = %d\n", pCmdBlock->transmit.ok);		printf ("\nReceive Stats:\n");		printf ("---------------\n\n");		printf ("Receive OK = %d\n", pRfd->ok);		printf ("CRC Error = %d\n", pRfd->crcErr);		printf ("Alignment Error = %d\n", pRfd->alignErr);		printf ("Resource Error = %d\n", pRfd->noRsrc);

⌨️ 快捷键说明

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