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 MIB module.
18 #include <rtk_switch.h>
19 #include <rtk_error.h>
23 #include <rtl8367c_asicdrv.h>
24 #include <rtl8367c_asicdrv_mib.h>
27 * rtk_stat_global_reset
29 * Reset global MIB counter.
36 * RT_ERR_FAILED - Failed
37 * RT_ERR_SMI - SMI access error
39 * Reset MIB counter of ports. API will use global reset while port mask is all-ports.
41 rtk_api_ret_t
rtk_stat_global_reset(void)
45 /* Check initialization state */
48 if ((retVal
= rtl8367c_setAsicMIBsCounterReset(TRUE
,FALSE
, 0)) != RT_ERR_OK
)
57 * Reset per port MIB counter by port.
64 * RT_ERR_FAILED - Failed
65 * RT_ERR_SMI - SMI access error
69 rtk_api_ret_t
rtk_stat_port_reset(rtk_port_t port
)
73 /* Check initialization state */
76 /* Check port valid */
77 RTK_CHK_PORT_VALID(port
);
79 if ((retVal
= rtl8367c_setAsicMIBsCounterReset(FALSE
,FALSE
,1 << rtk_switch_port_L2P_get(port
))) != RT_ERR_OK
)
86 * rtk_stat_queueManage_reset
88 * Reset queue manage MIB counter.
95 * RT_ERR_FAILED - Failed
96 * RT_ERR_SMI - SMI access error
100 rtk_api_ret_t
rtk_stat_queueManage_reset(void)
102 rtk_api_ret_t retVal
;
104 /* Check initialization state */
105 RTK_CHK_INIT_STATE();
107 if ((retVal
= rtl8367c_setAsicMIBsCounterReset(FALSE
,TRUE
,0)) != RT_ERR_OK
)
115 * rtk_stat_global_get
117 * Get global MIB counter
119 * cntr_idx - global counter index.
121 * pCntr - global counter value.
124 * RT_ERR_FAILED - Failed
125 * RT_ERR_SMI - SMI access error
126 * RT_ERR_INPUT - Invalid input parameters.
128 * Get global MIB counter by index definition.
130 rtk_api_ret_t
rtk_stat_global_get(rtk_stat_global_type_t cntr_idx
, rtk_stat_counter_t
*pCntr
)
132 rtk_api_ret_t retVal
;
134 /* Check initialization state */
135 RTK_CHK_INIT_STATE();
138 return RT_ERR_NULL_POINTER
;
140 if (cntr_idx
!=DOT1D_TP_LEARNED_ENTRY_DISCARDS_INDEX
)
141 return RT_ERR_STAT_INVALID_GLOBAL_CNTR
;
143 if ((retVal
= rtl8367c_getAsicMIBsCounter(0, (RTL8367C_MIBCOUNTER
)cntr_idx
, pCntr
)) != RT_ERR_OK
)
150 * rtk_stat_global_getAll
152 * Get all global MIB counter
156 * pGlobal_cntrs - global counter structure.
159 * RT_ERR_FAILED - Failed
160 * RT_ERR_SMI - SMI access error
161 * RT_ERR_INPUT - Invalid input parameters.
163 * Get all global MIB counter by index definition.
165 rtk_api_ret_t
rtk_stat_global_getAll(rtk_stat_global_cntr_t
*pGlobal_cntrs
)
167 rtk_api_ret_t retVal
;
169 /* Check initialization state */
170 RTK_CHK_INIT_STATE();
172 if(NULL
== pGlobal_cntrs
)
173 return RT_ERR_NULL_POINTER
;
175 if ((retVal
= rtl8367c_getAsicMIBsCounter(0, dot1dTpLearnedEntryDiscards
, &pGlobal_cntrs
->dot1dTpLearnedEntryDiscards
)) != RT_ERR_OK
)
181 #define MIB_NOT_SUPPORT (0xFFFF)
182 static rtk_api_ret_t
_get_asic_mib_idx(rtk_stat_port_type_t cnt_idx
, RTL8367C_MIBCOUNTER
*pMib_idx
)
184 RTL8367C_MIBCOUNTER mib_asic_idx
[STAT_PORT_CNTR_END
]=
186 ifInOctets
, /* STAT_IfInOctets */
187 dot3StatsFCSErrors
, /* STAT_Dot3StatsFCSErrors */
188 dot3StatsSymbolErrors
, /* STAT_Dot3StatsSymbolErrors */
189 dot3InPauseFrames
, /* STAT_Dot3InPauseFrames */
190 dot3ControlInUnknownOpcodes
, /* STAT_Dot3ControlInUnknownOpcodes */
191 etherStatsFragments
, /* STAT_EtherStatsFragments */
192 etherStatsJabbers
, /* STAT_EtherStatsJabbers */
193 ifInUcastPkts
, /* STAT_IfInUcastPkts */
194 etherStatsDropEvents
, /* STAT_EtherStatsDropEvents */
195 etherStatsOctets
, /* STAT_EtherStatsOctets */
196 etherStatsUnderSizePkts
, /* STAT_EtherStatsUnderSizePkts */
197 etherOversizeStats
, /* STAT_EtherOversizeStats */
198 etherStatsPkts64Octets
, /* STAT_EtherStatsPkts64Octets */
199 etherStatsPkts65to127Octets
, /* STAT_EtherStatsPkts65to127Octets */
200 etherStatsPkts128to255Octets
, /* STAT_EtherStatsPkts128to255Octets */
201 etherStatsPkts256to511Octets
, /* STAT_EtherStatsPkts256to511Octets */
202 etherStatsPkts512to1023Octets
, /* STAT_EtherStatsPkts512to1023Octets */
203 etherStatsPkts1024to1518Octets
, /* STAT_EtherStatsPkts1024to1518Octets */
204 ifInMulticastPkts
, /* STAT_EtherStatsMulticastPkts */
205 ifInBroadcastPkts
, /* STAT_EtherStatsBroadcastPkts */
206 ifOutOctets
, /* STAT_IfOutOctets */
207 dot3StatsSingleCollisionFrames
, /* STAT_Dot3StatsSingleCollisionFrames */
208 dot3StatMultipleCollisionFrames
,/* STAT_Dot3StatsMultipleCollisionFrames */
209 dot3sDeferredTransmissions
, /* STAT_Dot3StatsDeferredTransmissions */
210 dot3StatsLateCollisions
, /* STAT_Dot3StatsLateCollisions */
211 etherStatsCollisions
, /* STAT_EtherStatsCollisions */
212 dot3StatsExcessiveCollisions
, /* STAT_Dot3StatsExcessiveCollisions */
213 dot3OutPauseFrames
, /* STAT_Dot3OutPauseFrames */
214 MIB_NOT_SUPPORT
, /* STAT_Dot1dBasePortDelayExceededDiscards */
215 dot1dTpPortInDiscards
, /* STAT_Dot1dTpPortInDiscards */
216 ifOutUcastPkts
, /* STAT_IfOutUcastPkts */
217 ifOutMulticastPkts
, /* STAT_IfOutMulticastPkts */
218 ifOutBroadcastPkts
, /* STAT_IfOutBroadcastPkts */
219 outOampduPkts
, /* STAT_OutOampduPkts */
220 inOampduPkts
, /* STAT_InOampduPkts */
221 MIB_NOT_SUPPORT
, /* STAT_PktgenPkts */
222 inMldChecksumError
, /* STAT_InMldChecksumError */
223 inIgmpChecksumError
, /* STAT_InIgmpChecksumError */
224 inMldSpecificQuery
, /* STAT_InMldSpecificQuery */
225 inMldGeneralQuery
, /* STAT_InMldGeneralQuery */
226 inIgmpSpecificQuery
, /* STAT_InIgmpSpecificQuery */
227 inIgmpGeneralQuery
, /* STAT_InIgmpGeneralQuery */
228 inMldLeaves
, /* STAT_InMldLeaves */
229 inIgmpLeaves
, /* STAT_InIgmpInterfaceLeaves */
230 inIgmpJoinsSuccess
, /* STAT_InIgmpJoinsSuccess */
231 inIgmpJoinsFail
, /* STAT_InIgmpJoinsFail */
232 inMldJoinsSuccess
, /* STAT_InMldJoinsSuccess */
233 inMldJoinsFail
, /* STAT_InMldJoinsFail */
234 inReportSuppressionDrop
, /* STAT_InReportSuppressionDrop */
235 inLeaveSuppressionDrop
, /* STAT_InLeaveSuppressionDrop */
236 outIgmpReports
, /* STAT_OutIgmpReports */
237 outIgmpLeaves
, /* STAT_OutIgmpLeaves */
238 outIgmpGeneralQuery
, /* STAT_OutIgmpGeneralQuery */
239 outIgmpSpecificQuery
, /* STAT_OutIgmpSpecificQuery */
240 outMldReports
, /* STAT_OutMldReports */
241 outMldLeaves
, /* STAT_OutMldLeaves */
242 outMldGeneralQuery
, /* STAT_OutMldGeneralQuery */
243 outMldSpecificQuery
, /* STAT_OutMldSpecificQuery */
244 inKnownMulticastPkts
, /* STAT_InKnownMulticastPkts */
245 ifInMulticastPkts
, /* STAT_IfInMulticastPkts */
246 ifInBroadcastPkts
, /* STAT_IfInBroadcastPkts */
247 ifOutDiscards
/* STAT_IfOutDiscards */
250 if(cnt_idx
>= STAT_PORT_CNTR_END
)
251 return RT_ERR_STAT_INVALID_PORT_CNTR
;
253 if(mib_asic_idx
[cnt_idx
] == MIB_NOT_SUPPORT
)
254 return RT_ERR_CHIP_NOT_SUPPORTED
;
256 *pMib_idx
= mib_asic_idx
[cnt_idx
];
263 * Get per port MIB counter by index
266 * cntr_idx - port counter index.
268 * pCntr - MIB retrived counter.
271 * RT_ERR_FAILED - Failed
272 * RT_ERR_SMI - SMI access error
274 * Get per port MIB counter by index definition.
276 rtk_api_ret_t
rtk_stat_port_get(rtk_port_t port
, rtk_stat_port_type_t cntr_idx
, rtk_stat_counter_t
*pCntr
)
278 rtk_api_ret_t retVal
;
279 RTL8367C_MIBCOUNTER mib_idx
;
280 rtk_stat_counter_t second_cnt
;
282 /* Check initialization state */
283 RTK_CHK_INIT_STATE();
286 return RT_ERR_NULL_POINTER
;
288 /* Check port valid */
289 RTK_CHK_PORT_VALID(port
);
291 if (cntr_idx
>=STAT_PORT_CNTR_END
)
292 return RT_ERR_STAT_INVALID_PORT_CNTR
;
294 if((retVal
= _get_asic_mib_idx(cntr_idx
, &mib_idx
)) != RT_ERR_OK
)
297 if(mib_idx
== MIB_NOT_SUPPORT
)
298 return RT_ERR_CHIP_NOT_SUPPORTED
;
300 if ((retVal
= rtl8367c_getAsicMIBsCounter(rtk_switch_port_L2P_get(port
), mib_idx
, pCntr
)) != RT_ERR_OK
)
303 if(cntr_idx
== STAT_EtherStatsMulticastPkts
)
305 if((retVal
= _get_asic_mib_idx(STAT_IfOutMulticastPkts
, &mib_idx
)) != RT_ERR_OK
)
308 if((retVal
= rtl8367c_getAsicMIBsCounter(rtk_switch_port_L2P_get(port
), mib_idx
, &second_cnt
)) != RT_ERR_OK
)
311 *pCntr
+= second_cnt
;
314 if(cntr_idx
== STAT_EtherStatsBroadcastPkts
)
316 if((retVal
= _get_asic_mib_idx(STAT_IfOutBroadcastPkts
, &mib_idx
)) != RT_ERR_OK
)
319 if((retVal
= rtl8367c_getAsicMIBsCounter(rtk_switch_port_L2P_get(port
), mib_idx
, &second_cnt
)) != RT_ERR_OK
)
322 *pCntr
+= second_cnt
;
329 * rtk_stat_port_getAll
331 * Get all counters of one specified port in the specified device.
335 * pPort_cntrs - buffer pointer of counter value.
338 * RT_ERR_FAILED - Failed
339 * RT_ERR_SMI - SMI access error
340 * RT_ERR_INPUT - Invalid input parameters.
342 * Get all MIB counters of one port.
344 rtk_api_ret_t
rtk_stat_port_getAll(rtk_port_t port
, rtk_stat_port_cntr_t
*pPort_cntrs
)
346 rtk_api_ret_t retVal
;
348 rtk_uint64 mibCounter
;
349 rtk_uint32
*accessPtr
;
350 /* address offset to MIBs counter */
351 CONST_T rtk_uint16 mibLength
[STAT_PORT_CNTR_END
]= {
353 2,1,1,1,1,1,1,1,1,1,1,
354 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
355 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
357 /* Check initialization state */
358 RTK_CHK_INIT_STATE();
360 if(NULL
== pPort_cntrs
)
361 return RT_ERR_NULL_POINTER
;
363 /* Check port valid */
364 RTK_CHK_PORT_VALID(port
);
366 accessPtr
= (rtk_uint32
*)pPort_cntrs
;
367 for (mibIndex
=0;mibIndex
<STAT_PORT_CNTR_END
;mibIndex
++)
369 if ((retVal
= rtk_stat_port_get(port
, mibIndex
, &mibCounter
)) != RT_ERR_OK
)
371 if (retVal
== RT_ERR_CHIP_NOT_SUPPORTED
)
377 if (2 == mibLength
[mibIndex
])
378 *(rtk_uint64
*)accessPtr
= mibCounter
;
379 else if (1 == mibLength
[mibIndex
])
380 *accessPtr
= mibCounter
;
382 return RT_ERR_FAILED
;
384 accessPtr
+=mibLength
[mibIndex
];
391 * rtk_stat_logging_counterCfg_set
393 * Set the type and mode of Logging Counter
395 * idx - The index of Logging Counter. Should be even number only.(0,2,4,6,8.....30)
396 * mode - 32 bits or 64 bits mode
397 * type - Packet counter or byte counter
402 * RT_ERR_OUT_OF_RANGE - Out of range.
403 * RT_ERR_FAILED - Failed
404 * RT_ERR_SMI - SMI access error
405 * RT_ERR_INPUT - Invalid input parameters.
407 * Set the type and mode of Logging Counter.
409 rtk_api_ret_t
rtk_stat_logging_counterCfg_set(rtk_uint32 idx
, rtk_logging_counter_mode_t mode
, rtk_logging_counter_type_t type
)
411 rtk_api_ret_t retVal
;
413 /* Check initialization state */
414 RTK_CHK_INIT_STATE();
416 if(idx
> RTL8367C_MIB_MAX_LOG_CNT_IDX
)
417 return RT_ERR_OUT_OF_RANGE
;
422 if(mode
>= LOGGING_MODE_END
)
423 return RT_ERR_OUT_OF_RANGE
;
425 if(type
>= LOGGING_TYPE_END
)
426 return RT_ERR_OUT_OF_RANGE
;
428 if((retVal
= rtl8367c_setAsicMIBsLoggingType((idx
/ 2), (rtk_uint32
)type
)) != RT_ERR_OK
)
431 if((retVal
= rtl8367c_setAsicMIBsLoggingMode((idx
/ 2), (rtk_uint32
)mode
)) != RT_ERR_OK
)
438 * rtk_stat_logging_counterCfg_get
440 * Get the type and mode of Logging Counter
442 * idx - The index of Logging Counter. Should be even number only.(0,2,4,6,8.....30)
444 * pMode - 32 bits or 64 bits mode
445 * pType - Packet counter or byte counter
448 * RT_ERR_OUT_OF_RANGE - Out of range.
449 * RT_ERR_FAILED - Failed
450 * RT_ERR_NULL_POINTER - NULL Pointer
451 * RT_ERR_SMI - SMI access error
452 * RT_ERR_INPUT - Invalid input parameters.
454 * Get the type and mode of Logging Counter.
456 rtk_api_ret_t
rtk_stat_logging_counterCfg_get(rtk_uint32 idx
, rtk_logging_counter_mode_t
*pMode
, rtk_logging_counter_type_t
*pType
)
458 rtk_api_ret_t retVal
;
459 rtk_uint32 type
, mode
;
461 /* Check initialization state */
462 RTK_CHK_INIT_STATE();
464 if(idx
> RTL8367C_MIB_MAX_LOG_CNT_IDX
)
465 return RT_ERR_OUT_OF_RANGE
;
471 return RT_ERR_NULL_POINTER
;
474 return RT_ERR_NULL_POINTER
;
476 if((retVal
= rtl8367c_getAsicMIBsLoggingType((idx
/ 2), &type
)) != RT_ERR_OK
)
479 if((retVal
= rtl8367c_getAsicMIBsLoggingMode((idx
/ 2), &mode
)) != RT_ERR_OK
)
482 *pMode
= (rtk_logging_counter_mode_t
)mode
;
483 *pType
= (rtk_logging_counter_type_t
)type
;
490 * rtk_stat_logging_counter_reset
492 * Reset Logging Counter
494 * idx - The index of Logging Counter. (0~31)
499 * RT_ERR_OUT_OF_RANGE - Out of range.
500 * RT_ERR_FAILED - Failed
501 * RT_ERR_SMI - SMI access error
503 * Reset Logging Counter.
505 rtk_api_ret_t
rtk_stat_logging_counter_reset(rtk_uint32 idx
)
507 rtk_api_ret_t retVal
;
509 /* Check initialization state */
510 RTK_CHK_INIT_STATE();
512 if(idx
> RTL8367C_MIB_MAX_LOG_CNT_IDX
)
513 return RT_ERR_OUT_OF_RANGE
;
515 if((retVal
= rtl8367c_setAsicMIBsResetLoggingCounter(idx
)) != RT_ERR_OK
)
522 * rtk_stat_logging_counter_get
524 * Get Logging Counter
526 * idx - The index of Logging Counter. (0~31)
528 * pCnt - Logging counter value
531 * RT_ERR_OUT_OF_RANGE - Out of range.
532 * RT_ERR_FAILED - Failed
533 * RT_ERR_SMI - SMI access error
535 * Get Logging Counter.
537 rtk_api_ret_t
rtk_stat_logging_counter_get(rtk_uint32 idx
, rtk_uint32
*pCnt
)
539 rtk_api_ret_t retVal
;
541 /* Check initialization state */
542 RTK_CHK_INIT_STATE();
545 return RT_ERR_NULL_POINTER
;
547 if(idx
> RTL8367C_MIB_MAX_LOG_CNT_IDX
)
548 return RT_ERR_OUT_OF_RANGE
;
550 if((retVal
= rtl8367c_getAsicMIBsLogCounter(idx
, pCnt
)) != RT_ERR_OK
)
557 * rtk_stat_lengthMode_set
561 * txMode - The length counting mode
562 * rxMode - The length counting mode
567 * RT_ERR_INPUT - Out of range.
568 * RT_ERR_FAILED - Failed
569 * RT_ERR_SMI - SMI access error
573 rtk_api_ret_t
rtk_stat_lengthMode_set(rtk_stat_lengthMode_t txMode
, rtk_stat_lengthMode_t rxMode
)
575 rtk_api_ret_t retVal
;
577 /* Check initialization state */
578 RTK_CHK_INIT_STATE();
580 if(txMode
>= LENGTH_MODE_END
)
583 if(rxMode
>= LENGTH_MODE_END
)
586 if((retVal
= rtl8367c_setAsicMIBsLength((rtk_uint32
)txMode
, (rtk_uint32
)rxMode
)) != RT_ERR_OK
)
593 * rtk_stat_lengthMode_get
599 * pTxMode - The length counting mode
600 * pRxMode - The length counting mode
603 * RT_ERR_INPUT - Out of range.
604 * RT_ERR_FAILED - Failed
605 * RT_ERR_SMI - SMI access error
608 rtk_api_ret_t
rtk_stat_lengthMode_get(rtk_stat_lengthMode_t
*pTxMode
, rtk_stat_lengthMode_t
*pRxMode
)
610 rtk_api_ret_t retVal
;
612 /* Check initialization state */
613 RTK_CHK_INIT_STATE();
616 return RT_ERR_NULL_POINTER
;
619 return RT_ERR_NULL_POINTER
;
621 if((retVal
= rtl8367c_getAsicMIBsLength((rtk_uint32
*)pTxMode
, (rtk_uint32
*)pRxMode
)) != RT_ERR_OK
)