openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

switch.c (19339B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      6  */
      7 #include <soc/debug.h>
      8 #include <soc/drv.h>
      9 #include <soc/mem.h>
     10 #include <bcm/switch.h>
     11 #include <bcm/error.h>
     12 #include <bcm_int/esw/switch.h>
     13 #include <bcm_int/esw/port.h>
     14 #if defined(BCM_GREYHOUND2_SUPPORT)
     15 #include <bcm_int/esw/greyhound2.h>
     16 #endif /* BCM_GREYHOUND2_SUPPORT */
     17 
     18 /* Helper routines for argument translation */
     19 
     20 static int
     21 _bool_invert(int unit, int arg, int set)
     22 {
     23     /* Same for both set/get */
     24     return !arg;
     25 }
     26 
     27 bcm_switch_binding_t greyhound_bindings[] =
     28 {
     29     { bcmSwitchOamHeaderErrorToCpu, 0, 
     30         CPU_CONTROL_Mr, OAM_HEADER_ERROR_TOCPUf,
     31         NULL, 0 },
     32     { bcmSwitchOamUnknownVersionToCpu, 0, 
     33         CPU_CONTROL_Mr, OAM_UNKNOWN_OPCODE_VERSION_TOCPUf,
     34         NULL, 0 },
     35     { bcmSwitchL3SrcBindFailToCpu, 0,
     36         CPU_CONTROL_Mr, MAC_BIND_FAILf,
     37         NULL, 0},
     38     { bcmSwitchOamUnknownVersionDrop, 0, 
     39         OAM_DROP_CONTROLr, OAM_UNKNOWN_OPCODE_VERSION_DROPf,
     40         NULL, 0},
     41     { bcmSwitchOamUnexpectedPktToCpu, 0,
     42         CPU_CONTROL_Mr, OAM_UNEXPECTED_PKT_TOCPUf,
     43         NULL, 0},
     44     { bcmSwitchOamCcmToCpu, 0,
     45         CCM_COPYTO_CPU_CONTROLr, ERROR_CCM_COPY_TOCPUf,
     46         NULL, 0},
     47     { bcmSwitchOamXconCcmToCpu, 0,
     48         CCM_COPYTO_CPU_CONTROLr, XCON_CCM_COPY_TOCPUf,
     49         NULL, 0},
     50     { bcmSwitchOamXconOtherToCpu, 0,
     51         CCM_COPYTO_CPU_CONTROLr, XCON_OTHER_COPY_TOCPUf,
     52         NULL, 0},
     53 
     54     { bcmSwitchSTPBlockedFieldBypass, 0,
     55         ING_MISC_CONFIG2r, BLOCKED_PORTS_FP_DISABLEf,
     56         NULL, 0 },
     57     { bcmSwitchRemoteLearnTrust, 0,
     58         ING_CONFIG_64r, IGNORE_HG_HDR_DONOT_LEARNf,
     59         _bool_invert, 0 },
     60     { bcmSwitchRemoteLearnTrust, 0,
     61         EGR_CONFIG_1r, IGNORE_HG_HDR_DONOT_LEARNf,
     62         _bool_invert, 0 },
     63     { bcmSwitchMldDirectAttachedOnly, 0,
     64         ING_CONFIG_64r, MLD_CHECKS_ENABLEf,
     65         NULL, soc_feature_igmp_mld_support },
     66     { bcmSwitchSharedVlanL2McastEnable, 0,
     67         ING_CONFIG_64r, LOOKUP_L2MC_WITH_FID_IDf,
     68         NULL, 0 },
     69     { bcmSwitchMldUcastEnable, 0,
     70         ING_CONFIG_64r, MLD_PKTS_UNICAST_IGNOREf,
     71         _bool_invert, soc_feature_igmp_mld_support },
     72     { bcmSwitchSharedVlanEnable, 0,
     73         ING_CONFIG_64r, SVL_ENABLEf,
     74         NULL, 0 },
     75     { bcmSwitchIgmpReservedMcastEnable, 0,
     76         ING_CONFIG_64r, IPV4_RESERVED_MC_ADDR_IGMP_ENABLEf,
     77         NULL, soc_feature_igmp_mld_support },
     78     { bcmSwitchMldReservedMcastEnable, 0,
     79         ING_CONFIG_64r, IPV6_RESERVED_MC_ADDR_MLD_ENABLEf,
     80         NULL, soc_feature_igmp_mld_support },
     81     { bcmSwitchIgmpUcastEnable, 0,
     82         ING_CONFIG_64r, IGMP_PKTS_UNICAST_IGNOREf,
     83         _bool_invert, soc_feature_igmp_mld_support },
     84     { bcmSwitchPortEgressBlockL3, 0,
     85         ING_CONFIG_64r, APPLY_EGR_MASK_ON_L3f,
     86         NULL, 0 },
     87     { bcmSwitchPortEgressBlockL2, 0,
     88         ING_CONFIG_64r, APPLY_EGR_MASK_ON_L2f,
     89         NULL, 0 },
     90     { bcmSwitchHgHdrExtLengthEnable, 0,
     91         ING_CONFIG_64r, IGNORE_HG_HDR_HDR_EXT_LENf,
     92         _bool_invert, 0 },
     93     { bcmSwitchIp4McastL2DestCheck, 0,
     94         ING_CONFIG_64r, IPV4_MC_MACDA_CHECK_ENABLEf,
     95         NULL, 0 },
     96     { bcmSwitchIp6McastL2DestCheck, 0,
     97         ING_CONFIG_64r, IPV6_MC_MACDA_CHECK_ENABLEf,
     98         NULL, 0 },
     99     { bcmSwitchMirrorStackMode, 0,
    100         ING_CONFIG_64r, STACK_MODEf,
    101         NULL, soc_feature_src_modid_blk },
    102     { bcmSwitchMirrorStackMode, 0,
    103         EGR_CONFIG_1r, STACK_MODEf,
    104         NULL, soc_feature_src_modid_blk },
    105     { bcmSwitchMirrorSrcModCheck, 0,
    106         ING_CONFIG_64r, FB_A0_COMPATIBLEf,
    107         NULL, soc_feature_src_modid_blk },
    108 
    109     { bcmSwitchDosAttackToCpu, 0,
    110         CPU_CONTROL_0r, DOSATTACK_TOCPUf,
    111         NULL, 0 },
    112     { bcmSwitchParityErrorToCpu, 0,
    113         CPU_CONTROL_0r, PARITY_ERR_TOCPUf,
    114         NULL, soc_feature_parity_err_tocpu },
    115     { bcmSwitchUnknownVlanToCpu, 0,
    116         CPU_CONTROL_0r, UVLAN_TOCPUf,
    117         NULL, 0 },
    118     { bcmSwitchSourceMacZeroDrop, 0,
    119         CPU_CONTROL_0r, MACSA_ALL_ZERO_DROPf,
    120         NULL, 0},
    121     { bcmSwitchSharedVlanMismatchToCpu, 0,
    122         CPU_CONTROL_0r, PVLAN_VID_MISMATCH_TOCPUf,
    123         NULL, 0 },
    124     { bcmSwitchForceForwardFabricTrunk, 0,
    125         ING_MISC_CONFIGr, LOCAL_SW_DISABLE_HGTRUNK_RES_ENf,
    126         NULL, 0 },
    127     { bcmSwitchFieldMultipathHashSeed, 0,
    128         FP_ECMP_HASH_CONTROLr, ECMP_HASH_SALTf,
    129         NULL, 0 },
    130     { bcmSwitchCpuToCpuEnable, 0,
    131         ING_MISC_CONFIGr, DO_NOT_COPY_FROM_CPU_TO_CPUf,
    132         _bool_invert, 0 },
    133 
    134     { bcmSwitchStationMoveOverLearnLimitToCpu, 0,
    135         CPU_CONTROL_1r, MACLMT_STNMV_TOCPUf,
    136         NULL, soc_feature_mac_learn_limit },
    137 
    138     { bcmSwitchBpduInvalidVlanDrop, 0,
    139         EGR_CONFIG_1r, BPDU_INVALID_VLAN_DROPf,
    140         NULL, soc_feature_igmp_mld_support },
    141     { bcmSwitchMirrorInvalidVlanDrop, 0,
    142         EGR_CONFIG_1r, MIRROR_INVALID_VLAN_DROPf,
    143         NULL, soc_feature_igmp_mld_support },
    144     { bcmSwitchMcastFloodBlocking, 0,
    145         IGMP_MLD_PKT_CONTROLr, PFM_RULE_APPLYf,
    146         NULL, soc_feature_igmp_mld_support },
    147 
    148     { bcmSwitchIpmcTtl1ToCpu, 0,
    149         CPU_CONTROL_1r, IPMC_TTL1_ERR_TOCPUf,
    150         NULL, 0 },
    151     { bcmSwitchL3UcastTtl1ToCpu, 0,
    152         CPU_CONTROL_1r, L3UC_TTL1_ERR_TOCPUf,
    153         NULL, 0 },
    154     { bcmSwitchDhcpLearn, 0,
    155         ING_MISC_CONFIG2r, DO_NOT_LEARN_DHCPf,
    156         NULL, 0 },
    157     { bcmSwitchUnknownIpmcAsMcast, 0,
    158         ING_MISC_CONFIG2r, IPMC_MISS_AS_L2MCf,
    159         NULL, 0 },
    160 
    161     { bcmSwitchMcastUnknownErrToCpu, 0,
    162         CPU_CONTROL_1r, MC_INDEX_ERROR_TOCPUf,
    163         NULL, 0 },
    164 
    165     { bcmSwitchDosAttackMACSAEqualMACDA, 0,
    166         DOS_CONTROLr, MACSA_EQUALS_MACDA_DROPf,
    167         NULL, soc_feature_enhanced_dos_ctrl },
    168     { bcmSwitchDosAttackFlagZeroSeqZero, 0,
    169         DOS_CONTROLr, TCP_FLAGS_CTRL0_SEQ0_ENABLEf,
    170         NULL, 0 },
    171     { bcmSwitchDosAttackSynFrag, 0,
    172         DOS_CONTROLr, TCP_FLAGS_SYN_FRAG_ENABLEf,
    173         NULL, 0},
    174     { bcmSwitchDosAttackIcmp, 0,
    175         DOS_CONTROL_2r, ICMP_V4_PING_SIZE_ENABLEf,
    176         NULL, 0 },
    177     { bcmSwitchDosAttackIcmp, 0,
    178         DOS_CONTROL_2r, ICMP_V6_PING_SIZE_ENABLEf,
    179         NULL, 0 },
    180     { bcmSwitchDosAttackIcmpV4, 0,
    181         DOS_CONTROL_2r, ICMP_V4_PING_SIZE_ENABLEf,
    182         NULL, 0 },
    183     { bcmSwitchDosAttackIcmpV6, 0,
    184         DOS_CONTROL_2r, ICMP_V6_PING_SIZE_ENABLEf,
    185         NULL, 0 },
    186     { bcmSwitchDosAttackIcmpFragments, 0,
    187         DOS_CONTROL_2r, ICMP_FRAG_PKTS_ENABLEf,
    188         NULL, soc_feature_enhanced_dos_ctrl },
    189     { bcmSwitchDosAttackTcpOffset, 0,
    190         DOS_CONTROL_2r, TCP_HDR_OFFSET_EQ1_ENABLEf,
    191         NULL, soc_feature_enhanced_dos_ctrl },
    192     { bcmSwitchDosAttackUdpPortsEqual, 0,
    193         DOS_CONTROL_2r, UDP_SPORT_EQ_DPORT_ENABLEf,
    194         NULL, soc_feature_enhanced_dos_ctrl },
    195     { bcmSwitchDosAttackTcpPortsEqual, 0,
    196         DOS_CONTROL_2r, TCP_SPORT_EQ_DPORT_ENABLEf,
    197         NULL, soc_feature_enhanced_dos_ctrl },
    198     { bcmSwitchDosAttackTcpFlagsSF, 0,
    199         DOS_CONTROL_2r, TCP_FLAGS_SYN_FIN_ENABLEf,
    200         NULL, soc_feature_enhanced_dos_ctrl },
    201     { bcmSwitchDosAttackTcpFlagsFUP, 0,
    202         DOS_CONTROL_2r, TCP_FLAGS_FIN_URG_PSH_SEQ0_ENABLEf,
    203         NULL, soc_feature_enhanced_dos_ctrl },
    204     { bcmSwitchDosAttackTcpHdrPartial, 0,
    205         DOS_CONTROL_2r, TCP_HDR_PARTIAL_ENABLEf,
    206         NULL, soc_feature_enhanced_dos_ctrl },
    207     { bcmSwitchDosAttackIcmpPktOversize, 0,
    208         DOS_CONTROLr, BIG_ICMP_PKT_SIZEf,
    209         NULL, 0 },
    210     { bcmSwitchDosAttackIcmpV6PingSize, 0,
    211         DOS_CONTROL_2r, BIG_ICMPV6_PKT_SIZEf,
    212         NULL, soc_feature_big_icmpv6_ping_check },
    213     { bcmSwitchDosAttackMinTcpHdrSize, 0,
    214         DOS_CONTROLr, MIN_TCPHDR_SIZEf,
    215         NULL, 0 },
    216 
    217     { bcmSwitchSrcModBlockMirrorCopy, 0,
    218         MIRROR_CONTROLr, SRC_MODID_BLOCK_MIRROR_COPYf,
    219         NULL, soc_feature_src_modid_blk },
    220     { bcmSwitchSrcModBlockMirrorOnly, 0,
    221         MIRROR_CONTROLr, SRC_MODID_BLOCK_MIRROR_ONLY_PKTf,
    222         NULL, soc_feature_src_modid_blk },
    223 
    224     { bcmSwitchDestPortHGTrunk, 0,
    225         ING_MISC_CONFIGr, USE_DEST_PORTf,
    226         NULL, soc_feature_port_trunk_index },
    227 
    228     { bcmSwitchMirrorUnmarked, 0,
    229         EGR_CONFIG_1r, RING_MODEf,
    230         _bool_invert, 0 },
    231     { bcmSwitchEgressBlockUcast, 0,
    232         ING_MISC_CONFIGr, APPLY_EGR_MASK_ON_UC_ONLYf,
    233         NULL, soc_feature_egress_blk_ucast_override },
    234     { bcmSwitchSourceModBlockUcast, 0,
    235         ING_MISC_CONFIGr, APPLY_SRCMOD_BLOCK_ON_UC_ONLYf,
    236         NULL, soc_feature_src_modid_blk_ucast_override },
    237     { bcmSwitchHgHdrMcastFloodOverride, 0,
    238         EGR_CONFIG_1r, FORCE_STATIC_MH_PFMf,
    239         NULL, soc_feature_static_pfm },
    240 
    241     { bcmSwitchHgHdrErrToCpu, 0,
    242         CPU_CONTROL_1r, HG_HDR_ERROR_TOCPUf,
    243         NULL, soc_feature_cpu_proto_prio},
    244     { bcmSwitchClassTagPacketsToCpu, 0,
    245         CPU_CONTROL_1r, HG_HDR_TYPE1_TOCPUf,
    246         NULL, soc_feature_cpu_proto_prio},
    247     { bcmSwitchSourceModBlockControlOpcode, 0,
    248         ING_MISC_CONFIGr, DO_NOT_APPLY_SRCMOD_BLOCK_ON_SCf,
    249         _bool_invert, soc_feature_src_modid_blk_opcode_override },
    250     { bcmSwitchUnknownMcastToCpu, 0,
    251     	CPU_CONTROL_1r, UMC_TOCPUf,
    252         NULL, 0 },
    253     { bcmSwitchUnknownUcastToCpu, 0,
    254     	CPU_CONTROL_1r, UUCAST_TOCPUf,
    255         NULL, 0 },
    256     { bcmSwitchL2StaticMoveToCpu, 0,
    257     	CPU_CONTROL_1r, STATICMOVE_TOCPUf,
    258         NULL, 0 },
    259     { bcmSwitchL3HeaderErrToCpu, 0, /* compat */
    260     	CPU_CONTROL_1r, V4L3ERR_TOCPUf,
    261         NULL, 0 },
    262     { bcmSwitchUnknownL3SrcToCpu, 0,
    263 	    CPU_CONTROL_1r, UNRESOLVEDL3SRC_TOCPUf,
    264         NULL, 0 },
    265     { bcmSwitchUnknownL3DestToCpu, 0, /* compat */
    266     	CPU_CONTROL_1r, V4L3DSTMISS_TOCPUf,
    267         NULL, 0 },
    268     { bcmSwitchIpmcPortMissToCpu, 0,
    269     	CPU_CONTROL_1r, IPMCPORTMISS_TOCPUf,
    270         NULL, 0 },
    271     { bcmSwitchIpmcErrorToCpu, 0,
    272     	CPU_CONTROL_1r, IPMCERR_TOCPUf,
    273         NULL, 0 },
    274     { bcmSwitchL2NonStaticMoveToCpu, 0,
    275 	    CPU_CONTROL_1r, NONSTATICMOVE_TOCPUf,
    276         NULL, 0 },
    277     { bcmSwitchV6L3ErrToCpu, 0,
    278      	CPU_CONTROL_1r, V6L3ERR_TOCPUf,
    279         NULL, 0 },
    280     { bcmSwitchV6L3DstMissToCpu, 0,
    281 	    CPU_CONTROL_1r, V6L3DSTMISS_TOCPUf,
    282         NULL, 0 },
    283     { bcmSwitchV4L3ErrToCpu, 0,
    284     	CPU_CONTROL_1r, V4L3ERR_TOCPUf,
    285         NULL, 0 },
    286     { bcmSwitchV4L3DstMissToCpu, 0,
    287     	CPU_CONTROL_1r, V4L3DSTMISS_TOCPUf,
    288         NULL, 0 },
    289     { bcmSwitchTunnelErrToCpu, 0,
    290     	CPU_CONTROL_1r, TUNNEL_ERR_TOCPUf,
    291         NULL, 0 },
    292     { bcmSwitchMartianAddrToCpu, 0,
    293      	CPU_CONTROL_1r, MARTIAN_ADDR_TOCPUf,
    294         NULL, 0 },
    295     { bcmSwitchL3UcTtlErrToCpu, 0,
    296     	CPU_CONTROL_1r, L3UC_TTL_ERR_TOCPUf,
    297         NULL, 0 },
    298     { bcmSwitchL3SlowpathToCpu, 0,
    299     	CPU_CONTROL_1r, L3_SLOWPATH_TOCPUf,
    300         NULL, 0 },
    301     { bcmSwitchIpmcTtlErrToCpu, 0,
    302     	CPU_CONTROL_1r, IPMC_TTL_ERR_TOCPUf,
    303         NULL, 0 },
    304     { bcmSwitchSampleIngressRandomSeed, 0,
    305 	    SFLOW_ING_RAND_SEEDr, SEEDf,
    306         NULL, 0 },
    307     { bcmSwitchSampleEgressRandomSeed, 0,
    308     	SFLOW_EGR_RAND_SEEDr, SEEDf,
    309         NULL, 0 },
    310     { bcmSwitchArpReplyToCpu, 0,
    311 	    PROTOCOL_PKT_CONTROLr, ARP_REPLY_TO_CPUf,
    312         NULL, 0 },
    313     { bcmSwitchArpReplyDrop, 0,
    314     	PROTOCOL_PKT_CONTROLr, ARP_REPLY_DROPf,
    315         NULL, 0 },
    316     { bcmSwitchArpRequestToCpu, 0,
    317     	PROTOCOL_PKT_CONTROLr, ARP_REQUEST_TO_CPUf,
    318         NULL, 0 },
    319     { bcmSwitchArpRequestDrop, 0,
    320     	PROTOCOL_PKT_CONTROLr, ARP_REQUEST_DROPf,
    321         NULL, 0 },
    322     { bcmSwitchNdPktToCpu, 0,
    323     	PROTOCOL_PKT_CONTROLr, ND_PKT_TO_CPUf,
    324         NULL, 0 },
    325     { bcmSwitchNdPktDrop, 0,
    326     	PROTOCOL_PKT_CONTROLr, ND_PKT_DROPf,
    327         NULL, 0 },
    328     { bcmSwitchDhcpPktToCpu, 0,
    329         PROTOCOL_PKT_CONTROLr, DHCP_PKT_TO_CPUf,
    330         NULL, 0 },
    331     { bcmSwitchDhcpPktDrop, 0,
    332         PROTOCOL_PKT_CONTROLr, DHCP_PKT_DROPf,
    333         NULL, 0 },
    334     { bcmSwitchDosAttackSipEqualDip, 0,
    335         DOS_CONTROLr, DROP_IF_SIP_EQUALS_DIPf,
    336         NULL, 0 },
    337     { bcmSwitchDosAttackV4FirstFrag, 0,
    338         DOS_CONTROLr, IPV4_FIRST_FRAG_CHECK_ENABLEf,
    339         NULL, 0 },
    340     { bcmSwitchNonIpL3ErrToCpu, 0,
    341         CPU_CONTROL_1r, NIP_L3ERR_TOCPUf,
    342         NULL, soc_feature_nip_l3_err_tocpu },
    343     { bcmSwitchSourceRouteToCpu, 0,
    344 	    CPU_CONTROL_1r, SRCROUTE_TOCPUf,
    345         NULL, 0 },
    346 
    347     { bcmSwitchL3MtuFailToCpu, 0,
    348         CPU_CONTROL_1r, L3_MTU_FAIL_TOCPUf,
    349         NULL, soc_feature_l3mtu_fail_tocpu },
    350     { bcmSwitchIpmcSameVlanL3Route, 0,
    351         EGR_CONFIG_1r, IPMC_ROUTE_SAME_VLANf,
    352         NULL, soc_feature_l3},
    353     { bcmSwitchIpmcSameVlanPruning, 0,
    354     	MISCCONFIGr, IPMC_IND_MODEf,
    355         _bool_invert, 0 },
    356 
    357     { bcmSwitchPrioDropToCpu, 0,
    358         CPU_CONTROL_0r, DOT1P_ADMITTANCE_DROP_TOCPUf,
    359         NULL, soc_feature_niv},
    360     { bcmSwitchNivPrioDropToCpu, 0,
    361         CPU_CONTROL_0r, DOT1P_ADMITTANCE_DROP_TOCPUf,
    362         NULL, soc_feature_niv},
    363     { bcmSwitchNivInterfaceMissToCpu, 0,
    364         CPU_CONTROL_0r, NIV_FORWARDING_DROP_TOCPUf,
    365         NULL, soc_feature_niv},
    366     { bcmSwitchNivRpfFailToCpu, 0,
    367         CPU_CONTROL_0r, NIV_RPF_CHECK_FAIL_TOCPUf,
    368         NULL, soc_feature_niv},
    369     { bcmSwitchNivTagInvalidToCpu, 0,
    370         CPU_CONTROL_0r, VNTAG_FORMAT_DROP_TOCPUf,
    371         NULL, soc_feature_niv},
    372     { bcmSwitchNivTagDropToCpu, 0,
    373         CPU_CONTROL_0r, DISCARD_VNTAG_PRESENT_TOCPUf,
    374         NULL, soc_feature_niv},
    375     { bcmSwitchNivUntagDropToCpu, 0,
    376         CPU_CONTROL_0r, DISCARD_VNTAG_NOT_PRESENT_TOCPUf,
    377         NULL, soc_feature_niv},
    378     { bcmSwitchV6L3LocalLinkDrop, 0,
    379         ING_MISC_CONFIG2r, IPV6_SIP_LINK_LOCAL_DROPf,
    380         NULL, 0},
    381 
    382     { bcmSwitchExtenderInterfaceMissToCpu, 0,
    383         CPU_CONTROL_0r, NIV_FORWARDING_DROP_TOCPUf,
    384         NULL, soc_feature_port_extension},
    385     { bcmSwitchExtenderRpfFailToCpu, 0,
    386         CPU_CONTROL_0r, NIV_RPF_CHECK_FAIL_TOCPUf,
    387         NULL, soc_feature_port_extension},
    388     { bcmSwitchEtagDropToCpu, 0,
    389         CPU_CONTROL_0r, DISCARD_VNTAG_PRESENT_TOCPUf,
    390         NULL, soc_feature_port_extension},
    391     { bcmSwitchNonEtagDropToCpu, 0,
    392         CPU_CONTROL_0r, DISCARD_VNTAG_NOT_PRESENT_TOCPUf,
    393         NULL, soc_feature_port_extension},
    394 
    395     { bcmSwitchL3SrcBindMissToCpu, 0,
    396         CPU_CONTROL_Mr, MAC_IP_BIND_LOOKUP_MISS_TOCPUf,
    397         NULL, 0},
    398     { bcmSwitchTimesyncUnknownVersionToCpu, 0,
    399         CPU_CONTROL_Mr, UNKNOWN_1588_VERSION_TO_CPUf,
    400         NULL, 0},
    401     { bcmSwitchTimesyncIngressVersion, 0,
    402         ING_1588_PARSING_CONTROLr, VERSION_CONTROLf,
    403         NULL, 0},
    404     { bcmSwitchTimesyncEgressVersion, 0,
    405         EGR_1588_PARSING_CONTROLr, VERSION_CONTROLf,
    406         NULL, 0},
    407     { bcmSwitchProxySrcKnockout, 0,
    408         IHG_LOOKUPr, REMOVE_MH_SRC_PORTf,
    409         NULL, soc_feature_proxy_port_property},
    410     { bcmSwitchDosAttackV6MinFragEnable, 0,
    411         DOS_CONTROL_2r, IPV6_MIN_FRAG_SIZE_ENABLEf,
    412         NULL, soc_feature_enhanced_dos_ctrl},
    413     { bcmSwitchDosAttackV6MinFragSize, 0,
    414         IPV6_MIN_FRAG_SIZEr, PKT_LENGTHf,
    415         NULL, soc_feature_enhanced_dos_ctrl},
    416 
    417     { bcmSwitchL3InterfaceUrpfEnable, 0,
    418         ING_CONFIG_64r, L3IIF_URPF_SELECTf,
    419         NULL, soc_feature_urpf},
    420     { bcmSwitchL3UrpfFailToCpu, 0,
    421         CPU_CONTROL_1r, URPF_MISS_TOCPUf,
    422         NULL, soc_feature_urpf},
    423     { bcmSwitchL3UrpfRouteEnable, 0,
    424         L3_DEFIP_RPF_CONTROLr, DEFIP_RPF_ENABLEf,
    425         NULL, soc_feature_urpf},
    426 
    427     { bcmSwitchMimlEncapInnerEthertype, 0,
    428         EGR_MIML_ETHERTYPEr, ETHERTYPEf,
    429         NULL, soc_feature_miml},
    430     { bcmSwitchSTPDisabledFieldBypass, 0,
    431         ING_MISC_CONFIG2r, DISABLED_PORTS_FP_DISABLEf,
    432         NULL, 0 },
    433 };
    434 
    435 
    436 int
    437 _bcm_gh_switch_control_port_binding_set(int unit,
    438                                 bcm_port_t port,
    439                                 bcm_switch_control_t type,
    440                                 int arg, int *found)
    441 {
    442     uint64 oval64, val64;
    443     int i;
    444     bcm_switch_binding_t *b;
    445     uint32 max;
    446     int fval, fwidth, prt, idx;
    447 
    448     *found = 0;
    449     for (i = 0; i < COUNTOF(greyhound_bindings); i++) {
    450         b = &greyhound_bindings[i];
    451         if (b->type == type) {
    452             /* We don't check the b->chip here since the table is specific for Greyhound*/
    453             if (b->feature && !soc_feature(unit, b->feature)) {
    454                 continue;
    455             }
    456             if (!soc_reg_field_valid(unit, b->reg, b->field)) {
    457                 continue;
    458             }
    459             if (b->xlate_arg) {
    460                 if ((fval = (b->xlate_arg)(unit, arg, 1)) < 0) {
    461                     return fval;
    462                 }
    463             } else {
    464                 fval = arg;
    465             }
    466             /* Negative values should be treated as errors */
    467             if (fval < 0) {
    468                 return BCM_E_PARAM;
    469             }
    470             if ((b->reg == PROTOCOL_PKT_CONTROLr) ||
    471                 (b->reg == IGMP_MLD_PKT_CONTROLr)) {
    472                 int index;
    473 
    474                 BCM_IF_ERROR_RETURN
    475                     (_bcm_esw_port_tab_get(unit, port, 
    476                     PROTOCOL_PKT_INDEXf, &index));
    477                 prt = index;
    478                 idx = 0;
    479             } else {
    480                 prt = port;
    481                 idx = 0;
    482             }
    483 
    484             fwidth = soc_reg_field_length(unit, b->reg, b->field);
    485             if (fwidth < 32) {
    486                 max = (1 << fwidth) - 1;
    487             } else {
    488                 max = -1;
    489             }
    490             SOC_IF_ERROR_RETURN(soc_reg_get(unit, b->reg, prt, idx, &val64));
    491             oval64 = val64;
    492             soc_reg64_field32_set(unit, b->reg, &val64, b->field,
    493                                 ((uint32)fval > max) ? max : (uint32)fval);
    494             if (COMPILER_64_NE(val64, oval64)) {
    495                 SOC_IF_ERROR_RETURN(soc_reg_set(unit, b->reg, prt, idx, val64));
    496             }
    497 
    498             *found = 1;
    499         }
    500     }
    501     return BCM_E_NONE;
    502 }
    503                                     
    504 
    505 
    506 int
    507 _bcm_gh_switch_control_port_binding_get(int unit,
    508                                 bcm_port_t port,
    509                                 bcm_switch_control_t type,
    510                                 int *arg, int *found)
    511 {
    512     uint64 val64;
    513     int i;
    514     bcm_switch_binding_t *b;
    515     int prt, idx;
    516 
    517     *found = 0;
    518 
    519     for (i = 0; i < COUNTOF(greyhound_bindings); i++) {
    520         b = &greyhound_bindings[i];
    521         if (b->type == type) {
    522             if (b->feature && !soc_feature(unit, b->feature)) {
    523                 continue;
    524             }
    525             if (!SOC_REG_IS_VALID(unit, b->reg)) {
    526                 continue;
    527             }
    528 
    529             if (!soc_reg_field_valid(unit, b->reg, b->field)) {
    530                 continue;
    531             }
    532             if ((b->reg == PROTOCOL_PKT_CONTROLr) ||
    533                 (b->reg == IGMP_MLD_PKT_CONTROLr)) {
    534                 int index;
    535 
    536                 BCM_IF_ERROR_RETURN
    537                     (_bcm_esw_port_tab_get(unit, port, 
    538                     PROTOCOL_PKT_INDEXf, &index));
    539                 prt = index;
    540                 idx = 0;
    541             } else {
    542                 prt = port;
    543                 idx = 0;
    544             }                
    545             SOC_IF_ERROR_RETURN(soc_reg_get(unit, b->reg, prt, idx, &val64));
    546             *arg = soc_reg64_field32_get(unit, b->reg, val64, b->field);
    547 
    548             if (b->xlate_arg) {
    549                 *arg = (b->xlate_arg)(unit, *arg, 0);
    550             }
    551             *found = 1;
    552             break;
    553         }
    554     }
    555     return BCM_E_NONE;
    556 }
    557 
    558                                 
    559