2 * Copyright (C) 2013 Realtek Semiconductor Corp.
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
11 * $Date: 2017-03-08 15:13:58 +0800 (週三, 08 三月 2017) $
13 * Purpose : RTK switch high-level API for RTL8367/RTL8367C
14 * Feature : Here is a list of all functions and variables in Interrupt module.
18 #include <rtk_switch.h>
19 #include <rtk_error.h>
20 #include <interrupt.h>
23 #include <rtl8367c_asicdrv.h>
24 #include <rtl8367c_asicdrv_interrupt.h>
27 * rtk_int_polarity_set
29 * Set interrupt polarity configuration.
31 * type - Interruptpolarity type.
36 * RT_ERR_FAILED - Failed
37 * RT_ERR_SMI - SMI access error
38 * RT_ERR_INPUT - Invalid input parameters.
40 * The API can set interrupt polarity configuration.
42 rtk_api_ret_t
rtk_int_polarity_set(rtk_int_polarity_t type
)
46 /* Check initialization state */
49 if(type
>= INT_POLAR_END
)
52 if ((retVal
= rtl8367c_setAsicInterruptPolarity(type
)) != RT_ERR_OK
)
59 * rtk_int_polarity_get
61 * Get interrupt polarity configuration.
65 * pType - Interruptpolarity type.
68 * RT_ERR_FAILED - Failed
69 * RT_ERR_SMI - SMI access error
71 * The API can get interrupt polarity configuration.
73 rtk_api_ret_t
rtk_int_polarity_get(rtk_int_polarity_t
*pType
)
77 /* Check initialization state */
81 return RT_ERR_NULL_POINTER
;
83 if ((retVal
= rtl8367c_getAsicInterruptPolarity(pType
)) != RT_ERR_OK
)
92 * Set interrupt trigger status configuration.
94 * type - Interrupt type.
95 * enable - Interrupt status.
100 * RT_ERR_FAILED - Failed
101 * RT_ERR_SMI - SMI access error
102 * RT_ERR_INPUT - Invalid input parameters.
103 * RT_ERR_ENABLE - Invalid enable input.
105 * The API can set interrupt status configuration.
106 * The interrupt trigger status is shown in the following:
107 * - INT_TYPE_LINK_STATUS
108 * - INT_TYPE_METER_EXCEED
109 * - INT_TYPE_LEARN_LIMIT
110 * - INT_TYPE_LINK_SPEED
112 * - INT_TYPE_GREEN_FEATURE
113 * - INT_TYPE_LOOP_DETECT
115 * - INT_TYPE_CABLE_DIAG,
119 rtk_api_ret_t
rtk_int_control_set(rtk_int_type_t type
, rtk_enable_t enable
)
121 rtk_api_ret_t retVal
;
124 /* Check initialization state */
125 RTK_CHK_INIT_STATE();
127 if (type
>= INT_TYPE_END
)
130 if (type
== INT_TYPE_RESERVED
)
133 if ((retVal
= rtl8367c_getAsicInterruptMask(&mask
)) != RT_ERR_OK
)
136 if (ENABLED
== enable
)
137 mask
= mask
| (1<<type
);
138 else if (DISABLED
== enable
)
139 mask
= mask
& ~(1<<type
);
143 if ((retVal
= rtl8367c_setAsicInterruptMask(mask
)) != RT_ERR_OK
)
151 * rtk_int_control_get
153 * Get interrupt trigger status configuration.
155 * type - Interrupt type.
157 * pEnable - Interrupt status.
160 * RT_ERR_FAILED - Failed
161 * RT_ERR_SMI - SMI access error
162 * RT_ERR_INPUT - Invalid input parameters.
164 * The API can get interrupt status configuration.
165 * The interrupt trigger status is shown in the following:
166 * - INT_TYPE_LINK_STATUS
167 * - INT_TYPE_METER_EXCEED
168 * - INT_TYPE_LEARN_LIMIT
169 * - INT_TYPE_LINK_SPEED
171 * - INT_TYPE_GREEN_FEATURE
172 * - INT_TYPE_LOOP_DETECT
174 * - INT_TYPE_CABLE_DIAG,
179 rtk_api_ret_t
rtk_int_control_get(rtk_int_type_t type
, rtk_enable_t
*pEnable
)
181 rtk_api_ret_t retVal
;
184 /* Check initialization state */
185 RTK_CHK_INIT_STATE();
188 return RT_ERR_NULL_POINTER
;
190 if ((retVal
= rtl8367c_getAsicInterruptMask(&mask
)) != RT_ERR_OK
)
193 if (0 == (mask
&(1<<type
)))
204 * Set interrupt trigger status to clean.
208 * pStatusMask - Interrupt status bit mask.
211 * RT_ERR_FAILED - Failed
212 * RT_ERR_SMI - SMI access error
213 * RT_ERR_INPUT - Invalid input parameters.
215 * The API can clean interrupt trigger status when interrupt happened.
216 * The interrupt trigger status is shown in the following:
217 * - INT_TYPE_LINK_STATUS (value[0] (Bit0))
218 * - INT_TYPE_METER_EXCEED (value[0] (Bit1))
219 * - INT_TYPE_LEARN_LIMIT (value[0] (Bit2))
220 * - INT_TYPE_LINK_SPEED (value[0] (Bit3))
221 * - INT_TYPE_CONGEST (value[0] (Bit4))
222 * - INT_TYPE_GREEN_FEATURE (value[0] (Bit5))
223 * - INT_TYPE_LOOP_DETECT (value[0] (Bit6))
224 * - INT_TYPE_8051 (value[0] (Bit7))
225 * - INT_TYPE_CABLE_DIAG (value[0] (Bit8))
226 * - INT_TYPE_ACL (value[0] (Bit9))
227 * - INT_TYPE_SLIENT (value[0] (Bit11))
228 * The status will be cleared after execute this API.
230 rtk_api_ret_t
rtk_int_status_set(rtk_int_status_t
*pStatusMask
)
232 rtk_api_ret_t retVal
;
234 /* Check initialization state */
235 RTK_CHK_INIT_STATE();
237 if(NULL
== pStatusMask
)
238 return RT_ERR_NULL_POINTER
;
240 if(pStatusMask
->value
[0] & (0x0001 << INT_TYPE_RESERVED
))
243 if(pStatusMask
->value
[0] >= (0x0001 << INT_TYPE_END
))
246 if ((retVal
= rtl8367c_setAsicInterruptStatus((rtk_uint32
)pStatusMask
->value
[0]))!=RT_ERR_OK
)
255 * Get interrupt trigger status.
259 * pStatusMask - Interrupt status bit mask.
262 * RT_ERR_FAILED - Failed
263 * RT_ERR_SMI - SMI access error
264 * RT_ERR_INPUT - Invalid input parameters.
266 * The API can get interrupt trigger status when interrupt happened.
267 * The interrupt trigger status is shown in the following:
268 * - INT_TYPE_LINK_STATUS (value[0] (Bit0))
269 * - INT_TYPE_METER_EXCEED (value[0] (Bit1))
270 * - INT_TYPE_LEARN_LIMIT (value[0] (Bit2))
271 * - INT_TYPE_LINK_SPEED (value[0] (Bit3))
272 * - INT_TYPE_CONGEST (value[0] (Bit4))
273 * - INT_TYPE_GREEN_FEATURE (value[0] (Bit5))
274 * - INT_TYPE_LOOP_DETECT (value[0] (Bit6))
275 * - INT_TYPE_8051 (value[0] (Bit7))
276 * - INT_TYPE_CABLE_DIAG (value[0] (Bit8))
277 * - INT_TYPE_ACL (value[0] (Bit9))
278 * - INT_TYPE_SLIENT (value[0] (Bit11))
281 rtk_api_ret_t
rtk_int_status_get(rtk_int_status_t
* pStatusMask
)
283 rtk_api_ret_t retVal
;
286 /* Check initialization state */
287 RTK_CHK_INIT_STATE();
289 if(NULL
== pStatusMask
)
290 return RT_ERR_NULL_POINTER
;
292 if ((retVal
= rtl8367c_getAsicInterruptStatus(&ims_mask
)) != RT_ERR_OK
)
295 pStatusMask
->value
[0] = (ims_mask
& 0x00000FFF);
299 #define ADV_NOT_SUPPORT (0xFFFF)
300 static rtk_api_ret_t
_rtk_int_Advidx_get(rtk_int_advType_t adv_type
, rtk_uint32
*pAsic_idx
)
302 rtk_uint32 asic_idx
[ADV_END
] =
306 INTRST_SPECIAL_CONGESTION
,
307 INTRST_PORT_LINKDOWN
,
311 INTRST_RLDP_RELEASED
,
314 if(adv_type
>= ADV_END
)
317 if(asic_idx
[adv_type
] == ADV_NOT_SUPPORT
)
318 return RT_ERR_CHIP_NOT_SUPPORTED
;
320 *pAsic_idx
= asic_idx
[adv_type
];
325 * rtk_int_advanceInfo_get
327 * Get interrupt advanced information.
329 * adv_type - Advanced interrupt type.
331 * info - Information per type.
334 * RT_ERR_FAILED - Failed
335 * RT_ERR_SMI - SMI access error
336 * RT_ERR_INPUT - Invalid input parameters.
338 * This API can get advanced information when interrupt happened.
339 * The status will be cleared after execute this API.
341 rtk_api_ret_t
rtk_int_advanceInfo_get(rtk_int_advType_t adv_type
, rtk_int_info_t
*pInfo
)
343 rtk_api_ret_t retVal
;
345 rtk_uint32 intAdvType
;
347 /* Check initialization state */
348 RTK_CHK_INIT_STATE();
350 if(adv_type
>= ADV_END
)
354 return RT_ERR_NULL_POINTER
;
356 if(adv_type
!= ADV_METER_EXCEED_MASK
)
358 if((retVal
= _rtk_int_Advidx_get(adv_type
, &intAdvType
)) != RT_ERR_OK
)
364 case ADV_L2_LEARN_PORT_MASK
:
365 /* Get physical portmask */
366 if((retVal
= rtl8367c_getAsicInterruptRelatedStatus(intAdvType
, &data
)) != RT_ERR_OK
)
369 /* Clear Advanced Info */
370 if((retVal
= rtl8367c_setAsicInterruptRelatedStatus(intAdvType
, 0xFFFF)) != RT_ERR_OK
)
373 /* Translate to logical portmask */
374 if((retVal
= rtk_switch_portmask_P2L_get(data
, &(pInfo
->portMask
))) != RT_ERR_OK
)
377 /* Get system learn */
378 if((retVal
= rtl8367c_getAsicInterruptRelatedStatus(INTRST_SYS_LEARN
, &data
)) != RT_ERR_OK
)
381 /* Clear system learn */
382 if((retVal
= rtl8367c_setAsicInterruptRelatedStatus(INTRST_SYS_LEARN
, 0x0001)) != RT_ERR_OK
)
385 pInfo
->systemLearnOver
= data
;
387 case ADV_SPEED_CHANGE_PORT_MASK
:
388 case ADV_SPECIAL_CONGESTION_PORT_MASK
:
389 case ADV_PORT_LINKDOWN_PORT_MASK
:
390 case ADV_PORT_LINKUP_PORT_MASK
:
391 case ADV_RLDP_LOOPED
:
392 case ADV_RLDP_RELEASED
:
393 /* Get physical portmask */
394 if((retVal
= rtl8367c_getAsicInterruptRelatedStatus(intAdvType
, &data
)) != RT_ERR_OK
)
397 /* Clear Advanced Info */
398 if((retVal
= rtl8367c_setAsicInterruptRelatedStatus(intAdvType
, 0xFFFF)) != RT_ERR_OK
)
401 /* Translate to logical portmask */
402 if((retVal
= rtk_switch_portmask_P2L_get(data
, &(pInfo
->portMask
))) != RT_ERR_OK
)
406 case ADV_METER_EXCEED_MASK
:
408 if((retVal
= rtl8367c_getAsicInterruptRelatedStatus(INTRST_METER0_15
, &data
)) != RT_ERR_OK
)
411 /* Clear Advanced Info */
412 if((retVal
= rtl8367c_setAsicInterruptRelatedStatus(INTRST_METER0_15
, 0xFFFF)) != RT_ERR_OK
)
415 pInfo
->meterMask
= data
& 0xFFFF;
418 if((retVal
= rtl8367c_getAsicInterruptRelatedStatus(INTRST_METER16_31
, &data
)) != RT_ERR_OK
)
421 /* Clear Advanced Info */
422 if((retVal
= rtl8367c_setAsicInterruptRelatedStatus(INTRST_METER16_31
, 0xFFFF)) != RT_ERR_OK
)
425 pInfo
->meterMask
= pInfo
->meterMask
| ((data
<< 16) & 0xFFFF0000);