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 (¶g¤T, 08 ¤T¤ë 2017) $
13 * Purpose : Declaration of RLDP and RLPP API
15 * Feature : The file have include the following module and sub-modules
16 * 1) RLDP and RLPP configuration and status
24 #include <rtk_switch.h>
25 #include <rtk_error.h>
26 //#include <rtk_types.h>
29 #include <rtl8367c_asicdrv.h>
30 #include <rtl8367c_asicdrv_rldp.h>
48 * Function Declaration
51 /* Module Name : RLDP */
56 * Set RLDP module configuration
58 * pConfig - configuration structure of RLDP
69 rtk_api_ret_t
rtk_rldp_config_set(rtk_rldp_config_t
*pConfig
)
75 /* Check initialization state */
78 if (pConfig
->rldp_enable
>= RTK_ENABLE_END
)
81 if (pConfig
->trigger_mode
>= RTK_RLDP_TRIGGER_END
)
84 if (pConfig
->compare_type
>= RTK_RLDP_CMPTYPE_END
)
87 if (pConfig
->num_check
>= RTK_RLDP_NUM_MAX
)
90 if (pConfig
->interval_check
>= RTK_RLDP_INTERVAL_MAX
)
93 if (pConfig
->num_loop
>= RTK_RLDP_NUM_MAX
)
96 if (pConfig
->interval_loop
>= RTK_RLDP_INTERVAL_MAX
)
99 if ((retVal
= rtl8367c_getAsicRldpTxPortmask(&pmsk
))!=RT_ERR_OK
)
102 if ((retVal
= rtl8367c_setAsicRldpTxPortmask(0x00))!=RT_ERR_OK
)
105 if ((retVal
= rtl8367c_setAsicRldpTxPortmask(pmsk
))!=RT_ERR_OK
)
108 if ((retVal
= rtl8367c_setAsicRldp(pConfig
->rldp_enable
))!=RT_ERR_OK
)
111 if ((retVal
= rtl8367c_setAsicRldpTriggerMode(pConfig
->trigger_mode
))!=RT_ERR_OK
)
114 memcpy(&magic
, &pConfig
->magic
, sizeof(ether_addr_t
));
115 if ((retVal
= rtl8367c_setAsicRldpMagicNum(magic
))!=RT_ERR_OK
)
118 if ((retVal
= rtl8367c_setAsicRldpCompareRandomNumber(pConfig
->compare_type
))!=RT_ERR_OK
)
121 if ((retVal
= rtl8367c_setAsicRldpCompareRandomNumber(pConfig
->compare_type
))!=RT_ERR_OK
)
124 if ((retVal
= rtl8367c_setAsicRldpCheckingStatePara(pConfig
->num_check
, pConfig
->interval_check
))!=RT_ERR_OK
)
127 if ((retVal
= rtl8367c_setAsicRldpLoopStatePara(pConfig
->num_loop
, pConfig
->interval_loop
))!=RT_ERR_OK
)
135 * rtk_rldp_config_get
137 * Get RLDP module configuration
141 * pConfig - configuration structure of RLDP
146 * RT_ERR_NULL_POINTER
150 rtk_api_ret_t
rtk_rldp_config_get(rtk_rldp_config_t
*pConfig
)
152 rtk_api_ret_t retVal
;
155 /* Check initialization state */
156 RTK_CHK_INIT_STATE();
158 if ((retVal
= rtl8367c_getAsicRldp(&pConfig
->rldp_enable
))!=RT_ERR_OK
)
161 if ((retVal
= rtl8367c_getAsicRldpTriggerMode(&pConfig
->trigger_mode
))!=RT_ERR_OK
)
164 if ((retVal
= rtl8367c_getAsicRldpMagicNum(&magic
))!=RT_ERR_OK
)
166 memcpy(&pConfig
->magic
, &magic
, sizeof(ether_addr_t
));
168 if ((retVal
= rtl8367c_getAsicRldpCompareRandomNumber(&pConfig
->compare_type
))!=RT_ERR_OK
)
171 if ((retVal
= rtl8367c_getAsicRldpCompareRandomNumber(&pConfig
->compare_type
))!=RT_ERR_OK
)
174 if ((retVal
= rtl8367c_getAsicRldpCheckingStatePara(&pConfig
->num_check
, &pConfig
->interval_check
))!=RT_ERR_OK
)
177 if ((retVal
= rtl8367c_getAsicRldpLoopStatePara(&pConfig
->num_loop
, &pConfig
->interval_loop
))!=RT_ERR_OK
)
185 * rtk_rldp_portConfig_set
187 * Set per port RLDP module configuration
189 * port - port number to be configured
190 * pPortConfig - per port configuration structure of RLDP
197 * RT_ERR_NULL_POINTER
201 rtk_api_ret_t
rtk_rldp_portConfig_set(rtk_port_t port
, rtk_rldp_portConfig_t
*pPortConfig
)
203 rtk_api_ret_t retVal
;
207 /* Check initialization state */
208 RTK_CHK_INIT_STATE();
210 /* Check Port Valid */
211 RTK_CHK_PORT_VALID(port
);
213 if (pPortConfig
->tx_enable
>= RTK_ENABLE_END
)
216 phy_port
= rtk_switch_port_L2P_get(port
);
218 if ((retVal
= rtl8367c_getAsicRldpTxPortmask(&pmsk
))!=RT_ERR_OK
)
221 if (pPortConfig
->tx_enable
)
223 pmsk
|=(1<<phy_port
);
227 pmsk
&= ~(1<<phy_port
);
230 if ((retVal
= rtl8367c_setAsicRldpTxPortmask(pmsk
))!=RT_ERR_OK
)
235 } /* end of rtk_rldp_portConfig_set */
239 * rtk_rldp_portConfig_get
241 * Get per port RLDP module configuration
243 * port - port number to be get
245 * pPortConfig - per port configuration structure of RLDP
250 * RT_ERR_NULL_POINTER
254 rtk_api_ret_t
rtk_rldp_portConfig_get(rtk_port_t port
, rtk_rldp_portConfig_t
*pPortConfig
)
256 rtk_api_ret_t retVal
;
258 rtk_portmask_t logicalPmask
;
260 /* Check initialization state */
261 RTK_CHK_INIT_STATE();
263 /* Check Port Valid */
264 RTK_CHK_PORT_VALID(port
);
266 if ((retVal
= rtl8367c_getAsicRldpTxPortmask(&pmsk
))!=RT_ERR_OK
)
269 if ((retVal
= rtk_switch_portmask_P2L_get(pmsk
, &logicalPmask
)) != RT_ERR_OK
)
273 if (logicalPmask
.bits
[0] & (1<<port
))
275 pPortConfig
->tx_enable
= ENABLED
;
279 pPortConfig
->tx_enable
= DISABLED
;
283 } /* end of rtk_rldp_portConfig_get */
287 * rtk_rldp_status_get
289 * Get RLDP module status
293 * pStatus - status structure of RLDP
297 * RT_ERR_NULL_POINTER
301 rtk_api_ret_t
rtk_rldp_status_get(rtk_rldp_status_t
*pStatus
)
303 rtk_api_ret_t retVal
;
306 /* Check initialization state */
307 RTK_CHK_INIT_STATE();
309 if ((retVal
= rtl8367c_getAsicRldpRandomNumber(&seed
))!=RT_ERR_OK
)
311 memcpy(&pStatus
->id
, &seed
, sizeof(ether_addr_t
));
314 } /* end of rtk_rldp_status_get */
318 * rtk_rldp_portStatus_get
320 * Get RLDP module status
322 * port - port number to be get
324 * pPortStatus - per port status structure of RLDP
329 * RT_ERR_NULL_POINTER
333 rtk_api_ret_t
rtk_rldp_portStatus_get(rtk_port_t port
, rtk_rldp_portStatus_t
*pPortStatus
)
335 rtk_api_ret_t retVal
;
337 rtk_portmask_t logicalPmask
;
339 /* Check initialization state */
340 RTK_CHK_INIT_STATE();
342 /* Check Port Valid */
343 RTK_CHK_PORT_VALID(port
);
345 if ((retVal
= rtl8367c_getAsicRldpLoopedPortmask(&pmsk
))!=RT_ERR_OK
)
347 if ((retVal
= rtk_switch_portmask_P2L_get(pmsk
, &logicalPmask
)) != RT_ERR_OK
)
350 if (logicalPmask
.bits
[0] & (1<<port
))
352 pPortStatus
->loop_status
= RTK_RLDP_LOOPSTS_LOOPING
;
356 pPortStatus
->loop_status
= RTK_RLDP_LOOPSTS_NONE
;
359 if ((retVal
= rtl8367c_getAsicRldpEnterLoopedPortmask(&pmsk
))!=RT_ERR_OK
)
361 if ((retVal
= rtk_switch_portmask_P2L_get(pmsk
, &logicalPmask
)) != RT_ERR_OK
)
364 if (logicalPmask
.bits
[0] & (1<<port
))
366 pPortStatus
->loop_enter
= RTK_RLDP_LOOPSTS_LOOPING
;
370 pPortStatus
->loop_enter
= RTK_RLDP_LOOPSTS_NONE
;
373 if ((retVal
= rtl8367c_getAsicRldpLeaveLoopedPortmask(&pmsk
))!=RT_ERR_OK
)
375 if ((retVal
= rtk_switch_portmask_P2L_get(pmsk
, &logicalPmask
)) != RT_ERR_OK
)
378 if (logicalPmask
.bits
[0] & (1<<port
))
380 pPortStatus
->loop_leave
= RTK_RLDP_LOOPSTS_LOOPING
;
384 pPortStatus
->loop_leave
= RTK_RLDP_LOOPSTS_NONE
;
392 * rtk_rldp_portStatus_clear
394 * Clear RLDP module status
396 * port - port number to be clear
397 * pPortStatus - per port status structure of RLDP
404 * RT_ERR_NULL_POINTER
406 * Clear operation effect loop_enter and loop_leave only, other field in
407 * the structure are don't care. Loop status cab't be clean.
409 rtk_api_ret_t
rtk_rldp_portStatus_set(rtk_port_t port
, rtk_rldp_portStatus_t
*pPortStatus
)
411 rtk_api_ret_t retVal
;
414 /* Check initialization state */
415 RTK_CHK_INIT_STATE();
417 /* Check Port Valid */
418 RTK_CHK_PORT_VALID(port
);
420 pmsk
= (pPortStatus
->loop_enter
)<<rtk_switch_port_L2P_get(port
);
421 if ((retVal
= rtl8367c_setAsicRldpEnterLoopedPortmask(pmsk
))!=RT_ERR_OK
)
424 pmsk
= (pPortStatus
->loop_leave
)<<rtk_switch_port_L2P_get(port
);
425 if ((retVal
= rtl8367c_setAsicRldpLeaveLoopedPortmask(pmsk
))!=RT_ERR_OK
)
432 * rtk_rldp_portLoopPair_get
434 * Get RLDP port loop pairs
436 * port - port number to be get
438 * pPortmask - per port related loop ports
443 * RT_ERR_NULL_POINTER
447 rtk_api_ret_t
rtk_rldp_portLoopPair_get(rtk_port_t port
, rtk_portmask_t
*pPortmask
)
449 rtk_api_ret_t retVal
;
452 /* Check initialization state */
453 RTK_CHK_INIT_STATE();
455 /* Check Port Valid */
456 RTK_CHK_PORT_VALID(port
);
458 if ((retVal
= rtl8367c_getAsicRldpLoopedPortPair(rtk_switch_port_L2P_get(port
), &pmsk
))!=RT_ERR_OK
)
461 if ((retVal
= rtk_switch_portmask_P2L_get(pmsk
, pPortmask
)) != RT_ERR_OK
)