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