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 : RTL8367C switch high-level API for RTL8367C
14 * Feature : MIB related functions
18 #include <rtl8367c_asicdrv_mib.h>
20 * rtl8367c_setAsicMIBsCounterReset
22 * Reset global/queue manage or per-port MIB counter
24 * greset - Global reset
25 * qmreset - Queue maganement reset
26 * portmask - Port reset mask
31 * RT_ERR_SMI - SMI access error
35 ret_t
rtl8367c_setAsicMIBsCounterReset(rtk_uint32 greset
, rtk_uint32 qmreset
, rtk_uint32 portmask
)
41 regBits
= RTL8367C_GLOBAL_RESET_MASK
|
42 RTL8367C_QM_RESET_MASK
|
43 RTL8367C_MIB_PORT07_MASK
|
44 ((rtk_uint32
)0x7 << 13);
45 regData
= ((greset
<< RTL8367C_GLOBAL_RESET_OFFSET
) & RTL8367C_GLOBAL_RESET_MASK
) |
46 ((qmreset
<< RTL8367C_QM_RESET_OFFSET
) & RTL8367C_QM_RESET_MASK
) |
47 (((portmask
& 0xFF) << RTL8367C_PORT0_RESET_OFFSET
) & RTL8367C_MIB_PORT07_MASK
) |
48 (((portmask
>> 8)&0x7) << 13);
51 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_MIB_CTRL0
, regBits
, (regData
>> RTL8367C_PORT0_RESET_OFFSET
));
56 * rtl8367c_getAsicMIBsCounter
60 * port - Physical port number (0~7)
61 * mibIdx - MIB counter index
62 * pCounter - MIB retrived counter
67 * RT_ERR_SMI - SMI access error
68 * RT_ERR_PORT_ID - Invalid port number
69 * RT_ERR_BUSYWAIT_TIMEOUT - MIB is busy at retrieving
70 * RT_ERR_STAT_CNTR_FAIL - MIB is resetting
72 * Before MIBs counter retrieving, writting accessing address to ASIC at first and check the MIB
73 * control register status. If busy bit of MIB control is set, that means MIB counter have been
74 * waiting for preparing, then software must wait atfer this busy flag reset by ASIC. This driver
75 * did not recycle reading user desired counter. Software must use driver again to get MIB counter
76 * if return value is not RT_ERR_OK.
78 ret_t
rtl8367c_getAsicMIBsCounter(rtk_uint32 port
, RTL8367C_MIBCOUNTER mibIdx
, rtk_uint64
* pCounter
)
86 /* address offset to MIBs counter */
87 CONST rtk_uint16 mibLength
[RTL8367C_MIBS_NUMBER
]= {
88 4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
90 4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
91 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
94 rtk_uint64 mibCounter
;
97 if(port
> RTL8367C_PORTIDMAX
)
98 return RT_ERR_PORT_ID
;
100 if(mibIdx
>= RTL8367C_MIBS_NUMBER
)
101 return RT_ERR_STAT_INVALID_CNTR
;
103 if(dot1dTpLearnedEntryDiscards
== mibIdx
)
105 mibAddr
= RTL8367C_MIB_LEARNENTRYDISCARD_OFFSET
;
110 mibOff
= RTL8367C_MIB_PORT_OFFSET
* port
;
113 mibOff
= mibOff
+ 68;
117 mibOff
+= mibLength
[i
];
125 /*writing access counter address first*/
126 /*This address is SRAM address, and SRAM address = MIB register address >> 2*/
127 /*then ASIC will prepare 64bits counter wait for being retrived*/
128 /*Write Mib related address to access control register*/
129 retVal
= rtl8367c_setAsicReg(RTL8367C_REG_MIB_ADDRESS
, (mibAddr
>> 2));
130 if(retVal
!= RT_ERR_OK
)
135 /* polling busy flag */
139 /*read MIB control register*/
140 retVal
= rtl8367c_getAsicReg(RTL8367C_MIB_CTRL_REG
,®Data
);
141 if(retVal
!= RT_ERR_OK
)
144 if((regData
& RTL8367C_MIB_CTRL0_BUSY_FLAG_MASK
) == 0)
152 if(regData
& RTL8367C_MIB_CTRL0_BUSY_FLAG_MASK
)
153 return RT_ERR_BUSYWAIT_TIMEOUT
;
155 if(regData
& RTL8367C_RESET_FLAG_MASK
)
156 return RT_ERR_STAT_CNTR_FAIL
;
159 i
= mibLength
[mibIdx
];
161 regAddr
= RTL8367C_MIB_COUNTER_BASE_REG
+ 3;
163 regAddr
= RTL8367C_MIB_COUNTER_BASE_REG
+ ((mibOff
+ 1) % 4);
167 retVal
= rtl8367c_getAsicReg(regAddr
, ®Data
);
168 if(retVal
!= RT_ERR_OK
)
171 mibCounter
= (mibCounter
<< 16) | (regData
& 0xFFFF);
178 *pCounter
= mibCounter
;
184 * rtl8367c_getAsicMIBsLogCounter
186 * Get MIBs Loggin counter
188 * index - The index of 32 logging counter (0 ~ 31)
192 * RT_ERR_OK - Success
193 * RT_ERR_SMI - SMI access error
194 * RT_ERR_ENTRY_INDEX - Wrong index
195 * RT_ERR_BUSYWAIT_TIMEOUT - MIB is busy at retrieving
196 * RT_ERR_STAT_CNTR_FAIL - MIB is resetting
198 * This API get 32 logging counter
200 ret_t
rtl8367c_getAsicMIBsLogCounter(rtk_uint32 index
, rtk_uint32
*pCounter
)
207 rtk_uint64 mibCounter
;
209 if(index
> RTL8367C_MIB_MAX_LOG_CNT_IDX
)
210 return RT_ERR_ENTRY_INDEX
;
212 mibAddr
= RTL8367C_MIB_LOG_CNT_OFFSET
+ ((index
/ 2) * 4);
214 retVal
= rtl8367c_setAsicReg(RTL8367C_REG_MIB_ADDRESS
, (mibAddr
>> 2));
215 if(retVal
!= RT_ERR_OK
)
218 /*read MIB control register*/
219 retVal
= rtl8367c_getAsicReg(RTL8367C_MIB_CTRL_REG
, ®Data
);
220 if(retVal
!= RT_ERR_OK
)
223 if(regData
& RTL8367C_MIB_CTRL0_BUSY_FLAG_MASK
)
224 return RT_ERR_BUSYWAIT_TIMEOUT
;
226 if(regData
& RTL8367C_RESET_FLAG_MASK
)
227 return RT_ERR_STAT_CNTR_FAIL
;
231 regAddr
= RTL8367C_MIB_COUNTER_BASE_REG
+ 3;
233 regAddr
= RTL8367C_MIB_COUNTER_BASE_REG
+ 1;
235 for(i
= 0; i
<= 1; i
++)
237 retVal
= rtl8367c_getAsicReg(regAddr
, ®Data
);
239 if(retVal
!= RT_ERR_OK
)
242 mibCounter
= (mibCounter
<< 16) | (regData
& 0xFFFF);
247 *pCounter
= mibCounter
;
252 * rtl8367c_getAsicMIBsControl
254 * Get MIB control register
256 * pMask - MIB control status mask bit[0]-busy bit[1]
260 * RT_ERR_OK - Success
261 * RT_ERR_SMI - SMI access error
263 * Software need to check this control register atfer doing port resetting or global resetting
265 ret_t
rtl8367c_getAsicMIBsControl(rtk_uint32
* pMask
)
270 retVal
= rtl8367c_getAsicReg(RTL8367C_MIB_CTRL_REG
, ®Data
);
271 if(retVal
!= RT_ERR_OK
)
274 *pMask
= regData
& (RTL8367C_MIB_CTRL0_BUSY_FLAG_MASK
| RTL8367C_RESET_FLAG_MASK
);
279 * rtl8367c_setAsicMIBsResetValue
281 * Reset all counter to 0 or 1
283 * value - Reset to value 0 or 1
287 * RT_ERR_OK - Success
288 * RT_ERR_SMI - SMI access error
292 ret_t
rtl8367c_setAsicMIBsResetValue(rtk_uint32 value
)
294 return rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_CTRL0
, RTL8367C_RESET_VALUE_OFFSET
, value
);
297 * rtl8367c_getAsicMIBsResetValue
299 * Reset all counter to 0 or 1
301 * value - Reset to value 0 or 1
305 * RT_ERR_OK - Success
306 * RT_ERR_SMI - SMI access error
310 ret_t
rtl8367c_getAsicMIBsResetValue(rtk_uint32
* value
)
312 return rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_CTRL0
, RTL8367C_RESET_VALUE_OFFSET
, value
);
316 * rtl8367c_setAsicMIBsUsageMode
320 * mode - 1: latch all MIBs by timer 0:normal free run counting
324 * RT_ERR_OK - Success
325 * RT_ERR_SMI - SMI access error
329 ret_t
rtl8367c_setAsicMIBsUsageMode(rtk_uint32 mode
)
331 return rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_CTRL4
, RTL8367C_MIB_USAGE_MODE_OFFSET
, mode
);
334 * rtl8367c_getAsicMIBsUsageMode
338 * pMode - 1: latch all MIBs by timer 0:normal free run counting
342 * RT_ERR_OK - Success
343 * RT_ERR_SMI - SMI access error
347 ret_t
rtl8367c_getAsicMIBsUsageMode(rtk_uint32
* pMode
)
349 return rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_CTRL4
, RTL8367C_MIB_USAGE_MODE_OFFSET
, pMode
);
353 * rtl8367c_setAsicMIBsTimer
357 * timer - latch timer, unit 1 second
361 * RT_ERR_OK - Success
362 * RT_ERR_SMI - SMI access error
366 ret_t
rtl8367c_setAsicMIBsTimer(rtk_uint32 timer
)
368 return rtl8367c_setAsicRegBits(RTL8367C_REG_MIB_CTRL4
, RTL8367C_MIB_TIMER_MASK
, timer
);
371 * rtl8367c_getAsicMIBsTimer
375 * pTimer - latch timer, unit 1 second
379 * RT_ERR_OK - Success
380 * RT_ERR_SMI - SMI access error
384 ret_t
rtl8367c_getAsicMIBsTimer(rtk_uint32
* pTimer
)
386 return rtl8367c_getAsicRegBits(RTL8367C_REG_MIB_CTRL4
, RTL8367C_MIB_TIMER_MASK
, pTimer
);
389 * rtl8367c_setAsicMIBsLoggingMode
391 * MIB logging counter mode
393 * index - logging counter mode index (0~15)
394 * mode - 0:32-bits mode 1:64-bits mode
398 * RT_ERR_OK - Success
399 * RT_ERR_SMI - SMI access error
400 * RT_ERR_OUT_OF_RANGE - input parameter out of range
404 ret_t
rtl8367c_setAsicMIBsLoggingMode(rtk_uint32 index
, rtk_uint32 mode
)
406 if(index
> RTL8367C_MIB_MAX_LOG_MODE_IDX
)
407 return RT_ERR_OUT_OF_RANGE
;
409 return rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_CTRL3
, index
,mode
);
412 * rtl8367c_getAsicMIBsLoggingMode
414 * MIB logging counter mode
416 * index - logging counter mode index (0~15)
417 * pMode - 0:32-bits mode 1:64-bits mode
421 * RT_ERR_OK - Success
422 * RT_ERR_SMI - SMI access error
423 * RT_ERR_OUT_OF_RANGE - input parameter out of range
427 ret_t
rtl8367c_getAsicMIBsLoggingMode(rtk_uint32 index
, rtk_uint32
* pMode
)
429 if(index
> RTL8367C_MIB_MAX_LOG_MODE_IDX
)
430 return RT_ERR_OUT_OF_RANGE
;
432 return rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_CTRL3
, index
,pMode
);
436 * rtl8367c_setAsicMIBsLoggingType
438 * MIB logging counter type
440 * index - logging counter mode index (0~15)
441 * type - 0:Packet count 1:Byte count
445 * RT_ERR_OK - Success
446 * RT_ERR_SMI - SMI access error
447 * RT_ERR_OUT_OF_RANGE - input parameter out of range
451 ret_t
rtl8367c_setAsicMIBsLoggingType(rtk_uint32 index
, rtk_uint32 type
)
453 if(index
> RTL8367C_MIB_MAX_LOG_MODE_IDX
)
454 return RT_ERR_OUT_OF_RANGE
;
456 return rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_CTRL5
, index
,type
);
460 * rtl8367c_getAsicMIBsLoggingType
462 * MIB logging counter type
464 * index - logging counter mode index (0~15)
465 * pType - 0:Packet count 1:Byte count
469 * RT_ERR_OK - Success
470 * RT_ERR_SMI - SMI access error
471 * RT_ERR_OUT_OF_RANGE - input parameter out of range
475 ret_t
rtl8367c_getAsicMIBsLoggingType(rtk_uint32 index
, rtk_uint32
* pType
)
477 if(index
> RTL8367C_MIB_MAX_LOG_MODE_IDX
)
478 return RT_ERR_OUT_OF_RANGE
;
480 return rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_CTRL5
, index
,pType
);
484 * rtl8367c_setAsicMIBsResetLoggingCounter
486 * MIB logging counter type
488 * index - logging counter index (0~31)
492 * RT_ERR_OK - Success
493 * RT_ERR_SMI - SMI access error
494 * RT_ERR_OUT_OF_RANGE - input parameter out of range
498 ret_t
rtl8367c_setAsicMIBsResetLoggingCounter(rtk_uint32 index
)
502 if(index
> RTL8367C_MIB_MAX_LOG_CNT_IDX
)
503 return RT_ERR_OUT_OF_RANGE
;
506 retVal
= rtl8367c_setAsicReg(RTL8367C_REG_MIB_CTRL1
, 1<<index
);
508 retVal
= rtl8367c_setAsicReg(RTL8367C_REG_MIB_CTRL2
, 1<<(index
-16));
514 * rtl8367c_setAsicMIBsLength
516 * Set MIB length couting mode
518 * txLengthMode - 0: tag length doesn't be counted. 1: tag length is counted.
519 * rxLengthMode - 0: tag length doesn't be counted. 1: tag length is counted.
523 * RT_ERR_OK - Success
524 * RT_ERR_SMI - SMI access error
525 * RT_ERR_OUT_OF_RANGE - input parameter out of range
529 ret_t
rtl8367c_setAsicMIBsLength(rtk_uint32 txLengthMode
, rtk_uint32 rxLengthMode
)
533 if( (retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_RMON_LEN_CTRL
, RTL8367C_TX_LENGTH_CTRL_OFFSET
, txLengthMode
)) != RT_ERR_OK
)
536 if( (retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_MIB_RMON_LEN_CTRL
, RTL8367C_RX_LENGTH_CTRL_OFFSET
, rxLengthMode
)) != RT_ERR_OK
)
543 * rtl8367c_setAsicMIBsLength
545 * Set MIB length couting mode
549 * pTxLengthMode - 0: tag length doesn't be counted. 1: tag length is counted.
550 * pRxLengthMode - 0: tag length doesn't be counted. 1: tag length is counted.
552 * RT_ERR_OK - Success
553 * RT_ERR_SMI - SMI access error
554 * RT_ERR_OUT_OF_RANGE - input parameter out of range
558 ret_t
rtl8367c_getAsicMIBsLength(rtk_uint32
*pTxLengthMode
, rtk_uint32
*pRxLengthMode
)
562 if( (retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_RMON_LEN_CTRL
, RTL8367C_TX_LENGTH_CTRL_OFFSET
, pTxLengthMode
)) != RT_ERR_OK
)
565 if( (retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_MIB_RMON_LEN_CTRL
, RTL8367C_RX_LENGTH_CTRL_OFFSET
, pRxLengthMode
)) != RT_ERR_OK
)