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 : VLAN related functions
17 #include <rtl8367c_asicdrv_vlan.h>
21 #if defined(CONFIG_RTL8367C_ASICDRV_TEST)
22 rtl8367c_user_vlan4kentry Rtl8370sVirtualVlanTable
[RTL8367C_VIDMAX
+ 1];
25 static void _rtl8367c_VlanMCStUser2Smi(rtl8367c_vlanconfiguser
*pVlanCg
, rtk_uint16
*pSmiVlanCfg
)
27 pSmiVlanCfg
[0] |= pVlanCg
->mbr
& 0x07FF;
29 pSmiVlanCfg
[1] |= pVlanCg
->fid_msti
& 0x000F;
31 pSmiVlanCfg
[2] |= pVlanCg
->vbpen
& 0x0001;
32 pSmiVlanCfg
[2] |= (pVlanCg
->vbpri
& 0x0007) << 1;
33 pSmiVlanCfg
[2] |= (pVlanCg
->envlanpol
& 0x0001) << 4;
34 pSmiVlanCfg
[2] |= (pVlanCg
->meteridx
& 0x003F) << 5;
36 pSmiVlanCfg
[3] |= pVlanCg
->evid
& 0x1FFF;
39 static void _rtl8367c_VlanMCStSmi2User(rtk_uint16
*pSmiVlanCfg
, rtl8367c_vlanconfiguser
*pVlanCg
)
41 pVlanCg
->mbr
= pSmiVlanCfg
[0] & 0x07FF;
42 pVlanCg
->fid_msti
= pSmiVlanCfg
[1] & 0x000F;
43 pVlanCg
->meteridx
= (pSmiVlanCfg
[2] >> 5) & 0x003F;
44 pVlanCg
->envlanpol
= (pSmiVlanCfg
[2] >> 4) & 0x0001;
45 pVlanCg
->vbpri
= (pSmiVlanCfg
[2] >> 1) & 0x0007;
46 pVlanCg
->vbpen
= pSmiVlanCfg
[2] & 0x0001;
47 pVlanCg
->evid
= pSmiVlanCfg
[3] & 0x1FFF;
50 static void _rtl8367c_Vlan4kStUser2Smi(rtl8367c_user_vlan4kentry
*pUserVlan4kEntry
, rtk_uint16
*pSmiVlan4kEntry
)
52 pSmiVlan4kEntry
[0] |= (pUserVlan4kEntry
->mbr
& 0x00FF);
53 pSmiVlan4kEntry
[0] |= (pUserVlan4kEntry
->untag
& 0x00FF) << 8;
55 pSmiVlan4kEntry
[1] |= (pUserVlan4kEntry
->fid_msti
& 0x000F);
56 pSmiVlan4kEntry
[1] |= (pUserVlan4kEntry
->vbpen
& 0x0001) << 4;
57 pSmiVlan4kEntry
[1] |= (pUserVlan4kEntry
->vbpri
& 0x0007) << 5;
58 pSmiVlan4kEntry
[1] |= (pUserVlan4kEntry
->envlanpol
& 0x0001) << 8;
59 pSmiVlan4kEntry
[1] |= (pUserVlan4kEntry
->meteridx
& 0x001F) << 9;
60 pSmiVlan4kEntry
[1] |= (pUserVlan4kEntry
->ivl_svl
& 0x0001) << 14;
62 pSmiVlan4kEntry
[2] |= ((pUserVlan4kEntry
->mbr
& 0x0700) >> 8);
63 pSmiVlan4kEntry
[2] |= ((pUserVlan4kEntry
->untag
& 0x0700) >> 8) << 3;
64 pSmiVlan4kEntry
[2] |= ((pUserVlan4kEntry
->meteridx
& 0x0020) >> 5) << 6;
68 static void _rtl8367c_Vlan4kStSmi2User(rtk_uint16
*pSmiVlan4kEntry
, rtl8367c_user_vlan4kentry
*pUserVlan4kEntry
)
70 pUserVlan4kEntry
->mbr
= (pSmiVlan4kEntry
[0] & 0x00FF) | ((pSmiVlan4kEntry
[2] & 0x0007) << 8);
71 pUserVlan4kEntry
->untag
= ((pSmiVlan4kEntry
[0] & 0xFF00) >> 8) | (((pSmiVlan4kEntry
[2] & 0x0038) >> 3) << 8);
72 pUserVlan4kEntry
->fid_msti
= pSmiVlan4kEntry
[1] & 0x000F;
73 pUserVlan4kEntry
->vbpen
= (pSmiVlan4kEntry
[1] & 0x0010) >> 4;
74 pUserVlan4kEntry
->vbpri
= (pSmiVlan4kEntry
[1] & 0x00E0) >> 5;
75 pUserVlan4kEntry
->envlanpol
= (pSmiVlan4kEntry
[1] & 0x0100) >> 8;
76 pUserVlan4kEntry
->meteridx
= ((pSmiVlan4kEntry
[1] & 0x3E00) >> 9) | (((pSmiVlan4kEntry
[2] & 0x0040) >> 6) << 5);
77 pUserVlan4kEntry
->ivl_svl
= (pSmiVlan4kEntry
[1] & 0x4000) >> 14;
81 * rtl8367c_setAsicVlanMemberConfig
83 * Set 32 VLAN member configurations
85 * index - VLAN member configuration index (0~31)
86 * pVlanCg - VLAN member configuration
91 * RT_ERR_SMI - SMI access error
92 * RT_ERR_INPUT - Invalid input parameter
93 * RT_ERR_L2_FID - Invalid FID
94 * RT_ERR_PORT_MASK - Invalid portmask
95 * RT_ERR_FILTER_METER_ID - Invalid meter
96 * RT_ERR_QOS_INT_PRIORITY - Invalid priority
97 * RT_ERR_VLAN_ENTRY_NOT_FOUND - Invalid VLAN member configuration index
101 ret_t
rtl8367c_setAsicVlanMemberConfig(rtk_uint32 index
, rtl8367c_vlanconfiguser
*pVlanCg
)
106 rtk_uint16
*tableAddr
;
108 rtk_uint16 smi_vlancfg
[RTL8367C_VLAN_MBRCFG_LEN
];
111 if(index
> RTL8367C_CVIDXMAX
)
112 return RT_ERR_VLAN_ENTRY_NOT_FOUND
;
114 if(pVlanCg
->evid
> RTL8367C_EVIDMAX
)
118 if(pVlanCg
->mbr
> RTL8367C_PORTMASK
)
119 return RT_ERR_PORT_MASK
;
121 if(pVlanCg
->fid_msti
> RTL8367C_FIDMAX
)
122 return RT_ERR_L2_FID
;
124 if(pVlanCg
->meteridx
> RTL8367C_METERMAX
)
125 return RT_ERR_FILTER_METER_ID
;
127 if(pVlanCg
->vbpri
> RTL8367C_PRIMAX
)
128 return RT_ERR_QOS_INT_PRIORITY
;
130 memset(smi_vlancfg
, 0x00, sizeof(rtk_uint16
) * RTL8367C_VLAN_MBRCFG_LEN
);
131 _rtl8367c_VlanMCStUser2Smi(pVlanCg
, smi_vlancfg
);
132 tableAddr
= smi_vlancfg
;
134 for(page_idx
= 0; page_idx
< 4; page_idx
++) /* 4 pages per VLAN Member Config */
136 regAddr
= RTL8367C_VLAN_MEMBER_CONFIGURATION_BASE
+ (index
* 4) + page_idx
;
137 regData
= *tableAddr
;
139 retVal
= rtl8367c_setAsicReg(regAddr
, regData
);
140 if(retVal
!= RT_ERR_OK
)
149 * rtl8367c_getAsicVlanMemberConfig
151 * Get 32 VLAN member configurations
153 * index - VLAN member configuration index (0~31)
154 * pVlanCg - VLAN member configuration
158 * RT_ERR_OK - Success
159 * RT_ERR_SMI - SMI access error
160 * RT_ERR_INPUT - Invalid input parameter
161 * RT_ERR_VLAN_ENTRY_NOT_FOUND - Invalid VLAN member configuration index
165 ret_t
rtl8367c_getAsicVlanMemberConfig(rtk_uint32 index
, rtl8367c_vlanconfiguser
*pVlanCg
)
171 rtk_uint16
*tableAddr
;
172 rtk_uint16 smi_vlancfg
[RTL8367C_VLAN_MBRCFG_LEN
];
174 if(index
> RTL8367C_CVIDXMAX
)
175 return RT_ERR_VLAN_ENTRY_NOT_FOUND
;
177 memset(smi_vlancfg
, 0x00, sizeof(rtk_uint16
) * RTL8367C_VLAN_MBRCFG_LEN
);
178 tableAddr
= smi_vlancfg
;
180 for(page_idx
= 0; page_idx
< 4; page_idx
++) /* 4 pages per VLAN Member Config */
182 regAddr
= RTL8367C_VLAN_MEMBER_CONFIGURATION_BASE
+ (index
* 4) + page_idx
;
184 retVal
= rtl8367c_getAsicReg(regAddr
, ®Data
);
185 if(retVal
!= RT_ERR_OK
)
188 *tableAddr
= (rtk_uint16
)regData
;
192 _rtl8367c_VlanMCStSmi2User(smi_vlancfg
, pVlanCg
);
196 * rtl8367c_setAsicVlan4kEntry
198 * Set VID mapped entry to 4K VLAN table
200 * pVlan4kEntry - 4K VLAN configuration
204 * RT_ERR_OK - Success
205 * RT_ERR_SMI - SMI access error
206 * RT_ERR_INPUT - Invalid input parameter
207 * RT_ERR_L2_FID - Invalid FID
208 * RT_ERR_VLAN_VID - Invalid VID parameter (0~4095)
209 * RT_ERR_PORT_MASK - Invalid portmask
210 * RT_ERR_FILTER_METER_ID - Invalid meter
211 * RT_ERR_QOS_INT_PRIORITY - Invalid priority
215 ret_t
rtl8367c_setAsicVlan4kEntry(rtl8367c_user_vlan4kentry
*pVlan4kEntry
)
217 rtk_uint16 vlan_4k_entry
[RTL8367C_VLAN_4KTABLE_LEN
];
219 rtk_uint16
*tableAddr
;
223 if(pVlan4kEntry
->vid
> RTL8367C_VIDMAX
)
224 return RT_ERR_VLAN_VID
;
226 if(pVlan4kEntry
->mbr
> RTL8367C_PORTMASK
)
227 return RT_ERR_PORT_MASK
;
229 if(pVlan4kEntry
->untag
> RTL8367C_PORTMASK
)
230 return RT_ERR_PORT_MASK
;
232 if(pVlan4kEntry
->fid_msti
> RTL8367C_FIDMAX
)
233 return RT_ERR_L2_FID
;
235 if(pVlan4kEntry
->meteridx
> RTL8367C_METERMAX
)
236 return RT_ERR_FILTER_METER_ID
;
238 if(pVlan4kEntry
->vbpri
> RTL8367C_PRIMAX
)
239 return RT_ERR_QOS_INT_PRIORITY
;
241 memset(vlan_4k_entry
, 0x00, sizeof(rtk_uint16
) * RTL8367C_VLAN_4KTABLE_LEN
);
242 _rtl8367c_Vlan4kStUser2Smi(pVlan4kEntry
, vlan_4k_entry
);
245 tableAddr
= vlan_4k_entry
;
246 for(page_idx
= 0; page_idx
< RTL8367C_VLAN_4KTABLE_LEN
; page_idx
++)
248 regData
= *tableAddr
;
249 retVal
= rtl8367c_setAsicReg(RTL8367C_TABLE_ACCESS_WRDATA_BASE
+ page_idx
, regData
);
250 if(retVal
!= RT_ERR_OK
)
256 /* Write Address (VLAN_ID) */
257 regData
= pVlan4kEntry
->vid
;
258 retVal
= rtl8367c_setAsicReg(RTL8367C_TABLE_ACCESS_ADDR_REG
, regData
);
259 if(retVal
!= RT_ERR_OK
)
263 retVal
= rtl8367c_setAsicRegBits(RTL8367C_TABLE_ACCESS_CTRL_REG
, RTL8367C_TABLE_TYPE_MASK
| RTL8367C_COMMAND_TYPE_MASK
,RTL8367C_TABLE_ACCESS_REG_DATA(TB_OP_WRITE
,TB_TARGET_CVLAN
));
264 if(retVal
!= RT_ERR_OK
)
267 #if defined(CONFIG_RTL8367C_ASICDRV_TEST)
268 memcpy(&Rtl8370sVirtualVlanTable
[pVlan4kEntry
->vid
], pVlan4kEntry
, sizeof(rtl8367c_user_vlan4kentry
));
274 * rtl8367c_getAsicVlan4kEntry
276 * Get VID mapped entry to 4K VLAN table
278 * pVlan4kEntry - 4K VLAN configuration
282 * RT_ERR_OK - Success
283 * RT_ERR_SMI - SMI access error
284 * RT_ERR_VLAN_VID - Invalid VID parameter (0~4095)
285 * RT_ERR_BUSYWAIT_TIMEOUT - LUT is busy at retrieving
289 ret_t
rtl8367c_getAsicVlan4kEntry(rtl8367c_user_vlan4kentry
*pVlan4kEntry
)
291 rtk_uint16 vlan_4k_entry
[RTL8367C_VLAN_4KTABLE_LEN
];
293 rtk_uint16
*tableAddr
;
296 rtk_uint32 busyCounter
;
298 if(pVlan4kEntry
->vid
> RTL8367C_VIDMAX
)
299 return RT_ERR_VLAN_VID
;
302 busyCounter
= RTL8367C_VLAN_BUSY_CHECK_NO
;
305 retVal
= rtl8367c_getAsicRegBit(RTL8367C_TABLE_ACCESS_STATUS_REG
, RTL8367C_TABLE_LUT_ADDR_BUSY_FLAG_OFFSET
,®Data
);
306 if(retVal
!= RT_ERR_OK
)
314 return RT_ERR_BUSYWAIT_TIMEOUT
;
317 /* Write Address (VLAN_ID) */
318 regData
= pVlan4kEntry
->vid
;
319 retVal
= rtl8367c_setAsicReg(RTL8367C_TABLE_ACCESS_ADDR_REG
, regData
);
320 if(retVal
!= RT_ERR_OK
)
324 retVal
= rtl8367c_setAsicRegBits(RTL8367C_TABLE_ACCESS_CTRL_REG
, RTL8367C_TABLE_TYPE_MASK
| RTL8367C_COMMAND_TYPE_MASK
, RTL8367C_TABLE_ACCESS_REG_DATA(TB_OP_READ
,TB_TARGET_CVLAN
));
325 if(retVal
!= RT_ERR_OK
)
329 busyCounter
= RTL8367C_VLAN_BUSY_CHECK_NO
;
332 retVal
= rtl8367c_getAsicRegBit(RTL8367C_TABLE_ACCESS_STATUS_REG
, RTL8367C_TABLE_LUT_ADDR_BUSY_FLAG_OFFSET
,®Data
);
333 if(retVal
!= RT_ERR_OK
)
341 return RT_ERR_BUSYWAIT_TIMEOUT
;
344 /* Read VLAN data from register */
345 tableAddr
= vlan_4k_entry
;
346 for(page_idx
= 0; page_idx
< RTL8367C_VLAN_4KTABLE_LEN
; page_idx
++)
348 retVal
= rtl8367c_getAsicReg(RTL8367C_TABLE_ACCESS_RDDATA_BASE
+ page_idx
, ®Data
);
349 if(retVal
!= RT_ERR_OK
)
352 *tableAddr
= regData
;
356 _rtl8367c_Vlan4kStSmi2User(vlan_4k_entry
, pVlan4kEntry
);
358 #if defined(CONFIG_RTL8367C_ASICDRV_TEST)
359 memcpy(pVlan4kEntry
, &Rtl8370sVirtualVlanTable
[pVlan4kEntry
->vid
], sizeof(rtl8367c_user_vlan4kentry
));
365 * rtl8367c_setAsicVlanAccpetFrameType
367 * Set per-port acceptable frame type
369 * port - Physical port number (0~10)
370 * frameType - The acceptable frame type
374 * RT_ERR_OK - Success
375 * RT_ERR_SMI - SMI access error
376 * RT_ERR_PORT_ID - Invalid port number
377 * RT_ERR_VLAN_ACCEPT_FRAME_TYPE - Invalid frame type
381 ret_t
rtl8367c_setAsicVlanAccpetFrameType(rtk_uint32 port
, rtl8367c_accframetype frameType
)
383 if(port
> RTL8367C_PORTIDMAX
)
384 return RT_ERR_PORT_ID
;
386 if(frameType
>= FRAME_TYPE_MAX_BOUND
)
387 return RT_ERR_VLAN_ACCEPT_FRAME_TYPE
;
389 return rtl8367c_setAsicRegBits(RTL8367C_VLAN_ACCEPT_FRAME_TYPE_REG(port
), RTL8367C_VLAN_ACCEPT_FRAME_TYPE_MASK(port
), frameType
);
392 * rtl8367c_getAsicVlanAccpetFrameType
394 * Get per-port acceptable frame type
396 * port - Physical port number (0~10)
397 * pFrameType - The acceptable frame type
401 * RT_ERR_OK - Success
402 * RT_ERR_SMI - SMI access error
403 * RT_ERR_PORT_ID - Invalid port number
404 * RT_ERR_VLAN_ACCEPT_FRAME_TYPE - Invalid frame type
408 ret_t
rtl8367c_getAsicVlanAccpetFrameType(rtk_uint32 port
, rtl8367c_accframetype
*pFrameType
)
413 if(port
> RTL8367C_PORTIDMAX
)
414 return RT_ERR_PORT_ID
;
416 if((retVal
= rtl8367c_getAsicRegBits(RTL8367C_VLAN_ACCEPT_FRAME_TYPE_REG(port
), RTL8367C_VLAN_ACCEPT_FRAME_TYPE_MASK(port
), ®Data
)) != RT_ERR_OK
)
419 *pFrameType
= (rtl8367c_accframetype
)regData
;
423 * rtl8367c_setAsicVlanIngressFilter
425 * Set VLAN Ingress Filter
427 * port - Physical port number (0~10)
428 * enabled - Enable or disable Ingress filter
432 * RT_ERR_OK - Success
433 * RT_ERR_SMI - SMI access error
434 * RT_ERR_PORT_ID - Invalid port number
438 ret_t
rtl8367c_setAsicVlanIngressFilter(rtk_uint32 port
, rtk_uint32 enabled
)
440 if(port
> RTL8367C_PORTIDMAX
)
441 return RT_ERR_PORT_ID
;
443 return rtl8367c_setAsicRegBit(RTL8367C_VLAN_INGRESS_REG
, port
, enabled
);
446 * rtl8367c_getAsicVlanIngressFilter
448 * Get VLAN Ingress Filter
450 * port - Physical port number (0~10)
451 * pEnable - Enable or disable Ingress filter
455 * RT_ERR_OK - Success
456 * RT_ERR_SMI - SMI access error
457 * RT_ERR_PORT_ID - Invalid port number
461 ret_t
rtl8367c_getAsicVlanIngressFilter(rtk_uint32 port
, rtk_uint32
*pEnable
)
463 if(port
> RTL8367C_PORTIDMAX
)
464 return RT_ERR_PORT_ID
;
466 return rtl8367c_getAsicRegBit(RTL8367C_VLAN_INGRESS_REG
, port
, pEnable
);
469 * rtl8367c_setAsicVlanEgressTagMode
471 * Set CVLAN egress tag mode
473 * port - Physical port number (0~10)
474 * tagMode - The egress tag mode. Including Original mode, Keep tag mode and Priority tag mode
478 * RT_ERR_OK - Success
479 * RT_ERR_SMI - SMI access error
480 * RT_ERR_INPUT - Invalid input parameter
481 * RT_ERR_PORT_ID - Invalid port number
485 ret_t
rtl8367c_setAsicVlanEgressTagMode(rtk_uint32 port
, rtl8367c_egtagmode tagMode
)
487 if(port
> RTL8367C_PORTIDMAX
)
488 return RT_ERR_PORT_ID
;
490 if(tagMode
>= EG_TAG_MODE_END
)
493 return rtl8367c_setAsicRegBits(RTL8367C_PORT_MISC_CFG_REG(port
), RTL8367C_VLAN_EGRESS_MDOE_MASK
, tagMode
);
496 * rtl8367c_getAsicVlanEgressTagMode
498 * Get CVLAN egress tag mode
500 * port - Physical port number (0~10)
501 * pTagMode - The egress tag mode. Including Original mode, Keep tag mode and Priority tag mode
505 * RT_ERR_OK - Success
506 * RT_ERR_SMI - SMI access error
507 * RT_ERR_PORT_ID - Invalid port number
511 ret_t
rtl8367c_getAsicVlanEgressTagMode(rtk_uint32 port
, rtl8367c_egtagmode
*pTagMode
)
516 if(port
> RTL8367C_PORTIDMAX
)
517 return RT_ERR_PORT_ID
;
519 if((retVal
= rtl8367c_getAsicRegBits(RTL8367C_PORT_MISC_CFG_REG(port
), RTL8367C_VLAN_EGRESS_MDOE_MASK
, ®Data
)) != RT_ERR_OK
)
522 *pTagMode
= (rtl8367c_egtagmode
)regData
;
526 * rtl8367c_setAsicVlanPortBasedVID
528 * Set port based VID which is indexed to 32 VLAN member configurations
530 * port - Physical port number (0~10)
531 * index - Index to VLAN member configuration
532 * pri - 1Q Port based VLAN priority
536 * RT_ERR_OK - Success
537 * RT_ERR_SMI - SMI access error
538 * RT_ERR_PORT_ID - Invalid port number
539 * RT_ERR_QOS_INT_PRIORITY - Invalid priority
540 * RT_ERR_VLAN_ENTRY_NOT_FOUND - Invalid VLAN member configuration index
544 ret_t
rtl8367c_setAsicVlanPortBasedVID(rtk_uint32 port
, rtk_uint32 index
, rtk_uint32 pri
)
546 rtk_uint32 regAddr
, bit_mask
;
549 if(port
> RTL8367C_PORTIDMAX
)
550 return RT_ERR_PORT_ID
;
552 if(index
> RTL8367C_CVIDXMAX
)
553 return RT_ERR_VLAN_ENTRY_NOT_FOUND
;
555 if(pri
> RTL8367C_PRIMAX
)
556 return RT_ERR_QOS_INT_PRIORITY
;
558 regAddr
= RTL8367C_VLAN_PVID_CTRL_REG(port
);
559 bit_mask
= RTL8367C_PORT_VIDX_MASK(port
);
560 retVal
= rtl8367c_setAsicRegBits(regAddr
, bit_mask
, index
);
561 if(retVal
!= RT_ERR_OK
)
564 regAddr
= RTL8367C_VLAN_PORTBASED_PRIORITY_REG(port
);
565 bit_mask
= RTL8367C_VLAN_PORTBASED_PRIORITY_MASK(port
);
566 retVal
= rtl8367c_setAsicRegBits(regAddr
, bit_mask
, pri
);
567 if(retVal
!= RT_ERR_OK
)
573 * rtl8367c_getAsicVlanPortBasedVID
575 * Get port based VID which is indexed to 32 VLAN member configurations
577 * port - Physical port number (0~10)
578 * pIndex - Index to VLAN member configuration
579 * pPri - 1Q Port based VLAN priority
583 * RT_ERR_OK - Success
584 * RT_ERR_SMI - SMI access error
585 * RT_ERR_PORT_ID - Invalid port number
589 ret_t
rtl8367c_getAsicVlanPortBasedVID(rtk_uint32 port
, rtk_uint32
*pIndex
, rtk_uint32
*pPri
)
591 rtk_uint32 regAddr
,bit_mask
;
594 if(port
> RTL8367C_PORTIDMAX
)
595 return RT_ERR_PORT_ID
;
597 regAddr
= RTL8367C_VLAN_PVID_CTRL_REG(port
);
598 bit_mask
= RTL8367C_PORT_VIDX_MASK(port
);
599 retVal
= rtl8367c_getAsicRegBits(regAddr
, bit_mask
, pIndex
);
600 if(retVal
!= RT_ERR_OK
)
603 regAddr
= RTL8367C_VLAN_PORTBASED_PRIORITY_REG(port
);
604 bit_mask
= RTL8367C_VLAN_PORTBASED_PRIORITY_MASK(port
);
605 retVal
= rtl8367c_getAsicRegBits(regAddr
, bit_mask
, pPri
);
606 if(retVal
!= RT_ERR_OK
)
612 * rtl8367c_setAsicVlanProtocolBasedGroupData
614 * Set protocol and port based group database
616 * index - Index to VLAN member configuration
617 * pPbCfg - Protocol and port based group database entry
621 * RT_ERR_OK - Success
622 * RT_ERR_SMI - SMI access error
623 * RT_ERR_INPUT - Invalid input parameter
624 * RT_ERR_VLAN_PROTO_AND_PORT - Invalid protocol base group database index
628 ret_t
rtl8367c_setAsicVlanProtocolBasedGroupData(rtk_uint32 index
, rtl8367c_protocolgdatacfg
*pPbCfg
)
630 rtk_uint32 frameType
;
631 rtk_uint32 etherType
;
635 if(index
> RTL8367C_PROTOVLAN_GIDX_MAX
)
636 return RT_ERR_VLAN_PROTO_AND_PORT
;
638 if(pPbCfg
->frameType
>= PPVLAN_FRAME_TYPE_END
)
641 frameType
= pPbCfg
->frameType
;
642 etherType
= pPbCfg
->etherType
;
645 retVal
= rtl8367c_setAsicRegBits(RTL8367C_VLAN_PPB_FRAMETYPE_REG(index
), RTL8367C_VLAN_PPB_FRAMETYPE_MASK
, frameType
);
646 if(retVal
!= RT_ERR_OK
)
650 retVal
= rtl8367c_setAsicReg(RTL8367C_VLAN_PPB_ETHERTYPR_REG(index
), etherType
);
651 if(retVal
!= RT_ERR_OK
)
657 * rtl8367c_getAsicVlanProtocolBasedGroupData
659 * Get protocol and port based group database
661 * index - Index to VLAN member configuration
662 * pPbCfg - Protocol and port based group database entry
666 * RT_ERR_OK - Success
667 * RT_ERR_SMI - SMI access error
668 * RT_ERR_INPUT - Invalid input parameter
669 * RT_ERR_VLAN_PROTO_AND_PORT - Invalid protocol base group database index
673 ret_t
rtl8367c_getAsicVlanProtocolBasedGroupData(rtk_uint32 index
, rtl8367c_protocolgdatacfg
*pPbCfg
)
675 rtk_uint32 frameType
;
676 rtk_uint32 etherType
;
680 if(index
> RTL8367C_PROTOVLAN_GIDX_MAX
)
681 return RT_ERR_VLAN_PROTO_AND_PORT
;
683 /* Read Frame type */
684 retVal
= rtl8367c_getAsicRegBits(RTL8367C_VLAN_PPB_FRAMETYPE_REG(index
), RTL8367C_VLAN_PPB_FRAMETYPE_MASK
, &frameType
);
685 if(retVal
!= RT_ERR_OK
)
688 /* Read Ether type */
689 retVal
= rtl8367c_getAsicReg(RTL8367C_VLAN_PPB_ETHERTYPR_REG(index
), ðerType
);
690 if(retVal
!= RT_ERR_OK
)
694 pPbCfg
->frameType
= frameType
;
695 pPbCfg
->etherType
= etherType
;
699 * rtl8367c_setAsicVlanPortAndProtocolBased
701 * Set protocol and port based VLAN configuration
703 * port - Physical port number (0~10)
704 * index - Index of protocol and port based database index
705 * pPpbCfg - Protocol and port based VLAN configuration
709 * RT_ERR_OK - Success
710 * RT_ERR_SMI - SMI access error
711 * RT_ERR_INPUT - Invalid input parameter
712 * RT_ERR_PORT_ID - Invalid port number
713 * RT_ERR_QOS_INT_PRIORITY - Invalid priority
714 * RT_ERR_VLAN_PROTO_AND_PORT - Invalid protocol base group database index
715 * RT_ERR_VLAN_ENTRY_NOT_FOUND - Invalid VLAN member configuration index
719 ret_t
rtl8367c_setAsicVlanPortAndProtocolBased(rtk_uint32 port
, rtk_uint32 index
, rtl8367c_protocolvlancfg
*pPpbCfg
)
721 rtk_uint32 reg_addr
, bit_mask
, bit_value
;
725 if(port
> RTL8367C_PORTIDMAX
)
726 return RT_ERR_PORT_ID
;
728 if(index
> RTL8367C_PROTOVLAN_GIDX_MAX
)
729 return RT_ERR_VLAN_PROTO_AND_PORT
;
731 if( (pPpbCfg
->valid
!= FALSE
) && (pPpbCfg
->valid
!= TRUE
) )
734 if(pPpbCfg
->vlan_idx
> RTL8367C_CVIDXMAX
)
735 return RT_ERR_VLAN_ENTRY_NOT_FOUND
;
737 if(pPpbCfg
->priority
> RTL8367C_PRIMAX
)
738 return RT_ERR_QOS_INT_PRIORITY
;
741 reg_addr
= RTL8367C_VLAN_PPB_VALID_REG(index
);
742 bit_mask
= 0x0001 << port
;
743 bit_value
= ((TRUE
== pPpbCfg
->valid
) ? 0x1 : 0x0);
744 retVal
= rtl8367c_setAsicRegBits(reg_addr
, bit_mask
, bit_value
);
745 if(retVal
!= RT_ERR_OK
)
748 /* Calculate the actual register address for CVLAN index*/
751 reg_addr
= RTL8367C_VLAN_PPB_CTRL_REG(index
, port
);
752 bit_mask
= RTL8367C_VLAN_PPB_CTRL_MASK(port
);
756 reg_addr
= RTL8367C_REG_VLAN_PPB0_CTRL4
;
757 bit_mask
= RTL8367C_VLAN_PPB0_CTRL4_PORT8_INDEX_MASK
;
761 reg_addr
= RTL8367C_REG_VLAN_PPB0_CTRL4
;
762 bit_mask
= RTL8367C_VLAN_PPB0_CTRL4_PORT9_INDEX_MASK
;
766 reg_addr
= RTL8367C_REG_VLAN_PPB0_CTRL4
;
767 bit_mask
= RTL8367C_VLAN_PPB0_CTRL4_PORT10_INDEX_MASK
;
770 bit_value
= pPpbCfg
->vlan_idx
;
771 retVal
= rtl8367c_setAsicRegBits(reg_addr
, bit_mask
, bit_value
);
772 if(retVal
!= RT_ERR_OK
)
776 reg_addr
= RTL8367C_VLAN_PPB_PRIORITY_ITEM_REG(port
, index
);
777 bit_mask
= RTL8367C_VLAN_PPB_PRIORITY_ITEM_MASK(port
);
778 bit_value
= pPpbCfg
->priority
;
779 retVal
= rtl8367c_setAsicRegBits(reg_addr
, bit_mask
, bit_value
);
780 if(retVal
!= RT_ERR_OK
)
786 * rtl8367c_getAsicVlanPortAndProtocolBased
788 * Get protocol and port based VLAN configuration
790 * port - Physical port number (0~7)
791 * index - Index of protocol and port based database index
792 * pPpbCfg - Protocol and port based VLAN configuration
796 * RT_ERR_OK - Success
797 * RT_ERR_SMI - SMI access error
798 * RT_ERR_INPUT - Invalid input parameter
799 * RT_ERR_PORT_ID - Invalid port number
800 * RT_ERR_VLAN_PROTO_AND_PORT - Invalid protocol base group database index
804 ret_t
rtl8367c_getAsicVlanPortAndProtocolBased(rtk_uint32 port
, rtk_uint32 index
, rtl8367c_protocolvlancfg
*pPpbCfg
)
806 rtk_uint32 reg_addr
, bit_mask
, bit_value
;
810 if(port
> RTL8367C_PORTIDMAX
)
811 return RT_ERR_PORT_ID
;
813 if(index
> RTL8367C_PROTOVLAN_GIDX_MAX
)
814 return RT_ERR_VLAN_PROTO_AND_PORT
;
820 reg_addr
= RTL8367C_VLAN_PPB_VALID_REG(index
);
821 bit_mask
= 0x0001 << port
;
822 retVal
= rtl8367c_getAsicRegBits(reg_addr
, bit_mask
, &bit_value
);
823 if(retVal
!= RT_ERR_OK
)
826 pPpbCfg
->valid
= bit_value
;
831 reg_addr
= RTL8367C_VLAN_PPB_CTRL_REG(index
, port
);
832 bit_mask
= RTL8367C_VLAN_PPB_CTRL_MASK(port
);
836 reg_addr
= RTL8367C_REG_VLAN_PPB0_CTRL4
;
837 bit_mask
= RTL8367C_VLAN_PPB0_CTRL4_PORT8_INDEX_MASK
;
841 reg_addr
= RTL8367C_REG_VLAN_PPB0_CTRL4
;
842 bit_mask
= RTL8367C_VLAN_PPB0_CTRL4_PORT9_INDEX_MASK
;
846 reg_addr
= RTL8367C_REG_VLAN_PPB0_CTRL4
;
847 bit_mask
= RTL8367C_VLAN_PPB0_CTRL4_PORT10_INDEX_MASK
;
850 retVal
= rtl8367c_getAsicRegBits(reg_addr
, bit_mask
, &bit_value
);
851 if(retVal
!= RT_ERR_OK
)
854 pPpbCfg
->vlan_idx
= bit_value
;
858 reg_addr
= RTL8367C_VLAN_PPB_PRIORITY_ITEM_REG(port
,index
);
859 bit_mask
= RTL8367C_VLAN_PPB_PRIORITY_ITEM_MASK(port
);
860 retVal
= rtl8367c_getAsicRegBits(reg_addr
, bit_mask
, &bit_value
);
861 if(retVal
!= RT_ERR_OK
)
864 pPpbCfg
->priority
= bit_value
;
868 * rtl8367c_setAsicVlanFilter
870 * Set enable CVLAN filtering function
872 * enabled - 1: enabled, 0: disabled
876 * RT_ERR_OK - Success
877 * RT_ERR_SMI - SMI access error
881 ret_t
rtl8367c_setAsicVlanFilter(rtk_uint32 enabled
)
883 return rtl8367c_setAsicRegBit(RTL8367C_REG_VLAN_CTRL
, RTL8367C_VLAN_CTRL_OFFSET
, enabled
);
886 * rtl8367c_getAsicVlanFilter
888 * Get enable CVLAN filtering function
890 * pEnabled - 1: enabled, 0: disabled
894 * RT_ERR_OK - Success
895 * RT_ERR_SMI - SMI access error
899 ret_t
rtl8367c_getAsicVlanFilter(rtk_uint32
* pEnabled
)
901 return rtl8367c_getAsicRegBit(RTL8367C_REG_VLAN_CTRL
, RTL8367C_VLAN_CTRL_OFFSET
, pEnabled
);
904 * rtl8367c_setAsicVlanUntagDscpPriorityEn
906 * Set enable Dscp to untag 1Q priority
908 * enabled - 1: enabled, 0: disabled
912 * RT_ERR_OK - Success
913 * RT_ERR_SMI - SMI access error
917 ret_t
rtl8367c_setAsicVlanUntagDscpPriorityEn(rtk_uint32 enabled
)
919 return rtl8367c_setAsicRegBit(RTL8367C_REG_UNTAG_DSCP_PRI_CFG
, RTL8367C_UNTAG_DSCP_PRI_CFG_OFFSET
, enabled
);
922 * rtl8367c_getAsicVlanUntagDscpPriorityEn
924 * Get enable Dscp to untag 1Q priority
926 * enabled - 1: enabled, 0: disabled
930 * RT_ERR_OK - Success
931 * RT_ERR_SMI - SMI access error
935 ret_t
rtl8367c_getAsicVlanUntagDscpPriorityEn(rtk_uint32
* enabled
)
937 return rtl8367c_getAsicRegBit(RTL8367C_REG_UNTAG_DSCP_PRI_CFG
, RTL8367C_UNTAG_DSCP_PRI_CFG_OFFSET
, enabled
);
940 * rtl8367c_setAsicPortBasedFid
944 * port - Physical port number (0~10)
945 * fid - Port based fid
949 * RT_ERR_OK - Success
950 * RT_ERR_SMI - SMI access error
951 * RT_ERR_L2_FID - Invalid FID
952 * RT_ERR_PORT_ID - Invalid port number
956 ret_t
rtl8367c_setAsicPortBasedFid(rtk_uint32 port
, rtk_uint32 fid
)
960 if(port
> RTL8367C_PORTIDMAX
)
961 return RT_ERR_PORT_ID
;
963 if(fid
> RTL8367C_FIDMAX
)
964 return RT_ERR_L2_FID
;
967 return rtl8367c_setAsicReg(RTL8367C_PORT_PBFID_REG(port
),fid
);
969 reg_addr
= RTL8367C_REG_PORT8_PBFID
+ port
-8;
970 return rtl8367c_setAsicReg(reg_addr
, fid
);
975 * rtl8367c_getAsicPortBasedFid
979 * port - Physical port number (0~7)
980 * pFid - Port based fid
984 * RT_ERR_OK - Success
985 * RT_ERR_SMI - SMI access error
986 * RT_ERR_PORT_ID - Invalid port number
990 ret_t
rtl8367c_getAsicPortBasedFid(rtk_uint32 port
, rtk_uint32
* pFid
)
994 if(port
> RTL8367C_PORTIDMAX
)
995 return RT_ERR_PORT_ID
;
998 return rtl8367c_getAsicReg(RTL8367C_PORT_PBFID_REG(port
), pFid
);
1000 reg_addr
= RTL8367C_REG_PORT8_PBFID
+ port
-8;
1001 return rtl8367c_getAsicReg(reg_addr
, pFid
);
1005 * rtl8367c_setAsicPortBasedFidEn
1007 * Set port based FID selection enable
1009 * port - Physical port number (0~10)
1010 * enabled - 1: enabled, 0: disabled
1014 * RT_ERR_OK - Success
1015 * RT_ERR_SMI - SMI access error
1016 * RT_ERR_PORT_ID - Invalid port number
1020 ret_t
rtl8367c_setAsicPortBasedFidEn(rtk_uint32 port
, rtk_uint32 enabled
)
1022 if(port
> RTL8367C_PORTIDMAX
)
1023 return RT_ERR_PORT_ID
;
1025 return rtl8367c_setAsicRegBit(RTL8367C_REG_PORT_PBFIDEN
,port
, enabled
);
1028 * rtl8367c_getAsicPortBasedFidEn
1030 * Get port based FID selection enable
1032 * port - Physical port number (0~10)
1033 * pEnabled - 1: enabled, 0: disabled
1037 * RT_ERR_OK - Success
1038 * RT_ERR_SMI - SMI access error
1039 * RT_ERR_PORT_ID - Invalid port number
1043 ret_t
rtl8367c_getAsicPortBasedFidEn(rtk_uint32 port
, rtk_uint32
* pEnabled
)
1045 if(port
> RTL8367C_PORTIDMAX
)
1046 return RT_ERR_PORT_ID
;
1048 return rtl8367c_getAsicRegBit(RTL8367C_REG_PORT_PBFIDEN
,port
, pEnabled
);
1051 * rtl8367c_setAsicSpanningTreeStatus
1053 * Set spanning tree state per each port
1055 * port - Physical port number (0~10)
1056 * msti - Multiple spanning tree instance
1057 * state - Spanning tree state for msti
1061 * RT_ERR_OK - Success
1062 * RT_ERR_SMI - SMI access error
1063 * RT_ERR_MSTI - Invalid msti parameter
1064 * RT_ERR_PORT_ID - Invalid port number
1065 * RT_ERR_MSTP_STATE - Invalid port number
1069 ret_t
rtl8367c_setAsicSpanningTreeStatus(rtk_uint32 port
, rtk_uint32 msti
, rtk_uint32 state
)
1071 rtk_uint32 reg_addr
,bits_msk
;
1073 if(port
> RTL8367C_PORTIDMAX
)
1074 return RT_ERR_PORT_ID
;
1076 if(msti
> RTL8367C_MSTIMAX
)
1079 if(state
> STPST_FORWARDING
)
1080 return RT_ERR_MSTP_STATE
;
1083 return rtl8367c_setAsicRegBits(RTL8367C_VLAN_MSTI_REG(msti
,port
), RTL8367C_VLAN_MSTI_MASK(port
),state
);
1085 reg_addr
= RTL8367C_VLAN_MSTI_REG(msti
,port
);
1087 case 8: bits_msk
= RTL8367C_VLAN_MSTI0_CTRL1_PORT8_STATE_MASK
;break;
1088 case 9: bits_msk
= RTL8367C_VLAN_MSTI0_CTRL1_PORT9_STATE_MASK
;break;
1089 case 10: bits_msk
= RTL8367C_VLAN_MSTI0_CTRL1_PORT10_STATE_MASK
;break;
1091 return rtl8367c_setAsicRegBits(reg_addr
, bits_msk
,state
);
1095 * rtl8367c_getAsicSpanningTreeStatus
1097 * Set spanning tree state per each port
1099 * port - Physical port number (0~10)
1100 * msti - Multiple spanning tree instance
1101 * pState - Spanning tree state for msti
1105 * RT_ERR_OK - Success
1106 * RT_ERR_SMI - SMI access error
1107 * RT_ERR_MSTI - Invalid msti parameter
1108 * RT_ERR_PORT_ID - Invalid port number
1112 ret_t
rtl8367c_getAsicSpanningTreeStatus(rtk_uint32 port
, rtk_uint32 msti
, rtk_uint32
* pState
)
1114 rtk_uint32 reg_addr
,bits_msk
;
1116 if(port
> RTL8367C_PORTIDMAX
)
1117 return RT_ERR_PORT_ID
;
1119 if(msti
> RTL8367C_MSTIMAX
)
1123 return rtl8367c_getAsicRegBits(RTL8367C_VLAN_MSTI_REG(msti
,port
), RTL8367C_VLAN_MSTI_MASK(port
), pState
);
1125 reg_addr
= RTL8367C_VLAN_MSTI_REG(msti
,port
);
1127 case 8: bits_msk
= RTL8367C_VLAN_MSTI0_CTRL1_PORT8_STATE_MASK
;break;
1128 case 9: bits_msk
= RTL8367C_VLAN_MSTI0_CTRL1_PORT9_STATE_MASK
;break;
1129 case 10: bits_msk
= RTL8367C_VLAN_MSTI0_CTRL1_PORT10_STATE_MASK
;break;
1131 return rtl8367c_getAsicRegBits(reg_addr
, bits_msk
, pState
);
1137 * rtl8367c_setAsicVlanTransparent
1139 * Set VLAN transparent
1141 * port - Physical port number (0~10)
1142 * portmask - portmask(0~0xFF)
1146 * RT_ERR_OK - Success
1147 * RT_ERR_SMI - SMI access error
1148 * RT_ERR_PORT_MASK - Invalid portmask
1149 * RT_ERR_PORT_ID - Invalid port number
1153 ret_t
rtl8367c_setAsicVlanTransparent(rtk_uint32 port
, rtk_uint32 portmask
)
1155 if(port
> RTL8367C_PORTIDMAX
)
1156 return RT_ERR_PORT_ID
;
1158 if(portmask
> RTL8367C_PORTMASK
)
1159 return RT_ERR_PORT_MASK
;
1161 return rtl8367c_setAsicRegBits(RTL8367C_REG_VLAN_EGRESS_TRANS_CTRL0
+ port
, RTL8367C_VLAN_EGRESS_TRANS_CTRL0_MASK
, portmask
);
1165 * rtl8367c_getAsicVlanTransparent
1167 * Get VLAN transparent
1169 * port - Physical port number (0~10)
1171 * pPortmask - Ingress port mask
1173 * RT_ERR_OK - Success
1174 * RT_ERR_SMI - SMI access error
1175 * RT_ERR_PORT_MASK - Invalid portmask
1176 * RT_ERR_PORT_ID - Invalid port number
1180 ret_t
rtl8367c_getAsicVlanTransparent(rtk_uint32 port
, rtk_uint32
*pPortmask
)
1182 if(port
> RTL8367C_PORTIDMAX
)
1183 return RT_ERR_PORT_ID
;
1185 return rtl8367c_getAsicRegBits(RTL8367C_REG_VLAN_EGRESS_TRANS_CTRL0
+ port
, RTL8367C_VLAN_EGRESS_TRANS_CTRL0_MASK
, pPortmask
);
1189 * rtl8367c_setAsicVlanEgressKeep
1191 * Set per egress port VLAN keep mode
1193 * port - Physical port number (0~10)
1194 * portmask - portmask(0~0xFF)
1198 * RT_ERR_OK - Success
1199 * RT_ERR_SMI - SMI access error
1200 * RT_ERR_PORT_MASK - Invalid portmask
1201 * RT_ERR_PORT_ID - Invalid port number
1205 ret_t
rtl8367c_setAsicVlanEgressKeep(rtk_uint32 port
, rtk_uint32 portmask
)
1207 rtk_uint32 regAddr
, bit_mask
;
1210 if(port
> RTL8367C_PORTIDMAX
)
1211 return RT_ERR_PORT_ID
;
1213 if(portmask
> RTL8367C_PORTMASK
)
1214 return RT_ERR_PORT_MASK
;
1217 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL0
+ (port
>>1),RTL8367C_PORT0_VLAN_KEEP_MASK_MASK
<<((port
&1)*8),portmask
& 0xff);
1218 if(retVal
!= RT_ERR_OK
)
1220 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL0_EXT
+ (port
>>1);
1221 bit_mask
= RTL8367C_PORT0_VLAN_KEEP_MASK_EXT_MASK
;
1222 bit_mask
<<= (port
&1)*3;
1223 retVal
= rtl8367c_setAsicRegBits(regAddr
, bit_mask
, (portmask
>>8)&0x7);
1224 if(retVal
!= RT_ERR_OK
)
1230 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL4
;
1231 bit_mask
= RTL8367C_PORT8_VLAN_KEEP_MASK_MASK
;
1232 retVal
= rtl8367c_setAsicRegBits(regAddr
, bit_mask
, portmask
& 0xff);
1233 if(retVal
!= RT_ERR_OK
)
1235 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL4_EXT
;
1236 bit_mask
= RTL8367C_PORT8_VLAN_KEEP_MASK_EXT_MASK
;
1237 retVal
= rtl8367c_setAsicRegBits(regAddr
, bit_mask
, (portmask
>>8)&0x7);
1238 if(retVal
!= RT_ERR_OK
)
1243 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL4
;
1244 bit_mask
= RTL8367C_PORT9_VLAN_KEEP_MASK_MASK
;
1245 retVal
= rtl8367c_setAsicRegBits(regAddr
, bit_mask
, portmask
& 0xff);
1246 if(retVal
!= RT_ERR_OK
)
1248 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL4_EXT
;
1249 bit_mask
= RTL8367C_PORT9_VLAN_KEEP_MASK_EXT_MASK
;
1250 retVal
= rtl8367c_setAsicRegBits(regAddr
, bit_mask
, (portmask
>>8)&0x7);
1251 if(retVal
!= RT_ERR_OK
)
1256 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL5
;
1257 bit_mask
= RTL8367C_VLAN_EGRESS_KEEP_CTRL5_MASK
;
1258 retVal
= rtl8367c_setAsicRegBits(regAddr
, bit_mask
, portmask
& 0xff);
1259 if(retVal
!= RT_ERR_OK
)
1261 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL5_EXT
;
1262 bit_mask
= RTL8367C_VLAN_EGRESS_KEEP_CTRL5_EXT_MASK
;
1263 retVal
= rtl8367c_setAsicRegBits(regAddr
, bit_mask
, (portmask
>>8)&0x7);
1264 if(retVal
!= RT_ERR_OK
)
1274 * rtl8367c_getAsicVlanEgressKeep
1276 * Get per egress port VLAN keep mode
1278 * port - Physical port number (0~7)
1279 * pPortmask - portmask(0~0xFF)
1283 * RT_ERR_OK - Success
1284 * RT_ERR_SMI - SMI access error
1285 * RT_ERR_PORT_ID - Invalid port number
1289 ret_t
rtl8367c_getAsicVlanEgressKeep(rtk_uint32 port
, rtk_uint32
* pPortmask
)
1291 rtk_uint32 regAddr
, bit_mask
, regval_l
, regval_h
;
1294 if(port
> RTL8367C_PORTIDMAX
)
1295 return RT_ERR_PORT_ID
;
1298 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL0
+ (port
>>1),RTL8367C_PORT0_VLAN_KEEP_MASK_MASK
<<((port
&1)*8),®val_l
);
1299 if(retVal
!= RT_ERR_OK
)
1301 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL0_EXT
+ (port
>>1);
1302 bit_mask
= RTL8367C_PORT0_VLAN_KEEP_MASK_EXT_MASK
;
1303 bit_mask
<<= (port
&1)*3;
1304 retVal
= rtl8367c_getAsicRegBits(regAddr
, bit_mask
, ®val_h
);
1305 if(retVal
!= RT_ERR_OK
)
1307 *pPortmask
= (regval_h
<< 8) | regval_l
;
1312 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL4
;
1313 bit_mask
= RTL8367C_PORT8_VLAN_KEEP_MASK_MASK
;
1314 retVal
= rtl8367c_getAsicRegBits(regAddr
, bit_mask
, ®val_l
);
1315 if(retVal
!= RT_ERR_OK
)
1317 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL4_EXT
;
1318 bit_mask
= RTL8367C_PORT8_VLAN_KEEP_MASK_EXT_MASK
;
1319 retVal
= rtl8367c_getAsicRegBits(regAddr
, bit_mask
, ®val_h
);
1320 if(retVal
!= RT_ERR_OK
)
1323 *pPortmask
= (regval_h
<< 8) | regval_l
;
1327 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL4
;
1328 bit_mask
= RTL8367C_PORT9_VLAN_KEEP_MASK_MASK
;
1329 retVal
= rtl8367c_getAsicRegBits(regAddr
, bit_mask
, ®val_l
);
1330 if(retVal
!= RT_ERR_OK
)
1332 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL4_EXT
;
1333 bit_mask
= RTL8367C_PORT9_VLAN_KEEP_MASK_EXT_MASK
;
1334 retVal
= rtl8367c_getAsicRegBits(regAddr
, bit_mask
, ®val_h
);
1335 if(retVal
!= RT_ERR_OK
)
1338 *pPortmask
= (regval_h
<< 8) | regval_l
;
1342 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL5
;
1343 bit_mask
= RTL8367C_VLAN_EGRESS_KEEP_CTRL5_MASK
;
1344 retVal
= rtl8367c_getAsicRegBits(regAddr
, bit_mask
, ®val_l
);
1345 if(retVal
!= RT_ERR_OK
)
1347 regAddr
= RTL8367C_REG_VLAN_EGRESS_KEEP_CTRL5_EXT
;
1348 bit_mask
= RTL8367C_VLAN_EGRESS_KEEP_CTRL5_EXT_MASK
;
1349 retVal
= rtl8367c_getAsicRegBits(regAddr
, bit_mask
, ®val_h
);
1350 if(retVal
!= RT_ERR_OK
)
1353 *pPortmask
= (regval_h
<< 8) | regval_l
;
1362 * rtl8367c_setReservedVidAction
1364 * Set reserved VID action
1366 * vid0Action - VID 0 action
1367 * vid4095Action - VID 4095 action
1371 * RT_ERR_OK - Success
1372 * RT_ERR_SMI - SMI access error
1373 * RT_ERR_INPUT - Error input
1377 ret_t
rtl8367c_setReservedVidAction(rtk_uint32 vid0Action
, rtk_uint32 vid4095Action
)
1381 if(vid0Action
>= RES_VID_ACT_END
)
1382 return RT_ERR_INPUT
;
1384 if(vid4095Action
>= RES_VID_ACT_END
)
1385 return RT_ERR_INPUT
;
1387 if((retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_VLAN_EXT_CTRL
, RTL8367C_VLAN_VID0_TYPE_OFFSET
, vid0Action
)) != RT_ERR_OK
)
1390 if((retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_VLAN_EXT_CTRL
, RTL8367C_VLAN_VID4095_TYPE_OFFSET
, vid4095Action
)) != RT_ERR_OK
)
1397 * rtl8367c_getReservedVidAction
1399 * Get reserved VID action
1401 * pVid0Action - VID 0 action
1402 * pVid4095Action - VID 4095 action
1406 * RT_ERR_OK - Success
1407 * RT_ERR_SMI - SMI access error
1408 * RT_ERR_NULL_POINTER - Null pointer
1412 ret_t
rtl8367c_getReservedVidAction(rtk_uint32
*pVid0Action
, rtk_uint32
*pVid4095Action
)
1416 if(pVid0Action
== NULL
)
1417 return RT_ERR_NULL_POINTER
;
1419 if(pVid4095Action
== NULL
)
1420 return RT_ERR_NULL_POINTER
;
1422 if((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_VLAN_EXT_CTRL
, RTL8367C_VLAN_VID0_TYPE_OFFSET
, pVid0Action
)) != RT_ERR_OK
)
1425 if((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_VLAN_EXT_CTRL
, RTL8367C_VLAN_VID4095_TYPE_OFFSET
, pVid4095Action
)) != RT_ERR_OK
)
1433 * rtl8367c_setRealKeepRemarkEn
1435 * Set Real Keep Remark
1437 * enabled - 0: 1P remarking is forbidden at real keep packet, 1: 1P remarking is enabled at real keep packet
1441 * RT_ERR_OK - Success
1442 * RT_ERR_SMI - SMI access error
1443 * RT_ERR_INPUT - Error input
1447 ret_t
rtl8367c_setRealKeepRemarkEn(rtk_uint32 enabled
)
1451 if((retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_VLAN_EXT_CTRL
, RTL8367C_VLAN_1P_REMARK_BYPASS_REALKEEP_OFFSET
, enabled
)) != RT_ERR_OK
)
1458 * rtl8367c_getRealKeepRemarkEn
1460 * Get Real Keep Remark
1464 * pEnabled - 0: 1P remarking is forbidden at real keep packet, 1: 1P remarking is enabled at real keep packet
1466 * RT_ERR_OK - Success
1467 * RT_ERR_SMI - SMI access error
1468 * RT_ERR_INPUT - Error input
1472 ret_t
rtl8367c_getRealKeepRemarkEn(rtk_uint32
*pEnabled
)
1476 if((retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_VLAN_EXT_CTRL
, RTL8367C_VLAN_1P_REMARK_BYPASS_REALKEEP_OFFSET
, pEnabled
)) != RT_ERR_OK
)
1483 * rtl8367c_resetVlan
1491 * RT_ERR_OK - Success
1492 * RT_ERR_SMI - SMI access error
1496 ret_t
rtl8367c_resetVlan(void)
1500 if((retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_VLAN_EXT_CTRL2
, RTL8367C_VLAN_EXT_CTRL2_OFFSET
, 1)) != RT_ERR_OK
)