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

📄 skaddr.c

📁 u-boot-1.1.6 源码包
💻 C
📖 第 1 页 / 共 4 页
字号:
 * Context: *	runtime, pageable *	may be called after SK_INIT_DATA * * Returns: *	SK_MC_FILTERING_INEXACT *	SK_MC_ILLEGAL_ADDRESS */int	SkAddrGmacMcAdd(SK_AC		*pAC,		/* adapter context */SK_IOC		IoC,		/* I/O context */SK_U32		PortNumber,	/* Port Number */SK_MAC_ADDR	*pMc,		/* multicast address to be added */int		Flags)		/* permanent/non-permanent */{	int	i;#ifndef SK_ADDR_CHEAT	SK_U32 HashBit;#endif	/* !defined(SK_ADDR_CHEAT) */	if (!(pMc->a[0] & SK_MC_BIT)) {		/* Hashing only possible with multicast addresses. */		return (SK_MC_ILLEGAL_ADDRESS);	}#ifndef SK_ADDR_CHEAT	/* Compute hash value of address. */	HashBit = SkGmacMcHash(&pMc->a[0]);	if (Flags & SK_ADDR_PERMANENT) {	/* permanent => RLMT */		/* Add bit to InexactRlmtFilter. */		pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[HashBit / 8] |=			1 << (HashBit % 8);		/* Copy bit to InexactFilter. */		for (i = 0; i < 8; i++) {			pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |=				pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[i];		}#ifdef DEBUG		SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("GMAC InexactRlmtFilter: %02X %02X %02X %02X %02X %02X %02X %02X\n",			pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[0],			pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[1],			pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[2],			pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[3],			pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[4],			pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[5],			pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[6],			pAC->Addr.Port[PortNumber].InexactRlmtFilter.Bytes[7]))#endif	/* DEBUG */	}	else {	/* not permanent => DRV */		/* Add bit to InexactDrvFilter. */		pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[HashBit / 8] |=			1 << (HashBit % 8);		/* Copy bit to InexactFilter. */		for (i = 0; i < 8; i++) {			pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] |=				pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[i];		}#ifdef DEBUG		SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("GMAC InexactDrvFilter: %02X %02X %02X %02X %02X %02X %02X %02X\n",			pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[0],			pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[1],			pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[2],			pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[3],			pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[4],			pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[5],			pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[6],			pAC->Addr.Port[PortNumber].InexactDrvFilter.Bytes[7]))#endif	/* DEBUG */	}#else	/* SK_ADDR_CHEAT */	/* Set all bits in InexactFilter. */	for (i = 0; i < 8; i++) {		pAC->Addr.Port[PortNumber].InexactFilter.Bytes[i] = 0xFF;	}#endif	/* SK_ADDR_CHEAT */	return (SK_MC_FILTERING_INEXACT);}	/* SkAddrGmacMcAdd *//****************************************************************************** * *	SkAddrMcUpdate - update the HW MC address table and set the MAC address * * Description: *	This routine enables reception of the addresses contained in a local *	table for a given port. *	It also programs the port's current physical MAC address. * *	It calls either SkAddrXmacMcUpdate or SkAddrGmacMcUpdate, according *	to the adapter in use. The real work is done there. * * Notes: *	The return code is only valid for SK_PROM_MODE_NONE. * * Context: *	runtime, pageable *	may be called after SK_INIT_IO * * Returns: *	SK_MC_FILTERING_EXACT *	SK_MC_FILTERING_INEXACT *	SK_ADDR_ILLEGAL_PORT */int	SkAddrMcUpdate(SK_AC	*pAC,		/* adapter context */SK_IOC	IoC,		/* I/O context */SK_U32	PortNumber)	/* Port Number */{	int ReturnCode;	if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) {		return (SK_ADDR_ILLEGAL_PORT);	}	if (pAC->GIni.GIChipId == CHIP_ID_GENESIS) {		ReturnCode = SkAddrXmacMcUpdate(pAC, IoC, PortNumber);	}	else {		ReturnCode = SkAddrGmacMcUpdate(pAC, IoC, PortNumber);	}	return (ReturnCode);}	/* SkAddrMcUpdate *//****************************************************************************** * *	SkAddrXmacMcUpdate - update the HW MC address table and set the MAC address * * Description: *	This routine enables reception of the addresses contained in a local *	table for a given port. *	It also programs the port's current physical MAC address. * * Notes: *	The return code is only valid for SK_PROM_MODE_NONE. * * Context: *	runtime, pageable *	may be called after SK_INIT_IO * * Returns: *	SK_MC_FILTERING_EXACT *	SK_MC_FILTERING_INEXACT *	SK_ADDR_ILLEGAL_PORT */int	SkAddrXmacMcUpdate(SK_AC	*pAC,		/* adapter context */SK_IOC	IoC,		/* I/O context */SK_U32	PortNumber)	/* Port Number */{	SK_U32		i;	SK_U8		Inexact;	SK_U16		*OutAddr;	SK_ADDR_PORT	*pAPort;	SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("SkAddrXmacMcUpdate on Port %u.\n", PortNumber))	pAPort = &pAC->Addr.Port[PortNumber];#ifdef DEBUG	SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber]))#endif	/* DEBUG */	/* Start with 0 to also program the logical MAC address. */	for (i = 0; i < pAPort->NextExactMatchRlmt; i++) {		/* Set exact match address i on XMAC */		OutAddr = (SK_U16 *) &pAPort->Exact[i].a[0];		XM_OUTADDR(IoC, PortNumber, XM_EXM(i), OutAddr);	}	/* Clear other permanent exact match addresses on XMAC */	if (pAPort->NextExactMatchRlmt <= SK_ADDR_LAST_MATCH_RLMT) {		SkXmClrExactAddr(pAC, IoC, PortNumber, pAPort->NextExactMatchRlmt,			SK_ADDR_LAST_MATCH_RLMT);	}	for (i = pAPort->FirstExactMatchDrv; i < pAPort->NextExactMatchDrv; i++) {		OutAddr = (SK_U16 *) &pAPort->Exact[i].a[0];		XM_OUTADDR(IoC, PortNumber, XM_EXM(i), OutAddr);	}	/* Clear other non-permanent exact match addresses on XMAC */	if (pAPort->NextExactMatchDrv <= SK_ADDR_LAST_MATCH_DRV) {		SkXmClrExactAddr(pAC, IoC, PortNumber, pAPort->NextExactMatchDrv,			SK_ADDR_LAST_MATCH_DRV);	}	for (Inexact = 0, i = 0; i < 8; i++) {		Inexact |= pAPort->InexactFilter.Bytes[i];	}	if (pAPort->PromMode & SK_PROM_MODE_ALL_MC) {		/* Set all bits in 64-bit hash register. */		XM_OUTHASH(IoC, PortNumber, XM_HSM, &OnesHash);		/* Enable Hashing */		SkMacHashing(pAC, IoC, PortNumber, SK_TRUE);	}	else if (Inexact != 0) {		/* Set 64-bit hash register to InexactFilter. */		XM_OUTHASH(IoC, PortNumber, XM_HSM, &pAPort->InexactFilter.Bytes[0]);		/* Enable Hashing */		SkMacHashing(pAC, IoC, PortNumber, SK_TRUE);	}	else {		/* Disable Hashing */		SkMacHashing(pAC, IoC, PortNumber, SK_FALSE);	}	if (pAPort->PromMode != SK_PROM_MODE_NONE) {		(void) SkAddrXmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode);	}	/* Set port's current physical MAC address. */	OutAddr = (SK_U16 *) &pAPort->CurrentMacAddress.a[0];	XM_OUTADDR(IoC, PortNumber, XM_SA, OutAddr);#ifdef xDEBUG	for (i = 0; i < pAPort->NextExactMatchRlmt; i++) {		SK_U8		InAddr8[6];		SK_U16		*InAddr;		/* Get exact match address i from port PortNumber. */		InAddr = (SK_U16 *) &InAddr8[0];		XM_INADDR(IoC, PortNumber, XM_EXM(i), InAddr);		SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,			("SkAddrXmacMcUpdate: MC address %d on Port %u: ",			 "%02x %02x %02x %02x %02x %02x -- %02x %02x %02x %02x %02x %02x\n",				i,				PortNumber,				InAddr8[0],				InAddr8[1],				InAddr8[2],				InAddr8[3],				InAddr8[4],				InAddr8[5],				pAPort->Exact[i].a[0],				pAPort->Exact[i].a[1],				pAPort->Exact[i].a[2],				pAPort->Exact[i].a[3],				pAPort->Exact[i].a[4],				pAPort->Exact[i].a[5]))	}#endif	/* DEBUG */	/* Determine return value. */	if (Inexact == 0 && pAPort->PromMode == 0) {		return (SK_MC_FILTERING_EXACT);	}	else {		return (SK_MC_FILTERING_INEXACT);	}}	/* SkAddrXmacMcUpdate *//****************************************************************************** * *	SkAddrGmacMcUpdate - update the HW MC address table and set the MAC address * * Description: *	This routine enables reception of the addresses contained in a local *	table for a given port. *	It also programs the port's current physical MAC address. * * Notes: *	The return code is only valid for SK_PROM_MODE_NONE. * * Context: *	runtime, pageable *	may be called after SK_INIT_IO * * Returns: *	SK_MC_FILTERING_EXACT *	SK_MC_FILTERING_INEXACT *	SK_ADDR_ILLEGAL_PORT */int	SkAddrGmacMcUpdate(SK_AC	*pAC,		/* adapter context */SK_IOC	IoC,		/* I/O context */SK_U32	PortNumber)	/* Port Number */{	SK_U32		i;	SK_U8		Inexact;	SK_U16		*OutAddr;	SK_ADDR_PORT	*pAPort;	SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("SkAddrGmacMcUpdate on Port %u.\n", PortNumber))	pAPort = &pAC->Addr.Port[PortNumber];#ifdef DEBUG	SK_DBG_MSG(pAC,SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("Next0 on Port %d: %d\n", PortNumber, Next0[PortNumber]))#endif	/* DEBUG */	for (Inexact = 0, i = 0; i < 8; i++) {		Inexact |= pAPort->InexactFilter.Bytes[i];	}	/* Set 64-bit hash register to InexactFilter. */	GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1,		&pAPort->InexactFilter.Bytes[0]);	if (pAPort->PromMode & SK_PROM_MODE_ALL_MC) {		/* Set all bits in 64-bit hash register. */		GM_OUTHASH(IoC, PortNumber, GM_MC_ADDR_H1, &OnesHash);		/* Enable Hashing */		SkMacHashing(pAC, IoC, PortNumber, SK_TRUE);	}	else {		/* Enable Hashing. */		SkMacHashing(pAC, IoC, PortNumber, SK_TRUE);	}	if (pAPort->PromMode != SK_PROM_MODE_NONE) {		(void) SkAddrGmacPromiscuousChange(pAC, IoC, PortNumber, pAPort->PromMode);	}	/* Set port's current physical MAC address. */	OutAddr = (SK_U16 *) &pAPort->CurrentMacAddress.a[0];	GM_OUTADDR(IoC, PortNumber, GM_SRC_ADDR_1L, OutAddr);	/* Set port's current logical MAC address. */	OutAddr = (SK_U16 *) &pAPort->Exact[0].a[0];	GM_OUTADDR(IoC, PortNumber, GM_SRC_ADDR_2L, OutAddr);#ifdef DEBUG	SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("SkAddrGmacMcUpdate: Permanent Physical MAC Address: %02X %02X %02X %02X %02X %02X\n",			pAPort->Exact[0].a[0],			pAPort->Exact[0].a[1],			pAPort->Exact[0].a[2],			pAPort->Exact[0].a[3],			pAPort->Exact[0].a[4],			pAPort->Exact[0].a[5]))	SK_DBG_MSG(pAC, SK_DBGMOD_ADDR, SK_DBGCAT_CTRL,		("SkAddrGmacMcUpdate: Physical MAC Address: %02X %02X %02X %02X %02X %02X\n",			pAPort->CurrentMacAddress.a[0],			pAPort->CurrentMacAddress.a[1],			pAPort->CurrentMacAddress.a[2],			pAPort->CurrentMacAddress.a[3],			pAPort->CurrentMacAddress.a[4],			pAPort->CurrentMacAddress.a[5]))#endif	/* DEBUG */	/* Determine return value. */	if (Inexact == 0 && pAPort->PromMode == 0) {		return (SK_MC_FILTERING_EXACT);	}	else {		return (SK_MC_FILTERING_INEXACT);	}}	/* SkAddrGmacMcUpdate *//****************************************************************************** * *	SkAddrOverride - override a port's MAC address * * Description: *	This routine overrides the MAC address of one port. * * Context: *	runtime, pageable *	may be called after SK_INIT_IO * * Returns: *	SK_ADDR_SUCCESS if successful. *	SK_ADDR_DUPLICATE_ADDRESS if duplicate MAC address. *	SK_ADDR_MULTICAST_ADDRESS if multicast or broadcast address. *	SK_ADDR_TOO_EARLY if SK_INIT_IO was not executed before. */int	SkAddrOverride(SK_AC		*pAC,		/* adapter context */SK_IOC		IoC,		/* I/O context */SK_U32		PortNumber,	/* Port Number */SK_MAC_ADDR	*pNewAddr,	/* new MAC address */int			Flags)		/* logical/physical MAC address */{	SK_EVPARA	Para;	SK_U32		NetNumber;	SK_U32		i;	SK_U16		*OutAddr;	NetNumber = pAC->Rlmt.Port[PortNumber].Net->NetNumber;	if (PortNumber >= (SK_U32) pAC->GIni.GIMacsFound) {		return (SK_ADDR_ILLEGAL_PORT);	}	if (pNewAddr != NULL && (pNewAddr->a[0] & SK_MC_BIT) != 0) {		return (SK_ADDR_MULTICAST_ADDRESS);	}	if (!pAC->Addr.Net[NetNumber].CurrentMacAddressSet) {		return (SK_ADDR_TOO_EARLY);	}	if (Flags & SK_ADDR_SET_LOGICAL) {	/* Activate logical MAC address. */		/* Parameter *pNewAddr is ignored. */		for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) {			if (!pAC->Addr.Port[i].CurrentMacAddressSet) {				return (SK_ADDR_TOO_EARLY);			}		}		/* Set PortNumber to number of net's active port. */		PortNumber = pAC->Rlmt.Net[NetNumber].			Port[pAC->Addr.Net[NetNumber].ActivePort]->PortNumber;		pAC->Addr.Port[PortNumber].Exact[0] =			pAC->Addr.Net[NetNumber].CurrentMacAddress;		/* Write address to first exact match entry of active port. */		(void) SkAddrMcUpdate(pAC, IoC, PortNumber);	}	else if (Flags & SK_ADDR_CLEAR_LOGICAL) {		/* Deactivate logical MAC address. */		/* Parameter *pNewAddr is ignored. */		for (i = 0; i < (SK_U32) pAC->GIni.GIMacsFound; i++) {			if (!pAC->Addr.Port[i].CurrentMacAddressSet) {				return (SK_ADDR_TOO_EARLY);			}		}		/* Set PortNumber to number of net's active port. */		PortNumber = pAC->Rlmt.Net[NetNumber].			Port[pAC->Addr.Net[NetNumber].ActivePort]->PortNumber;		for (i = 0; i < SK_MAC_ADDR_LEN; i++ ) {			pAC->Addr.Port[PortNumber].Exact[0].a[i] = 0;		}		/* Write address to first exact match entry of active port. */		(void) SkAddrMcUpdate(pAC, IoC, PortNumber);	}	else if (Flags & SK_ADDR_PHYSICAL_ADDRESS) {	/* Physical MAC address. */		if (SK_ADDR_EQUAL(pNewAddr->a,			pAC->Addr.Net[NetNumber].CurrentMacAddress.a)) {

⌨️ 快捷键说明

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