• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/drivers/char/rtl8365mb/
1/*
2 * Copyright (C) 2013 Realtek Semiconductor Corp.
3 * All Rights Reserved.
4 *
5 * This program is the proprietary software of Realtek Semiconductor
6 * Corporation and/or its licensors, and only be used, duplicated,
7 * modified or distributed under the authorized license from Realtek.
8 *
9 * ANY USE OF THE SOFTWARE OTHER THAN AS AUTHORIZED UNDER
10 * THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
11 *
12 * $Revision: 50338 $
13 * $Date: 2014-08-19 14:00:41 +0800 (������, 19 ������ 2014) $
14 *
15 * Purpose : RTL8367C switch high-level API for RTL8367C
16 * Feature : Ethernet AV related functions
17 *
18 */
19
20#include <rtl8367c_asicdrv_eav.h>
21/* Function Name:
22 *      rtl8367c_setAsicEavMacAddress
23 * Description:
24 *      Set PTP MAC address
25 * Input:
26 *      mac     - PTP mac
27 * Output:
28 *      None
29 * Return:
30 *      RT_ERR_OK         - Success
31 *      RT_ERR_SMI      - SMI access error
32 * Note:
33 *      None
34 */
35ret_t rtl8367c_setAsicEavMacAddress(ether_addr_t mac)
36{
37    ret_t retVal;
38    rtk_uint32 regData;
39    rtk_uint8 *accessPtr;
40    rtk_uint32 i;
41
42    accessPtr =  (rtk_uint8*)&mac;
43
44    regData = *accessPtr;
45    accessPtr ++;
46    regData = (regData << 8) | *accessPtr;
47    accessPtr ++;
48    for(i = 0; i <=2; i++)
49    {
50        retVal = rtl8367c_setAsicReg(RTL8367C_REG_MAC_ADDR_H - i, regData);
51        if(retVal != RT_ERR_OK)
52            return retVal;
53
54        regData = *accessPtr;
55        accessPtr ++;
56        regData = (regData << 8) | *accessPtr;
57        accessPtr ++;
58    }
59
60    return retVal;
61}
62/* Function Name:
63 *      rtl8367c_getAsicEavMacAddress
64 * Description:
65 *      Get PTP MAC address
66 * Input:
67 *      None
68 * Output:
69 *      pMac     - PTP  mac
70 * Return:
71 *      RT_ERR_OK         - Success
72 *      RT_ERR_SMI      - SMI access error
73 * Note:
74 *      None
75 */
76ret_t rtl8367c_getAsicEavMacAddress(ether_addr_t *pMac)
77{
78    ret_t retVal;
79    rtk_uint32 regData;
80    rtk_uint8 *accessPtr;
81    rtk_uint32 i;
82
83    accessPtr = (rtk_uint8*)pMac;
84
85    for(i = 0; i <= 2; i++)
86    {
87        retVal = rtl8367c_getAsicReg(RTL8367C_REG_MAC_ADDR_H - i, &regData);
88        if(retVal != RT_ERR_OK)
89            return retVal;
90
91        *accessPtr = (regData & 0xFF00) >> 8;
92        accessPtr ++;
93        *accessPtr = regData & 0xFF;
94        accessPtr ++;
95    }
96
97    return retVal;
98}
99
100/* Function Name:
101 *      rtl8367c_setAsicEavTpid
102 * Description:
103 *      Set PTP parser tag TPID.
104 * Input:
105 *       outerTag - outter tag TPID
106 *       innerTag  - inner tag TPID
107 * Output:
108 *      None
109 * Return:
110 *      RT_ERR_OK 	- Success
111 *      RT_ERR_SMI  - SMI access error
112 * Note:
113 *     None
114 */
115ret_t rtl8367c_setAsicEavTpid(rtk_uint32 outerTag, rtk_uint32 innerTag)
116{
117    ret_t retVal;
118
119    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_OTAG_TPID, outerTag)) != RT_ERR_OK)
120        return retVal;
121    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_ITAG_TPID, innerTag)) != RT_ERR_OK)
122        return retVal;
123
124    return RT_ERR_OK;
125}
126/* Function Name:
127 *      rtl8367c_getAsicEavTpid
128 * Description:
129 *      Get PTP parser tag TPID.
130 * Input:
131 *      None
132 * Output:
133 *       pOuterTag - outter tag TPID
134 *       pInnerTag  - inner tag TPID
135 * Return:
136 *      RT_ERR_OK 	- Success
137 *      RT_ERR_SMI  - SMI access error
138 * Note:
139 *      None
140 */
141ret_t rtl8367c_getAsicEavTpid(rtk_uint32* pOuterTag, rtk_uint32* pInnerTag)
142{
143    ret_t retVal;
144
145    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_OTAG_TPID, pOuterTag)) != RT_ERR_OK)
146        return retVal;
147    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_ITAG_TPID, pInnerTag)) != RT_ERR_OK)
148        return retVal;
149
150    return RT_ERR_OK;
151}
152
153/* Function Name:
154 *      rtl8367c_setAsicEavSysTime
155 * Description:
156 *      Set PTP system time
157 * Input:
158 *      second - seconds
159 *      nanoSecond - nano seconds
160 * Output:
161 *      None
162 * Return:
163 *      RT_ERR_OK     - Success
164 *      RT_ERR_SMI  - SMI access error
165 * Note:
166 *      The time granuality is 8 nano seconds.
167 */
168ret_t rtl8367c_setAsicEavSysTime(rtk_uint32 second, rtk_uint32 nanoSecond)
169{
170    ret_t retVal;
171    rtk_uint32 sec_h, sec_l, nsec8_h, nsec8_l;
172    rtk_uint32 nano_second_8;
173    rtk_uint32 regData, busyFlag, count;
174
175    if(nanoSecond > RTL8367C_EAV_NANOSECONDMAX)
176        return RT_ERR_INPUT;
177
178    regData = 0;
179    sec_h = second >>16;
180    sec_l = second & 0xFFFF;
181    nano_second_8 = nanoSecond >> 3;
182    nsec8_h = (nano_second_8 >>16) & RTL8367C_PTP_TIME_NSEC_H_NSEC_MASK;
183    nsec8_l = nano_second_8 &0xFFFF;
184
185    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_H_SEC, sec_h)) != RT_ERR_OK)
186        return retVal;
187    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_L_SEC, sec_l)) != RT_ERR_OK)
188        return retVal;
189    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_L_NSEC, nsec8_l)) != RT_ERR_OK)
190        return retVal;
191
192    regData = nsec8_h | (PTP_TIME_WRITE<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK;
193
194    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, regData)) != RT_ERR_OK)
195        return retVal;
196
197    count = 0;
198    do {
199        if((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, RTL8367C_PTP_TIME_NSEC_H_EXEC_OFFSET, &busyFlag)) != RT_ERR_OK)
200            return retVal;
201        count++;
202    } while ((busyFlag != 0)&&(count<5));
203
204    if (busyFlag != 0)
205        return RT_ERR_BUSYWAIT_TIMEOUT;
206
207    return RT_ERR_OK;
208}
209
210/* Function Name:
211 *      rtl8367c_getAsicEavSysTime
212 * Description:
213 *      Get PTP system time
214 * Input:
215 *      None
216 * Output:
217 *      second - seconds
218 *      nanoSecond - nano seconds
219 * Return:
220 *      RT_ERR_OK     - Success
221 *      RT_ERR_SMI  - SMI access error
222 * Note:
223 *      The time granuality is 8 nano seconds.
224 */
225ret_t rtl8367c_getAsicEavSysTime(rtk_uint32* pSecond, rtk_uint32* pNanoSecond)
226{
227    ret_t retVal;
228    rtk_uint32 sec_h, sec_l, nsec8_h, nsec8_l;
229    rtk_uint32 nano_second_8;
230    rtk_uint32 regData, busyFlag, count;
231
232    regData = 0;
233    regData = (PTP_TIME_READ<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK;
234
235    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, regData)) != RT_ERR_OK)
236        return retVal;
237
238    count = 0;
239    do {
240        if((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, RTL8367C_PTP_TIME_NSEC_H_EXEC_OFFSET, &busyFlag)) != RT_ERR_OK)
241            return retVal;
242        count++;
243    } while ((busyFlag != 0)&&(count<5));
244
245    if (busyFlag != 0)
246        return RT_ERR_BUSYWAIT_TIMEOUT;
247
248    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_SEC_H_SEC_RD, &sec_h)) != RT_ERR_OK)
249        return retVal;
250    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_SEC_L_SEC_RD, &sec_l)) != RT_ERR_OK)
251        return retVal;
252    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)
253        return retVal;
254    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_NSEC_L_NSEC_RD, &nsec8_l)) != RT_ERR_OK)
255        return retVal;
256
257    *pSecond = (sec_h<<16) | sec_l;
258    nano_second_8 = (nsec8_h<<16) | nsec8_l;
259    *pNanoSecond = nano_second_8<<3;
260
261    return RT_ERR_OK;
262}
263
264
265/* Function Name:
266 *      rtl8367c_setAsicEavSysTimeAdjust
267 * Description:
268 *      Set PTP system time adjust
269 * Input:
270 *      type - incresae or decrease
271 *      second - seconds
272 *      nanoSecond - nano seconds
273 * Output:
274 *      None
275 * Return:
276 *      RT_ERR_OK     - Success
277 *      RT_ERR_SMI  - SMI access error
278 * Note:
279 *      Ethernet AV second offset of timer for tuning
280 */
281ret_t rtl8367c_setAsicEavSysTimeAdjust(rtk_uint32 type, rtk_uint32 second, rtk_uint32 nanoSecond)
282{
283    ret_t retVal;
284    rtk_uint32 sec_h, sec_l, nsec8_h, nsec8_l;
285    rtk_uint32 nano_second_8;
286    rtk_uint32 regData, busyFlag, count;
287
288    if (type >= PTP_TIME_ADJ_END)
289        return RT_ERR_INPUT;
290    if(nanoSecond > RTL8367C_EAV_NANOSECONDMAX)
291        return RT_ERR_INPUT;
292
293    regData = 0;
294    sec_h = second >>16;
295    sec_l = second & 0xFFFF;
296    nano_second_8 = nanoSecond >> 3;
297    nsec8_h = (nano_second_8 >>16) & RTL8367C_PTP_TIME_NSEC_H_NSEC_MASK;
298    nsec8_l = nano_second_8 &0xFFFF;
299
300    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_H_SEC, sec_h)) != RT_ERR_OK)
301        return retVal;
302    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_SEC_L_SEC, sec_l)) != RT_ERR_OK)
303        return retVal;
304    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_L_NSEC, nsec8_l)) != RT_ERR_OK)
305        return retVal;
306
307    if (PTP_TIME_ADJ_INC == type)
308        regData = nsec8_h | (PTP_TIME_INC<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK;
309    else
310        regData = nsec8_h | (PTP_TIME_DEC<<RTL8367C_PTP_TIME_NSEC_H_CMD_OFFSET) | RTL8367C_PTP_TIME_NSEC_H_EXEC_MASK;
311
312    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, regData)) != RT_ERR_OK)
313        return retVal;
314
315    count = 0;
316    do {
317        if((retVal = rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_TIME_NSEC_H_NSEC, RTL8367C_PTP_TIME_NSEC_H_EXEC_OFFSET, &busyFlag)) != RT_ERR_OK)
318            return retVal;
319        count++;
320    } while ((busyFlag != 0)&&(count<5));
321
322    if (busyFlag != 0)
323        return RT_ERR_BUSYWAIT_TIMEOUT;
324
325    return RT_ERR_OK;
326}
327
328/* Function Name:
329 *      rtl8367c_setAsicEavSysTimeCtrl
330 * Description:
331 *      Set PTP system time control
332 * Input:
333 *      command - start or stop
334 * Output:
335 *      None
336 * Return:
337 *      RT_ERR_OK     - Success
338 *      RT_ERR_SMI  - SMI access error
339 * Note:
340 *      None
341 */
342ret_t rtl8367c_setAsicEavSysTimeCtrl(rtk_uint32 control)
343{
344    ret_t  retVal;
345    rtk_uint32 regData;
346
347    if (control>=PTP_TIME_CTRL_END)
348         return RT_ERR_INPUT;
349
350    regData = 0;
351    if (PTP_TIME_CTRL_START == control)
352            regData = RTL8367C_CFG_TIMER_EN_FRC_MASK | RTL8367C_CFG_TIMER_1588_EN_MASK;
353    else
354        regData = 0;
355
356    if((retVal = rtl8367c_setAsicReg(RTL8367C_REG_PTP_TIME_CFG, regData)) != RT_ERR_OK)
357        return retVal;
358
359    return RT_ERR_OK;
360}
361
362/* Function Name:
363 *      rtl8367c_getAsicEavSysTimeCtrl
364 * Description:
365 *      Get PTP system time control
366 * Input:
367 *      None
368 * Output:
369 *      pControl - start or stop
370 * Return:
371 *      RT_ERR_OK     - Success
372 *      RT_ERR_SMI  - SMI access error
373 * Note:
374 *      None
375 */
376ret_t rtl8367c_getAsicEavSysTimeCtrl(rtk_uint32* pControl)
377{
378    ret_t  retVal;
379    rtk_uint32 regData;
380    rtk_uint32 mask;
381
382    mask = RTL8367C_CFG_TIMER_EN_FRC_MASK | RTL8367C_CFG_TIMER_1588_EN_MASK;
383
384    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PTP_TIME_CFG, &regData)) != RT_ERR_OK)
385        return retVal;
386
387    if( (regData & mask) == mask)
388        *pControl = PTP_TIME_CTRL_START;
389    else if( (regData & mask) == 0)
390        *pControl = PTP_TIME_CTRL_STOP;
391    else
392        return RT_ERR_NOT_ALLOWED;
393
394    return RT_ERR_OK;
395}
396
397/* Function Name:
398 *      rtl8367c_setAsicEavInterruptMask
399 * Description:
400 *      Set PTP interrupt enable mask
401 * Input:
402 *      imr 	- Interrupt mask
403 * Output:
404 *      None
405 * Return:
406 *      RT_ERR_OK 	- Success
407 *      RT_ERR_SMI  - SMI access error
408 * Note:
409 *    	[0]:TX_SYNC,
410 *    	[1]:TX_DELAY,
411 *    	[2]:TX_PDELAY_REQ,
412 *    	[3]:TX_PDELAY_RESP,
413 *    	[4]:RX_SYNC,
414 *    	[5]:RX_DELAY,
415 *    	[6]:RX_PDELAY_REQ,
416 *    	[7]:RX_PDELAY_RESP,
417 */
418ret_t rtl8367c_setAsicEavInterruptMask(rtk_uint32 imr)
419{
420    if ((imr&(RTL8367C_PTP_INTR_MASK<<8))>0)
421         return RT_ERR_INPUT;
422
423    return rtl8367c_setAsicRegBits(RTL8367C_REG_PTP_TIME_CFG2, RTL8367C_PTP_INTR_MASK, imr);
424}
425/* Function Name:
426 *      rtl8367c_getAsicEavInterruptMask
427 * Description:
428 *      Get PTP interrupt enable mask
429 * Input:
430 *      pImr 	- Interrupt mask
431 * Output:
432 *      None
433 * Return:
434 *      RT_ERR_OK 	- Success
435 *      RT_ERR_SMI  - SMI access error
436 * Note:
437 *    	[0]:TX_SYNC,
438 *    	[1]:TX_DELAY,
439 *    	[2]:TX_PDELAY_REQ,
440 *    	[3]:TX_PDELAY_RESP,
441 *    	[4]:RX_SYNC,
442 *    	[5]:RX_DELAY,
443 *    	[6]:RX_PDELAY_REQ,
444 *    	[7]:RX_PDELAY_RESP,
445 */
446ret_t rtl8367c_getAsicEavInterruptMask(rtk_uint32* pImr)
447{
448    return rtl8367c_getAsicRegBits(RTL8367C_REG_PTP_TIME_CFG2, RTL8367C_PTP_INTR_MASK, pImr);
449}
450
451/* Function Name:
452 *      rtl8367c_getAsicEavInterruptStatus
453 * Description:
454 *      Get PTP interrupt port status mask
455 * Input:
456 *      pIms	- Interrupt mask
457 * Output:
458 *      None
459 * Return:
460 *      RT_ERR_OK 	- Success
461 *      RT_ERR_SMI  - SMI access error
462 * Note:
463 *    	[0]:p0 interrupt,
464 *    	[1]:p1 interrupt,
465 *    	[2]:p2 interrupt,
466 *    	[3]:p3 interrupt,
467 *    	[4]:p4 interrupt,
468 */
469ret_t rtl8367c_getAsicEavInterruptStatus(rtk_uint32* pIms)
470{
471    return rtl8367c_getAsicRegBits(RTL8367C_REG_PTP_INTERRUPT_CFG, RTL8367C_PTP_PORT_MASK, pIms);
472}
473
474/* Function Name:
475 *      rtl8367c_setAsicInterruptMask
476 * Description:
477 *      Clear interrupt enable mask
478 * Input:
479 *      ims 	- Interrupt status mask
480 * Output:
481 *      None
482 * Return:
483 *      RT_ERR_OK 	- Success
484 *      RT_ERR_SMI  - SMI access error
485 * Note:
486 *   	This API can be used to clear ASIC interrupt status and register will be cleared by writting 1.
487 *    	[0]:TX_SYNC,
488 *    	[1]:TX_DELAY,
489 *    	[2]:TX_PDELAY_REQ,
490 *    	[3]:TX_PDELAY_RESP,
491 *    	[4]:RX_SYNC,
492 *    	[5]:RX_DELAY,
493 *    	[6]:RX_PDELAY_REQ,
494 *    	[7]:RX_PDELAY_RESP,
495 */
496ret_t rtl8367c_setAsicEavPortInterruptStatus(rtk_uint32 port, rtk_uint32 ims)
497{
498
499    if(port > RTL8367C_PORTNO)
500        return RT_ERR_PORT_ID;
501
502	if(port < 5)
503    	return rtl8367c_setAsicRegBits(RTL8367C_EAV_PORT_CFG_REG(port), RTL8367C_PTP_INTR_MASK,ims);
504	else if(port == 5)
505    	return rtl8367c_setAsicRegBits(RTL8367C_REG_P5_EAV_CFG, RTL8367C_PTP_INTR_MASK,ims);
506	else if(port == 6)
507    	return rtl8367c_setAsicRegBits(RTL8367C_REG_P6_EAV_CFG, RTL8367C_PTP_INTR_MASK,ims);
508	else if(port == 7)
509    	return rtl8367c_setAsicRegBits(RTL8367C_REG_P7_EAV_CFG, RTL8367C_PTP_INTR_MASK,ims);
510	else if(port == 8)
511    	return rtl8367c_setAsicRegBits(RTL8367C_REG_P8_EAV_CFG, RTL8367C_PTP_INTR_MASK,ims);
512	else if(port == 9)
513    	return rtl8367c_setAsicRegBits(RTL8367C_REG_P9_EAV_CFG, RTL8367C_PTP_INTR_MASK,ims);
514
515	return RT_ERR_OK;
516}
517/* Function Name:
518 *      rtl8367c_getAsicInterruptStatus
519 * Description:
520 *      Get interrupt enable mask
521 * Input:
522 *      pIms 	- Interrupt status mask
523 * Output:
524 *      None
525 * Return:
526 *      RT_ERR_OK 	- Success
527 *      RT_ERR_SMI  - SMI access error
528 * Note:
529 *    	[0]:TX_SYNC,
530 *    	[1]:TX_DELAY,
531 *    	[2]:TX_PDELAY_REQ,
532 *    	[3]:TX_PDELAY_RESP,
533 *    	[4]:RX_SYNC,
534 *    	[5]:RX_DELAY,
535 *    	[6]:RX_PDELAY_REQ,
536 *    	[7]:RX_PDELAY_RESP,
537 */
538ret_t rtl8367c_getAsicEavPortInterruptStatus(rtk_uint32 port, rtk_uint32* pIms)
539{
540
541    if(port > RTL8367C_PORTNO)
542        return RT_ERR_PORT_ID;
543	if(port < 5)
544    	return rtl8367c_getAsicRegBits(RTL8367C_EAV_PORT_CFG_REG(port), RTL8367C_PTP_INTR_MASK, pIms);
545	else if(port == 5)
546    	return rtl8367c_getAsicRegBits(RTL8367C_REG_P5_EAV_CFG, RTL8367C_PTP_INTR_MASK, pIms);
547	else if(port == 6)
548    	return rtl8367c_getAsicRegBits(RTL8367C_REG_P6_EAV_CFG, RTL8367C_PTP_INTR_MASK,pIms);
549	else if(port == 7)
550    	return rtl8367c_getAsicRegBits(RTL8367C_REG_P7_EAV_CFG, RTL8367C_PTP_INTR_MASK,pIms);
551	else if(port == 8)
552    	return rtl8367c_getAsicRegBits(RTL8367C_REG_P8_EAV_CFG, RTL8367C_PTP_INTR_MASK,pIms);
553	else if(port == 9)
554    	return rtl8367c_getAsicRegBits(RTL8367C_REG_P9_EAV_CFG, RTL8367C_PTP_INTR_MASK,pIms);
555
556	return RT_ERR_OK;
557
558}
559
560
561/* Function Name:
562 *      rtl8367c_setAsicEavPortEnable
563 * Description:
564 *      Set per-port EAV function enable/disable
565 * Input:
566 *      port         - Physical port number (0~9)
567 *      enabled     - 1: enabled, 0: disabled
568 * Output:
569 *      None
570 * Return:
571 *      RT_ERR_OK         - Success
572 *      RT_ERR_SMI      - SMI access error
573 *      RT_ERR_PORT_ID  - Invalid port number
574 * Note:
575 *      If EAV function is enabled, PTP event messgae packet will be attached PTP timestamp for trapping
576 */
577ret_t rtl8367c_setAsicEavPortEnable(rtk_uint32 port, rtk_uint32 enabled)
578{
579    if(port > RTL8367C_PORTNO)
580        return RT_ERR_PORT_ID;
581
582	if(port < 5)
583    	return rtl8367c_setAsicRegBit(RTL8367C_EAV_PORT_CFG_REG(port), RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
584	else if(port == 5)
585    	return rtl8367c_setAsicRegBit(RTL8367C_REG_P5_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
586	else if(port == 6)
587    	return rtl8367c_setAsicRegBit(RTL8367C_REG_P6_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
588	else if(port == 7)
589    	return rtl8367c_setAsicRegBit(RTL8367C_REG_P7_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
590	else if(port == 8)
591    	return rtl8367c_setAsicRegBit(RTL8367C_REG_P8_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
592	else if(port == 9)
593    	return rtl8367c_setAsicRegBit(RTL8367C_REG_P9_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, enabled);
594
595
596	return RT_ERR_OK;
597}
598/* Function Name:
599 *      rtl8367c_getAsicEavPortEnable
600 * Description:
601 *      Get per-port EAV function enable/disable
602 * Input:
603 *      port         - Physical port number (0~9)
604 *      pEnabled     - 1: enabled, 0: disabled
605 * Output:
606 *      None
607 * Return:
608 *      RT_ERR_OK         - Success
609 *      RT_ERR_SMI      - SMI access error
610 *      RT_ERR_PORT_ID  - Invalid port number
611 * Note:
612 *      None
613 */
614ret_t rtl8367c_getAsicEavPortEnable(rtk_uint32 port, rtk_uint32 *pEnabled)
615{
616    if(port > RTL8367C_PORTNO)
617        return RT_ERR_PORT_ID;
618
619
620
621	if(port < 5)
622    	return rtl8367c_getAsicRegBit(RTL8367C_EAV_PORT_CFG_REG(port), RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
623	else if(port == 5)
624    	return rtl8367c_getAsicRegBit(RTL8367C_REG_P5_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
625	else if(port == 6)
626    	return rtl8367c_getAsicRegBit(RTL8367C_REG_P6_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
627	else if(port == 7)
628    	return rtl8367c_getAsicRegBit(RTL8367C_REG_P7_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
629	else if(port == 8)
630    	return rtl8367c_getAsicRegBit(RTL8367C_REG_P8_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
631	else if(port == 9)
632    	return rtl8367c_getAsicRegBit(RTL8367C_REG_P9_EAV_CFG, RTL8367C_EAV_CFG_PTP_PHY_EN_EN_OFFSET, pEnabled);
633
634
635	return RT_ERR_OK;
636}
637
638/* Function Name:
639 *      rtl8367c_getAsicEavPortTimeStamp
640 * Description:
641 *      Get PTP port time stamp
642 * Input:
643 *      port         - Physical port number (0~9)
644 *      type     -  PTP packet type
645 * Output:
646 *      timeStamp - seconds
647 * Return:
648 *      RT_ERR_OK     - Success
649 *      RT_ERR_SMI  - SMI access error
650 * Note:
651 *      The time granuality is 8 nano seconds.
652 */
653ret_t rtl8367c_getAsicEavPortTimeStamp(rtk_uint32 port, rtk_uint32 type, rtl8367c_ptp_time_stamp_t* timeStamp)
654{
655    ret_t retVal;
656    rtk_uint32 sec_h, sec_l, nsec8_h, nsec8_l;
657    rtk_uint32 nano_second_8;
658
659    if(port > RTL8367C_PORTNO)
660        return RT_ERR_PORT_ID;
661    if(type >= PTP_PKT_TYPE_END)
662        return RT_ERR_INPUT;
663
664	if(port < 5){
665	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_SEQ_ID(port, type), &timeStamp->sequence_id))!=  RT_ERR_OK)
666	        return retVal;
667	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PORT_SEC_H(port) , &sec_h)) != RT_ERR_OK)
668	       return retVal;
669	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PORT_SEC_L(port), &sec_l)) != RT_ERR_OK)
670	       return retVal;
671	    if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_PORT_NSEC_H(port) , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
672	       return retVal;
673	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_PORT_NSEC_L(port) , &nsec8_l)) != RT_ERR_OK)
674	       return retVal;
675	}else if(port == 5){
676	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P5_TX_SYNC_SEQ_ID+type, &timeStamp->sequence_id))!=  RT_ERR_OK)
677	        return retVal;
678	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P5_PORT_SEC_31_16, &sec_h)) != RT_ERR_OK)
679	       return retVal;
680	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P5_PORT_SEC_15_0, &sec_l)) != RT_ERR_OK)
681	       return retVal;
682	    if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_P5_PORT_NSEC_26_16 , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
683	       return retVal;
684	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P5_PORT_NSEC_15_0, &nsec8_l)) != RT_ERR_OK)
685	       return retVal;
686	}else if(port == 6){
687	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P6_TX_SYNC_SEQ_ID+type, &timeStamp->sequence_id))!=  RT_ERR_OK)
688	        return retVal;
689	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P6_PORT_SEC_31_16, &sec_h)) != RT_ERR_OK)
690	       return retVal;
691	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P6_PORT_SEC_15_0, &sec_l)) != RT_ERR_OK)
692	       return retVal;
693	    if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_P6_PORT_NSEC_26_16 , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
694	       return retVal;
695	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P6_PORT_NSEC_15_0, &nsec8_l)) != RT_ERR_OK)
696	       return retVal;
697	}else if(port == 7){
698	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P7_TX_SYNC_SEQ_ID+type, &timeStamp->sequence_id))!=  RT_ERR_OK)
699	        return retVal;
700	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P7_PORT_SEC_31_16, &sec_h)) != RT_ERR_OK)
701	       return retVal;
702	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P7_PORT_SEC_15_0, &sec_l)) != RT_ERR_OK)
703	       return retVal;
704	    if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_P7_PORT_NSEC_26_16 , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
705	       return retVal;
706	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P7_PORT_NSEC_15_0, &nsec8_l)) != RT_ERR_OK)
707	       return retVal;
708	}else if(port == 8){
709	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P8_TX_SYNC_SEQ_ID+type, &timeStamp->sequence_id))!=  RT_ERR_OK)
710	        return retVal;
711	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P8_PORT_SEC_31_16, &sec_h)) != RT_ERR_OK)
712	       return retVal;
713	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P8_PORT_SEC_15_0, &sec_l)) != RT_ERR_OK)
714	       return retVal;
715	    if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_P8_PORT_NSEC_26_16 , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
716	       return retVal;
717	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P8_PORT_NSEC_15_0, &nsec8_l)) != RT_ERR_OK)
718	       return retVal;
719	}else if(port == 9){
720	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P9_TX_SYNC_SEQ_ID+type, &timeStamp->sequence_id))!=  RT_ERR_OK)
721	        return retVal;
722	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P9_PORT_SEC_31_16, &sec_h)) != RT_ERR_OK)
723	       return retVal;
724	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P9_PORT_SEC_15_0, &sec_l)) != RT_ERR_OK)
725	       return retVal;
726	    if((retVal = rtl8367c_getAsicRegBits(RTL8367C_REG_P9_PORT_NSEC_26_16 , RTL8367C_PORT_NSEC_H_MASK,&nsec8_h)) != RT_ERR_OK)
727	       return retVal;
728	    if((retVal = rtl8367c_getAsicReg(RTL8367C_REG_P9_PORT_NSEC_15_0, &nsec8_l)) != RT_ERR_OK)
729	       return retVal;
730	}
731
732    timeStamp->second = (sec_h<<16) | sec_l;
733    nano_second_8 = (nsec8_h<<16) | nsec8_l;
734    timeStamp->nano_second = nano_second_8<<3;
735
736    return RT_ERR_OK;
737}
738
739
740/* Function Name:
741 *      rtl8367c_setAsicEavTrap
742 * Description:
743 *      Set per-port PTP packet trap to CPU
744 * Input:
745 *      port         - Physical port number (0~5)
746 *      enabled     - 1: enabled, 0: disabled
747 * Output:
748 *      None
749 * Return:
750 *      RT_ERR_OK         - Success
751 *      RT_ERR_SMI      - SMI access error
752 *      RT_ERR_PORT_ID  - Invalid port number
753 * Note:
754 *      If EAV trap enabled, switch will trap PTP packet to CPU
755 */
756ret_t rtl8367c_setAsicEavTrap(rtk_uint32 port, rtk_uint32 enabled)
757{
758    if(port > RTL8367C_PORTNO)
759        return RT_ERR_PORT_ID;
760
761    return rtl8367c_setAsicRegBit(RTL8367C_REG_PTP_PORT0_CFG1 + (port * 0x20), RTL8367C_PTP_PORT0_CFG1_OFFSET, enabled);
762}
763/* Function Name:
764 *      rtl8367c_getAsicEavTimeSyncEn
765 * Description:
766 *      Get per-port EPTP packet trap to CPU
767 * Input:
768 *      port         - Physical port number (0~5)
769 *      pEnabled     - 1: enabled, 0: disabled
770 * Output:
771 *      None
772 * Return:
773 *      RT_ERR_OK         - Success
774 *      RT_ERR_SMI      - SMI access error
775 *      RT_ERR_PORT_ID  - Invalid port number
776 * Note:
777 *      None
778 */
779ret_t rtl8367c_getAsicEavTrap(rtk_uint32 port, rtk_uint32 *pEnabled)
780{
781    if(port > RTL8367C_PORTNO)
782        return RT_ERR_PORT_ID;
783
784    return rtl8367c_getAsicRegBit(RTL8367C_REG_PTP_PORT0_CFG1 + (port * 0x20), RTL8367C_PTP_PORT0_CFG1_OFFSET, pEnabled);
785}
786
787/* Function Name:
788 *      rtl8367c_setAsicEavEnable
789 * Description:
790 *      Set per-port EAV function enable/disable
791 * Input:
792 *      port         - Physical port number (0~5)
793 *      enabled     - 1: enabled, 0: disabled
794 * Output:
795 *      None
796 * Return:
797 *      RT_ERR_OK         - Success
798 *      RT_ERR_SMI      - SMI access error
799 *      RT_ERR_PORT_ID  - Invalid port number
800 * Note:
801 *      If EAV function is enabled, PTP event messgae packet will be attached PTP timestamp for trapping
802 */
803ret_t rtl8367c_setAsicEavEnable(rtk_uint32 port, rtk_uint32 enabled)
804{
805    if(port > RTL8367C_PORTNO)
806        return RT_ERR_PORT_ID;
807
808    return rtl8367c_setAsicRegBit(RTL8367C_REG_EAV_CTRL0, port, enabled);
809}
810/* Function Name:
811 *      rtl8367c_getAsicEavEnable
812 * Description:
813 *      Get per-port EAV function enable/disable
814 * Input:
815 *      port         - Physical port number (0~5)
816 *      pEnabled     - 1: enabled, 0: disabled
817 * Output:
818 *      None
819 * Return:
820 *      RT_ERR_OK         - Success
821 *      RT_ERR_SMI      - SMI access error
822 *      RT_ERR_PORT_ID  - Invalid port number
823 * Note:
824 *      None
825 */
826ret_t rtl8367c_getAsicEavEnable(rtk_uint32 port, rtk_uint32 *pEnabled)
827{
828    if(port > RTL8367C_PORTNO)
829        return RT_ERR_PORT_ID;
830
831    return rtl8367c_getAsicRegBit(RTL8367C_REG_EAV_CTRL0, port, pEnabled);
832}
833/* Function Name:
834 *      rtl8367c_setAsicEavPriRemapping
835 * Description:
836 *      Set non-EAV streaming priority remapping
837 * Input:
838 *      srcpriority - Priority value
839 *      priority     - Absolute priority value
840 * Output:
841 *      None
842 * Return:
843 *      RT_ERR_OK                     - Success
844 *      RT_ERR_SMI                  - SMI access error
845 *      RT_ERR_QOS_INT_PRIORITY      - Invalid priority
846 * Note:
847 *      None
848 */
849ret_t rtl8367c_setAsicEavPriRemapping(rtk_uint32 srcpriority, rtk_uint32 priority)
850{
851    if(srcpriority > RTL8367C_PRIMAX || priority > RTL8367C_PRIMAX)
852        return RT_ERR_QOS_INT_PRIORITY;
853
854    return rtl8367c_setAsicRegBits(RTL8367C_EAV_PRIORITY_REMAPPING_REG(srcpriority), RTL8367C_EAV_PRIORITY_REMAPPING_MASK(srcpriority),priority);
855}
856/* Function Name:
857 *      rtl8367c_getAsicEavPriRemapping
858 * Description:
859 *      Get non-EAV streaming priority remapping
860 * Input:
861 *      srcpriority - Priority value
862 *      pPriority     - Absolute priority value
863 * Output:
864 *      None
865 * Return:
866 *      RT_ERR_OK                     - Success
867 *      RT_ERR_SMI                  - SMI access error
868 *      RT_ERR_QOS_INT_PRIORITY      - Invalid priority
869 * Note:
870 *      None
871 */
872ret_t rtl8367c_getAsicEavPriRemapping(rtk_uint32 srcpriority, rtk_uint32 *pPriority)
873{
874    if(srcpriority > RTL8367C_PRIMAX )
875        return RT_ERR_QOS_INT_PRIORITY;
876
877    return rtl8367c_getAsicRegBits(RTL8367C_EAV_PRIORITY_REMAPPING_REG(srcpriority), RTL8367C_EAV_PRIORITY_REMAPPING_MASK(srcpriority),pPriority);
878}
879
880