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 : Ethernet AV related functions
18 #include <rtl8367c_asicdrv_eav.h>
20 * rtl8367c_setAsicEavMacAddress
29 * RT_ERR_SMI - SMI access error
33 ret_t
rtl8367c_setAsicEavMacAddress(ether_addr_t mac
)
40 accessPtr
= (rtk_uint8
*)&mac
;
44 regData
= (regData
<< 8) | *accessPtr
;
46 for(i
= 0; i
<=2; i
++)
48 retVal
= rtl8367c_setAsicReg(RTL8367C_REG_MAC_ADDR_H
- i
, regData
);
49 if(retVal
!= RT_ERR_OK
)
54 regData
= (regData
<< 8) | *accessPtr
;
61 * rtl8367c_getAsicEavMacAddress
70 * RT_ERR_SMI - SMI access error
74 ret_t
rtl8367c_getAsicEavMacAddress(ether_addr_t
*pMac
)
81 accessPtr
= (rtk_uint8
*)pMac
;
83 for(i
= 0; i
<= 2; i
++)
85 retVal
= rtl8367c_getAsicReg(RTL8367C_REG_MAC_ADDR_H
- i
, ®Data
);
86 if(retVal
!= RT_ERR_OK
)
89 *accessPtr
= (regData
& 0xFF00) >> 8;
91 *accessPtr
= regData
& 0xFF;
99 * rtl8367c_setAsicEavTpid
101 * Set PTP parser tag TPID.
103 * outerTag - outter tag TPID
104 * innerTag - inner tag TPID
108 * RT_ERR_OK - Success
109 * RT_ERR_SMI - SMI access error
113 ret_t
rtl8367c_setAsicEavTpid(rtk_uint32 outerTag
, rtk_uint32 innerTag
)
117 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_OTAG_TPID
, outerTag
)) != RT_ERR_OK
)
119 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_ITAG_TPID
, innerTag
)) != RT_ERR_OK
)
125 * rtl8367c_getAsicEavTpid
127 * Get PTP parser tag TPID.
131 * pOuterTag - outter tag TPID
132 * pInnerTag - inner tag TPID
134 * RT_ERR_OK - Success
135 * RT_ERR_SMI - SMI access error
139 ret_t
rtl8367c_getAsicEavTpid(rtk_uint32
* pOuterTag
, rtk_uint32
* pInnerTag
)
143 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_OTAG_TPID
, pOuterTag
)) != RT_ERR_OK
)
145 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_ITAG_TPID
, pInnerTag
)) != RT_ERR_OK
)
152 * rtl8367c_setAsicEavSysTime
154 * Set PTP system time
157 * nanoSecond - nano seconds
161 * RT_ERR_OK - Success
162 * RT_ERR_SMI - SMI access error
164 * The time granuality is 8 nano seconds.
166 ret_t
rtl8367c_setAsicEavSysTime(rtk_uint32 second
, rtk_uint32 nanoSecond
)
169 rtk_uint32 sec_h
, sec_l
, nsec8_h
, nsec8_l
;
170 rtk_uint32 nano_second_8
;
171 rtk_uint32 regData
, busyFlag
, count
;
173 if(nanoSecond
> RTL8367C_EAV_NANOSECONDMAX
)
178 sec_l
= second
& 0xFFFF;
179 nano_second_8
= nanoSecond
>> 3;
180 nsec8_h
= (nano_second_8
>>16) & RTL8367C_PTP_TIME_NSEC_H_NSEC_MASK
;
181 nsec8_l
= nano_second_8
&0xFFFF;
183 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_H_SEC
, sec_h
)) != RT_ERR_OK
)
185 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_L_SEC
, sec_l
)) != RT_ERR_OK
)
187 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_L_NSEC
, nsec8_l
)) != RT_ERR_OK
)
190 regData
= nsec8_h
| (PTP_TIME_WRITE
<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET
) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK
;
192 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC
, regData
)) != RT_ERR_OK
)
197 if((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC
, RTL8367C_PTP_TIME_NSEC_H_EXEC_OFFSET
, &busyFlag
)) != RT_ERR_OK
)
200 } while ((busyFlag
!= 0)&&(count
<5));
203 return RT_ERR_BUSYWAIT_TIMEOUT
;
209 * rtl8367c_getAsicEavSysTime
211 * Get PTP system time
216 * nanoSecond - nano seconds
218 * RT_ERR_OK - Success
219 * RT_ERR_SMI - SMI access error
221 * The time granuality is 8 nano seconds.
223 ret_t
rtl8367c_getAsicEavSysTime(rtk_uint32
* pSecond
, rtk_uint32
* pNanoSecond
)
226 rtk_uint32 sec_h
, sec_l
, nsec8_h
, nsec8_l
;
227 rtk_uint32 nano_second_8
;
228 rtk_uint32 regData
, busyFlag
, count
;
231 regData
= (PTP_TIME_READ
<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET
) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK
;
233 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC
, regData
)) != RT_ERR_OK
)
238 if((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC
, RTL8367C_PTP_TIME_NSEC_H_EXEC_OFFSET
, &busyFlag
)) != RT_ERR_OK
)
241 } while ((busyFlag
!= 0)&&(count
<5));
244 return RT_ERR_BUSYWAIT_TIMEOUT
;
246 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_SEC_H_SEC_RD
, &sec_h
)) != RT_ERR_OK
)
248 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_SEC_L_SEC_RD
, &sec_l
)) != RT_ERR_OK
)
250 if((retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC_RD
, RTL8367C_PTP_TIME_NSEC_H_NSEC_RD_MASK
,&nsec8_h
)) != RT_ERR_OK
)
252 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_NSEC_L_NSEC_RD
, &nsec8_l
)) != RT_ERR_OK
)
255 *pSecond
= (sec_h
<<16) | sec_l
;
256 nano_second_8
= (nsec8_h
<<16) | nsec8_l
;
257 *pNanoSecond
= nano_second_8
<<3;
264 * rtl8367c_setAsicEavSysTimeAdjust
266 * Set PTP system time adjust
268 * type - incresae or decrease
270 * nanoSecond - nano seconds
274 * RT_ERR_OK - Success
275 * RT_ERR_SMI - SMI access error
277 * Ethernet AV second offset of timer for tuning
279 ret_t
rtl8367c_setAsicEavSysTimeAdjust(rtk_uint32 type
, rtk_uint32 second
, rtk_uint32 nanoSecond
)
282 rtk_uint32 sec_h
, sec_l
, nsec8_h
, nsec8_l
;
283 rtk_uint32 nano_second_8
;
284 rtk_uint32 regData
, busyFlag
, count
;
286 if (type
>= PTP_TIME_ADJ_END
)
288 if(nanoSecond
> RTL8367C_EAV_NANOSECONDMAX
)
293 sec_l
= second
& 0xFFFF;
294 nano_second_8
= nanoSecond
>> 3;
295 nsec8_h
= (nano_second_8
>>16) & RTL8367C_PTP_TIME_NSEC_H_NSEC_MASK
;
296 nsec8_l
= nano_second_8
&0xFFFF;
298 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_H_SEC
, sec_h
)) != RT_ERR_OK
)
300 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_L_SEC
, sec_l
)) != RT_ERR_OK
)
302 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_L_NSEC
, nsec8_l
)) != RT_ERR_OK
)
305 if (PTP_TIME_ADJ_INC
== type
)
306 regData
= nsec8_h
| (PTP_TIME_INC
<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET
) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK
;
308 regData
= nsec8_h
| (PTP_TIME_DEC
<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET
) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK
;
310 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC
, regData
)) != RT_ERR_OK
)
315 if((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC
, RTL8367C_PTP_TIME_NSEC_H_EXEC_OFFSET
, &busyFlag
)) != RT_ERR_OK
)
318 } while ((busyFlag
!= 0)&&(count
<5));
321 return RT_ERR_BUSYWAIT_TIMEOUT
;
327 * rtl8367c_setAsicEavSysTimeCtrl
329 * Set PTP system time control
331 * command - start or stop
335 * RT_ERR_OK - Success
336 * RT_ERR_SMI - SMI access error
340 ret_t
rtl8367c_setAsicEavSysTimeCtrl(rtk_uint32 control
)
345 if (control
>=PTP_TIME_CTRL_END
)
349 if (PTP_TIME_CTRL_START
== control
)
350 regData
= RTL8367C_CFG_TIMER_EN_FRC_MASK
| RTL8367C_CFG_TIMER_1588_EN_MASK
;
354 if((retVal
= rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_CFG
, regData
)) != RT_ERR_OK
)
361 * rtl8367c_getAsicEavSysTimeCtrl
363 * Get PTP system time control
367 * pControl - start or stop
369 * RT_ERR_OK - Success
370 * RT_ERR_SMI - SMI access error
374 ret_t
rtl8367c_getAsicEavSysTimeCtrl(rtk_uint32
* pControl
)
380 mask
= RTL8367C_CFG_TIMER_EN_FRC_MASK
| RTL8367C_CFG_TIMER_1588_EN_MASK
;
382 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_CFG
, ®Data
)) != RT_ERR_OK
)
385 if( (regData
& mask
) == mask
)
386 *pControl
= PTP_TIME_CTRL_START
;
387 else if( (regData
& mask
) == 0)
388 *pControl
= PTP_TIME_CTRL_STOP
;
390 return RT_ERR_NOT_ALLOWED
;
396 * rtl8367c_setAsicEavInterruptMask
398 * Set PTP interrupt enable mask
400 * imr - Interrupt mask
404 * RT_ERR_OK - Success
405 * RT_ERR_SMI - SMI access error
410 * [3]:TX_PDELAY_RESP,
414 * [7]:RX_PDELAY_RESP,
416 ret_t
rtl8367c_setAsicEavInterruptMask(rtk_uint32 imr
)
418 if ((imr
&(RTL8367C_PTP_INTR_MASK
<<8))>0)
421 return rtl8367c_setAsicRegBits(RTL8367C_REG_PTP_TIME_CFG2
, RTL8367C_PTP_INTR_MASK
, imr
);
424 * rtl8367c_getAsicEavInterruptMask
426 * Get PTP interrupt enable mask
428 * pImr - Interrupt mask
432 * RT_ERR_OK - Success
433 * RT_ERR_SMI - SMI access error
438 * [3]:TX_PDELAY_RESP,
442 * [7]:RX_PDELAY_RESP,
444 ret_t
rtl8367c_getAsicEavInterruptMask(rtk_uint32
* pImr
)
446 return rtl8367c_getAsicRegBits(RTL8367C_REG_PTP_TIME_CFG2
, RTL8367C_PTP_INTR_MASK
, pImr
);
450 * rtl8367c_getAsicEavInterruptStatus
452 * Get PTP interrupt port status mask
454 * pIms - Interrupt mask
458 * RT_ERR_OK - Success
459 * RT_ERR_SMI - SMI access error
467 ret_t
rtl8367c_getAsicEavInterruptStatus(rtk_uint32
* pIms
)
469 return rtl8367c_getAsicRegBits(RTL8367C_REG_PTP_INTERRUPT_CFG
, RTL8367C_PTP_PORT_MASK
, pIms
);
473 * rtl8367c_setAsicInterruptMask
475 * Clear interrupt enable mask
477 * ims - Interrupt status mask
481 * RT_ERR_OK - Success
482 * RT_ERR_SMI - SMI access error
484 * This API can be used to clear ASIC interrupt status and register will be cleared by writting 1.
488 * [3]:TX_PDELAY_RESP,
492 * [7]:RX_PDELAY_RESP,
494 ret_t
rtl8367c_setAsicEavPortInterruptStatus(rtk_uint32 port
, rtk_uint32 ims
)
497 if(port
> RTL8367C_PORTNO
)
498 return RT_ERR_PORT_ID
;
501 return rtl8367c_setAsicRegBits(RTL8367C_EAV_PORT_CFG_REG(port
), RTL8367C_PTP_INTR_MASK
,ims
);
503 return rtl8367c_setAsicRegBits(RTL8367C_REG_P5_EAV_CFG
, RTL8367C_PTP_INTR_MASK
,ims
);
505 return rtl8367c_setAsicRegBits(RTL8367C_REG_P6_EAV_CFG
, RTL8367C_PTP_INTR_MASK
,ims
);
507 return rtl8367c_setAsicRegBits(RTL8367C_REG_P7_EAV_CFG
, RTL8367C_PTP_INTR_MASK
,ims
);
509 return rtl8367c_setAsicRegBits(RTL8367C_REG_P8_EAV_CFG
, RTL8367C_PTP_INTR_MASK
,ims
);
511 return rtl8367c_setAsicRegBits(RTL8367C_REG_P9_EAV_CFG
, RTL8367C_PTP_INTR_MASK
,ims
);
516 * rtl8367c_getAsicInterruptStatus
518 * Get interrupt enable mask
520 * pIms - Interrupt status mask
524 * RT_ERR_OK - Success
525 * RT_ERR_SMI - SMI access error
530 * [3]:TX_PDELAY_RESP,
534 * [7]:RX_PDELAY_RESP,
536 ret_t
rtl8367c_getAsicEavPortInterruptStatus(rtk_uint32 port
, rtk_uint32
* pIms
)
539 if(port
> RTL8367C_PORTNO
)
540 return RT_ERR_PORT_ID
;
542 return rtl8367c_getAsicRegBits(RTL8367C_EAV_PORT_CFG_REG(port
), RTL8367C_PTP_INTR_MASK
, pIms
);
544 return rtl8367c_getAsicRegBits(RTL8367C_REG_P5_EAV_CFG
, RTL8367C_PTP_INTR_MASK
, pIms
);
546 return rtl8367c_getAsicRegBits(RTL8367C_REG_P6_EAV_CFG
, RTL8367C_PTP_INTR_MASK
,pIms
);
548 return rtl8367c_getAsicRegBits(RTL8367C_REG_P7_EAV_CFG
, RTL8367C_PTP_INTR_MASK
,pIms
);
550 return rtl8367c_getAsicRegBits(RTL8367C_REG_P8_EAV_CFG
, RTL8367C_PTP_INTR_MASK
,pIms
);
552 return rtl8367c_getAsicRegBits(RTL8367C_REG_P9_EAV_CFG
, RTL8367C_PTP_INTR_MASK
,pIms
);
560 * rtl8367c_setAsicEavPortEnable
562 * Set per-port EAV function enable/disable
564 * port - Physical port number (0~9)
565 * enabled - 1: enabled, 0: disabled
569 * RT_ERR_OK - Success
570 * RT_ERR_SMI - SMI access error
571 * RT_ERR_PORT_ID - Invalid port number
573 * If EAV function is enabled, PTP event messgae packet will be attached PTP timestamp for trapping
575 ret_t
rtl8367c_setAsicEavPortEnable(rtk_uint32 port
, rtk_uint32 enabled
)
577 if(port
> RTL8367C_PORTNO
)
578 return RT_ERR_PORT_ID
;
581 return rtl8367c_setAsicRegBit(RTL8367C_EAV_PORT_CFG_REG(port
), RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, enabled
);
583 return rtl8367c_setAsicRegBit(RTL8367C_REG_P5_EAV_CFG
, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, enabled
);
585 return rtl8367c_setAsicRegBit(RTL8367C_REG_P6_EAV_CFG
, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, enabled
);
587 return rtl8367c_setAsicRegBit(RTL8367C_REG_P7_EAV_CFG
, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, enabled
);
589 return rtl8367c_setAsicRegBit(RTL8367C_REG_P8_EAV_CFG
, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, enabled
);
591 return rtl8367c_setAsicRegBit(RTL8367C_REG_P9_EAV_CFG
, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, enabled
);
597 * rtl8367c_getAsicEavPortEnable
599 * Get per-port EAV function enable/disable
601 * port - Physical port number (0~9)
602 * pEnabled - 1: enabled, 0: disabled
606 * RT_ERR_OK - Success
607 * RT_ERR_SMI - SMI access error
608 * RT_ERR_PORT_ID - Invalid port number
612 ret_t
rtl8367c_getAsicEavPortEnable(rtk_uint32 port
, rtk_uint32
*pEnabled
)
614 if(port
> RTL8367C_PORTNO
)
615 return RT_ERR_PORT_ID
;
620 return rtl8367c_getAsicRegBit(RTL8367C_EAV_PORT_CFG_REG(port
), RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, pEnabled
);
622 return rtl8367c_getAsicRegBit(RTL8367C_REG_P5_EAV_CFG
, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, pEnabled
);
624 return rtl8367c_getAsicRegBit(RTL8367C_REG_P6_EAV_CFG
, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, pEnabled
);
626 return rtl8367c_getAsicRegBit(RTL8367C_REG_P7_EAV_CFG
, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, pEnabled
);
628 return rtl8367c_getAsicRegBit(RTL8367C_REG_P8_EAV_CFG
, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, pEnabled
);
630 return rtl8367c_getAsicRegBit(RTL8367C_REG_P9_EAV_CFG
, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET
, pEnabled
);
637 * rtl8367c_getAsicEavPortTimeStamp
639 * Get PTP port time stamp
641 * port - Physical port number (0~9)
642 * type - PTP packet type
644 * timeStamp - seconds
646 * RT_ERR_OK - Success
647 * RT_ERR_SMI - SMI access error
649 * The time granuality is 8 nano seconds.
651 ret_t
rtl8367c_getAsicEavPortTimeStamp(rtk_uint32 port
, rtk_uint32 type
, rtl8367c_ptp_time_stamp_t
* timeStamp
)
654 rtk_uint32 sec_h
, sec_l
, nsec8_h
, nsec8_l
;
655 rtk_uint32 nano_second_8
;
658 return RT_ERR_PORT_ID
;
659 if(type
>= PTP_PKT_TYPE_END
)
663 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_SEQ_ID(port
, type
), &timeStamp
->sequence_id
))!= RT_ERR_OK
)
665 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_PORT_SEC_H(port
) , &sec_h
)) != RT_ERR_OK
)
667 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_PORT_SEC_L(port
), &sec_l
)) != RT_ERR_OK
)
669 if((retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_PORT_NSEC_H(port
) , RTL8367C_PORT_NSEC_H_MASK
,&nsec8_h
)) != RT_ERR_OK
)
671 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_PORT_NSEC_L(port
) , &nsec8_l
)) != RT_ERR_OK
)
674 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P5_TX_SYNC_SEQ_ID
+type
, &timeStamp
->sequence_id
))!= RT_ERR_OK
)
676 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P5_PORT_SEC_31_16
, &sec_h
)) != RT_ERR_OK
)
678 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P5_PORT_SEC_15_0
, &sec_l
)) != RT_ERR_OK
)
680 if((retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_P5_PORT_NSEC_26_16
, RTL8367C_PORT_NSEC_H_MASK
,&nsec8_h
)) != RT_ERR_OK
)
682 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P5_PORT_NSEC_15_0
, &nsec8_l
)) != RT_ERR_OK
)
685 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P6_TX_SYNC_SEQ_ID
+type
, &timeStamp
->sequence_id
))!= RT_ERR_OK
)
687 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P6_PORT_SEC_31_16
, &sec_h
)) != RT_ERR_OK
)
689 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P6_PORT_SEC_15_0
, &sec_l
)) != RT_ERR_OK
)
691 if((retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_P6_PORT_NSEC_26_16
, RTL8367C_PORT_NSEC_H_MASK
,&nsec8_h
)) != RT_ERR_OK
)
693 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P6_PORT_NSEC_15_0
, &nsec8_l
)) != RT_ERR_OK
)
696 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P7_TX_SYNC_SEQ_ID
+type
, &timeStamp
->sequence_id
))!= RT_ERR_OK
)
698 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P7_PORT_SEC_31_16
, &sec_h
)) != RT_ERR_OK
)
700 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P7_PORT_SEC_15_0
, &sec_l
)) != RT_ERR_OK
)
702 if((retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_P7_PORT_NSEC_26_16
, RTL8367C_PORT_NSEC_H_MASK
,&nsec8_h
)) != RT_ERR_OK
)
704 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P7_PORT_NSEC_15_0
, &nsec8_l
)) != RT_ERR_OK
)
707 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P8_TX_SYNC_SEQ_ID
+type
, &timeStamp
->sequence_id
))!= RT_ERR_OK
)
709 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P8_PORT_SEC_31_16
, &sec_h
)) != RT_ERR_OK
)
711 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P8_PORT_SEC_15_0
, &sec_l
)) != RT_ERR_OK
)
713 if((retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_P8_PORT_NSEC_26_16
, RTL8367C_PORT_NSEC_H_MASK
,&nsec8_h
)) != RT_ERR_OK
)
715 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P8_PORT_NSEC_15_0
, &nsec8_l
)) != RT_ERR_OK
)
718 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P9_TX_SYNC_SEQ_ID
+type
, &timeStamp
->sequence_id
))!= RT_ERR_OK
)
720 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P9_PORT_SEC_31_16
, &sec_h
)) != RT_ERR_OK
)
722 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P9_PORT_SEC_15_0
, &sec_l
)) != RT_ERR_OK
)
724 if((retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_P9_PORT_NSEC_26_16
, RTL8367C_PORT_NSEC_H_MASK
,&nsec8_h
)) != RT_ERR_OK
)
726 if((retVal
= rtl8367c_getAsicReg(RTL8367C_REG_P9_PORT_NSEC_15_0
, &nsec8_l
)) != RT_ERR_OK
)
730 timeStamp
->second
= (sec_h
<<16) | sec_l
;
731 nano_second_8
= (nsec8_h
<<16) | nsec8_l
;
732 timeStamp
->nano_second
= nano_second_8
<<3;
739 * rtl8367c_setAsicEavTrap
741 * Set per-port PTP packet trap to CPU
743 * port - Physical port number (0~5)
744 * enabled - 1: enabled, 0: disabled
748 * RT_ERR_OK - Success
749 * RT_ERR_SMI - SMI access error
750 * RT_ERR_PORT_ID - Invalid port number
752 * If EAV trap enabled, switch will trap PTP packet to CPU
754 ret_t
rtl8367c_setAsicEavTrap(rtk_uint32 port
, rtk_uint32 enabled
)
756 if(port
> RTL8367C_PORTNO
)
757 return RT_ERR_PORT_ID
;
759 return rtl8367c_setAsicRegBit(RTL8367C_REG_PTP_PORT0_CFG1
+ (port
* 0x20), RTL8367C_PTP_PORT0_CFG1_OFFSET
, enabled
);
762 * rtl8367c_getAsicEavTimeSyncEn
764 * Get per-port EPTP packet trap to CPU
766 * port - Physical port number (0~5)
767 * pEnabled - 1: enabled, 0: disabled
771 * RT_ERR_OK - Success
772 * RT_ERR_SMI - SMI access error
773 * RT_ERR_PORT_ID - Invalid port number
777 ret_t
rtl8367c_getAsicEavTrap(rtk_uint32 port
, rtk_uint32
*pEnabled
)
779 if(port
> RTL8367C_PORTNO
)
780 return RT_ERR_PORT_ID
;
782 return rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_PORT0_CFG1
+ (port
* 0x20), RTL8367C_PTP_PORT0_CFG1_OFFSET
, pEnabled
);
786 * rtl8367c_setAsicEavEnable
788 * Set per-port EAV function enable/disable
790 * port - Physical port number (0~5)
791 * enabled - 1: enabled, 0: disabled
795 * RT_ERR_OK - Success
796 * RT_ERR_SMI - SMI access error
797 * RT_ERR_PORT_ID - Invalid port number
799 * If EAV function is enabled, PTP event messgae packet will be attached PTP timestamp for trapping
801 ret_t
rtl8367c_setAsicEavEnable(rtk_uint32 port
, rtk_uint32 enabled
)
803 if(port
> RTL8367C_PORTNO
)
804 return RT_ERR_PORT_ID
;
806 return rtl8367c_setAsicRegBit(RTL8367C_REG_EAV_CTRL0
, port
, enabled
);
809 * rtl8367c_getAsicEavEnable
811 * Get per-port EAV function enable/disable
813 * port - Physical port number (0~5)
814 * pEnabled - 1: enabled, 0: disabled
818 * RT_ERR_OK - Success
819 * RT_ERR_SMI - SMI access error
820 * RT_ERR_PORT_ID - Invalid port number
824 ret_t
rtl8367c_getAsicEavEnable(rtk_uint32 port
, rtk_uint32
*pEnabled
)
826 if(port
> RTL8367C_PORTNO
)
827 return RT_ERR_PORT_ID
;
829 return rtl8367c_getAsicRegBit(RTL8367C_REG_EAV_CTRL0
, port
, pEnabled
);
832 * rtl8367c_setAsicEavPriRemapping
834 * Set non-EAV streaming priority remapping
836 * srcpriority - Priority value
837 * priority - Absolute priority value
841 * RT_ERR_OK - Success
842 * RT_ERR_SMI - SMI access error
843 * RT_ERR_QOS_INT_PRIORITY - Invalid priority
847 ret_t
rtl8367c_setAsicEavPriRemapping(rtk_uint32 srcpriority
, rtk_uint32 priority
)
849 if(srcpriority
> RTL8367C_PRIMAX
|| priority
> RTL8367C_PRIMAX
)
850 return RT_ERR_QOS_INT_PRIORITY
;
852 return rtl8367c_setAsicRegBits(RTL8367C_EAV_PRIORITY_REMAPPING_REG(srcpriority
), RTL8367C_EAV_PRIORITY_REMAPPING_MASK(srcpriority
),priority
);
855 * rtl8367c_getAsicEavPriRemapping
857 * Get non-EAV streaming priority remapping
859 * srcpriority - Priority value
860 * pPriority - Absolute priority value
864 * RT_ERR_OK - Success
865 * RT_ERR_SMI - SMI access error
866 * RT_ERR_QOS_INT_PRIORITY - Invalid priority
870 ret_t
rtl8367c_getAsicEavPriRemapping(rtk_uint32 srcpriority
, rtk_uint32
*pPriority
)
872 if(srcpriority
> RTL8367C_PRIMAX
)
873 return RT_ERR_QOS_INT_PRIORITY
;
875 return rtl8367c_getAsicRegBits(RTL8367C_EAV_PRIORITY_REMAPPING_REG(srcpriority
), RTL8367C_EAV_PRIORITY_REMAPPING_MASK(srcpriority
),pPriority
);