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: 2013-08-26 13:51:29 +0800 (週一, 26 八月 2013) $
13 * Purpose : RTL8367C switch high-level API for RTL8367C
14 * Feature : RLDP related functions
18 #include <rtl8367c_asicdrv_rldp.h>
20 * rtl8367c_setAsicRldp
22 * Set RLDP function enable/disable
24 * enabled - 1: enabled, 0: disabled
29 * RT_ERR_SMI - SMI access error
33 ret_t
rtl8367c_setAsicRldp(rtk_uint32 enabled
)
35 return rtl8367c_setAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLDP_ENABLE_OFFSET
, enabled
);
38 * rtl8367c_getAsicRldp
40 * Get RLDP function enable/disable
42 * pEnabled - 1: enabled, 0: disabled
47 * RT_ERR_SMI - SMI access error
51 ret_t
rtl8367c_getAsicRldp(rtk_uint32
*pEnabled
)
53 return rtl8367c_getAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLDP_ENABLE_OFFSET
, pEnabled
);
56 * rtl8367c_setAsicRldpEnable8051
58 * Set RLDP function handled by ASIC or 8051
60 * enabled - 1: enabled 8051, 0: disabled 8051 (RLDP is handled by ASIC)
65 * RT_ERR_SMI - SMI access error
69 ret_t
rtl8367c_setAsicRldpEnable8051(rtk_uint32 enabled
)
71 return rtl8367c_setAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLDP_8051_ENABLE_OFFSET
, enabled
);
74 * rtl8367c_setAsicRldrtl8367c_getAsicRldpEnable8051pEnable8051
76 * Get RLDP function handled by ASIC or 8051
78 * pEnabled - 1: enabled 8051, 0: disabled 8051 (RLDP is handled by ASIC)
83 * RT_ERR_SMI - SMI access error
87 ret_t
rtl8367c_getAsicRldpEnable8051(rtk_uint32
*pEnabled
)
89 return rtl8367c_getAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLDP_8051_ENABLE_OFFSET
, pEnabled
);
92 * rtl8367c_setAsicRldpCompareRandomNumber
94 * Set enable compare the random number field and seed field of RLDP frame
96 * enabled - 1: enabled comparing random number, 0: disabled comparing random number
100 * RT_ERR_OK - Success
101 * RT_ERR_SMI - SMI access error
105 ret_t
rtl8367c_setAsicRldpCompareRandomNumber(rtk_uint32 enabled
)
107 return rtl8367c_setAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLDP_COMP_ID_OFFSET
, enabled
);
110 * rtl8367c_getAsicRldpCompareRandomNumber
112 * Get enable compare the random number field and seed field of RLDP frame
114 * pEnabled - 1: enabled comparing random number, 0: disabled comparing random number
118 * RT_ERR_OK - Success
119 * RT_ERR_SMI - SMI access error
123 ret_t
rtl8367c_getAsicRldpCompareRandomNumber(rtk_uint32
*pEnabled
)
125 return rtl8367c_getAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLDP_COMP_ID_OFFSET
, pEnabled
);
128 * rtl8367c_setAsicRldpIndicatorSource
130 * Set buzzer and LED source when detecting a loop
132 * src - 0: ASIC, 1: 8051
136 * RT_ERR_OK - Success
137 * RT_ERR_SMI - SMI access error
141 ret_t
rtl8367c_setAsicRldpIndicatorSource(rtk_uint32 src
)
143 return rtl8367c_setAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLDP_INDICATOR_SOURCE_OFFSET
, src
);
146 * rtl8367c_getAsicRldpIndicatorSource
148 * Get buzzer and LED source when detecting a loop
150 * pSrc - 0: ASIC, 1: 8051
154 * RT_ERR_OK - Success
155 * RT_ERR_SMI - SMI access error
159 ret_t
rtl8367c_getAsicRldpIndicatorSource(rtk_uint32
*pSrc
)
161 return rtl8367c_getAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLDP_INDICATOR_SOURCE_OFFSET
, pSrc
);
164 * rtl8367c_setAsicRldpCheckingStatePara
166 * Set retry count and retry period of checking state
168 * retryCount - 0~0xFF (times)
169 * retryPeriod - 0~0xFFFF (ms)
173 * RT_ERR_OK - Success
174 * RT_ERR_SMI - SMI access error
175 * RT_ERR_OUT_OF_RANGE - input parameter out of range
179 ret_t
rtl8367c_setAsicRldpCheckingStatePara(rtk_uint32 retryCount
, rtk_uint32 retryPeriod
)
183 if(retryCount
> 0xFF)
184 return RT_ERR_OUT_OF_RANGE
;
185 if(retryPeriod
> RTL8367C_REGDATAMAX
)
186 return RT_ERR_OUT_OF_RANGE
;
188 retVal
= rtl8367c_setAsicRegBits(RTL8367C_RLDP_RETRY_COUNT_REG
, RTL8367C_RLDP_RETRY_COUNT_CHKSTATE_MASK
, retryCount
);
189 if(retVal
!= RT_ERR_OK
)
192 return rtl8367c_setAsicReg(RTL8367C_RLDP_RETRY_PERIOD_CHKSTATE_REG
, retryPeriod
);
195 * rtl8367c_getAsicRldpCheckingStatePara
197 * Get retry count and retry period of checking state
199 * pRetryCount - 0~0xFF (times)
200 * pRetryPeriod - 0~0xFFFF (ms)
204 * RT_ERR_OK - Success
205 * RT_ERR_SMI - SMI access error
206 * RT_ERR_OUT_OF_RANGE - input parameter out of range
210 ret_t
rtl8367c_getAsicRldpCheckingStatePara(rtk_uint32
*pRetryCount
, rtk_uint32
*pRetryPeriod
)
214 retVal
= rtl8367c_getAsicRegBits(RTL8367C_RLDP_RETRY_COUNT_REG
, RTL8367C_RLDP_RETRY_COUNT_CHKSTATE_MASK
, pRetryCount
);
215 if(retVal
!= RT_ERR_OK
)
218 return rtl8367c_getAsicReg(RTL8367C_RLDP_RETRY_PERIOD_CHKSTATE_REG
, pRetryPeriod
);
221 * rtl8367c_setAsicRldpLoopStatePara
223 * Set retry count and retry period of loop state
225 * retryCount - 0~0xFF (times)
226 * retryPeriod - 0~0xFFFF (ms)
230 * RT_ERR_OK - Success
231 * RT_ERR_SMI - SMI access error
232 * RT_ERR_OUT_OF_RANGE - input parameter out of range
236 ret_t
rtl8367c_setAsicRldpLoopStatePara(rtk_uint32 retryCount
, rtk_uint32 retryPeriod
)
240 if(retryCount
> 0xFF)
241 return RT_ERR_OUT_OF_RANGE
;
243 if(retryPeriod
> RTL8367C_REGDATAMAX
)
244 return RT_ERR_OUT_OF_RANGE
;
246 retVal
= rtl8367c_setAsicRegBits(RTL8367C_RLDP_RETRY_COUNT_REG
, RTL8367C_RLDP_RETRY_COUNT_LOOPSTATE_MASK
, retryCount
);
247 if(retVal
!= RT_ERR_OK
)
250 return rtl8367c_setAsicReg(RTL8367C_RLDP_RETRY_PERIOD_LOOPSTATE_REG
, retryPeriod
);
253 * rtl8367c_getAsicRldpLoopStatePara
255 * Get retry count and retry period of loop state
257 * pRetryCount - 0~0xFF (times)
258 * pRetryPeriod - 0~0xFFFF (ms)
262 * RT_ERR_OK - Success
263 * RT_ERR_SMI - SMI access error
264 * RT_ERR_OUT_OF_RANGE - input parameter out of range
268 ret_t
rtl8367c_getAsicRldpLoopStatePara(rtk_uint32
*pRetryCount
, rtk_uint32
*pRetryPeriod
)
272 retVal
= rtl8367c_getAsicRegBits(RTL8367C_RLDP_RETRY_COUNT_REG
, RTL8367C_RLDP_RETRY_COUNT_LOOPSTATE_MASK
, pRetryCount
);
273 if(retVal
!= RT_ERR_OK
)
276 return rtl8367c_getAsicReg(RTL8367C_RLDP_RETRY_PERIOD_LOOPSTATE_REG
, pRetryPeriod
);
279 * rtl8367c_setAsicRldpTxPortmask
281 * Set portmask that send/forward RLDP frame
287 * RT_ERR_OK - Success
288 * RT_ERR_SMI - SMI access error
289 * RT_ERR_PORT_MASK - Invalid portmask
293 ret_t
rtl8367c_setAsicRldpTxPortmask(rtk_uint32 portmask
)
295 if(portmask
> RTL8367C_PORTMASK
)
296 return RT_ERR_PORT_MASK
;
298 return rtl8367c_setAsicReg(RTL8367C_RLDP_TX_PMSK_REG
, portmask
);
301 * rtl8367c_getAsicRldpTxPortmask
303 * Get portmask that send/forward RLDP frame
309 * RT_ERR_OK - Success
310 * RT_ERR_SMI - SMI access error
314 ret_t
rtl8367c_getAsicRldpTxPortmask(rtk_uint32
*pPortmask
)
316 return rtl8367c_getAsicReg(RTL8367C_RLDP_TX_PMSK_REG
, pPortmask
);
319 * rtl8367c_setAsicRldpMagicNum
321 * Set Random seed of RLDP
327 * RT_ERR_OK - Success
328 * RT_ERR_SMI - SMI access error
332 ret_t
rtl8367c_setAsicRldpMagicNum(ether_addr_t seed
)
336 rtk_uint16
*accessPtr
;
339 accessPtr
= (rtk_uint16
*)&seed
;
341 for (i
= 0; i
< 3; i
++)
343 regData
= *accessPtr
;
344 retVal
= rtl8367c_setAsicReg(RTL8367C_RLDP_MAGIC_NUM_REG_BASE
+ i
, regData
);
345 if(retVal
!= RT_ERR_OK
)
354 * rtl8367c_getAsicRldpMagicNum
356 * Get Random seed of RLDP
362 * RT_ERR_OK - Success
363 * RT_ERR_SMI - SMI access error
367 ret_t
rtl8367c_getAsicRldpMagicNum(ether_addr_t
*pSeed
)
371 rtk_uint16
*accessPtr
;
374 accessPtr
= (rtk_uint16
*)pSeed
;
376 for(i
= 0; i
< 3; i
++)
378 retVal
= rtl8367c_getAsicReg(RTL8367C_RLDP_MAGIC_NUM_REG_BASE
+ i
, ®Data
);
379 if(retVal
!= RT_ERR_OK
)
382 *accessPtr
= regData
;
390 * rtl8367c_getAsicRldpLoopedPortmask
392 * Get looped portmask
398 * RT_ERR_OK - Success
399 * RT_ERR_SMI - SMI access error
403 ret_t
rtl8367c_getAsicRldpLoopedPortmask(rtk_uint32
*pPortmask
)
405 return rtl8367c_getAsicReg(RTL8367C_RLDP_LOOP_PMSK_REG
, pPortmask
);
408 * rtl8367c_getAsicRldpRandomNumber
410 * Get Random number of RLDP
416 * RT_ERR_OK - Success
417 * RT_ERR_SMI - SMI access error
421 ret_t
rtl8367c_getAsicRldpRandomNumber(ether_addr_t
*pRandNumber
)
425 rtk_int16 accessPtr
[3];
428 for(i
= 0; i
< 3; i
++)
430 retVal
= rtl8367c_getAsicReg(RTL8367C_RLDP_RAND_NUM_REG_BASE
+ i
, ®Data
);
431 if(retVal
!= RT_ERR_OK
)
434 accessPtr
[i
] = regData
;
437 memcpy(pRandNumber
, accessPtr
, 6);
441 * rtl8367c_getAsicRldpLoopedPortmask
443 * Get port number of looped pair
445 * port - Physical port number (0~7)
446 * pLoopedPair - port (0~7)
450 * RT_ERR_OK - Success
451 * RT_ERR_SMI - SMI access error
452 * RT_ERR_PORT_ID - Invalid port number
456 ret_t
rtl8367c_getAsicRldpLoopedPortPair(rtk_uint32 port
, rtk_uint32
*pLoopedPair
)
458 if(port
> RTL8367C_PORTIDMAX
)
459 return RT_ERR_PORT_ID
;
462 return rtl8367c_getAsicRegBits(RTL8367C_RLDP_LOOP_PORT_REG(port
), RTL8367C_RLDP_LOOP_PORT_MASK(port
), pLoopedPair
);
464 return rtl8367c_getAsicRegBits(RTL8367C_REG_RLDP_LOOP_PORT_REG4
+ ((port
- 8) >> 1), RTL8367C_RLDP_LOOP_PORT_MASK(port
), pLoopedPair
);
467 * rtl8367c_setAsicRlppTrap8051
469 * Set trap RLPP packet to 8051
471 * enabled - 1: enabled, 0: disabled
475 * RT_ERR_OK - Success
476 * RT_ERR_SMI - SMI access error
480 ret_t
rtl8367c_setAsicRlppTrap8051(rtk_uint32 enabled
)
482 return rtl8367c_setAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLPP_8051_TRAP_OFFSET
, enabled
);
485 * rtl8367c_getAsicRlppTrap8051
487 * Get trap RLPP packet to 8051
489 * pEnabled - 1: enabled, 0: disabled
493 * RT_ERR_OK - Success
494 * RT_ERR_SMI - SMI access error
498 ret_t
rtl8367c_getAsicRlppTrap8051(rtk_uint32
*pEnabled
)
500 return rtl8367c_getAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLPP_8051_TRAP_OFFSET
, pEnabled
);
503 * rtl8367c_setAsicRldpLeaveLoopedPortmask
505 * Clear leaved looped portmask
511 * RT_ERR_OK - Success
512 * RT_ERR_SMI - SMI access error
516 ret_t
rtl8367c_setAsicRldpLeaveLoopedPortmask(rtk_uint32 portmask
)
518 return rtl8367c_setAsicReg(RTL8367C_REG_RLDP_RELEASED_INDICATOR
, portmask
);
521 * rtl8367c_getAsicRldpLeaveLoopedPortmask
523 * Get leaved looped portmask
529 * RT_ERR_OK - Success
530 * RT_ERR_SMI - SMI access error
534 ret_t
rtl8367c_getAsicRldpLeaveLoopedPortmask(rtk_uint32
*pPortmask
)
536 return rtl8367c_getAsicReg(RTL8367C_REG_RLDP_RELEASED_INDICATOR
, pPortmask
);
539 * rtl8367c_setAsicRldpEnterLoopedPortmask
541 * Clear enter loop portmask
547 * RT_ERR_OK - Success
548 * RT_ERR_SMI - SMI access error
552 ret_t
rtl8367c_setAsicRldpEnterLoopedPortmask(rtk_uint32 portmask
)
554 return rtl8367c_setAsicReg(RTL8367C_REG_RLDP_LOOPED_INDICATOR
, portmask
);
557 * rtl8367c_getAsicRldpEnterLoopedPortmask
559 * Get enter loop portmask
565 * RT_ERR_OK - Success
566 * RT_ERR_SMI - SMI access error
570 ret_t
rtl8367c_getAsicRldpEnterLoopedPortmask(rtk_uint32
*pPortmask
)
572 return rtl8367c_getAsicReg(RTL8367C_REG_RLDP_LOOPED_INDICATOR
, pPortmask
);
576 * rtl8367c_setAsicRldpTriggerMode
578 * Set trigger RLDP mode
580 * mode - 1: Periodically, 0: SA moving
584 * RT_ERR_OK - Success
585 * RT_ERR_SMI - SMI access error
589 ret_t
rtl8367c_setAsicRldpTriggerMode(rtk_uint32 enabled
)
591 return rtl8367c_setAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLDP_TRIGGER_MODE_OFFSET
, enabled
);
594 * rtl8367c_getAsicRldpTriggerMode
596 * Get trigger RLDP mode
598 * pMode - - 1: Periodically, 0: SA moving
602 * RT_ERR_OK - Success
603 * RT_ERR_SMI - SMI access error
607 ret_t
rtl8367c_getAsicRldpTriggerMode(rtk_uint32
*pEnabled
)
609 return rtl8367c_getAsicRegBit(RTL8367C_REG_RLDP_CTRL0
, RTL8367C_RLDP_TRIGGER_MODE_OFFSET
, pEnabled
);
613 * rtl8367c_setAsicRldp8051Portmask
615 * Set 8051/CPU configured looped portmask
621 * RT_ERR_OK - Success
622 * RT_ERR_SMI - SMI access error
623 * RT_ERR_PORT_MASK - Invalid portmask
627 ret_t
rtl8367c_setAsicRldp8051Portmask(rtk_uint32 portmask
)
630 if(portmask
> RTL8367C_PORTMASK
)
631 return RT_ERR_PORT_MASK
;
633 retVal
= rtl8367c_setAsicRegBits(RTL8367C_RLDP_CTRL0_REG
,RTL8367C_RLDP_8051_LOOP_PORTMSK_MASK
,portmask
& 0xff);
634 if(retVal
!= RT_ERR_OK
)
637 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_RLDP_CTRL5
,RTL8367C_RLDP_CTRL5_MASK
,(portmask
>> 8) & 7);
638 if(retVal
!= RT_ERR_OK
)
644 * rtl8367c_getAsicRldp8051Portmask
646 * Get 8051/CPU configured looped portmask
652 * RT_ERR_OK - Success
653 * RT_ERR_SMI - SMI access error
657 ret_t
rtl8367c_getAsicRldp8051Portmask(rtk_uint32
*pPortmask
)
662 retVal
= rtl8367c_getAsicRegBits(RTL8367C_RLDP_CTRL0_REG
,RTL8367C_RLDP_8051_LOOP_PORTMSK_MASK
,&tmpPmsk
);
663 if(retVal
!= RT_ERR_OK
)
665 *pPortmask
= tmpPmsk
& 0xff;
667 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_RLDP_CTRL5
,RTL8367C_RLDP_CTRL5_MASK
,&tmpPmsk
);
668 if(retVal
!= RT_ERR_OK
)
670 *pPortmask
|= (tmpPmsk
& 7) <<8;