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 : SVLAN related functions
17 #include <rtl8367c_asicdrv_svlan.h>
21 static void _rtl8367c_svlanConfStUser2Smi( rtl8367c_svlan_memconf_t
*pUserSt
, rtk_uint16
*pSmiSt
)
23 pSmiSt
[0] |= (pUserSt
->vs_member
& 0x00FF);
24 pSmiSt
[0] |= (pUserSt
->vs_untag
& 0x00FF) << 8;
26 pSmiSt
[1] |= (pUserSt
->vs_fid_msti
& 0x000F);
27 pSmiSt
[1] |= (pUserSt
->vs_priority
& 0x0007) << 4;
28 pSmiSt
[1] |= (pUserSt
->vs_force_fid
& 0x0001) << 7;
30 pSmiSt
[2] |= (pUserSt
->vs_svid
& 0x0FFF);
31 pSmiSt
[2] |= (pUserSt
->vs_efiden
& 0x0001) << 12;
32 pSmiSt
[2] |= (pUserSt
->vs_efid
& 0x0007) << 13;
34 pSmiSt
[3] |= ((pUserSt
->vs_member
& 0x0700) >> 8);
35 pSmiSt
[3] |= ((pUserSt
->vs_untag
& 0x0700) >> 8) << 3;
38 static void _rtl8367c_svlanConfStSmi2User( rtl8367c_svlan_memconf_t
*pUserSt
, rtk_uint16
*pSmiSt
)
41 pUserSt
->vs_member
= (pSmiSt
[0] & 0x00FF) | ((pSmiSt
[3] & 0x0007) << 8);
42 pUserSt
->vs_untag
= ((pSmiSt
[0] & 0xFF00) >> 8) | (((pSmiSt
[3] & 0x0038) >> 3) << 8);
44 pUserSt
->vs_fid_msti
= (pSmiSt
[1] & 0x000F);
45 pUserSt
->vs_priority
= (pSmiSt
[1] & 0x0070) >> 4;
46 pUserSt
->vs_force_fid
= (pSmiSt
[1] & 0x0080) >> 7;
48 pUserSt
->vs_svid
= (pSmiSt
[2] & 0x0FFF);
49 pUserSt
->vs_efiden
= (pSmiSt
[2] & 0x1000) >> 12;
50 pUserSt
->vs_efid
= (pSmiSt
[2] & 0xE000) >> 13;
53 static void _rtl8367c_svlanMc2sStUser2Smi(rtl8367c_svlan_mc2s_t
*pUserSt
, rtk_uint16
*pSmiSt
)
55 pSmiSt
[0] |= (pUserSt
->svidx
& 0x003F);
56 pSmiSt
[0] |= (pUserSt
->format
& 0x0001) << 6;
57 pSmiSt
[0] |= (pUserSt
->valid
& 0x0001) << 7;
59 pSmiSt
[1] = (rtk_uint16
)(pUserSt
->smask
& 0x0000FFFF);
60 pSmiSt
[2] = (rtk_uint16
)((pUserSt
->smask
& 0xFFFF0000) >> 16);
62 pSmiSt
[3] = (rtk_uint16
)(pUserSt
->sdata
& 0x0000FFFF);
63 pSmiSt
[4] = (rtk_uint16
)((pUserSt
->sdata
& 0xFFFF0000) >> 16);
66 static void _rtl8367c_svlanMc2sStSmi2User(rtl8367c_svlan_mc2s_t
*pUserSt
, rtk_uint16
*pSmiSt
)
68 pUserSt
->svidx
= (pSmiSt
[0] & 0x003F);
69 pUserSt
->format
= (pSmiSt
[0] & 0x0040) >> 6;
70 pUserSt
->valid
= (pSmiSt
[0] & 0x0080) >> 7;
72 pUserSt
->smask
= pSmiSt
[1] | (pSmiSt
[2] << 16);
73 pUserSt
->sdata
= pSmiSt
[3] | (pSmiSt
[4] << 16);
76 static void _rtl8367c_svlanSp2cStUser2Smi(rtl8367c_svlan_s2c_t
*pUserSt
, rtk_uint16
*pSmiSt
)
78 pSmiSt
[0] |= (pUserSt
->dstport
& 0x0007);
79 pSmiSt
[0] |= (pUserSt
->svidx
& 0x003F) << 3;
80 pSmiSt
[0] |= ((pUserSt
->dstport
& 0x0008) >> 3) << 9;
82 pSmiSt
[1] |= (pUserSt
->vid
& 0x0FFF);
83 pSmiSt
[1] |= (pUserSt
->valid
& 0x0001) << 12;
86 static void _rtl8367c_svlanSp2cStSmi2User(rtl8367c_svlan_s2c_t
*pUserSt
, rtk_uint16
*pSmiSt
)
88 pUserSt
->dstport
= (((pSmiSt
[0] & 0x0200) >> 9) << 3) | (pSmiSt
[0] & 0x0007);
89 pUserSt
->svidx
= (pSmiSt
[0] & 0x01F8) >> 3;
90 pUserSt
->vid
= (pSmiSt
[1] & 0x0FFF);
91 pUserSt
->valid
= (pSmiSt
[1] & 0x1000) >> 12;
95 * rtl8367c_setAsicSvlanUplinkPortMask
97 * Set uplink ports mask
99 * portMask - Uplink port mask setting
103 * RT_ERR_OK - Success
104 * RT_ERR_SMI - SMI access error
108 ret_t
rtl8367c_setAsicSvlanUplinkPortMask(rtk_uint32 portMask
)
110 return rtl8367c_setAsicReg(RTL8367C_REG_SVLAN_UPLINK_PORTMASK
, portMask
);
113 * rtl8367c_getAsicSvlanUplinkPortMask
115 * Get uplink ports mask
117 * pPortmask - Uplink port mask setting
121 * RT_ERR_OK - Success
122 * RT_ERR_SMI - SMI access error
126 ret_t
rtl8367c_getAsicSvlanUplinkPortMask(rtk_uint32
* pPortmask
)
128 return rtl8367c_getAsicReg(RTL8367C_REG_SVLAN_UPLINK_PORTMASK
, pPortmask
);
131 * rtl8367c_setAsicSvlanTpid
133 * Set accepted S-VLAN ether type. The default ether type of S-VLAN is 0x88a8
135 * protocolType - Ether type of S-tag frame parsing in uplink ports
139 * RT_ERR_OK - Success
140 * RT_ERR_SMI - SMI access error
142 * Ether type of S-tag in 802.1ad is 0x88a8 and there are existed ether type 0x9100 and 0x9200
143 * for Q-in-Q SLAN design. User can set mathced ether type as service provider supported protocol
145 ret_t
rtl8367c_setAsicSvlanTpid(rtk_uint32 protocolType
)
147 return rtl8367c_setAsicReg(RTL8367C_REG_VS_TPID
, protocolType
);
150 * rtl8367c_getAsicReg
152 * Get accepted S-VLAN ether type. The default ether type of S-VLAN is 0x88a8
154 * pProtocolType - Ether type of S-tag frame parsing in uplink ports
158 * RT_ERR_OK - Success
159 * RT_ERR_SMI - SMI access error
163 ret_t
rtl8367c_getAsicSvlanTpid(rtk_uint32
* pProtocolType
)
165 return rtl8367c_getAsicReg(RTL8367C_REG_VS_TPID
, pProtocolType
);
168 * rtl8367c_setAsicSvlanPrioritySel
170 * Set SVLAN priority field setting
172 * priSel - S-priority assignment method, 0:internal priority 1:C-tag priority 2:using Svlan member configuration
176 * RT_ERR_OK - Success
177 * RT_ERR_SMI - SMI access error
178 * RT_ERR_INPUT - Invalid input parameter
182 ret_t
rtl8367c_setAsicSvlanPrioritySel(rtk_uint32 priSel
)
184 if(priSel
>= SPRISEL_END
)
185 return RT_ERR_QOS_INT_PRIORITY
;
187 return rtl8367c_setAsicRegBits(RTL8367C_REG_SVLAN_CFG
, RTL8367C_VS_SPRISEL_MASK
, priSel
);
190 * rtl8367c_getAsicSvlanPrioritySel
192 * Get SVLAN priority field setting
194 * pPriSel - S-priority assignment method, 0:internal priority 1:C-tag priority 2:using Svlan member configuration
198 * RT_ERR_OK - Success
199 * RT_ERR_SMI - SMI access error
203 ret_t
rtl8367c_getAsicSvlanPrioritySel(rtk_uint32
* pPriSel
)
205 return rtl8367c_getAsicRegBits(RTL8367C_REG_SVLAN_CFG
, RTL8367C_VS_SPRISEL_MASK
, pPriSel
);
208 * rtl8367c_setAsicSvlanTrapPriority
210 * Set trap to CPU priority assignment
212 * priority - Priority assignment
216 * RT_ERR_OK - Success
217 * RT_ERR_SMI - SMI access error
218 * RT_ERR_QOS_INT_PRIORITY - Invalid priority
222 ret_t
rtl8367c_setAsicSvlanTrapPriority(rtk_uint32 priority
)
224 if(priority
> RTL8367C_PRIMAX
)
225 return RT_ERR_QOS_INT_PRIORITY
;
227 return rtl8367c_setAsicRegBits(RTL8367C_REG_QOS_TRAP_PRIORITY0
, RTL8367C_SVLAN_PRIOIRTY_MASK
, priority
);
230 * rtl8367c_getAsicSvlanTrapPriority
232 * Get trap to CPU priority assignment
234 * pPriority - Priority assignment
238 * RT_ERR_OK - Success
239 * RT_ERR_SMI - SMI access error
243 ret_t
rtl8367c_getAsicSvlanTrapPriority(rtk_uint32
* pPriority
)
245 return rtl8367c_getAsicRegBits(RTL8367C_REG_QOS_TRAP_PRIORITY0
, RTL8367C_SVLAN_PRIOIRTY_MASK
, pPriority
);
248 * rtl8367c_setAsicSvlanDefaultVlan
250 * Set default egress SVLAN
252 * port - Physical port number (0~10)
253 * index - index SVLAN member configuration
257 * RT_ERR_OK - Success
258 * RT_ERR_SMI - SMI access error
259 * RT_ERR_PORT_ID - Invalid port number
260 * RT_ERR_SVLAN_ENTRY_INDEX - Invalid SVLAN index parameter
264 ret_t
rtl8367c_setAsicSvlanDefaultVlan(rtk_uint32 port
, rtk_uint32 index
)
268 if(port
> RTL8367C_PORTIDMAX
)
269 return RT_ERR_PORT_ID
;
271 if(index
> RTL8367C_SVIDXMAX
)
272 return RT_ERR_SVLAN_ENTRY_INDEX
;
276 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_SVLAN_PORTBASED_SVIDX_CTRL0
+ (port
>> 1), RTL8367C_VS_PORT1_SVIDX_MASK
,index
);
278 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_SVLAN_PORTBASED_SVIDX_CTRL0
+ (port
>> 1), RTL8367C_VS_PORT0_SVIDX_MASK
,index
);
282 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_SVLAN_PORTBASED_SVIDX_CTRL4
, RTL8367C_VS_PORT8_SVIDX_MASK
,index
);
286 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_SVLAN_PORTBASED_SVIDX_CTRL4
, RTL8367C_VS_PORT9_SVIDX_MASK
,index
);
290 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_SVLAN_PORTBASED_SVIDX_CTRL5
, RTL8367C_SVLAN_PORTBASED_SVIDX_CTRL5_MASK
,index
);
298 * rtl8367c_getAsicSvlanDefaultVlan
300 * Get default egress SVLAN
302 * port - Physical port number (0~7)
303 * pIndex - index SVLAN member configuration
307 * RT_ERR_OK - Success
308 * RT_ERR_SMI - SMI access error
309 * RT_ERR_PORT_ID - Invalid port number
313 ret_t
rtl8367c_getAsicSvlanDefaultVlan(rtk_uint32 port
, rtk_uint32
* pIndex
)
317 if(port
> RTL8367C_PORTIDMAX
)
318 return RT_ERR_PORT_ID
;
322 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_SVLAN_PORTBASED_SVIDX_CTRL0
+ (port
>> 1), RTL8367C_VS_PORT1_SVIDX_MASK
,pIndex
);
324 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_SVLAN_PORTBASED_SVIDX_CTRL0
+ (port
>> 1), RTL8367C_VS_PORT0_SVIDX_MASK
,pIndex
);
328 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_SVLAN_PORTBASED_SVIDX_CTRL4
, RTL8367C_VS_PORT8_SVIDX_MASK
,pIndex
);
332 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_SVLAN_PORTBASED_SVIDX_CTRL4
, RTL8367C_VS_PORT9_SVIDX_MASK
,pIndex
);
336 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_SVLAN_PORTBASED_SVIDX_CTRL5
, RTL8367C_SVLAN_PORTBASED_SVIDX_CTRL5_MASK
,pIndex
);
345 * rtl8367c_setAsicSvlanIngressUntag
347 * Set action received un-Stag frame from unplink port
349 * mode - 0:Drop 1:Trap 2:Assign SVLAN
353 * RT_ERR_OK - Success
354 * RT_ERR_SMI - SMI access error
358 ret_t
rtl8367c_setAsicSvlanIngressUntag(rtk_uint32 mode
)
360 return rtl8367c_setAsicRegBits(RTL8367C_REG_SVLAN_CFG
, RTL8367C_VS_UNTAG_MASK
, mode
);
363 * rtl8367c_getAsicSvlanIngressUntag
365 * Get action received un-Stag frame from unplink port
367 * pMode - 0:Drop 1:Trap 2:Assign SVLAN
371 * RT_ERR_OK - Success
372 * RT_ERR_SMI - SMI access error
376 ret_t
rtl8367c_getAsicSvlanIngressUntag(rtk_uint32
* pMode
)
378 return rtl8367c_getAsicRegBits(RTL8367C_REG_SVLAN_CFG
, RTL8367C_VS_UNTAG_MASK
, pMode
);
381 * rtl8367c_setAsicSvlanIngressUnmatch
383 * Set action received unmatched Stag frame from unplink port
385 * mode - 0:Drop 1:Trap 2:Assign SVLAN
389 * RT_ERR_OK - Success
390 * RT_ERR_SMI - SMI access error
394 ret_t
rtl8367c_setAsicSvlanIngressUnmatch(rtk_uint32 mode
)
396 return rtl8367c_setAsicRegBits(RTL8367C_REG_SVLAN_CFG
, RTL8367C_VS_UNMAT_MASK
, mode
);
399 * rtl8367c_getAsicSvlanIngressUnmatch
401 * Get action received unmatched Stag frame from unplink port
403 * pMode - 0:Drop 1:Trap 2:Assign SVLAN
407 * RT_ERR_OK - Success
408 * RT_ERR_SMI - SMI access error
412 ret_t
rtl8367c_getAsicSvlanIngressUnmatch(rtk_uint32
* pMode
)
414 return rtl8367c_getAsicRegBits(RTL8367C_REG_SVLAN_CFG
, RTL8367C_VS_UNMAT_MASK
, pMode
);
418 * rtl8367c_setAsicSvlanEgressUnassign
420 * Set unplink stream without egress SVID action
422 * enabled - 1:Trap egress unassigned frames to CPU, 0: Use SVLAN setup in VS_CPSVIDX as egress SVID
426 * RT_ERR_OK - Success
427 * RT_ERR_SMI - SMI access error
431 ret_t
rtl8367c_setAsicSvlanEgressUnassign(rtk_uint32 enabled
)
433 return rtl8367c_setAsicRegBit(RTL8367C_REG_SVLAN_CFG
, RTL8367C_VS_UIFSEG_OFFSET
, enabled
);
436 * rtl8367c_getAsicSvlanEgressUnassign
438 * Get unplink stream without egress SVID action
440 * pEnabled - 1:Trap egress unassigned frames to CPU, 0: Use SVLAN setup in VS_CPSVIDX as egress SVID
444 * RT_ERR_OK - Success
445 * RT_ERR_SMI - SMI access error
449 ret_t
rtl8367c_getAsicSvlanEgressUnassign(rtk_uint32
* pEnabled
)
451 return rtl8367c_getAsicRegBit(RTL8367C_REG_SVLAN_CFG
, RTL8367C_VS_UIFSEG_OFFSET
, pEnabled
);
456 * rtl8367c_setAsicSvlanMemberConfiguration
458 * Set system 64 S-tag content
460 * index - index of 64 s-tag configuration
461 * pSvlanMemCfg - SVLAN member configuration
465 * RT_ERR_OK - Success
466 * RT_ERR_SMI - SMI access error
467 * RT_ERR_SVLAN_ENTRY_INDEX - Invalid SVLAN index parameter
471 ret_t
rtl8367c_setAsicSvlanMemberConfiguration(rtk_uint32 index
, rtl8367c_svlan_memconf_t
* pSvlanMemCfg
)
474 rtk_uint32 regAddr
, regData
;
475 rtk_uint16
*accessPtr
;
477 rtk_uint16 smiSvlanMemConf
[RTL8367C_SVLAN_MEMCONF_LEN
];
479 if(index
> RTL8367C_SVIDXMAX
)
480 return RT_ERR_SVLAN_ENTRY_INDEX
;
482 memset(smiSvlanMemConf
, 0x00, sizeof(rtk_uint16
) * RTL8367C_SVLAN_MEMCONF_LEN
);
483 _rtl8367c_svlanConfStUser2Smi(pSvlanMemCfg
, smiSvlanMemConf
);
485 accessPtr
= smiSvlanMemConf
;
487 regData
= *accessPtr
;
488 for(i
= 0; i
< 3; i
++)
490 retVal
= rtl8367c_setAsicReg(RTL8367C_SVLAN_MEMBERCFG_BASE_REG(index
) + i
, regData
);
491 if(retVal
!= RT_ERR_OK
)
495 regData
= *accessPtr
;
499 regAddr
= RTL8367C_REG_SVLAN_MEMBERCFG0_CTRL4
+index
;
501 regAddr
= RTL8367C_REG_SVLAN_MEMBERCFG63_CTRL4
;
503 retVal
= rtl8367c_setAsicReg(regAddr
, regData
);
504 if(retVal
!= RT_ERR_OK
)
511 * rtl8367c_getAsicSvlanMemberConfiguration
513 * Get system 64 S-tag content
515 * index - index of 64 s-tag configuration
516 * pSvlanMemCfg - SVLAN member configuration
520 * RT_ERR_OK - Success
521 * RT_ERR_SMI - SMI access error
522 * RT_ERR_SVLAN_ENTRY_INDEX - Invalid SVLAN index parameter
526 ret_t
rtl8367c_getAsicSvlanMemberConfiguration(rtk_uint32 index
,rtl8367c_svlan_memconf_t
* pSvlanMemCfg
)
529 rtk_uint32 regAddr
,regData
;
530 rtk_uint16
*accessPtr
;
532 rtk_uint16 smiSvlanMemConf
[RTL8367C_SVLAN_MEMCONF_LEN
];
534 if(index
> RTL8367C_SVIDXMAX
)
535 return RT_ERR_SVLAN_ENTRY_INDEX
;
537 memset(smiSvlanMemConf
, 0x00, sizeof(rtk_uint16
) * RTL8367C_SVLAN_MEMCONF_LEN
);
539 accessPtr
= smiSvlanMemConf
;
541 for(i
= 0; i
< 3; i
++)
543 retVal
= rtl8367c_getAsicReg(RTL8367C_SVLAN_MEMBERCFG_BASE_REG(index
) + i
, ®Data
);
544 if(retVal
!= RT_ERR_OK
)
547 *accessPtr
= regData
;
553 regAddr
= RTL8367C_REG_SVLAN_MEMBERCFG0_CTRL4
+index
;
555 regAddr
= RTL8367C_REG_SVLAN_MEMBERCFG63_CTRL4
;
557 retVal
= rtl8367c_getAsicReg(regAddr
, ®Data
);
558 if(retVal
!= RT_ERR_OK
)
561 *accessPtr
= regData
;
563 _rtl8367c_svlanConfStSmi2User(pSvlanMemCfg
, smiSvlanMemConf
);
568 * rtl8367c_setAsicSvlanC2SConf
570 * Set SVLAN C2S table
572 * index - index of 128 Svlan C2S configuration
573 * evid - Enhanced VID
574 * portmask - available c2s port mask
575 * svidx - index of 64 Svlan member configuration
579 * RT_ERR_OK - Success
580 * RT_ERR_SMI - SMI access error
581 * RT_ERR_ENTRY_INDEX - Invalid entry index
583 * ASIC will check upstream's VID and assign related SVID to mathed packet
585 ret_t
rtl8367c_setAsicSvlanC2SConf(rtk_uint32 index
, rtk_uint32 evid
, rtk_uint32 portmask
, rtk_uint32 svidx
)
589 if(index
> RTL8367C_C2SIDXMAX
)
590 return RT_ERR_ENTRY_INDEX
;
592 retVal
= rtl8367c_setAsicReg(RTL8367C_SVLAN_C2SCFG_BASE_REG(index
), svidx
);
593 if(retVal
!= RT_ERR_OK
)
596 retVal
= rtl8367c_setAsicReg(RTL8367C_SVLAN_C2SCFG_BASE_REG(index
) + 1, portmask
);
597 if(retVal
!= RT_ERR_OK
)
600 retVal
= rtl8367c_setAsicReg(RTL8367C_SVLAN_C2SCFG_BASE_REG(index
) + 2, evid
);
601 if(retVal
!= RT_ERR_OK
)
607 * rtl8367c_getAsicSvlanC2SConf
609 * Get SVLAN C2S table
611 * index - index of 128 Svlan C2S configuration
612 * pEvid - Enhanced VID
613 * pPortmask - available c2s port mask
614 * pSvidx - index of 64 Svlan member configuration
618 * RT_ERR_OK - Success
619 * RT_ERR_SMI - SMI access error
620 * RT_ERR_ENTRY_INDEX - Invalid entry index
624 ret_t
rtl8367c_getAsicSvlanC2SConf(rtk_uint32 index
, rtk_uint32
* pEvid
, rtk_uint32
* pPortmask
, rtk_uint32
* pSvidx
)
628 if(index
> RTL8367C_C2SIDXMAX
)
629 return RT_ERR_ENTRY_INDEX
;
631 retVal
= rtl8367c_getAsicReg(RTL8367C_SVLAN_C2SCFG_BASE_REG(index
), pSvidx
);
632 if(retVal
!= RT_ERR_OK
)
635 retVal
= rtl8367c_getAsicReg(RTL8367C_SVLAN_C2SCFG_BASE_REG(index
) + 1, pPortmask
);
636 if(retVal
!= RT_ERR_OK
)
639 retVal
= rtl8367c_getAsicReg(RTL8367C_SVLAN_C2SCFG_BASE_REG(index
) + 2, pEvid
);
640 if(retVal
!= RT_ERR_OK
)
647 * rtl8367c_setAsicSvlanMC2SConf
649 * Set system MC2S content
651 * index - index of 32 SVLAN 32 MC2S configuration
652 * pSvlanMc2sCfg - SVLAN Multicast to SVLAN member configuration
656 * RT_ERR_OK - Success
657 * RT_ERR_SMI - SMI access error
658 * RT_ERR_ENTRY_INDEX - Invalid entry index
660 * If upstream packet is L2 multicast or IPv4 multicast packet and DMAC/DIP is matched MC2S
661 * configuration, ASIC will assign egress SVID to the packet
663 ret_t
rtl8367c_setAsicSvlanMC2SConf(rtk_uint32 index
,rtl8367c_svlan_mc2s_t
* pSvlanMc2sCfg
)
667 rtk_uint16
*accessPtr
;
669 rtk_uint16 smiSvlanMC2S
[RTL8367C_SVLAN_MC2S_LEN
];
671 if(index
> RTL8367C_MC2SIDXMAX
)
672 return RT_ERR_ENTRY_INDEX
;
674 memset(smiSvlanMC2S
, 0x00, sizeof(rtk_uint16
) * RTL8367C_SVLAN_MC2S_LEN
);
675 _rtl8367c_svlanMc2sStUser2Smi(pSvlanMc2sCfg
, smiSvlanMC2S
);
677 accessPtr
= smiSvlanMC2S
;
679 regData
= *accessPtr
;
680 for(i
= 0; i
< 5; i
++)
682 retVal
= rtl8367c_setAsicReg(RTL8367C_SVLAN_MCAST2S_ENTRY_BASE_REG(index
) + i
, regData
);
683 if(retVal
!= RT_ERR_OK
)
687 regData
= *accessPtr
;
693 * rtl8367c_getAsicSvlanMC2SConf
695 * Get system MC2S content
697 * index - index of 32 SVLAN 32 MC2S configuration
698 * pSvlanMc2sCfg - SVLAN Multicast to SVLAN member configuration
702 * RT_ERR_OK - Success
703 * RT_ERR_SMI - SMI access error
704 * RT_ERR_ENTRY_INDEX - Invalid entry index
708 ret_t
rtl8367c_getAsicSvlanMC2SConf(rtk_uint32 index
, rtl8367c_svlan_mc2s_t
* pSvlanMc2sCfg
)
712 rtk_uint16
*accessPtr
;
714 rtk_uint16 smiSvlanMC2S
[RTL8367C_SVLAN_MC2S_LEN
];
716 if(index
> RTL8367C_MC2SIDXMAX
)
717 return RT_ERR_ENTRY_INDEX
;
719 memset(smiSvlanMC2S
, 0x00, sizeof(rtk_uint16
) * RTL8367C_SVLAN_MC2S_LEN
);
721 accessPtr
= smiSvlanMC2S
;
723 for(i
= 0; i
< 5; i
++)
725 retVal
= rtl8367c_getAsicReg(RTL8367C_SVLAN_MCAST2S_ENTRY_BASE_REG(index
) + i
, ®Data
);
726 if(retVal
!= RT_ERR_OK
)
729 *accessPtr
= regData
;
734 _rtl8367c_svlanMc2sStSmi2User(pSvlanMc2sCfg
, smiSvlanMC2S
);
740 * rtl8367c_setAsicSvlanSP2CConf
742 * Set system 128 SP2C content
744 * index - index of 128 SVLAN & Port to CVLAN configuration
745 * pSvlanSp2cCfg - SVLAN & Port to CVLAN configuration
749 * RT_ERR_OK - Success
750 * RT_ERR_SMI - SMI access error
751 * RT_ERR_ENTRY_INDEX - Invalid entry index
755 ret_t
rtl8367c_setAsicSvlanSP2CConf(rtk_uint32 index
, rtl8367c_svlan_s2c_t
* pSvlanSp2cCfg
)
759 rtk_uint16
*accessPtr
;
761 rtk_uint16 smiSvlanSP2C
[RTL8367C_SVLAN_SP2C_LEN
];
763 if(index
> RTL8367C_SP2CMAX
)
764 return RT_ERR_ENTRY_INDEX
;
766 memset(smiSvlanSP2C
, 0x00, sizeof(rtk_uint16
) * RTL8367C_SVLAN_SP2C_LEN
);
767 _rtl8367c_svlanSp2cStUser2Smi(pSvlanSp2cCfg
,smiSvlanSP2C
);
769 accessPtr
= smiSvlanSP2C
;
771 regData
= *accessPtr
;
772 for(i
= 0; i
< 2; i
++)
774 retVal
= rtl8367c_setAsicReg(RTL8367C_SVLAN_S2C_ENTRY_BASE_REG(index
) + i
, regData
);
775 if(retVal
!= RT_ERR_OK
)
779 regData
= *accessPtr
;
785 * rtl8367c_getAsicSvlanSP2CConf
787 * Get system 128 SP2C content
789 * index - index of 128 SVLAN & Port to CVLAN configuration
790 * pSvlanSp2cCfg - SVLAN & Port to CVLAN configuration
794 * RT_ERR_OK - Success
795 * RT_ERR_SMI - SMI access error
796 * RT_ERR_ENTRY_INDEX - Invalid entry index
800 ret_t
rtl8367c_getAsicSvlanSP2CConf(rtk_uint32 index
,rtl8367c_svlan_s2c_t
* pSvlanSp2cCfg
)
804 rtk_uint16
*accessPtr
;
806 rtk_uint16 smiSvlanSP2C
[RTL8367C_SVLAN_SP2C_LEN
];
808 if(index
> RTL8367C_SP2CMAX
)
809 return RT_ERR_ENTRY_INDEX
;
811 memset(smiSvlanSP2C
, 0x00, sizeof(rtk_uint16
) * RTL8367C_SVLAN_SP2C_LEN
);
813 accessPtr
= smiSvlanSP2C
;
815 for(i
= 0; i
< 2; i
++)
817 retVal
= rtl8367c_getAsicReg(RTL8367C_SVLAN_S2C_ENTRY_BASE_REG(index
) + i
, ®Data
);
818 if(retVal
!= RT_ERR_OK
)
821 *accessPtr
= regData
;
826 _rtl8367c_svlanSp2cStSmi2User(pSvlanSp2cCfg
, smiSvlanSP2C
);
831 * rtl8367c_setAsicSvlanDmacCvidSel
833 * Set downstream CVID decision by DMAC
835 * port - Physical port number (0~7)
836 * enabled - 0:disabled, 1:enabled
840 * RT_ERR_OK - Success
841 * RT_ERR_SMI - SMI access error
842 * RT_ERR_PORT_ID - Invalid port number
846 ret_t
rtl8367c_setAsicSvlanDmacCvidSel(rtk_uint32 port
, rtk_uint32 enabled
)
848 if(port
> RTL8367C_PORTIDMAX
)
849 return RT_ERR_PORT_ID
;
852 return rtl8367c_setAsicRegBit(RTL8367C_REG_SVLAN_CFG
, RTL8367C_VS_PORT0_DMACVIDSEL_OFFSET
+ port
, enabled
);
854 return rtl8367c_setAsicRegBit(RTL8367C_REG_SVLAN_CFG_EXT
, RTL8367C_VS_PORT8_DMACVIDSEL_OFFSET
+ (port
-8), enabled
);
857 * rtl8367c_getAsicSvlanDmacCvidSel
859 * Get downstream CVID decision by DMAC
861 * port - Physical port number (0~7)
862 * pEnabled - 0:disabled, 1:enabled
866 * RT_ERR_OK - Success
867 * RT_ERR_SMI - SMI access error
868 * RT_ERR_PORT_ID - Invalid port number
872 ret_t
rtl8367c_getAsicSvlanDmacCvidSel(rtk_uint32 port
, rtk_uint32
* pEnabled
)
874 if(port
> RTL8367C_PORTIDMAX
)
875 return RT_ERR_PORT_ID
;
878 return rtl8367c_getAsicRegBit(RTL8367C_REG_SVLAN_CFG
, RTL8367C_VS_PORT0_DMACVIDSEL_OFFSET
+ port
, pEnabled
);
880 return rtl8367c_getAsicRegBit(RTL8367C_REG_SVLAN_CFG_EXT
, RTL8367C_VS_PORT8_DMACVIDSEL_OFFSET
+ (port
-8), pEnabled
);
883 * rtl8367c_setAsicSvlanUntagVlan
885 * Set default ingress untag SVLAN
887 * index - index SVLAN member configuration
891 * RT_ERR_OK - Success
892 * RT_ERR_SMI - SMI access error
893 * RT_ERR_SVLAN_ENTRY_INDEX - Invalid SVLAN index parameter
897 ret_t
rtl8367c_setAsicSvlanUntagVlan(rtk_uint32 index
)
899 if(index
> RTL8367C_SVIDXMAX
)
900 return RT_ERR_SVLAN_ENTRY_INDEX
;
902 return rtl8367c_setAsicRegBits(RTL8367C_REG_SVLAN_UNTAG_UNMAT_CFG
, RTL8367C_VS_UNTAG_SVIDX_MASK
, index
);
905 * rtl8367c_getAsicSvlanUntagVlan
907 * Get default ingress untag SVLAN
909 * pIndex - index SVLAN member configuration
913 * RT_ERR_OK - Success
914 * RT_ERR_SMI - SMI access error
918 ret_t
rtl8367c_getAsicSvlanUntagVlan(rtk_uint32
* pIndex
)
920 return rtl8367c_getAsicRegBits(RTL8367C_REG_SVLAN_UNTAG_UNMAT_CFG
, RTL8367C_VS_UNTAG_SVIDX_MASK
, pIndex
);
924 * rtl8367c_setAsicSvlanUnmatchVlan
926 * Set default ingress unmatch SVLAN
928 * index - index SVLAN member configuration
932 * RT_ERR_OK - Success
933 * RT_ERR_SMI - SMI access error
934 * RT_ERR_SVLAN_ENTRY_INDEX - Invalid SVLAN index parameter
938 ret_t
rtl8367c_setAsicSvlanUnmatchVlan(rtk_uint32 index
)
940 if(index
> RTL8367C_SVIDXMAX
)
941 return RT_ERR_SVLAN_ENTRY_INDEX
;
943 return rtl8367c_setAsicRegBits(RTL8367C_REG_SVLAN_UNTAG_UNMAT_CFG
, RTL8367C_VS_UNMAT_SVIDX_MASK
, index
);
946 * rtl8367c_getAsicSvlanUnmatchVlan
948 * Get default ingress unmatch SVLAN
950 * pIndex - index SVLAN member configuration
954 * RT_ERR_OK - Success
955 * RT_ERR_SMI - SMI access error
959 ret_t
rtl8367c_getAsicSvlanUnmatchVlan(rtk_uint32
* pIndex
)
961 return rtl8367c_getAsicRegBits(RTL8367C_REG_SVLAN_UNTAG_UNMAT_CFG
, RTL8367C_VS_UNMAT_SVIDX_MASK
, pIndex
);
966 * rtl8367c_setAsicSvlanLookupType
968 * Set svlan lookup table selection
974 * RT_ERR_OK - Success
975 * RT_ERR_SMI - SMI access error
979 ret_t
rtl8367c_setAsicSvlanLookupType(rtk_uint32 type
)
981 return rtl8367c_setAsicRegBit(RTL8367C_REG_SVLAN_LOOKUP_TYPE
, RTL8367C_SVLAN_LOOKUP_TYPE_OFFSET
, type
);
985 * rtl8367c_getAsicSvlanLookupType
987 * Get svlan lookup table selection
989 * pType - lookup type
993 * RT_ERR_OK - Success
994 * RT_ERR_SMI - SMI access error
998 ret_t
rtl8367c_getAsicSvlanLookupType(rtk_uint32
* pType
)
1000 return rtl8367c_getAsicRegBit(RTL8367C_REG_SVLAN_LOOKUP_TYPE
, RTL8367C_SVLAN_LOOKUP_TYPE_OFFSET
, pType
);