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

📄 ixethaccmac.c

📁 有关ARM开发板上的IXP400网络驱动程序的源码以。
💻 C
📖 第 1 页 / 共 5 页
字号:
	      IX_ETH_ACC_MAC_SLOT_TIME_DEFAULT);    REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_INT_CLK_THRESH,	      IX_ETH_ACC_MAC_INT_CLK_THRESH_DEFAULT);    REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_BUF_SIZE_TX,	      IX_ETH_ACC_MAC_BUF_SIZE_TX_DEFAULT);    REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_TX_CNTRL1,	      IX_ETH_ACC_TX_CNTRL1_DEFAULT);    REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_RX_CNTRL1,	      IX_ETH_ACC_RX_CNTRL1_DEFAULT);    /* set the global state */    ixEthAccMacState[portId].portDisableState = ACTIVE;    ixEthAccMacState[portId].enabled = TRUE;    /* Update MAC State */    ixEthAccMacStateUpdate(portId);        return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortLoopbackEnable(IxEthAccPortId portId){    UINT32 regval;    /* Turn off promiscuous mode */        IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }       /* read register */    REG_READ(ixEthAccMacBase[portId], 	     IX_ETH_ACC_MAC_RX_CNTRL1,	     regval);        /* update register */    REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_RX_CNTRL1,	      regval | IX_ETH_ACC_RX_CNTRL1_LOOP_EN);    return IX_ETH_ACC_SUCCESS;}PRIVATE voidixEthAccNpeLoopbackMessageCallback (IxNpeMhNpeId npeId,				    IxNpeMhMessage msg){    IxEthAccPortId portId = IX_ETHNPE_NODE_AND_PORT_TO_PHYSICAL_ID(npeId,0);#ifndef NDEBUG    /* Prudent to at least check the port is within range */    if (portId >= IX_ETH_ACC_NUMBER_OF_PORTS)    {        IX_ETH_ACC_FATAL_LOG("IXETHACC:ixEthAccNpeLoopbackMessageCallback: Illegal port: %u\n",            (UINT32) portId, 0, 0, 0, 0, 0);        return;    }#endif    /* unlock message reception mutex */    ixOsalMutexUnlock(&ixEthAccMacState[portId].npeLoopbackMessageLock);}IxEthAccStatus ixEthAccNpeLoopbackEnablePriv(IxEthAccPortId portId){    IX_STATUS npeMhStatus;    IxNpeMhMessage message;    IxEthAccStatus status = IX_ETH_ACC_SUCCESS;    /* Turn off promiscuous mode */        IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }       /* enable NPE loopback (lsb of the message contains the value 1) */    message.data[0] = (IX_ETHNPE_SETLOOPBACK_MODE << IX_ETH_ACC_MAC_MSGID_SHL)        | (IX_ETHNPE_PHYSICAL_ID_TO_LOGICAL_ID(portId) << IX_ETH_ACC_MAC_PORTID_SHL)	| 0x01;    message.data[1] = 0;        npeMhStatus = ixNpeMhMessageWithResponseSend(IX_ETHNPE_PHYSICAL_ID_TO_NODE(portId), 		message,		IX_ETHNPE_SETLOOPBACK_MODE_ACK,		ixEthAccNpeLoopbackMessageCallback, 		IX_NPEMH_SEND_RETRIES_DEFAULT);    if (npeMhStatus != IX_SUCCESS)    {        status = IX_ETH_ACC_FAIL;    }    else    {	/* wait for NPE loopbackEnable response */        if (ixOsalMutexLock(&ixEthAccMacState[portId].npeLoopbackMessageLock, 			    IX_ETH_ACC_PORT_DISABLE_DELAY_MSECS) 	    != IX_SUCCESS)        {            status = IX_ETH_ACC_FAIL;        }    }    return status;}IxEthAccStatus ixEthAccPortTxEnablePriv(IxEthAccPortId portId){    UINT32 regval;    /* Turn off promiscuous mode */        IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }       /* read register */    REG_READ(ixEthAccMacBase[portId], 	     IX_ETH_ACC_MAC_TX_CNTRL1,	     regval);        /* update register */    REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_TX_CNTRL1,	      regval | IX_ETH_ACC_TX_CNTRL1_TX_EN);    return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortRxEnablePriv(IxEthAccPortId portId){    UINT32 regval;    /* Turn off promiscuous mode */        IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }       /* read register */    REG_READ(ixEthAccMacBase[portId], 	     IX_ETH_ACC_MAC_RX_CNTRL1,	     regval);        /* update register */    REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_RX_CNTRL1,	      regval | IX_ETH_ACC_RX_CNTRL1_RX_EN);    return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortLoopbackDisable(IxEthAccPortId portId){    UINT32 regval;    IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }       /*disable MAC loopabck */    REG_READ(ixEthAccMacBase[portId], 	     IX_ETH_ACC_MAC_RX_CNTRL1,	     regval);        REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_RX_CNTRL1,	      (regval & ~IX_ETH_ACC_RX_CNTRL1_LOOP_EN));    return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccNpeLoopbackDisablePriv(IxEthAccPortId portId){    IX_STATUS npeMhStatus;    IxNpeMhMessage message;    IxEthAccStatus status = IX_ETH_ACC_SUCCESS;    /* Turn off promiscuous mode */        IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }       /* disable NPE loopback (lsb of the message contains the value 0) */    message.data[0] = (IX_ETHNPE_SETLOOPBACK_MODE << IX_ETH_ACC_MAC_MSGID_SHL)        | (IX_ETHNPE_PHYSICAL_ID_TO_LOGICAL_ID(portId) << IX_ETH_ACC_MAC_PORTID_SHL);    message.data[1] = 0;        npeMhStatus = ixNpeMhMessageWithResponseSend(IX_ETHNPE_PHYSICAL_ID_TO_NODE(portId), 		message,		IX_ETHNPE_SETLOOPBACK_MODE_ACK,		ixEthAccNpeLoopbackMessageCallback, 		IX_NPEMH_SEND_RETRIES_DEFAULT);    if (npeMhStatus != IX_SUCCESS)    {        status = IX_ETH_ACC_FAIL;    }    else    {	/* wait for NPE loopbackEnable response */        if (ixOsalMutexLock(&ixEthAccMacState[portId].npeLoopbackMessageLock, 			    IX_ETH_ACC_PORT_DISABLE_DELAY_MSECS) 	    != IX_SUCCESS)        {            status = IX_ETH_ACC_FAIL;        }    }    return status;}IxEthAccStatus ixEthAccPortTxDisablePriv(IxEthAccPortId portId){    UINT32 regval;    /* Turn off promiscuous mode */        IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }       /* read register */    REG_READ(ixEthAccMacBase[portId], 	     IX_ETH_ACC_MAC_TX_CNTRL1,	     regval);        /* update register */    REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_TX_CNTRL1,	      (regval & ~IX_ETH_ACC_TX_CNTRL1_TX_EN));    return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortRxDisablePriv(IxEthAccPortId portId){    UINT32 regval;    /* Turn off promiscuous mode */        IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }       /* read register */    REG_READ(ixEthAccMacBase[portId], 	     IX_ETH_ACC_MAC_RX_CNTRL1,	     regval);        /* update register */    REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_RX_CNTRL1,	      (regval & ~IX_ETH_ACC_RX_CNTRL1_RX_EN));    return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortPromiscuousModeClearPriv(IxEthAccPortId portId){    UINT32 regval;    /* Turn off promiscuous mode */        IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }       /*set bit 5 of Rx control 1 - enable address filtering*/    REG_READ(ixEthAccMacBase[portId],	     IX_ETH_ACC_MAC_RX_CNTRL1,	     regval);        REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_RX_CNTRL1,	      regval | IX_ETH_ACC_RX_CNTRL1_ADDR_FLTR_EN);    ixEthAccMacState[portId].promiscuous = FALSE;    ixEthAccMulticastAddressSet(portId);    return IX_ETH_ACC_SUCCESS;}IxEthAccStatus  ixEthAccPortPromiscuousModeSetPriv(IxEthAccPortId portId){    UINT32 regval;    IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }        /*      * Set bit 5 of Rx control 1 - We enable address filtering even in     * promiscuous mode because we want the MAC to set the appropriate     * bits in m_flags which doesn't happen if we turn off filtering.     */    REG_READ(ixEthAccMacBase[portId], 	     IX_ETH_ACC_MAC_RX_CNTRL1,	     regval);        REG_WRITE(ixEthAccMacBase[portId],	      IX_ETH_ACC_MAC_RX_CNTRL1,	      regval | IX_ETH_ACC_RX_CNTRL1_ADDR_FLTR_EN);    ixEthAccMacState[portId].promiscuous = TRUE;    ixEthAccMulticastAddressSet(portId);    return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortUnicastMacAddressSetPriv (IxEthAccPortId portId,				  IxEthAccMacAddr *macAddr){    UINT32 i;    IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_PORT_UNINITIALIZED);    }    if (macAddr == NULL)    {	return IX_ETH_ACC_FAIL;    }        if ( macAddr->macAddress[0] & IX_ETH_ACC_ETH_MAC_BCAST_MCAST_BIT )    {	/* This is a multicast/broadcast address cant set it ! */	return IX_ETH_ACC_FAIL;    }    if ( macAddr->macAddress[0] == 0 &&	 macAddr->macAddress[1] == 0 &&	 macAddr->macAddress[2] == 0 &&	 macAddr->macAddress[3] == 0 &&	 macAddr->macAddress[4] == 0 &&	 macAddr->macAddress[5] == 0  )    {	/* This is an invalid mac address cant set it ! */	return IX_ETH_ACC_FAIL;    }	    /* update the MAC address in the ethernet database */    if (ixEthDBPortAddressSet(portId, (IxEthDBMacAddr *) macAddr) != IX_ETH_DB_SUCCESS)    {        return IX_ETH_ACC_FAIL;    }        /*Set the Unicast MAC to the specified value*/    for(i=0;i<IX_IEEE803_MAC_ADDRESS_SIZE;i++)    {		REG_WRITE(ixEthAccMacBase[portId],		  IX_ETH_ACC_MAC_UNI_ADDR_1 + i*sizeof(UINT32),		  macAddr->macAddress[i]);	    }    ixEthAccMacState[portId].initDone = TRUE;    return IX_ETH_ACC_SUCCESS;}IxEthAccStatus ixEthAccPortUnicastMacAddressGetPriv (IxEthAccPortId portId, 				  IxEthAccMacAddr *macAddr){    /*Return the current value of the Unicast MAC from h/w      for the specified port*/    UINT32 i;    if (macAddr == NULL)    {	return IX_ETH_ACC_FAIL;    } else {        /* always zero out the address */        IX_ETH_ACC_MEMSET(macAddr, 0, IX_IEEE803_MAC_ADDRESS_SIZE);    }            IX_ETH_ACC_VALIDATE_PORT_ID(portId);    if (!IX_ETH_IS_PORT_INITIALIZED(portId))    {	return (IX_ETH_ACC_MAC_UNINITIALIZED);    }    if(!ixEthAccMacState[portId].initDone)    {	return (IX_ETH_ACC_MAC_UNINITIALIZED);    }            for(i=0;i<IX_IEEE803_MAC_ADDRESS_SIZE;i++)    {	REG_READ(ixEthAccMacBase[portId],		 IX_ETH_ACC_MAC_UNI_ADDR_1 + i*sizeof(UINT32),		 macAddr->macAddress[i]);	    }    return IX_ETH_ACC_SUCCESS;}PRIVATE IxEthAccStatusixEthAccPortMulticastMacAddressGet (IxEthAccPortId portId,				    IxEthAccMacAddr *macAddr){    /*Return the current value of the Multicast MAC from h/w      for the specified port*/    UINT32 i;    for(i=0;i<IX_IEEE803_MAC_ADDRESS_SIZE;i++)    {	REG_READ(ixEthAccMacBase[portId],

⌨️ 快捷键说明

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