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, ®Data); 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, ®Data)) != 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