interrupt.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. /*
  2. * Copyright (C) 2013 Realtek Semiconductor Corp.
  3. * All Rights Reserved.
  4. *
  5. * Unless you and Realtek execute a separate written software license
  6. * agreement governing use of this software, this software is licensed
  7. * to you under the terms of the GNU General Public License version 2,
  8. * available at https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
  9. *
  10. * $Revision: 76306 $
  11. * $Date: 2017-03-08 15:13:58 +0800 (週三, 08 三月 2017) $
  12. *
  13. * Purpose : RTK switch high-level API for RTL8367/RTL8367C
  14. * Feature : Here is a list of all functions and variables in Interrupt module.
  15. *
  16. */
  17. #include <rtk_switch.h>
  18. #include <rtk_error.h>
  19. #include <interrupt.h>
  20. #include <string.h>
  21. #include <rtl8367c_asicdrv.h>
  22. #include <rtl8367c_asicdrv_interrupt.h>
  23. /* Function Name:
  24. * rtk_int_polarity_set
  25. * Description:
  26. * Set interrupt polarity configuration.
  27. * Input:
  28. * type - Interruptpolarity type.
  29. * Output:
  30. * None
  31. * Return:
  32. * RT_ERR_OK - OK
  33. * RT_ERR_FAILED - Failed
  34. * RT_ERR_SMI - SMI access error
  35. * RT_ERR_INPUT - Invalid input parameters.
  36. * Note:
  37. * The API can set interrupt polarity configuration.
  38. */
  39. rtk_api_ret_t rtk_int_polarity_set(rtk_int_polarity_t type)
  40. {
  41. rtk_api_ret_t retVal;
  42. /* Check initialization state */
  43. RTK_CHK_INIT_STATE();
  44. if(type >= INT_POLAR_END)
  45. return RT_ERR_INPUT;
  46. if ((retVal = rtl8367c_setAsicInterruptPolarity(type)) != RT_ERR_OK)
  47. return retVal;
  48. return RT_ERR_OK;
  49. }
  50. /* Function Name:
  51. * rtk_int_polarity_get
  52. * Description:
  53. * Get interrupt polarity configuration.
  54. * Input:
  55. * None
  56. * Output:
  57. * pType - Interruptpolarity type.
  58. * Return:
  59. * RT_ERR_OK - OK
  60. * RT_ERR_FAILED - Failed
  61. * RT_ERR_SMI - SMI access error
  62. * Note:
  63. * The API can get interrupt polarity configuration.
  64. */
  65. rtk_api_ret_t rtk_int_polarity_get(rtk_int_polarity_t *pType)
  66. {
  67. rtk_api_ret_t retVal;
  68. /* Check initialization state */
  69. RTK_CHK_INIT_STATE();
  70. if(NULL == pType)
  71. return RT_ERR_NULL_POINTER;
  72. if ((retVal = rtl8367c_getAsicInterruptPolarity(pType)) != RT_ERR_OK)
  73. return retVal;
  74. return RT_ERR_OK;
  75. }
  76. /* Function Name:
  77. * rtk_int_control_set
  78. * Description:
  79. * Set interrupt trigger status configuration.
  80. * Input:
  81. * type - Interrupt type.
  82. * enable - Interrupt status.
  83. * Output:
  84. * None
  85. * Return:
  86. * RT_ERR_OK - OK
  87. * RT_ERR_FAILED - Failed
  88. * RT_ERR_SMI - SMI access error
  89. * RT_ERR_INPUT - Invalid input parameters.
  90. * RT_ERR_ENABLE - Invalid enable input.
  91. * Note:
  92. * The API can set interrupt status configuration.
  93. * The interrupt trigger status is shown in the following:
  94. * - INT_TYPE_LINK_STATUS
  95. * - INT_TYPE_METER_EXCEED
  96. * - INT_TYPE_LEARN_LIMIT
  97. * - INT_TYPE_LINK_SPEED
  98. * - INT_TYPE_CONGEST
  99. * - INT_TYPE_GREEN_FEATURE
  100. * - INT_TYPE_LOOP_DETECT
  101. * - INT_TYPE_8051,
  102. * - INT_TYPE_CABLE_DIAG,
  103. * - INT_TYPE_ACL,
  104. * - INT_TYPE_SLIENT
  105. */
  106. rtk_api_ret_t rtk_int_control_set(rtk_int_type_t type, rtk_enable_t enable)
  107. {
  108. rtk_api_ret_t retVal;
  109. rtk_uint32 mask;
  110. /* Check initialization state */
  111. RTK_CHK_INIT_STATE();
  112. if (type >= INT_TYPE_END)
  113. return RT_ERR_INPUT;
  114. if (type == INT_TYPE_RESERVED)
  115. return RT_ERR_INPUT;
  116. if ((retVal = rtl8367c_getAsicInterruptMask(&mask)) != RT_ERR_OK)
  117. return retVal;
  118. if (ENABLED == enable)
  119. mask = mask | (1<<type);
  120. else if (DISABLED == enable)
  121. mask = mask & ~(1<<type);
  122. else
  123. return RT_ERR_INPUT;
  124. if ((retVal = rtl8367c_setAsicInterruptMask(mask)) != RT_ERR_OK)
  125. return retVal;
  126. return RT_ERR_OK;
  127. }
  128. /* Function Name:
  129. * rtk_int_control_get
  130. * Description:
  131. * Get interrupt trigger status configuration.
  132. * Input:
  133. * type - Interrupt type.
  134. * Output:
  135. * pEnable - Interrupt status.
  136. * Return:
  137. * RT_ERR_OK - OK
  138. * RT_ERR_FAILED - Failed
  139. * RT_ERR_SMI - SMI access error
  140. * RT_ERR_INPUT - Invalid input parameters.
  141. * Note:
  142. * The API can get interrupt status configuration.
  143. * The interrupt trigger status is shown in the following:
  144. * - INT_TYPE_LINK_STATUS
  145. * - INT_TYPE_METER_EXCEED
  146. * - INT_TYPE_LEARN_LIMIT
  147. * - INT_TYPE_LINK_SPEED
  148. * - INT_TYPE_CONGEST
  149. * - INT_TYPE_GREEN_FEATURE
  150. * - INT_TYPE_LOOP_DETECT
  151. * - INT_TYPE_8051,
  152. * - INT_TYPE_CABLE_DIAG,
  153. * - INT_TYPE_ACL,
  154. * - INT_TYPE_UPS,
  155. * - INT_TYPE_SLIENT
  156. */
  157. rtk_api_ret_t rtk_int_control_get(rtk_int_type_t type, rtk_enable_t *pEnable)
  158. {
  159. rtk_api_ret_t retVal;
  160. rtk_uint32 mask;
  161. /* Check initialization state */
  162. RTK_CHK_INIT_STATE();
  163. if(NULL == pEnable)
  164. return RT_ERR_NULL_POINTER;
  165. if ((retVal = rtl8367c_getAsicInterruptMask(&mask)) != RT_ERR_OK)
  166. return retVal;
  167. if (0 == (mask&(1<<type)))
  168. *pEnable=DISABLED;
  169. else
  170. *pEnable=ENABLED;
  171. return RT_ERR_OK;
  172. }
  173. /* Function Name:
  174. * rtk_int_status_set
  175. * Description:
  176. * Set interrupt trigger status to clean.
  177. * Input:
  178. * None
  179. * Output:
  180. * pStatusMask - Interrupt status bit mask.
  181. * Return:
  182. * RT_ERR_OK - OK
  183. * RT_ERR_FAILED - Failed
  184. * RT_ERR_SMI - SMI access error
  185. * RT_ERR_INPUT - Invalid input parameters.
  186. * Note:
  187. * The API can clean interrupt trigger status when interrupt happened.
  188. * The interrupt trigger status is shown in the following:
  189. * - INT_TYPE_LINK_STATUS (value[0] (Bit0))
  190. * - INT_TYPE_METER_EXCEED (value[0] (Bit1))
  191. * - INT_TYPE_LEARN_LIMIT (value[0] (Bit2))
  192. * - INT_TYPE_LINK_SPEED (value[0] (Bit3))
  193. * - INT_TYPE_CONGEST (value[0] (Bit4))
  194. * - INT_TYPE_GREEN_FEATURE (value[0] (Bit5))
  195. * - INT_TYPE_LOOP_DETECT (value[0] (Bit6))
  196. * - INT_TYPE_8051 (value[0] (Bit7))
  197. * - INT_TYPE_CABLE_DIAG (value[0] (Bit8))
  198. * - INT_TYPE_ACL (value[0] (Bit9))
  199. * - INT_TYPE_SLIENT (value[0] (Bit11))
  200. * The status will be cleared after execute this API.
  201. */
  202. rtk_api_ret_t rtk_int_status_set(rtk_int_status_t *pStatusMask)
  203. {
  204. rtk_api_ret_t retVal;
  205. /* Check initialization state */
  206. RTK_CHK_INIT_STATE();
  207. if(NULL == pStatusMask)
  208. return RT_ERR_NULL_POINTER;
  209. if(pStatusMask->value[0] & (0x0001 << INT_TYPE_RESERVED))
  210. return RT_ERR_INPUT;
  211. if(pStatusMask->value[0] >= (0x0001 << INT_TYPE_END))
  212. return RT_ERR_INPUT;
  213. if ((retVal = rtl8367c_setAsicInterruptStatus((rtk_uint32)pStatusMask->value[0]))!=RT_ERR_OK)
  214. return retVal;
  215. return RT_ERR_OK;
  216. }
  217. /* Function Name:
  218. * rtk_int_status_get
  219. * Description:
  220. * Get interrupt trigger status.
  221. * Input:
  222. * None
  223. * Output:
  224. * pStatusMask - Interrupt status bit mask.
  225. * Return:
  226. * RT_ERR_OK - OK
  227. * RT_ERR_FAILED - Failed
  228. * RT_ERR_SMI - SMI access error
  229. * RT_ERR_INPUT - Invalid input parameters.
  230. * Note:
  231. * The API can get interrupt trigger status when interrupt happened.
  232. * The interrupt trigger status is shown in the following:
  233. * - INT_TYPE_LINK_STATUS (value[0] (Bit0))
  234. * - INT_TYPE_METER_EXCEED (value[0] (Bit1))
  235. * - INT_TYPE_LEARN_LIMIT (value[0] (Bit2))
  236. * - INT_TYPE_LINK_SPEED (value[0] (Bit3))
  237. * - INT_TYPE_CONGEST (value[0] (Bit4))
  238. * - INT_TYPE_GREEN_FEATURE (value[0] (Bit5))
  239. * - INT_TYPE_LOOP_DETECT (value[0] (Bit6))
  240. * - INT_TYPE_8051 (value[0] (Bit7))
  241. * - INT_TYPE_CABLE_DIAG (value[0] (Bit8))
  242. * - INT_TYPE_ACL (value[0] (Bit9))
  243. * - INT_TYPE_SLIENT (value[0] (Bit11))
  244. *
  245. */
  246. rtk_api_ret_t rtk_int_status_get(rtk_int_status_t* pStatusMask)
  247. {
  248. rtk_api_ret_t retVal;
  249. rtk_uint32 ims_mask;
  250. /* Check initialization state */
  251. RTK_CHK_INIT_STATE();
  252. if(NULL == pStatusMask)
  253. return RT_ERR_NULL_POINTER;
  254. if ((retVal = rtl8367c_getAsicInterruptStatus(&ims_mask)) != RT_ERR_OK)
  255. return retVal;
  256. pStatusMask->value[0] = (ims_mask & 0x00000FFF);
  257. return RT_ERR_OK;
  258. }
  259. #define ADV_NOT_SUPPORT (0xFFFF)
  260. static rtk_api_ret_t _rtk_int_Advidx_get(rtk_int_advType_t adv_type, rtk_uint32 *pAsic_idx)
  261. {
  262. rtk_uint32 asic_idx[ADV_END] =
  263. {
  264. INTRST_L2_LEARN,
  265. INTRST_SPEED_CHANGE,
  266. INTRST_SPECIAL_CONGESTION,
  267. INTRST_PORT_LINKDOWN,
  268. INTRST_PORT_LINKUP,
  269. ADV_NOT_SUPPORT,
  270. INTRST_RLDP_LOOPED,
  271. INTRST_RLDP_RELEASED,
  272. };
  273. if(adv_type >= ADV_END)
  274. return RT_ERR_INPUT;
  275. if(asic_idx[adv_type] == ADV_NOT_SUPPORT)
  276. return RT_ERR_CHIP_NOT_SUPPORTED;
  277. *pAsic_idx = asic_idx[adv_type];
  278. return RT_ERR_OK;
  279. }
  280. /* Function Name:
  281. * rtk_int_advanceInfo_get
  282. * Description:
  283. * Get interrupt advanced information.
  284. * Input:
  285. * adv_type - Advanced interrupt type.
  286. * Output:
  287. * info - Information per type.
  288. * Return:
  289. * RT_ERR_OK - OK
  290. * RT_ERR_FAILED - Failed
  291. * RT_ERR_SMI - SMI access error
  292. * RT_ERR_INPUT - Invalid input parameters.
  293. * Note:
  294. * This API can get advanced information when interrupt happened.
  295. * The status will be cleared after execute this API.
  296. */
  297. rtk_api_ret_t rtk_int_advanceInfo_get(rtk_int_advType_t adv_type, rtk_int_info_t *pInfo)
  298. {
  299. rtk_api_ret_t retVal;
  300. rtk_uint32 data;
  301. rtk_uint32 intAdvType;
  302. /* Check initialization state */
  303. RTK_CHK_INIT_STATE();
  304. if(adv_type >= ADV_END)
  305. return RT_ERR_INPUT;
  306. if(NULL == pInfo)
  307. return RT_ERR_NULL_POINTER;
  308. if(adv_type != ADV_METER_EXCEED_MASK)
  309. {
  310. if((retVal = _rtk_int_Advidx_get(adv_type, &intAdvType)) != RT_ERR_OK)
  311. return retVal;
  312. }
  313. switch(adv_type)
  314. {
  315. case ADV_L2_LEARN_PORT_MASK:
  316. /* Get physical portmask */
  317. if((retVal = rtl8367c_getAsicInterruptRelatedStatus(intAdvType, &data)) != RT_ERR_OK)
  318. return retVal;
  319. /* Clear Advanced Info */
  320. if((retVal = rtl8367c_setAsicInterruptRelatedStatus(intAdvType, 0xFFFF)) != RT_ERR_OK)
  321. return retVal;
  322. /* Translate to logical portmask */
  323. if((retVal = rtk_switch_portmask_P2L_get(data, &(pInfo->portMask))) != RT_ERR_OK)
  324. return retVal;
  325. /* Get system learn */
  326. if((retVal = rtl8367c_getAsicInterruptRelatedStatus(INTRST_SYS_LEARN, &data)) != RT_ERR_OK)
  327. return retVal;
  328. /* Clear system learn */
  329. if((retVal = rtl8367c_setAsicInterruptRelatedStatus(INTRST_SYS_LEARN, 0x0001)) != RT_ERR_OK)
  330. return retVal;
  331. pInfo->systemLearnOver = data;
  332. break;
  333. case ADV_SPEED_CHANGE_PORT_MASK:
  334. case ADV_SPECIAL_CONGESTION_PORT_MASK:
  335. case ADV_PORT_LINKDOWN_PORT_MASK:
  336. case ADV_PORT_LINKUP_PORT_MASK:
  337. case ADV_RLDP_LOOPED:
  338. case ADV_RLDP_RELEASED:
  339. /* Get physical portmask */
  340. if((retVal = rtl8367c_getAsicInterruptRelatedStatus(intAdvType, &data)) != RT_ERR_OK)
  341. return retVal;
  342. /* Clear Advanced Info */
  343. if((retVal = rtl8367c_setAsicInterruptRelatedStatus(intAdvType, 0xFFFF)) != RT_ERR_OK)
  344. return retVal;
  345. /* Translate to logical portmask */
  346. if((retVal = rtk_switch_portmask_P2L_get(data, &(pInfo->portMask))) != RT_ERR_OK)
  347. return retVal;
  348. break;
  349. case ADV_METER_EXCEED_MASK:
  350. /* Get Meter Mask */
  351. if((retVal = rtl8367c_getAsicInterruptRelatedStatus(INTRST_METER0_15, &data)) != RT_ERR_OK)
  352. return retVal;
  353. /* Clear Advanced Info */
  354. if((retVal = rtl8367c_setAsicInterruptRelatedStatus(INTRST_METER0_15, 0xFFFF)) != RT_ERR_OK)
  355. return retVal;
  356. pInfo->meterMask = data & 0xFFFF;
  357. /* Get Meter Mask */
  358. if((retVal = rtl8367c_getAsicInterruptRelatedStatus(INTRST_METER16_31, &data)) != RT_ERR_OK)
  359. return retVal;
  360. /* Clear Advanced Info */
  361. if((retVal = rtl8367c_setAsicInterruptRelatedStatus(INTRST_METER16_31, 0xFFFF)) != RT_ERR_OK)
  362. return retVal;
  363. pInfo->meterMask = pInfo->meterMask | ((data << 16) & 0xFFFF0000);
  364. break;
  365. default:
  366. return RT_ERR_INPUT;
  367. }
  368. return RT_ERR_OK;
  369. }