IxEthAcc.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /**
  2. * @file IxEthAcc.c
  3. *
  4. * @author Intel Corporation
  5. * @date 20-Feb-2001
  6. *
  7. * @brief This file contains the implementation of the IXP425 Ethernet Access Component
  8. *
  9. * Design Notes:
  10. *
  11. * @par
  12. * IXP400 SW Release version 2.0
  13. *
  14. * -- Copyright Notice --
  15. *
  16. * @par
  17. * Copyright 2001-2005, Intel Corporation.
  18. * All rights reserved.
  19. *
  20. * @par
  21. * SPDX-License-Identifier: BSD-3-Clause
  22. * @par
  23. * -- End of Copyright Notice --
  24. */
  25. #include "IxEthAcc.h"
  26. #ifdef CONFIG_IXP425_COMPONENT_ETHDB
  27. #include "IxEthDB.h"
  28. #endif
  29. #include "IxFeatureCtrl.h"
  30. #include "IxEthAcc_p.h"
  31. #include "IxEthAccMac_p.h"
  32. #include "IxEthAccMii_p.h"
  33. /**
  34. * @addtogroup IxEthAcc
  35. *@{
  36. */
  37. /**
  38. * @brief System-wide information data strucure.
  39. *
  40. * @ingroup IxEthAccPri
  41. *
  42. */
  43. IxEthAccInfo ixEthAccDataInfo;
  44. extern PUBLIC IxEthAccMacState ixEthAccMacState[];
  45. extern PUBLIC IxOsalMutex ixEthAccControlInterfaceMutex;
  46. /**
  47. * @brief System-wide information
  48. *
  49. * @ingroup IxEthAccPri
  50. *
  51. */
  52. BOOL ixEthAccServiceInit = false;
  53. /* global filtering bit mask */
  54. PUBLIC UINT32 ixEthAccNewSrcMask;
  55. /**
  56. * @brief Per port information data strucure.
  57. *
  58. * @ingroup IxEthAccPri
  59. *
  60. */
  61. IxEthAccPortDataInfo ixEthAccPortData[IX_ETH_ACC_NUMBER_OF_PORTS];
  62. PUBLIC IxEthAccStatus ixEthAccInit()
  63. {
  64. #ifdef CONFIG_IXP425_COMPONENT_ETHDB
  65. /*
  66. * Initialize Control plane
  67. */
  68. if (ixEthDBInit() != IX_ETH_DB_SUCCESS)
  69. {
  70. IX_ETH_ACC_WARNING_LOG("ixEthAccInit: EthDB init failed\n", 0, 0, 0, 0, 0, 0);
  71. return IX_ETH_ACC_FAIL;
  72. }
  73. #endif
  74. if (IX_FEATURE_CTRL_SWCONFIG_ENABLED == ixFeatureCtrlSwConfigurationCheck (IX_FEATURECTRL_ETH_LEARNING))
  75. {
  76. ixEthAccNewSrcMask = (~0); /* want all the bits */
  77. }
  78. else
  79. {
  80. ixEthAccNewSrcMask = (~IX_ETHACC_NE_NEWSRCMASK); /* want all but the NewSrc bit */
  81. }
  82. /*
  83. * Initialize Data plane
  84. */
  85. if ( ixEthAccInitDataPlane() != IX_ETH_ACC_SUCCESS )
  86. {
  87. IX_ETH_ACC_WARNING_LOG("ixEthAccInit: data plane init failed\n", 0, 0, 0, 0, 0, 0);
  88. return IX_ETH_ACC_FAIL;
  89. }
  90. if ( ixEthAccQMgrQueuesConfig() != IX_ETH_ACC_SUCCESS )
  91. {
  92. IX_ETH_ACC_WARNING_LOG("ixEthAccInit: queue config failed\n", 0, 0, 0, 0, 0, 0);
  93. return IX_ETH_ACC_FAIL;
  94. }
  95. /*
  96. * Initialize MII
  97. */
  98. if ( ixEthAccMiiInit() != IX_ETH_ACC_SUCCESS )
  99. {
  100. IX_ETH_ACC_WARNING_LOG("ixEthAccInit: Mii init failed\n", 0, 0, 0, 0, 0, 0);
  101. return IX_ETH_ACC_FAIL;
  102. }
  103. /*
  104. * Initialize MAC I/O memory
  105. */
  106. if (ixEthAccMacMemInit() != IX_ETH_ACC_SUCCESS)
  107. {
  108. IX_ETH_ACC_WARNING_LOG("ixEthAccInit: Mac init failed\n", 0, 0, 0, 0, 0, 0);
  109. return IX_ETH_ACC_FAIL;
  110. }
  111. /*
  112. * Initialize control plane interface lock
  113. */
  114. if (ixOsalMutexInit(&ixEthAccControlInterfaceMutex) != IX_SUCCESS)
  115. {
  116. IX_ETH_ACC_WARNING_LOG("ixEthAccInit: Control plane interface lock initialization failed\n", 0, 0, 0, 0, 0, 0);
  117. return IX_ETH_ACC_FAIL;
  118. }
  119. /* initialiasation is complete */
  120. ixEthAccServiceInit = true;
  121. return IX_ETH_ACC_SUCCESS;
  122. }
  123. PUBLIC void ixEthAccUnload(void)
  124. {
  125. IxEthAccPortId portId;
  126. if ( IX_ETH_ACC_IS_SERVICE_INITIALIZED() )
  127. {
  128. /* check none of the port is still active */
  129. for (portId = 0; portId < IX_ETH_ACC_NUMBER_OF_PORTS; portId++)
  130. {
  131. if ( IX_ETH_IS_PORT_INITIALIZED(portId) )
  132. {
  133. if (ixEthAccMacState[portId].portDisableState == ACTIVE)
  134. {
  135. IX_ETH_ACC_WARNING_LOG("ixEthAccUnload: port %u still active, bail out\n", portId, 0, 0, 0, 0, 0);
  136. return;
  137. }
  138. }
  139. }
  140. /* unmap the memory areas */
  141. ixEthAccMiiUnload();
  142. ixEthAccMacUnload();
  143. /* set all ports as uninitialized */
  144. for (portId = 0; portId < IX_ETH_ACC_NUMBER_OF_PORTS; portId++)
  145. {
  146. ixEthAccPortData[portId].portInitialized = false;
  147. }
  148. /* uninitialize the service */
  149. ixEthAccServiceInit = false;
  150. }
  151. }
  152. PUBLIC IxEthAccStatus ixEthAccPortInit( IxEthAccPortId portId)
  153. {
  154. IxEthAccStatus ret=IX_ETH_ACC_SUCCESS;
  155. if ( ! IX_ETH_ACC_IS_SERVICE_INITIALIZED() )
  156. {
  157. return(IX_ETH_ACC_FAIL);
  158. }
  159. /*
  160. * Check for valid port
  161. */
  162. if ( ! IX_ETH_ACC_IS_PORT_VALID(portId) )
  163. {
  164. return (IX_ETH_ACC_INVALID_PORT);
  165. }
  166. if (IX_ETH_ACC_SUCCESS != ixEthAccSingleEthNpeCheck(portId))
  167. {
  168. IX_ETH_ACC_WARNING_LOG("EthAcc: Unavailable Eth %d: Cannot initialize Eth port.\n",(INT32) portId,0,0,0,0,0);
  169. return IX_ETH_ACC_SUCCESS ;
  170. }
  171. if ( IX_ETH_IS_PORT_INITIALIZED(portId) )
  172. {
  173. /* Already initialized */
  174. return(IX_ETH_ACC_FAIL);
  175. }
  176. if(ixEthAccMacInit(portId)!=IX_ETH_ACC_SUCCESS)
  177. {
  178. return IX_ETH_ACC_FAIL;
  179. }
  180. /*
  181. * Set the port init flag.
  182. */
  183. ixEthAccPortData[portId].portInitialized = true;
  184. #ifdef CONFIG_IXP425_COMPONENT_ETHDB
  185. /* init learning/filtering database structures for this port */
  186. ixEthDBPortInit(portId);
  187. #endif
  188. return(ret);
  189. }