/**
 * @fn ixEthAccStatsShow(void)
 *
 * @brief Displays all EthAcc stats
 *
 * @return void
 *
 */
void ixEthAccStatsShow(IxEthAccPortId portId)
{
    ixEthAccMdioShow();

    printf("\nPort %u\nUnicast MAC : ", portId);
    ixEthAccPortUnicastAddressShow(portId);
    ixEthAccPortMulticastAddressShow(portId);
    printf("\n");

    ixEthAccDataPlaneShow();
}
IX_STATUS 
ixEthAccCodeletPortConfigure(IxEthAccPortId portId,
	     IxEthAccPortRxCallback portRxCB,
	     IxEthAccPortMultiBufferRxCallback portMultiBufferRxCB,
	     IxEthAccPortTxDoneCallback portTxDoneCB,
	     UINT32 callbackTag)
{
    IxEthAccMacAddr npeMacAddr1 = IX_ETHACC_CODELET_NPEB_MAC;
    IxEthAccMacAddr npeMacAddr2 = IX_ETHACC_CODELET_NPEC_MAC;
    IxEthAccMacAddr npeMacAddr3 = IX_ETHACC_CODELET_NPEA_MAC;
    IxEthAccMacAddr npeMacAddr;
			     
    /* Clear stats */
    ixOsalMemSet(&ixEthAccCodeletStats[portId], 
	   0, 
	   sizeof(ixEthAccCodeletStats[portId]));

    /* check the PHY is up, ignore the result. This is called to 
     * display the current PHY status to the console
     */
    (void)ixEthAccCodeletLinkUpCheck(portId);
    
    /* register the datapath Rx callbacks */
    if (NULL != portRxCB)
    {
	if(ixEthAccPortRxCallbackRegister(portId,
					  portRxCB,
					  callbackTag) 
	   != IX_ETH_ACC_SUCCESS)
	{
	    printf("PortSetup: Failed to register Rx callback for port %u\n",
		   (UINT32)portId);
	    return (IX_FAIL);
	}
    }
    else if (NULL != portMultiBufferRxCB)
    {
	if(ixEthAccPortMultiBufferRxCallbackRegister(portId,
						     portMultiBufferRxCB,
						     callbackTag) 
	   != IX_ETH_ACC_SUCCESS)
	{
	    printf("PortSetup: Failed to register multiBuffer Rx callback for port %u\n",
		   (UINT32)portId);
	    return (IX_FAIL);
	}
    }
    else
    {
	printf("PortSetup: Failed to register any Rx callback for port %u\n",
	       (UINT32)portId);
	return (IX_FAIL);
    }

    /* register the datapath TxDone callbacks */
    if(ixEthAccPortTxDoneCallbackRegister(portId,
					  portTxDoneCB,
					  callbackTag) != IX_ETH_ACC_SUCCESS)
    {
	printf("PortSetup: Failed to register Tx done callback for port %u\n",
	       (UINT32)portId);
	return (IX_FAIL);
    }

#if defined (__vxworks) && defined (IX_ETHACC_CODELET_USE_NVRAM_MAC)
    printf("\nReading MAC address information from non-volatile storage...\n");

    if (portId == IX_ETH_PORT_1)
    {
	if(sysNvRamGet((UINT8 *)&npeMacAddr.macAddress, 
		       IX_IEEE803_MAC_ADDRESS_SIZE, 
		       NV_MAC_ADRS_NPE1) == ERROR)
	{
	    printf("PortSetup: Unable to read MAC address from non-volatile storage!\n");
	    return (IX_FAIL);
	}
    }
    else if (portId == IX_ETH_PORT_2)
    {
	if(sysNvRamGet((UINT8 *)&npeMacAddr.macAddress, 
		       IX_IEEE803_MAC_ADDRESS_SIZE, 
		       NV_MAC_ADRS_NPE2) == ERROR)
	{
	    printf("PortSetup: Unable to read MAC address from non-volatile storage!\n");
	    return (IX_FAIL);
	}
    }
    else
    {
	printf("PortSetup: Unsupported port!\n");
	return (IX_FAIL);
    }
#else
    if (portId == IX_ETH_PORT_1)
    {
	ixOsalMemCopy(npeMacAddr.macAddress, 
	       npeMacAddr1.macAddress, 
	       IX_IEEE803_MAC_ADDRESS_SIZE);
    }
    else if (portId == IX_ETH_PORT_2)
    {
	ixOsalMemCopy(npeMacAddr.macAddress, 
	       npeMacAddr2.macAddress, 
	       IX_IEEE803_MAC_ADDRESS_SIZE);
    }
    else if (portId == IX_ETH_PORT_3)
    {
	ixOsalMemCopy(npeMacAddr.macAddress, 
	       npeMacAddr3.macAddress, 
	       IX_IEEE803_MAC_ADDRESS_SIZE);
    }
    else
    {
	printf("PortSetup: Unsupported port!\n");
	return (IX_FAIL);
    }
#endif
    
    printf ("Configure MAC address...\n");
    if(ixEthAccPortUnicastMacAddressSet(portId, &npeMacAddr)
	   != IX_ETH_ACC_SUCCESS)
    {
	printf("PortSetup: Failed to set the Unicast MAC Address of port %u\n",
	       portId);
	return (IX_FAIL);
    }
    
    printf("Port %u MAC address is:\t\n", (UINT32)portId);
    ixEthAccPortUnicastAddressShow(portId);
    
    printf ("Provision the first RX buffers...\n");
    if(ixEthAccCodeletReplenishBuffers(portId, 
				       IX_ETHACC_CODELET_RX_MBUF_POOL_SIZE/IX_ETHACC_CODELET_MAX_PORT) 
       != IX_SUCCESS)
    {
	printf("PortSetup: Error replenishing port %u\n",
	       (UINT32)portId);
	return (IX_FAIL);
    }

    return IX_SUCCESS;
}