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 : IGMP related functions
17 #include <rtl8367c_asicdrv_igmp.h>
19 * rtl8367c_setAsicIgmp
23 * enabled - 1: enabled, 0: disabled
28 * RT_ERR_SMI - SMI access error
32 ret_t
rtl8367c_setAsicIgmp(rtk_uint32 enabled
)
36 /* Enable/Disable H/W IGMP/MLD */
37 retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_IGMP_MLD_EN_OFFSET
, enabled
);
42 * rtl8367c_getAsicIgmp
46 * enabled - 1: enabled, 0: disabled
51 * RT_ERR_SMI - SMI access error
55 ret_t
rtl8367c_getAsicIgmp(rtk_uint32
*ptr_enabled
)
59 retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_IGMP_MLD_EN_OFFSET
, ptr_enabled
);
63 * rtl8367c_setAsicIpMulticastVlanLeaky
65 * Set IP multicast VLAN Leaky function
67 * port - Physical port number (0~7)
68 * enabled - 1: enabled, 0: disabled
73 * RT_ERR_SMI - SMI access error
74 * RT_ERR_PORT_ID - Invalid port number
76 * When enabling this function,
77 * if the lookup result(forwarding portmap) of IP Multicast packet is over VLAN boundary,
78 * the packet can be forwarded across VLAN
80 ret_t
rtl8367c_setAsicIpMulticastVlanLeaky(rtk_uint32 port
, rtk_uint32 enabled
)
84 if(port
> RTL8367C_PORTIDMAX
)
85 return RT_ERR_PORT_ID
;
87 retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_IPMCAST_VLAN_LEAKY
, port
, enabled
);
92 * rtl8367c_getAsicIpMulticastVlanLeaky
94 * Get IP multicast VLAN Leaky function
96 * port - Physical port number (0~7)
97 * enabled - 1: enabled, 0: disabled
101 * RT_ERR_OK - Success
102 * RT_ERR_SMI - SMI access error
103 * RT_ERR_PORT_ID - Invalid port number
107 ret_t
rtl8367c_getAsicIpMulticastVlanLeaky(rtk_uint32 port
, rtk_uint32
*ptr_enabled
)
111 if(port
> RTL8367C_PORTIDMAX
)
112 return RT_ERR_PORT_ID
;
114 retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_IPMCAST_VLAN_LEAKY
, port
, ptr_enabled
);
120 * rtl8367c_setAsicIGMPTableFullOP
122 * Set Table Full operation
124 * operation - The operation should be taken when the IGMP table is full.
128 * RT_ERR_OK - Success
129 * RT_ERR_SMI - SMI access error
130 * RT_ERR_OUT_OF_RANGE - input parameter is out of range
134 ret_t
rtl8367c_setAsicIGMPTableFullOP(rtk_uint32 operation
)
138 if(operation
>= TABLE_FULL_OP_END
)
139 return RT_ERR_OUT_OF_RANGE
;
141 /* Table full Operation */
142 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG1
, RTL8367C_TABLE_FULL_OP_MASK
, operation
);
143 if(retVal
!= RT_ERR_OK
)
150 * rtl8367c_getAsicIGMPTableFullOP
152 * Get Table Full operation
156 * poperation - The operation should be taken when the IGMP table is full.
158 * RT_ERR_OK - Success
159 * RT_ERR_SMI - SMI access error
163 ret_t
rtl8367c_getAsicIGMPTableFullOP(rtk_uint32
*poperation
)
168 /* Table full Operation */
169 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG1
, RTL8367C_TABLE_FULL_OP_MASK
, &value
);
170 if(retVal
!= RT_ERR_OK
)
179 * rtl8367c_setAsicIGMPCRCErrOP
181 * Set the operation when ASIC receive a Checksum error packet
183 * operation -The operation when ASIC receive a Checksum error packet
187 * RT_ERR_OK - Success
188 * RT_ERR_SMI - SMI access error
189 * RT_ERR_OUT_OF_RANGE - input parameter is out of range
193 ret_t
rtl8367c_setAsicIGMPCRCErrOP(rtk_uint32 operation
)
197 if(operation
>= CRC_ERR_OP_END
)
198 return RT_ERR_OUT_OF_RANGE
;
200 /* CRC Error Operation */
201 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_CKS_ERR_OP_MASK
, operation
);
202 if(retVal
!= RT_ERR_OK
)
209 * rtl8367c_getAsicIGMPCRCErrOP
211 * Get the operation when ASIC receive a Checksum error packet
215 * poperation - The operation of Checksum error packet
217 * RT_ERR_OK - Success
218 * RT_ERR_SMI - SMI access error
222 ret_t
rtl8367c_getAsicIGMPCRCErrOP(rtk_uint32
*poperation
)
227 /* CRC Error Operation */
228 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_CKS_ERR_OP_MASK
, &value
);
229 if(retVal
!= RT_ERR_OK
)
238 * rtl8367c_setAsicIGMPFastLeaveEn
240 * Enable/Disable Fast Leave
242 * enabled - 1:enable Fast Leave; 0:disable Fast Leave
246 * RT_ERR_OK - Success
247 * RT_ERR_SMI - SMI access error
251 ret_t
rtl8367c_setAsicIGMPFastLeaveEn(rtk_uint32 enabled
)
256 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_FAST_LEAVE_EN_MASK
, (enabled
>= 1) ? 1 : 0);
257 if(retVal
!= RT_ERR_OK
)
264 * rtl8367c_getAsicIGMPFastLeaveEn
266 * Get Fast Leave state
270 * penabled - 1:enable Fast Leave; 0:disable Fast Leave
272 * RT_ERR_OK - Success
273 * RT_ERR_SMI - SMI access error
277 ret_t
rtl8367c_getAsicIGMPFastLeaveEn(rtk_uint32
*penabled
)
283 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_FAST_LEAVE_EN_MASK
, &value
);
284 if(retVal
!= RT_ERR_OK
)
293 * rtl8367c_setAsicIGMPLeaveTimer
295 * Set the Leave timer of IGMP/MLD
297 * leave_timer - Leave timer
301 * RT_ERR_OK - Success
302 * RT_ERR_SMI - SMI access error
303 * RT_ERR_OUT_OF_RANGE - input parameter is out of range
307 ret_t
rtl8367c_setAsicIGMPLeaveTimer(rtk_uint32 leave_timer
)
311 if(leave_timer
> RTL8367C_MAX_LEAVE_TIMER
)
312 return RT_ERR_OUT_OF_RANGE
;
315 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_LEAVE_TIMER_MASK
, leave_timer
);
316 if(retVal
!= RT_ERR_OK
)
323 * rtl8367c_getAsicIGMPLeaveTimer
325 * Get the Leave timer of IGMP/MLD
329 * pleave_timer - Leave timer
331 * RT_ERR_OK - Success
332 * RT_ERR_SMI - SMI access error
336 ret_t
rtl8367c_getAsicIGMPLeaveTimer(rtk_uint32
*pleave_timer
)
342 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_LEAVE_TIMER_MASK
, &value
);
343 if(retVal
!= RT_ERR_OK
)
346 *pleave_timer
= value
;
352 * rtl8367c_setAsicIGMPQueryInterval
354 * Set Query Interval of IGMP/MLD
356 * interval - Query Interval
360 * RT_ERR_OK - Success
361 * RT_ERR_SMI - SMI access error
362 * RT_ERR_OUT_OF_RANGE - input parameter is out of range
366 ret_t
rtl8367c_setAsicIGMPQueryInterval(rtk_uint32 interval
)
370 if(interval
> RTL8367C_MAX_QUERY_INT
)
371 return RT_ERR_OUT_OF_RANGE
;
374 retVal
= rtl8367c_setAsicReg(RTL8367C_REG_IGMP_MLD_CFG2
, interval
);
375 if(retVal
!= RT_ERR_OK
)
382 * rtl8367c_getAsicIGMPQueryInterval
384 * Get Query Interval of IGMP/MLD
388 * pinterval - Query Interval
390 * RT_ERR_OK - Success
391 * RT_ERR_SMI - SMI access error
395 ret_t
rtl8367c_getAsicIGMPQueryInterval(rtk_uint32
*pinterval
)
401 retVal
= rtl8367c_getAsicReg(RTL8367C_REG_IGMP_MLD_CFG2
, &value
);
402 if(retVal
!= RT_ERR_OK
)
411 * rtl8367c_setAsicIGMPRobVar
413 * Set Robustness Variable of IGMP/MLD
415 * rob_var - Robustness Variable
419 * RT_ERR_OK - Success
420 * RT_ERR_SMI - SMI access error
421 * RT_ERR_OUT_OF_RANGE - input parameter is out of range
425 ret_t
rtl8367c_setAsicIGMPRobVar(rtk_uint32 rob_var
)
429 if(rob_var
> RTL8367C_MAX_ROB_VAR
)
430 return RT_ERR_OUT_OF_RANGE
;
432 /* Bourstness variable */
433 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_ROBURSTNESS_VAR_MASK
, rob_var
);
434 if(retVal
!= RT_ERR_OK
)
441 * rtl8367c_getAsicIGMPRobVar
443 * Get Robustness Variable of IGMP/MLD
447 * prob_var - Robustness Variable
449 * RT_ERR_OK - Success
450 * RT_ERR_SMI - SMI access error
454 ret_t
rtl8367c_getAsicIGMPRobVar(rtk_uint32
*prob_var
)
459 /* Bourstness variable */
460 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_ROBURSTNESS_VAR_MASK
, &value
);
461 if(retVal
!= RT_ERR_OK
)
470 * rtl8367c_setAsicIGMPStaticRouterPort
472 * Set IGMP static router port mask
474 * pmsk - Static portmask
478 * RT_ERR_OK - Success
479 * RT_ERR_SMI - SMI access error
480 * RT_ERR_PORT_MASK - Invalid port mask
484 ret_t
rtl8367c_setAsicIGMPStaticRouterPort(rtk_uint32 pmsk
)
486 if(pmsk
> RTL8367C_PORTMASK
)
487 return RT_ERR_PORT_MASK
;
489 return rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_STATIC_ROUTER_PORT
, RTL8367C_IGMP_STATIC_ROUTER_PORT_MASK
, pmsk
);
493 * rtl8367c_getAsicIGMPStaticRouterPort
495 * Get IGMP static router port mask
497 * pmsk - Static portmask
501 * RT_ERR_OK - Success
502 * RT_ERR_SMI - SMI access error
506 ret_t
rtl8367c_getAsicIGMPStaticRouterPort(rtk_uint32
*pmsk
)
508 return rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_STATIC_ROUTER_PORT
, RTL8367C_IGMP_STATIC_ROUTER_PORT_MASK
, pmsk
);
512 * rtl8367c_setAsicIGMPAllowDynamicRouterPort
514 * Set IGMP dynamic router port allow mask
516 * pmsk - Allow dynamic router port mask
520 * RT_ERR_OK - Success
521 * RT_ERR_SMI - SMI access error
522 * RT_ERR_PORT_MASK - Invalid port mask
526 ret_t
rtl8367c_setAsicIGMPAllowDynamicRouterPort(rtk_uint32 pmsk
)
528 return rtl8367c_setAsicReg(RTL8367C_REG_IGMP_MLD_CFG4
, pmsk
);
532 * rtl8367c_getAsicIGMPAllowDynamicRouterPort
534 * Get IGMP dynamic router port allow mask
538 * pPmsk - Allow dynamic router port mask
540 * RT_ERR_OK - Success
541 * RT_ERR_SMI - SMI access error
542 * RT_ERR_PORT_MASK - Invalid port mask
546 ret_t
rtl8367c_getAsicIGMPAllowDynamicRouterPort(rtk_uint32
*pPmsk
)
548 return rtl8367c_getAsicReg(RTL8367C_REG_IGMP_MLD_CFG4
, pPmsk
);
552 * rtl8367c_getAsicIGMPdynamicRouterPort1
554 * Get 1st dynamic router port and timer
556 * port - Physical port number (0~7)
557 * timer - router port timer
561 * RT_ERR_OK - Success
562 * RT_ERR_SMI - SMI access error
566 ret_t
rtl8367c_getAsicIGMPdynamicRouterPort1(rtk_uint32
*port
, rtk_uint32
*timer
)
570 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_DYNAMIC_ROUTER_PORT
, RTL8367C_D_ROUTER_PORT_1_MASK
, port
);
571 if(retVal
!= RT_ERR_OK
)
574 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_DYNAMIC_ROUTER_PORT
, RTL8367C_D_ROUTER_PORT_TMR_1_MASK
, timer
);
575 if(retVal
!= RT_ERR_OK
)
582 * rtl8367c_getAsicIGMPdynamicRouterPort2
584 * Get 2nd dynamic router port and timer
586 * port - Physical port number (0~7)
587 * timer - router port timer
591 * RT_ERR_OK - Success
592 * RT_ERR_SMI - SMI access error
596 ret_t
rtl8367c_getAsicIGMPdynamicRouterPort2(rtk_uint32
*port
, rtk_uint32
*timer
)
600 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_DYNAMIC_ROUTER_PORT
, RTL8367C_D_ROUTER_PORT_2_MASK
, port
);
601 if(retVal
!= RT_ERR_OK
)
604 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_DYNAMIC_ROUTER_PORT
, RTL8367C_D_ROUTER_PORT_TMR_2_MASK
, timer
);
605 if(retVal
!= RT_ERR_OK
)
612 * rtl8367c_setAsicIGMPSuppression
614 * Set the suppression function
616 * report_supp_enabled - Report suppression, 1:Enable, 0:disable
617 * leave_supp_enabled - Leave suppression, 1:Enable, 0:disable
621 * RT_ERR_OK - Success
622 * RT_ERR_SMI - SMI access error
626 ret_t
rtl8367c_setAsicIGMPSuppression(rtk_uint32 report_supp_enabled
, rtk_uint32 leave_supp_enabled
)
630 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_REPORT_SUPPRESSION_MASK
, report_supp_enabled
);
631 if(retVal
!= RT_ERR_OK
)
634 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_LEAVE_SUPPRESSION_MASK
, leave_supp_enabled
);
635 if(retVal
!= RT_ERR_OK
)
642 * rtl8367c_getAsicIGMPSuppression
644 * Get the suppression function
646 * report_supp_enabled - Report suppression, 1:Enable, 0:disable
647 * leave_supp_enabled - Leave suppression, 1:Enable, 0:disable
651 * RT_ERR_OK - Success
652 * RT_ERR_SMI - SMI access error
656 ret_t
rtl8367c_getAsicIGMPSuppression(rtk_uint32
*report_supp_enabled
, rtk_uint32
*leave_supp_enabled
)
660 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_REPORT_SUPPRESSION_MASK
, report_supp_enabled
);
661 if(retVal
!= RT_ERR_OK
)
664 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_LEAVE_SUPPRESSION_MASK
, leave_supp_enabled
);
665 if(retVal
!= RT_ERR_OK
)
672 * rtl8367c_setAsicIGMPQueryRX
674 * Set port-based Query packet RX allowance
677 * allow_query - allowance of Query packet RX, 1:Allow, 0:Drop
681 * RT_ERR_OK - Success
682 * RT_ERR_PORT_ID - Error PORT ID
683 * RT_ERR_SMI - SMI access error
687 ret_t
rtl8367c_setAsicIGMPQueryRX(rtk_uint32 port
, rtk_uint32 allow_query
)
691 if(port
> RTL8367C_PORTIDMAX
)
692 return RT_ERR_PORT_ID
;
697 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_QUERY_MASK
, allow_query
);
698 if(retVal
!= RT_ERR_OK
)
703 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_QUERY_MASK
, allow_query
);
704 if(retVal
!= RT_ERR_OK
)
712 * rtl8367c_getAsicIGMPQueryRX
714 * Get port-based Query packet RX allowance
718 * allow_query - allowance of Query packet RX, 1:Allow, 0:Drop
720 * RT_ERR_OK - Success
721 * RT_ERR_PORT_ID - Error PORT ID
722 * RT_ERR_SMI - SMI access error
726 ret_t
rtl8367c_getAsicIGMPQueryRX(rtk_uint32 port
, rtk_uint32
*allow_query
)
731 if(port
> RTL8367C_PORTIDMAX
)
732 return RT_ERR_PORT_ID
;
737 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_QUERY_MASK
, &value
);
738 if(retVal
!= RT_ERR_OK
)
743 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_QUERY_MASK
, &value
);
744 if(retVal
!= RT_ERR_OK
)
747 *allow_query
= value
;
753 * rtl8367c_setAsicIGMPReportRX
755 * Set port-based Report packet RX allowance
758 * allow_report - allowance of Report packet RX, 1:Allow, 0:Drop
762 * RT_ERR_OK - Success
763 * RT_ERR_PORT_ID - Error PORT ID
764 * RT_ERR_SMI - SMI access error
768 ret_t
rtl8367c_setAsicIGMPReportRX(rtk_uint32 port
, rtk_uint32 allow_report
)
772 if(port
> RTL8367C_PORTIDMAX
)
773 return RT_ERR_PORT_ID
;
778 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_REPORT_MASK
, allow_report
);
779 if(retVal
!= RT_ERR_OK
)
784 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_REPORT_MASK
, allow_report
);
785 if(retVal
!= RT_ERR_OK
)
792 * rtl8367c_getAsicIGMPReportRX
794 * Get port-based Report packet RX allowance
798 * allow_report - allowance of Report packet RX, 1:Allow, 0:Drop
800 * RT_ERR_OK - Success
801 * RT_ERR_PORT_ID - Error PORT ID
802 * RT_ERR_SMI - SMI access error
806 ret_t
rtl8367c_getAsicIGMPReportRX(rtk_uint32 port
, rtk_uint32
*allow_report
)
811 if(port
> RTL8367C_PORTIDMAX
)
812 return RT_ERR_PORT_ID
;
817 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_REPORT_MASK
, &value
);
818 if(retVal
!= RT_ERR_OK
)
823 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_REPORT_MASK
, &value
);
824 if(retVal
!= RT_ERR_OK
)
827 *allow_report
= value
;
833 * rtl8367c_setAsicIGMPLeaveRX
835 * Set port-based Leave packet RX allowance
838 * allow_leave - allowance of Leave packet RX, 1:Allow, 0:Drop
842 * RT_ERR_OK - Success
843 * RT_ERR_PORT_ID - Error PORT ID
844 * RT_ERR_SMI - SMI access error
848 ret_t
rtl8367c_setAsicIGMPLeaveRX(rtk_uint32 port
, rtk_uint32 allow_leave
)
852 if(port
> RTL8367C_PORTIDMAX
)
853 return RT_ERR_PORT_ID
;
858 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_LEAVE_MASK
, allow_leave
);
859 if(retVal
!= RT_ERR_OK
)
864 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_LEAVE_MASK
, allow_leave
);
865 if(retVal
!= RT_ERR_OK
)
872 * rtl8367c_getAsicIGMPLeaveRX
874 * Get port-based Leave packet RX allowance
878 * allow_leave - allowance of Leave packet RX, 1:Allow, 0:Drop
880 * RT_ERR_OK - Success
881 * RT_ERR_PORT_ID - Error PORT ID
882 * RT_ERR_SMI - SMI access error
886 ret_t
rtl8367c_getAsicIGMPLeaveRX(rtk_uint32 port
, rtk_uint32
*allow_leave
)
891 if(port
> RTL8367C_PORTIDMAX
)
892 return RT_ERR_PORT_ID
;
897 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_LEAVE_MASK
, &value
);
898 if(retVal
!= RT_ERR_OK
)
903 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_LEAVE_MASK
, &value
);
904 if(retVal
!= RT_ERR_OK
)
908 *allow_leave
= value
;
914 * rtl8367c_setAsicIGMPMRPRX
916 * Set port-based Multicast Routing Protocol packet RX allowance
919 * allow_mrp - allowance of Multicast Routing Protocol packet RX, 1:Allow, 0:Drop
923 * RT_ERR_OK - Success
924 * RT_ERR_PORT_ID - Error PORT ID
925 * RT_ERR_SMI - SMI access error
929 ret_t
rtl8367c_setAsicIGMPMRPRX(rtk_uint32 port
, rtk_uint32 allow_mrp
)
933 if(port
> RTL8367C_PORTIDMAX
)
934 return RT_ERR_PORT_ID
;
938 /* Allow Multicast Routing Protocol */
939 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_MRP_MASK
, allow_mrp
);
940 if(retVal
!= RT_ERR_OK
)
945 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_MRP_MASK
, allow_mrp
);
946 if(retVal
!= RT_ERR_OK
)
953 * rtl8367c_getAsicIGMPMRPRX
955 * Get port-based Multicast Routing Protocol packet RX allowance
959 * allow_mrp - allowance of Multicast Routing Protocol packet RX, 1:Allow, 0:Drop
961 * RT_ERR_OK - Success
962 * RT_ERR_PORT_ID - Error PORT ID
963 * RT_ERR_SMI - SMI access error
967 ret_t
rtl8367c_getAsicIGMPMRPRX(rtk_uint32 port
, rtk_uint32
*allow_mrp
)
972 if(port
> RTL8367C_PORTIDMAX
)
973 return RT_ERR_PORT_ID
;
975 /* Allow Multicast Routing Protocol */
978 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_MRP_MASK
, &value
);
979 if(retVal
!= RT_ERR_OK
)
984 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_MRP_MASK
, &value
);
985 if(retVal
!= RT_ERR_OK
)
994 * rtl8367c_setAsicIGMPMcDataRX
996 * Set port-based Multicast data packet RX allowance
999 * allow_mcdata - allowance of Multicast data packet RX, 1:Allow, 0:Drop
1003 * RT_ERR_OK - Success
1004 * RT_ERR_PORT_ID - Error PORT ID
1005 * RT_ERR_SMI - SMI access error
1009 ret_t
rtl8367c_setAsicIGMPMcDataRX(rtk_uint32 port
, rtk_uint32 allow_mcdata
)
1013 if(port
> RTL8367C_PORTIDMAX
)
1014 return RT_ERR_PORT_ID
;
1016 /* Allow Multicast Data */
1019 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_MC_DATA_MASK
, allow_mcdata
);
1020 if(retVal
!= RT_ERR_OK
)
1025 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_MC_DATA_MASK
, allow_mcdata
);
1026 if(retVal
!= RT_ERR_OK
)
1033 * rtl8367c_getAsicIGMPMcDataRX
1035 * Get port-based Multicast data packet RX allowance
1037 * port - port number
1039 * allow_mcdata - allowance of Multicast data packet RX, 1:Allow, 0:Drop
1041 * RT_ERR_OK - Success
1042 * RT_ERR_PORT_ID - Error PORT ID
1043 * RT_ERR_SMI - SMI access error
1047 ret_t
rtl8367c_getAsicIGMPMcDataRX(rtk_uint32 port
, rtk_uint32
*allow_mcdata
)
1052 if(port
> RTL8367C_PORTIDMAX
)
1053 return RT_ERR_PORT_ID
;
1055 /* Allow Multicast data */
1058 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_MC_DATA_MASK
, &value
);
1059 if(retVal
!= RT_ERR_OK
)
1064 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_ALLOW_MC_DATA_MASK
, &value
);
1065 if(retVal
!= RT_ERR_OK
)
1069 *allow_mcdata
= value
;
1075 * rtl8367c_setAsicIGMPv1Opeartion
1077 * Set port-based IGMPv1 Control packet action
1079 * port - port number
1080 * igmpv1_op - IGMPv1 control packet action
1084 * RT_ERR_OK - Success
1085 * RT_ERR_PORT_ID - Error PORT ID
1086 * RT_ERR_SMI - SMI access error
1090 ret_t
rtl8367c_setAsicIGMPv1Opeartion(rtk_uint32 port
, rtk_uint32 igmpv1_op
)
1094 if(port
> RTL8367C_PORTIDMAX
)
1095 return RT_ERR_PORT_ID
;
1097 if(igmpv1_op
>= PROTOCOL_OP_END
)
1098 return RT_ERR_INPUT
;
1100 /* IGMPv1 operation */
1103 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_IGMPV1_OP_MASK
, igmpv1_op
);
1104 if(retVal
!= RT_ERR_OK
)
1109 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_IGMPV1_OP_MASK
, igmpv1_op
);
1110 if(retVal
!= RT_ERR_OK
)
1118 * rtl8367c_getAsicIGMPv1Opeartion
1120 * Get port-based IGMPv1 Control packet action
1122 * port - port number
1124 * igmpv1_op - IGMPv1 control packet action
1126 * RT_ERR_OK - Success
1127 * RT_ERR_PORT_ID - Error PORT ID
1128 * RT_ERR_SMI - SMI access error
1132 ret_t
rtl8367c_getAsicIGMPv1Opeartion(rtk_uint32 port
, rtk_uint32
*igmpv1_op
)
1137 if(port
> RTL8367C_PORTIDMAX
)
1138 return RT_ERR_PORT_ID
;
1140 /* IGMPv1 operation */
1143 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_IGMPV1_OP_MASK
, &value
);
1144 if(retVal
!= RT_ERR_OK
)
1149 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_IGMPV1_OP_MASK
, &value
);
1150 if(retVal
!= RT_ERR_OK
)
1160 * rtl8367c_setAsicIGMPv2Opeartion
1162 * Set port-based IGMPv2 Control packet action
1164 * port - port number
1165 * igmpv2_op - IGMPv2 control packet action
1169 * RT_ERR_OK - Success
1170 * RT_ERR_PORT_ID - Error PORT ID
1171 * RT_ERR_SMI - SMI access error
1175 ret_t
rtl8367c_setAsicIGMPv2Opeartion(rtk_uint32 port
, rtk_uint32 igmpv2_op
)
1179 if(port
> RTL8367C_PORTIDMAX
)
1180 return RT_ERR_PORT_ID
;
1182 if(igmpv2_op
>= PROTOCOL_OP_END
)
1183 return RT_ERR_INPUT
;
1185 /* IGMPv2 operation */
1188 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_IGMPV2_OP_MASK
, igmpv2_op
);
1189 if(retVal
!= RT_ERR_OK
)
1194 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_IGMPV2_OP_MASK
, igmpv2_op
);
1195 if(retVal
!= RT_ERR_OK
)
1203 * rtl8367c_getAsicIGMPv2Opeartion
1205 * Get port-based IGMPv2 Control packet action
1207 * port - port number
1209 * igmpv2_op - IGMPv2 control packet action
1211 * RT_ERR_OK - Success
1212 * RT_ERR_PORT_ID - Error PORT ID
1213 * RT_ERR_SMI - SMI access error
1217 ret_t
rtl8367c_getAsicIGMPv2Opeartion(rtk_uint32 port
, rtk_uint32
*igmpv2_op
)
1222 if(port
> RTL8367C_PORTIDMAX
)
1223 return RT_ERR_PORT_ID
;
1225 /* IGMPv2 operation */
1228 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_IGMPV2_OP_MASK
, &value
);
1229 if(retVal
!= RT_ERR_OK
)
1234 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_IGMPV2_OP_MASK
, &value
);
1235 if(retVal
!= RT_ERR_OK
)
1245 * rtl8367c_setAsicIGMPv3Opeartion
1247 * Set port-based IGMPv3 Control packet action
1249 * port - port number
1250 * igmpv3_op - IGMPv3 control packet action
1254 * RT_ERR_OK - Success
1255 * RT_ERR_PORT_ID - Error PORT ID
1256 * RT_ERR_SMI - SMI access error
1260 ret_t
rtl8367c_setAsicIGMPv3Opeartion(rtk_uint32 port
, rtk_uint32 igmpv3_op
)
1264 if(port
> RTL8367C_PORTIDMAX
)
1265 return RT_ERR_PORT_ID
;
1267 if(igmpv3_op
>= PROTOCOL_OP_END
)
1268 return RT_ERR_INPUT
;
1270 /* IGMPv3 operation */
1273 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_IGMPV3_OP_MASK
, igmpv3_op
);
1274 if(retVal
!= RT_ERR_OK
)
1279 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_IGMPV3_OP_MASK
, igmpv3_op
);
1280 if(retVal
!= RT_ERR_OK
)
1288 * rtl8367c_getAsicIGMPv3Opeartion
1290 * Get port-based IGMPv3 Control packet action
1292 * port - port number
1294 * igmpv3_op - IGMPv3 control packet action
1296 * RT_ERR_OK - Success
1297 * RT_ERR_PORT_ID - Error PORT ID
1298 * RT_ERR_SMI - SMI access error
1302 ret_t
rtl8367c_getAsicIGMPv3Opeartion(rtk_uint32 port
, rtk_uint32
*igmpv3_op
)
1307 if(port
> RTL8367C_PORTIDMAX
)
1308 return RT_ERR_PORT_ID
;
1310 /* IGMPv3 operation */
1313 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_IGMPV3_OP_MASK
, &value
);
1314 if(retVal
!= RT_ERR_OK
)
1319 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_IGMPV3_OP_MASK
, &value
);
1320 if(retVal
!= RT_ERR_OK
)
1330 * rtl8367c_setAsicMLDv1Opeartion
1332 * Set port-based MLDv1 Control packet action
1334 * port - port number
1335 * mldv1_op - MLDv1 control packet action
1339 * RT_ERR_OK - Success
1340 * RT_ERR_PORT_ID - Error PORT ID
1341 * RT_ERR_SMI - SMI access error
1345 ret_t
rtl8367c_setAsicMLDv1Opeartion(rtk_uint32 port
, rtk_uint32 mldv1_op
)
1349 if(port
> RTL8367C_PORTIDMAX
)
1350 return RT_ERR_PORT_ID
;
1352 if(mldv1_op
>= PROTOCOL_OP_END
)
1353 return RT_ERR_INPUT
;
1355 /* MLDv1 operation */
1358 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_MLDv1_OP_MASK
, mldv1_op
);
1359 if(retVal
!= RT_ERR_OK
)
1364 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_MLDv1_OP_MASK
, mldv1_op
);
1365 if(retVal
!= RT_ERR_OK
)
1373 * rtl8367c_getAsicMLDv1Opeartion
1375 * Get port-based MLDv1 Control packet action
1377 * port - port number
1379 * mldv1_op - MLDv1 control packet action
1381 * RT_ERR_OK - Success
1382 * RT_ERR_PORT_ID - Error PORT ID
1383 * RT_ERR_SMI - SMI access error
1387 ret_t
rtl8367c_getAsicMLDv1Opeartion(rtk_uint32 port
, rtk_uint32
*mldv1_op
)
1392 if(port
> RTL8367C_PORTIDMAX
)
1393 return RT_ERR_PORT_ID
;
1395 /* MLDv1 operation */
1398 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_MLDv1_OP_MASK
, &value
);
1399 if(retVal
!= RT_ERR_OK
)
1404 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_MLDv1_OP_MASK
, &value
);
1405 if(retVal
!= RT_ERR_OK
)
1415 * rtl8367c_setAsicMLDv2Opeartion
1417 * Set port-based MLDv2 Control packet action
1419 * port - port number
1420 * mldv2_op - MLDv2 control packet action
1424 * RT_ERR_OK - Success
1425 * RT_ERR_PORT_ID - Error PORT ID
1426 * RT_ERR_SMI - SMI access error
1430 ret_t
rtl8367c_setAsicMLDv2Opeartion(rtk_uint32 port
, rtk_uint32 mldv2_op
)
1434 if(port
> RTL8367C_PORTIDMAX
)
1435 return RT_ERR_PORT_ID
;
1437 if(mldv2_op
>= PROTOCOL_OP_END
)
1438 return RT_ERR_INPUT
;
1440 /* MLDv2 operation */
1443 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_MLDv2_OP_MASK
, mldv2_op
);
1444 if(retVal
!= RT_ERR_OK
)
1449 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_MLDv2_OP_MASK
, mldv2_op
);
1450 if(retVal
!= RT_ERR_OK
)
1458 * rtl8367c_getAsicMLDv2Opeartion
1460 * Get port-based MLDv2 Control packet action
1462 * port - port number
1464 * mldv2_op - MLDv2 control packet action
1466 * RT_ERR_OK - Success
1467 * RT_ERR_PORT_ID - Error PORT ID
1468 * RT_ERR_SMI - SMI access error
1472 ret_t
rtl8367c_getAsicMLDv2Opeartion(rtk_uint32 port
, rtk_uint32
*mldv2_op
)
1477 if(port
> RTL8367C_PORTIDMAX
)
1478 return RT_ERR_PORT_ID
;
1480 /* MLDv2 operation */
1483 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT0_CONTROL
+ port
, RTL8367C_IGMP_PORT0_CONTROL_MLDv2_OP_MASK
, &value
);
1484 if(retVal
!= RT_ERR_OK
)
1489 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT8_CONTROL
+ port
- 8, RTL8367C_IGMP_PORT0_CONTROL_MLDv2_OP_MASK
, &value
);
1490 if(retVal
!= RT_ERR_OK
)
1500 * rtl8367c_setAsicIGMPPortMAXGroup
1502 * Set per-port Max group number
1504 * port - Physical port number (0~7)
1505 * max_group - max IGMP group
1509 * RT_ERR_OK - Success
1510 * RT_ERR_SMI - SMI access error
1511 * RT_ERR_PORT_ID - Invalid port number
1512 * RT_ERR_OUT_OF_RANGE - input parameter out of range
1516 ret_t
rtl8367c_setAsicIGMPPortMAXGroup(rtk_uint32 port
, rtk_uint32 max_group
)
1520 if(port
> RTL8367C_PORTIDMAX
)
1521 return RT_ERR_PORT_ID
;
1523 if(max_group
> RTL8367C_IGMP_MAX_GOUP
)
1524 return RT_ERR_OUT_OF_RANGE
;
1528 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT01_MAX_GROUP
+ (port
/2), RTL8367C_PORT0_MAX_GROUP_MASK
<< (RTL8367C_PORT1_MAX_GROUP_OFFSET
* (port
%2)), max_group
);
1529 if(retVal
!= RT_ERR_OK
)
1534 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_PORT89_MAX_GROUP
+ (port
/2), RTL8367C_PORT0_MAX_GROUP_MASK
<< (RTL8367C_PORT1_MAX_GROUP_OFFSET
* (port
%2)), max_group
);
1535 if(retVal
!= RT_ERR_OK
)
1542 * rtl8367c_getAsicIGMPPortMAXGroup
1544 * Get per-port Max group number
1546 * port - Physical port number (0~7)
1547 * max_group - max IGMP group
1551 * RT_ERR_OK - Success
1552 * RT_ERR_SMI - SMI access error
1553 * RT_ERR_PORT_ID - Invalid port number
1557 ret_t
rtl8367c_getAsicIGMPPortMAXGroup(rtk_uint32 port
, rtk_uint32
*max_group
)
1562 if(port
> RTL8367C_PORTIDMAX
)
1563 return RT_ERR_PORT_ID
;
1567 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT01_MAX_GROUP
+ (port
/2), RTL8367C_PORT0_MAX_GROUP_MASK
<< (RTL8367C_PORT1_MAX_GROUP_OFFSET
* (port
%2)), &value
);
1568 if(retVal
!= RT_ERR_OK
)
1573 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT89_MAX_GROUP
+ (port
/2), RTL8367C_PORT0_MAX_GROUP_MASK
<< (RTL8367C_PORT1_MAX_GROUP_OFFSET
* (port
%2)), &value
);
1574 if(retVal
!= RT_ERR_OK
)
1582 * rtl8367c_getAsicIGMPPortCurrentGroup
1584 * Get per-port current group number
1586 * port - Physical port number (0~7)
1587 * current_group - current IGMP group
1591 * RT_ERR_OK - Success
1592 * RT_ERR_SMI - SMI access error
1593 * RT_ERR_PORT_ID - Invalid port number
1597 ret_t
rtl8367c_getAsicIGMPPortCurrentGroup(rtk_uint32 port
, rtk_uint32
*current_group
)
1602 if(port
> RTL8367C_PORTIDMAX
)
1603 return RT_ERR_PORT_ID
;
1607 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT01_CURRENT_GROUP
+ (port
/2), RTL8367C_PORT0_CURRENT_GROUP_MASK
<< (RTL8367C_PORT1_CURRENT_GROUP_OFFSET
* (port
%2)), &value
);
1608 if(retVal
!= RT_ERR_OK
)
1613 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_PORT89_CURRENT_GROUP
+ ((port
- 8)/2), RTL8367C_PORT0_CURRENT_GROUP_MASK
<< (RTL8367C_PORT1_CURRENT_GROUP_OFFSET
* (port
%2)), &value
);
1614 if(retVal
!= RT_ERR_OK
)
1618 *current_group
= value
;
1622 * rtl8367c_getAsicIGMPGroup
1626 * idx - Group index (0~255)
1632 * RT_ERR_OK - Success
1633 * RT_ERR_SMI - SMI access error
1634 * RT_ERR_OUT_OF_RANGE - Group index is out of range
1638 ret_t
rtl8367c_getAsicIGMPGroup(rtk_uint32 idx
, rtk_uint32
*valid
, rtl8367c_igmpgroup
*grp
)
1641 rtk_uint32 regAddr
, regData
;
1643 rtk_uint32 groupInfo
= 0;
1645 if(idx
> RTL8367C_IGMP_MAX_GOUP
)
1646 return RT_ERR_OUT_OF_RANGE
;
1648 /* Write ACS_ADR register for data bits */
1649 regAddr
= RTL8367C_TABLE_ACCESS_ADDR_REG
;
1651 retVal
= rtl8367c_setAsicReg(regAddr
, regData
);
1652 if(retVal
!= RT_ERR_OK
)
1655 /* Write ACS_CMD register */
1656 regAddr
= RTL8367C_TABLE_ACCESS_CTRL_REG
;
1657 regData
= RTL8367C_TABLE_ACCESS_REG_DATA(TB_OP_READ
, TB_TARGET_IGMP_GROUP
);
1658 retVal
= rtl8367c_setAsicRegBits(regAddr
, RTL8367C_TABLE_TYPE_MASK
| RTL8367C_COMMAND_TYPE_MASK
, regData
);
1659 if(retVal
!= RT_ERR_OK
)
1662 /* Read Data Bits */
1663 regAddr
= RTL8367C_TABLE_ACCESS_RDDATA_BASE
;
1664 for(i
= 0 ;i
<= 1; i
++)
1666 retVal
= rtl8367c_getAsicReg(regAddr
, ®Data
);
1667 if(retVal
!= RT_ERR_OK
)
1670 groupInfo
|= ((regData
& 0xFFFF) << (i
* 16));
1674 grp
->p0_timer
= groupInfo
& 0x00000007;
1675 grp
->p1_timer
= (groupInfo
>> 3) & 0x00000007;
1676 grp
->p2_timer
= (groupInfo
>> 6) & 0x00000007;
1677 grp
->p3_timer
= (groupInfo
>> 9) & 0x00000007;
1678 grp
->p4_timer
= (groupInfo
>> 12) & 0x00000007;
1679 grp
->p5_timer
= (groupInfo
>> 15) & 0x00000007;
1680 grp
->p6_timer
= (groupInfo
>> 18) & 0x00000007;
1681 grp
->p7_timer
= (groupInfo
>> 21) & 0x00000007;
1682 grp
->report_supp_flag
= (groupInfo
>> 24) & 0x00000001;
1683 grp
->p8_timer
= (groupInfo
>> 25) & 0x00000007;
1684 grp
->p9_timer
= (groupInfo
>> 28) & 0x00000007;
1685 grp
->p10_timer
= (groupInfo
>> 31) & 0x00000001;
1687 regAddr
= RTL8367C_TABLE_ACCESS_RDDATA_BASE
+ 2;
1688 retVal
= rtl8367c_getAsicReg(regAddr
, ®Data
);
1689 if(retVal
!= RT_ERR_OK
)
1692 grp
->p10_timer
|= (regData
& 0x00000003) << 1;
1695 retVal
= rtl8367c_getAsicReg(RTL8367C_IGMP_GROUP_USAGE_REG(idx
), ®Data
);
1696 if(retVal
!= RT_ERR_OK
)
1699 *valid
= ((regData
& (0x0001 << (idx
%16))) != 0) ? 1 : 0;
1704 * rtl8367c_setAsicIpMulticastPortIsoLeaky
1706 * Set IP multicast Port Isolation leaky
1708 * port - Physical port number (0~7)
1709 * enabled - 1: enabled, 0: disabled
1713 * RT_ERR_OK - Success
1714 * RT_ERR_SMI - SMI access error
1715 * RT_ERR_PORT_ID - Invalid port number
1719 ret_t
rtl8367c_setAsicIpMulticastPortIsoLeaky(rtk_uint32 port
, rtk_uint32 enabled
)
1723 if(port
> RTL8367C_PORTIDMAX
)
1724 return RT_ERR_PORT_ID
;
1726 retVal
= rtl8367c_setAsicRegBits(RTL8367C_IPMCAST_PORTISO_LEAKY_REG
, (0x0001 << port
), enabled
);
1727 if(retVal
!= RT_ERR_OK
)
1734 * rtl8367c_getAsicIpMulticastPortIsoLeaky
1736 * Get IP multicast Port Isolation leaky
1738 * port - Physical port number (0~7)
1739 * enabled - 1: enabled, 0: disabled
1743 * RT_ERR_OK - Success
1744 * RT_ERR_SMI - SMI access error
1748 ret_t
rtl8367c_getAsicIpMulticastPortIsoLeaky(rtk_uint32 port
, rtk_uint32
*enabled
)
1753 retVal
= rtl8367c_getAsicRegBits(RTL8367C_IPMCAST_PORTISO_LEAKY_REG
, (0x0001 << port
), ®Data
);
1754 if(retVal
!= RT_ERR_OK
)
1762 * rtl8367c_setAsicIGMPReportLeaveFlood
1764 * Set IGMP/MLD Report/Leave flood
1766 * flood - 0: Reserved, 1: flooding to router ports, 2: flooding to all ports, 3: flooding to router port or to all ports if there is no router port
1770 * RT_ERR_OK - Success
1771 * RT_ERR_SMI - SMI access error
1775 ret_t
rtl8367c_setAsicIGMPReportLeaveFlood(rtk_uint32 flood
)
1779 retVal
= rtl8367c_setAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG3
, RTL8367C_REPORT_LEAVE_FORWARD_MASK
, flood
);
1780 if(retVal
!= RT_ERR_OK
)
1787 * rtl8367c_getAsicIGMPReportLeaveFlood
1789 * Get IGMP/MLD Report/Leave flood
1793 * pflood - 0: Reserved, 1: flooding to router ports, 2: flooding to all ports, 3: flooding to router port or to all ports if there is no router port
1795 * RT_ERR_OK - Success
1796 * RT_ERR_SMI - SMI access error
1800 ret_t
rtl8367c_getAsicIGMPReportLeaveFlood(rtk_uint32
*pFlood
)
1805 retVal
= rtl8367c_getAsicRegBits(RTL8367C_REG_IGMP_MLD_CFG3
, RTL8367C_REPORT_LEAVE_FORWARD_MASK
, ®Data
);
1806 if(retVal
!= RT_ERR_OK
)
1814 * rtl8367c_setAsicIGMPDropLeaveZero
1816 * Set the function of droppping Leave packet with group IP = 0.0.0.0
1818 * drop - 1: Drop, 0:Bypass
1822 * RT_ERR_OK - Success
1823 * RT_ERR_SMI - SMI access error
1827 ret_t
rtl8367c_setAsicIGMPDropLeaveZero(rtk_uint32 drop
)
1831 retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG1
, RTL8367C_DROP_LEAVE_ZERO_OFFSET
, drop
);
1832 if(retVal
!= RT_ERR_OK
)
1839 * rtl8367c_getAsicIGMPDropLeaveZero
1841 * Get the function of droppping Leave packet with group IP = 0.0.0.0
1845 * pDrop - 1: Drop, 0:Bypass
1847 * RT_ERR_OK - Success
1848 * RT_ERR_SMI - SMI access error
1852 ret_t
rtl8367c_getAsicIGMPDropLeaveZero(rtk_uint32
*pDrop
)
1857 retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG1
, RTL8367C_DROP_LEAVE_ZERO_OFFSET
, ®Data
);
1858 if(retVal
!= RT_ERR_OK
)
1866 * rtl8367c_setAsicIGMPBypassStormCTRL
1868 * Set the function of bypass strom control for IGMP/MLD packet
1870 * bypass - 1: Bypass, 0:not bypass
1874 * RT_ERR_OK - Success
1875 * RT_ERR_SMI - SMI access error
1879 ret_t
rtl8367c_setAsicIGMPBypassStormCTRL(rtk_uint32 bypass
)
1883 retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_IGMP_MLD_DISCARD_STORM_FILTER_OFFSET
, bypass
);
1884 if(retVal
!= RT_ERR_OK
)
1891 * rtl8367c_getAsicIGMPBypassStormCTRL
1893 * Set the function of bypass strom control for IGMP/MLD packet
1897 * pBypass - 1: Bypass, 0:not bypass
1899 * RT_ERR_OK - Success
1900 * RT_ERR_SMI - SMI access error
1904 ret_t
rtl8367c_getAsicIGMPBypassStormCTRL(rtk_uint32
*pBypass
)
1909 retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_IGMP_MLD_DISCARD_STORM_FILTER_OFFSET
, ®Data
);
1910 if(retVal
!= RT_ERR_OK
)
1918 * rtl8367c_setAsicIGMPIsoLeaky
1920 * Set Port Isolation leaky for IGMP/MLD packet
1922 * leaky - 1: Leaky, 0:not leaky
1926 * RT_ERR_OK - Success
1927 * RT_ERR_SMI - SMI access error
1931 ret_t
rtl8367c_setAsicIGMPIsoLeaky(rtk_uint32 leaky
)
1935 retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_IGMP_MLD_PORTISO_LEAKY_OFFSET
, leaky
);
1936 if(retVal
!= RT_ERR_OK
)
1943 * rtl8367c_getAsicIGMPIsoLeaky
1945 * Get Port Isolation leaky for IGMP/MLD packet
1949 * pLeaky - 1: Leaky, 0:not leaky
1951 * RT_ERR_OK - Success
1952 * RT_ERR_SMI - SMI access error
1956 ret_t
rtl8367c_getAsicIGMPIsoLeaky(rtk_uint32
*pLeaky
)
1961 retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_IGMP_MLD_PORTISO_LEAKY_OFFSET
, ®Data
);
1962 if(retVal
!= RT_ERR_OK
)
1970 * rtl8367c_setAsicIGMPVLANLeaky
1972 * Set VLAN leaky for IGMP/MLD packet
1974 * leaky - 1: Leaky, 0:not leaky
1978 * RT_ERR_OK - Success
1979 * RT_ERR_SMI - SMI access error
1983 ret_t
rtl8367c_setAsicIGMPVLANLeaky(rtk_uint32 leaky
)
1987 retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_IGMP_MLD_VLAN_LEAKY_OFFSET
, leaky
);
1988 if(retVal
!= RT_ERR_OK
)
1995 * rtl8367c_getAsicIGMPVLANLeaky
1997 * Get VLAN leaky for IGMP/MLD packet
2001 * pLeaky - 1: Leaky, 0:not leaky
2003 * RT_ERR_OK - Success
2004 * RT_ERR_SMI - SMI access error
2008 ret_t
rtl8367c_getAsicIGMPVLANLeaky(rtk_uint32
*pLeaky
)
2013 retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG0
, RTL8367C_IGMP_MLD_VLAN_LEAKY_OFFSET
, ®Data
);
2014 if(retVal
!= RT_ERR_OK
)
2022 * rtl8367c_setAsicIGMPBypassGroup
2024 * Set IGMP/MLD Bypass group
2026 * bypassType - Bypass type
2031 * RT_ERR_OK - Success
2032 * RT_ERR_SMI - SMI access error
2036 ret_t
rtl8367c_setAsicIGMPBypassGroup(rtk_uint32 bypassType
, rtk_uint32 enabled
)
2043 case BYPASS_224_0_0_X
:
2044 offset
= RTL8367C_IGMP_MLD_IP4_BYPASS_224_0_0_OFFSET
;
2046 case BYPASS_224_0_1_X
:
2047 offset
= RTL8367C_IGMP_MLD_IP4_BYPASS_224_0_1_OFFSET
;
2049 case BYPASS_239_255_255_X
:
2050 offset
= RTL8367C_IGMP_MLD_IP4_BYPASS_239_255_255_OFFSET
;
2052 case BYPASS_IPV6_00XX
:
2053 offset
= RTL8367C_IGMP_MLD_IP6_BYPASS_OFFSET
;
2056 return RT_ERR_INPUT
;
2059 retVal
= rtl8367c_setAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG3
, offset
, enabled
);
2060 if(retVal
!= RT_ERR_OK
)
2067 * rtl8367c_getAsicIGMPBypassGroup
2069 * Get IGMP/MLD Bypass group
2071 * bypassType - Bypass type
2073 * pEnabled - enabled
2075 * RT_ERR_OK - Success
2076 * RT_ERR_SMI - SMI access error
2080 ret_t
rtl8367c_getAsicIGMPBypassGroup(rtk_uint32 bypassType
, rtk_uint32
*pEnabled
)
2087 case BYPASS_224_0_0_X
:
2088 offset
= RTL8367C_IGMP_MLD_IP4_BYPASS_224_0_0_OFFSET
;
2090 case BYPASS_224_0_1_X
:
2091 offset
= RTL8367C_IGMP_MLD_IP4_BYPASS_224_0_1_OFFSET
;
2093 case BYPASS_239_255_255_X
:
2094 offset
= RTL8367C_IGMP_MLD_IP4_BYPASS_239_255_255_OFFSET
;
2096 case BYPASS_IPV6_00XX
:
2097 offset
= RTL8367C_IGMP_MLD_IP6_BYPASS_OFFSET
;
2100 return RT_ERR_INPUT
;
2103 retVal
= rtl8367c_getAsicRegBit(RTL8367C_REG_IGMP_MLD_CFG3
, offset
, pEnabled
);
2104 if(retVal
!= RT_ERR_OK
)