bfd.c (20678B)
1 /* 2 * 3 * 4 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 5 * 6 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 7 * 8 * File: bfd.c 9 * Purpose: Bidirectional Forwarding Detection APIs. 10 */ 11 12 #include <soc/defs.h> 13 14 #if defined(BCM_TRIDENT2_SUPPORT) && defined(INCLUDE_BFD) 15 16 #include <soc/hash.h> 17 #include <bcm_int/esw/bfd.h> 18 #include <bcm_int/esw/xgs5.h> 19 #include <bcm_int/esw/katana.h> 20 #include <bcm_int/esw/triumph.h> 21 #include <bcm_int/esw/triumph2.h> 22 #include <bcm_int/esw/trident2.h> 23 #include <bcm_int/esw/tomahawk3.h> 24 #include <bcm/error.h> 25 #include <bcm/bfd.h> 26 27 28 /* 29 * Function Vectors 30 */ 31 static bcm_esw_bfd_drv_t bcm_td2_bfd_drv = { 32 /* init */ bcmi_td2_bfd_init, 33 /* detach */ bcmi_xgs5_bfd_detach, 34 /* endpoint_create */ bcmi_xgs5_bfd_endpoint_create, 35 /* endpoint_get */ bcmi_xgs5_bfd_endpoint_get, 36 /* endpoint_destroy */ bcmi_xgs5_bfd_endpoint_destroy, 37 /* endpoint_destroy_all */ bcmi_xgs5_bfd_endpoint_destroy_all, 38 /* endpoint_poll */ bcmi_xgs5_bfd_endpoint_poll, 39 /* event_register */ bcmi_xgs5_bfd_event_register, 40 /* event_unregister */ bcmi_xgs5_bfd_event_unregister, 41 /* endpoint_stat_get */ bcmi_xgs5_bfd_endpoint_stat_get, 42 /* auth_sha1_set */ bcmi_xgs5_bfd_auth_sha1_set, 43 /* auth_sha1_get */ bcmi_xgs5_bfd_auth_sha1_get, 44 /* auth_simple_password_set */ bcmi_xgs5_bfd_auth_simple_password_set, 45 /* auth_simple_password_get */ bcmi_xgs5_bfd_auth_simple_password_get, 46 #ifdef BCM_WARM_BOOT_SUPPORT 47 /* bfd_sync */ bcmi_xgs5_bfd_sync, 48 /* _bfd_wb_downgrade_config_set */ _bcmi_bfd_wb_downgrade_config_set, 49 #endif /* BCM_WARM_BOOT_SUPPORT */ 50 #ifdef BCM_WARM_BOOT_SUPPORT_SW_DUMP 51 /* bfd_sw_dump */ bcmi_xgs5_bfd_sw_dump, 52 #endif /* BCM_WARM_BOOT_SUPPORT_SW_DUMP */ 53 /* tx_start */ bcmi_xgs5_bfd_tx_start, 54 /* tx_stop */ bcmi_xgs5_bfd_tx_stop, 55 /* bfd_status_multi_get */ bcmi_xgs5_bfd_status_multi_get, 56 /* bfd_discard_stat_set */ bcmi_xgs5_bfd_discard_stat_set, 57 /* bfd_discard_stat_get */ bcmi_xgs5_bfd_discard_stat_get, 58 /* bcm_bfd_dump_trace */ bcmi_xgs5_bfd_dump_trace, 59 }; 60 61 62 /* 63 * Device Specific HW Tables 64 */ 65 66 /* Device programming routines */ 67 static bcm_xgs5_bfd_hw_calls_t bcm_td2_bfd_hw_calls = { 68 /* l3_tnl_term_entry_init */ _bcm_tr2_l3_tnl_term_entry_init, 69 /* mpls_lock */ bcm_tr_mpls_lock, 70 /* mpls_unlock */ bcm_tr_mpls_unlock, 71 }; 72 73 /* L2 Table */ 74 static bcm_xgs5_bfd_l2_table_t bcm_td2_bfd_l2_table = { 75 /* mem */ L2Xm, 76 /* key_type */ KEY_TYPEf, 77 /* bfd_key_type */ 0x8, 78 /* valid */ VALIDf, 79 /* static */ BFD__STATIC_BITf, 80 /* session_id_type */ BFD__SESSION_IDENTIFIER_TYPEf, 81 /* your_discr */ BFD__YOUR_DISCRIMINATORf, 82 /* label */ BFD__LABELf, 83 /* session_index */ BFD__RX_SESSION_IDXf, 84 /* cpu_queue_class */ INVALIDf, 85 /* remote */ BFD__REMOTEf, 86 /* dst_module */ BFD__MODULE_IDf, 87 /* dst_port */ BFD__PORT_NUMf, 88 /* int_pri */ BFD__INT_PRIf, 89 }; 90 91 /* L3 IPv4 Unicast Table */ 92 static bcm_xgs5_bfd_l3_ipv4_table_t bcm_td2_bfd_l3_ipv4_table = { 93 /* mem */ L3_ENTRY_IPV4_UNICASTm, 94 /* vrf_id */ VRF_IDf, 95 /* ip_addr */ IP_ADDRf, 96 /* key_type */ KEY_TYPEf, 97 /* local_address */ IPV4UC__LOCAL_ADDRESSf, 98 /* bfd_enable */ IPV4UC__BFD_ENABLEf, 99 }; 100 101 /* L3 IPv6 Unicast Table */ 102 static bcm_xgs5_bfd_l3_ipv6_table_t bcm_td2_bfd_l3_ipv6_table = { 103 /* mem */ L3_ENTRY_IPV6_UNICASTm, 104 /* ip_addr_lwr_64 */ IP_ADDR_LWR_64f, 105 /* ip_addr_upr_64 */ IP_ADDR_UPR_64f, 106 /* key_type_0 */ KEY_TYPE_0f, 107 /* key_type_1 */ KEY_TYPE_1f, 108 /* vrf_id */ VRF_IDf, 109 /* local_address */ IPV6UC__LOCAL_ADDRESSf, 110 /* bfd_enable */ IPV6UC__BFD_ENABLEf, 111 /* base_valid_0 */ INVALIDf, 112 /* base_valid_1 */ INVALIDf, 113 /* key_type */ INVALIDf, 114 /* data_type */ INVALIDf, 115 }; 116 117 /* L3 Tunnel Table */ 118 static bcm_xgs5_bfd_l3_tunnel_table_t bcm_td2_bfd_l3_tunnel_table = { 119 /* mem */ L3_TUNNELm, 120 /* bfd_enable */ BFD_ENABLEf, 121 }; 122 123 /* MPLS Table */ 124 static bcm_xgs5_bfd_mpls_table_t bcm_td2_bfd_mpls_table = { 125 /* mem */ MPLS_ENTRYm, 126 /* valid */ VALIDf, 127 /* key_type */ KEY_TYPEf, 128 /* key_type_value */ 0x0, 129 /* mpls_label */ MPLS__MPLS_LABELf, 130 /* session_id_type */ MPLS__SESSION_IDENTIFIER_TYPEf, 131 /* bfd_enable */ MPLS__BFD_ENABLEf, 132 /* cw_check_ctrl */ MPLS__CW_CHECK_CTRLf, 133 /* pw_cc_type */ MPLS__PW_CC_TYPEf, 134 /* mpls_action_if_bos */ MPLS__MPLS_ACTION_IF_BOSf, 135 /* l3_iif */ MPLS__L3_IIFf, 136 /* decap_use_ttl */ MPLS__DECAP_USE_TTLf, 137 /* mod id */ MPLS__MODULE_IDf, 138 /* port num */ MPLS__PORT_NUMf, 139 }; 140 #if defined(BCM_TOMAHAWK3_SUPPORT) 141 142 static bcm_xgs5_bfd_hw_calls_t bcm_th3_bfd_hw_calls = { 143 /* l3_tnl_term_entry_init */ _bcm_th3_l3_tnl_term_entry_init, 144 /* mpls_lock */ bcm_tr_mpls_lock, 145 /* mpls_unlock */ bcm_tr_mpls_unlock, 146 }; 147 148 /* L3 IPv4 Unicast Table */ 149 static bcm_xgs5_bfd_l3_ipv4_table_t bcm_th3_bfd_l3_ipv4_table = { 150 /* mem */ L3_ENTRY_SINGLEm, 151 /* vrf_id */ VRF_IDf, 152 /* ip_addr */ IP_ADDRf, 153 /* key_type */ KEY_TYPEf, 154 /* local_address */ IPV4UC__LOCAL_ADDRESSf, 155 /* bfd_enable */ IPV4UC__BFD_ENABLEf 156 }; 157 158 /* L3 IPv6 Unicast Table */ 159 static bcm_xgs5_bfd_l3_ipv6_table_t bcm_th3_bfd_l3_ipv6_table = { 160 /* mem */ L3_ENTRY_DOUBLEm, 161 /* ip_addr_lwr_64 */ IPV6UC__IP_ADDR_LWR_64f, 162 /* ip_addr_upr_64 */ IPV6UC__IP_ADDR_UPR_64f, 163 /* key_type_0 */ INVALIDf, 164 /* key_type_1 */ INVALIDf, 165 /* vrf_id */ IPV6UC__VRF_IDf, 166 /* local_address */ IPV6UC__LOCAL_ADDRESSf, 167 /* bfd_enable */ IPV6UC__BFD_ENABLEf, 168 /* base_valid_0 */ BASE_VALID_0f, 169 /* base_valid_1 */ BASE_VALID_1f, 170 /* key_type */ KEY_TYPEf, 171 /* data_type */ INVALIDf 172 }; 173 174 /* L3 Tunnel IPV4 Table */ 175 static bcm_xgs5_bfd_l3_tunnel_table_t bcm_th3_bfd_l3_tunnel_ipv4_table = { 176 /* mem */ L3_TUNNEL_DOUBLEm, 177 /* bfd_enable */ IPV4__BFD_ENABLEf, 178 }; 179 180 /* L3 Tunnel IPV6 Table */ 181 static bcm_xgs5_bfd_l3_tunnel_ipv6_table_t bcm_th3_bfd_l3_tunnel_ipv6_table = { 182 /* mem */ L3_TUNNEL_QUADm, 183 /* bfd_enable */ IPV6__BFD_ENABLEf, 184 }; 185 186 /* MPLS Table */ 187 static bcm_xgs5_bfd_mpls_table_t bcm_th3_bfd_mpls_table = { 188 /* mem */ MPLS_ENTRY_SINGLEm, 189 /* valid */ BASE_VALIDf, 190 /* key_type */ KEY_TYPEf, 191 /* key_type_value */ 0x0, 192 /* mpls_label */ MPLS__MPLS_LABELf, 193 /* session_id_type */ MPLS__SESSION_IDENTIFIER_TYPEf, 194 /* bfd_enable */ MPLS__BFD_ENABLEf, 195 /* cw_check_ctrl */ MPLS__CW_CHECK_CTRLf, 196 /* pw_cc_type */ MPLS__PW_CC_TYPEf, 197 /* mpls_action_if_bos */ MPLS__MPLS_ACTION_IF_BOSf, 198 /* l3_iif */ MPLS__L3_IIFf, 199 /* decap_use_ttl */ MPLS__DECAP_USE_TTLf, 200 /* mod id */ MPLS__MODULE_IDf, 201 /* port num */ MPLS__PORT_NUMf, 202 }; 203 204 #endif 205 206 #if defined(BCM_TRIDENT3_SUPPORT) 207 /* L3 IPv4 Unicast Table */ 208 static bcm_xgs5_bfd_l3_ipv4_table_t bcm_td3_bfd_l3_ipv4_table = { 209 /* mem */ L3_ENTRY_SINGLEm, 210 /* vrf_id */ VRF_IDf, 211 /* ip_addr */ IP_ADDRf, 212 /* key_type */ KEY_TYPEf, 213 /* local_address */ IPV4UC__LOCAL_ADDRESSf, 214 /* class_id */ IPV4UC__CLASS_IDf, 215 }; 216 217 /* L3 IPv6 Unicast Table */ 218 static bcm_xgs5_bfd_l3_ipv6_table_t bcm_td3_bfd_l3_ipv6_table = { 219 /* mem */ L3_ENTRY_DOUBLEm, 220 /* ip_addr_lwr_64 */ IPV6UC__IP_ADDR_LWR_64f, 221 /* ip_addr_upr_64 */ IPV6UC__IP_ADDR_UPR_64f, 222 /* key_type_0 */ INVALIDf, 223 /* key_type_1 */ INVALIDf, 224 /* vrf_id */ IPV6UC__VRF_IDf, 225 /* local_address */ IPV6UC__LOCAL_ADDRESSf, 226 /* class_id */ IPV6UC__CLASS_IDf, 227 /* base_valid_0 */ BASE_VALID_0f, 228 /* base_valid_1 */ BASE_VALID_1f, 229 /* key_type */ KEY_TYPEf, 230 /* data_type */ DATA_TYPEf, 231 }; 232 233 /* L3 Tunnel Table */ 234 static bcm_xgs5_bfd_l3_tunnel_table_t bcm_td3_bfd_l3_tunnel_table = { 235 /* mem */ L3_TUNNELm, 236 /* tunnel_class_id */ TUNNEL_CLASS_IDf, 237 }; 238 239 /* MPLS Table */ 240 static bcm_xgs5_bfd_mpls_table_t bcm_td3_bfd_mpls_table = { 241 /* mem */ MPLS_ENTRYm, 242 /* valid */ VALIDf, 243 /* key_type */ KEY_TYPEf, 244 /* key_type_value */ 0x0, 245 /* mpls_label */ MPLS__MPLS_LABELf, 246 /* session_id_type */ MPLS__SESSION_IDENTIFIER_TYPEf, 247 /* class_id */ MPLS__CLASS_IDf, 248 /* cw_check_ctrl */ MPLS__CW_CHECK_CTRLf, 249 /* pw_cc_type */ MPLS__PW_CC_TYPEf, 250 /* mpls_action_if_bos */ MPLS__MPLS_ACTION_IF_BOSf, 251 /* l3_iif */ MPLS__L3_IIFf, 252 /* decap_use_ttl */ MPLS__DECAP_USE_TTLf, 253 /* mod id */ MPLS__MODULE_IDf, 254 /* port num */ MPLS__PORT_NUMf, 255 }; 256 #endif 257 258 /* HW Definitions */ 259 static bcm_xgs5_bfd_hw_defs_t bcm_td2_bfd_hw_defs[BCM_MAX_NUM_UNITS]; 260 261 262 /* 263 * Function: 264 * bcmi_td2_bfd_ipv4_loopback_addr_set 265 * Description: 266 * Set ipv6 reserved multicast address and mask. 267 * 268 * Parameters: 269 * unit - (IN) unit number 270 * ip_addr - (IN) ipv4 address 271 * ip_mask - (IN) ipv4 mask 272 * mem - (IN) PARSER1/2 BFD DIPV4 LOOPBACK memory 273 * 274 * Return Value: 275 * BCM_E_XXX 276 * Notes: 277 */ 278 int 279 bcmi_td2_bfd_ipv4_loopback_addr_set(int unit, 280 soc_mem_t mem, 281 bcm_ip_t ip_addr, 282 bcm_ip_t ip_mask) 283 { 284 285 uint32 entry_buf[SOC_MAX_MEM_FIELD_WORDS]; 286 287 /* clear entry memory */ 288 sal_memset(entry_buf, 0, sizeof(entry_buf)); 289 /* set address in entry */ 290 soc_mem_field_set(unit, mem, entry_buf, VALUEf, &ip_addr); 291 /* set the mask in entry */ 292 soc_mem_field_set(unit, mem, entry_buf, MASKf, &ip_mask); 293 /* write entry to hardware */ 294 BCM_IF_ERROR_RETURN(soc_mem_write(unit, mem, MEM_BLOCK_ALL, 0, 295 entry_buf)); 296 return BCM_E_NONE; 297 } 298 299 300 /* 301 * Function: 302 * bcmi_td2_bfd_ipv6_loopback_addr_set 303 * Description: 304 * Set ipv6 reserved multicast address and mask. 305 * 306 * Parameters: 307 * unit - (IN) unit number 308 * ip6_addr - (IN) ipv6 address 309 * ip6_mask - (IN) ipv6 mask 310 * mem - (IN) PARSER1/2 BFD DIPV6 LOOPBACK memory 311 * 312 * Return Value: 313 * BCM_E_XXX 314 * Notes: 315 */ 316 int 317 bcmi_td2_bfd_ipv6_loopback_addr_set(int unit, 318 soc_mem_t mem, 319 bcm_ip6_t ip6_addr, 320 bcm_ip6_t ip6_mask) 321 { 322 323 uint32 ip6_fields[4]; 324 uint32 entry_buf[SOC_MAX_MEM_FIELD_WORDS]; 325 326 /* clear entry memory */ 327 sal_memset(entry_buf, 0, sizeof(entry_buf)); 328 /* encode v6 address into ip6_fields */ 329 SAL_IP6_ADDR_TO_UINT32(ip6_addr, ip6_fields); 330 /* set address in entry */ 331 soc_mem_field_set(unit, mem, entry_buf, VALUEf, &(ip6_fields[0])); 332 /* encode v6 mask into ip6_fields */ 333 SAL_IP6_ADDR_TO_UINT32(ip6_mask, ip6_fields); 334 /* set the mask in entry */ 335 soc_mem_field_set(unit, mem, entry_buf, MASKf, &(ip6_fields[0])); 336 /* write entry to hardware */ 337 BCM_IF_ERROR_RETURN(soc_mem_write(unit, mem, MEM_BLOCK_ALL, 0, 338 entry_buf)); 339 return BCM_E_NONE; 340 } 341 342 /* 343 * Function: 344 * bcmi_td2_bfd_init 345 * Purpose: 346 * Initialize the BFD subsystem 347 * Parameters: 348 * unit - (IN) Unit number. 349 * Returns: 350 * BCM_E_NONE Operation completed successfully 351 * BCM_E_MEMORY Unable to allocate memory for internal control structures 352 * BCM_E_INTERNAL Failed to initialize 353 * Notes: 354 * BFD initialization will return BCM_E_NONE for the following 355 * error conditions (i.e. feature not supported): 356 * - uKernel is not loaded 357 * - BFD application is not found in any of the uC uKernel 358 */ 359 int 360 bcmi_td2_bfd_init(int unit) 361 { 362 363 /* BFD feature enable bit set */ 364 uint8 bfd_feature_enable; 365 uint32 val; 366 #if defined(BCM_TRIDENT3_SUPPORT) 367 bcm_ip_t ip_addr; 368 bcm_ip_t ip_mask; 369 bcm_ip6_t ip6_addr; 370 bcm_ip6_t ip6_mask; 371 uint8 i; 372 #endif 373 374 #if defined(BCM_TRIDENT3_SUPPORT) 375 if (SOC_IS_TRIDENT3X(unit)) { 376 377 /* HW Definition Tables */ 378 sal_memset(bcm_td2_bfd_hw_defs, 0, sizeof(bcm_td2_bfd_hw_defs)); 379 bcm_td2_bfd_hw_defs[unit].l2 = &bcm_td2_bfd_l2_table; 380 bcm_td2_bfd_hw_defs[unit].hw_call = &bcm_td2_bfd_hw_calls; 381 bcm_td2_bfd_hw_defs[unit].l3_ipv4 = &bcm_td3_bfd_l3_ipv4_table; 382 bcm_td2_bfd_hw_defs[unit].l3_ipv6 = &bcm_td3_bfd_l3_ipv6_table; 383 bcm_td2_bfd_hw_defs[unit].l3_tunnel = &bcm_td3_bfd_l3_tunnel_table; 384 bcm_td2_bfd_hw_defs[unit].mpls = &bcm_td3_bfd_mpls_table; 385 386 /* 387 * DIPv4 loopback address must be in the range 388 * 127.0.0.0 - 127.255.255.255 389 */ 390 ip_addr = 0x7F000000; 391 ip_mask = 0xFF000000; 392 sal_memset(ip6_addr, 0, BCM_IP6_ADDRLEN); 393 sal_memset(ip6_mask, 0, BCM_IP6_ADDRLEN); 394 /* 395 * DIPv6 loopback address must be in the range 396 * 0:0:0:0:0:FFFF:7F00:0000 - 0:0:0:0:0:FFFF: 7FFF:FFFF 397 */ 398 ip6_addr[3] = 0x7F; 399 ip6_addr[4] = 0xFF; 400 ip6_addr[5] = 0xFF; 401 for(i = 3; i < BCM_IP6_ADDRLEN; i++) { 402 ip6_mask[i] = 0xFF; 403 } 404 bcmi_td2_bfd_ipv4_loopback_addr_set(unit, PARSER1_BFD_DIP_V4_LOOPBACKm, 405 ip_addr, ip_mask); 406 bcmi_td2_bfd_ipv4_loopback_addr_set(unit, PARSER2_BFD_DIP_V4_LOOPBACKm, 407 ip_addr, ip_mask); 408 bcmi_td2_bfd_ipv6_loopback_addr_set(unit, PARSER1_BFD_DIP_V6_LOOPBACKm, 409 ip6_addr, ip6_mask); 410 bcmi_td2_bfd_ipv6_loopback_addr_set(unit, PARSER2_BFD_DIP_V6_LOOPBACKm, 411 ip6_addr, ip6_mask); 412 } else 413 #endif 414 #if defined(BCM_TOMAHAWK3_SUPPORT) 415 if (SOC_IS_TOMAHAWK3(unit)) { 416 /* HW Definition Tables */ 417 sal_memset(bcm_td2_bfd_hw_defs, 0, sizeof(bcm_td2_bfd_hw_defs)); 418 bcm_td2_bfd_hw_defs[unit].l2 = &bcm_td2_bfd_l2_table; 419 bcm_td2_bfd_hw_defs[unit].hw_call = &bcm_th3_bfd_hw_calls; 420 bcm_td2_bfd_hw_defs[unit].l3_ipv4 = &bcm_th3_bfd_l3_ipv4_table; 421 bcm_td2_bfd_hw_defs[unit].l3_ipv6 = &bcm_th3_bfd_l3_ipv6_table; 422 bcm_td2_bfd_hw_defs[unit].l3_tunnel = &bcm_th3_bfd_l3_tunnel_ipv4_table; 423 bcm_td2_bfd_hw_defs[unit].l3_tunnel_ipv6 = &bcm_th3_bfd_l3_tunnel_ipv6_table; 424 bcm_td2_bfd_hw_defs[unit].mpls = &bcm_th3_bfd_mpls_table; 425 } else 426 #endif 427 { 428 /* HW Definition Tables */ 429 sal_memset(bcm_td2_bfd_hw_defs, 0, sizeof(bcm_td2_bfd_hw_defs)); 430 bcm_td2_bfd_hw_defs[unit].hw_call = &bcm_td2_bfd_hw_calls; 431 bcm_td2_bfd_hw_defs[unit].l2 = &bcm_td2_bfd_l2_table; 432 bcm_td2_bfd_hw_defs[unit].l3_ipv4 = &bcm_td2_bfd_l3_ipv4_table; 433 bcm_td2_bfd_hw_defs[unit].l3_ipv6 = &bcm_td2_bfd_l3_ipv6_table; 434 bcm_td2_bfd_hw_defs[unit].l3_tunnel = &bcm_td2_bfd_l3_tunnel_table; 435 bcm_td2_bfd_hw_defs[unit].mpls = &bcm_td2_bfd_mpls_table; 436 bcm_td2_bfd_hw_defs[unit].l3_tunnel_ipv6 = NULL; 437 } 438 439 #if defined(BCM_APACHE_SUPPORT) 440 if(!(SOC_IS_APACHE(unit))) { 441 #endif 442 /* 443 * BFD Feature Enable 444 * lower bits will take precedence 445 */ 446 bfd_feature_enable = soc_property_get(unit, spn_BFD_FEATURE_ENABLE, 1); 447 448 if (bfd_feature_enable & BFD_MHOP_FEATURE_ENABLE) { 449 /* Set UDP Dest port for MultiHop BFD session */ 450 BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val)); 451 soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val, 452 BFD_UDP_PORTM_HOPf, BFD_UDP_MULTI_HOP_DEST_PORT); 453 BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val)); 454 455 bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = BFD_MHOP_FEATURE_ENABLE; 456 457 } else if (bfd_feature_enable & BFD_MICRO_FEATURE_ENABLE) { 458 /* Set UDP Dest port for Micro BFD session */ 459 BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val)); 460 soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val, 461 BFD_UDP_PORTM_HOPf, MICRO_BFD_DEST_PORT); 462 BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val)); 463 464 bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = BFD_MICRO_FEATURE_ENABLE; 465 466 } else if (bfd_feature_enable & BFD_ECHO_FEATURE_ENABLE) { 467 /* Set UDP Dest port for Echo BFD session */ 468 BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val)); 469 soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val, 470 BFD_UDP_PORTM_HOPf, BFD_ECHO_DEST_PORT); 471 BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val)); 472 473 bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = BFD_ECHO_FEATURE_ENABLE; 474 } else if (bfd_feature_enable == 0) { 475 /* Clear HW default values of BFD_RX_UDP_CONTROL register */ 476 BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROLr(unit,&val)); 477 soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val, 478 BFD_UDP_PORT1_HOPf, 0); 479 soc_reg_field_set(unit, BFD_RX_UDP_CONTROLr, &val, 480 BFD_UDP_PORTM_HOPf, 0); 481 BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROLr(unit, val)); 482 483 bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = 0; 484 } 485 #if defined(BCM_APACHE_SUPPORT) 486 } else if (SOC_IS_APACHE(unit)) { 487 uint64 val64; 488 489 bfd_feature_enable = soc_property_get(unit, spn_BFD_FEATURE_ENABLE, 3); 490 if (bfd_feature_enable & BFD_ECHO_FEATURE_ENABLE) { 491 if(!(bfd_feature_enable & BFD_MHOP_FEATURE_ENABLE)) { 492 /* Set UDP Dest port for Echo BFD session */ 493 BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROL_64r(unit,&val64)); 494 soc_reg64_field32_set(unit, BFD_RX_UDP_CONTROL_64r, &val64, 495 BFD_UDP_PORTM_HOPf,BFD_ECHO_DEST_PORT); 496 BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROL_64r(unit, val64)); 497 bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = BFD_ECHO_FEATURE_ENABLE; 498 499 } else if(!(bfd_feature_enable & BFD_MICRO_FEATURE_ENABLE)) { 500 BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROL_64r(unit,&val64)); 501 soc_reg64_field32_set(unit, BFD_RX_UDP_CONTROL_64r, &val64, 502 BFD_UDP_PORT_LAGf,BFD_ECHO_DEST_PORT); 503 BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROL_64r(unit, val64)); 504 bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = BFD_ECHO_FEATURE_ENABLE; 505 } 506 } else if (bfd_feature_enable ==0) { 507 /* Clear HW default values of BFD_RX_UDP_CONTROL register */ 508 BCM_IF_ERROR_RETURN(READ_BFD_RX_UDP_CONTROL_64r(unit,&val64)); 509 soc_reg64_field32_set(unit, BFD_RX_UDP_CONTROL_64r, &val64, 510 BFD_UDP_PORT1_HOPf, 0); 511 soc_reg64_field32_set(unit, BFD_RX_UDP_CONTROL_64r, &val64, 512 BFD_UDP_PORTM_HOPf, 0); 513 soc_reg64_field32_set(unit, BFD_RX_UDP_CONTROL_64r, &val64, 514 BFD_UDP_PORT_LAGf,0); 515 BCM_IF_ERROR_RETURN(WRITE_BFD_RX_UDP_CONTROL_64r(unit, val64)); 516 bcm_td2_bfd_hw_defs[unit].bfd_feature_enable = 0; 517 } 518 } 519 #endif 520 521 /* Initialize Common XGS5 BFD module */ 522 BCM_IF_ERROR_RETURN 523 (bcmi_xgs5_bfd_init(unit, &bcm_td2_bfd_drv, &bcm_td2_bfd_hw_defs[unit])); 524 525 return BCM_E_NONE; 526 } 527 528 #else /* BCM_TRIDENT2_SUPPORT && INCLUDE_BFD */ 529 int bcm_esw_td2_bfd_not_empty; 530 #endif /* BCM_TRIDENT2_SUPPORT && INCLUDE_BFD */ 531