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 (30599B)


      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 
     15 #if defined(BCM_TOMAHAWK2_SUPPORT)
     16 
     17 /* Helper routines for argument translation */
     18 
     19 static int
     20 _bool_invert(int unit, int arg, int set)
     21 {
     22     /* Same for both set/get */
     23     return !arg;
     24 }
     25 
     26 bcm_switch_binding_t tomahawk2_bindings[] =
     27 {
     28     { bcmSwitchL3SrcBindFailToCpu, 0,
     29         CPU_CONTROL_Mr, MAC_BIND_FAILf,
     30         NULL, 0},
     31     { bcmSwitchTunnelIp4IdShared, 0,
     32         EGR_TUNNEL_ID_MASKr, SHARED_FRAG_ID_ENABLEf,
     33         NULL, 0},
     34     { bcmSwitchL3InterfaceUrpfEnable, 0,
     35        ING_CONFIG_64r, L3IIF_URPF_SELECTf,
     36         NULL, soc_feature_urpf },
     37     { bcmSwitchClassBasedMoveFailPktToCpu, 0,
     38         CPU_CONTROL_1r, CLASS_BASED_SM_PREVENTED_TOCPUf,
     39         NULL, soc_feature_class_based_learning },
     40     { bcmSwitchL3UrpfFailToCpu,            0,
     41         CPU_CONTROL_1r, URPF_MISS_TOCPUf,
     42         NULL, soc_feature_urpf },
     43     { bcmSwitchClassBasedMoveFailPktDrop,  0,
     44         ING_MISC_CONFIG2r, CLASS_BASED_SM_PREVENTED_DROPf,
     45         NULL, soc_feature_class_based_learning },
     46     { bcmSwitchSTPBlockedFieldBypass,      0,
     47         ING_MISC_CONFIG2r, BLOCKED_PORTS_FP_DISABLEf,
     48         NULL, 0},
     49     { bcmSwitchRateLimitLinear,            0,
     50         MISCCONFIGr, ITU_MODE_SELf,
     51         _bool_invert, 0},
     52     { bcmSwitchRemoteLearnTrust,           0,
     53         ING_CONFIG_64r, IGNORE_HG_HDR_DONOT_LEARNf,
     54         _bool_invert, 0 },
     55     { bcmSwitchMldDirectAttachedOnly,      0,
     56         ING_CONFIG_64r, MLD_CHECKS_ENABLEf,
     57         NULL, soc_feature_igmp_mld_support },
     58     { bcmSwitchSharedVlanL2McastEnable,    0,
     59         ING_CONFIG_64r, LOOKUP_L2MC_WITH_FID_IDf,
     60         NULL, 0},
     61     { bcmSwitchMldUcastEnable,             0,
     62         ING_CONFIG_64r, MLD_PKTS_UNICAST_IGNOREf,
     63         _bool_invert, soc_feature_igmp_mld_support },
     64     { bcmSwitchSharedVlanEnable, 0,
     65         ING_CONFIG_64r, SVL_ENABLEf,
     66         NULL, 0},
     67     { bcmSwitchIgmpReservedMcastEnable,    0,
     68         ING_CONFIG_64r, IPV4_RESERVED_MC_ADDR_IGMP_ENABLEf,
     69         NULL, soc_feature_igmp_mld_support },
     70     { bcmSwitchMldReservedMcastEnable,     0,
     71         ING_CONFIG_64r, IPV6_RESERVED_MC_ADDR_MLD_ENABLEf,
     72         NULL, soc_feature_igmp_mld_support },
     73     { bcmSwitchIgmpUcastEnable,            0,
     74         ING_CONFIG_64r, IGMP_PKTS_UNICAST_IGNOREf,
     75         _bool_invert, soc_feature_igmp_mld_support },
     76     { bcmSwitchPortEgressBlockL3,          0,
     77         ING_CONFIG_64r, APPLY_EGR_MASK_ON_L3f,
     78         NULL, 0},
     79     { bcmSwitchPortEgressBlockL2,          0,
     80         ING_CONFIG_64r, APPLY_EGR_MASK_ON_L2f,
     81         NULL, 0},
     82     { bcmSwitchHgHdrExtLengthEnable,       0,
     83         ING_CONFIG_64r, IGNORE_HG_HDR_HDR_EXT_LENf,
     84         _bool_invert, 0 },
     85     { bcmSwitchIp4McastL2DestCheck,        0,
     86         ING_CONFIG_64r, IPV4_MC_MACDA_CHECK_ENABLEf,
     87         NULL, 0},
     88     { bcmSwitchIp6McastL2DestCheck,        0,
     89         ING_CONFIG_64r, IPV6_MC_MACDA_CHECK_ENABLEf,
     90         NULL, 0},
     91     { bcmSwitchL3TunnelUrpfMode,           0,
     92         ING_CONFIG_64r, TUNNEL_URPF_MODEf,
     93         NULL, soc_feature_urpf },
     94     { bcmSwitchL3TunnelUrpfDefaultRoute,   0,
     95         ING_CONFIG_64r, TUNNEL_URPF_DEFAULTROUTECHECKf,
     96         _bool_invert, soc_feature_urpf },
     97     { bcmSwitchMirrorStackMode, 0,
     98         ING_CONFIG_64r, STACK_MODEf,
     99         NULL, soc_feature_src_modid_blk },
    100     { bcmSwitchDirectedMirroring, 0,
    101         ING_CONFIG_64r, DRACO1_5_MIRRORf,
    102         _bool_invert, soc_feature_xgs1_mirror },
    103     { bcmSwitchMirrorSrcModCheck, 0,
    104         ING_CONFIG_64r, FB_A0_COMPATIBLEf,
    105         NULL, soc_feature_src_modid_blk },
    106     { bcmSwitchProxySrcKnockout, 0,
    107         IHG_LOOKUPr, REMOVE_MH_SRC_PORTf,
    108         NULL, soc_feature_proxy_port_property },
    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     { bcmSwitchMplsSequenceErrToCpu, 0,
    122         ING_MISC_CONFIGr, MPLS_SEQ_NUM_FAIL_TOCPUf,
    123         NULL, 0},
    124     { bcmSwitchMplsLabelMissToCpu, 0,
    125         CPU_CONTROL_Mr, MPLS_LABEL_MISSf,
    126         NULL, 0},
    127     { bcmSwitchMplsTtlErrToCpu, 0,
    128         CPU_CONTROL_Mr, MPLS_TTL_CHECK_FAILf,
    129         NULL, 0},
    130     { bcmSwitchMplsInvalidL3PayloadToCpu, 0,
    131         CPU_CONTROL_Mr, MPLS_INVALID_PAYLOADf,
    132         NULL, 0},
    133     { bcmSwitchMplsInvalidActionToCpu, 0,
    134         CPU_CONTROL_Mr, MPLS_INVALID_ACTIONf,
    135         NULL, 0},
    136     { bcmSwitchSharedVlanMismatchToCpu, 0,
    137         CPU_CONTROL_0r, PVLAN_VID_MISMATCH_TOCPUf ,
    138         NULL, 0},
    139     { bcmSwitchForceForwardFabricTrunk, 0,
    140         ING_MISC_CONFIGr, LOCAL_SW_DISABLE_HGTRUNK_RES_ENf,
    141         NULL, 0},
    142     { bcmSwitchFieldMultipathHashSeed, 0,
    143         FP_ECMP_HASH_CONTROLr, ECMP_HASH_SALTf,
    144         NULL, 0},
    145     { bcmSwitchMplsPortIndependentLowerRange1, 0,
    146         GLOBAL_MPLS_RANGE_1_LOWERr, LABELf,
    147         NULL, 0},
    148     { bcmSwitchMplsPortIndependentUpperRange1, 0,
    149         GLOBAL_MPLS_RANGE_1_UPPERr, LABELf,
    150         NULL, 0},
    151     { bcmSwitchMplsPortIndependentLowerRange2, 0,
    152        GLOBAL_MPLS_RANGE_2_LOWERr, LABELf,
    153        NULL, 0},
    154     { bcmSwitchMplsPortIndependentUpperRange2, 0,
    155         GLOBAL_MPLS_RANGE_2_UPPERr, LABELf,
    156         NULL, 0},
    157     { bcmSwitchL3UrpfRouteEnableExternal, 0,
    158        L3_DEFIP_RPF_CONTROLr, DEFIP_RPF_ENABLEf,
    159        NULL, soc_feature_urpf},
    160     { bcmSwitchMplsPWControlWordToCpu, 0,
    161        ING_MISC_CONFIGr, PWACH_TOCPUf,
    162        NULL, soc_feature_mpls},
    163     { bcmSwitchMplsPWControlTypeToCpu, 0,
    164        ING_MISC_CONFIGr, OTHER_CW_TYPE_TOCPUf,
    165        NULL, soc_feature_mpls},
    166     { bcmSwitchCpuToCpuEnable, 0,
    167         ING_MISC_CONFIGr, DO_NOT_COPY_FROM_CPU_TO_CPUf,
    168         _bool_invert, 0 },
    169     { bcmSwitchL3UrpfRouteEnable, 0,
    170         L3_DEFIP_RPF_CONTROLr, DEFIP_RPF_ENABLEf,
    171         NULL, soc_feature_urpf},
    172     { bcmSwitchStationMoveOverLearnLimitToCpu, 0,
    173         CPU_CONTROL_1r, MACLMT_STNMV_TOCPUf,
    174         NULL, soc_feature_mac_learn_limit},
    175     { bcmSwitchBpduInvalidVlanDrop, 0,
    176         EGR_CONFIG_1r, BPDU_INVALID_VLAN_DROPf,
    177         NULL, soc_feature_igmp_mld_support },
    178     { bcmSwitchMirrorInvalidVlanDrop, 0,
    179         EGR_CONFIG_1r, MIRROR_INVALID_VLAN_DROPf,
    180         NULL, soc_feature_igmp_mld_support },
    181     { bcmSwitchMcastFloodBlocking, 0,
    182         IGMP_MLD_PKT_CONTROLr, PFM_RULE_APPLYf,
    183         NULL, soc_feature_igmp_mld_support },
    184     { bcmSwitchIpmcTtl1ToCpu, 0,
    185         CPU_CONTROL_1r, IPMC_TTL1_ERR_TOCPUf,
    186         NULL, 0 },
    187     { bcmSwitchL3UcastTtl1ToCpu, 0,
    188         CPU_CONTROL_1r, L3UC_TTL1_ERR_TOCPUf,
    189         NULL, 0 },
    190     { bcmSwitchDhcpLearn, 0,
    191         ING_MISC_CONFIG2r, DO_NOT_LEARN_DHCPf,
    192         NULL, 0 },
    193     { bcmSwitchUnknownIpmcAsMcast, 0,
    194         ING_MISC_CONFIG2r, IPMC_MISS_AS_L2MCf,
    195         NULL, 0 },
    196     { bcmSwitchTunnelUnknownIpmcDrop, 0,
    197         ING_MISC_CONFIG2r, UNKNOWN_TUNNEL_IPMC_DROPf,
    198         NULL, 0 },
    199     { bcmSwitchMcastUnknownErrToCpu, 0,
    200         CPU_CONTROL_1r, MC_INDEX_ERROR_TOCPUf,
    201         NULL,0},
    202     { bcmSwitchDosAttackMACSAEqualMACDA, 0,
    203         DOS_CONTROLr, MACSA_EQUALS_MACDA_DROPf,
    204         NULL, soc_feature_enhanced_dos_ctrl },
    205     { bcmSwitchDosAttackFlagZeroSeqZero, 0,
    206         DOS_CONTROLr, TCP_FLAGS_CTRL0_SEQ0_ENABLEf,
    207         NULL, 0 },
    208     { bcmSwitchDosAttackSynFrag, 0,
    209         DOS_CONTROLr, TCP_FLAGS_SYN_FRAG_ENABLEf,
    210         NULL, 0},
    211     { bcmSwitchDosAttackIcmp, 0,
    212         DOS_CONTROL_2r, ICMP_V4_PING_SIZE_ENABLEf,
    213         NULL, 0 },
    214     { bcmSwitchDosAttackIcmp, 0,
    215         DOS_CONTROL_2r, ICMP_V6_PING_SIZE_ENABLEf,
    216         NULL, 0 },
    217     { bcmSwitchDosAttackIcmpV4, 0,
    218         DOS_CONTROL_2r, ICMP_V4_PING_SIZE_ENABLEf,
    219         NULL, 0 },
    220     { bcmSwitchDosAttackIcmpV6, 0,
    221         DOS_CONTROL_2r, ICMP_V6_PING_SIZE_ENABLEf,
    222         NULL, 0 },
    223     { bcmSwitchDosAttackIcmpFragments, 0,
    224         DOS_CONTROL_2r, ICMP_FRAG_PKTS_ENABLEf,
    225         NULL, soc_feature_enhanced_dos_ctrl },
    226     { bcmSwitchDosAttackTcpOffset, 0,
    227         DOS_CONTROL_2r, TCP_HDR_OFFSET_EQ1_ENABLEf,
    228         NULL, soc_feature_enhanced_dos_ctrl },
    229     { bcmSwitchDosAttackUdpPortsEqual, 0,
    230         DOS_CONTROL_2r, UDP_SPORT_EQ_DPORT_ENABLEf,
    231         NULL, soc_feature_enhanced_dos_ctrl },
    232     { bcmSwitchDosAttackTcpPortsEqual, 0,
    233         DOS_CONTROL_2r, TCP_SPORT_EQ_DPORT_ENABLEf,
    234         NULL, soc_feature_enhanced_dos_ctrl },
    235     { bcmSwitchDosAttackTcpFlagsSF, 0,
    236         DOS_CONTROL_2r, TCP_FLAGS_SYN_FIN_ENABLEf,
    237         NULL, soc_feature_enhanced_dos_ctrl },
    238     { bcmSwitchDosAttackTcpFlagsFUP, 0,
    239         DOS_CONTROL_2r, TCP_FLAGS_FIN_URG_PSH_SEQ0_ENABLEf,
    240         NULL, soc_feature_enhanced_dos_ctrl },
    241     { bcmSwitchDosAttackTcpHdrPartial, 0,
    242         DOS_CONTROL_2r, TCP_HDR_PARTIAL_ENABLEf,
    243         NULL, soc_feature_enhanced_dos_ctrl },
    244     { bcmSwitchDosAttackV6MinFragEnable, 0,
    245         DOS_CONTROL_2r, IPV6_MIN_FRAG_SIZE_ENABLEf,
    246         NULL, soc_feature_enhanced_dos_ctrl },
    247     { bcmSwitchDosAttackV6MinFragSize, 0,
    248         IPV6_MIN_FRAG_SIZEr, PKT_LENGTHf,
    249         NULL, soc_feature_enhanced_dos_ctrl },
    250     { bcmSwitchDosAttackIcmpPktOversize, 0,
    251         DOS_CONTROL_3r, BIG_ICMP_PKT_SIZEf,
    252         NULL, 0 },
    253     { bcmSwitchDosAttackIcmpV6PingSize, 0,
    254         DOS_CONTROL_3r, BIG_ICMPV6_PKT_SIZEf,
    255         NULL, soc_feature_big_icmpv6_ping_check },
    256     { bcmSwitchDosAttackMinTcpHdrSize, 0,
    257         DOS_CONTROL_3r, MIN_TCPHDR_SIZEf,
    258         NULL, 0 },
    259     { bcmSwitchHashNivSrcIfEtagSvidSelect0, 0,
    260         RTAG7_HASH_CONTROL_2r, RTAG7_HASH_BIN_0_SELECT_Af,
    261         NULL, 0 },
    262     { bcmSwitchHashNivSrcIfEtagSvidSelect1, 0,
    263         RTAG7_HASH_CONTROL_2r, RTAG7_HASH_BIN_0_SELECT_Bf,
    264         NULL, 0 },
    265     { bcmSwitchHashNivDstIfEtagVidSelect0, 0,
    266         RTAG7_HASH_CONTROL_2r, RTAG7_HASH_BIN_1_SELECT_Af,
    267         NULL, 0 },
    268     { bcmSwitchHashNivDstIfEtagVidSelect1, 0,
    269         RTAG7_HASH_CONTROL_2r, RTAG7_HASH_BIN_1_SELECT_Bf,
    270         NULL, 0 },
    271     { bcmSwitchDirectedMirroring, 0,
    272         EGR_PORTr, EM_SRCMOD_CHANGEf,
    273         NULL, soc_feature_src_modid_blk },
    274     { bcmSwitchDirectedMirroring, 0,
    275         IEGR_PORTr, EM_SRCMOD_CHANGEf,
    276         NULL, soc_feature_src_modid_blk },
    277     { bcmSwitchMirrorStackMode, 0,
    278         MISCCONFIGr, STACK_MODEf,
    279         NULL, soc_feature_src_modid_blk },
    280     { bcmSwitchDosAttackIcmpPktOversize, 0,
    281         DOS_CONTROLr, BIG_ICMP_PKT_SIZEf,
    282         NULL, 0 },
    283     { bcmSwitchDirectedMirroring, 0,
    284         MISCCONFIGr, DRACO_1_5_MIRRORING_MODE_ENf,
    285         _bool_invert, soc_feature_xgs1_mirror },
    286     { bcmSwitchDosAttackIcmpV6PingSize, 0,
    287         DOS_CONTROL_2r, BIG_ICMPV6_PKT_SIZEf,
    288         NULL, soc_feature_big_icmpv6_ping_check },
    289     { bcmSwitchMirrorUnmarked, 0,
    290         EGR_CONFIG_1r, RING_MODEf,
    291         _bool_invert, 0 },
    292     { bcmSwitchMirrorStackMode, 0,
    293         EGR_CONFIG_1r, STACK_MODEf,
    294         NULL, soc_feature_src_modid_blk },
    295     { bcmSwitchMeterAdjust, 0,
    296         EGR_SHAPING_CONTROLr, PACKET_IFG_BYTESf,
    297         NULL, soc_feature_meter_adjust },
    298     { bcmSwitchMeterAdjust, 0,
    299         EGR_SHAPING_CONTROLr, PACKET_IFG_BYTES_2f,
    300         NULL, soc_feature_meter_adjust },
    301     { bcmSwitchMeterAdjust, 0,
    302         IFP_METER_CONTROLr, PACKET_IFG_BYTESf,
    303         NULL, soc_feature_meter_adjust },
    304     { bcmSwitchMeterAdjust, 0,
    305         EGR_COUNTER_CONTROLr, PACKET_IFG_BYTESf,
    306         NULL, soc_feature_meter_adjust },
    307     { bcmSwitchMeterAdjust, 0,
    308         EGR_COUNTER_CONTROLr, PACKET_IFG_BYTES_2f,
    309         NULL, soc_feature_meter_adjust },
    310     { bcmSwitchEgressBlockUcast, 0,
    311         ING_MISC_CONFIGr, APPLY_EGR_MASK_ON_UC_ONLYf,
    312         NULL, soc_feature_egress_blk_ucast_override },
    313     { bcmSwitchSourceModBlockUcast, 0,
    314         ING_MISC_CONFIGr, APPLY_SRCMOD_BLOCK_ON_UC_ONLYf,
    315         NULL, soc_feature_src_modid_blk_ucast_override },
    316     { bcmSwitchHgHdrMcastFloodOverride, 0,
    317         EGR_CONFIG_1r, FORCE_STATIC_MH_PFMf,
    318         NULL, soc_feature_static_pfm },
    319     { bcmSwitchShaperAdjust, 0,
    320         EGR_SHAPING_CONTROLr, PACKET_IFG_BYTESf,
    321         NULL, soc_feature_meter_adjust },
    322     { bcmSwitchShaperAdjust, 0,
    323         EGR_SHAPING_CONTROLr, PACKET_IFG_BYTES_2f,
    324         NULL, soc_feature_meter_adjust },
    325     { bcmSwitchShaperAdjust, 0,
    326         MTRI_IFGr, PACKET_IFG_BYTESf,
    327         NULL, soc_feature_meter_adjust },
    328     { bcmSwitchHgHdrErrToCpu, 0,
    329         CPU_CONTROL_1r, HG_HDR_ERROR_TOCPUf,
    330         NULL, soc_feature_cpu_proto_prio},
    331     { bcmSwitchClassTagPacketsToCpu, 0,
    332         CPU_CONTROL_1r, HG_HDR_TYPE1_TOCPUf,
    333         NULL, soc_feature_cpu_proto_prio},
    334     { bcmSwitchRemoteLearnTrust, 0,
    335         EGR_CONFIG_1r, IGNORE_HG_HDR_DONOT_LEARNf,
    336         _bool_invert, 0 },
    337     { bcmSwitchSourceModBlockControlOpcode, 0,
    338         ING_MISC_CONFIGr, DO_NOT_APPLY_SRCMOD_BLOCK_ON_SCf,
    339         _bool_invert, soc_feature_src_modid_blk_opcode_override },
    340     { bcmSwitchUnknownMcastToCpu, 0,
    341         CPU_CONTROL_1r, UMC_TOCPUf,
    342         NULL, 0 },
    343     { bcmSwitchUnknownUcastToCpu, 0,
    344         CPU_CONTROL_1r, UUCAST_TOCPUf,
    345         NULL, 0 },
    346     { bcmSwitchL2StaticMoveToCpu, 0,
    347         CPU_CONTROL_1r, STATICMOVE_TOCPUf,
    348         NULL, 0 },
    349     { bcmSwitchL3HeaderErrToCpu, 0, /* compat */
    350         CPU_CONTROL_1r, V4L3ERR_TOCPUf,
    351         NULL, 0 },
    352     { bcmSwitchUnknownL3SrcToCpu, 0,
    353         CPU_CONTROL_1r, UNRESOLVEDL3SRC_TOCPUf,
    354         NULL, 0 },
    355     { bcmSwitchUnknownL3DestToCpu, 0, /* compat */
    356         CPU_CONTROL_1r, V4L3DSTMISS_TOCPUf,
    357         NULL, 0 },
    358     { bcmSwitchIpmcPortMissToCpu, 0,
    359         CPU_CONTROL_1r, IPMCPORTMISS_TOCPUf,
    360         NULL, 0 },
    361     { bcmSwitchIpmcErrorToCpu, 0,
    362         CPU_CONTROL_1r, IPMCERR_TOCPUf,
    363         NULL, 0 },
    364     { bcmSwitchL2NonStaticMoveToCpu, 0,
    365         CPU_CONTROL_1r, NONSTATICMOVE_TOCPUf,
    366         NULL, 0 },
    367     { bcmSwitchV6L3ErrToCpu, 0,
    368         CPU_CONTROL_1r, V6L3ERR_TOCPUf,
    369         NULL, 0 },
    370     { bcmSwitchV6L3DstMissToCpu, 0,
    371         CPU_CONTROL_1r, V6L3DSTMISS_TOCPUf,
    372         NULL, 0 },
    373     { bcmSwitchV4L3ErrToCpu, 0,
    374         CPU_CONTROL_1r, V4L3ERR_TOCPUf,
    375         NULL, 0 },
    376     { bcmSwitchV4L3DstMissToCpu, 0,
    377         CPU_CONTROL_1r, V4L3DSTMISS_TOCPUf,
    378         NULL, 0 },
    379     { bcmSwitchTunnelErrToCpu, 0,
    380         CPU_CONTROL_1r, TUNNEL_ERR_TOCPUf,
    381         NULL, 0 },
    382     { bcmSwitchMartianAddrToCpu, 0,
    383         CPU_CONTROL_1r, MARTIAN_ADDR_TOCPUf,
    384         NULL, 0 },
    385     { bcmSwitchL3UcTtlErrToCpu, 0,
    386         CPU_CONTROL_1r, L3UC_TTL_ERR_TOCPUf,
    387         NULL, 0 },
    388     { bcmSwitchL3SlowpathToCpu, 0,
    389         CPU_CONTROL_1r, L3_SLOWPATH_TOCPUf,
    390         NULL, 0 },
    391     { bcmSwitchIpmcTtlErrToCpu, 0,
    392         CPU_CONTROL_1r, IPMC_TTL_ERR_TOCPUf,
    393         NULL, 0 },
    394     { bcmSwitchSampleIngressRandomSeed, 0,
    395         SFLOW_ING_RAND_SEEDr, SEEDf,
    396         NULL, 0 },
    397     { bcmSwitchSampleEgressRandomSeed, 0,
    398         SFLOW_EGR_RAND_SEEDr, SEEDf,
    399         NULL, 0 },
    400     { bcmSwitchArpReplyToCpu, 0,
    401         PROTOCOL_PKT_CONTROLr, ARP_REPLY_TO_CPUf,
    402         NULL, 0 },
    403     { bcmSwitchArpReplyDrop, 0,
    404         PROTOCOL_PKT_CONTROLr, ARP_REPLY_DROPf,
    405         NULL, 0 },
    406     { bcmSwitchArpRequestToCpu, 0,
    407         PROTOCOL_PKT_CONTROLr, ARP_REQUEST_TO_CPUf,
    408         NULL, 0 },
    409     { bcmSwitchArpRequestDrop, 0,
    410         PROTOCOL_PKT_CONTROLr, ARP_REQUEST_DROPf,
    411         NULL, 0 },
    412     { bcmSwitchNdPktToCpu, 0,
    413         PROTOCOL_PKT_CONTROLr, ND_PKT_TO_CPUf,
    414         NULL, 0 },
    415     { bcmSwitchNdPktDrop, 0,
    416         PROTOCOL_PKT_CONTROLr, ND_PKT_DROPf,
    417         NULL, 0 },
    418     { bcmSwitchDhcpPktToCpu, 0,
    419         PROTOCOL_PKT_CONTROLr, DHCP_PKT_TO_CPUf,
    420         NULL, 0 },
    421     { bcmSwitchDhcpPktDrop, 0,
    422         PROTOCOL_PKT_CONTROLr, DHCP_PKT_DROPf,
    423         NULL, 0 },
    424     { bcmSwitchDosAttackSipEqualDip, 0,
    425         DOS_CONTROLr, DROP_IF_SIP_EQUALS_DIPf,
    426         NULL, 0 },
    427     { bcmSwitchDosAttackMinTcpHdrSize, 0,
    428         DOS_CONTROLr, MIN_TCPHDR_SIZEf,
    429         NULL, 0 },
    430     { bcmSwitchDosAttackV4FirstFrag, 0,
    431         DOS_CONTROLr, IPV4_FIRST_FRAG_CHECK_ENABLEf,
    432         NULL, 0 },
    433     { bcmSwitchNonIpL3ErrToCpu, 0,
    434         CPU_CONTROL_1r, NIP_L3ERR_TOCPUf,
    435         NULL, soc_feature_nip_l3_err_tocpu },
    436     { bcmSwitchSourceRouteToCpu, 0,
    437         CPU_CONTROL_1r, SRCROUTE_TOCPUf,
    438         NULL, 0 },
    439     { bcmSwitchDirectedMirroring, 0,
    440         EGR_CONFIGr, DRACO1_5_MIRRORf,
    441         _bool_invert, soc_feature_xgs1_mirror},
    442     { bcmSwitchL3MtuFailToCpu, 0,
    443         CPU_CONTROL_1r, L3_MTU_FAIL_TOCPUf,
    444         NULL, soc_feature_l3mtu_fail_tocpu },
    445     { bcmSwitchIpmcSameVlanL3Route, 0,
    446         EGR_CONFIG_1r, IPMC_ROUTE_SAME_VLANf,
    447         NULL, soc_feature_l3},
    448     { bcmSwitchIpmcSameVlanPruning, 0,
    449         MISCCONFIGr, IPMC_IND_MODEf,
    450         _bool_invert, 0 },
    451     { bcmSwitchPrioDropToCpu, 0,
    452         CPU_CONTROL_0r, DOT1P_ADMITTANCE_DROP_TOCPUf,
    453         NULL, soc_feature_niv},
    454     { bcmSwitchNivPrioDropToCpu, 0,
    455         CPU_CONTROL_0r, DOT1P_ADMITTANCE_DROP_TOCPUf,
    456         NULL, soc_feature_niv},
    457     { bcmSwitchNivInterfaceMissToCpu, 0,
    458         CPU_CONTROL_0r, NIV_FORWARDING_DROP_TOCPUf,
    459         NULL, soc_feature_niv},
    460     { bcmSwitchNivRpfFailToCpu, 0,
    461         CPU_CONTROL_0r, NIV_RPF_CHECK_FAIL_TOCPUf,
    462         NULL, soc_feature_niv},
    463     { bcmSwitchNivTagInvalidToCpu, 0,
    464         CPU_CONTROL_0r, VNTAG_FORMAT_DROP_TOCPUf,
    465         NULL, soc_feature_niv},
    466     { bcmSwitchNivTagDropToCpu, 0,
    467         CPU_CONTROL_0r, DISCARD_VNTAG_PRESENT_TOCPUf,
    468         NULL, soc_feature_niv},
    469     { bcmSwitchNivUntagDropToCpu, 0,
    470         CPU_CONTROL_0r, DISCARD_VNTAG_NOT_PRESENT_TOCPUf,
    471         NULL, soc_feature_niv},
    472     { bcmSwitchTrillTtlErrToCpu, 0,
    473         CPU_CONTROL_0r, TRILL_HOPCOUNT_CHECK_FAIL_TOCPUf,
    474         NULL, soc_feature_trill},
    475     { bcmSwitchTrillHeaderErrToCpu, 0,
    476         CPU_CONTROL_0r, TRILL_ERROR_FRAMES_TOCPUf,
    477         NULL, soc_feature_trill},
    478     { bcmSwitchTrillMismatchToCpu, 0,
    479         CPU_CONTROL_0r, TRILL_UNEXPECTED_FRAMES_TOCPUf,
    480         NULL, soc_feature_trill},
    481     { bcmSwitchTrillNameMissToCpu, 0,
    482         CPU_CONTROL_0r, TRILL_RBRIDGE_LOOKUP_MISS_TOCPUf,
    483         NULL, soc_feature_trill},
    484     { bcmSwitchTrillRpfFailToCpu, 0,
    485         CPU_CONTROL_0r, TRILL_RPF_CHECK_FAIL_TOCPUf,
    486         NULL, soc_feature_trill},
    487     { bcmSwitchTrillOptionsToCpu, 0,
    488         CPU_CONTROL_0r, TRILL_OPTIONS_TOCPUf,
    489         NULL, soc_feature_trill},
    490     { bcmSwitchTrillNameErrDrop, 0,
    491         TRILL_DROP_CONTROLr, INGRESS_RBRIDGE_EQ_EGRESS_RBRIDGE_DROPf,
    492         NULL, soc_feature_trill},
    493     { bcmSwitchTrillHeaderVersionErrDrop, 0,
    494         TRILL_DROP_CONTROLr, TRILL_HDR_VERSION_NON_ZERO_DROPf,
    495         NULL, soc_feature_trill},
    496     { bcmSwitchTrillNameMissDrop, 0,
    497         TRILL_DROP_CONTROLr, UNKNOWN_INGRESS_RBRIDGE_DROPf,
    498         NULL, soc_feature_trill},
    499     { bcmSwitchTrillAdjacencyFailDrop, 0,
    500         TRILL_DROP_CONTROLr, TRILL_ADJACENCY_FAIL_DROPf,
    501         NULL, soc_feature_trill},
    502     { bcmSwitchTrillHeaderErrDrop, 0,
    503         TRILL_DROP_CONTROLr, UC_TRILL_HDR_MC_MACDA_DROPf,
    504         NULL, soc_feature_trill},
    505     { bcmSwitchTrillRpfFailDrop, 0,
    506         TRILL_DROP_CONTROLr, RPF_CHECK_FAIL_DROPf,
    507         NULL, soc_feature_trill},
    508     { bcmSwitchIngParseL2TunnelTermDipSipSelect, 0,
    509         ING_L2_TUNNEL_PARSE_CONTROLr, IFP_L2_TUNNEL_PAYLOAD_FIELD_SELf ,
    510         NULL, 0},
    511     { bcmSwitchIngParseL3L4IPv4, 0,
    512         ING_L2_TUNNEL_PARSE_CONTROLr, IGMP_ENABLEf ,
    513         NULL, 0},
    514     { bcmSwitchIngParseL3L4IPv6, 0,
    515         ING_L2_TUNNEL_PARSE_CONTROLr, MLD_ENABLEf ,
    516         NULL, 0},
    517     { bcmSwitchV6L3LocalLinkDrop,0,
    518         ING_MISC_CONFIG2r, IPV6_SIP_LINK_LOCAL_DROPf,
    519         NULL, 0},
    520     { bcmSwitchExtenderInterfaceMissToCpu, 0,
    521         CPU_CONTROL_0r, NIV_FORWARDING_DROP_TOCPUf,
    522         NULL, soc_feature_port_extension},
    523     { bcmSwitchExtenderRpfFailToCpu, 0,
    524         CPU_CONTROL_0r, NIV_RPF_CHECK_FAIL_TOCPUf,
    525         NULL, soc_feature_port_extension},
    526     { bcmSwitchEtagInvalidToCpu, 0,
    527         CPU_CONTROL_0r, VNTAG_FORMAT_DROP_TOCPUf,
    528         NULL, soc_feature_port_extension},
    529     { bcmSwitchEtagDropToCpu, 0,
    530         CPU_CONTROL_0r, DISCARD_VNTAG_PRESENT_TOCPUf,
    531         NULL, soc_feature_port_extension},
    532     { bcmSwitchNonEtagDropToCpu, 0,
    533         CPU_CONTROL_0r, DISCARD_VNTAG_NOT_PRESENT_TOCPUf,
    534         NULL, soc_feature_port_extension},
    535     { bcmSwitchMplsGalAlertLabelToCpu, 0,
    536         CPU_CONTROL_Mr, MPLS_GAL_EXPOSED_TO_CPUf,
    537         NULL, 0},
    538     { bcmSwitchMplsRalAlertLabelToCpu, 0,
    539         CPU_CONTROL_Mr, MPLS_RAL_EXPOSED_TO_CPUf,
    540         NULL, 0},
    541     { bcmSwitchMplsIllegalReservedLabelToCpu, 0,
    542         CPU_CONTROL_Mr, MPLS_ILLEGAL_RSVD_LABEL_TO_CPUf,
    543         NULL, 0},
    544     { bcmSwitchMplsUnknownAchTypeToCpu, 0,
    545         CPU_CONTROL_Mr, MPLS_UNKNOWN_ACH_TYPE_TO_CPUf,
    546         NULL, 0},
    547     { bcmSwitchMplsUnknownAchVersionToCpu, 0,
    548         CPU_CONTROL_Mr, MPLS_UNKNOWN_ACH_VERSION_TOCPUf,
    549         NULL, 0},
    550     { bcmSwitchL3SrcBindMissToCpu, 0,
    551         CPU_CONTROL_Mr, MAC_IP_BIND_LOOKUP_MISS_TOCPUf,
    552         NULL, 0},
    553     { bcmSwitchTimesyncUnknownVersionToCpu, 0,
    554         CPU_CONTROL_Mr, UNKNOWN_1588_VERSION_TO_CPUf,
    555         NULL, 0},
    556     { bcmSwitchTimesyncIngressVersion, 0,
    557         ING_1588_PARSING_CONTROLr, VERSION_CONTROLf,
    558         NULL, 0},
    559     { bcmSwitchTimesyncEgressVersion, 0,
    560         EGR_1588_PARSING_CONTROLr, VERSION_CONTROLf,
    561         NULL, 0},
    562     { bcmSwitchL2GreTunnelMissToCpu, 0,
    563         CPU_CONTROL_Mr, L2GRE_SIP_LOOKUP_FAIL_COPY_TOCPUf,
    564         NULL, 0},
    565     { bcmSwitchL2GreVpnIdMissToCpu, 0,
    566         CPU_CONTROL_Mr, L2GRE_VPNID_LOOKUP_FAIL_COPY_TOCPUf,
    567         NULL, 0},
    568     { bcmSwitchRemoteProtectionTrust, 0,
    569         ING_CONFIG_64r, USE_PROT_STATUSf,
    570         NULL, 0},
    571     { bcmSwitchVxlanTunnelMissToCpu, 0,
    572         CPU_CONTROL_Mr, VXLAN_SIP_LOOKUP_FAIL_COPY_TOCPUf,
    573         NULL, 0},
    574     { bcmSwitchVxlanVnIdMissToCpu, 0,
    575         CPU_CONTROL_Mr, VXLAN_VN_ID_LOOKUP_FAIL_COPY_TOCPUf,
    576         NULL, 0},
    577     { bcmSwitchHashL2GreKeyMask0, 0,
    578         RTAG7_HASH_CONTROL_L2GRE_MASK_Ar, L2GRE_TUNNEL_GRE_KEY_MASK_Af,
    579         NULL, soc_feature_l2gre},
    580     { bcmSwitchHashL2GreKeyMask1, 0,
    581         RTAG7_HASH_CONTROL_L2GRE_MASK_Br, L2GRE_TUNNEL_GRE_KEY_MASK_Bf,
    582         NULL, soc_feature_l2gre},
    583     { bcmSwitchHashSctpL4Port, 0,
    584         ING_SCTP_CONTROLr, PARSE_SCTPf,
    585         NULL, 0},
    586     { bcmSwitchL3NATEnable, 0,
    587         ING_CONFIG_64r, NAT_ENABLEf,
    588         NULL, 0},
    589     { bcmSwitchL3DNATHairpinToCpu, 0,
    590         CPU_CONTROL_Mr, DNAT_HAIRPIN_COPY_TOCPUf,
    591         NULL, 0},
    592     { bcmSwitchL3DNATMissToCpu, 0,
    593         CPU_CONTROL_Mr, DNAT_MISS_COPY_TOCPUf,
    594         NULL, 0},
    595     { bcmSwitchL3SNATMissToCpu, 0,
    596         CPU_CONTROL_Mr, SNAT_MISS_COPY_TOCPUf,
    597         NULL, 0},
    598     { bcmSwitchL3NatOtherToCpu, 0,
    599         CPU_CONTROL_Mr, NAT_OTHER_COPY_TOCPUf,
    600         NULL, 0},
    601     { bcmSwitchL3NatRealmCrossingIcmpToCpu, 0,
    602         CPU_CONTROL_Mr, NAT_REALM_CROSSING_ICMP_COPY_TOCPUf,
    603         NULL, 0},
    604     { bcmSwitchL3NatFragmentsToCpu, 0,
    605         CPU_CONTROL_Mr, NAT_FRAGMENTS_COPY_TOCPUf,
    606         NULL, 0},
    607     { bcmSwitchHashUseL2GreTunnelGreKey0, 0,
    608         RTAG7_HASH_CONTROL_2r, L2GRE_TUNNEL_USE_GRE_KEY_Af,
    609         NULL, soc_feature_l2gre},
    610     { bcmSwitchHashUseL2GreTunnelGreKey1, 0,
    611         RTAG7_HASH_CONTROL_2r, L2GRE_TUNNEL_USE_GRE_KEY_Bf,
    612         NULL, soc_feature_l2gre},
    613     { bcmSwitchHashL2GrePayloadSelect0, 0,
    614         RTAG7_HASH_CONTROL_2r, L2GRE_PAYLOAD_HASH_SELECT_Af,
    615         NULL, soc_feature_l2gre},
    616     { bcmSwitchHashL2GrePayloadSelect1, 0,
    617         RTAG7_HASH_CONTROL_2r, L2GRE_PAYLOAD_HASH_SELECT_Bf,
    618         NULL, soc_feature_l2gre},
    619     { bcmSwitchHashL2GreNetworkPortPayloadDisable0, 0,
    620         RTAG7_HASH_CONTROL_2r, DISABLE_HASH_L2GRE_Af,
    621         NULL, soc_feature_l2gre},
    622     { bcmSwitchHashL2GreNetworkPortPayloadDisable1, 0,
    623         RTAG7_HASH_CONTROL_2r, DISABLE_HASH_L2GRE_Bf,
    624         NULL, soc_feature_l2gre},
    625     { bcmSwitchEcmpMacroFlowHashEnable, 0,
    626         RTAG7_HASH_SELr, USE_FLOW_SEL_ECMPf,
    627         NULL, 0},
    628     { bcmSwitchHashField0Ip6FlowLabel,0,
    629        RTAG7_HASH_CONTROL_2r, ENABLE_FLOW_LABEL_IPV6_Af,
    630         NULL, 0},
    631     { bcmSwitchHashField1Ip6FlowLabel,0,
    632        RTAG7_HASH_CONTROL_2r, ENABLE_FLOW_LABEL_IPV6_Bf,
    633         NULL, 0},
    634     { bcmSwitchMacroFlowHashUseMSB, 0,
    635        RTAG7_HASH_CONTROL_2r, MACRO_FLOW_HASH_BYTE_SELf,
    636         NULL, 0},
    637     { bcmSwitchHashHg2PktFieldsEnable, 0,
    638        RTAG7_HASH_CONTROL_2r, TREAT_PPD2_AS_KNOWN_PPDf,
    639         NULL, 0},
    640     { bcmSwitchHashField0OverlayCntagRpidEnable, 0,
    641        RTAG7_HASH_CONTROL_2r, ENABLE_BIN_12_OVERLAY_Af,
    642         NULL, 0},
    643     { bcmSwitchHashMimUseTunnelHeader0, 0,
    644        RTAG7_HASH_CONTROL_2r, DISABLE_HASH_MIM_INNER_L2_Af,
    645         NULL, soc_feature_mim},
    646     { bcmSwitchHashMimUseTunnelHeader1, 0,
    647        RTAG7_HASH_CONTROL_2r, DISABLE_HASH_MIM_INNER_L2_Bf,
    648         NULL, soc_feature_mim},
    649     { bcmSwitchHashField1OverlayCntagRpidEnable, 0,
    650        RTAG7_HASH_CONTROL_2r, ENABLE_BIN_12_OVERLAY_Bf,
    651         NULL, 0},
    652     { bcmSwitchHashMPLSUseLabelStack, 0,
    653        RTAG7_HASH_CONTROL_2r, USE_MPLS_STACK_FOR_HASHINGf,
    654         NULL, 0},
    655     { bcmSwitchHashMPLSExcludeReservedLabel, 0,
    656        RTAG7_HASH_CONTROL_2r, EXCLUDE_ALL_RESERVED_LABELS_FROM_MPLS_HASHf,
    657         NULL, 0},
    658     { bcmSwitchHashUseFlowSelMplsEcmp, 0,
    659        RTAG7_HASH_SELr, USE_FLOW_SEL_MPLS_ECMPf,
    660         NULL, 0},
    661     { bcmSwitchHashUseFlowSelTrunkUc , 0,
    662        RTAG7_HASH_SELr, USE_FLOW_SEL_TRUNK_UCf,
    663         NULL, 0},
    664     { bcmSwitchHashUseFlowSelEcmp, 0,
    665        RTAG7_HASH_SELr, USE_FLOW_SEL_ECMPf,
    666         NULL, 0},
    667     { bcmSwitchV6L3SrcDstLocalLinkDropCancel, 0,
    668         ING_MISC_CONFIG2r, IPV6_SIP_AND_DIP_LINK_LOCAL_DO_NOT_DROPf,
    669         NULL, 0},
    670     { bcmSwitchHashUseFlowSelLbidNonUnicast, 0,
    671        RTAG7_HASH_SELr, USE_FLOW_SEL_LBID_NONUCf,
    672         NULL, 0},
    673     { bcmSwitchHashUseFlowSelLbidUnicast, 0,
    674        RTAG7_HASH_SELr, USE_FLOW_SEL_LBID_UCf,
    675         NULL, 0},
    676     { bcmSwitchHashUseFlowSelHigigTrunkNonUnicast, 0,
    677        RTAG7_HASH_SELr, USE_FLOW_SEL_HG_TRUNK_NONUCf,
    678         NULL, 0},
    679     { bcmSwitchHashUseFlowSelHigigTrunkUnicast, 0,
    680        RTAG7_HASH_SELr, USE_FLOW_SEL_HG_TRUNK_UCf,
    681         NULL, 0},
    682     { bcmSwitchHashUseFlowSelHigigTrunkFailover, 0,
    683        RTAG7_HASH_SELr, USE_FLOW_SEL_HG_TRUNK_FAILOVERf,
    684         NULL, 0},
    685     { bcmSwitchHashUseFlowSelTrunkNonUnicast, 0,
    686        RTAG7_HASH_SELr, USE_FLOW_SEL_TRUNK_NONUCf,
    687         NULL, 0},
    688     { bcmSwitchHashUseFlowSelEntropy, 0,
    689        RTAG7_HASH_SELr, USE_FLOW_SEL_ENTROPY_LABELf,
    690         NULL, 0},
    691     { bcmSwitchHashUseFlowSelVxlanEcmp, 0,
    692        RTAG7_HASH_SELr, USE_FLOW_SEL_VXLAN_ECMPf,
    693         NULL, 0},
    694     { bcmSwitchHashUseFlowSelVpTrunk, 0,
    695         RTAG7_HASH_SELr, USE_FLOW_SEL_VPLAGf,
    696         NULL, 0},
    697 };
    698 
    699 
    700 int
    701 _bcm_th2_switch_control_port_binding_set(int unit,
    702                                 bcm_port_t port,
    703                                 bcm_switch_control_t type,
    704                                 int arg, int *found)
    705 {
    706     uint64 oval64, val64;
    707     int i;
    708     bcm_switch_binding_t *b;
    709     uint32 max;
    710     int fval, fwidth, prt, idx;
    711 
    712     *found = 0;
    713     for (i = 0; i < COUNTOF(tomahawk2_bindings); i++) {
    714         b = &tomahawk2_bindings[i];
    715         if (b->type == type) {
    716             /* We don't check the b->chip here since the table is specific for Greyhound*/
    717             if (b->feature && !soc_feature(unit, b->feature)) {
    718                 continue;
    719             }
    720             if (!SOC_REG_FIELD_VALID(unit, b->reg, b->field)) {
    721                 continue;
    722             }
    723             if (b->xlate_arg) {
    724                 if ((fval = (b->xlate_arg)(unit, arg, 1)) < 0) {
    725                     return fval;
    726                 }
    727             } else {
    728                 fval = arg;
    729             }
    730             /* Negative values should be treated as errors */
    731             if (fval < 0) {
    732                 return BCM_E_PARAM;
    733             }
    734             if ((b->reg == PROTOCOL_PKT_CONTROLr) ||
    735                 (b->reg == IGMP_MLD_PKT_CONTROLr)) {
    736                 int index;
    737 
    738                 BCM_IF_ERROR_RETURN
    739                     (_bcm_esw_port_tab_get(unit, port,
    740                     PROTOCOL_PKT_INDEXf, &index));
    741                 prt = port;
    742                 idx = index;
    743             } else {
    744                 prt = port;
    745                 idx = 0;
    746             }
    747 
    748             fwidth = soc_reg_field_length(unit, b->reg, b->field);
    749             if (fwidth < 32) {
    750                 max = (1 << fwidth) - 1;
    751             } else {
    752                 max = -1;
    753             }
    754             SOC_IF_ERROR_RETURN(soc_reg_get(unit, b->reg, prt, idx, &val64));
    755             oval64 = val64;
    756             soc_reg64_field32_set(unit, b->reg, &val64, b->field,
    757                                 ((uint32)fval > max) ? max : (uint32)fval);
    758             if (COMPILER_64_NE(val64, oval64)) {
    759                 SOC_IF_ERROR_RETURN(soc_reg_set(unit, b->reg, prt, idx, val64));
    760             }
    761 
    762             *found = 1;
    763         }
    764     }
    765     return BCM_E_NONE;
    766 }
    767 
    768 
    769 int
    770 _bcm_th2_switch_control_port_binding_get(int unit,
    771                                 bcm_port_t port,
    772                                 bcm_switch_control_t type,
    773                                 int *arg, int *found)
    774 {
    775     uint64 val64;
    776     int i;
    777     bcm_switch_binding_t *b;
    778     int prt, idx;
    779 
    780     *found = 0;
    781     for (i = 0; i < COUNTOF(tomahawk2_bindings); i++) {
    782         b = &tomahawk2_bindings[i];
    783         if (b->type == type) {
    784             if (b->feature && !soc_feature(unit, b->feature)) {
    785                 continue;
    786             }
    787 
    788             if (!SOC_REG_FIELD_VALID(unit, b->reg, b->field)) {
    789                 continue;
    790             }
    791             if ((b->reg == PROTOCOL_PKT_CONTROLr) ||
    792                 (b->reg == IGMP_MLD_PKT_CONTROLr)) {
    793                 int index;
    794 
    795                 BCM_IF_ERROR_RETURN
    796                     (_bcm_esw_port_tab_get(unit, port,
    797                     PROTOCOL_PKT_INDEXf, &index));
    798                 prt = port;
    799                 idx = index;
    800             } else {
    801                 prt = port;
    802                 idx = 0;
    803             }
    804             SOC_IF_ERROR_RETURN(soc_reg_get(unit, b->reg, prt, idx, &val64));
    805             *arg = soc_reg64_field32_get(unit, b->reg, val64, b->field);
    806 
    807             if (b->xlate_arg) {
    808                 *arg = (b->xlate_arg)(unit, *arg, 0);
    809             }
    810             *found = 1;
    811             break;
    812         }
    813     }
    814     return BCM_E_NONE;
    815 }
    816 
    817 #endif /* BCM_TOMAHAWK2_SUPPORT */